diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 940722506..de546a42e 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -7,6 +7,18 @@ assignees: '' --- +***Things to try before submitting bug report*** +read the [troubleshooting guide](/doc/md/Installation_Instructions/Troubleshooting.md) + +***Compilation problems*** +Try compiling with verbose. `make VERBOSE=1` with main makefile or `make V=1` with cmake. + +***flashing problems*** +Have you followed the instructions properly? ie, flashed bootrom seperately first if you are going from Offical repo to RRG/Iceman repo. + + +- + **Describe the bug** A clear and concise description of what the bug is. diff --git a/.gitignore b/.gitignore index fd8fe070c..db6ff9138 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,8 @@ Makefile.platform # cmake client/build/ +client/android/build/ +client/deps/bzip2/ # Coverity cov-int/ @@ -60,10 +62,14 @@ flasher !flasher/ lua luac -fpga_compress -mfkey32 -mfkey64 +tools/fpga_compress/fpga_compress +tools/mfkey/mfkey32 +tools/mfkey/mfkey64 tools/nonce2key/nonce2key +tools/cryptorf/cm +tools/cryptorf/sm +tools/cryptorf/sma +tools/cryptorf/sma_multi fpga/* !fpga/tests @@ -76,18 +82,17 @@ fpga/* !fpga/xst_hf.scr !fpga/go.bat !fpga/sim.tcl + # offcial dumps folder dumps/* +traces/* #client/* -# my own traces folder client/traces/* -# my own dumps folder client/dumps/* *.ice *.new -armsrc/TEMP EMV/* -tools/mf_nonce_brute/* +tools/mf_nonce_brute/mf_nonce_brute tools/andrew/* tools/jtag_openocd/openocd_configuration ppls patches/* @@ -99,3 +104,6 @@ client/lualibs/pm3_cmd.lua fpga_version_info.c .proxmark3/* + +# .tmp files are created during compilation +*.tmp diff --git a/.travis.yml b/.travis.yml index d136892a4..fbf7e1df3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,7 +8,7 @@ os: - linux - osx -dist: xenial +dist: bionic osx_image: xcode11 @@ -27,11 +27,12 @@ addons: packages: - gcc-arm-none-eabi - libnewlib-dev - - libsndfile1-dev + - libbluetooth-dev + - python3-dev + - libbz2-dev homebrew: packages: - readline - - libsndfile - qt5 - RfidResearchGroup/proxmark3/arm-none-eabi-gcc taps: RfidResearchGroup/proxmark3 @@ -55,9 +56,9 @@ install: script: - if [ "$TO_TEST" = "MAKEFILE" ]; then make clean && make V=1 "$MAKE_PARAMS"; - ./pm3test.sh; + make check; fi - if [ "$TO_TEST" = "CMAKE" ]; then mkdir -p client/build && ( cd client/build && cmake .. && make VERBOSE=1 ); - PM3BIN=./client/build/proxmark3 ./pm3test.sh client; + make client/check CHECKARGS="--clientbin ./client/build/proxmark3"; fi diff --git a/CHANGELOG.md b/CHANGELOG.md index a81289d4c..492c67794 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,12 +3,156 @@ All notable changes to this project will be documented in this file. This project uses the changelog in accordance with [keepchangelog](http://keepachangelog.com/). Please use this to write notable changes, which is not the same as git commit log... ## [unreleased][unreleased] + - Readded verichip command which seems missing (@iceman1001) + - Fix missing t55x7 config block detection (@iceman1001) + - Fix missing define on proxspace (@mwalker33) + - Added `lf em 4x50_dump` (@iceman1001) + - Added `lf em 4x50_read` (@tharexde) + - Added `lf em 4x50_info` (@tharexde) + - Added `4x50_write` (@tharexde) + - Added `4x50_write_password` (@tharexde) + - Fix em4x50 demodulation error (@tharexde) + - Fix `hf mfdes` authentification issues, DES working (@bkerler) + - Add Android cross-compilation to client cmake (@dxl, @doegox) + - Fix `emv scan` - now saves in current folder and uses unique names (@iceman1001) + - Fix pm3.sh - parse COM ports larger than one digit (@doegox) + - Fix stack size and automatically use available space for BigBuf. Stack is now 5K (@slurdge) + - Added Mifare MAD Card Holder Information decoding (@lukaskuzmiak) + - Change Better precision for HF and LF voltage measurements and Add theremin.py script (@rosco) + - Added Mifare MAD Info Byte decoding. Easier to identify Card Publisher (@lukaskuzmiak) + - Change use system Bzip2 library instead of Zlib for hardnested tables, tables are now 7x smaller (@doegox) + - Change pushed some ARM source to compile with THUMB. Saves a lot of space of ARM flash memory (@slurdge) + - Change from using ZLIB compression of FPGA images in ARM to LZ4. 15%+ speedups when swapping between HF & LF now (@slurdge) + - Fix `emv scan -w` - hash mismatch, solution similar to below (@iceman1001) + - Fix 'emv roca' - hash mismatch, merged from offical repo (@pwpiwi) + - Fix 'lf ti demod' - now calculates correct crc (@iceman1001) + - Add Python3 as possible script engine (@iceman1001, @doegox) + - Add doc/mfu_binary_format_notes.md (@iceman1001) + - Fix `hf mfu dump` - now reads Ulev1 3counter vs NTAG 1 counters (@iceman1001) + - Fix `hf mfu info` - now print correct cfg1 - nfc protection (@iceman1001) + - Fix `hf mfu eload` - now detects and converts between plain/old/new mfu binary format (@iceman1001) + - Change, hitag2crack now integrated into main Makefile, tests added (@doegox) + - Add `make check` mechanics (@doegox) + - Change, log files moved to subfolders (@doegox) + - Change, use system Lua library if available (@doegox) + - Change, use system Jansson library if available (@doegox) + - Change, use system Whereami library if available (@doegox) + - Change, use system Zlib library if available (@doegox) + - Fix release version information (@doegox) + +## [ice coffee.4.9237][2020-05-21] + - Updated documentation (@doegox, @iceman1001) + - Change `pm3test.sh` - more regression tests to (@doegox, @iceman1001) + - Change `hf 15 dump` - now supports basic json format (@iceman1001) + - Change Test and fix many `-Wxxxxxx` warnings [compiler trials] (@doegox) + - Fix COVERITY warnings [compiler trials] (@doegox, @iceman1001) + - Fix CPPCHECKER warnings [compiler trials] (@doegox, @iceman1001) + - Fix CLANG warnings [compiler trials] (@doegox) + - Change, stricter warnings [compiler trials] (@doegox) + - Change, remove section version_information for client (@doegox) + - Change, Add RELEASE_NAME (@doegox) + - Change, version info also for client (@doegox) + - Added `make release` (@doegox) + - Change `trace load` - err if offline mode (@doegox) + - Fix `standalone mode matty_run` eloadcard (@iceman1001) + - Added, HF 15 traces (@FlUxIUS) + - Fix, follow naming conventions [android] (@dxl) + - Change, work directory supported [android] (@dxl) + - Added `lf fdx demod` - decoding of Bio-Thermo lf tag. Thanks to Rosco! (@iceman1001) + - Fix, 32-bit time_t compilation error on [WIN64] (@grspy) + - Change, LogTrace error msg (@doegox) + - Change, remove inline [compiler trials] (@iceman1001) + - Change, adding execute/home/current working directory functions to lua (<@iceman1001) + - Change, fix max duration in LogTrace (@doegox) + - Change, first attempt for trace log header (@iceman1001) + - Change, pm3.sh, attempt to detect BT dongle when udevadm is not available (@doegox) + - Change, pm3.sh, test access to /dev/ttyXXX files as prerequisite for [linux] (@doegox) + - iclass bf: avoid slowdown (@doegox) + - Change, pm3tests.sh, shellcheck (@doegox) + - Change, pm3.sh, shellcheck (@doegox) + - Change, pm3.sh, err msgs on stderr (@doegox) + - Change, pm3.sh, textual and --list with no device, exit 1 (@doegox) + - Change, pm3.sh, without udev: change detection routine (@doegox) + - Change, pm3.sh, alternative if udevadm is not available [termux] (@doegox) + - Change `makefiles` - allow to skip pthread [termux] (@doegox) + - Change `script run test_t55x7` - enabled param to swap modulation to test (@iceman1001) + - Add mf_nonce_brute from https://github.com/@iceman1001/mf_nonce_brute and merge to pm3 Makefile (@doegox) + - Change `lf indala demod` - more lenient size check (@iceman1001) + - Change clarify BUTTON macro usages (@doegox) + - Change fix REV macros & hitagS (@doegox) + - Change, `hf iclass loclass` -removed printvar function (@iceman1001) + - Change, clock can be negative (@iceman1001) + - Change `data tune` (@doegox) + - fancy timers (@doegox) + - Change, copied from pm3 repo (@iceman1001) + - Change psk demodualtion, keep starting samples to easily find the zero init bit (@iceman1001) + - Change use machine/endian.h with osx (Jamie Fiedler) + - Fix 2 issues in proxendian.h (@doegox) + - Fix issue #729. Avoid stalling on non-rdv4 when polling for FeliCa without card in proximity (@doegox) + - Change `lf nexwatch demod` - lenient demod sizes (@iceman1001) + - Change `lf nexwath sim/clone` - now supports 88bit format direct. (@iceman1001) + - Rewrited `standalone mode lf_em4100rwc `, added card bruteforce mode. (Dmitriy Loginoov) + - Change `data load` - color (@iceman1001) + - Change appveyor verbose (@doegox) + - Change `lf nexwatch demod` - now detects type, and show parity /chksum (@iceman1001) + - Change `lfsampling` - interruptible only when logging not yet triggered (@doegox) + - Change `lf keri demod - more leanient when it comes to bits (@iceman1001) + - fix, proper filtering of RL markers (@doegox) + - Change, clean deps [compiler trials] (@doegox) + - Change, remove c99 restrictions [compiler trials] (@doegox) + - Added tracelog file for hf mfu sniff or a ntag (@iceman1001) + - Change `trace list` - different alloc (@iceman1001) + - Change, convert OLD -> MIX (@iceman1001) + - Change `trace list` - adjust messages (@iceman1001) + - Fix a mem corruption in `trace load/list` (@doegox) + - Change, rework banners (@doegox) + - Change, Let's see if the prompt suffixed spaces are still needed.(@doegox) + - Fix colored readline prompt bug (@doegox) + - Change, simpler ul_print_type (@doegox) + - Fix cmake for reveng [compiler trials] (@doegox) + - Change, hook reveng outputs to pm3 machinery, add regression test (@doegox) + - Change, cmake android: add backslashes for host compatibility [compiler trials](@doegox) + - Change, Translation some comments from Chinese to English. [android] (@dxl) + - Change, cmake android: use common cmake files for deps [android] (@doegox) + - Fix, proper way to fix reveng getopt bug(@doegox) + - Change, cmake deps: add prefix pm3rrg_rdv4_ [compiler trials] (@doegox) + - Change, cmake deps: add -fPIC so they can be integrated in a pm3 shared lib [compiler trials] (@doegox) + - Change, platform adaptation [android] (@dxl) + - Change, don't mix ifdef and defined [android] (@dxl) + - fix `trace list`- too short array for explanation (@iceman1001) + - Change, check for sim module fw file (@iceman1001) + - Change, rpi aling warning [compiler trials] (@iceman1001) + - Change, more LF demodulation tests (@iceman1001) + - Change, update whereami and avoid compiling unnneded troublesome parts [compiler trials] (@doegox) + - Change, rework C includes in C++ [compiler trials] (@doegox) + - Change, leanient parsing of tcp:/bt:/socket: vars (@iceman1001) + - Change, add bluetooth group to `make accessrights` (@iceman1001) + - Change, `Makefile` - fix PKG_CONFIG_ENV (@uli) + - Change, `f sim` - now only fills until bigbuffer is full (@iceman1001) + - Change, `hf mf hardnested` - don't drop field when in test mode (@doegox) + - Change, `lf sim` - better to return err on faulty offset, thanks @iceman (@doegox) + - Change, `lf sim` - fix offset of last packet (@doegox) + - Change, `client Makefile` - make sure to rebuild deps when needed [compiler trials](@doegox) + - Change, silent err if dbus absent [linux] (@doegox) + - Change, `pm3.sh` - for direct bt devices (@doegox) + - Change, `pm3.sh` - moved WSL/PS3.x bt native to be tested first. Since call to Win32_serialport crashes it. (@iceman1001) + - Change, `pm3.sh` - Bt dongle, bt direct listing of serial ports on WSL and PS3.x, now using powershell.exe since wmic is deprecated (@iceman1001) + - Change, remove libsndfile (@doegox) + - Change, enforce PACKED structs [compiler trials] (@iceman1001) + - Change, adjust number of threads according to cpu (@iceman1001) + - Change, `hitag2crack` compile flags(@doegox) + - Change, msdsal fix bug after var de-shadowing (@doegox) + - Change, lighter msg for loading prefs, json will anyway always tell the filename (@doegox) + - Change, make sure colors and emoji are disabled when not on TTY (@doegox) + - Added `pref` command. PM3 client now support user preferences saved to a json file. (@mwalker33) + - Added native support for Bluetooth in client [linux] (@doegox) + - Added `LF_EM4100RSWB` (based on `LF_EM4100RWC`) standalone mode to read/sim/clone/brute EM4100 cards (@Monster1024) - Added `HF_MSDSAL` standalone mode which read and emulate Visa EMV cards (@Netxing) - - Added Mifare Ultralight tear off experiment (@cintainfinita and @fukmar) + - Added `hf mfu tear` - Mifare Ultralight tear off experiment (@cintainfinitam, @fukmar) - Added Mifare Desfire Read/Write/Create files/records/values functionality and several fixes to `hf mfdes` (@bkerler) - Added CreateStdFile command to Mifare `hf mfdes` (@bkerler) - Rework des/3des/3k3des/aes auth. Port to mbedtls crypto library on device (@bkerler) - - Port 'hf mfdes' Authentification to CommandNG structure, fix auth session key (@bkerler) + - Port `hf mfdes` Authentification to CommandNG structure, fix auth session key (@bkerler) - Updates `hf mfdes` functions, improved logging and added new commands (@bkerler) - Updated 'legic.lua' and 'legic_clone.lua' script - works with current command set (@Pizza_4u) - Rewrote `hf mfdes` functions and added apdu debugging (@bkerler) @@ -17,10 +161,11 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Improved `hf 14a info` - card detection handling (@bkerler) - Updated helptext layout in all luascripts (@iceman1001) - Change `hf mfdes info` - output and logging (@bkerler) - - Updated texts in legic commands (@ikarus23) + - Updated texts in `hf legic` commands (@ikarus23) - Fix timing bug inside 40x5 (@mwalker33) - Refactored all Hitag2 attacks (@doegox) - Added two new Hitag2 attacks (@doegox) + - Change `hf iclass decrypt` - limit amount of data to read if wrong app limit (@iceman1001) - Change `hf search` - now continue to search in case of dual tech cards (@iceman1001) Thanks to @ikarus23 for the suggestion! - Added `hf topas info` - old reader command, now also prints NDEF (@iceman1001) - Change `hf topaz reader` - now only prints lighter info, like UID. (@iceman1001) @@ -39,14 +184,14 @@ This project uses the changelog in accordance with [keepchangelog](http://keepac - Change - NDEF supports more signatures now (@iceman1001) - OSX Makefile now supports `make style` and `make checks` (@Pizza_4u) - Added `HF_LEGIC` standalone mode to read and simulate a Legic prime tag (@Pizza_4u) - - Added keri MS decode/encode and update 'lf keri clone' to support MS fc/cid cloning. (@mwalker33) - - Fix 'hf mfdes enum' - now actually manages to enumerate files under all AID's. :smiley: (@iceman1001) - - Fix 'hf mfdes info' - now detects DESFire light and work properly Wrapped commands :+1: (@iceman1001) + - Added keri MS decode/encode and update `lf keri clone` to support MS fc/cid cloning. (@mwalker33) + - Fix `hf mfdes enum` - now actually manages to enumerate files under all AID's. :smiley: (@iceman1001) + - Fix `hf mfdes info` - now detects DESFire light and work properly Wrapped commands :+1: (@iceman1001) - :smiling_imp: support (@doegox) - Additional colour changes as recommended by @iceman (@dunderhay) - Change type colour for `hf 14a` card types (@dunderhay) - Add colour to `hf mfdes` command (@dunderhay) - - Add 'HINTS' command. Will turn off / on hint messages. Default mode is OFF. (@iceman1001) + - Add `HINTS` command. Will turn off / on hint messages. Default mode is OFF. (@iceman1001) - Add colour to `hf 14a` and `hf mfu` commands (@dunderhay) - Add colour to `lf hid` commands (@dunderhay) - Change `script run hf_bruteforce -s start_id -e end_id -t timeout -x mifare_card_type` - The hf_bruteforce card script now requires Mifare type (mfc or mfu) (@dunderhay) diff --git a/Makefile b/Makefile index 5c7947fc5..1f3b0b44b 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,9 @@ ifneq (,$(DESTDIR)) endif endif -all clean install uninstall: %: client/% bootrom/% armsrc/% recovery/% mfkey/% nonce2key/% fpga_compress/% +all clean install uninstall check: %: client/% bootrom/% armsrc/% recovery/% mfkey/% nonce2key/% mf_nonce_brute/% fpga_compress/% +# hitag2crack toolsuite is not yet integrated in "all", it must be called explicitly: "make hitag2crack" +#all clean install uninstall check: %: hitag2crack/% INSTALLTOOLS=pm3_eml2lower.sh pm3_eml2upper.sh pm3_mfdread.py pm3_mfd2eml.py pm3_eml2mfd.py findbits.py rfidtest.pl xorcheck.py INSTALLSIMFW=sim011.bin sim011.sha512.txt @@ -78,12 +80,49 @@ ifeq ($(platform),Linux) endif $(Q)$(RMDIR_SOFT) $(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLSHARERELPATH) +# tests +mfkey/check: FORCE + $(info [*] CHECK $(patsubst %/check,%,$@)) + $(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@) +nonce2key/check: FORCE + $(info [*] CHECK $(patsubst %/check,%,$@)) + $(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@) +mf_nonce_brute/check: FORCE + $(info [*] CHECK $(patsubst %/check,%,$@)) + $(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@) +fpga_compress/check: FORCE + $(info [*] CHECK $(patsubst %/check,%,$@)) + $(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@) +bootrom/check: FORCE + $(info [*] CHECK $(patsubst %/check,%,$@)) + $(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@) +armsrc/check: FORCE + $(info [*] CHECK $(patsubst %/check,%,$@)) + $(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@) +client/check: FORCE + $(info [*] CHECK $(patsubst %/check,%,$@)) + $(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@) +recovery/check: FORCE + $(info [*] CHECK $(patsubst %/check,%,$@)) + $(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@) +hitag2crack/check: FORCE + $(info [*] CHECK $(patsubst %/check,%,$@)) + $(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@) +common/check: FORCE + $(info [*] CHECK $(patsubst %/check,%,$@)) + $(Q)$(BASH) tools/pm3_tests.sh $(CHECKARGS) $(patsubst %/check,%,$@) +check: common/check + $(info [*] ALL CHECKS DONE) + mfkey/%: FORCE $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C tools/mfkey $(patsubst mfkey/%,%,$@) DESTDIR=$(MYDESTDIR) nonce2key/%: FORCE $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C tools/nonce2key $(patsubst nonce2key/%,%,$@) DESTDIR=$(MYDESTDIR) +mf_nonce_brute/%: FORCE + $(info [*] MAKE $@) + $(Q)$(MAKE) --no-print-directory -C tools/mf_nonce_brute $(patsubst mf_nonce_brute/%,%,$@) DESTDIR=$(MYDESTDIR) fpga_compress/%: FORCE $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C tools/fpga_compress $(patsubst fpga_compress/%,%,$@) DESTDIR=$(MYDESTDIR) @@ -101,9 +140,12 @@ recovery/install: bootrom/all armsrc/all recovery/%: FORCE cleanifplatformchanged $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C recovery $(patsubst recovery/%,%,$@) DESTDIR=$(MYDESTDIR) +hitag2crack/%: FORCE + $(info [*] MAKE $@) + $(Q)$(MAKE) --no-print-directory -C tools/hitag2crack $(patsubst hitag2crack/%,%,$@) DESTDIR=$(MYDESTDIR) FORCE: # Dummy target to force remake in the subdirectories, even if files exist (this Makefile doesn't know about the prerequisites) -.PHONY: all clean install uninstall help _test bootrom fullimage recovery client mfkey nonce2key style checks FORCE udev accessrights cleanifplatformchanged +.PHONY: all clean install uninstall help _test bootrom fullimage recovery client mfkey nonce2key mf_nonce_brute hitag2crack style miscchecks release FORCE udev accessrights cleanifplatformchanged help: @echo "Multi-OS Makefile" @@ -122,10 +164,14 @@ help: @echo "+ client - Make only the OS-specific host client" @echo "+ mfkey - Make tools/mfkey" @echo "+ nonce2key - Make tools/nonce2key" + @echo "+ mf_nonce_brute - Make tools/mf_nonce_brute" + @echo "+ hitag2crack - Make tools/hitag2crack" @echo "+ fpga_compress - Make tools/fpga_compress" @echo @echo "+ style - Apply some automated source code formatting rules" - @echo "+ checks - Detect various encoding issues in source code" + @echo "+ check - Run offline tests. Set CHECKARGS to pass arguments to the test script" + @echo "+ .../check - Run offline tests against specific target. See above." + @echo "+ miscchecks - Detect various encoding issues in source code" @echo @echo "Possible platforms: try \"make PLATFORM=\" for more info, default is PM3RDV4" @echo "To activate verbose mode, use make V=1" @@ -152,8 +198,12 @@ mfkey: mfkey/all nonce2key: nonce2key/all +mf_nonce_brute: mf_nonce_brute/all + fpga_compress: fpga_compress/all +hitag2crack: hitag2crack/all + newtarbin: $(RM) proxmark3-$(platform)-bin.tar proxmark3-$(platform)-bin.tar.gz @touch proxmark3-$(platform)-bin.tar @@ -164,7 +214,7 @@ tarbin: newtarbin client/tarbin armsrc/tarbin bootrom/tarbin # detect if there were changes in the platform definitions, requiring a clean cleanifplatformchanged: -ifeq ($(PLATFORM_CHANGED), true) +ifeq ($(PLATFORM_CHANGED),true) $(info [!] Platform definitions changed, cleaning bootrom/armsrc/recovery first...) $(Q)$(MAKE) --no-print-directory -C bootrom clean $(Q)$(MAKE) --no-print-directory -C armsrc clean @@ -186,8 +236,10 @@ udev: accessrights: ifneq ($(wildcard /etc/arch-release),) #If user is running ArchLinux sudo usermod -aG uucp $(USER) #Use specific command and group + sudo usermod -aG bluetooth $(USER) #Use specific command and group else sudo adduser $(USER) dialout + sudo adduser $(USER) bluetooth endif # easy printing of MAKE VARIABLES @@ -197,7 +249,7 @@ style: # Make sure astyle is installed @which astyle >/dev/null || ( echo "Please install 'astyle' package first" ; exit 1 ) # Remove spaces & tabs at EOL, add LF at EOF if needed on *.c, *.h, *.cpp. *.lua, *.py, *.pl, Makefile - find . \( -not -path "./cov-int/*" -and \( -name "*.[ch]" -or \( -name "*.cpp" -and -not -name "*.moc.cpp" \) -or -name "*.lua" -or -name "*.py" -or -name "*.pl" -or -name "Makefile" -or -name "*.v" \) \) \ + find . \( -not -path "./cov-int/*" -and -not -path "./fpga/xst/*" -and \( -name "*.[ch]" -or \( -name "*.cpp" -and -not -name "*.moc.cpp" \) -or -name "*.lua" -or -name "*.py" -or -name "*.pl" -or -name "Makefile" -or -name "*.v" \) \) \ -exec perl -pi -e 's/[ \t]+$$//' {} \; \ -exec sh -c "tail -c1 {} | xxd -p | tail -1 | grep -q -v 0a$$" \; \ -exec sh -c "echo >> {}" \; @@ -209,7 +261,7 @@ style: --align-pointer=name {} \; # Detecting weird codepages and tabs. -checks: +miscchecks: # Make sure recode is installed @which recode >/dev/null || ( echo "Please install 'recode' package first" ; exit 1 ) @echo "Files with suspicious chars:" @@ -228,5 +280,39 @@ endif # @find . \( -name "*.[ch]" -or \( -name "*.cpp" -and -not -name "*.moc.cpp" \) -or -name "*.lua" -or -name "*.py" -or -name "*.pl" -or -name "*.md" -or -name "*.txt" -or -name "*.awk" -or -name "*.v" \) \ # -exec grep -lP '\\t' {} \; +release: VERSION="v4.$(shell git log --oneline master | wc -l)" +release: + $(if $(findstring master,$(shell git rev-parse --abbrev-ref HEAD)),,$(error "!!! you are not on master branch, aborting")) + $(if $(findstring dirty,$(shell git describe --dirty --always)),$(error "!!! you have pending changes, aborting")) + $(if $(RELEASE_NAME),,$(error "!!! missing RELEASE_NAME, aborting")) + # Preparing a commit for release tagging, to be reverted after tagging. + @echo "# - Release Tag: $(VERSION)" + @echo "# - Release Name: $(RELEASE_NAME)" + # - Removing -Werror... + @find . \( -path "./Makefile.defs" -or -path "./client/Makefile" -or -path "./common_arm/Makefile.common" -or -path "./tools/hitag2crack/*/Makefile" \) -exec sed -i 's/ -Werror//' {} \; + @find . \( -path "./client/deps/*.cmake" -or -path "./client/CMakeLists.txt" \) -exec sed -i 's/ -Werror//' {} \; + # - Changing banner... + @sed -i "s/^#define BANNERMSG3 .*/#define BANNERMSG3 \"Release $(VERSION) - $(RELEASE_NAME)\"/" client/src/proxmark3.c + @echo -n "# ";grep "^#define BANNERMSG3" client/src/proxmark3.c + # - Committing temporarily... + @git commit -a -m "Release $(VERSION) - $(RELEASE_NAME)" + # - Tagging temporarily... + @git tag -a -m "Release $(VERSION) - $(RELEASE_NAME)" $(VERSION) + # - Changing default version information based on new tag + @$(SH) tools/mkversion.sh > common/default_version.c.tmp && $(MV) common/default_version.c.tmp common/default_version.c + # - Removing mkversion calls + @sed -i 's#^.*\.\./tools/mkversion.sh.*|| #\t$$(Q)#' client/Makefile bootrom/Makefile armsrc/Makefile + @sed -i '/COMMAND/s/sh .*|| //' client/CMakeLists.txt + # - Deleting tag... + @git tag -d $(VERSION) + # - Amending commit... + @git commit -a --amend -m "Release $(VERSION) - $(RELEASE_NAME)" + # - Tagging again... + @git tag -a -m "Release $(VERSION) - $(RELEASE_NAME)" $(VERSION) + # - Reverting tagged commit... + @git revert --no-edit HEAD + @echo "===================================================================" + @echo "Done! You can now execute 'git push && git push origin $(VERSION)'" + # Dummy target to test for GNU make availability _test: diff --git a/Makefile.defs b/Makefile.defs index 4068d7516..1c702930a 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -24,6 +24,9 @@ CROSS ?= arm-none-eabi- CC = gcc CXX = g++ LD = g++ +SH = sh +BASH = bash +PERL = perl PATHSEP=/ PREFIX ?= /usr/local @@ -44,3 +47,58 @@ else AR= ar rcs RANLIB= ranlib endif + +DEFCXXFLAGS = -Wall -Werror -O3 -pipe +DEFCFLAGS = -Wall -Werror -O3 -fstrict-aliasing -pipe +# Some more warnings we want as errors: +DEFCFLAGS += -Wbad-function-cast -Wredundant-decls -Wmissing-prototypes -Wchar-subscripts -Wshadow -Wundef -Wwrite-strings -Wunused -Wuninitialized -Wpointer-arith -Winline -Wformat -Wformat-security -Winit-self -Wmissing-include-dirs -Wnested-externs -Wmissing-declarations -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wtype-limits -Wold-style-definition +# Some more warnings we need first to eliminate, so temporarely tolerated: +DEFCFLAGS += -Wcast-align -Wno-error=cast-align +DEFCFLAGS += -Wswitch-enum -Wno-error=switch-enum + +ifeq ($(platform),Darwin) +# their readline has strict-prototype issues +DEFCFLAGS += -Wno-strict-prototypes +else +DEFCFLAGS += -Wstrict-prototypes +endif + +# Next ones are activated only if GCCEXTRA=1 or CLANGEXTRA=1 +EXTRACFLAGS = +EXTRACFLAGS += -Wunused-parameter -Wno-error=unused-parameter +EXTRACFLAGS += -Wsign-compare -Wno-error=sign-compare +EXTRACFLAGS += -Wconversion -Wno-error=conversion -Wno-error=sign-conversion -Wno-error=float-conversion + +# unknown to clang or old gcc: +# First we activate Wextra then we explicitly list those we know about +# Those without -Wno-error are supposed to be completely solved +GCCEXTRACFLAGS = -Wextra +GCCEXTRACFLAGS += -Wclobbered -Wno-error=clobbered +GCCEXTRACFLAGS += -Wcast-function-type +GCCEXTRACFLAGS += -Wimplicit-fallthrough=3 -Wno-error=implicit-fallthrough +GCCEXTRACFLAGS += -Wmissing-parameter-type +GCCEXTRACFLAGS += -Wold-style-declaration -Wno-error=old-style-declaration +GCCEXTRACFLAGS += -Woverride-init +GCCEXTRACFLAGS += -Wshift-negative-value +GCCEXTRACFLAGS += -Wunused-but-set-parameter -Wno-error=unused-but-set-parameter +ifeq ($(GCCEXTRA),1) + DEFCFLAGS += $(GCCEXTRACFLAGS) $(EXTRACFLAGS) +endif +# unknown to gcc or old clang: +# First we activate Wextra then we explicitly list those we know about +# Those without -Wno-error are supposed to be completely solved +CLANGEXTRACFLAGS = -Wextra +CLANGEXTRACFLAGS += -Wtautological-type-limit-compare +CLANGEXTRACFLAGS += -Wnull-pointer-arithmetic +CLANGEXTRACFLAGS += -Woverride-init +CLANGEXTRACFLAGS += -Wshift-negative-value +CLANGEXTRACFLAGS += -Wimplicit-fallthrough +ifeq ($(CLANGEXTRA),1) + DEFCFLAGS += $(CLANGEXTRACFLAGS) $(EXTRACFLAGS) +endif +ifeq ($(CLANGEVERYTHING),1) + DEFCFLAGS += -Weverything -Wno-error +endif +ifeq ($(NOERROR),1) + DEFCFLAGS += -Wno-error +endif diff --git a/Makefile.host b/Makefile.host index 9f5688939..e374a9294 100644 --- a/Makefile.host +++ b/Makefile.host @@ -15,8 +15,12 @@ ifeq ($(DEFSBEENHERE),) $(error Can't find Makefile.defs) endif -CFLAGS ?= -Wall -Werror -O3 +CFLAGS ?= $(DEFCFLAGS) CFLAGS += $(MYDEFS) $(MYCFLAGS) $(MYINCLUDES) +CXXFLAGS ?= $(DEFCXXFLAGS) +CXXFLAGS += $(MYDEFS) $(MYCXXFLAGS) $(MYINCLUDES) +LDFLAGS += $(MYLDFLAGS) +LDLIBS += $(MYLDLIBS) vpath %.c $(MYSRCPATHS) @@ -29,6 +33,7 @@ BINDIR := . OBJDIR := obj MYOBJS ?= $(MYSRCS:%.c=$(OBJDIR)/%.o) +MYCXXOBJS ?= $(MYCXXSRCS:%.cpp=$(OBJDIR)/%.o) CLEAN = $(foreach bin,$(MYLIBS) $(BINS) $(LIB_A),$(BINDIR)/$(bin)) all: $(foreach bin,$(MYLIBS) $(BINS) $(LIB_A),$(BINDIR)/$(bin)) @@ -59,24 +64,31 @@ endif .PHONY: all clean install uninstall -$(BINDIR)/$(LIB_A): $(MYOBJS) +$(BINDIR)/$(LIB_A): $(MYOBJS) $(MYCXXOBJS) $(info [=] AR $(notdir $@)) - $(Q)$(AR) $@ $(MYOBJS) + $(Q)$(AR) $@ $(MYOBJS) $(MYCXXOBJS) $(Q)$(RANLIB) $@ -$(BINDIR)/% : $(OBJDIR)/%.o $(MYOBJS) $(MYLIBS) +$(BINDIR)/% : $(OBJDIR)/%.o $(MYOBJS) $(MYCXXOBJS) $(MYLIBS) $(info [=] LD $(notdir $@)) - $(Q)$(LD) $(LDFLAGS) $(MYOBJS) $< -o $@ $(MYLIBS) + $(Q)$(LD) $(LDFLAGS) $(MYOBJS) $(MYCXXOBJS) $< -o $@ $(MYLIBS) $(MYLDLIBS) -$(OBJDIR)/%.o : %.c | $(OBJDIR) +%.o: %.c +$(OBJDIR)/%.o : %.c $(OBJDIR)/%.d | $(OBJDIR) $(info [-] CC $<) $(Q)$(CC) $(DEPFLAGS) $(CFLAGS) -c -o $@ $< $(Q)$(POSTCOMPILE) +%.o: %.cpp +$(OBJDIR)/%.o : %.cpp $(OBJDIR)/%.d | $(OBJDIR) + $(info [-] CXX $<) + $(Q)$(CXX) $(DEPFLAGS) $(CXXFLAGS) -c -o $@ $< + $(Q)$(POSTCOMPILE) + $(OBJDIR): $(Q)$(MKDIR) $(OBJDIR) -DEPENDENCY_FILES = $(MYOBJS:%.o=%.d) $(BINS:%=$(OBJDIR)/%.d) +DEPENDENCY_FILES = $(MYOBJS:%.o=%.d) $(MYCXXOBJS:%.o=%.d) $(BINS:%=$(OBJDIR)/%.d) $(DEPENDENCY_FILES): ; .PRECIOUS: $(DEPENDENCY_FILES) diff --git a/Makefile.platform.sample b/Makefile.platform.sample index 8d587e3b7..8a31a0e9c 100644 --- a/Makefile.platform.sample +++ b/Makefile.platform.sample @@ -2,7 +2,7 @@ # Run 'make PLATFORM=' to get an exhaustive list of possible parameters for this file. PLATFORM=PM3RDV4 +#PLATFORM=PM3OTHER # If you want more than one PLATFORM_EXTRAS option, separate them by spaces: #PLATFORM_EXTRAS=BTADDON -#STANDALONE=LF_SAMYRUN -STANDALONE=LF_ICEHID +#STANDALONE=HF_MSDSAL diff --git a/README.md b/README.md index f97017965..ac155f993 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,11 @@ # RRG / Iceman repo - Proxmark3 + + | Releases | Linux & OSX CI | Windows CI | Coverity | | ------------------- |:-------------------:| -------------------:| -------------------:| -| [![Latest release](https://img.shields.io/github/release/RfidResearchGroup/proxmark3.svg)](https://github.com/RfidResearchGroup/proxmark3/releases/latest) | [![Build status](https://travis-ci.org/RfidResearchGroup/proxmark3.svg?branch=master)](https://travis-ci.org/RfidResearchGroup/proxmark3) | [![Build status](https://ci.appveyor.com/api/projects/status/b4gwrhq3nc876cuu/branch/master?svg=true)](https://ci.appveyor.com/project/RfidResearchGroup/proxmark3/branch/master) | [![Coverity Status](https://scan.coverity.com/projects/19334/badge.svg)](https://scan.coverity.com/projects/proxmark3-rrg-iceman-repo)| +| [![Latest release](https://img.shields.io/github/v/release/rfidresearchgroup/proxmark3)](https://github.com/RfidResearchGroup/proxmark3/releases/latest) | [![Build status](https://api.travis-ci.org/RfidResearchGroup/proxmark3.svg?branch=master)](https://travis-ci.org/RfidResearchGroup/proxmark3) | [![Build status](https://ci.appveyor.com/api/projects/status/b4gwrhq3nc876cuu/branch/master?svg=true)](https://ci.appveyor.com/project/RfidResearchGroup/proxmark3/branch/master) | [![Coverity Status](https://scan.coverity.com/projects/19334/badge.svg)](https://scan.coverity.com/projects/proxmark3-rrg-iceman-repo)| @@ -16,15 +18,22 @@ |[Why didn't you base it on official Proxmark3 Master?](#why-didnt-you-base-it-on-official-proxmark3-master)| **[Homebrew (Mac OS X) & Upgrading HomeBrew Tap Formula](/doc/md/Installation_Instructions/Mac-OS-X-Homebrew-Installation-Instructions.md)** | [First Use and Verification](/doc/md/Use_of_Proxmark/2_Configuration-and-Verification.md)| |[Proxmark3 GUI](#proxmark3-gui)|**[Setup and build for Windows](/doc/md/Installation_Instructions/Windows-Installation-Instructions.md)**|[Commands & Features](/doc/md/Use_of_Proxmark/3_Commands-and-Features.md)| |[Issues](#issues)|[Blue shark manual](/doc/bt_manual_v10.md) || -|[Notes on UART](/doc/uart_notes.md)|[Maintainers](/doc/md/Development/Maintainers.md)|[Command Cheat sheet](/doc/cheatsheet.md)| -|[Notes on frame format](/doc/new_frame_format.md)|[Advanced compilation parameters](/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md)|[More cheat sheets](https://github.com/RfidResearchGroup/proxmark3/wiki/More-cheat-sheets)| -|[Notes on external flash](/doc/ext_flash_notes.md)||[EMV](/doc/emv_notes.md)| -|[Notes on Termux / Android](/doc/termux_notes.md)|**[Troubleshooting](/doc/md/Installation_Instructions/Troubleshooting.md)**|[Complete client command set](/doc/commands.md)| -|[Notes on tracedata / wireshark](/doc/trace_notes.md)|**[JTAG](/doc/jtag_notes.md)**|| -|[Notes on loclass](/doc/loclass_notes.md)||| -|[Notes on paths](/doc/path_notes.md)||| -|[Developing standalone mode](/armsrc/Standalone/readme.md)|[Wiki about standalone mode](https://github.com/RfidResearchGroup/proxmark3/wiki/Standalone-mode) || -|[Donations](#Donations)||| +|[Donations](#Donations)|[Maintainers](/doc/md/Development/Maintainers.md)|[Command Cheat sheet](/doc/cheatsheet.md)| +||[Advanced compilation parameters](/doc/md/Use_of_Proxmark/4_Advanced-compilation-parameters.md)|[More cheat sheets](https://github.com/RfidResearchGroup/proxmark3/wiki/More-cheat-sheets)| +||**[Troubleshooting](/doc/md/Installation_Instructions/Troubleshooting.md)**|[Complete client command set](/doc/commands.md)| +||**[JTAG](/doc/jtag_notes.md)**|| + + +## Notes / helpful documents + +| Notes ||| +| ------------------- |:-------------------:| -------------------:| +|[Notes on UART](/doc/uart_notes.md)|[Notes on Termux / Android](/doc/termux_notes.md)|[Notes on paths](/doc/path_notes.md)| +|[Notes on frame format](/doc/new_frame_format.md)|[Notes on tracelog / wireshark](/doc/trace_notes.md)|[Notes on EMV](/doc/emv_notes.md)| +|[Notes on external flash](/doc/ext_flash_notes.md)|[Notes on loclass](/doc/loclass_notes.md)|[Notes on Coverity Scan Config & Run](/doc/md/Development/Coverity-Scan-Config-%26-Run.md)| +|[Notes on file formats used with Proxmark3](/doc/extensions_notes.md)|[Notes on MFU binary format](/doc/mfu_binary_format_notes.md)|[Notes on FPGA & ARM](/doc/fpga_arm_notes.md)| +|[Developing standalone mode](/armsrc/Standalone/readme.md)|[Wiki about standalone mode](https://github.com/RfidResearchGroup/proxmark3/wiki/Standalone-mode)|| +|[Notes on Color usage](/doc/colors_notes.md)|[Makefile vs CMake](/doc/md/Development/Makefile-vs-CMake.md)| ## Build for non-RDV4 Proxmark3 platforms @@ -48,30 +57,64 @@ On the software side: quite a lot, see the [Changelog file](CHANGELOG.md). This repo compiles nicely on - Proxspace v3.x - - Windows/mingw environment with Qt5.6.1 & GCC 4.8 - - Ubuntu 1604, 1804, 1904 + - [latest release v3.5](https://github.com/Gator96100/ProxSpace/releases) + - Windows/mingw environment with Qt5.6.1 & GCC 4.9 + - Ubuntu 1604 -> 2004 + - ParrotOS, Gentoo, Pentoo, Kali, Nethunter, Archlinux, Fedora, Debian + - Rasbian + - Android / Termux - Mac OS X / Homebrew - - ParrotOS, Gentoo, Pentoo, Kali, Nethunter, Archlinux, Fedora - WSL, WSL2 (Windows subsystem linux) on Windows 10 - Docker container + - [ RRG / Iceman repo based ubuntu 18.04 container ](https://hub.docker.com/r/secopsconsult/proxmark3) + - [ Iceman fork based container v1.7 ](https://hub.docker.com/r/iceman1001/proxmark3/) +Hardware to run client on + - PC + - Android + - Raspberry Pi & Raspberry Pi Zero + - Jetson Nano + +## Precompiled binaries +We don't maintain any precompiled binaries in this repo. There is community effort over at the Proxmark3 forum where @gator96100 has set up a google drive with many mingw binaries which is up-to-date. We link to these files here as to make it easier for users. +If you are having troubles with these files, contact the package maintainer @gator96100 and read the [sticky thread at forum](http://www.proxmark.org/forum/viewtopic.php?pid=24763#p24763) where known issues has been documented. + + +Ref: + +- [Precompiled builds for RDV40 dedicated x86](https://drive.google.com/open?id=13zUs-aiQkYaSl5KWrBtuW5IWCoHJPsue) +- [Precompiled builds for RDV40 dedicated x64](https://drive.google.com/open?id=1SyPB8t5Vo8O0Lh7PjNm3Kv-mO4BNbxjX) + +- [Precompiled builds for RDV40 dedicated with Bluetooth addon x86](https://drive.google.com/open?id=1TqWYctkRvkLshQ1ZRBHPLDzYHR-asuMO) +- [Precompiled builds for RDV40 dedicated with Bluetooth addon x64](https://drive.google.com/open?id=17ful7u2QyYmMQzQzc5fAf8nJvyoDJfSL) + +Generice Proxmark3 devices (non RDV4) +- [Precompiled builds for RRG / Iceman repository x86](https://drive.google.com/open?id=1PI3Xr1mussPBPnYGu4ZjWzGPARK4N7JR) +- [Precompiled builds for RRG / Iceman repository x64](https://drive.google.com/open?id=1uX9RtYGinuFrpHybu4xq_BE3HrobI20e) + + +## Roadmap The [public roadmap](https://github.com/RfidResearchGroup/proxmark3/wiki/Public-Roadmap) is an excellent start to read if you are interesting in contributing. > 👉 **Remember!** If you intend to contribute to the code, please read the [coding style notes](HACKING.md) first. We usually merge your contributions fast since we do like the idea of getting a functionality in the Proxmark3 and weed out the bugs afterwards. -## Notes / helpful documents -- notes on [Coverity Scan Config & Run](/doc/md/Development/Coverity-Scan-Config-%26-Run.md). -- notes on [UART](/doc/uart_notes.md) -- notes on [Frame format](/doc/new_frame_format.md) -- notes on [external flash](/doc/ext_flash_notes.md) -- notes on [standalone mode](https://github.com/RfidResearchGroup/proxmark3/wiki/Standalone-mode) -- notes on [Termux / Android](/doc/termux_notes.md) -- notes on [tracedata / Wireshark](/doc/trace_notes.md) -- notes on [loclass](/doc/loclass_notes.md) -- notes on [EMV](/doc/emv_notes.md) -- notes on [Paths](/doc/path_notes.md) -- notes on [file formats used with Proxmark3](/doc/extensions_notes.md) + +## Issues & Troubleshooting +Please search the [issues](https://github.com/rfidresearchgroup/proxmark3/issues) page here and see if your issue is listed in the first instance. Next place to visit is the [Proxmark Forum](http://www.proxmark.org/forum/index.php). Learn to search it well and finally Google / duckduckgo is your friend :) You will find many blogposts, youtube videos, tweets, reddit + +Read the [Troubleshooting](/doc/md/Installation_Instructions/Troubleshooting.md) guide to weed out most known problems. + +Offical channels + - [Proxmark3 IRC channel](http://webchat.freenode.net/?channels=#proxmark3) + - [Proxmark3 sub reddit](https://www.reddit.com/r/proxmark3/) + - [Twitter](https://twitter.com/proxmark3/) + - [Proxmark3 community discord server](https://discord.gg/zjxc8ZB) + + _no slack channel_ + +Iceman has quite a few videos on his [youtube channel](https://www.youtube.com/c/ChrisHerrmann1001) + ## Cheat sheet Thanks to Alex Dibs, you can enjoy a [command cheat sheet](/doc/cheatsheet.md) @@ -90,13 +133,6 @@ The separation from official Proxmark3 repo gives us a lot of freedom to create The official PM3-GUI from Gaucho will not work. The new universal GUI will work. [Proxmark3 Universal GUI](https://github.com/burma69/PM3UniversalGUI) Almost, change needed in order to show helptext when client isn't connected to a device. -## Issues - -Please see the [Proxmark Forum](http://www.proxmark.org/forum/index.php) and see if your issue is listed in the first instance Google is your friend :) Questions will be answered via the forum by Iceman and the team. - -Read the [Troubleshooting](/doc/md/Installation_Instructions/Troubleshooting.md) guide to weed out most known problems. - - ## The end - July 2018 [@herrmann1001](https://mobile.twitter.com/herrmann1001) diff --git a/appveyor.yml b/appveyor.yml index 230bb44bf..6e268ccb7 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,5 +1,5 @@ version: 3.0.1.{build} -image: Visual Studio 2017 +image: Visual Studio 2019 clone_folder: C:\ProxSpace\pm3 init: - ps: >- @@ -7,7 +7,6 @@ init: #Get-ChildItem Env: - $releasename="" $env:APPVEYOR_REPO_COMMIT_SHORT = $env:APPVEYOR_REPO_COMMIT.Substring(0, 8) @@ -23,11 +22,12 @@ init: Add-AppveyorMessage -Message "[$env:APPVEYOR_REPO_COMMIT_SHORT]$env:appveyor_repo_name($env:APPVEYOR_REPO_BRANCH)" -Category Information -Details "repository: $env:appveyor_repo_name branch: $env:APPVEYOR_REPO_BRANCH release: $releasename" - # iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) clone_script: - ps: >- Write-Host "Removing ProxSpace..." -NoNewLine + + $CloneTime=[System.Environment]::TickCount cd \ @@ -55,6 +55,11 @@ clone_script: Write-Host "[ OK ]" -ForegroundColor Green + Write-Host "Removing ps startup_check.sh ..." -NoNewLine + + Remove-Item -Recurse -Force -Path c:\ProxSpace\msys2\ps\startup_checks.sh + + Write-Host "[ OK ]" -ForegroundColor Green Write-Host "Cloning repository <$env:appveyor_repo_name> to $env:appveyor_build_folder ..." -NoNewLine @@ -152,24 +157,15 @@ clone_script: ExecUpdate "update2" "C:\ProxSpace\msys2\msys2_shell.cmd -mingw32 -defterm -no-start /dev/null" "terminate?MSYS2" + Add-AppveyorMessage -Message "ProxSpace download and update took $(([System.Environment]::TickCount-$CloneTime) / 1000) sec" -Category Information + Write-Host "Update " -NoNewLine Write-Host "[ OK ]" -ForegroundColor Green install: -- ps: >- - function Exec-External { - param( - [Parameter(Position=0,Mandatory=1)][scriptblock] $command - ) - & $command - if ($LASTEXITCODE -ne 0) { - throw ("Command returned non-zero error-code ${LASTEXITCODE}: $command") - } - } build_script: - ps: >- - "C:\ProxSpace\msys2\usr\bin;C:\ProxSpace\msys2\mingw32\bin;C:\ProxSpace\gcc-arm-none-eabi\bin;$env:Path" - + $env:Path="C:\ProxSpace\msys2\usr\bin;C:\ProxSpace\msys2\mingw32\bin;C:\ProxSpace\gcc-arm-none-eabi\bin;c:\Python38;c:\Python38\Scripts;$env:Path" $env:MINGW_HOME="C:\ProxSpace\msys2\mingw32" @@ -185,9 +181,13 @@ build_script: cd C:\ProxSpace\pm3 + Write-Host "---------- make ----------" -ForegroundColor Yellow + + $TestTime=[System.Environment]::TickCount + #make - bash -c -i 'pwd;make clean;make all' + bash -c -i 'echo $PATH;pwd;make clean;make V=1' #some checks @@ -198,206 +198,75 @@ build_script: } - if(!(Test-Path C:\ProxSpace\pm3\armsrc\obj\fullimage.elf)){ + cd c:\ProxSpace\pm3 - throw "ARM file fullimage.elf not exists." + bash -c -i 'make check' + $testspass = ($LASTEXITCODE -eq 0) + + $global:TestsPassed=$testspass + + if ($testspass) { + Add-AppveyorTest -Name "make Tests" -Framework NUnit -Filename "make check" -Outcome Passed -Duration "$([System.Environment]::TickCount-$TestTime)" + Write-Host "make Tests [ OK ]" -ForegroundColor Green + } else { + Add-AppveyorTest -Name "make Tests" -Framework NUnit -Filename "make check" -Outcome Failed -Duration "$([System.Environment]::TickCount-$TestTime)" + Write-Host "make Tests [ ERROR ]" -ForegroundColor Red + throw "Tests error." } + + Write-Host "---------- btaddon ----------" -ForegroundColor Yellow + + $TestTime=[System.Environment]::TickCount - if(!(Test-Path C:\ProxSpace\pm3\client\resources\hardnested_tables\*.bin.z)){ - - throw "Files in client\resources\hardnested_tables is not exists." - - } - - - #install - - Write-Host "Installing..." -NoNewLine -ForegroundColor Yellow - - New-Item -ItemType Directory -Force -Path C:\ProxSpace\pm3\Release\bin - - bash -c -i 'make install DESTDIR=Release PREFIX=' - - # dll files - - Copy-Item C:\ProxSpace\msys2\mingw32\bin\libgcc_s_dw2-1.dll C:\ProxSpace\pm3\Release\bin - - Copy-Item C:\ProxSpace\msys2\mingw32\bin\libstdc++-6.dll C:\ProxSpace\pm3\Release\bin - - Copy-Item C:\ProxSpace\msys2\mingw32\bin\libwinpthread-1.dll C:\ProxSpace\pm3\Release\bin - - Copy-Item C:\ProxSpace\msys2\mingw32\bin\Qt5Core.dll C:\ProxSpace\pm3\Release\bin - - Copy-Item C:\ProxSpace\msys2\mingw32\bin\Qt5Gui.dll C:\ProxSpace\pm3\Release\bin - - Copy-Item C:\ProxSpace\msys2\mingw32\bin\Qt5Widgets.dll C:\ProxSpace\pm3\Release\bin - - Copy-Item C:\ProxSpace\msys2\mingw32\bin\libreadline*.dll C:\ProxSpace\pm3\Release\bin - - Copy-Item C:\ProxSpace\msys2\mingw32\bin\libtermcap-0.dll C:\ProxSpace\pm3\Release\bin - - Write-Host "[ OK ]" -ForegroundColor Green - - - #archive and push - - $releasename="" - - if ($env:appveyor_repo_tag -match "true"){ - - $releasename=$env:APPVEYOR_REPO_TAG_NAME + "/" - - } - - $releasename+=$env:APPVEYOR_BUILD_VERSION + " [" + $env:APPVEYOR_REPO_COMMIT.Substring(0, 7) + "]" - - - Write-Host "Archive and publish release files ($releasename)..." -NoNewLine -ForegroundColor Yellow - - cd C:\ProxSpace - - 7z a release.zip C:\ProxSpace\pm3\Release - - Push-AppveyorArtifact release.zip -DeploymentName "$releasename" - - Write-Host "[ OK ]" -ForegroundColor Green - - - Write-Host "Builded..." -ForegroundColor Yellow -test_script: -- ps: >- - $env:Path = "C:\ProxSpace\msys\bin;$env:Path" + bash -c -i 'pwd;make clean;make PLATFORM_EXTRAS=BTADDON' cd c:\ProxSpace\pm3 + bash -c -i 'make check' - $global:TestsPassed=$true + $testspass = ($LASTEXITCODE -eq 0) - - Function ExecTest($Name, $File, $Cmd, $CheckResult) { + $global:TestsPassed=(($global:TestsPassed) -and ($testspass)) - #--- begin Job - - $Job = Start-Job -ScriptBlock { - [bool]$res=$false - $TestTime=[System.Environment]::TickCount - $env:Path = "C:\ProxSpace\msys\bin;$env:Path" - Set-Location $using:PWD - - $sb=[scriptblock]::Create("$using:Cmd") - #execute scriptblock - Write-host "Test [$using:Name] job: $using:Cmd" - $Cond=&$sb - - if ($Cond -eq $null){ - } ElseIf($using:CheckResult -ne $null) { - [String]$searchstr="" - if ($Cond -is [Object]){ - ForEach($line in $Cond){ - Write-host $line -ForegroundColor Gray - $searchstr += $line - } - }else{ - Write-host "$Cond" -ForegroundColor Gray - $searchstr = $Cond - } - If($searchstr -like "*$using:CheckResult*") { - $res=$true - } - $Cond="*$using:CheckResult*" - } Else { - If (!($Cond -is [bool] -or $Cond -is [byte] -or $Cond -is [int16] -or $Cond -is [int32] -or $Cond -is [int64] -or $Cond -is [float])){ - if ($Cond -is "String" -and $Cond -like "*passed*"){ - $res= $true - } - if ($Cond -is "String" -and $Cond -like "*true*"){ - $res= $true - } - ForEach($line in $Cond){ - if ($line -like "*passed*"){ - $res = $true - $Cond = $line - break - } - } - } Else { - $res=$Cond - } - } - - If ($res) { - Write-host "Result[$using:Name]: $Cond" -ForegroundColor Green - Add-AppveyorTest -Name "$using:Name" -Framework NUnit -Filename "$using:File" -Outcome Passed -Duration "$([System.Environment]::TickCount-$TestTime)" - }Else { - Write-host "Result[$using:Name]: $Cond" -ForegroundColor Red - Add-AppveyorTest -Name "$using:Name" -Framework NUnit -Filename "$using:File" -Outcome Failed -Duration "$([System.Environment]::TickCount-$TestTime)" -ErrorMessage "command:$using:Cmd`nresult:$Cond" - } - return $res + if ($testspass) { + Add-AppveyorTest -Name "BTaddon Tests" -Framework NUnit -Filename "make check" -Outcome Passed -Duration "$([System.Environment]::TickCount-$TestTime)" + Write-Host "BTaddon Tests [ OK ]" -ForegroundColor Green + } else { + Add-AppveyorTest -Name "BTaddon Tests" -Framework NUnit -Filename "make check" -Outcome Failed -Duration "$([System.Environment]::TickCount-$TestTime)" + Write-Host "BTaddon Tests [ ERROR ]" -ForegroundColor Red } + + Write-Host "---------- make clean ----------" -ForegroundColor Yellow + + bash -c -i 'make clean' + + Write-Host "---------- cmake ----------" -ForegroundColor Yellow + + $TestTime=[System.Environment]::TickCount - #--- end Job + cmd.exe /c 'C:\ProxSpace\msys2\msys2_shell.cmd -mingw32 -defterm -no-start -c "mkdir -p client/build; cd client/build; cmake -G""MSYS Makefiles"" ..; make VERBOSE=1;"' + + Write-Host "---------- cmake tests ----------" -ForegroundColor Yellow - [bool]$res=$false - # Wait 180 sec timeout for Job - if(Wait-Job $Job -Timeout 180){ - $Results = $Job | Receive-Job - if($Results -like "true"){ - $res=$true - } - } else { - Write-host "Test [$Name] timeout" -ForegroundColor Red - Add-AppveyorTest -Name "$Name" -Framework NUnit -Filename "$File" -Outcome Failed -Duration 60000 -ErrorMessage "timeout" - } - Remove-Job -Force $Job + cd c:\ProxSpace\pm3 - if(!$res){ - Write-host "--------------------- tests fail" -ForegroundColor Red - $global:TestsPassed=$false - } + bash -c -i './tools/pm3_tests.sh --clientbin client/build/proxmark3.exe client' + + $testspass = ($LASTEXITCODE -eq 0) + + $global:TestsPassed=(($global:TestsPassed) -and ($testspass)) + + if ($testspass) { + Add-AppveyorTest -Name "cmake Tests" -Framework NUnit -Filename "make client/check" -Outcome Passed -Duration "$([System.Environment]::TickCount-$TestTime)" + Write-Host "cmake Tests [ OK ]" -ForegroundColor Green + } else { + Add-AppveyorTest -Name "cmake Tests" -Framework NUnit -Filename "make client/check" -Outcome Failed -Duration "$([System.Environment]::TickCount-$TestTime)" + Write-Host "cmake Tests [ ERROR ]" -ForegroundColor Red } - - - Write-Host "Running tests..." -ForegroundColor Yellow - - - #file test - - ExecTest "proxmark3 exists" "proxmark3.exe" {Test-Path C:\ProxSpace\pm3\Release\bin\proxmark3.exe} - - ExecTest "arm bootrom exists" "bootrom.elf" {Test-Path C:\ProxSpace\pm3\Release\share\proxmark3\firmware\bootrom.elf} - - ExecTest "arm image exists" "fullimage.elf" {Test-Path C:\ProxSpace\pm3\Release\share\proxmark3\firmware\fullimage.elf} - - ExecTest "arm recovery image exists" "proxmark3_recovery.bin" {Test-Path C:\ProxSpace\pm3\Release\share\proxmark3\firmware\proxmark3_recovery.bin} - - ExecTest "hardnested tables exists" "hardnested" {Test-Path C:\ProxSpace\pm3\Release\share\proxmark3\resources\hardnested_tables\*.z} - - ExecTest "release exists" "release.zip" {Test-Path C:\ProxSpace\release.zip} - - - #proxmark logic tests - - ExecTest "proxmark help" "proxmark3 -h" {bash -lc 'cd ~/client;./proxmark3 -h 2>&1 | grep -q wait && echo passed || echo failed'} - - ExecTest "proxmark help text ISO7816" "proxmark3 -t" {bash -lc 'cd ~/client;./proxmark3 -t 2>&1 | grep -q ISO7816 && echo passed || echo failed'} - - ExecTest "proxmark help text hardnested" "proxmark3 -t" {bash -lc 'cd ~/client;./proxmark3 -t 2>&1 | grep -q hardnested && echo passed || echo failed'} - - - ExecTest "hf mf offline text" "hf mf" {bash -lc "cd ~/client;./proxmark3 -c 'hf mf'"} "at_enc" - - #proxmark crypto tests - - # Long tests: - # ExecTest "hf mf hardnested" "hf mf hardnested" {bash -lc "cd ~/client;./proxmark3 -c 'hf mf hardnested t 1 000000000000'"} "found:" - # ExecTest "hf mf iclass" "hf mf iclass" {bash -lc "cd ~/client;./proxmark3 -c 'hf iclass loclass t l'"} "verified ok" - # ExecTest "emv test" "emv test" {bash -lc "cd ~/client;./proxmark3 -c 'emv test -i -l'"} "Test?s? ? OK" - # Short tests: - ExecTest "hf mf iclass" "hf mf iclass" {bash -lc "cd ~/client;./proxmark3 -c 'hf iclass loclass t'"} "OK!" - ExecTest "emv test" "emv test" {bash -lc "cd ~/client;./proxmark3 -c 'emv test -i'"} "Test?s? ? OK" - - + +test_script: +- ps: >- if ($global:TestsPassed) { Write-Host "Tests [ OK ]" -ForegroundColor Green } else { @@ -409,4 +278,4 @@ on_success: on_failure: - ps: Write-Host "Build error." -ForegroundColor Red on_finish: -- ps: # $blockRdp = $false; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) +- ps: # $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) diff --git a/armsrc/BigBuf.c b/armsrc/BigBuf.c index 765d230a5..f6c111d85 100644 --- a/armsrc/BigBuf.c +++ b/armsrc/BigBuf.c @@ -12,35 +12,77 @@ #include "string.h" #include "dbprint.h" +#include "pm3_cmd.h" + +extern uint8_t _stack_start, __bss_end__; // BigBuf is the large multi-purpose buffer, typically used to hold A/D samples or traces. // Also used to hold various smaller buffers and the Mifare Emulator Memory. -// declare it as uint32_t to achieve alignment to 4 Byte boundary -static uint32_t BigBuf[BIGBUF_SIZE / sizeof(uint32_t)]; +// We know that bss is aligned to 4 bytes. +static uint8_t *BigBuf = &__bss_end__; /* BigBuf memory layout: -Pointer to highest available memory: BigBuf_hi - - high BIGBUF_SIZE - reserved = BigBuf_malloc() subtracts amount from BigBuf_hi, +Pointer to highest available memory: s_bigbuf_hi + high s_bigbuf_size + reserved = BigBuf_malloc() subtracts amount from s_bigbuf_hi, low 0x00 */ +static uint32_t s_bigbuf_size = 0; + // High memory mark -static uint16_t BigBuf_hi = BIGBUF_SIZE; +static uint32_t s_bigbuf_hi = 0; // pointer to the emulator memory. static uint8_t *emulator_memory = NULL; +//============================================================================= +// The ToSend buffer. +// A buffer where we can queue things up to be sent through the FPGA, for +// any purpose (fake tag, as reader, whatever). We go MSB first, since that +// is the order in which they go out on the wire. +//============================================================================= +static tosend_t toSend = { + .max = -1, + .bit = 8, + .buf = NULL +}; +//============================================================================= +// The dmaBuf 16bit buffer. +// A buffer where we recive IQ samples sent from the FPGA, for demodulating +//============================================================================= +static dmabuf16_t dma_16 = { + .size = DMA_BUFFER_SIZE, + .buf = NULL +}; +// dmaBuf 8bit buffer +static dmabuf8_t dma_8 = { + .size = DMA_BUFFER_SIZE, + .buf = NULL +}; + + + // trace related variables -static uint32_t traceLen = 0; -static bool tracing = true; //todo static? +static uint32_t trace_len = 0; +static bool tracing = true; + +// compute the available size for BigBuf +void BigBuf_initialize(void) { + s_bigbuf_size = (uint32_t)&_stack_start - (uint32_t)&__bss_end__; + s_bigbuf_hi = s_bigbuf_size; + trace_len = 0; +} // get the address of BigBuf uint8_t *BigBuf_get_addr(void) { return (uint8_t *)BigBuf; } +uint32_t BigBuf_get_size(void) { + return s_bigbuf_size; +} + // get the address of the emulator memory. Allocate part of Bigbuf for it, if not yet done uint8_t *BigBuf_get_EM_addr(void) { // not yet allocated @@ -49,6 +91,11 @@ uint8_t *BigBuf_get_EM_addr(void) { return emulator_memory; } +/* +uint32_t BigBuf_get_EM_size(void) { + return CARD_MEMORY_SIZE; +} +*/ // clear ALL of BigBuf void BigBuf_Clear(void) { @@ -57,9 +104,10 @@ void BigBuf_Clear(void) { // clear ALL of BigBuf void BigBuf_Clear_ext(bool verbose) { - memset(BigBuf, 0, BIGBUF_SIZE); + memset(BigBuf, 0, s_bigbuf_size); + clear_trace(); if (verbose) - Dbprintf("Buffer cleared (%i bytes)", BIGBUF_SIZE); + Dbprintf("Buffer cleared (%i bytes)", s_bigbuf_size); } void BigBuf_Clear_EM(void) { @@ -67,57 +115,66 @@ void BigBuf_Clear_EM(void) { } void BigBuf_Clear_keep_EM(void) { - memset(BigBuf, 0, BigBuf_hi); + memset(BigBuf, 0, s_bigbuf_hi); } // allocate a chunk of memory from BigBuf. We allocate high memory first. The unallocated memory // at the beginning of BigBuf is always for traces/samples uint8_t *BigBuf_malloc(uint16_t chunksize) { - if (BigBuf_hi - chunksize < 0) + if (s_bigbuf_hi < chunksize) return NULL; // no memory left chunksize = (chunksize + 3) & 0xfffc; // round to next multiple of 4 - BigBuf_hi -= chunksize; // aligned to 4 Byte boundary - return (uint8_t *)BigBuf + BigBuf_hi; + s_bigbuf_hi -= chunksize; // aligned to 4 Byte boundary + return (uint8_t *)BigBuf + s_bigbuf_hi; } // free ALL allocated chunks. The whole BigBuf is available for traces or samples again. void BigBuf_free(void) { - BigBuf_hi = BIGBUF_SIZE; + s_bigbuf_hi = s_bigbuf_size; emulator_memory = NULL; // shouldn't this empty BigBuf also? + toSend.buf = NULL; + dma_16.buf = NULL; + dma_8.buf = NULL; } // free allocated chunks EXCEPT the emulator memory void BigBuf_free_keep_EM(void) { if (emulator_memory != NULL) - BigBuf_hi = emulator_memory - (uint8_t *)BigBuf; + s_bigbuf_hi = emulator_memory - (uint8_t *)BigBuf; else - BigBuf_hi = BIGBUF_SIZE; + s_bigbuf_hi = s_bigbuf_size; - // shouldn't this empty BigBuf also? + toSend.buf = NULL; + dma_16.buf = NULL; + dma_8.buf = NULL; } void BigBuf_print_status(void) { - DbpString(_BLUE_("Memory")); - Dbprintf(" BIGBUF_SIZE.............%d", BIGBUF_SIZE); - Dbprintf(" Available memory........%d", BigBuf_hi); - DbpString(_BLUE_("Tracing")); + DbpString(_CYAN_("Memory")); + Dbprintf(" BigBuf_size.............%d", s_bigbuf_size); + Dbprintf(" Available memory........%d", s_bigbuf_hi); + DbpString(_CYAN_("Tracing")); Dbprintf(" tracing ................%d", tracing); - Dbprintf(" traceLen ...............%d", traceLen); + Dbprintf(" traceLen ...............%d", trace_len); + + Dbprintf(" dma8 memory.............%d", dma_8.buf - BigBuf_get_addr()); + Dbprintf(" dma16 memory............%d", (uint8_t *)dma_16.buf - BigBuf_get_addr()); + Dbprintf(" toSend memory...........%d", toSend.buf - BigBuf_get_addr()); } // return the maximum trace length (i.e. the unallocated size of BigBuf) uint16_t BigBuf_max_traceLen(void) { - return BigBuf_hi; + return s_bigbuf_hi; } void clear_trace(void) { - traceLen = 0; + trace_len = 0; } void set_tracelen(uint32_t value) { - traceLen = value; + trace_len = value; } void set_tracing(bool enable) { @@ -133,7 +190,7 @@ bool get_tracing(void) { * @return */ uint32_t BigBuf_get_traceLen(void) { - return traceLen; + return trace_len; } /** @@ -143,63 +200,70 @@ uint32_t BigBuf_get_traceLen(void) { annotation of commands/responses. **/ bool RAMFUNC LogTrace(const uint8_t *btBytes, uint16_t iLen, uint32_t timestamp_start, uint32_t timestamp_end, uint8_t *parity, bool readerToTag) { - if (!tracing) return false; - - uint8_t *trace = BigBuf_get_addr(); - - uint32_t num_paritybytes = (iLen - 1) / 8 + 1; // number of valid paritybytes in *parity - uint32_t duration = timestamp_end - timestamp_start; - - // Return when trace is full - if (traceLen + sizeof(iLen) + sizeof(timestamp_start) + sizeof(duration) + num_paritybytes + iLen >= BigBuf_max_traceLen()) { - tracing = false; // don't trace any more + if (tracing == false) { return false; } - // Traceformat: - // 32 bits timestamp (little endian) - // 16 bits duration (little endian) - // 16 bits data length (little endian, Highest Bit used as readerToTag flag) - // y Bytes data - // x Bytes parity (one byte per 8 bytes data) - // timestamp (start) - trace[traceLen++] = ((timestamp_start >> 0) & 0xff); - trace[traceLen++] = ((timestamp_start >> 8) & 0xff); - trace[traceLen++] = ((timestamp_start >> 16) & 0xff); - trace[traceLen++] = ((timestamp_start >> 24) & 0xff); + uint8_t *trace = BigBuf_get_addr(); + tracelog_hdr_t *hdr = (tracelog_hdr_t *)(trace + trace_len); - // duration - trace[traceLen++] = ((duration >> 0) & 0xff); - trace[traceLen++] = ((duration >> 8) & 0xff); + uint32_t num_paritybytes = (iLen - 1) / 8 + 1; // number of valid paritybytes in *parity - // data length - trace[traceLen++] = ((iLen >> 0) & 0xff); - trace[traceLen++] = ((iLen >> 8) & 0xff); - - // readerToTag flag - if (!readerToTag) { - trace[traceLen - 1] |= 0x80; + // Return when trace is full + if (TRACELOG_HDR_LEN + iLen + num_paritybytes >= BigBuf_max_traceLen() - trace_len) { + tracing = false; + return false; } + uint32_t duration; + if (timestamp_end > timestamp_start) { + duration = timestamp_end - timestamp_start; + } else { + duration = (UINT32_MAX - timestamp_start) + timestamp_end; + } + + if (duration > 0xFFFF) { + /* + if (DBGLEVEL >= DBG_DEBUG) { + Dbprintf("Error in LogTrace: duration too long for 16 bits encoding: 0x%08x start: 0x%08x end: 0x%08x", duration, timestamp_start, timestamp_end); + } + */ + duration = 0; + } + + hdr->timestamp = timestamp_start; + hdr->duration = duration & 0xFFFF; + hdr->data_len = iLen; + hdr->isResponse = !readerToTag; + trace_len += TRACELOG_HDR_LEN; + // data bytes if (btBytes != NULL && iLen != 0) { - memcpy(trace + traceLen, btBytes, iLen); + memcpy(hdr->frame, btBytes, iLen); + trace_len += iLen; } - traceLen += iLen; // parity bytes if (num_paritybytes != 0) { if (parity != NULL) { - memcpy(trace + traceLen, parity, num_paritybytes); + memcpy(trace + trace_len, parity, num_paritybytes); } else { - memset(trace + traceLen, 0x00, num_paritybytes); + memset(trace + trace_len, 0x00, num_paritybytes); } + trace_len += num_paritybytes; } - traceLen += num_paritybytes; - return true; } +// specific LogTrace function for ISO15693: the duration needs to be scaled because otherwise it won't fit into a uint16_t +bool LogTrace_ISO15693(const uint8_t *bytes, uint16_t len, uint32_t ts_start, uint32_t ts_end, uint8_t *parity, bool reader2tag) { + uint32_t duration = ts_end - ts_start; + duration /= 32; + ts_end = ts_start + duration; + return LogTrace(bytes, len, ts_start, ts_end, parity, reader2tag); +} + + // Emulator memory uint8_t emlSet(uint8_t *data, uint32_t offset, uint32_t length) { uint8_t *mem = BigBuf_get_EM_addr(); @@ -210,3 +274,51 @@ uint8_t emlSet(uint8_t *data, uint32_t offset, uint32_t length) { Dbprintf("Error, trying to set memory outside of bounds! %d > %d", (offset + length), CARD_MEMORY_SIZE); return 1; } + + + +// get the address of the ToSend buffer. Allocate part of Bigbuf for it, if not yet done +tosend_t *get_tosend(void) { + + if (toSend.buf == NULL) + toSend.buf = BigBuf_malloc(TOSEND_BUFFER_SIZE); + + return &toSend; +} + +void tosend_reset(void) { + toSend.max = -1; + toSend.bit = 8; +} + +void tosend_stuffbit(int b) { + if (toSend.bit >= 8) { + toSend.max++; + toSend.buf[toSend.max] = 0; + toSend.bit = 0; + } + + if (b) + toSend.buf[ toSend.max] |= (1 << (7 - toSend.bit)); + + toSend.bit++; + + if (toSend.max >= TOSEND_BUFFER_SIZE) { + toSend.bit = 0; + } +} + +dmabuf16_t *get_dma16(void) { + if (dma_16.buf == NULL) + dma_16.buf = (uint16_t *)BigBuf_malloc(DMA_BUFFER_SIZE * sizeof(uint16_t)); + + return &dma_16; +} + +dmabuf8_t *get_dma8(void) { + if (dma_8.buf == NULL) + dma_8.buf = BigBuf_malloc(DMA_BUFFER_SIZE); + + return &dma_8; +} + diff --git a/armsrc/BigBuf.h b/armsrc/BigBuf.h index ad967c4c7..bf6600e1e 100644 --- a/armsrc/BigBuf.h +++ b/armsrc/BigBuf.h @@ -14,17 +14,21 @@ #include "common.h" -#define BIGBUF_SIZE 40000 #define MAX_FRAME_SIZE 256 // maximum allowed ISO14443 frame #define MAX_PARITY_SIZE ((MAX_FRAME_SIZE + 7) / 8) #define MAX_MIFARE_FRAME_SIZE 18 // biggest Mifare frame is answer to a read (one block = 16 Bytes) + 2 Bytes CRC #define MAX_MIFARE_PARITY_SIZE 3 // need 18 parity bits for the 18 Byte above. 3 Bytes are enough to store these #define CARD_MEMORY_SIZE 4096 -#define DMA_BUFFER_SIZE 256 //128 (how big is the dma?!? +#define DMA_BUFFER_SIZE 256 + +// 8 data bits and 1 parity bit per payload byte, 1 correction bit, 1 SOC bit, 2 EOC bits +#define TOSEND_BUFFER_SIZE (9 * MAX_FRAME_SIZE + 1 + 1 + 2) uint8_t *BigBuf_get_addr(void); +uint32_t BigBuf_get_size(void); uint8_t *BigBuf_get_EM_addr(void); uint16_t BigBuf_max_traceLen(void); +void BigBuf_initialize(void); void BigBuf_Clear(void); void BigBuf_Clear_ext(bool verbose); void BigBuf_Clear_keep_EM(void); @@ -38,7 +42,34 @@ void clear_trace(void); void set_tracing(bool enable); void set_tracelen(uint32_t value); bool get_tracing(void); + bool RAMFUNC LogTrace(const uint8_t *btBytes, uint16_t iLen, uint32_t timestamp_start, uint32_t timestamp_end, uint8_t *parity, bool readerToTag); +bool LogTrace_ISO15693(const uint8_t *bytes, uint16_t len, uint32_t ts_start, uint32_t ts_end, uint8_t *parity, bool reader2tag); + + uint8_t emlSet(uint8_t *data, uint32_t offset, uint32_t length); + +typedef struct { + int max; + int bit; + uint8_t *buf; +} tosend_t; + +tosend_t *get_tosend(void); +void tosend_reset(void); +void tosend_stuffbit(int b); + +typedef struct { + uint16_t size; + uint8_t *buf; +} dmabuf8_t; + +typedef struct { + uint16_t size; + uint16_t *buf; +} dmabuf16_t; + +dmabuf8_t *get_dma8(void); +dmabuf16_t *get_dma16(void); #endif /* __BIGBUF_H */ diff --git a/armsrc/Makefile b/armsrc/Makefile index 747f4254b..f3caf6e22 100644 --- a/armsrc/Makefile +++ b/armsrc/Makefile @@ -20,8 +20,7 @@ endif #in the next section to remove that particular feature from compilation. # NO space,TABs after the "\" sign. APP_CFLAGS = $(PLATFORM_DEFS) \ - -DON_DEVICE \ - -fno-strict-aliasing -ffunction-sections -fdata-sections + -ffunction-sections -fdata-sections SRC_LF = lfops.c lfsampling.c pcf7931.c lfdemod.c lfadc.c SRC_ISO15693 = iso15693.c iso15693tools.c @@ -31,7 +30,7 @@ SRC_ISO14443b = iso14443b.c SRC_FELICA = felica.c SRC_CRAPTO1 = crypto1.c des.c desfire_crypto.c mifaredesfire.c aes.c platform_util.c SRC_CRC = crc.c crc16.c crc32.c -SRC_ICLASS = iclass.c optimized_cipher.c +SRC_ICLASS = iclass.c optimized_cipherutils.c optimized_ikeys.c optimized_elite.c optimized_cipher.c SRC_LEGIC = legicrf.c legicrfsim.c legic_prng.c SRC_NFCBARCODE = thinfilm.c @@ -64,6 +63,12 @@ else SRC_HITAG = endif +ifneq (,$(findstring WITH_EM4x50,$(APP_CFLAGS))) + SRC_EM4x50 = em4x50.c +else + SRC_EM4x50 = +endif + ifneq (,$(findstring WITH_LCD,$(APP_CFLAGS))) SRC_LCD = fonts.c LCD.c else @@ -74,15 +79,15 @@ endif include Standalone/Makefile.inc #the FPGA bitstream files. Note: order matters! -FPGA_BITSTREAMS = fpga_lf.bit fpga_hf.bit +FPGA_BITSTREAMS = fpga_lf.bit fpga_hf.bit fpga_felica.bit -#the zlib source files required for decompressing the fpga config at run time -SRC_ZLIB = inflate.c inffast.c inftrees.c adler32.c zutil.c -#additional defines required to compile zlib -ZLIB_CFLAGS = -DZ_SOLO -DZ_PREFIX -DNO_GZIP -DZLIB_PM3_TUNED -APP_CFLAGS += $(ZLIB_CFLAGS) -# zlib includes: -APP_CFLAGS += -I../common/zlib +#the lz4 source files required for decompressing the fpga config at run time +SRC_LZ4 = lz4.c +#additional defines required to compile lz4 +LZ4_CFLAGS = -DLZ4_MEMORY_USAGE=8 +APP_CFLAGS += $(LZ4_CFLAGS) +# lz4 includes: +APP_CFLAGS += -I../common/lz4 # stdint.h provided locally until GCC 4.5 becomes C99 compliant, # stack-protect , no-pie reduces size on Gentoo Hardened 8.2 gcc @@ -94,13 +99,22 @@ THUMBSRC = start.c \ $(SRC_ISO15693) \ $(SRC_NFCBARCODE) \ $(SRC_LF) \ - $(SRC_ZLIB) \ + $(SRC_LZ4) \ $(SRC_LEGIC) \ $(SRC_FLASH) \ $(SRC_SMARTCARD) \ $(SRC_FPC) \ $(SRC_HITAG) \ + $(SRC_EM4x50) \ $(SRC_SPIFFS) \ + $(SRC_ISO14443a) \ + $(SRC_ISO14443b) \ + $(SRC_CRAPTO1) \ + $(SRC_ICLASS) \ + $(SRC_EMV) \ + $(SRC_CRC) \ + $(SRC_FELICA) \ + $(SRC_STANDALONE) \ appmain.c \ printf.c \ dbprint.c \ @@ -115,14 +129,6 @@ THUMBSRC = start.c \ # These are to be compiled in ARM mode ARMSRC = fpgaloader.c \ - $(SRC_ISO14443a) \ - $(SRC_ISO14443b) \ - $(SRC_CRAPTO1) \ - $(SRC_ICLASS) \ - $(SRC_EMV) \ - $(SRC_CRC) \ - $(SRC_FELICA) \ - $(SRC_STANDALONE) \ parity.c \ usb_cdc.c \ cmd.c @@ -133,8 +139,6 @@ VERSIONSRC = version.c \ # Do not move this inclusion before the definition of {THUMB,ASM,ARM}SRC include ../common_arm/Makefile.common -COMMON_FLAGS = -Os - INSTALLFW = $(OBJDIR)/fullimage.elf ifneq (,$(FWTAG)) INSTALLFWTAG = $(notdir $(INSTALLFW:%.elf=%-$(FWTAG).elf)) @@ -145,16 +149,19 @@ endif OBJS = $(OBJDIR)/fullimage.s19 FPGA_COMPRESSOR = ../tools/fpga_compress/fpga_compress -all: $(OBJS) +all: showinfo $(OBJS) + +showinfo: + $(info compiler version: $(shell $(CC) --version|head -n 1)) .DELETE_ON_ERROR: # version.c should be remade on every time fullimage.stage1.elf should be remade version.c: default_version.c $(OBJDIR)/fpga_version_info.o $(OBJDIR)/fpga_all.o $(THUMBOBJ) $(ARMOBJ) $(info [-] GEN $@) - $(Q)sh ../tools/mkversion.sh > $@ || perl ../tools/mkversion.pl > $@ || $(CP) $^ $@ + $(Q)$(SH) ../tools/mkversion.sh > $@ || $(PERL) ../tools/mkversion.pl > $@ || $(CP) $< $@ -fpga_version_info.c: $(FPGA_BITSTREAMS) | $(FPGA_COMPRESSOR) +fpga_version_info.c: $(FPGA_BITSTREAMS) $(FPGA_COMPRESSOR) $(info [-] GEN $@) $(Q)$(FPGA_COMPRESSOR) -v $(filter %.bit,$^) $@ @@ -176,7 +183,7 @@ $(FPGA_COMPRESSOR): $(OBJDIR)/fullimage.stage1.elf: $(VERSIONOBJ) $(OBJDIR)/fpga_all.o $(THUMBOBJ) $(ARMOBJ) $(info [=] LD $@) - $(Q)$(CC) $(LDFLAGS) -Wl,-T,ldscript,-Map,$(patsubst %.elf,%.map,$@) -o $@ $^ $(LIBS) + $(Q)$(CC) $(CROSS_LDFLAGS) -Wl,-T,ldscript,-Map,$(patsubst %.elf,%.map,$@) -o $@ $^ $(LIBS) $(OBJDIR)/fullimage.nodata.bin: $(OBJDIR)/fullimage.stage1.elf $(info [-] GEN $@) @@ -204,7 +211,7 @@ $(OBJDIR)/fullimage.data.o: $(OBJDIR)/fullimage.data.bin.z $(OBJDIR)/fullimage.elf: $(OBJDIR)/fullimage.nodata.o $(OBJDIR)/fullimage.data.o $(info [=] LD $@) - $(Q)$(CC) $(LDFLAGS) -Wl,-T,ldscript,-e,_osimage_entry,-Map,$(patsubst %.elf,%.map,$@) -o $@ $^ + $(Q)$(CC) $(CROSS_LDFLAGS) -Wl,-T,ldscript,-e,_osimage_entry,-Map,$(patsubst %.elf,%.map,$@) -o $@ $^ tarbin: $(OBJS) $(info TAR $@) diff --git a/armsrc/Standalone/Makefile.hal b/armsrc/Standalone/Makefile.hal index 5c462053b..bd66d538c 100644 --- a/armsrc/Standalone/Makefile.hal +++ b/armsrc/Standalone/Makefile.hal @@ -17,6 +17,9 @@ define KNOWN_STANDALONE_DEFINITIONS | LF_EM4100EMUL | Simulate predefined em4100 tags only | | | | +----------------------------------------------------------+ +| LF_EM4100RSWB | Read/simulate/brute em4100 tags & | +| | clone it to T555x tags | ++----------------------------------------------------------+ | LF_EM4100RWC | Read/simulate em4100 tags & clone it | | | to T555x tags | +----------------------------------------------------------+ @@ -41,6 +44,9 @@ define KNOWN_STANDALONE_DEFINITIONS | HF_COLIN | Mifare ultra fast sniff/sim/clone | | (RDV4 only) | - Colin Brigato | +----------------------------------------------------------+ +| HF_ICECLASS | Simulate HID iCLASS legacy ags | +| (RDV4 only) | storing in flashmem | ++----------------------------------------------------------+ | HF_LEGIC | Read/simulate Legic Prime tags | | | storing in flashmem | +----------------------------------------------------------+ @@ -55,10 +61,10 @@ define KNOWN_STANDALONE_DEFINITIONS +----------------------------------------------------------+ endef -STANDALONE_MODES := LF_SKELETON LF_EM4100EMUL LF_EM4100RWC LF_HIDBRUTE LF_ICEHID LF_PROXBRUTE LF_SAMYRUN -STANDALONE_MODES += HF_14ASNIFF HF_BOG HF_COLIN HF_LEGIC HF_MATTYRUN HF_MSDSAL HF_YOUNG +STANDALONE_MODES := LF_SKELETON LF_EM4100EMUL LF_EM4100RSWB LF_EM4100RWC LF_HIDBRUTE LF_ICEHID LF_PROXBRUTE LF_SAMYRUN +STANDALONE_MODES += HF_14ASNIFF HF_BOG HF_COLIN HF_ICECLASS HF_LEGIC HF_MATTYRUN HF_MSDSAL HF_YOUNG STANDALONE_MODES_REQ_SMARTCARD := -STANDALONE_MODES_REQ_FLASH := LF_ICEHID HF_14ASNIFF HF_BOG HF_COLIN +STANDALONE_MODES_REQ_FLASH := LF_ICEHID HF_14ASNIFF HF_BOG HF_COLIN HF_ICECLASS ifneq ($(filter $(STANDALONE),$(STANDALONE_MODES)),) STANDALONE_PLATFORM_DEFS += -DWITH_STANDALONE_$(STANDALONE) ifneq ($(filter $(STANDALONE),$(STANDALONE_MODES_REQ_SMARTCARD)),) diff --git a/armsrc/Standalone/Makefile.inc b/armsrc/Standalone/Makefile.inc index 6182b6948..131e26e79 100644 --- a/armsrc/Standalone/Makefile.inc +++ b/armsrc/Standalone/Makefile.inc @@ -45,6 +45,10 @@ endif ifneq (,$(findstring WITH_STANDALONE_LF_EM4100EMUL,$(APP_CFLAGS))) SRC_STANDALONE = lf_em4100emul.c endif +# WITH_STANDALONE_LF_EM4100RSWB +ifneq (,$(findstring WITH_STANDALONE_LF_EM4100RSWB,$(APP_CFLAGS))) + SRC_STANDALONE = lf_em4100rswb.c +endif # WITH_STANDALONE_LF_EM4100RWC ifneq (,$(findstring WITH_STANDALONE_LF_EM4100RWC,$(APP_CFLAGS))) SRC_STANDALONE = lf_em4100rwc.c @@ -53,7 +57,11 @@ endif ifneq (,$(findstring WITH_STANDALONE_HF_LEGIC,$(APP_CFLAGS))) SRC_STANDALONE = hf_legic.c endif -# WITH_STANDALONE_LF_MSDSAL +# WITH_STANDALONE_HF_MSDSAL ifneq (,$(findstring WITH_STANDALONE_HF_MSDSAL,$(APP_CFLAGS))) SRC_STANDALONE = hf_msdsal.c endif +# WITH_STANDALONE_HF_ICECLASS +ifneq (,$(findstring WITH_STANDALONE_HF_ICECLASS,$(APP_CFLAGS))) + SRC_STANDALONE = hf_iceclass.c +endif diff --git a/armsrc/Standalone/hf_14asniff.c b/armsrc/Standalone/hf_14asniff.c index 706a41b8b..c52928825 100644 --- a/armsrc/Standalone/hf_14asniff.c +++ b/armsrc/Standalone/hf_14asniff.c @@ -68,7 +68,7 @@ #define HF_14ASNIFF_LOGFILE "hf_14asniff.trc" -void DownloadTraceInstructions() { +static void DownloadTraceInstructions(void) { Dbprintf(""); Dbprintf("To get the trace from flash and display it:"); Dbprintf("1. mem spiffs dump o "HF_14ASNIFF_LOGFILE" f trace.trc"); @@ -81,7 +81,7 @@ void ModInfo(void) { DownloadTraceInstructions(); } -void RunMod() { +void RunMod(void) { StandAloneMode(); Dbprintf("Starting standalone mode: hf_14asniff"); diff --git a/armsrc/Standalone/hf_bog.c b/armsrc/Standalone/hf_bog.c index d1cc2e202..50e1d824f 100644 --- a/armsrc/Standalone/hf_bog.c +++ b/armsrc/Standalone/hf_bog.c @@ -41,7 +41,7 @@ from the client to view the stored quadlets. #define HF_BOG_LOGFILE "hf_bog.log" // This is actually copied from SniffIso14443a -void RAMFUNC SniffAndStore(uint8_t param) { +static void RAMFUNC SniffAndStore(uint8_t param) { iso14443a_setup(FPGA_HF_ISO14443A_SNIFFER); @@ -235,7 +235,7 @@ void ModInfo(void) { DbpString(" HF 14a sniff standalone with ULC/ULEV1/NTAG auth storing in flashmem - aka BogitoRun (Bogito)"); } -void RunMod() { +void RunMod(void) { StandAloneMode(); diff --git a/armsrc/Standalone/hf_colin.c b/armsrc/Standalone/hf_colin.c index ffe2a613f..8e20ae414 100644 --- a/armsrc/Standalone/hf_colin.c +++ b/armsrc/Standalone/hf_colin.c @@ -81,12 +81,12 @@ */ -uint8_t cjuid[10]; -uint32_t cjcuid; -iso14a_card_select_t p_card; -int currline; -int currfline; -int curlline; +static uint8_t cjuid[10]; +static uint32_t cjcuid; +static iso14a_card_select_t p_card; +static int currline; +static int currfline; +static int curlline; // TODO : Implement fast read of KEYS like in RFIdea // also http://ext.delaat.net/rp/2015-2016/p04/report.pdf @@ -104,7 +104,7 @@ static const uint8_t is_hex[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; -static inline uint64_t hex2i(const char *s) { +static uint64_t hex2i(const char *s) { uint64_t val = 0; if (s == NULL || s[0] == 0) return 0; @@ -162,7 +162,7 @@ static void scan_keys(const char *str, int len, uint64_t *user_data) { } } -MFC1KSchema Schemas[MAX_SCHEMAS]; +static MFC1KSchema Schemas[MAX_SCHEMAS]; /*MFC1KSchema Noralsy = { .name = "Noralsy", @@ -196,16 +196,16 @@ MFC1KSchema InfiHexact = {.name = "Infineon/Hexact", 0x8829da9daf76, 0x8829da9daf76, 0x8829da9daf76, 0x8829da9daf76}}; */ -int total_schemas = 0; +static int total_schemas = 0; -void add_schema(MFC1KSchema *p, MFC1KSchema a, int *schemas_counter) { +static void add_schema(MFC1KSchema *p, MFC1KSchema a, int *schemas_counter) { if (*schemas_counter < MAX_SCHEMAS) { p[*schemas_counter] = a; *schemas_counter += 1; } } - -void delete_schema(MFC1KSchema *p, int *schemas_counter, int index) { +/* +static void delete_schema(MFC1KSchema *p, int *schemas_counter, int index) { if (*schemas_counter > 0 && index < *schemas_counter && index > -1) { int last_index = *schemas_counter - 1; for (int i = index; i < last_index; i++) { @@ -214,33 +214,25 @@ void delete_schema(MFC1KSchema *p, int *schemas_counter, int index) { *schemas_counter -= 1; } } - -void cjSetCursFRight() { +*/ +static void cjSetCursFRight(void) { vtsend_cursor_position(NULL, 98, (currfline)); currfline++; } -void cjSetCursRight() { +static void cjSetCursRight(void) { vtsend_cursor_position(NULL, 59, (currline)); currline++; } -void cjSetCursLeft() { +static void cjSetCursLeft(void) { vtsend_cursor_position(NULL, 0, (curlline)); curlline++; } -void cjTabulize() { DbprintfEx(FLAG_RAWPRINT, "\t\t\t"); } +static void cjTabulize(void) { DbprintfEx(FLAG_RAWPRINT, "\t\t\t"); } -/* -void cjPrintKey(uint64_t key, uint8_t *foundKey, uint16_t sectorNo, uint8_t type) { - char tosendkey[13]; - sprintf(tosendkey, "%02x%02x%02x%02x%02x%02x", foundKey[0], foundKey[1], foundKey[2], foundKey[3], foundKey[4], -foundKey[5]); cjSetCursRight(); DbprintfEx(FLAG_NEWLINE, "SEC: %02x | KEY : %s | TYP: %d", sectorNo, tosendkey, type); -} -*/ - -char *ReadSchemasFromSPIFFS(char *filename) { +static char *ReadSchemasFromSPIFFS(char *filename) { SpinOff(0); int changed = rdv40_spiffs_lazy_mount(); @@ -255,7 +247,7 @@ char *ReadSchemasFromSPIFFS(char *filename) { return (char *)mem; } -void add_schemas_from_json_in_spiffs(char *filename) { +static void add_schemas_from_json_in_spiffs(char *filename) { char *jsonfile = ReadSchemasFromSPIFFS((char *)filename); @@ -275,7 +267,7 @@ void add_schemas_from_json_in_spiffs(char *filename) { } } -void ReadLastTagFromFlash() { +static void ReadLastTagFromFlash(void) { SpinOff(0); LED_A_ON(); LED_B_ON(); @@ -292,6 +284,7 @@ void ReadLastTagFromFlash() { // this one will handle filetype (symlink or not) and resolving by itself rdv40_spiffs_read_as_filetype((char *)HFCOLIN_LASTTAG_SYMLINK, (uint8_t *)mem, len, RDV40_SPIFFS_SAFETY_SAFE); + // copy 64blocks (16bytes) starting w block0, to emulator mem. emlSetMem(mem, 0, 64); DbprintfEx(FLAG_NEWLINE, "[OK] Last tag recovered from FLASHMEM set to emulator"); @@ -330,16 +323,22 @@ void WriteTagToFlash(uint32_t uid, size_t size) { return; } -void ModInfo(void) { DbpString(" HF Mifare ultra fast sniff/sim/clone - aka VIGIKPWN (Colin Brigato)"); } +void ModInfo(void) { + DbpString(" HF Mifare ultra fast sniff/sim/clone - aka VIGIKPWN (Colin Brigato)"); +} -void RunMod() { +void RunMod(void) { StandAloneMode(); + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); + Dbprintf(">> HF Mifare ultra fast sniff/sim/clone a.k.a VIGIKPWN Started <<"); + + // turn off all debugging. + DBGLEVEL = DBG_NONE; // add_schema(Schemas, Noralsy, &total_schemas); // add_schema(Schemas, InfiHexact, &total_schemas); // add_schema_from_json_in_spiffs((char *)HFCOLIN_URMETCAPTIVE_JSON); // add_schema(Schemas, UrmetCaptive, &total_schemas); - FpgaDownloadAndGo(FPGA_BITSTREAM_HF); currline = 20; curlline = 20; @@ -386,11 +385,11 @@ void RunMod() { ACCBITS : 796788[00]+VALUE */ -//---------------------------- +// ---------------------------- // Set of keys to be used. // This should cover ~98% of // French VIGIK system @2017 -//---------------------------- +// ---------------------------- const uint64_t mfKeys[] = { 0xffffffffffff, // TRANSPORTS @@ -459,7 +458,6 @@ void RunMod() { bool err = 0; bool trapped = 0; bool allKeysFound = true; - uint32_t size = mfKeysCnt; // banner: @@ -487,7 +485,7 @@ failtag: SpinOff(50); LED_A_ON(); uint8_t ticker = 0; - // while (!BUTTON_PRESS() && !iso14443a_select_card(cjuid, NULL, &cjcuid, true, 0, true)) + while (!iso14443a_select_card(cjuid, &p_card, &cjcuid, true, 0, true)) { WDT_HIT(); @@ -496,7 +494,7 @@ failtag: LED_A_INV(); } - if (BUTTON_HELD(10) > 0) { + if (BUTTON_HELD(10) == BUTTON_HOLD) { WDT_HIT(); DbprintfEx(FLAG_NEWLINE, "\t\t\t[ READING FLASH ]"); ReadLastTagFromFlash(); @@ -505,8 +503,8 @@ failtag: } SpinOff(50); - FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); + vtsend_cursor_position_restore(NULL); DbprintfEx(FLAG_NEWLINE, "\t\t\t%s[ GOT a Tag ! ]%s", _XGREEN_, _XWHITE_); cjSetCursLeft(); @@ -534,7 +532,7 @@ failtag: uint32_t start_time = GetTickCount(); uint32_t delta_time = 0; - //--------------------------------------------------------------------------- + // --------------------------------------------------------------------------- // WE SHOULD FIND A WAY TO GET UID TO AVOID THIS "TESTRUN" // -------------------------------------------------------- // + HERE IS TO BE THOUGHT AS ONLY A KEY SHOULD BE CHECK @@ -544,7 +542,7 @@ failtag: // `-+ THEN FILL EMULATOR WITH B KEEY // `-+ THEN EMULATOR WITH CARD WITH B KEY // `-+ IF IT HAS FAILED OF ANY OF SORT THEN WE ARE MARRON LIKE POMALO. - //---------------------------------------------------------------------------- + // ---------------------------------------------------------------------------- // AN EVEN BETTER IMPLEMENTATION IS TO CHECK EVERY KEY FOR SECTOR 0 KEY A // THEN IF FOUND CHECK THE SAME KEY FOR NEXT SECTOR ONLY KEY A // THEN IF FAIL CHECK EVERY SECTOR A KEY FOR EVERY OTHER KEY BUT NOT THE BLOCK @@ -558,7 +556,7 @@ failtag: // DERIVATION // THEN IF B KEY IS NOT OF THIS SCHEME CHECK EVERY REMAINING B KEYED SECTOR // WITH EVERY REMAINING KEYS, BUT DISCARDING ANY DEFAULT TRANSPORT KEYS. - //----------------------------------------------------------------------------- + // ----------------------------------------------------------------------------- // also we could avoid first UID check for every block // then let's expose this optimal case of well known vigik schemes : @@ -625,7 +623,6 @@ failtag: break; } } - /* etc etc for testing schemes quick schemes */ } } @@ -641,7 +638,7 @@ failtag: return; } - /* Settings keys to emulator */ + // Settings keys to emulator emlClearMem(); uint8_t mblock[16]; for (uint8_t sectorNo = 0; sectorNo < sectorsCnt; sectorNo++) { @@ -655,7 +652,7 @@ failtag: DbprintfEx(FLAG_NEWLINE, "%s>>%s Setting Keys->Emulator MEM...[%sOK%s]", _XYELLOW_, _XWHITE_, _XGREEN_, _XWHITE_); - /* filling TAG to emulator */ + // filling TAG to emulator int filled; cjSetCursLeft(); @@ -666,11 +663,10 @@ failtag: DbprintfEx(FLAG_NEWLINE, "%s>>%s W_FAILURE ! %sTrying fallback B keys....", _XRED_, _XORANGE_, _XWHITE_); - /* no trace, no dbg */ + // no trace, no dbg filled = e_MifareECardLoad(sectorsCnt, 1); if (filled != PM3_SUCCESS) { cjSetCursLeft(); - DbprintfEx(FLAG_NEWLINE, "FATAL:EML_FALLBACKFILL_B"); SpinErr(LED_C, 100, 8); SpinOff(100); @@ -717,10 +713,9 @@ readysim: SpinOff(100); LED_C_ON(); - DBGLEVEL = DBG_NONE; - - //uint16_t flags=0; - /*switch (p_card.uidlen) { + /* + uint16_t flags = 0; + switch (p_card.uidlen) { case 10: flags = FLAG_10B_UID_IN_DATA; break; @@ -733,19 +728,18 @@ readysim: default: flags = FLAG_UID_IN_EMUL; break; - }*/ - + } // Use UID, SAK, ATQA from EMUL, if uid not defined - // if ((flags & (FLAG_4B_UID_IN_DATA | FLAG_7B_UID_IN_DATA | FLAG_10B_UID_IN_DATA)) == 0) { - //flags |= FLAG_UID_IN_EMUL; - //} - //flags |= FLAG_MF_1K; - //if ((flags & (FLAG_4B_UID_IN_DATA | FLAG_7B_UID_IN_DATA | FLAG_10B_UID_IN_DATA)) == 0) { - // flags |= FLAG_UID_IN_EMUL; - //} - //flags = 0x10; - uint16_t flags = 0; - flags = 16; + if ((flags & (FLAG_4B_UID_IN_DATA | FLAG_7B_UID_IN_DATA | FLAG_10B_UID_IN_DATA)) == 0) { + flags |= FLAG_UID_IN_EMUL; + } + flags |= FLAG_MF_1K; + if ((flags & (FLAG_4B_UID_IN_DATA | FLAG_7B_UID_IN_DATA | FLAG_10B_UID_IN_DATA)) == 0) { + flags |= FLAG_UID_IN_EMUL; + } + flags = 0x10; + */ + uint16_t flags = FLAG_UID_IN_EMUL; DbprintfEx(FLAG_NEWLINE, "\n\n\n\n\n\n\n\nn\n\nn\n\n\nflags: %d (0x%02x)", flags, flags); cjSetCursLeft(); SpinOff(1000); @@ -789,8 +783,6 @@ readysim: * - tracing is falsed */ int e_MifareECardLoad(uint32_t numofsectors, uint8_t keytype) { - DBGLEVEL = DBG_NONE; - uint8_t numSectors = numofsectors; uint8_t keyType = keytype; @@ -802,7 +794,6 @@ int e_MifareECardLoad(uint32_t numofsectors, uint8_t keytype) { uint8_t dataoutbuf2[16]; iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); - clear_trace(); set_tracing(false); @@ -810,24 +801,17 @@ int e_MifareECardLoad(uint32_t numofsectors, uint8_t keytype) { if (!iso14443a_select_card(cjuid, &p_card, &cjcuid, true, 0, true)) { isOK = false; - if (DBGLEVEL >= 1) - DbprintfEx(FLAG_RAWPRINT, "Can't select card"); } for (uint8_t s = 0; isOK && s < numSectors; s++) { uint64_t ui64Key = emlGetKey(s, keyType); if (s == 0) { if (isOK && mifare_classic_auth(pcs, cjcuid, FirstBlockOfSector(s), keyType, ui64Key, AUTH_FIRST)) { - - if (DBGLEVEL >= 1) - DbprintfEx(FLAG_NEWLINE, "Sector[%2d]. Auth error", s); break; } } else { if (isOK && mifare_classic_auth(pcs, cjcuid, FirstBlockOfSector(s), keyType, ui64Key, AUTH_NESTED)) { isOK = false; - if (DBGLEVEL >= 1) - DbprintfEx(FLAG_NEWLINE, "Sector[%2d]. Auth nested error", s); break; } } @@ -835,8 +819,6 @@ int e_MifareECardLoad(uint32_t numofsectors, uint8_t keytype) { for (uint8_t blockNo = 0; isOK && blockNo < NumBlocksPerSector(s); blockNo++) { if (isOK && mifare_classic_readblock(pcs, cjcuid, FirstBlockOfSector(s) + blockNo, dataoutbuf)) { isOK = false; - if (DBGLEVEL >= 1) - DbprintfEx(FLAG_NEWLINE, "Error reading sector %2d block %2d", s, blockNo); break; }; if (isOK) { @@ -852,23 +834,18 @@ int e_MifareECardLoad(uint32_t numofsectors, uint8_t keytype) { } } - if (mifare_classic_halt(pcs, cjcuid)) { - if (DBGLEVEL >= 1) - DbprintfEx(FLAG_NEWLINE, "Halt error"); - }; + int res = mifare_classic_halt(pcs, cjcuid); + (void)res; crypto1_deinit(pcs); - FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - return (isOK) ? PM3_SUCCESS : PM3_EUNDEF; } /* the chk function is a piwi'ed(tm) check that will try all keys for a particular sector. also no tracing no dbg */ -int cjat91_saMifareChkKeys(uint8_t blockNo, uint8_t keyType, bool clearTrace, uint8_t keyCount, uint8_t *datain, - uint64_t *key) { - DBGLEVEL = DBG_NONE; +int cjat91_saMifareChkKeys(uint8_t blockNo, uint8_t keyType, bool clearTrace, + uint8_t keyCount, uint8_t *datain, uint64_t *key) { iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); set_tracing(false); @@ -876,14 +853,16 @@ int cjat91_saMifareChkKeys(uint8_t blockNo, uint8_t keyType, bool clearTrace, ui struct Crypto1State *pcs; pcs = &mpcs; - for (int i = 0; i < keyCount; ++i) { + int retval = -1; + + for (uint8_t i = 0; i < keyCount; i++) { /* no need for anticollision. just verify tag is still here */ // if (!iso14443a_fast_select_card(cjuid, 0)) { if (!iso14443a_select_card(cjuid, &p_card, &cjcuid, true, 0, true)) { cjSetCursLeft(); DbprintfEx(FLAG_NEWLINE, "%sFATAL%s : E_MF_LOSTTAG", _XRED_, _XWHITE_); - return -1; + break; } uint64_t ui64Key = bytes_to_num(datain + i * 6, 6); @@ -894,15 +873,13 @@ int cjat91_saMifareChkKeys(uint8_t blockNo, uint8_t keyType, bool clearTrace, ui SpinDelayUs(AUTHENTICATION_TIMEOUT); continue; } - crypto1_deinit(pcs); - FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); *key = ui64Key; - return i; + retval = i; + break; } crypto1_deinit(pcs); FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - - return -1; + return retval; } void saMifareMakeTag(void) { @@ -920,7 +897,6 @@ void saMifareMakeTag(void) { int flags = 0; for (int blockNum = 0; blockNum < 16 * 4; blockNum++) { uint8_t mblock[16]; - // cnt = 0; emlGetMem(mblock, blockNum, 1); // switch on field and send magic sequence if (blockNum == 0) @@ -935,21 +911,15 @@ void saMifareMakeTag(void) { flags = 0x04 + 0x10; if (saMifareCSetBlock(0, flags & 0xFE, blockNum, mblock)) { - //&& cnt <= retry) { - // cnt++; cjSetCursFRight(); if (currfline > 53) { currfline = 54; } DbprintfEx(FLAG_NEWLINE, "Block :%02x %sOK%s", blockNum, _XGREEN_, _XWHITE_); - // DbprintfEx(FLAG_RAWPRINT,"FATAL:E_MF_CHINESECOOK_NORICE"); - // cfail=1; - // return; continue; } else { cjSetCursLeft(); cjSetCursLeft(); - DbprintfEx(FLAG_NEWLINE, "`--> %sFAIL%s : CHN_FAIL_BLK_%02x_NOK", _XRED_, _XWHITE_, blockNum); cjSetCursFRight(); DbprintfEx(FLAG_NEWLINE, "%s>>>>%s STOP AT %02x", _XRED_, _XWHITE_, blockNum); @@ -957,14 +927,9 @@ void saMifareMakeTag(void) { break; } cjSetCursFRight(); - DbprintfEx(FLAG_NEWLINE, "%s>>>>>>>> END <<<<<<<<%s", _XYELLOW_, _XWHITE_); - // break; - /*if (cfail == 1) { - DbprintfEx(FLAG_RAWPRINT,"FATAL: E_MF_HARA_KIRI_\r\n"); - break; - } */ } + if (cfail == 0) { SpinUp(50); SpinUp(50); diff --git a/armsrc/Standalone/hf_iceclass.c b/armsrc/Standalone/hf_iceclass.c new file mode 100644 index 000000000..82c48b316 --- /dev/null +++ b/armsrc/Standalone/hf_iceclass.c @@ -0,0 +1,512 @@ +//----------------------------------------------------------------------------- +// Christian Herrmann, 2020 +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// main code for hf_iceclass by Iceman +//----------------------------------------------------------------------------- +#include "standalone.h" // standalone definitions +#include "proxmark3_arm.h" +#include "appmain.h" +#include "BigBuf.h" +#include "fpgaloader.h" +#include "util.h" +#include "ticks.h" +#include "dbprint.h" +#include "spiffs.h" +#include "iclass.h" +#include "iso15693.h" +#include "optimized_cipher.h" +#include "pm3_cmd.h" +#include "protocols.h" + + +#define ICE_STATE_NONE 0 +#define ICE_STATE_FULLSIM 1 +#define ICE_STATE_ATTACK 2 +#define ICE_STATE_READER 3 +#define ICE_STATE_CONFIGCARD 4 + +// ==================================================== +// Select which standalone function to be active. +// 4 possiblities. Uncomment the one you wanna use. + +#define ICE_USE ICE_STATE_FULLSIM +//#define ICE_USE ICE_STATE_ATTACK +//#define ICE_USE ICE_STATE_READER +//#define ICE_USE ICE_STATE_CONFIGCARD + +// ==================================================== + + +#define NUM_CSNS 9 +#define MAC_RESPONSES_SIZE (16 * NUM_CSNS) +#define HF_ICLASS_FULLSIM_ORIG_BIN "iceclass-orig.bin" +#define HF_ICLASS_FULLSIM_MOD "iceclass-modified" +#define HF_ICLASS_FULLSIM_MOD_BIN HF_ICLASS_FULLSIM_MOD".bin" +#define HF_ICLASS_FULLSIM_MOD_EML HF_ICLASS_FULLSIM_MOD".eml" +#define HF_ICLASS_ATTACK_BIN "iclass_mac_attack" + +#define HF_ICLASS_CC_A "iceclass_cc_a.bin" +#define HF_ICLASS_CC_B "iceclass_cc_b.bin" +char *cc_files[] = { HF_ICLASS_CC_A, HF_ICLASS_CC_B }; + + + +// times in ssp_clk_cycles @ 3,3625MHz when acting as reader +#ifndef DELAY_ICLASS_VICC_TO_VCD_READER +#define DELAY_ICLASS_VICC_TO_VCD_READER DELAY_ISO15693_VICC_TO_VCD_READER +#endif + +#ifndef ICLASS_16KS_SIZE +#define ICLASS_16KS_SIZE 0x100 * 8 +#endif + +// iclass card descriptors +char *card_types[] = { + "PicoPass 16K / 16", // 000 + "PicoPass 32K with current book 16K / 16", // 001 + "Unknown Card Type!", // 010 + "Unknown Card Type!", // 011 + "PicoPass 2K", // 100 + "Unknown Card Type!", // 101 + "PicoPass 16K / 2", // 110 + "PicoPass 32K with current book 16K / 2", // 111 +}; + +uint8_t card_app2_limit[] = { + 0xff, + 0xff, + 0xff, + 0xff, + 0x1f, + 0xff, + 0xff, + 0xff, +}; + +static uint8_t aa2_key[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; +static uint8_t legacy_aa1_key[] = {0xAE, 0xA6, 0x84, 0xA6, 0xDA, 0xB2, 0x32, 0x78}; + +static bool have_aa2(void) { + return memcmp(aa2_key, "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF", 8); +} + +static uint8_t get_pagemap(const picopass_hdr *hdr) { + return (hdr->conf.fuses & (FUSE_CRYPT0 | FUSE_CRYPT1)) >> 3; +} + +static uint8_t csns[8 * NUM_CSNS] = { + 0x01, 0x0A, 0x0F, 0xFF, 0xF7, 0xFF, 0x12, 0xE0, + 0x0C, 0x06, 0x0C, 0xFE, 0xF7, 0xFF, 0x12, 0xE0, + 0x10, 0x97, 0x83, 0x7B, 0xF7, 0xFF, 0x12, 0xE0, + 0x13, 0x97, 0x82, 0x7A, 0xF7, 0xFF, 0x12, 0xE0, + 0x07, 0x0E, 0x0D, 0xF9, 0xF7, 0xFF, 0x12, 0xE0, + 0x14, 0x96, 0x84, 0x76, 0xF7, 0xFF, 0x12, 0xE0, + 0x17, 0x96, 0x85, 0x71, 0xF7, 0xFF, 0x12, 0xE0, + 0xCE, 0xC5, 0x0F, 0x77, 0xF7, 0xFF, 0x12, 0xE0, + 0xD2, 0x5A, 0x82, 0xF8, 0xF7, 0xFF, 0x12, 0xE0 +}; + +static void download_instructions(uint8_t t) { + DbpString(""); + switch (t) { + case ICE_STATE_FULLSIM: { + DbpString("The emulator memory was saved to SPIFFS"); + DbpString("1. " _YELLOW_("mem spiffs dump o " HF_ICLASS_FULLSIM_MOD_BIN " f " HF_ICLASS_FULLSIM_MOD" e")); + DbpString("2. " _YELLOW_("hf iclass view f " HF_ICLASS_FULLSIM_MOD_BIN)); + break; + } + case ICE_STATE_ATTACK: { + DbpString("The collected data was saved to SPIFFS. The file names below may differ"); + DbpString("1. " _YELLOW_("mem spiffs tree")); + DbpString("2. " _YELLOW_("mem spiffs dump o " HF_ICLASS_ATTACK_BIN " f " HF_ICLASS_ATTACK_BIN)); + DbpString("3. " _YELLOW_("hf iclass loclass f " HF_ICLASS_ATTACK_BIN)); + break; + } + case ICE_STATE_READER: { + DbpString("The found tags was saved to SPIFFS"); + DbpString("1. " _YELLOW_("mem spiffs tree")); + DbpString("2. " _YELLOW_("mem spiffs dump h")); + break; + } + } +} + +// Save to flash if file doesn't exist. +// Write over file if size of flash file is less than new datalen +static void save_to_flash(uint8_t *data, uint16_t datalen) { + + rdv40_spiffs_lazy_mount(); + + char fn[SPIFFS_OBJ_NAME_LEN]; + sprintf(fn, "iclass-%02X%02X%02X%02X%02X%02X%02X%02X.bin", + data[0], data[1], data[2], data[3], + data[4], data[5], data[6], data[7] + ); + + int res; + if (exists_in_spiffs(fn) == false) { + res = rdv40_spiffs_write(fn, data, datalen, RDV40_SPIFFS_SAFETY_SAFE); + if (res == SPIFFS_OK) { + Dbprintf("saved to " _GREEN_("%s"), fn); + } + } else { + + // if already exist, see if saved file is smaller.. + uint32_t fsize = 0; + res = rdv40_spiffs_stat(fn, &fsize, RDV40_SPIFFS_SAFETY_SAFE); + if (res == SPIFFS_OK) { + + if (fsize < datalen) { + res = rdv40_spiffs_write(fn, data, datalen, RDV40_SPIFFS_SAFETY_SAFE); + if (res == SPIFFS_OK) { + Dbprintf("wrote over " _GREEN_("%s"), fn); + } + } + } + } + + rdv40_spiffs_lazy_unmount(); +} + +static int fullsim_mode(void) { + + rdv40_spiffs_lazy_mount(); + + SpinOff(0); + uint8_t *emul = BigBuf_get_EM_addr(); + uint32_t fsize = size_in_spiffs(HF_ICLASS_FULLSIM_ORIG_BIN); + int res = rdv40_spiffs_read_as_filetype(HF_ICLASS_FULLSIM_ORIG_BIN, emul, fsize, RDV40_SPIFFS_SAFETY_SAFE); + rdv40_spiffs_lazy_unmount(); + if (res == SPIFFS_OK) { + Dbprintf("loaded " _GREEN_(HF_ICLASS_FULLSIM_ORIG_BIN) " (%u bytes)", fsize); + } + + iclass_simulate(ICLASS_SIM_MODE_FULL, 0, false, NULL, NULL, NULL); + + LED_B_ON(); + rdv40_spiffs_lazy_mount(); + res = rdv40_spiffs_write(HF_ICLASS_FULLSIM_MOD_BIN, emul, fsize, RDV40_SPIFFS_SAFETY_SAFE); + rdv40_spiffs_lazy_unmount(); + LED_B_OFF(); + if (res == SPIFFS_OK) { + Dbprintf("wrote emulator memory to " _GREEN_(HF_ICLASS_FULLSIM_MOD_BIN)); + } else { + Dbprintf(_RED_("error") " writing "HF_ICLASS_FULLSIM_MOD_BIN" to flash ( %d )", res); + } + + DbpString("-=[ exiting " _CYAN_("`full simulation`") " mode ]=-"); + return PM3_SUCCESS; +} + +static int reader_attack_mode(void) { + + BigBuf_free(); + uint16_t mac_response_len = 0; + uint8_t *mac_responses = BigBuf_malloc(MAC_RESPONSES_SIZE); + + iclass_simulate(ICLASS_SIM_MODE_READER_ATTACK, NUM_CSNS, false, csns, mac_responses, &mac_response_len); + + if (mac_response_len > 0) { + + bool success = (mac_response_len == MAC_RESPONSES_SIZE); + uint8_t num_mac = (mac_response_len >> 4); + Dbprintf("%u out of %d MAC obtained [%s]", num_mac, NUM_CSNS, (success) ? _GREEN_("ok") : _RED_("fail")); + + size_t dumplen = NUM_CSNS * 24; + + uint8_t *dump = BigBuf_malloc(dumplen); + if (dump == false) { + Dbprintf("failed to allocate memory"); + return PM3_EMALLOC; + } + + // need zeroes for the EPURSE + memset(dump, 0, dumplen); + + for (uint8_t i = 0 ; i < NUM_CSNS ; i++) { + //copy CSN + memcpy(dump + (i * 24), csns + (i * 8), 8); + //copy epurse + memcpy(dump + (i * 24) + 8, mac_responses + (i * 16), 8); + // NR_MAC (eight bytes from the response) ( 8b csn + 8b epurse == 16) + memcpy(dump + (i * 24) + 16, mac_responses + (i * 16) + 8, 8); + } + + LED_B_ON(); + rdv40_spiffs_lazy_mount(); + + char fn[32]; + uint16_t p_namelen = strlen(HF_ICLASS_ATTACK_BIN); + uint16_t num = 1; + sprintf(fn, "%.*s%s", p_namelen, HF_ICLASS_ATTACK_BIN, ".bin"); + + while (exists_in_spiffs(fn)) { + sprintf(fn, "%.*s-%u%s", p_namelen, HF_ICLASS_ATTACK_BIN, num, ".bin"); + num++; + } + int res = rdv40_spiffs_write(fn, dump, dumplen, RDV40_SPIFFS_SAFETY_SAFE); + rdv40_spiffs_lazy_unmount(); + LED_B_OFF(); + if (res == SPIFFS_OK) { + Dbprintf("saved to " _GREEN_("%s"), fn); + } else { + Dbprintf(_RED_("error") " writing %s to flash ( %d )", fn, res); + } + } + BigBuf_free(); + DbpString("-=[ exiting " _CYAN_("`reader attack`") " mode ]=-"); + return PM3_SUCCESS; +} + +static int reader_dump_mode(void) { + + DbpString("this mode has no tracelog"); + if (have_aa2()) + DbpString("dumping of " _YELLOW_("AA2 enabled")); + + for (;;) { + + BigBuf_free(); + + uint8_t *card_data = BigBuf_malloc(ICLASS_16KS_SIZE); + memset(card_data, 0xFF, ICLASS_16KS_SIZE); + + if (BUTTON_PRESS()) { + DbpString("button pressed"); + break; + } + + // setup authenticate AA1 + iclass_auth_req_t auth = { + .use_raw = false, + .use_elite = false, + .use_credit_key = false, + .do_auth = true, + .send_reply = false, + }; + memcpy(auth.key, legacy_aa1_key, sizeof(auth.key)); + + Iso15693InitReader(); + set_tracing(false); + + // select tag. + uint32_t eof_time = 0; + bool res = select_iclass_tag(card_data, auth.use_credit_key, &eof_time); + if (res == false) { + switch_off(); + continue; + } + + picopass_hdr *hdr = (picopass_hdr *)card_data; + // sanity check of CSN. + if (hdr->csn[7] != 0xE0 && hdr->csn[6] != 0x12) { + switch_off(); + continue; + } + + uint32_t start_time = eof_time + DELAY_ICLASS_VICC_TO_VCD_READER; + + // get 3 config bits + uint8_t type = (hdr->conf.chip_config & 0x10) >> 2; + type |= (hdr->conf.mem_config & 0x80) >> 6; + type |= (hdr->conf.mem_config & 0x20) >> 5; + + Dbprintf(_GREEN_("%s") ", dumping...", card_types[type]); + + uint8_t pagemap = get_pagemap(hdr); + uint8_t app1_limit, app2_limit, start_block; + + // tags configured for NON SECURE PAGE, acts different + if (pagemap == PICOPASS_NON_SECURE_PAGEMODE) { + app1_limit = card_app2_limit[type]; + app2_limit = 0; + start_block = 3; + } else { + + app1_limit = hdr->conf.app_limit; + app2_limit = card_app2_limit[type]; + start_block = 5; + + res = authenticate_iclass_tag(&auth, hdr, &start_time, &eof_time, NULL); + if (res == false) { + switch_off(); + Dbprintf(_RED_("failed AA1 auth") ", skipping "); + continue; + } + + start_time = eof_time + DELAY_ICLASS_VICC_TO_VCD_READER; + } + + uint16_t dumped = 0; + + // main read loop + for (uint16_t i = start_block; i <= app1_limit; i++) { + if (iclass_read_block(i, card_data + (8 * i), &start_time, &eof_time)) { + dumped++; + } + } + + if (pagemap != PICOPASS_NON_SECURE_PAGEMODE && have_aa2()) { + + // authenticate AA2 + auth.use_raw = false; + auth.use_credit_key = true; + memcpy(auth.key, aa2_key, sizeof(auth.key)); + + res = select_iclass_tag(card_data, auth.use_credit_key, &eof_time); + if (res) { + + // sanity check of CSN. + if (hdr->csn[7] != 0xE0 && hdr->csn[6] != 0x12) { + switch_off(); + continue; + } + + res = authenticate_iclass_tag(&auth, hdr, &start_time, &eof_time, NULL); + if (res) { + start_time = eof_time + DELAY_ICLASS_VICC_TO_VCD_READER; + + for (uint16_t i = app1_limit + 1; i <= app2_limit; i++) { + if (iclass_read_block(i, card_data + (8 * i), &start_time, &eof_time)) { + dumped++; + } + } + } else { + DbpString(_RED_("failed AA2 auth")); + } + } else { + DbpString(_RED_("failed selecting AA2")); + + // sanity check of CSN. + if (hdr->csn[7] != 0xE0 && hdr->csn[6] != 0x12) { + switch_off(); + continue; + } + } + } + switch_off(); + save_to_flash(card_data, (start_block + dumped) * 8); + Dbprintf("%u bytes saved", (start_block + dumped) * 8); + } + DbpString("-=[ exiting " _CYAN_("`read & dump`") " mode ]=-"); + return PM3_SUCCESS; +} + +static int config_sim_mode(void) { + + uint8_t *emul = BigBuf_get_EM_addr(); + + for (uint8_t i = 0; i < 2; i++) { + SpinOff(0); + rdv40_spiffs_lazy_mount(); + uint32_t fsize = size_in_spiffs(cc_files[i]); + int res = rdv40_spiffs_read_as_filetype(cc_files[i], emul, fsize, RDV40_SPIFFS_SAFETY_SAFE); + rdv40_spiffs_lazy_unmount(); + + if (res == SPIFFS_OK) { + Dbprintf("loaded " _GREEN_("%s") " (%u bytes) to emulator memory", cc_files[i], fsize); + iclass_simulate(ICLASS_SIM_MODE_FULL, 0, false, NULL, NULL, NULL); + } + } + + DbpString("-=[ exiting " _CYAN_("`glitch & config`") " mode ]=-"); + return PM3_SUCCESS; +} + +void ModInfo(void) { + DbpString(" HF iCLASS mode - aka iceCLASS (iceman)"); +} + +void RunMod(void) { + + uint8_t mode = ICE_USE; + uint8_t *bb = BigBuf_get_EM_addr(); + if (bb[0] > 0 && bb[0] < 5) { + mode = bb[0]; + } + + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); + BigBuf_Clear_ext(false); + + StandAloneMode(); + Dbprintf(_YELLOW_("HF iCLASS mode a.k.a iceCLASS started")); + + + for (;;) { + + WDT_HIT(); + + if (mode == ICE_STATE_NONE) break; + if (data_available()) break; + + int res; + switch (mode) { + + case ICE_STATE_FULLSIM: { + DbpString("-=[ enter " _CYAN_("`full simulation`") " mode ]=-"); + + // Look for iCLASS dump file + rdv40_spiffs_lazy_mount(); + if (exists_in_spiffs(HF_ICLASS_FULLSIM_ORIG_BIN) == false) { + Dbprintf(_RED_("error") " " _YELLOW_(HF_ICLASS_FULLSIM_ORIG_BIN) " file missing"); + mode = ICE_STATE_NONE; + } + rdv40_spiffs_lazy_unmount(); + + if (mode == ICE_STATE_FULLSIM) { + res = fullsim_mode(); + if (res == PM3_SUCCESS) { + download_instructions(mode); + } + } + // the button press to exit sim, is captured in main loop here + mode = ICE_STATE_NONE; + break; + } + case ICE_STATE_ATTACK: { + DbpString("-=[ enter " _CYAN_("`reader attack`") " mode ]=-"); + res = reader_attack_mode(); + if (res == PM3_SUCCESS) + download_instructions(mode); + + mode = ICE_STATE_NONE; + break; + } + case ICE_STATE_READER: { + DbpString("-=[ enter " _CYAN_("`read & dump`") " mode, continuous scanning ]=-"); + res = reader_dump_mode(); + if (res == PM3_SUCCESS) + download_instructions(mode); + + mode = ICE_STATE_NONE; + break; + } + case ICE_STATE_CONFIGCARD: { + DbpString("-=[ enter " _CYAN_("`glitch & config`") " mode ]=-"); + + // Look for config cards + rdv40_spiffs_lazy_mount(); + for (uint8_t i = 0; i < 2; i++) { + if (exists_in_spiffs(cc_files[i]) == false) { + Dbprintf(_RED_("error") ", " _YELLOW_("%s") " file missing", cc_files[i]); + mode = ICE_STATE_NONE; + } + } + rdv40_spiffs_lazy_unmount(); + + if (mode == ICE_STATE_CONFIGCARD) + config_sim_mode(); + + mode = ICE_STATE_NONE; + break; + } + } + } + + switch_off(); + Dbprintf("-=[ exit ]=-"); +} diff --git a/armsrc/Standalone/hf_legic.c b/armsrc/Standalone/hf_legic.c index d72c8148e..73590268e 100644 --- a/armsrc/Standalone/hf_legic.c +++ b/armsrc/Standalone/hf_legic.c @@ -44,7 +44,8 @@ * */ -void DownloadLogInstructions() { +#ifdef WITH_FLASH +static void DownloadLogInstructions(void) { Dbprintf(""); Dbprintf("[=] List all dumps from flash:"); Dbprintf("[=] " _YELLOW_("-") " mem spiffs tree"); @@ -52,8 +53,9 @@ void DownloadLogInstructions() { Dbprintf("[=] To save a dump file from flash to client:"); Dbprintf("[=] " _YELLOW_("-") " mem spiffs dump o hf-legic-UID-dump.bin f hf-legic-UID-dump.bin"); } +#endif -void save_dump_to_file(legic_card_select_t *p_card) { +static void save_dump_to_file(legic_card_select_t *p_card) { #ifdef WITH_FLASH @@ -99,7 +101,7 @@ void ModInfo(void) { // A, B, C = Reading // A, D = Simulating -void RunMod() { +void RunMod(void) { StandAloneMode(); FpgaDownloadAndGo(FPGA_BITSTREAM_HF); Dbprintf("[=] >> HF Legic Prime Read/Simulate Started <<"); diff --git a/armsrc/Standalone/hf_mattyrun.c b/armsrc/Standalone/hf_mattyrun.c index 60619e657..c0d603fbd 100644 --- a/armsrc/Standalone/hf_mattyrun.c +++ b/armsrc/Standalone/hf_mattyrun.c @@ -49,9 +49,16 @@ on a blank card. #include "mifaresim.h" // mifare1ksim #include "mifareutil.h" -uint8_t uid[10]; -uint32_t cuid; -iso14a_card_select_t p_card; +static uint8_t uid[10]; +static uint32_t cuid; +static iso14a_card_select_t p_card; + +// Pseudo-configuration block. +static bool printKeys = false; // Prints keys +static bool transferToEml = true; // Transfer keys to emulator memory +static bool ecfill = true; // Fill emulator memory with cards content. +static bool simulation = true; // Simulates an exact copy of the target tag +static bool fillFromEmulator = false; // Dump emulator memory. //----------------------------------------------------------------------------- // Matt's StandAlone mod. @@ -169,7 +176,8 @@ static int saMifareCSetBlock(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_ /* the chk function is a piwi’ed(tm) check that will try all keys for a particular sector. also no tracing no dbg */ -static int saMifareChkKeys(uint8_t blockNo, uint8_t keyType, bool clearTrace, uint8_t keyCount, uint8_t *datain, uint64_t *key) { +static int saMifareChkKeys(uint8_t blockNo, uint8_t keyType, bool clearTrace, + uint8_t keyCount, uint8_t *datain, uint64_t *key) { DBGLEVEL = DBG_NONE; iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); set_tracing(false); @@ -178,13 +186,15 @@ static int saMifareChkKeys(uint8_t blockNo, uint8_t keyType, bool clearTrace, ui struct Crypto1State *pcs; pcs = &mpcs; - for (int i = 0; i < keyCount; ++i) { + int retval = -1; + + for (uint8_t i = 0; i < keyCount; i++) { /* no need for anticollision. just verify tag is still here */ // if (!iso14443a_fast_select_card(cjuid, 0)) { if (!iso14443a_select_card(uid, &p_card, &cuid, true, 0, true)) { DbprintfEx(FLAG_NEWLINE, "FATAL : E_MF_LOSTTAG"); - return -1; + break; } uint64_t ui64Key = bytes_to_num(datain + i * 6, 6); @@ -195,66 +205,120 @@ static int saMifareChkKeys(uint8_t blockNo, uint8_t keyType, bool clearTrace, ui SpinDelayUs(AUTHENTICATION_TIMEOUT); continue; } - crypto1_deinit(pcs); - FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); *key = ui64Key; - return i; + retval = i; + break; } crypto1_deinit(pcs); FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - - return -1; + return retval; } +/* Abusive microgain on original MifareECardLoad : + * - *datain used as error return + * - tracing is falsed + */ +static int saMifareECardLoad(uint32_t numofsectors, uint8_t keytype) { + DBGLEVEL = DBG_NONE; + + uint8_t numSectors = numofsectors; + uint8_t keyType = keytype; + + struct Crypto1State mpcs = {0, 0}; + struct Crypto1State *pcs; + pcs = &mpcs; + + uint8_t dataoutbuf[16]; + uint8_t dataoutbuf2[16]; + + iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); + clear_trace(); + set_tracing(false); + + int retval = PM3_SUCCESS; + + if (!iso14443a_select_card(uid, &p_card, &cuid, true, 0, true)) { + retval = PM3_ESOFT; + DbprintfEx(FLAG_RAWPRINT, "Can't select card"); + goto out; + } + + for (uint8_t s = 0; s < numSectors; s++) { + uint64_t ui64Key = emlGetKey(s, keyType); + if (s == 0) { + if (mifare_classic_auth(pcs, cuid, FirstBlockOfSector(s), keyType, ui64Key, AUTH_FIRST)) { + retval = PM3_ESOFT; + break; + } + } else { + if (mifare_classic_auth(pcs, cuid, FirstBlockOfSector(s), keyType, ui64Key, AUTH_NESTED)) { + retval = PM3_ESOFT; + break; + } + } + + // failure to read one block, skips to next sector. + for (uint8_t blockNo = 0; blockNo < NumBlocksPerSector(s); blockNo++) { + if (mifare_classic_readblock(pcs, cuid, FirstBlockOfSector(s) + blockNo, dataoutbuf)) { + retval = PM3_ESOFT; + break; + }; + + if (blockNo < NumBlocksPerSector(s) - 1) { + emlSetMem(dataoutbuf, FirstBlockOfSector(s) + blockNo, 1); + } else { + // sector trailer, keep the keys, set only the AC + emlGetMem(dataoutbuf2, FirstBlockOfSector(s) + blockNo, 1); + memcpy(&dataoutbuf2[6], &dataoutbuf[6], 4); + emlSetMem(dataoutbuf2, FirstBlockOfSector(s) + blockNo, 1); + } + } + } + + int res = mifare_classic_halt(pcs, cuid); + (void)res; + +out: + crypto1_deinit(pcs); + FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); + return retval; +} + + void ModInfo(void) { DbpString(" HF Mifare sniff/clone - aka MattyRun (Matías A. Ré Medina)"); } -void RunMod() { +/* + It will check if the keys from the attacked tag are a subset from + the hardcoded set of keys inside of the ARM. If this is the case + then it will load the keys into the emulator memory and also the + content of the victim tag, to finally simulate it. + + Alternatively, it can be dumped into a blank card. + + This source code has been tested only in Mifare 1k. + + If you're using the proxmark connected to a device that has an OS, and you're not using the proxmark3 client to see the debug + messages, you MUST uncomment usb_disable(). +*/ +void RunMod(void) { StandAloneMode(); - Dbprintf(">> Matty mifare chk/dump/sim a.k.a MattyRun Started <<"); FpgaDownloadAndGo(FPGA_BITSTREAM_HF); - - /* - It will check if the keys from the attacked tag are a subset from - the hardcoded set of keys inside of the ARM. If this is the case - then it will load the keys into the emulator memory and also the - content of the victim tag, to finally simulate it. - - Alternatively, it can be dumped into a blank card. - - This source code has been tested only in Mifare 1k. - - If you're using the proxmark connected to a device that has an OS, and you're not using the proxmark3 client to see the debug - messages, you MUST uncomment usb_disable(). - */ + Dbprintf(">> Matty mifare chk/dump/sim a.k.a MattyRun Started <<"); // Comment this line below if you want to see debug messages. // usb_disable(); - /* - Pseudo-configuration block. - */ - bool printKeys = false; // Prints keys - bool transferToEml = true; // Transfer keys to emulator memory - bool ecfill = true; // Fill emulator memory with cards content. - bool simulation = true; // Simulates an exact copy of the target tag - bool fillFromEmulator = false; // Dump emulator memory. - - uint16_t mifare_size = 1024; // Mifare 1k (only 1k supported for now) uint8_t sectorSize = 64; // 1k's sector size is 64 bytes. uint8_t blockNo = 3; // Security block is number 3 for each sector. uint8_t sectorsCnt = (mifare_size / sectorSize); - uint8_t keyType = 2; // Keytype buffer uint64_t key64; // Defines current key uint8_t *keyBlock; // Where the keys will be held in memory. - uint8_t stKeyBlock = 20; // Set the quantity of keys in the block. bool keyFound = false; - /* - Set of keys to be used. - */ + // Set of keys to be used. uint64_t mfKeys[] = { 0xffffffffffff, // Default key 0x000000000000, // Blank key @@ -269,22 +333,73 @@ void RunMod() { 0xa0478cc39091, 0x533cb6c723f6, 0x8fd0a4f256e9, + 0x484558414354, // INFINEONON A / 0F SEC B / INTRATONE / HEXACT... + 0x414c41524f4e, // ALARON NORALSY + 0x424c41524f4e, // BLARON NORALSY + 0x4a6352684677, // COMELIT A General Key / 08 [2] 004 + 0x536653644c65, // COMELIT B General Key / 08 [2] 004 + 0x8829da9daf76, // URMET CAPTIV IF A => ALL A/B / BTICINO + 0x314B49474956, // "1KIGIV" VIGIK'S SERVICE BADGE A KEY + 0x021209197591, // BTCINO UNDETERMINED SPREAKD 0x01->0x13 key + 0x010203040506, // VIGIK's B Derivative + 0xa22ae129c013, // INFINEON B 00 + 0x49fae4e3849f, // INFINEON B 01 + 0x38fcf33072e0, // INFINEON B 02 + 0x8ad5517b4b18, // INFINEON B 03 + 0x509359f131b1, // INFINEON B 04 + 0x6c78928e1317, // INFINEON B 05 + 0xaa0720018738, // INFINEON B 06 + 0xa6cac2886412, // INFINEON B 07 + 0x62d0c424ed8e, // INFINEON B 08 + 0xe64a986a5d94, // INFINEON B 09 + 0x8fa1d601d0a2, // INFINEON B 0A + 0x89347350bd36, // INFINEON B 0B + 0x66d2b7dc39ef, // INFINEON B 0C + 0x6bc1e1ae547d, // INFINEON B 0D + 0x22729a9bd40f, // INFINEON B 0E + 0xd2ece8b9395e, // lib / Nat Bieb + 0x1494E81663D7, // # NSCP default key + 0x569369c5a0e5, // # kiev + 0x632193be1c3c, // # kiev + 0x644672bd4afe, // # kiev + 0x8fe644038790, // # kiev + 0x9de89e070277, // # kiev + 0xb5ff67cba951, // # kiev / ov-chipkaart + 0xeff603e1efe9, // # kiev + 0xf14ee7cae863, // # kiev + 0xfc00018778f7, // # Västtrafiken KeyA, RKF ÖstgötaTrafiken KeyA + 0x0297927c0f77, // # Västtrafiken KeyA + 0x54726176656c, // # Västtrafiken KeyA + 0x00000ffe2488, // # Västtrafiken KeyB + 0x776974687573, // # Västtrafiken KeyB + 0xee0042f88840, // # Västtrafiken KeyB + 0x26940b21ff5d, // # RKF SLKeyA + 0xa64598a77478, // # RKF SLKeyA + 0x5c598c9c58b5, // # RKF SLKeyB + 0xe4d2770a89be, // # RKF SLKeyB + 0x722bfcc5375f, // # RKF RejskortDanmark KeyA + 0xf1d83f964314, // # RKF RejskortDanmark KeyB + 0x505249564141, // # RKF JOJOPRIVAKeyA + 0x505249564142, // # RKF JOJOPRIVAKeyB + 0x47524f555041, // # RKF JOJOGROUPKeyA + 0x47524f555042, // # RKF JOJOGROUPKeyB + 0x434f4d4d4f41, // # RKF JOJOGROUPKeyA + 0x434f4d4d4f42, // # RKF JOJOGROUPKeyB + 0x4b0b20107ccb, // # TNP3xxx }; /* This part allocates the byte representation of the keys in keyBlock's memory space . */ - keyBlock = BigBuf_malloc(stKeyBlock * 6); + keyBlock = BigBuf_malloc(ARRAYLEN(mfKeys) * 6); int mfKeysCnt = ARRAYLEN(mfKeys); for (int mfKeyCounter = 0; mfKeyCounter < mfKeysCnt; mfKeyCounter++) { num_to_bytes(mfKeys[mfKeyCounter], 6, (uint8_t *)(keyBlock + mfKeyCounter * 6)); } - /* - Pretty print of the keys to be checked. - */ + // Pretty print of the keys to be checked. if (printKeys) { Dbprintf("[+] Printing mf keys"); for (uint8_t keycnt = 0; keycnt < mfKeysCnt; keycnt++) @@ -301,30 +416,31 @@ void RunMod() { */ bool validKey[2][40]; uint8_t foundKey[2][40][6]; - for (uint16_t t = 0; t < 2; t++) { + for (uint8_t i = 0; i < 2; i++) { for (uint16_t sectorNo = 0; sectorNo < sectorsCnt; sectorNo++) { - validKey[t][sectorNo] = false; - for (uint16_t i = 0; i < 6; i++) { - foundKey[t][sectorNo][i] = 0xff; - } + validKey[i][sectorNo] = false; + foundKey[i][sectorNo][0] = 0xFF; + foundKey[i][sectorNo][1] = 0xFF; + foundKey[i][sectorNo][2] = 0xFF; + foundKey[i][sectorNo][3] = 0xFF; + foundKey[i][sectorNo][4] = 0xFF; + foundKey[i][sectorNo][5] = 0xFF; } } - /* - Iterates through each sector checking if there is a correct key. - */ + // Iterates through each sector checking if there is a correct key. bool err = 0; bool allKeysFound = true; uint32_t size = mfKeysCnt; - for (int type = !keyType; type < 2 && !err; keyType == 2 ? (type++) : (type = 2)) { + for (int type = 0; type < 2 && !err; type++) { int block = blockNo; for (int sec = 0; sec < sectorsCnt && !err; ++sec) { Dbprintf("\tCurrent sector:%3d, block:%3d, key type: %c, key count: %i ", sec, block, type ? 'B' : 'A', mfKeysCnt); int key = saMifareChkKeys(block, type, true, size, &keyBlock[0], &key64); if (key == -1) { LED(LED_RED, 50); - Dbprintf("\t✕ Key not found for this sector!"); + Dbprintf("\t [✕] Key not found for this sector!"); allKeysFound = false; // break; } else if (key == -2) { @@ -334,7 +450,7 @@ void RunMod() { num_to_bytes(key64, 6, foundKey[type][sec]); validKey[type][sec] = true; keyFound = true; - Dbprintf("\t✓ Found valid key: [%02x%02x%02x%02x%02x%02x]\n", + Dbprintf("\t [✓] Found valid key: [%02x%02x%02x%02x%02x%02x]\n", (keyBlock + 6 * key)[0], (keyBlock + 6 * key)[1], (keyBlock + 6 * key)[2], (keyBlock + 6 * key)[3], (keyBlock + 6 * key)[4], (keyBlock + 6 * key)[5] ); @@ -371,8 +487,9 @@ void RunMod() { emlClearMem(); uint8_t mblock[16]; - for (uint16_t sectorNo = 0; sectorNo < sectorsCnt; sectorNo++) { + for (uint8_t sectorNo = 0; sectorNo < sectorsCnt; sectorNo++) { if (validKey[0][sectorNo] || validKey[1][sectorNo]) { + emlGetMem(mblock, FirstBlockOfSector(sectorNo) + NumBlocksPerSector(sectorNo) - 1, 1); // data, block num, blocks count (max 4) for (uint16_t t = 0; t < 2; t++) { if (validKey[t][sectorNo]) { @@ -382,47 +499,40 @@ void RunMod() { emlSetMem(mblock, FirstBlockOfSector(sectorNo) + NumBlocksPerSector(sectorNo) - 1, 1); } } - Dbprintf("\t✓ Found keys have been transferred to the emulator memory."); + + Dbprintf("\t [✓] Found keys have been transferred to the emulator memory."); + if (ecfill) { int filled; Dbprintf("\tFilling in with key A."); - filled = MifareECardLoad(sectorsCnt, 0); - if (filled != PM3_SUCCESS) { - Dbprintf("\t✕ Failed filling with A."); - } - Dbprintf("\tFilling in with key B."); - filled = MifareECardLoad(sectorsCnt, 1); + filled = saMifareECardLoad(sectorsCnt, 0); if (filled != PM3_SUCCESS) { - Dbprintf("\t✕ Failed filling with B."); + + Dbprintf("\t [✕] Failed filling with A."); + Dbprintf("\tFilling in with key B."); + filled = saMifareECardLoad(sectorsCnt, 1); + if (filled != PM3_SUCCESS) { + Dbprintf("\t [✕] Failed filling with B."); + } } if ((filled == PM3_SUCCESS) && simulation) { - Dbprintf("\t✓ Emulator memory filled, simulation started."); + Dbprintf("\t [✓] Emulator memory filled, simulation started."); // This will tell the fpga to emulate using previous keys and current target tag content. Dbprintf("\t Press button to abort simulation at anytime."); LED_B_ON(); // green - // assuming arg0==0, use hardcoded uid 0xdeadbeaf - uint16_t simflags; - switch (p_card.uidlen) { - case 10: - simflags = FLAG_10B_UID_IN_DATA; - break; - case 7: - simflags = FLAG_7B_UID_IN_DATA; - break; - default: - simflags = FLAG_4B_UID_IN_DATA; - break; - } - Mifare1ksim(simflags | FLAG_MF_1K, 0, uid, 0, 0); - LED_B_OFF(); - /* - Needs further testing. - */ + uint16_t simflags = FLAG_UID_IN_EMUL | FLAG_MF_1K; + + SpinOff(1000); + Mifare1ksim(simflags, 0, uid, 0, 0); + LED_B_OFF(); + Dbprintf("\t [✓] Simulation ended"); + + // Needs further testing. if (fillFromEmulator) { uint8_t retry = 5; Dbprintf("\t Trying to dump into blank card."); @@ -457,8 +567,10 @@ void RunMod() { } } - } else if (filled != PM3_SUCCESS) { - Dbprintf("\t✕ Emulator memory could not be filled due to errors."); + } + + if (filled != PM3_SUCCESS) { + Dbprintf("\t [✕] Emulator memory could not be filled due to errors."); LED_C_ON(); } } diff --git a/armsrc/Standalone/hf_msdsal.c b/armsrc/Standalone/hf_msdsal.c index c79d01aed..f97dc0d7c 100644 --- a/armsrc/Standalone/hf_msdsal.c +++ b/armsrc/Standalone/hf_msdsal.c @@ -52,9 +52,9 @@ void ModInfo(void) { * technologies. Be brave enough to share your knowledge & inspire others. Salvador Mendoza. */ -uint8_t ppdol [255] = {0x80, 0xA8, 0x00, 0x00, 0x02, 0x83, 0x00}; // Default GET PROCESSING +static uint8_t ppdol [255] = {0x80, 0xA8, 0x00, 0x00, 0x02, 0x83, 0x00}; // Default GET PROCESSING -uint8_t treatPDOL(uint8_t *apdu) { //Generate GET PROCESSING +static uint8_t treatPDOL(uint8_t *apdu) { //Generate GET PROCESSING uint8_t plen = 7; //PDOL Format: 80 A8 00 00 + (PDOL Length+2) + 83 + PDOL Length + PDOL + 00 for (uint8_t i = 1; i <= apdu[0]; i++) { //Magic stuff, the generation order is important @@ -117,9 +117,9 @@ uint8_t treatPDOL(uint8_t *apdu) { //Generate GET PROCESSING return plen; } -void RunMod() { +void RunMod(void) { StandAloneMode(); - Dbprintf(_YELLOW_(">>") "Reading Visa cards & Emulating a Visa MSD Transaction a.k.a. MSDSal Started<<"); + DbpString(_YELLOW_(">>") "Reading Visa cards & Emulating a Visa MSD Transaction a.k.a. MSDSal Started " _YELLOW_("<<")); FpgaDownloadAndGo(FPGA_BITSTREAM_HF); //For reading process @@ -183,8 +183,8 @@ void RunMod() { uint8_t receivedCmd[MAX_FRAME_SIZE] = { 0x00 }; uint8_t receivedCmdPar[MAX_PARITY_SIZE] = { 0x00 }; - uint8_t dynamic_response_buffer[DYNAMIC_RESPONSE_BUFFER_SIZE]; - uint8_t dynamic_modulation_buffer[DYNAMIC_MODULATION_BUFFER_SIZE]; + uint8_t dynamic_response_buffer[DYNAMIC_RESPONSE_BUFFER_SIZE] = {0}; + uint8_t dynamic_modulation_buffer[DYNAMIC_MODULATION_BUFFER_SIZE] = {0}; // to know the transaction status uint8_t prevCmd = 0; @@ -206,10 +206,10 @@ void RunMod() { //Checking if the user wants to go directly to emulation mode using a hardcoded track 2 if (chktoken == true && token[0] != 0x00) { state = STATE_EMU; - Dbprintf(_YELLOW_("[") "Initialized emulation mode " _YELLOW_("]")); + DbpString(_YELLOW_("[ ") "Initialized emulation mode" _YELLOW_(" ]")); DbpString("\n"_YELLOW_("!!") "Waiting for a card reader..."); } else { - DbpString(_YELLOW_("[") "Initialized reading mode " _YELLOW_("]")); + DbpString(_YELLOW_("[ ") "Initialized reading mode" _YELLOW_(" ]")); DbpString("\n"_YELLOW_("!!") "Waiting for a Visa card..."); } @@ -222,18 +222,18 @@ void RunMod() { // Was our button held down or pressed? int button_pressed = BUTTON_HELD(1000); - if (button_pressed == 1) //Holding down the button + if (button_pressed == BUTTON_HOLD) //Holding down the button break; - else if (button_pressed == -1) { //Pressing one time change between reading & emulation + else if (button_pressed == BUTTON_SINGLE_CLICK) { //Pressing one time change between reading & emulation if (state == STATE_READ) { if (chktoken == true && token[0] != 0x00) { //Only change to emulation if it saved a track 2 in memory state = STATE_EMU; - Dbprintf(_YELLOW_("[") "In emulation mode " _YELLOW_("]")); + DbpString(_YELLOW_("[ ") "In emulation mode" _YELLOW_(" ]")); } else - Dbprintf(_YELLOW_("!!") "Nothing in memory to emulate"); + DbpString(_YELLOW_("!!") "Nothing in memory to emulate"); } else { state = STATE_READ; - Dbprintf(_YELLOW_("[") "In reading mode " _YELLOW_("]")); + DbpString(_YELLOW_("[ ") "In reading mode" _YELLOW_(" ]")); } } @@ -248,7 +248,7 @@ void RunMod() { if (iso14443a_select_card(NULL, &card_a_info, NULL, true, 0, false)) { - Dbprintf(_YELLOW_("+") "Found ISO 14443 Type A!"); + DbpString(_YELLOW_("+") "Found ISO 14443 Type A!"); for (uint8_t i = 0; i < 4; i++) { chktoken = false; @@ -257,11 +257,11 @@ void RunMod() { uint8_t apdulen = iso14_apdu(apdus[i], (uint16_t) apdusLen[i], false, apdubuffer, NULL); if (apdulen > 0) { - Dbprintf(_YELLOW_("[") "Proxmark command " _YELLOW_("]")); + DbpString(_YELLOW_("[ ") "Proxmark command" _YELLOW_(" ]")); Dbhexdump(apdusLen[i], apdus[i], false); - Dbprintf(_GREEN_("[") "Card answer " _GREEN_("]")); + DbpString(_GREEN_("[ ") "Card answer" _GREEN_(" ]")); Dbhexdump(apdulen - 2, apdubuffer, false); - Dbprintf("----"); + DbpString("----"); for (uint8_t u = 0; u < apdulen; u++) { if (i == 1) { @@ -284,24 +284,24 @@ void RunMod() { } if (i == 1) { - Dbprintf(_GREEN_("[") "Challenge generated " _GREEN_("]")); + DbpString(_GREEN_("[ ") "Challenge generated" _GREEN_(" ]")); Dbhexdump(plen, existpdol ? ppdol : processing, false); } } else { - Dbprintf(_YELLOW_("!!") "Error reading the card"); + DbpString(_YELLOW_("!!") "Error reading the card"); } LED_B_OFF(); } if (chktoken) { - Dbprintf(_RED_("[") "Track 2 " _RED_("]")); + DbpString(_RED_("[ ") "Track 2" _RED_(" ]")); Dbhexdump(19, (uint8_t *)token, false); - Dbprintf(_YELLOW_("!!") "Card number"); + DbpString(_YELLOW_("!!") "Card number"); Dbhexdump(8, (uint8_t *)token, false); DbpString("---"); LED_C_ON(); state = STATE_EMU; - Dbprintf(_YELLOW_("[") "Initialized emulation mode " _YELLOW_("]")); + DbpString(_YELLOW_("[ ") "Initialized emulation mode" _YELLOW_(" ]")); DbpString("\n"_YELLOW_("!!") "Waiting for a card reader..."); } } @@ -318,7 +318,7 @@ void RunMod() { DbpString(_YELLOW_("!!") "Error initializing the emulation process!"); SpinDelay(500); state = STATE_READ; - DbpString(_YELLOW_("[") "Initialized reading mode " _YELLOW_("]")); + DbpString(_YELLOW_("[ ") "Initialized reading mode" _YELLOW_(" ]")); DbpString("\n" _YELLOW_("!!") "Waiting for a Visa card..."); break; } @@ -336,7 +336,7 @@ void RunMod() { LED_B_OFF(); // Clean receive command buffer if (!GetIso14443aCommandFromReader(receivedCmd, receivedCmdPar, &len)) { - Dbprintf(_YELLOW_("!!") "Emulator stopped"); + DbpString(_YELLOW_("!!") "Emulator stopped"); retval = PM3_EOPABORTED; break; } @@ -367,7 +367,7 @@ void RunMod() { DbpString(_YELLOW_("+") "Request for RATS"); p_response = &responses[RATS]; } else { - Dbprintf(_YELLOW_("[") "Card reader command " _YELLOW_("]")); + DbpString(_YELLOW_("[ ") "Card reader command" _YELLOW_(" ]")); Dbhexdump(len, receivedCmd, false); if (receivedCmd[0] == 0x02 || receivedCmd[0] == 0x03) { //Emulate a Visa MSD(Magnetic stripe data) card @@ -408,7 +408,7 @@ void RunMod() { } } } else { - Dbprintf(_YELLOW_("!!") "Received unknown command!"); + DbpString(_YELLOW_("!!") "Received unknown command!"); if (prevCmd < 4) { memcpy(dynamic_response_info.response, receivedCmd, len); dynamic_response_info.response_n = len; @@ -418,9 +418,9 @@ void RunMod() { } } if (dynamic_response_info.response_n > 0) { - Dbprintf(_GREEN_("[") "Proxmark3 answer " _GREEN_("]")); + DbpString(_GREEN_("[ ") "Proxmark3 answer" _GREEN_(" ]")); Dbhexdump(dynamic_response_info.response_n, dynamic_response_info.response, false); - Dbprintf("----"); + DbpString("----"); // Add CRC bytes, always used in ISO 14443A-4 compliant cards AddCrc14A(dynamic_response_info.response, dynamic_response_info.response_n); diff --git a/armsrc/Standalone/hf_young.c b/armsrc/Standalone/hf_young.c index f137e9992..a1b32dfab 100644 --- a/armsrc/Standalone/hf_young.c +++ b/armsrc/Standalone/hf_young.c @@ -37,7 +37,7 @@ void ModInfo(void) { DbpString(" HF Mifare sniff/simulation - (Craig Young)"); } -void RunMod() { +void RunMod(void) { StandAloneMode(); Dbprintf(">> Craig Young Mifare sniff UID/clone uid 2 magic/sim a.k.a YoungRun Started <<"); FpgaDownloadAndGo(FPGA_BITSTREAM_HF); @@ -151,10 +151,10 @@ void RunMod() { SpinDelay(500); // Begin clone function here: /* Example from client/mifarehost.c for commanding a block write for "magic Chinese" cards: - SendCommandOLD(CMD_HF_MIFARE_CSETBL, params & (0xFE | (uid == NULL ? 0:1)), blockNo, 0, data, 16); + SendCommandMIX(CMD_HF_MIFARE_CSETBL, params & (0xFE | (uid == NULL ? 0:1)), blockNo, 0, data, 16); Block read is similar: - SendCommandOLD(CMD_HF_MIFARE_CGETBL, params, blockNo, 0,...}; + SendCommandMIX(CMD_HF_MIFARE_CGETBL, params, blockNo, 0,...}; We need to imitate that call with blockNo 0 to set a uid. The get and set commands are handled in this file: @@ -222,8 +222,8 @@ void RunMod() { // exit from Standalone Mode, send a usbcommand. if (data_available()) return; - int button_action = BUTTON_HELD(1000); - if (button_action == 0) { // No button action, proceed with sim + int button_pressed = BUTTON_HELD(1000); + if (button_pressed == BUTTON_NO_CLICK) { // No button action, proceed with sim uint8_t flags = FLAG_4B_UID_IN_DATA; uint8_t data[PM3_CMD_DATA_SIZE] = {0}; // in case there is a read command received we shouldn't break @@ -259,12 +259,12 @@ void RunMod() { SimulateIso14443aTag(1, flags, data); } - } else if (button_action == BUTTON_SINGLE_CLICK) { + } else if (button_pressed == BUTTON_SINGLE_CLICK) { selected = (selected + 1) % OPTS; Dbprintf("Done playing. Switching to record mode on bank %d", selected); iGotoRecord = 1; break; - } else if (button_action == BUTTON_HOLD) { + } else if (button_pressed == BUTTON_HOLD) { Dbprintf("Playtime over. Begin cloning..."); iGotoClone = 1; break; diff --git a/armsrc/Standalone/lf_em4100emul.c b/armsrc/Standalone/lf_em4100emul.c index dce6c455e..e6ac2f6ff 100644 --- a/armsrc/Standalone/lf_em4100emul.c +++ b/armsrc/Standalone/lf_em4100emul.c @@ -18,23 +18,22 @@ #include "ticks.h" #include "string.h" #include "BigBuf.h" +#include "commonutil.h" #define MAX_IND 16 // 4 LEDs - 2^4 combinations #define CLOCK 64 //for 125kHz // low & high - array for storage IDs. Its length must be equal. // Predefined IDs must be stored in low[]. -// In high[] must be nulls -uint64_t low[] = {0x565A1140BE, 0x365A398149, 0x5555555555, 0xFFFFFFFFFF}; -uint32_t high[] = {0, 0, 0, 0}; -uint8_t *bba, slots_count; -int buflen; +static uint64_t low[] = {0x565A1140BE, 0x365A398149, 0x5555555555, 0xFFFFFFFFFF}; +static uint8_t *bba, slots_count; +static int buflen; void ModInfo(void) { DbpString(" LF EM4100 simulator standalone mode"); } -uint64_t ReversQuads(uint64_t bits) { +static uint64_t ReversQuads(uint64_t bits) { uint64_t result = 0; for (int i = 0; i < 16; i++) { result += ((bits >> (60 - 4 * i)) & 0xf) << (4 * i); @@ -42,14 +41,14 @@ uint64_t ReversQuads(uint64_t bits) { return result >> 24; } -void FillBuff(uint8_t bit) { +static void FillBuff(uint8_t bit) { memset(bba + buflen, bit, CLOCK / 2); buflen += (CLOCK / 2); memset(bba + buflen, bit ^ 1, CLOCK / 2); buflen += (CLOCK / 2); } -void ConstructEM410xEmulBuf(uint64_t id) { +static void ConstructEM410xEmulBuf(uint64_t id) { int i, j, binary[4], parity[4]; buflen = 0; @@ -70,7 +69,7 @@ void ConstructEM410xEmulBuf(uint64_t id) { FillBuff(0); } -void LED_Slot(int i) { +static void LED_Slot(int i) { LEDsoff(); if (slots_count > 4) { LED(i % MAX_IND, 0); //binary indication for slots_count > 4 @@ -79,7 +78,7 @@ void LED_Slot(int i) { } } -void RunMod() { +void RunMod(void) { StandAloneMode(); FpgaDownloadAndGo(FPGA_BITSTREAM_LF); Dbprintf("[=] >> LF EM4100 simulator started <<"); diff --git a/armsrc/Standalone/lf_em4100rswb.c b/armsrc/Standalone/lf_em4100rswb.c new file mode 100644 index 000000000..14bab8357 --- /dev/null +++ b/armsrc/Standalone/lf_em4100rswb.c @@ -0,0 +1,340 @@ +//----------------------------------------------------------------------------- +// Monster1024 +// based on code by: Artyom Gnatyuk, 2020 +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// LF rswb - This mode can simulate ID from selected slot, read ID to +// selected slot, write from selected slot to T5555/T55x7 tag and store +// readed ID to flash (only RDV4). +// Predefined its is not recomended because you can incedently rewrite your MANDATORY tag data. +// +// To recall stored ID from flash execute: +// mem spifss dump o emdump p +// or: +// mem spifss dump o emdump f emdump +// then from shell: +// hexdump emdump -e '5/1 "%02X" /0 "\n"' +// +// Mode list (switched by single click): +// +// 0 - READ Read source card ID and store it to current slot +// Will switch to SIM mode automatically. +// +// 1 - SIM Simulate readed ID +// +// 2 - WRITE(CLONE) Write readed ID to T55x7 card +// !!! Warning, card id WILL BE OVERRWRITED +// +// 3 - BRUTE Brute upper or down from readed card) +// You can PRESS SINGLE to exit brute mode OR +// PRESS DOUBLE to save bruted ID to current slot (will automatically switch to SIM mode) AND +// Also You can HOLD button to change brute speeds. +// +// Slots are switched by HOLD (LONG PRESS) +//----------------------------------------------------------------------------- +#include "standalone.h" +#include "proxmark3_arm.h" +#include "appmain.h" +#include "fpgaloader.h" +#include "util.h" +#include "dbprint.h" +#include "ticks.h" +#include "string.h" +#include "BigBuf.h" +#include "spiffs.h" +#include "inttypes.h" +#include "parity.h" +#include "lfops.h" + +#ifdef WITH_FLASH +#include "flashmem.h" +#endif + +#define LF_CLOCK 64 //for 125kHz +#define LF_RWSB_T55XX_TYPE 1 //Tag type: 0 - T5555, 1-T55x7 + +#define LF_RWSB_UNKNOWN_RESULT 0 +#define LF_RWSB_BRUTE_STOPED 1 +#define LF_RWSB_BRUTE_SAVED 2 + +//modes +#define LF_RWSB_MODE_READ 0 +#define LF_RWSB_MODE_SIM 1 +#define LF_RWSB_MODE_WRITE 2 +#define LF_RWSB_MODE_BRUTE 3 + +// Predefined bruteforce speed +// avg: 1s, 1.2s, 1.5s, 2s +static int bruteforceSpeedCurrent = 1; +static int bruteforceSpeed[] = {10, 12, 14, 16}; + +// low & high - array for storage IDs. Its length must be equal. +// Predefined IDs must be stored in low[]. +// In high[] must be nulls +static uint64_t low[] = {0, 0, 0, 0}; +static uint32_t high[] = {0, 0, 0, 0}; +static uint8_t *bba; +static int buflen; + +void ModInfo(void) { + DbpString(" LF EM4100 read/sim/write/brute mode"); +} + +static uint64_t ReversQuads(uint64_t bits) { + uint64_t result = 0; + for (int i = 0; i < 16; i++) { + result += ((bits >> (60 - 4 * i)) & 0xf) << (4 * i); + } + return result >> 24; +} + +static void FillBuff(uint8_t bit) { + memset(bba + buflen, bit, LF_CLOCK / 2); + buflen += (LF_CLOCK / 2); + memset(bba + buflen, bit ^ 1, LF_CLOCK / 2); + buflen += (LF_CLOCK / 2); +} + +static void ConstructEM410xEmulBuf(uint64_t id) { + bba = BigBuf_get_addr(); + + int i, j, binary[4], parity[4]; + buflen = 0; + for (i = 0; i < 9; i++) + FillBuff(1); + parity[0] = parity[1] = parity[2] = parity[3] = 0; + for (i = 0; i < 10; i++) { + for (j = 3; j >= 0; j--, id /= 2) + binary[j] = id % 2; + for (j = 0; j < 4; j++) + FillBuff(binary[j]); + FillBuff(binary[0] ^ binary[1] ^ binary[2] ^ binary[3]); + for (j = 0; j < 4; j++) + parity[j] ^= binary[j]; + } + for (j = 0; j < 4; j++) + FillBuff(parity[j]); + FillBuff(0); +} + +static void LED_Update(int mode, int slot) { + LEDsoff(); + switch (mode) { + case 0: + break; + case 1: + LED_A_ON(); + break; + case 2: + LED_B_ON(); + break; + case 3: + LED_A_ON(); + LED_B_ON(); + break; + } + switch (slot) { + case 0: + break; + case 1: + LED_C_ON(); + break; + case 2: + LED_D_ON(); + break; + case 3: + LED_C_ON(); + LED_D_ON(); + break; + } +} + +static void FlashLEDs(uint32_t speed, uint8_t times) { + for (int i = 0; i < times * 2; i++) { + LED_A_INV(); + LED_B_INV(); + LED_C_INV(); + LED_D_INV(); + SpinDelay(speed); + } +} + +#ifdef WITH_FLASH +static void SaveIDtoFlash(int addr, uint64_t id) { + uint8_t bt[5]; + char *filename = "emdump"; + rdv40_spiffs_mount(); + for (int i = 0; i < 5; i++) { + bt[4 - i] = (uint8_t)(id >> 8 * i & 0xff); + } + if (exists_in_spiffs(filename) == false) { + rdv40_spiffs_write(filename, &bt[0], 5, RDV40_SPIFFS_SAFETY_NORMAL); + } else { + rdv40_spiffs_append(filename, &bt[0], 5, RDV40_SPIFFS_SAFETY_NORMAL); + } +} +#endif + +static uint64_t PackEmID(uint64_t original, int newCardNum) { + uint64_t buf = original; + //clear pairity bits + buf &= ~(1 << 0); + buf &= ~(1 << 25); + //clear card number + for (int i = 1; i <= 16; i++) { + buf &= ~(1 << i); + } + buf |= (newCardNum & 0xFFFF) << 1; + buf |= oddparity32((buf >> 1) & 0xFFF) & 1; + buf |= (evenparity32((buf >> 13) & 0xFFF) & 1) << 25; + + uint32_t cardnumNew = (buf >> 1) & 0xFFFF; + uint32_t fcNew = (buf >> 17) & 0xFF; + Dbprintf("[=] RECONSTRUCT TAG ID: %"PRIx64" - FC: %u - Card: %u\n", buf, fcNew, cardnumNew); + return buf; +} + + +static void PrintFcAndCardNum(uint64_t lowData) { + // Calculate Facility Code and Card Number from high and low + uint32_t fc = (lowData >> 17) & 0xFF; + uint32_t cardnum = (lowData >> 1) & 0xFFFF; + Dbprintf("[=] READ TAG ID: %"PRIx64" - FC: %u - Card: %u", lowData, fc, cardnum); +} + +static int BruteEMTag(uint64_t originalCard, int slot) { + int speed_count = 4; + + int direction = 1; + + uint32_t cardnum = (originalCard >> 1) & 0xFFFF; + if (cardnum > 32767) { + direction = -1; + } + + while (cardnum > 1 && cardnum < 65535) { + WDT_HIT(); + if (data_available()) break; + + cardnum = cardnum + direction; + uint64_t currentCard = PackEmID(originalCard, cardnum); + Dbprintf("[=] >> Simulating card id %"PRIx64" <<", currentCard); + ConstructEM410xEmulBuf(ReversQuads(currentCard)); + SimulateTagLowFrequencyEx(buflen, 0, 1, bruteforceSpeed[bruteforceSpeedCurrent] * 10000); + + int button_pressed = BUTTON_CLICKED(1000); + if (button_pressed == BUTTON_SINGLE_CLICK) { + Dbprintf("[=] >> Exit bruteforce mode without saving. <<"); + return LF_RWSB_BRUTE_STOPED; + } else if (button_pressed == BUTTON_DOUBLE_CLICK) { + FlashLEDs(100, 10); + Dbprintf("[=] >> Saving bruteforced card to current slot <<"); + low[slot] = currentCard; +#ifdef WITH_FLASH + SaveIDtoFlash(slot, low[slot]); +#endif + return LF_RWSB_BRUTE_SAVED; + } else if (button_pressed == BUTTON_HOLD) { + FlashLEDs(100, 1); + WAIT_BUTTON_RELEASED(); + bruteforceSpeedCurrent = (bruteforceSpeedCurrent + 1) % speed_count; + FlashLEDs(100, bruteforceSpeedCurrent + 1); + Dbprintf("[=] >> Setting speed to %d (%d) <<", bruteforceSpeedCurrent, bruteforceSpeed[bruteforceSpeedCurrent]); + } + } + return LF_RWSB_BRUTE_STOPED; +} + +static int ExecuteMode(int mode, int slot) { + LED_Update(mode, slot); + WDT_HIT(); + + switch (mode) { + //default first mode is simulate + case LF_RWSB_MODE_READ: + Dbprintf("[=] >> Read mode started <<"); + lf_em410x_watch(1, &high[slot], &low[slot]); + LED_Update(mode, slot); + Dbprintf("[=] >> Tag found. Saving. <<"); + FlashLEDs(100, 5); + PrintFcAndCardNum(low[slot]); +#ifdef WITH_FLASH + SaveIDtoFlash(slot, low[slot]); +#endif + return LF_RWSB_UNKNOWN_RESULT; + case LF_RWSB_MODE_SIM: + Dbprintf("[=] >> Sim mode started <<"); + ConstructEM410xEmulBuf(ReversQuads(low[slot])); + SimulateTagLowFrequency(buflen, 0, 1); + return LF_RWSB_UNKNOWN_RESULT; + case LF_RWSB_MODE_WRITE: + Dbprintf("[!!] >> Write mode started <<"); + copy_em410x_to_t55xx(LF_RWSB_T55XX_TYPE, LF_CLOCK, (uint32_t)(low[slot] >> 32), (uint32_t)(low[slot] & 0xffffffff)); + return LF_RWSB_UNKNOWN_RESULT; + case LF_RWSB_MODE_BRUTE: + Dbprintf("[=] >> Bruteforce mode started <<"); + return BruteEMTag(low[slot], slot); + } + return LF_RWSB_UNKNOWN_RESULT; +} + +static int SwitchMode(int mode, int slot) { + WDT_HIT(); + ExecuteMode(mode, slot); + + if (mode == LF_RWSB_MODE_READ) { + //After read mode we need to switch to sim mode automatically + Dbprintf("[=] >> automatically switch to sim mode after read <<"); + + return SwitchMode(LF_RWSB_MODE_SIM, slot); + } else if (mode == LF_RWSB_MODE_BRUTE) { + //We have already have a click inside brute mode. Lets switch next mode + Dbprintf("[=] >> automatically switch to read mode after brute <<"); + + return SwitchMode(LF_RWSB_MODE_READ, slot); + } + return mode; +} + +void RunMod() { + StandAloneMode(); + FpgaDownloadAndGo(FPGA_BITSTREAM_LF); + Dbprintf("[=] >> LF EM4100 read/write/clone/brute started <<"); + int slots_count = 4; + int mode_count = 4; + + int mode = 0; + int slot = 0; + mode = SwitchMode(mode, slot); + + bba = BigBuf_get_addr(); + for (;;) { + WDT_HIT(); + if (data_available()) break; + + int button_pressed = BUTTON_CLICKED(1000); + LED_Update(mode, slot); + + //press button - switch mode + //hold button - switch slot + if (button_pressed == BUTTON_SINGLE_CLICK) { + Dbprintf("[=] >> Single click <<"); + mode = (mode + 1) % mode_count; + SpinDown(100); + + mode = SwitchMode(mode, slot); + } else if (button_pressed == BUTTON_HOLD) { + Dbprintf("[=] >> Button hold <<"); + slot = (slot + 1) % slots_count; + SpinUp(100); + SpinDelay(300); + + //automatically switch to SIM mode on slot selection + mode = LF_RWSB_MODE_SIM; + mode = SwitchMode(mode, slot); + } + } +} diff --git a/armsrc/Standalone/lf_em4100rwc.c b/armsrc/Standalone/lf_em4100rwc.c index fcd3fe294..d095b944b 100644 --- a/armsrc/Standalone/lf_em4100rwc.c +++ b/armsrc/Standalone/lf_em4100rwc.c @@ -27,27 +27,28 @@ #include "string.h" #include "BigBuf.h" #include "spiffs.h" +#include "commonutil.h" #ifdef WITH_FLASH #include "flashmem.h" #endif #define MAX_IND 16 // 4 LEDs - 2^4 combinations -#define CLOCK 64 //for 125kHz +#define LF_CLOCK 64 // for 125kHz // low & high - array for storage IDs. Its length must be equal. // Predefined IDs must be stored in low[]. // In high[] must be nulls -uint64_t low[] = {0x565AF781C7, 0x540053E4E2, 0x1234567890, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -uint32_t high[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -uint8_t *bba, slots_count; -int buflen; +static uint64_t low[] = {0x565AF781C7, 0x540053E4E2, 0x1234567890, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +static uint32_t high[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; +static uint8_t *bba, slots_count; +static int buflen; void ModInfo(void) { DbpString(" LF EM4100 read/write/clone mode"); } -uint64_t ReversQuads(uint64_t bits) { +static uint64_t rev_quads(uint64_t bits) { uint64_t result = 0; for (int i = 0; i < 16; i++) { result += ((bits >> (60 - 4 * i)) & 0xf) << (4 * i); @@ -55,35 +56,42 @@ uint64_t ReversQuads(uint64_t bits) { return result >> 24; } -void FillBuff(uint8_t bit) { - memset(bba + buflen, bit, CLOCK / 2); - buflen += (CLOCK / 2); - memset(bba + buflen, bit ^ 1, CLOCK / 2); - buflen += (CLOCK / 2); +static void fillbuff(uint8_t bit) { + memset(bba + buflen, bit, LF_CLOCK / 2); + buflen += (LF_CLOCK / 2); + memset(bba + buflen, bit ^ 1, LF_CLOCK / 2); + buflen += (LF_CLOCK / 2); } -void ConstructEM410xEmulBuf(uint64_t id) { +static void construct_EM410x_emul(uint64_t id) { - int i, j, binary[4], parity[4]; + int i, j; + int binary[4] = {0}; + int parity[4] = {0}; buflen = 0; + for (i = 0; i < 9; i++) - FillBuff(1); - parity[0] = parity[1] = parity[2] = parity[3] = 0; + fillbuff(1); + for (i = 0; i < 10; i++) { for (j = 3; j >= 0; j--, id /= 2) binary[j] = id % 2; + for (j = 0; j < 4; j++) - FillBuff(binary[j]); - FillBuff(binary[0] ^ binary[1] ^ binary[2] ^ binary[3]); + fillbuff(binary[j]); + + fillbuff(binary[0] ^ binary[1] ^ binary[2] ^ binary[3]); for (j = 0; j < 4; j++) parity[j] ^= binary[j]; } + for (j = 0; j < 4; j++) - FillBuff(parity[j]); - FillBuff(0); + fillbuff(parity[j]); + + fillbuff(0); } -void LED_Slot(int i) { +static void led_slot(int i) { LEDsoff(); if (slots_count > 4) { LED(i % MAX_IND, 0); //binary indication, usefully for slots_count > 4 @@ -92,8 +100,8 @@ void LED_Slot(int i) { } } -void FlashLEDs(uint32_t speed, uint8_t times) { - for (int i = 0; i < times * 2; i++) { +static void flash_leds(uint32_t speed, uint8_t times) { + for (uint16_t i = 0; i < times * 2; i++) { LED_A_INV(); LED_B_INV(); LED_C_INV(); @@ -103,9 +111,9 @@ void FlashLEDs(uint32_t speed, uint8_t times) { } #ifdef WITH_FLASH -void SaveIDtoFlash(int addr, uint64_t id) { +static void SaveIDtoFlash(int addr, uint64_t id) { uint8_t bt[5]; - char *filename = "emdump"; + const char *filename = "emdump"; rdv40_spiffs_mount(); for (int i = 0; i < 5; i++) { bt[4 - i] = (uint8_t)(id >> 8 * i & 0xff); @@ -118,7 +126,7 @@ void SaveIDtoFlash(int addr, uint64_t id) { } #endif -void RunMod() { +void RunMod(void) { StandAloneMode(); FpgaDownloadAndGo(FPGA_BITSTREAM_LF); Dbprintf("[=] >> LF EM4100 read/write/clone started <<"); @@ -131,37 +139,41 @@ void RunMod() { uint8_t state = 0; slots_count = ARRAYLEN(low); bba = BigBuf_get_addr(); - LED_Slot(selected); + led_slot(selected); for (;;) { + WDT_HIT(); + if (data_available()) break; + int button_pressed = BUTTON_HELD(1000); SpinDelay(300); + switch (state) { case 0: // Select mode - if (button_pressed == 1) { + if (button_pressed == BUTTON_HOLD) { // Long press - switch to simulate mode SpinUp(100); - LED_Slot(selected); + led_slot(selected); state = 2; - } else if (button_pressed < 0) { + } else if (button_pressed == BUTTON_SINGLE_CLICK) { // Click - switch to next slot selected = (selected + 1) % slots_count; - LED_Slot(selected); + led_slot(selected); } break; case 1: // Read mode. - if (button_pressed > 0) { + if (button_pressed == BUTTON_HOLD) { // Long press - switch to read mode SpinUp(100); - LED_Slot(selected); + led_slot(selected); state = 3; - } else if (button_pressed < 0) { + } else if (button_pressed == BUTTON_SINGLE_CLICK) { // Click - exit to select mode - CmdEM410xdemod(1, &high[selected], &low[selected], 0); - FlashLEDs(100, 5); + lf_em410x_watch(1, &high[selected], &low[selected]); + flash_leds(100, 5); #ifdef WITH_FLASH SaveIDtoFlash(selected, low[selected]); #endif @@ -170,32 +182,34 @@ void RunMod() { break; case 2: // Simulate mode - if (button_pressed > 0) { + if (button_pressed == BUTTON_HOLD) { // Long press - switch to read mode SpinDown(100); - LED_Slot(selected); + led_slot(selected); state = 1; - } else if (button_pressed < 0) { + } else if (button_pressed == BUTTON_SINGLE_CLICK) { // Click - start simulating. Click again to exit from simulate mode - LED_Slot(selected); - ConstructEM410xEmulBuf(ReversQuads(low[selected])); - FlashLEDs(100, 5); + led_slot(selected); + + construct_EM410x_emul(rev_quads(low[selected])); + flash_leds(100, 5); + SimulateTagLowFrequency(buflen, 0, 1); - LED_Slot(selected); + led_slot(selected); state = 0; // Switch to select mode } break; case 3: // Write tag mode - if (button_pressed > 0) { + if (button_pressed == BUTTON_HOLD) { // Long press - switch to select mode SpinDown(100); - LED_Slot(selected); + led_slot(selected); state = 0; - } else if (button_pressed < 0) { + } else if (button_pressed == BUTTON_SINGLE_CLICK) { // Click - write ID to tag - WriteEM410x(0, (uint32_t)(low[selected] >> 32), (uint32_t)(low[selected] & 0xffffffff)); - LED_Slot(selected); + copy_em410x_to_t55xx(0, LF_CLOCK, (uint32_t)(low[selected] >> 32), (uint32_t)(low[selected] & 0xffffffff)); + led_slot(selected); state = 0; // Switch to select mode } break; diff --git a/armsrc/Standalone/lf_hidbrute.c b/armsrc/Standalone/lf_hidbrute.c index 7cae49a5b..f0d8cae86 100644 --- a/armsrc/Standalone/lf_hidbrute.c +++ b/armsrc/Standalone/lf_hidbrute.c @@ -42,7 +42,7 @@ void ModInfo(void) { } // samy's sniff and repeat routine for LF -void RunMod() { +void RunMod(void) { StandAloneMode(); Dbprintf(">> LF HID corporate bruteforce a.k.a CorporateBrute Started <<"); FpgaDownloadAndGo(FPGA_BITSTREAM_LF); @@ -75,7 +75,7 @@ void RunMod() { // record DbpString("[=] starting recording"); - CmdHIDdemodFSK(1, &high[selected], &low[selected], 0); + lf_hid_watch(1, &high[selected], &low[selected]); Dbprintf("[=] recorded %x %x %08x", selected, high[selected], low[selected]); LEDsoff(); @@ -85,7 +85,7 @@ void RunMod() { // so next button push begins playing what we recorded playing = 0; cardRead = 1; - } else if (button_pressed > 0 && cardRead == 1) { + } else if (button_pressed == BUTTON_HOLD && cardRead == 1) { LEDsoff(); LED(selected + 1, 0); LED(LED_A, 0); @@ -109,7 +109,7 @@ void RunMod() { } // Change where to record (or begin playing) - else if (button_pressed) { + else if (button_pressed != BUTTON_NO_CLICK) { // Next option if we were previously playing if (playing) selected = (selected + 1) % OPTS; @@ -131,7 +131,7 @@ void RunMod() { CmdHIDsimTAG(0, high[selected], low[selected], 0, 0); DbpString("[=] done playing"); - if (BUTTON_HELD(1000) > 0) + if (BUTTON_HELD(1000) == BUTTON_HOLD) goto out; /* We pressed a button so ignore it here with a delay */ @@ -169,7 +169,7 @@ void RunMod() { // Needed for exiting from proxbrute when button is pressed if (BUTTON_PRESS()) { - if (BUTTON_HELD(1000) > 0) { + if (BUTTON_HELD(1000) == BUTTON_HOLD) { goto out; } else { while (BUTTON_PRESS()) { @@ -199,7 +199,7 @@ void RunMod() { // Needed for exiting from proxbrute when button is pressed if (BUTTON_PRESS()) { - if (BUTTON_HELD(1000) > 0) { + if (BUTTON_HELD(1000) == BUTTON_HOLD) { goto out; } else { while (BUTTON_PRESS()) { WDT_HIT(); } @@ -220,7 +220,7 @@ void RunMod() { } DbpString("[=] done bruteforcing"); - if (BUTTON_HELD(1000) > 0) + if (BUTTON_HELD(1000) == BUTTON_HOLD) goto out; /* We pressed a button so ignore it here with a delay */ diff --git a/armsrc/Standalone/lf_icehid.c b/armsrc/Standalone/lf_icehid.c index c71ff344d..d125b0c03 100644 --- a/armsrc/Standalone/lf_icehid.c +++ b/armsrc/Standalone/lf_icehid.c @@ -54,7 +54,7 @@ #define LF_HIDCOLLECT_LOGFILE "lf_hidcollect.log" -void DownloadLogInstructions() { +static void DownloadLogInstructions(void) { Dbprintf(""); Dbprintf("[=] To get the logfile from flash and display it:"); Dbprintf("[=] " _YELLOW_("1.") " mem spiffs dump o "LF_HIDCOLLECT_LOGFILE" f "LF_HIDCOLLECT_LOGFILE); @@ -64,7 +64,7 @@ void DownloadLogInstructions() { bool log_exists; -void append(uint8_t *entry, size_t entry_len) { +static void append(uint8_t *entry, size_t entry_len) { LED_B_ON(); if (log_exists == false) { @@ -76,7 +76,7 @@ void append(uint8_t *entry, size_t entry_len) { LED_B_OFF(); } -uint32_t IceEM410xdemod() { +static uint32_t IceEM410xdemod(void) { uint8_t *dest = BigBuf_get_addr(); size_t idx = 0; @@ -128,7 +128,7 @@ uint32_t IceEM410xdemod() { return PM3_SUCCESS; } -uint32_t IceAWIDdemod() { +static uint32_t IceAWIDdemod(void) { uint8_t *dest = BigBuf_get_addr(); size_t size = MIN(12800, BigBuf_max_traceLen()); @@ -180,7 +180,7 @@ uint32_t IceAWIDdemod() { return PM3_SUCCESS; } -uint32_t IceIOdemod() { +static uint32_t IceIOdemod(void) { int dummyIdx = 0; uint8_t version = 0, facilitycode = 0; @@ -224,14 +224,15 @@ uint32_t IceIOdemod() { return PM3_SUCCESS; } -uint32_t IceHIDDemod() { +static uint32_t IceHIDDemod(void) { int dummyIdx = 0; uint32_t hi2 = 0, hi = 0, lo = 0; // large enough to catch 2 sequences of largest format - size_t size = 50 * 128 * 2; // 12800 bytes +// size_t size = 50 * 128 * 2; // 12800 bytes + size_t size = MIN(12800, BigBuf_max_traceLen()); //uint8_t *dest = BigBuf_malloc(size); uint8_t *dest = BigBuf_get_addr(); @@ -320,7 +321,7 @@ void ModInfo(void) { DbpString(_YELLOW_(" LF HID / IOprox / AWID / EM4100 collector mode") " - a.k.a IceHID (Iceman)"); } -void RunMod() { +void RunMod(void) { FpgaDownloadAndGo(FPGA_BITSTREAM_LF); LFSetupFPGAForADC(LF_DIVISOR_125, true); @@ -350,30 +351,32 @@ void RunMod() { uint32_t res; - // since we steal 12800 from bigbuffer, no need to sample it. - DoAcquisition_config(false, 28000); + // since we steal 12800 from bigbuffer, no need to sample it. + size_t size = MIN(28000, BigBuf_max_traceLen()); + DoAcquisition_config(false, size); res = IceHIDDemod(); if (res == PM3_SUCCESS) { LED_A_OFF(); continue; } - DoAcquisition_config(false, 28000); + DoAcquisition_config(false, size); res = IceAWIDdemod(); if (res == PM3_SUCCESS) { LED_A_OFF(); continue; } - DoAcquisition_config(false, 20000); - res = IceEM410xdemod(); + DoAcquisition_config(false, size); + res = IceIOdemod(); if (res == PM3_SUCCESS) { LED_A_OFF(); continue; } - DoAcquisition_config(false, 28000); - res = IceIOdemod(); + size = MIN(20000, BigBuf_max_traceLen()); + DoAcquisition_config(false, size); + res = IceEM410xdemod(); if (res == PM3_SUCCESS) { LED_A_OFF(); continue; diff --git a/armsrc/Standalone/lf_proxbrute.c b/armsrc/Standalone/lf_proxbrute.c index 3cdfa6819..67ef436ce 100644 --- a/armsrc/Standalone/lf_proxbrute.c +++ b/armsrc/Standalone/lf_proxbrute.c @@ -23,7 +23,7 @@ void ModInfo(void) { } // samy's sniff and repeat routine for LF -void RunMod() { +void RunMod(void) { StandAloneMode(); Dbprintf(">> LF HID proxII bruteforce a.k.a ProxBrute Started (Brad Antoniewicz) <<"); FpgaDownloadAndGo(FPGA_BITSTREAM_LF); @@ -56,9 +56,8 @@ void RunMod() { DbpString("[=] starting recording"); - - // findone, high, low, no ledcontrol (A) - CmdHIDdemodFSK(1, &high, &low, 0); + // findone, high, low + lf_hid_watch(1, &high, &low); Dbprintf("[=] recorded | %x%08x", high, low); diff --git a/armsrc/Standalone/lf_samyrun.c b/armsrc/Standalone/lf_samyrun.c index 4dc45b0b3..9646dede3 100644 --- a/armsrc/Standalone/lf_samyrun.c +++ b/armsrc/Standalone/lf_samyrun.c @@ -31,7 +31,7 @@ void ModInfo(void) { // C = playing bank A // D = playing bank B -void RunMod() { +void RunMod(void) { StandAloneMode(); FpgaDownloadAndGo(FPGA_BITSTREAM_LF); Dbprintf(">> LF HID Read/Clone/Sim a.k.a SamyRun Started <<"); @@ -56,11 +56,6 @@ void RunMod() { int button_pressed = BUTTON_HELD(280); if (button_pressed != BUTTON_HOLD) continue; - /* - #define BUTTON_NO_CLICK 0 - #define BUTTON_SINGLE_CLICK -1 - #define BUTTON_DOUBLE_CLICK -2 - */ if (state == STATE_READ) { @@ -82,7 +77,7 @@ void RunMod() { // findone, high, low, no ledcontrol (A) uint32_t hi = 0, lo = 0; - CmdHIDdemodFSK(1, &hi, &lo, 0); + lf_hid_watch(1, &hi, &lo); high[selected] = hi; low[selected] = lo; diff --git a/armsrc/Standalone/lf_skeleton.c b/armsrc/Standalone/lf_skeleton.c index 0d00c698d..a2d566cb7 100644 --- a/armsrc/Standalone/lf_skeleton.c +++ b/armsrc/Standalone/lf_skeleton.c @@ -18,7 +18,7 @@ void ModInfo(void) { DbpString(" LF skeleton mode - aka Skeleton (iceman)"); } -void RunMod() { +void RunMod(void) { StandAloneMode(); Dbprintf("[=] LF skeleton code a.k.a Skeleton started"); FpgaDownloadAndGo(FPGA_BITSTREAM_LF); @@ -35,7 +35,7 @@ void RunMod() { Dbprintf("button %d", button_pressed); - if (button_pressed) + if (button_pressed != BUTTON_NO_CLICK) break; } diff --git a/armsrc/Standalone/placeholder.c b/armsrc/Standalone/placeholder.c index 84f724920..49028e27c 100644 --- a/armsrc/Standalone/placeholder.c +++ b/armsrc/Standalone/placeholder.c @@ -6,5 +6,5 @@ void ModInfo(void) { DbpString(" No standalone mode present"); } -void RunMod() { +void RunMod(void) { } diff --git a/armsrc/Standalone/readme.md b/armsrc/Standalone/readme.md index d46943778..3775d848c 100644 --- a/armsrc/Standalone/readme.md +++ b/armsrc/Standalone/readme.md @@ -131,7 +131,7 @@ Remember only one can be selected at a time for now. The final steps is to - force recompilation of all code. ```make clean``` -- compile ```make -j8``` +- compile ```make -j``` - flash your device - connect to your device - press button long time to trigger ledshow and enter your new standalone mode diff --git a/armsrc/Standalone/standalone.h b/armsrc/Standalone/standalone.h index 2dd35e94a..29363f82f 100644 --- a/armsrc/Standalone/standalone.h +++ b/armsrc/Standalone/standalone.h @@ -11,7 +11,7 @@ #ifndef __STANDALONE_H #define __STANDALONE_H -void RunMod(); -void ModInfo(); +void RunMod(void); +void ModInfo(void); #endif /* __STANDALONE_H */ diff --git a/armsrc/appmain.c b/armsrc/appmain.c index b05a143f0..ebb58a23f 100644 --- a/armsrc/appmain.c +++ b/armsrc/appmain.c @@ -20,6 +20,7 @@ #include "fpga.h" #include "fpgaloader.h" #include "string.h" +#include "printf.h" #include "legicrf.h" #include "BigBuf.h" #include "iso14443a.h" @@ -29,8 +30,10 @@ #include "felica.h" #include "hitag2.h" #include "hitagS.h" +#include "em4x50.h" #include "iclass.h" #include "legicrfsim.h" +//#include "cryptorfsim.h" #include "epa.h" #include "hfsnoop.h" #include "lfops.h" @@ -61,52 +64,20 @@ #include "spiffs.h" #endif -//============================================================================= -// A buffer where we can queue things up to be sent through the FPGA, for -// any purpose (fake tag, as reader, whatever). We go MSB first, since that -// is the order in which they go out on the wire. -//============================================================================= - -#define TOSEND_BUFFER_SIZE (9*MAX_FRAME_SIZE + 1 + 1 + 2) // 8 data bits and 1 parity bit per payload byte, 1 correction bit, 1 SOC bit, 2 EOC bits -uint8_t ToSend[TOSEND_BUFFER_SIZE]; -int ToSendMax = -1; -static int ToSendBit; +extern uint32_t _stack_start, _stack_end; struct common_area common_area __attribute__((section(".commonarea"))); -int button_status = BUTTON_NO_CLICK; -bool allow_send_wtx = false; +static int button_status = BUTTON_NO_CLICK; +static bool allow_send_wtx = false; -inline void send_wtx(uint16_t wtx) { +void send_wtx(uint16_t wtx) { if (allow_send_wtx) { reply_ng(CMD_WTX, PM3_SUCCESS, (uint8_t *)&wtx, sizeof(wtx)); } } -void ToSendReset(void) { - ToSendMax = -1; - ToSendBit = 8; -} - -void ToSendStuffBit(int b) { - if (ToSendBit >= 8) { - ToSendMax++; - ToSend[ToSendMax] = 0; - ToSendBit = 0; - } - - if (b) - ToSend[ToSendMax] |= (1 << (7 - ToSendBit)); - - ToSendBit++; - - if (ToSendMax >= sizeof(ToSend)) { - ToSendBit = 0; - DbpString("ToSendStuffBit overflowed!"); - } -} - //----------------------------------------------------------------------------- // Read an ADC channel and block till it completes, then return the result -// in ADC units (0 to 1023). Also a routine to average 32 samples and +// in ADC units (0 to 1023). Also a routine to sum up a number of samples and // return that. //----------------------------------------------------------------------------- static uint16_t ReadAdc(int ch) { @@ -136,15 +107,17 @@ static uint16_t ReadAdc(int ch) { // was static - merlok uint16_t AvgAdc(int ch) { - uint16_t a = 0; - for (uint8_t i = 0; i < 32; i++) - a += ReadAdc(ch); - - //division by 32 - return (a + 15) >> 5; + return SumAdc(ch, 32) >> 5; } -void MeasureAntennaTuning(void) { +uint16_t SumAdc(int ch, int NbSamples) { + uint16_t a = 0; + for (uint8_t i = 0; i < NbSamples; i++) + a += ReadAdc(ch); + return (a + (NbSamples >> 1) - 1); +} + +static void MeasureAntennaTuning(void) { uint32_t peak = 0; @@ -184,7 +157,7 @@ void MeasureAntennaTuning(void) { WDT_HIT(); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, i); SpinDelay(20); - uint32_t adcval = ((MAX_ADC_LF_VOLTAGE * AvgAdc(ADC_CHAN_LF)) >> 10); + uint32_t adcval = ((MAX_ADC_LF_VOLTAGE * (SumAdc(ADC_CHAN_LF, 32) >> 1)) >> 14); if (i == LF_DIVISOR_125) payload.v_lf125 = adcval; // voltage at 125kHz @@ -206,13 +179,13 @@ void MeasureAntennaTuning(void) { LED_A_ON(); // Let the FPGA drive the high-frequency antenna around 13.56 MHz. FpgaDownloadAndGo(FPGA_BITSTREAM_HF); - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR); + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER); SpinDelay(50); #if defined RDV4 - payload.v_hf = (MAX_ADC_HF_VOLTAGE_RDV40 * AvgAdc(ADC_CHAN_HF_RDV40)) >> 10; + payload.v_hf = (MAX_ADC_HF_VOLTAGE_RDV40 * SumAdc(ADC_CHAN_HF_RDV40, 32)) >> 15; #else - payload.v_hf = (MAX_ADC_HF_VOLTAGE * AvgAdc(ADC_CHAN_HF)) >> 10; + payload.v_hf = (MAX_ADC_HF_VOLTAGE * SumAdc(ADC_CHAN_HF, 32)) >> 15; #endif FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); @@ -221,19 +194,29 @@ void MeasureAntennaTuning(void) { } // Measure HF in milliVolt -uint16_t MeasureAntennaTuningHfData(void) { +static uint16_t MeasureAntennaTuningHfData(void) { #if defined RDV4 - return (MAX_ADC_HF_VOLTAGE_RDV40 * AvgAdc(ADC_CHAN_HF_RDV40)) >> 10; + return (MAX_ADC_HF_VOLTAGE_RDV40 * SumAdc(ADC_CHAN_HF_RDV40, 32)) >> 15; #else - return (MAX_ADC_HF_VOLTAGE * AvgAdc(ADC_CHAN_HF)) >> 10; + return (MAX_ADC_HF_VOLTAGE * SumAdc(ADC_CHAN_HF, 32)) >> 15; #endif } // Measure LF in milliVolt -uint32_t MeasureAntennaTuningLfData(void) { - return (MAX_ADC_LF_VOLTAGE * AvgAdc(ADC_CHAN_LF)) >> 10; +static uint32_t MeasureAntennaTuningLfData(void) { + return (MAX_ADC_LF_VOLTAGE * (SumAdc(ADC_CHAN_LF, 32) >> 1)) >> 14; +} + +void print_stack_usage(void) { + // pointer arithmetic is times 4. (two shifts to the left) + for (uint32_t *p = &_stack_start; ; ++p) { + if (*p != 0xdeadbeef) { + Dbprintf(" Max stack usage.........%d / %d bytes", (&_stack_end - p) << 2, (&_stack_end - &_stack_start) << 2); + break; + } + } } void ReadMem(int addr) { @@ -242,11 +225,10 @@ void ReadMem(int addr) { Dbprintf("%x: %02x %02x %02x %02x %02x %02x %02x %02x", addr, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]); } -/* osimage version information is linked in */ -extern struct version_information version_information; +/* osimage version information is linked in, cf commonutil.h */ /* bootrom version information is pointed to from _bootphase1_version_pointer */ extern char *_bootphase1_version_pointer, _flash_start, _flash_end, __data_src_start__; -void SendVersion(void) { +static void SendVersion(void) { char temp[PM3_CMD_DATA_SIZE - 12]; /* Limited data payload in USB packets */ char VersionString[PM3_CMD_DATA_SIZE - 12] = { '\0' }; @@ -256,17 +238,19 @@ void SendVersion(void) { */ char *bootrom_version = *(char **)&_bootphase1_version_pointer; - strncat(VersionString, " [ ARM ]\n", sizeof(VersionString) - strlen(VersionString) - 1); + strncat(VersionString, " [ "_YELLOW_("ARM")" ]\n", sizeof(VersionString) - strlen(VersionString) - 1); if (bootrom_version < &_flash_start || bootrom_version >= &_flash_end) { strcat(VersionString, "bootrom version information appears invalid\n"); } else { FormatVersionInformation(temp, sizeof(temp), " bootrom: ", bootrom_version); strncat(VersionString, temp, sizeof(VersionString) - strlen(VersionString) - 1); + strncat(VersionString, "\n", sizeof(VersionString) - strlen(VersionString) - 1); } FormatVersionInformation(temp, sizeof(temp), " os: ", &version_information); strncat(VersionString, temp, sizeof(VersionString) - strlen(VersionString) - 1); + strncat(VersionString, "\n", sizeof(VersionString) - strlen(VersionString) - 1); #if defined(__clang__) strncat(VersionString, " compiled with Clang/LLVM "__VERSION__"\n", sizeof(VersionString) - strlen(VersionString) - 1); @@ -274,11 +258,11 @@ void SendVersion(void) { strncat(VersionString, " compiled with GCC "__VERSION__"\n", sizeof(VersionString) - strlen(VersionString) - 1); #endif - strncat(VersionString, "\n [ FPGA ]\n ", sizeof(VersionString) - strlen(VersionString) - 1); + strncat(VersionString, "\n [ "_YELLOW_("FPGA")" ] \n ", sizeof(VersionString) - strlen(VersionString) - 1); - for (int i = 0; i < fpga_bitstream_num; i++) { - strncat(VersionString, fpga_version_information[i], sizeof(VersionString) - strlen(VersionString) - 1); - if (i < fpga_bitstream_num - 1) { + for (int i = 0; i < g_fpga_bitstream_num; i++) { + strncat(VersionString, g_fpga_version_information[i], sizeof(VersionString) - strlen(VersionString) - 1); + if (i < g_fpga_bitstream_num - 1) { strncat(VersionString, "\n ", sizeof(VersionString) - strlen(VersionString) - 1); } } @@ -302,7 +286,7 @@ void SendVersion(void) { reply_ng(CMD_VERSION, PM3_SUCCESS, (uint8_t *)&payload, 12 + payload.versionstr_len); } -void TimingIntervalAcquisition(void) { +static void TimingIntervalAcquisition(void) { // trigger new acquisition by turning main oscillator off and on mck_from_pll_to_slck(); mck_from_slck_to_pll(); @@ -310,10 +294,32 @@ void TimingIntervalAcquisition(void) { StartTickCount(); } +static void print_debug_level(void) { + char dbglvlstr[20] = {0}; + switch (DBGLEVEL) { + case DBG_NONE: + sprintf(dbglvlstr, "NONE"); + break; + case DBG_ERROR: + sprintf(dbglvlstr, "ERROR"); + break; + case DBG_INFO: + sprintf(dbglvlstr, "INFO"); + break; + case DBG_DEBUG: + sprintf(dbglvlstr, "DEBUG"); + break; + case DBG_EXTENDED: + sprintf(dbglvlstr, "EXTENDED"); + break; + } + Dbprintf(" DBGLEVEL................%d ( " _YELLOW_("%s")" )", DBGLEVEL, dbglvlstr); +} + // measure the Connection Speed by sending SpeedTestBufferSize bytes to client and measuring the elapsed time. // Note: this mimics GetFromBigbuf(), i.e. we have the overhead of the PacketCommandNG structure included. -void printConnSpeed(void) { - DbpString(_BLUE_("Transfer Speed")); +static void printConnSpeed(void) { + DbpString(_CYAN_("Transfer Speed")); Dbprintf(" Sending packets to client..."); #define CONN_SPEED_TEST_MIN_TIME 500 // in milliseconds @@ -339,7 +345,7 @@ void printConnSpeed(void) { /** * Prints runtime information about the PM3. **/ -void SendStatus(void) { +static void SendStatus(void) { BigBuf_print_status(); Fpga_print_status(); #ifdef WITH_FLASH @@ -353,10 +359,13 @@ void SendStatus(void) { printT55xxConfig(); // LF T55XX Config #endif printConnSpeed(); - DbpString(_BLUE_("Various")); - Dbprintf(" DBGLEVEL................%d", DBGLEVEL); - Dbprintf(" ToSendMax...............%d", ToSendMax); - Dbprintf(" ToSendBit...............%d", ToSendBit); + DbpString(_CYAN_("Various")); + + print_stack_usage(); + print_debug_level(); + + tosend_t *ts = get_tosend(); + Dbprintf(" ToSendMax...............%d", ts->max); Dbprintf(" ToSend BUFFERSIZE.......%d", TOSEND_BUFFER_SIZE); while ((AT91C_BASE_PMC->PMC_MCFR & AT91C_CKGR_MAINRDY) == 0); // Wait for MAINF value to become available... uint16_t mainf = AT91C_BASE_PMC->PMC_MCFR & AT91C_CKGR_MAINF; // Get # main clocks within 16 slow clocks @@ -372,7 +381,7 @@ void SendStatus(void) { Dbprintf(_YELLOW_(" Slow Clock actual speed seems closer to %d kHz"), (16 * MAINCK / 1000) / mainf * delta_time / SLCK_CHECK_MS); } - DbpString(_BLUE_("Installed StandAlone Mode")); + DbpString(_CYAN_("Installed StandAlone Mode")); ModInfo(); #ifdef WITH_FLASH @@ -382,15 +391,16 @@ void SendStatus(void) { reply_ng(CMD_STATUS, PM3_SUCCESS, NULL, 0); } -void SendCapabilities(void) { +static void SendCapabilities(void) { capabilities_t capabilities; capabilities.version = CAPABILITIES_VERSION; - capabilities.via_fpc = reply_via_fpc; - capabilities.via_usb = reply_via_usb; + capabilities.via_fpc = g_reply_via_fpc; + capabilities.via_usb = g_reply_via_usb; + capabilities.bigbuf_size = BigBuf_get_size(); capabilities.baudrate = 0; // no real baudrate for USB-CDC #ifdef WITH_FPC_USART - if (reply_via_fpc) - capabilities.baudrate = usart_baudrate; + if (g_reply_via_fpc) + capabilities.baudrate = g_usart_baudrate; #endif #ifdef WITH_FLASH @@ -433,6 +443,11 @@ void SendCapabilities(void) { #else capabilities.compiled_with_hitag = false; #endif +#ifdef WITH_EM4x50 + capabilities.compiled_with_em4x50 = true; +#else + capabilities.compiled_with_em4x50 = false; +#endif #ifdef WITH_HFSNIFF capabilities.compiled_with_hfsniff = true; #else @@ -488,6 +503,7 @@ void SendCapabilities(void) { // Show some leds in a pattern to identify StandAlone mod is running void StandAloneMode(void) { + DbpString(""); DbpString("Stand-alone mode, no computer necessary"); SpinDown(50); SpinDelay(50); @@ -524,7 +540,7 @@ at the same place! :-) void ListenReaderField(uint8_t limit) { #define LF_ONLY 1 #define HF_ONLY 2 -#define REPORT_CHANGE 10 // report new values only if they have changed at least by REPORT_CHANGE +#define REPORT_CHANGE 1000 // report new values only if they have changed at least by REPORT_CHANGE mV uint16_t lf_av = 0, lf_av_new, lf_baseline = 0, lf_max = 0; uint16_t hf_av = 0, hf_av_new, hf_baseline = 0, hf_max = 0; @@ -538,8 +554,8 @@ void ListenReaderField(uint8_t limit) { LEDsoff(); if (limit == LF_ONLY) { - lf_av = lf_max = AvgAdc(ADC_CHAN_LF); - Dbprintf("LF 125/134kHz Baseline: %dmV", (MAX_ADC_LF_VOLTAGE * lf_av) >> 10); + lf_av = lf_max = (MAX_ADC_LF_VOLTAGE * SumAdc(ADC_CHAN_LF, 32)) >> 15; + Dbprintf("LF 125/134kHz Baseline: %dmV", lf_av); lf_baseline = lf_av; } @@ -547,11 +563,11 @@ void ListenReaderField(uint8_t limit) { #if defined RDV4 // iceman, useless, since we are measuring readerfield, not our field. My tests shows a max of 20v from a reader. - hf_av = hf_max = AvgAdc(ADC_CHAN_HF_RDV40); + hf_av = hf_max = (MAX_ADC_HF_VOLTAGE_RDV40 * SumAdc(ADC_CHAN_HF_RDV40, 32)) >> 15; #else - hf_av = hf_max = AvgAdc(ADC_CHAN_HF); + hf_av = hf_max = (MAX_ADC_HF_VOLTAGE * SumAdc(ADC_CHAN_HF, 32)) >> 15; #endif - Dbprintf("HF 13.56MHz Baseline: %dmV", (MAX_ADC_HF_VOLTAGE * hf_av) >> 10); + Dbprintf("HF 13.56MHz Baseline: %dmV", hf_av); hf_baseline = hf_av; } @@ -583,10 +599,10 @@ void ListenReaderField(uint8_t limit) { LED_D_OFF(); } - lf_av_new = AvgAdc(ADC_CHAN_LF); + lf_av_new = (MAX_ADC_LF_VOLTAGE * SumAdc(ADC_CHAN_LF, 32)) >> 15; // see if there's a significant change if (ABS(lf_av - lf_av_new) > REPORT_CHANGE) { - Dbprintf("LF 125/134kHz Field Change: %5dmV", (MAX_ADC_LF_VOLTAGE * lf_av_new) >> 10); + Dbprintf("LF 125/134kHz Field Change: %5dmV", lf_av_new); lf_av = lf_av_new; if (lf_av > lf_max) lf_max = lf_av; @@ -602,13 +618,13 @@ void ListenReaderField(uint8_t limit) { } #if defined RDV4 - hf_av_new = AvgAdc(ADC_CHAN_HF_RDV40); + hf_av_new = (MAX_ADC_HF_VOLTAGE_RDV40 * SumAdc(ADC_CHAN_HF_RDV40, 32)) >> 15; #else - hf_av_new = AvgAdc(ADC_CHAN_HF); + hf_av_new = (MAX_ADC_HF_VOLTAGE * SumAdc(ADC_CHAN_HF, 32)) >> 15; #endif // see if there's a significant change if (ABS(hf_av - hf_av_new) > REPORT_CHANGE) { - Dbprintf("HF 13.56MHz Field Change: %5dmV", (MAX_ADC_HF_VOLTAGE * hf_av_new) >> 10); + Dbprintf("HF 13.56MHz Field Change: %5dmV", hf_av_new); hf_av = hf_av_new; if (hf_av > hf_max) hf_max = hf_av; @@ -701,14 +717,14 @@ static void PacketReceived(PacketCommandNG *packet) { case CMD_BREAK_LOOP: break; case CMD_QUIT_SESSION: { - reply_via_fpc = false; - reply_via_usb = false; + g_reply_via_fpc = false; + g_reply_via_usb = false; break; } // emulator case CMD_SET_DBGMODE: { DBGLEVEL = packet->data.asBytes[0]; - Dbprintf("Debug level: %d", DBGLEVEL); + print_debug_level(); reply_ng(CMD_SET_DBGMODE, PM3_SUCCESS, NULL, 0); break; } @@ -763,9 +779,10 @@ static void PacketReceived(PacketCommandNG *packet) { reply_mix(CMD_ACK, bits, 0, 0, 0, 0); break; } - case CMD_LF_HID_DEMOD: { + case CMD_LF_HID_WATCH: { uint32_t high, low; - CmdHIDdemodFSK(0, &high, &low, 1); + int res = lf_hid_watch(0, &high, &low); + reply_ng(CMD_LF_HID_WATCH, res, NULL, 0); break; } case CMD_LF_HID_SIMULATE: { @@ -797,19 +814,29 @@ static void PacketReceived(PacketCommandNG *packet) { CopyHIDtoT55x7(packet->oldarg[0], packet->oldarg[1], packet->oldarg[2], packet->data.asBytes[0]); break; } - case CMD_LF_IO_DEMOD: { + case CMD_LF_IO_WATCH: { uint32_t high, low; - CmdIOdemodFSK(0, &high, &low, 1); + int res = lf_io_watch(0, &high, &low); + reply_ng(CMD_LF_IO_WATCH, res, NULL, 0); break; } - case CMD_LF_EM410X_DEMOD: { + case CMD_LF_EM410X_WATCH: { uint32_t high; uint64_t low; - CmdEM410xdemod(packet->oldarg[0], &high, &low, 1); + int res = lf_em410x_watch(0, &high, &low); + reply_ng(CMD_LF_EM410X_WATCH, res, NULL, 0); break; } case CMD_LF_EM410X_WRITE: { - WriteEM410x(packet->oldarg[0], packet->oldarg[1], packet->oldarg[2]); + struct p { + uint8_t card; + uint8_t clock; + uint32_t high; + uint32_t low; + } PACKED; + struct p *payload = (struct p *)packet->data.asBytes; + int res = copy_em410x_to_t55xx(payload->card, payload->clock, payload->high, payload->low); + reply_ng(CMD_LF_EM410X_WRITE, res, NULL, 0); break; } case CMD_LF_TI_READ: { @@ -911,10 +938,10 @@ static void PacketReceived(PacketCommandNG *packet) { EM4xWriteWord(payload->address, payload->data, payload->password, payload->usepwd); break; } - case CMD_LF_AWID_DEMOD: { + case CMD_LF_AWID_WATCH: { uint32_t high, low; - // Set realtime AWID demodulation - CmdAWIDdemodFSK(0, &high, &low, 1); + int res = lf_awid_watch(0, &high, &low); + reply_ng(CMD_LF_AWID_WATCH, res, NULL, 0); break; } case CMD_LF_VIKING_CLONE: { @@ -927,7 +954,11 @@ static void PacketReceived(PacketCommandNG *packet) { break; } case CMD_LF_COTAG_READ: { - Cotag(packet->oldarg[0]); + struct p { + uint8_t mode; + } PACKED; + struct p *payload = (struct p *)packet->data.asBytes; + Cotag(payload->mode); break; } #endif @@ -936,6 +967,7 @@ static void PacketReceived(PacketCommandNG *packet) { case CMD_LF_HITAG_SNIFF: { // Eavesdrop Hitag tag, args = type SniffHitag2(); // SniffHitag2(packet->oldarg[0]); + reply_ng(CMD_LF_HITAG_SNIFF, PM3_SUCCESS, NULL, 0); break; } case CMD_LF_HITAG_SIMULATE: { // Simulate Hitag tag, args = memory content @@ -968,13 +1000,37 @@ static void PacketReceived(PacketCommandNG *packet) { } #endif +#ifdef WITH_EM4x50 + case CMD_LF_EM4X50_INFO: { + em4x50_info((em4x50_data_t *)packet->data.asBytes); + break; + } + case CMD_LF_EM4X50_WRITE: { + em4x50_write((em4x50_data_t *)packet->data.asBytes); + break; + } + case CMD_LF_EM4X50_WRITE_PASSWORD: { + em4x50_write_password((em4x50_data_t *)packet->data.asBytes); + break; + } + case CMD_LF_EM4X50_READ: { + em4x50_read((em4x50_data_t *)packet->data.asBytes); + break; + } + case CMD_LF_EM4X50_WIPE: { + em4x50_wipe((em4x50_data_t *)packet->data.asBytes); + break; + } +#endif + #ifdef WITH_ISO15693 case CMD_HF_ISO15693_ACQ_RAW_ADC: { AcquireRawAdcSamplesIso15693(); break; } - case CMD_HF_ISO15693_RAWADC: { - RecordRawAdcSamplesIso15693(); + case CMD_HF_ISO15693_SNIFF: { + SniffIso15693(0, NULL); + reply_ng(CMD_HF_ISO15693_SNIFF, PM3_SUCCESS, NULL, 0); break; } case CMD_HF_ISO15693_COMMAND: { @@ -990,9 +1046,21 @@ static void PacketReceived(PacketCommandNG *packet) { break; } case CMD_HF_ISO15693_SIMULATE: { - SimTagIso15693(packet->oldarg[0], packet->data.asBytes); + struct p { + uint8_t uid[8]; + } PACKED; + struct p *payload = (struct p *) packet->data.asBytes; + SimTagIso15693(payload->uid); break; } + case CMD_HF_ISO15693_CSETUID: { + struct p { + uint8_t uid[8]; + } PACKED; + struct p *payload = (struct p *) packet->data.asBytes; + SetTag15693Uid(payload->uid); + break; + } #endif #ifdef WITH_LEGICRF @@ -1033,6 +1101,7 @@ static void PacketReceived(PacketCommandNG *packet) { } case CMD_HF_ISO14443B_SNIFF: { SniffIso14443b(); + reply_ng(CMD_HF_ISO14443B_SNIFF, PM3_SUCCESS, NULL, 0); break; } case CMD_HF_ISO14443B_SIMULATE: { @@ -1044,6 +1113,10 @@ static void PacketReceived(PacketCommandNG *packet) { SendRawCommand14443B_Ex(packet); break; } + case CMD_HF_CRYPTORF_SIM : { +// simulate_crf_tag(); + break; + } #endif #ifdef WITH_FELICA @@ -1057,6 +1130,7 @@ static void PacketReceived(PacketCommandNG *packet) { } case CMD_HF_FELICA_SNIFF: { felica_sniff(packet->oldarg[0], packet->oldarg[1]); + reply_ng(CMD_HF_FELICA_SNIFF, PM3_SUCCESS, NULL, 0); break; } case CMD_HF_FELICALITE_DUMP: { @@ -1068,6 +1142,7 @@ static void PacketReceived(PacketCommandNG *packet) { #ifdef WITH_ISO14443a case CMD_HF_ISO14443A_SNIFF: { SniffIso14443a(packet->data.asBytes[0]); + reply_ng(CMD_HF_ISO14443A_SNIFF, PM3_SUCCESS, NULL, 0); break; } case CMD_HF_ISO14443A_READER: { @@ -1318,7 +1393,13 @@ static void PacketReceived(PacketCommandNG *packet) { #ifdef WITH_ICLASS // Makes use of ISO14443a FPGA Firmware case CMD_HF_ICLASS_SNIFF: { - SniffIClass(); + struct p { + uint8_t jam_search_len; + uint8_t jam_search_string[]; + } PACKED; + struct p *payload = (struct p *) packet->data.asBytes; + SniffIClass(payload->jam_search_len, payload->jam_search_string); + reply_ng(CMD_HF_ICLASS_SNIFF, PM3_SUCCESS, NULL, 0); break; } case CMD_HF_ICLASS_SIMULATE: { @@ -1330,7 +1411,12 @@ static void PacketReceived(PacketCommandNG *packet) { break; } case CMD_HF_ICLASS_REPLAY: { - ReaderIClass_Replay(packet->oldarg[0], packet->data.asBytes); + struct p { + uint8_t reader[4]; + uint8_t mac[4]; + } PACKED; + struct p *payload = (struct p *) packet->data.asBytes; + ReaderIClass_Replay(payload->reader, payload->mac); break; } case CMD_HF_ICLASS_EML_MEMSET: { @@ -1340,36 +1426,14 @@ static void PacketReceived(PacketCommandNG *packet) { break; } case CMD_HF_ICLASS_WRITEBL: { - struct p { - uint8_t blockno; - uint8_t data[12]; - } PACKED; - struct p *payload = (struct p *)packet->data.asBytes; - iClass_WriteBlock(payload->blockno, payload->data); - break; - } - // iceman2019, unused? - case CMD_HF_ICLASS_READCHECK: { // auth step 1 - iClass_ReadCheck(packet->oldarg[0], packet->oldarg[1]); + iClass_WriteBlock(packet->data.asBytes); break; } case CMD_HF_ICLASS_READBL: { - /* - struct p { - uint8_t blockno; - } PACKED; - struct p *payload = (struct p *)packet->data.asBytes; - */ - iClass_ReadBlk(packet->data.asBytes[0]); + iClass_ReadBlock(packet->data.asBytes); break; } case CMD_HF_ICLASS_AUTH: { //check - /* - struct p { - uint8_t mac[4]; - } PACKED; - struct p *payload = (struct p *)packet->data.asBytes; - */ iClass_Authentication(packet->data.asBytes); break; } @@ -1378,7 +1442,7 @@ static void PacketReceived(PacketCommandNG *packet) { break; } case CMD_HF_ICLASS_DUMP: { - iClass_Dump(packet->oldarg[0], packet->oldarg[1]); + iClass_Dump(packet->data.asBytes); break; } case CMD_HF_ICLASS_CLONE: { @@ -1391,11 +1455,28 @@ static void PacketReceived(PacketCommandNG *packet) { iClass_Clone(payload->startblock, payload->endblock, payload->data); break; } + case CMD_HF_ICLASS_RESTORE: { + iClass_Restore(packet->data.asBytes); + break; + } #endif #ifdef WITH_HFSNIFF case CMD_HF_SNIFF: { - HfSniff(packet->oldarg[0], packet->oldarg[1]); + struct p { + uint32_t samplesToSkip; + uint32_t triggersToSkip; + } PACKED; + struct p *payload = (struct p *)packet->data.asBytes; + + uint16_t len = 0; + int res = HfSniff(payload->samplesToSkip, payload->triggersToSkip, &len); + + struct { + uint16_t len; + } PACKED retval; + retval.len = len; + reply_ng(CMD_HF_SNIFF, res, (uint8_t *)&retval, sizeof(retval)); break; } #endif @@ -1428,7 +1509,7 @@ static void PacketReceived(PacketCommandNG *packet) { // upload file from client uint8_t *mem = BigBuf_get_addr(); memcpy(mem + packet->oldarg[0], packet->data.asBytes, PM3_CMD_DATA_SIZE); - reply_old(CMD_ACK, 1, 0, 0, 0, 0); + reply_mix(CMD_ACK, 1, 0, 0, 0, 0); break; } case CMD_SMART_UPGRADE: { @@ -1545,7 +1626,7 @@ static void PacketReceived(PacketCommandNG *packet) { case 1: // MEASURE_ANTENNA_TUNING_HF_START // Let the FPGA drive the high-frequency antenna around 13.56 MHz. FpgaDownloadAndGo(FPGA_BITSTREAM_HF); - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR); + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER); reply_ng(CMD_MEASURE_ANTENNA_TUNING_HF, PM3_SUCCESS, NULL, 0); break; case 2: @@ -1628,7 +1709,7 @@ static void PacketReceived(PacketCommandNG *packet) { // arg1 = RFU // arg2 = tracelen? // asbytes = samplingconfig array - reply_old(CMD_ACK, 1, 0, BigBuf_get_traceLen(), getSamplingConfig(), sizeof(sample_config)); + reply_mix(CMD_ACK, 1, 0, BigBuf_get_traceLen(), getSamplingConfig(), sizeof(sample_config)); LED_B_OFF(); break; } @@ -1642,7 +1723,7 @@ static void PacketReceived(PacketCommandNG *packet) { struct p { uint8_t flag; uint16_t offset; - uint8_t *data; + uint8_t data[PM3_CMD_DATA_SIZE - sizeof(uint8_t) - sizeof(uint16_t)]; } PACKED; struct p *payload = (struct p *)packet->data.asBytes; @@ -1653,18 +1734,17 @@ static void PacketReceived(PacketCommandNG *packet) { BigBuf_free(); } - // 40 000 - (512-3) 509 = 39491 - uint16_t offset = MIN(BIGBUF_SIZE - PM3_CMD_DATA_SIZE - 3, payload->offset); - - // need to copy len bytes of data, not PM3_CMD_DATA_SIZE - 3 - offset + // offset should not be over buffer + if (payload->offset >= BigBuf_get_size()) { + reply_ng(CMD_LF_UPLOAD_SIM_SAMPLES, PM3_EOVFLOW, NULL, 0); + break; + } // ensure len bytes copied wont go past end of bigbuf - uint16_t len = MIN(BIGBUF_SIZE - offset, PM3_CMD_DATA_SIZE - 3); + uint16_t len = MIN(BigBuf_get_size() - payload->offset, sizeof(payload->data)); uint8_t *mem = BigBuf_get_addr(); - // x + 394 - memcpy(mem + offset, &payload->data, len); - // memcpy(mem + offset, &payload->data, PM3_CMD_DATA_SIZE - 3 - offset); + memcpy(mem + payload->offset, &payload->data, len); reply_ng(CMD_LF_UPLOAD_SIM_SAMPLES, PM3_SUCCESS, NULL, 0); break; } @@ -1760,7 +1840,7 @@ static void PacketReceived(PacketCommandNG *packet) { int changed = rdv40_spiffs_lazy_mount(); uint32_t size = size_in_spiffs((char *)filename); if (changed) rdv40_spiffs_lazy_unmount(); - reply_old(CMD_ACK, size, 0, 0, 0, 0); + reply_mix(CMD_ACK, size, 0, 0, 0, 0); LED_B_OFF(); break; } @@ -1833,6 +1913,13 @@ static void PacketReceived(PacketCommandNG *packet) { LED_B_OFF(); break; } + case CMD_SPIFFS_WIPE: { + LED_B_ON(); + rdv40_spiffs_safe_wipe(); + reply_ng(CMD_SPIFFS_WIPE, PM3_SUCCESS, NULL, 0); + LED_B_OFF(); + break; + } case CMD_FLASHMEM_SET_SPIBAUDRATE: { if (packet->length != sizeof(uint32_t)) break; @@ -1936,7 +2023,7 @@ static void PacketReceived(PacketCommandNG *packet) { Flash_UniqueID(info->flashid); FlashStop(); } - reply_old(CMD_ACK, isok, 0, 0, info, sizeof(rdv40_validation_t)); + reply_mix(CMD_ACK, isok, 0, 0, info, sizeof(rdv40_validation_t)); BigBuf_free(); LED_B_OFF(); @@ -1990,6 +2077,8 @@ static void PacketReceived(PacketCommandNG *packet) { break; } case CMD_STANDALONE: { + uint8_t *bb = BigBuf_get_EM_addr(); + bb[0] = packet->data.asBytes[0]; RunMod(); break; } @@ -2050,7 +2139,11 @@ static void PacketReceived(PacketCommandNG *packet) { void __attribute__((noreturn)) AppMain(void) { SpinDelay(100); - clear_trace(); + BigBuf_initialize(); + + for (uint32_t *p = &_stack_start; p < (uint32_t *)((uintptr_t)&_stack_end - 0x200); ++p) { + *p = 0xdeadbeef; + } if (common_area.magic != COMMON_AREA_MAGIC || common_area.version != 1) { /* Initialize common area */ @@ -2117,6 +2210,12 @@ void __attribute__((noreturn)) AppMain(void) { for (;;) { WDT_HIT(); + if (_stack_start != 0xdeadbeef) { + Dbprintf("Stack overflow detected! Please increase stack size, currently %d bytes", (&_stack_end - &_stack_start) << 2); + Dbprintf("Unplug your device now."); + while (1); + } + // Check if there is a packet available PacketCommandNG rx; memset(&rx.data, 0, sizeof(rx.data)); diff --git a/armsrc/appmain.h b/armsrc/appmain.h index 141c943f9..594723983 100644 --- a/armsrc/appmain.h +++ b/armsrc/appmain.h @@ -13,10 +13,8 @@ #include "common.h" -extern const uint8_t OddByteParity[256]; -extern int rsamples; // = 0; -extern uint8_t trigger; -extern bool allow_send_wtx; +extern int g_rsamples; // = 0; +extern uint8_t g_trigger; // ADC Vref = 3300mV, and an (10M+1M):1M voltage divider on the HF input can measure voltages up to 36300 mV #define MAX_ADC_HF_VOLTAGE 36300 @@ -33,6 +31,7 @@ void ReadMem(int addr); void __attribute__((noreturn)) AppMain(void); uint16_t AvgAdc(int ch); +uint16_t SumAdc(int ch, int NbSamples); //void PrintToSendBuffer(void); void ToSendStuffBit(int b); @@ -40,5 +39,6 @@ void ToSendReset(void); void ListenReaderField(uint8_t limit); void StandAloneMode(void); void printStandAloneModes(void); +void print_stack_usage(void); #endif diff --git a/armsrc/cmd.c b/armsrc/cmd.c index c7f76960b..b0dc4aef8 100644 --- a/armsrc/cmd.c +++ b/armsrc/cmd.c @@ -36,11 +36,11 @@ #include "string.h" // Flags to tell where to add CRC on sent replies -bool reply_with_crc_on_usb = false; -bool reply_with_crc_on_fpc = true; +bool g_reply_with_crc_on_usb = false; +bool g_reply_with_crc_on_fpc = true; // "Session" flag, to tell via which interface next msgs should be sent: USB or FPC USART -bool reply_via_fpc = false; -bool reply_via_usb = false; +bool g_reply_via_fpc = false; +bool g_reply_via_usb = false; int reply_old(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *data, size_t len) { PacketResponseOLD txcmd = {CMD_UNKNOWN, {0, 0, 0}, {{0}}}; @@ -62,15 +62,17 @@ int reply_old(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *d } } +#ifdef WITH_FPC_USART_HOST int resultfpc = PM3_EUNDEF; +#endif int resultusb = PM3_EUNDEF; // Send frame and make sure all bytes are transmitted - if (reply_via_usb) { + if (g_reply_via_usb) { resultusb = usb_write((uint8_t *)&txcmd, sizeof(PacketResponseOLD)); } - if (reply_via_fpc) { + if (g_reply_via_fpc) { #ifdef WITH_FPC_USART_HOST resultfpc = usart_writebuffer_sync((uint8_t *)&txcmd, sizeof(PacketResponseOLD)); #else @@ -78,8 +80,10 @@ int reply_old(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *d #endif } // we got two results, let's prioritize the faulty one and USB over FPC. - if (reply_via_usb && (resultusb != PM3_SUCCESS)) return resultusb; - if (reply_via_fpc && (resultfpc != PM3_SUCCESS)) return resultfpc; + if (g_reply_via_usb && (resultusb != PM3_SUCCESS)) return resultusb; +#ifdef WITH_FPC_USART_HOST + if (g_reply_via_fpc && (resultfpc != PM3_SUCCESS)) return resultfpc; +#endif return PM3_SUCCESS; } @@ -108,7 +112,7 @@ static int reply_ng_internal(uint16_t cmd, int16_t status, uint8_t *data, size_t PacketResponseNGPostamble *tx_post = (PacketResponseNGPostamble *)((uint8_t *)&txBufferNG + sizeof(PacketResponseNGPreamble) + len); // Note: if we send to both FPC & USB, we'll set CRC for both if any of them require CRC - if ((reply_via_fpc && reply_with_crc_on_fpc) || ((reply_via_usb) && reply_with_crc_on_usb)) { + if ((g_reply_via_fpc && g_reply_with_crc_on_fpc) || ((g_reply_via_usb) && g_reply_with_crc_on_usb)) { uint8_t first, second; compute_crc(CRC_14443_A, (uint8_t *)&txBufferNG, sizeof(PacketResponseNGPreamble) + len, &first, &second); tx_post->crc = (first << 8) + second; @@ -117,14 +121,16 @@ static int reply_ng_internal(uint16_t cmd, int16_t status, uint8_t *data, size_t } txBufferNGLen = sizeof(PacketResponseNGPreamble) + len + sizeof(PacketResponseNGPostamble); +#ifdef WITH_FPC_USART_HOST int resultfpc = PM3_EUNDEF; +#endif int resultusb = PM3_EUNDEF; // Send frame and make sure all bytes are transmitted - if (reply_via_usb) { + if (g_reply_via_usb) { resultusb = usb_write((uint8_t *)&txBufferNG, txBufferNGLen); } - if (reply_via_fpc) { + if (g_reply_via_fpc) { #ifdef WITH_FPC_USART_HOST resultfpc = usart_writebuffer_sync((uint8_t *)&txBufferNG, txBufferNGLen); #else @@ -132,8 +138,10 @@ static int reply_ng_internal(uint16_t cmd, int16_t status, uint8_t *data, size_t #endif } // we got two results, let's prioritize the faulty one and USB over FPC. - if (reply_via_usb && (resultusb != PM3_SUCCESS)) return resultusb; - if (reply_via_fpc && (resultfpc != PM3_SUCCESS)) return resultfpc; + if (g_reply_via_usb && (resultusb != PM3_SUCCESS)) return resultusb; +#ifdef WITH_FPC_USART_HOST + if (g_reply_via_fpc && (resultfpc != PM3_SUCCESS)) return resultfpc; +#endif return PM3_SUCCESS; } @@ -208,8 +216,8 @@ static int receive_ng_internal(PacketCommandNG *rx, uint32_t read_ng(uint8_t *da if ((first << 8) + second != rx->crc) return PM3_EIO; } - reply_via_usb = usb; - reply_via_fpc = fpc; + g_reply_via_usb = usb; + g_reply_via_fpc = fpc; } else { // Old style command PacketCommandOLD rx_old; memcpy(&rx_old, &rx_raw.pre, sizeof(PacketCommandNGPreamble)); @@ -217,8 +225,8 @@ static int receive_ng_internal(PacketCommandNG *rx, uint32_t read_ng(uint8_t *da if (bytes != sizeof(PacketCommandOLD) - sizeof(PacketCommandNGPreamble)) return PM3_EIO; - reply_via_usb = usb; - reply_via_fpc = fpc; + g_reply_via_usb = usb; + g_reply_via_fpc = fpc; rx->ng = false; rx->magic = 0; rx->crc = 0; diff --git a/armsrc/cmd.h b/armsrc/cmd.h index e04f397a3..f4ae95ab1 100644 --- a/armsrc/cmd.h +++ b/armsrc/cmd.h @@ -37,11 +37,11 @@ #include "pm3_cmd.h" // Flags to tell where to add CRC on sent replies -extern bool reply_with_crc_on_usb; -extern bool reply_with_crc_on_fpc; +extern bool g_reply_with_crc_on_usb; +extern bool g_reply_with_crc_on_fpc; // "Session" flag, to tell via which interface next msgs should be sent: USB and/or FPC USART -extern bool reply_via_fpc; -extern bool reply_via_usb; +extern bool g_reply_via_fpc; +extern bool g_reply_via_usb; int reply_old(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *data, size_t len); int reply_ng(uint16_t cmd, int16_t status, uint8_t *data, size_t len); diff --git a/armsrc/dbprint.c b/armsrc/dbprint.c index 9b18b7aca..bfeb0ded2 100644 --- a/armsrc/dbprint.c +++ b/armsrc/dbprint.c @@ -22,7 +22,7 @@ // Debug print functions, to go out over USB, to the usual PC-side client. //============================================================================= -void DbpStringEx(uint32_t flags, char *src, size_t srclen) { +void DbpStringEx(uint32_t flags, const char *src, size_t srclen) { #if DEBUG struct { uint16_t flag; @@ -35,7 +35,7 @@ void DbpStringEx(uint32_t flags, char *src, size_t srclen) { #endif } -void DbpString(char *str) { +void DbpString(const char *str) { #if DEBUG DbpStringEx(FLAG_LOG, str, strlen(str)); #endif @@ -98,7 +98,7 @@ void Dbhexdump(int len, uint8_t *d, bool bAsci) { #endif } -void print_result(char *name, uint8_t *buf, size_t len) { +void print_result(const char *name, uint8_t *buf, size_t len) { uint8_t *p = buf; uint16_t tmp = len & 0xFFF0; diff --git a/armsrc/dbprint.h b/armsrc/dbprint.h index c3229f46f..993e06289 100644 --- a/armsrc/dbprint.h +++ b/armsrc/dbprint.h @@ -15,39 +15,39 @@ #include "ansi.h" #define Dbprintf_usb(...) {\ - bool tmpfpc = reply_via_fpc;\ - bool tmpusb = reply_via_usb;\ - reply_via_fpc = false;\ - reply_via_usb = true;\ + bool tmpfpc = g_reply_via_fpc;\ + bool tmpusb = g_reply_via_usb;\ + g_reply_via_fpc = false;\ + g_reply_via_usb = true;\ Dbprintf(__VA_ARGS__);\ - reply_via_fpc = tmpfpc;\ - reply_via_usb = tmpusb;} + g_reply_via_fpc = tmpfpc;\ + g_reply_via_usb = tmpusb;} #define Dbprintf_fpc(...) {\ - bool tmpfpc = reply_via_fpc;\ - bool tmpusb = reply_via_usb;\ - reply_via_fpc = true;\ - reply_via_usb = false;\ + bool tmpfpc = g_reply_via_fpc;\ + bool tmpusb = g_reply_via_usb;\ + g_reply_via_fpc = true;\ + g_reply_via_usb = false;\ Dbprintf(__VA_ARGS__);\ - reply_via_fpc = tmpfpc;\ - reply_via_usb = tmpusb;} + g_reply_via_fpc = tmpfpc;\ + g_reply_via_usb = tmpusb;} #define Dbprintf_all(...) {\ - bool tmpfpc = reply_via_fpc;\ - bool tmpusb = reply_via_usb;\ - reply_via_fpc = true;\ - reply_via_usb = true;\ + bool tmpfpc = g_reply_via_fpc;\ + bool tmpusb = g_reply_via_usb;\ + g_reply_via_fpc = true;\ + g_reply_via_usb = true;\ Dbprintf(__VA_ARGS__);\ - reply_via_fpc = tmpfpc;\ - reply_via_usb = tmpusb;} + g_reply_via_fpc = tmpfpc;\ + g_reply_via_usb = tmpusb;} -void DbpString(char *str); -void DbpStringEx(uint32_t flags, char *src, size_t srclen); +void DbpString(const char *str); +void DbpStringEx(uint32_t flags, const char *src, size_t srclen); void Dbprintf(const char *fmt, ...); void DbprintfEx(uint32_t flags, const char *fmt, ...); void Dbhexdump(int len, uint8_t *d, bool bAsci); -void print_result(char *name, uint8_t *buf, size_t len); +void print_result(const char *name, uint8_t *buf, size_t len); //void PrintToSendBuffer(void); #endif diff --git a/armsrc/desfire_crypto.c b/armsrc/desfire_crypto.c index 99bb54743..cafa98de1 100644 --- a/armsrc/desfire_crypto.c +++ b/armsrc/desfire_crypto.c @@ -36,6 +36,7 @@ #include "printf.h" #include "iso14443a.h" #include "dbprint.h" +#include "BigBuf.h" #ifndef AddCrc14A # define AddCrc14A(data, len) compute_crc(CRC_14443_A, (data), (len), (data)+(len), (data)+(len)+1) @@ -45,9 +46,9 @@ static mbedtls_des_context ctx; static mbedtls_des3_context ctx3; static mbedtls_aes_context actx; -static inline void update_key_schedules(desfirekey_t key); +static void update_key_schedules(desfirekey_t key); -static inline void update_key_schedules(desfirekey_t key) { +static void update_key_schedules(desfirekey_t key) { // DES_set_key ((DES_cblock *)key->data, &(key->ks1)); // DES_set_key ((DES_cblock *)(key->data + 8), &(key->ks2)); // if (T_3K3DES == key->type) { @@ -282,7 +283,10 @@ void cmac_generate_subkeys(desfirekey_t key) { void cmac(const desfirekey_t key, uint8_t *ivect, const uint8_t *data, size_t len, uint8_t *cmac) { int kbs = key_block_size(key); - uint8_t *buffer = malloc(padded_data_length(len, kbs)); + if (kbs == 0) + return; + + uint8_t *buffer = BigBuf_malloc(padded_data_length(len, kbs)); memcpy(buffer, data, len); @@ -299,7 +303,7 @@ void cmac(const desfirekey_t key, uint8_t *ivect, const uint8_t *data, size_t le mifare_cypher_blocks_chained(NULL, key, ivect, buffer, len, MCD_SEND, MCO_ENCYPHER); memcpy(cmac, ivect, kbs); - free(buffer); + //free(buffer); } size_t key_block_size(const desfirekey_t key) { @@ -538,7 +542,7 @@ void *mifare_cryto_postprocess_data(desfiretag_t tag, void *data, size_t *nbytes } size_t edl = enciphered_data_length(tag, *nbytes - 1, communication_settings); - edata = malloc(edl); + edata = BigBuf_malloc(edl); memcpy(edata, data, *nbytes - 1); memset((uint8_t *)edata + *nbytes - 1, 0, edl - *nbytes + 1); diff --git a/armsrc/desfire_crypto.h b/armsrc/desfire_crypto.h index 58588cd0d..bad89294b 100644 --- a/armsrc/desfire_crypto.h +++ b/armsrc/desfire_crypto.h @@ -69,8 +69,6 @@ enum DESFIRE_AUTH_SCHEME { AS_NEW }; - - #define DESFIRE_KEY(key) ((struct desfire_key *) key) struct desfire_key { enum DESFIRE_CRYPTOALGO type; @@ -99,8 +97,6 @@ struct desfire_tag { uint32_t selected_application; }; typedef struct desfire_tag *desfiretag_t; -void crc32_ex(const uint8_t *data, const size_t len, uint8_t *crc); -void crc32_append(uint8_t *data, const size_t len); void des_encrypt(void *out, const void *in, const void *key); void des_decrypt(void *out, const void *in, const void *key); void tdes_nxp_receive(const void *in, void *out, size_t length, const void *key, unsigned char iv[8], int keymode); diff --git a/armsrc/em4x50.c b/armsrc/em4x50.c new file mode 100644 index 000000000..ab8df0d55 --- /dev/null +++ b/armsrc/em4x50.c @@ -0,0 +1,1079 @@ +//----------------------------------------------------------------------------- +// Copyright (C) 2020 tharexde +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// Low frequency EM4x50 commands +//----------------------------------------------------------------------------- + +#include "fpgaloader.h" +#include "ticks.h" +#include "dbprint.h" +#include "lfadc.h" +#include "commonutil.h" +#include "em4x50.h" + +// 4 data bytes +// + byte with row parities +// + column parity byte +// + byte with stop bit + +static em4x50_tag_t tag = { + .sectors = { + [0] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // password + [1] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // protection word + [2] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // control word + [3] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [4] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [5] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [7] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [9] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [10] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [11] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [12] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [13] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [14] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [15] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [17] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [18] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [19] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [20] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [21] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [22] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [23] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [24] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [25] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [26] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [27] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [28] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [29] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [30] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [31] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // user + [32] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // device serial number + [33] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // device identification + }, +}; + +// Sam7s has several timers, we will use the source TIMER_CLOCK1 (aka AT91C_TC_CLKS_TIMER_DIV1_CLOCK) +// TIMER_CLOCK1 = MCK/2, MCK is running at 48 MHz, Timer is running at 48/2 = 24 MHz +// EM4x50 units (T0) have duration of 8 microseconds (us), which is 1/125000 per second (carrier) +// T0 = TIMER_CLOCK1 / 125000 = 192 + +#ifndef T0 +#define T0 192 +#endif + +#define EM4X50_T_TAG_QUARTER_PERIOD 16 +#define EM4X50_T_TAG_HALF_PERIOD 32 +#define EM4X50_T_TAG_THREE_QUARTER_PERIOD 48 +#define EM4X50_T_TAG_FULL_PERIOD 64 +#define EM4X50_T_TAG_TPP 64 +#define EM4X50_T_TAG_TWA 64 +#define EM4X50_T_WAITING_FOR_SNGLLIW 50 +#define EM4X50_T_WAITING_FOR_DBLLIW 1550 + +#define EM4X50_TAG_TOLERANCE 8 +#define EM4X50_TAG_WORD 45 + +#define EM4X50_BIT_0 0 +#define EM4X50_BIT_1 1 +#define EM4X50_BIT_OTHER 2 + +#define EM4X50_COMMAND_LOGIN 0x01 +#define EM4X50_COMMAND_RESET 0x80 +#define EM4X50_COMMAND_WRITE 0x12 +#define EM4X50_COMMAND_WRITE_PASSWORD 0x11 +#define EM4X50_COMMAND_SELECTIVE_READ 0x0A + +#define FPGA_TIMER_0 0 + +int gHigh = 0; +int gLow = 0; + +// auxiliary functions + +static void init_tag(void) { + + // initialize global tag structure + for (int i = 0; i < 34; i++) + for (int j = 0; j < 7; j++) + tag.sectors[i][j] = 0x00; +} + +static uint8_t bits2byte(uint8_t *bits, int length) { + + // converts separate bits into a single "byte" + uint8_t byte = 0; + for (int i = 0; i < length; i++) { + + byte |= bits[i]; + + if (i != length - 1) + byte <<= 1; + } + + return byte; +} + +static void msb2lsb_word(uint8_t *word) { + + // reorders given according to EM4x50 datasheet (msb -> lsb) + + uint8_t buff[4]; + buff[0] = reflect8(word[3]); + buff[1] = reflect8(word[2]); + buff[2] = reflect8(word[1]); + buff[3] = reflect8(word[0]); + + word[0] = buff[0]; + word[1] = buff[1]; + word[2] = buff[2]; + word[3] = buff[3]; +} + +static void save_word(int pos, uint8_t bits[EM4X50_TAG_WORD]) { + + // split "raw" word into data, row and column parity bits and stop bit and + // save them in global tag structure + uint8_t row_parity[4]; + uint8_t col_parity[8]; + + // data and row parities + for (int i = 0; i < 4; i++) { + tag.sectors[pos][i] = bits2byte(&bits[9 * i], 8); + row_parity[i] = bits[9 * i + 8]; + } + + tag.sectors[pos][4] = bits2byte(row_parity, 4); + + // column parities + for (int i = 0; i < 8; i++) + col_parity[i] = bits[36 + i]; + + tag.sectors[pos][5] = bits2byte(col_parity, 8); + + // stop bit + tag.sectors[pos][6] = bits[44]; +} + +static void wait_timer(int timer, uint32_t period) { + + // do nothing for using timer + + if (timer == FPGA_TIMER_0) { + + AT91C_BASE_TC0->TC_CCR = AT91C_TC_SWTRG; + while (AT91C_BASE_TC0->TC_CV < period); + + } else { + + AT91C_BASE_TC1->TC_CCR = AT91C_TC_SWTRG; + while (AT91C_BASE_TC1->TC_CV < period); + + } +} + +static void em4x50_setup_read(void) { + + FpgaDownloadAndGo(FPGA_BITSTREAM_LF); + FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); + + // 50ms for the resonant antenna to settle. + SpinDelay(50); + // Now set up the SSC to get the ADC samples that are now streaming at us. + FpgaSetupSsc(FPGA_MAJOR_MODE_LF_READER); + // start a 1.5ticks is 1us + StartTicks(); + + FpgaSendCommand(FPGA_CMD_SET_DIVISOR, LF_DIVISOR_125); + + // Connect the A/D to the peak-detected low-frequency path. + SetAdcMuxFor(GPIO_MUXSEL_LOPKD); + + // Steal this pin from the SSP (SPI communication channel with fpga) and + // use it to control the modulation + AT91C_BASE_PIOA->PIO_PER = GPIO_SSC_DOUT; + AT91C_BASE_PIOA->PIO_OER = GPIO_SSC_DOUT; + + // Disable modulation at default, which means enable the field + LOW(GPIO_SSC_DOUT); + + // Enable Peripheral Clock for + // TIMER_CLOCK0, used to measure exact timing before answering + // TIMER_CLOCK1, used to capture edges of the tag frames + AT91C_BASE_PMC->PMC_PCER |= (1 << AT91C_ID_TC0) | (1 << AT91C_ID_TC1); + AT91C_BASE_PIOA->PIO_BSR = GPIO_SSC_FRAME; + + // Disable timer during configuration + AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS; + AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKDIS; + + // TC0: Capture mode, default timer source = MCK/2 (TIMER_CLOCK1), no triggers + AT91C_BASE_TC0->TC_CMR = AT91C_TC_CLKS_TIMER_DIV1_CLOCK; + + // TC1: Capture mode, default timer source = MCK/2 (TIMER_CLOCK1), no triggers + AT91C_BASE_TC1->TC_CMR = AT91C_TC_CLKS_TIMER_DIV1_CLOCK; + + // Enable and reset counters + AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG; + AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG; + + // synchronized startup procedure + while (AT91C_BASE_TC0->TC_CV > 0) {}; // wait until TC1 returned to zero + + // Watchdog hit + WDT_HIT(); +} + +// functions for "reader" use case + +static bool get_signalproperties(void) { + + // calculate signal properties (mean amplitudes) from measured data: + // 32 amplitudes (maximum values) -> mean amplitude value -> gHigh -> gLow + + bool signal_found = false; + int no_periods = 32, pct = 75, noise = 140; + uint8_t sample_ref = 127; + uint8_t sample_max_mean = 0; + uint8_t sample_max[no_periods]; + uint32_t sample_max_sum = 0; + memcpy(sample_max, 0x00, sizeof(sample_max)); + + // wait until signal/noise > 1 (max. 32 periods) + for (int i = 0; i < T0 * no_periods; i++) { + + // about 2 samples per bit period + wait_timer(0, T0 * EM4X50_T_TAG_HALF_PERIOD); + + if (AT91C_BASE_SSC->SSC_RHR > noise) { + signal_found = true; + break; + } + + } + + if (!signal_found) + return false; + + // calculate mean maximum value of 32 periods, each period has a length of + // 3 single "full periods" to eliminate the influence of a listen window + for (int i = 0; i < no_periods; i++) { + + AT91C_BASE_TC0->TC_CCR = AT91C_TC_SWTRG; + while (AT91C_BASE_TC0->TC_CV < T0 * 3 * EM4X50_T_TAG_FULL_PERIOD) { + + volatile uint8_t sample = (uint8_t)AT91C_BASE_SSC->SSC_RHR; + + if (sample > sample_max[i]) + sample_max[i] = sample; + + } + + sample_max_sum += sample_max[i]; + } + + sample_max_mean = sample_max_sum / no_periods; + + // set global envelope variables + gHigh = sample_ref + pct * (sample_max_mean - sample_ref) / 100; + gLow = sample_ref - pct * (sample_max_mean - sample_ref) / 100; + return true; +} + +static int get_next_bit(void) { + + // returns bit value (or EM4X50_BIT_OTHER -> no bit pattern) by evaluating + // a single sample within a bit period (given there is no LIW, ACK or NAK) + // This function is not used for decoding, it is only used for identifying + // a listen window (return value = EM4X50_BIT_OTHER) in functions + // "find_double_listen_window" and "check_ack" + + // get sample at 3/4 of bit period + wait_timer(0, T0 * EM4X50_T_TAG_THREE_QUARTER_PERIOD); + uint8_t sample = (uint8_t)AT91C_BASE_SSC->SSC_RHR; + + // wait until end of bit period + wait_timer(0, T0 * EM4X50_T_TAG_QUARTER_PERIOD); + + // decide wether "0" or "1" + if (sample > gHigh) + return EM4X50_BIT_0; + else if (sample < gLow) + return EM4X50_BIT_1; + + return EM4X50_BIT_OTHER; +} + +static uint32_t get_pulse_length(void) { + + // iterates pulse length (low -> high -> low) + + uint8_t sample = 0; + + sample = (uint8_t)AT91C_BASE_SSC->SSC_RHR; + + while (sample > gLow) + sample = (uint8_t)AT91C_BASE_SSC->SSC_RHR; + + AT91C_BASE_TC1->TC_CCR = AT91C_TC_SWTRG; + + while (sample < gHigh) + sample = (uint8_t)AT91C_BASE_SSC->SSC_RHR; + + while (sample > gLow) + sample = (uint8_t)AT91C_BASE_SSC->SSC_RHR; + + return (uint32_t)AT91C_BASE_TC1->TC_CV; +} + +static bool check_pulse_length(uint32_t pl, int length) { + + // check if pulse length corresponds to given length + + if ((pl >= T0 * (length - EM4X50_TAG_TOLERANCE)) & + (pl <= T0 * (length + EM4X50_TAG_TOLERANCE))) + return true; + else + return false; +} + +static void em4x50_send_bit(int bit) { + + // send single bit according to EM4x50 application note and datasheet + + // reset clock for the next bit + AT91C_BASE_TC0->TC_CCR = AT91C_TC_SWTRG; + + if (bit == 0) { + + // disable modulation (drop the field) for 7 cycles of carrier + // period (Opt64) + LOW(GPIO_SSC_DOUT); + while (AT91C_BASE_TC0->TC_CV < T0 * 7); + + // enable modulation (activates the field) for remaining first + // half of bit period + HIGH(GPIO_SSC_DOUT); + while (AT91C_BASE_TC0->TC_CV < T0 * EM4X50_T_TAG_HALF_PERIOD); + + // disable modulation for second half of bit period + LOW(GPIO_SSC_DOUT); + while (AT91C_BASE_TC0->TC_CV < T0 * EM4X50_T_TAG_FULL_PERIOD); + + } else { + + // bit = "1" means disable modulation for full bit period + LOW(GPIO_SSC_DOUT); + while (AT91C_BASE_TC0->TC_CV < T0 * EM4X50_T_TAG_FULL_PERIOD); + } +} + +static void em4x50_send_byte(uint8_t byte) { + + // send byte (without parity) + + for (int i = 0; i < 8; i++) + em4x50_send_bit((byte >> (7 - i)) & 1); + +} + +static void em4x50_send_byte_with_parity(uint8_t byte) { + + // send byte followed by its (equal) parity bit + + int parity = 0, bit = 0; + + for (int i = 0; i < 8; i++) { + bit = (byte >> (7 - i)) & 1; + em4x50_send_bit(bit); + parity ^= bit; + } + + em4x50_send_bit(parity); +} + +static void em4x50_send_word(const uint8_t bytes[4]) { + + // send 32 bit word with parity bits according to EM4x50 datasheet + + for (int i = 0; i < 4; i++) + em4x50_send_byte_with_parity(bytes[i]); + + // send column parities + em4x50_send_byte(bytes[0] ^ bytes[1] ^ bytes[2] ^ bytes[3]); + + // send final stop bit (always "0") + em4x50_send_bit(0); +} + +static bool find_single_listen_window(void) { + + // find single listen window + + int cnt_pulses = 0; + + while (cnt_pulses < EM4X50_T_WAITING_FOR_SNGLLIW) { + + // identification of listen window is done via evaluation of + // pulse lengths + if (check_pulse_length(get_pulse_length(), 3 * EM4X50_T_TAG_FULL_PERIOD)) { + + if (check_pulse_length(get_pulse_length(), 2 * EM4X50_T_TAG_FULL_PERIOD)) { + + // listen window found + return true; + + } + } else { + + cnt_pulses++; + + } + } + + return false; +} + +static bool find_double_listen_window(bool bcommand) { + + // find two successive listen windows that indicate the beginning of + // data transmission + // double listen window to be detected within 1600 pulses -> worst case + // reason: first detectable double listen window after 34 words + // -> 34 words + 34 single listen windows -> about 1600 pulses + + int cnt_pulses = 0; + + while (cnt_pulses < EM4X50_T_WAITING_FOR_DBLLIW) { + + // identification of listen window is done via evaluation of + // pulse lengths + if (check_pulse_length(get_pulse_length(), 3 * EM4X50_T_TAG_FULL_PERIOD)) { + + if (check_pulse_length(get_pulse_length(), 2 * EM4X50_T_TAG_FULL_PERIOD)) { + + // first listen window found + + if (bcommand) { + + // data transmission from card has to be stopped, because + // a commamd shall be issued + + // unfortunately the posititon in listen window (where + // command request has to be sent) has gone, so if a + // second window follows - sync on this to issue a command + + // skip the next bit... + wait_timer(FPGA_TIMER_0, T0 * EM4X50_T_TAG_FULL_PERIOD); + + // ...and check if the following bit does make sense + // (if not it is the correct position within the second + // listen window) + if (get_next_bit() == EM4X50_BIT_OTHER) { + + // send RM for request mode + em4x50_send_bit(0); + em4x50_send_bit(0); + + return true; + } + + } + + if (check_pulse_length(get_pulse_length(), 3 * EM4X50_T_TAG_FULL_PERIOD)) { + + // return although second listen window consists of one + // more bit period but this period is necessary for + // evaluating further pulse lengths + return true; + } + } + } else { + cnt_pulses++; + } + } + + return false; +} + +static bool find_em4x50_tag(void) { + + // function is used to check wether a tag on the proxmark is an + // EM4x50 tag or not -> speed up "lf search" process + + return (find_single_listen_window()); + +} + +static bool request_receive_mode(void) { + + // To issue a command we have to find a listen window first. + // Because identification and sychronization at the same time is not + // possible when using pulse lengths a double listen window is used. + + bool bcommand = true; + + return find_double_listen_window(bcommand); +} + +static bool check_ack(bool bliw) { + + // returns true if signal structue corresponds to ACK, anything else is + // counted as NAK (-> false) + // Only relevant for pasword writing function: + // If is true then within the single listen window right after the + // ack signal a RM request has to be sent. + + AT91C_BASE_TC0->TC_CCR = AT91C_TC_SWTRG; + while (AT91C_BASE_TC0->TC_CV < T0 * 4 * EM4X50_T_TAG_FULL_PERIOD) { + + if (check_pulse_length(get_pulse_length(), 2 * EM4X50_T_TAG_FULL_PERIOD)) { + + // The received signal is either ACK or NAK. + + if (check_pulse_length(get_pulse_length(), 2 * EM4X50_T_TAG_FULL_PERIOD)) { + + // Now the signal must be ACK. + + if (!bliw) { + + return true; + + } else { + + // send RM request after ack signal + + // wait for 2 bits (remaining "bit" of ACK signal + first + // "bit" of listen window) + wait_timer(FPGA_TIMER_0, T0 * 2 * EM4X50_T_TAG_FULL_PERIOD); + + // check for listen window (if first bit cannot be inerpreted + // as a valid bit it must belong to a listen window) + if (get_next_bit() == EM4X50_BIT_OTHER) { + + // send RM for request mode + em4x50_send_bit(0); + em4x50_send_bit(0); + + return true; + } + } + } else { + + // It's NAK -> stop searching + break; + } + } + } + + return false; +} + +static int get_word_from_bitstream(uint8_t bits[EM4X50_TAG_WORD]) { + + // decodes one word by evaluating pulse lengths and previous bit; + // word must have 45 bits in total: + // 32 data bits + 4 row parity bits + 8 column parity bits + 1 stop bit + + bool bbitchange = false; + int i = 0; + uint32_t pl = 0; + + // initial bit value depends on last pulse length of listen window + pl = get_pulse_length(); + if (check_pulse_length(pl, 3 * EM4X50_T_TAG_HALF_PERIOD)) { + + // pulse length = 1.5 + bits[0] = 1; + + } else if (check_pulse_length(pl, 2 * EM4X50_T_TAG_FULL_PERIOD)) { + + // pulse length = 2 + bits[0] = 0; + bbitchange = true; + + } else { + + // pulse length = 2.5 + bits[0] = 0; + bits[1] = 1; + i++; + } + + // identify remaining bits based on pulse lengths + // between two listen windows only pulse lengths of 1, 1.5 and 2 are possible + while (true) { + + i++; + pl = get_pulse_length(); + + if (check_pulse_length(pl, EM4X50_T_TAG_FULL_PERIOD)) { + + // pulse length = 1 -> keep former bit value + bits[i] = bits[i - 1]; + + } else if (check_pulse_length(pl, 3 * EM4X50_T_TAG_HALF_PERIOD)) { + + // pulse length = 1.5 -> decision on bit change + + if (bbitchange) { + + // if number of pulse lengths with 1.5 periods is even -> add bit + bits[i] = (bits[i - 1] == 1) ? 1 : 0; + + // pulse length of 1.5 changes bit value + bits[i + 1] = (bits[i] == 1) ? 0 : 1; + i++; + + // next time add only one bit + bbitchange = false; + + } else { + + bits[i] = (bits[i - 1] == 1) ? 0 : 1; + + // next time two bits have to be added + bbitchange = true; + } + + } else if (check_pulse_length(pl, 2 * EM4X50_T_TAG_FULL_PERIOD)) { + + // pulse length of 2 means: adding 2 bits "01" + bits[i] = 0; + bits[i + 1] = 1; + i++; + + } else if (check_pulse_length(pl, 3 * EM4X50_T_TAG_FULL_PERIOD)) { + + // pulse length of 3 indicates listen window -> clear last + // bit (= 0) and return + return --i; + + } + } +} + +//============================================================================== +// login function +//============================================================================== + +static bool login(uint8_t password[4]) { + + // simple login to EM4x50, + // used in operations that require authentication + + if (request_receive_mode()) { + + // send login command + em4x50_send_byte_with_parity(EM4X50_COMMAND_LOGIN); + + // send password + em4x50_send_word(password); + + // check if ACK is returned + if (check_ack(false)) + return true; + + } else { + if (DBGLEVEL >= DBG_DEBUG) + Dbprintf("error in command request"); + } + + return false; +} + +//============================================================================== +// reset function +//============================================================================== + +static bool reset(void) { + + // resets EM4x50 tag (used by write function) + + if (request_receive_mode()) { + + // send login command + em4x50_send_byte_with_parity(EM4X50_COMMAND_RESET); + + if (check_ack(false)) + return true; + + } else { + if (DBGLEVEL >= DBG_DEBUG) + Dbprintf("error in command request"); + } + + return false; +} + +//============================================================================== +// read functions +//============================================================================== + +static bool standard_read(int *now) { + + // reads data that tag transmits when exposed to reader field + // (standard read mode); number of read words is saved in + + int fwr = *now; + uint8_t bits[EM4X50_TAG_WORD] = {0}; + + // start with the identification of two succsessive listening windows + if (find_double_listen_window(false)) { + + // read and save words until following double listen window is detected + while (get_word_from_bitstream(bits) == EM4X50_TAG_WORD) + save_word((*now)++, bits); + + // number of detected words + *now -= fwr; + + return true; + + } else { + if (DBGLEVEL >= DBG_DEBUG) + Dbprintf("didn't find a listen window"); + } + + return false; +} + +static bool selective_read(uint8_t addresses[4]) { + + // reads from "first word read" (fwr = addresses[3]) to "last word read" + // (lwr = addresses[2]) + // result is verified by "standard read mode" + + int fwr = addresses[3]; // first word read + int lwr = addresses[2]; // last word read + int now = fwr; // number of words + + if (request_receive_mode()) { + + // send selective read command + em4x50_send_byte_with_parity(EM4X50_COMMAND_SELECTIVE_READ); + + // send address data + em4x50_send_word(addresses); + + // look for ACK sequence + if (check_ack(false)) + + // save and verify via standard read mode (compare number of words) + if (standard_read(&now)) + if (now == (lwr - fwr + 1)) + return true; + + } else { + if (DBGLEVEL >= DBG_DEBUG) + Dbprintf("error in command request"); + } + + return false; +} + +void em4x50_info(em4x50_data_t *etd) { + + // collects as much information as possible via selective read mode + // if no password is given -> try with standard password "0x00000000" + // otherwise continue without login + + bool bsuccess = false, blogin = false; + uint8_t status = 0; + uint8_t addresses[] = {0x00, 0x00, 0x21, 0x00}; // fwr = 0, lwr = 33 + uint8_t password[] = {0x00, 0x00, 0x00, 0x00}; // default password + + init_tag(); + em4x50_setup_read(); + + // set gHigh and gLow + if (get_signalproperties() && find_em4x50_tag()) { + + if (etd->pwd_given) { + + // try to login with given password + blogin = login(etd->password); + + } else { + + // if no password is given, try to login with "0x00000000" + blogin = login(password); + + } + + bsuccess = selective_read(addresses); + } + + status = (bsuccess << 1) + blogin; + + lf_finalize(); + reply_ng(CMD_ACK, status, (uint8_t *)tag.sectors, 238); +} + +void em4x50_read(em4x50_data_t *etd) { + + // reads in two different ways: + // - using "selective read mode" -> bidirectional communication + // - using "standard read mode" -> unidirectional communication (read + // data that tag transmits "voluntarily") + + bool bsuccess = false, blogin = false; + int now = 0; + uint8_t status = 0; + uint8_t addresses[] = {0x00, 0x00, 0x00, 0x00}; + + init_tag(); + em4x50_setup_read(); + + // set gHigh and gLow + if (get_signalproperties() && find_em4x50_tag()) { + + if (etd->addr_given) { + + // selective read mode + + // try to login with given password + if (etd->pwd_given) + blogin = login(etd->password); + + // only one word has to be read -> first word read = last word read + addresses[2] = addresses[3] = etd->address; + bsuccess = selective_read(addresses); + + } else { + + // standard read mode + bsuccess = standard_read(&now); + + } + } + + status = (now << 2) + (bsuccess << 1) + blogin; + + lf_finalize(); + reply_ng(CMD_ACK, status, (uint8_t *)tag.sectors, 238); +} + +//============================================================================== +// write functions +//============================================================================== + +static bool write(uint8_t word[4], uint8_t address) { + + // writes to specified
+ + if (request_receive_mode()) { + + // send write command + em4x50_send_byte_with_parity(EM4X50_COMMAND_WRITE); + + // send address data + em4x50_send_byte_with_parity(address); + + // send data + em4x50_send_word(word); + + // wait for T0 * EM4X50_T_TAG_TWA (write access time) + wait_timer(FPGA_TIMER_0, T0 * EM4X50_T_TAG_TWA); + + // look for ACK sequence + if (check_ack(false)) { + + // now EM4x50 needs T0 * EM4X50_T_TAG_TWEE (EEPROM write time) + // for saving data and should return with ACK + if (check_ack(false)) + return true; + + } + + } else { + if (DBGLEVEL >= DBG_DEBUG) + Dbprintf("error in command request"); + } + + return false; +} + +static bool write_password(uint8_t password[4], uint8_t new_password[4]) { + + // changes password from to + + if (request_receive_mode()) { + + // send write password command + em4x50_send_byte_with_parity(EM4X50_COMMAND_WRITE_PASSWORD); + + // send address data + em4x50_send_word(password); + + // wait for T0 * EM4x50_T_TAG_TPP (processing pause time) + wait_timer(FPGA_TIMER_0, T0 * EM4X50_T_TAG_TPP); + + // look for ACK sequence and send rm request + // during following listen window + if (check_ack(true)) { + + // send new password + em4x50_send_word(new_password); + + // wait for T0 * EM4X50_T_TAG_TWA (write access time) + wait_timer(FPGA_TIMER_0, T0 * EM4X50_T_TAG_TWA); + + if (check_ack(false)) + if (check_ack(false)) + return true; + + } + + } else { + if (DBGLEVEL >= DBG_DEBUG) + Dbprintf("error in command request"); + } + + return false; +} + +void em4x50_write(em4x50_data_t *etd) { + + // write operation process for EM4x50 tag, + // single word is written to given address, verified by selective read operation + + bool bsuccess = false, blogin = false; + uint8_t status = 0; + uint8_t word[4] = {0x00, 0x00, 0x00, 0x00}; + uint8_t addresses[4] = {0x00, 0x00, 0x00, 0x00}; + + init_tag(); + em4x50_setup_read(); + + // set gHigh and gLow + if (get_signalproperties() && find_em4x50_tag()) { + + // reorder word according to datasheet + msb2lsb_word(etd->word); + + // if password is given try to login first + if (etd->pwd_given) + blogin = login(etd->password); + + // write word to given address + if (write(etd->word, etd->address)) { + + // to verify result reset EM4x50 + if (reset()) { + + // if password is given login + if (etd->pwd_given) + blogin &= login(etd->password); + + // call a selective read + addresses[2] = addresses[3] = etd->address; + if (selective_read(addresses)) { + + // compare with given word + word[0] = tag.sectors[etd->address][0]; + word[1] = tag.sectors[etd->address][1]; + word[2] = tag.sectors[etd->address][2]; + word[3] = tag.sectors[etd->address][3]; + msb2lsb_word(word); + + bsuccess = true; + for (int i = 0; i < 4; i++) + bsuccess &= (word[i] == etd->word[i]) ? true : false; + + } + } + } + } + + status = (bsuccess << 1) + blogin; + + lf_finalize(); + reply_ng(CMD_ACK, status, (uint8_t *)tag.sectors, 238); +} + +void em4x50_write_password(em4x50_data_t *etd) { + + // sinmple change of password + + bool bsuccess = false; + + init_tag(); + em4x50_setup_read(); + + // set gHigh and gLow + if (get_signalproperties() && find_em4x50_tag()) { + + // login and change password + if (login(etd->password)) { + bsuccess = write_password(etd->password, etd->new_password); + } + } + + lf_finalize(); + reply_ng(CMD_ACK, bsuccess, 0, 0); +} + +void em4x50_wipe(em4x50_data_t *etd) { + + // set all data of EM4x50 tag to 0x0 including password + + bool bsuccess = false; + uint8_t zero[4] = {0, 0, 0, 0}; + uint8_t addresses[4] = {0, 0, EM4X50_NO_WORDS - 3, 1}; + + init_tag(); + em4x50_setup_read(); + + // set gHigh and gLow + if (get_signalproperties() && find_em4x50_tag()) { + + // login first + if (login(etd->password)) { + + // write 0x0 to each address but ignore addresses + // 0 -> password, 32 -> serial, 33 -> uid + // writing 34 words takes about 3.6 seconds -> high timeout needed + for (int i = 1; i <= EM4X50_NO_WORDS - 3; i++) + write(zero, i); + + // to verify result reset EM4x50 + if (reset()) { + + // login not necessary because protectd word has been set to 0 + // -> no read protected words + // -> selective read can be called immediately + if (selective_read(addresses)) { + + // check if everything is zero + bsuccess = true; + for (int i = 1; i <= EM4X50_NO_WORDS - 3; i++) + for (int j = 0; j < 4; j++) + bsuccess &= (tag.sectors[i][j] == 0) ? true : false; + + } + + if (bsuccess) { + + // so far everything is fine + // last task: reset password + if (login(etd->password)) + bsuccess = write_password(etd->password, zero); + + // verify by login with new password + if (bsuccess) + bsuccess = login(zero); + } + } + } + } + + lf_finalize(); + reply_ng(CMD_ACK, bsuccess, (uint8_t *)tag.sectors, 238); +} diff --git a/armsrc/em4x50.h b/armsrc/em4x50.h new file mode 100644 index 000000000..f9f1375f2 --- /dev/null +++ b/armsrc/em4x50.h @@ -0,0 +1,26 @@ +//----------------------------------------------------------------------------- +// Copyright (C) 2020 tharexde +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// Low frequency EM4x50 commands +//----------------------------------------------------------------------------- + +#ifndef EM4X50_H +#define EM4X50_H + +#include "../include/em4x50.h" + +typedef struct { + uint8_t sectors[34][7]; +} em4x50_tag_t; + +void em4x50_info(em4x50_data_t *etd); +void em4x50_write(em4x50_data_t *etd); +void em4x50_write_password(em4x50_data_t *etd); +void em4x50_read(em4x50_data_t *etd); +void em4x50_wipe(em4x50_data_t *etd); + +#endif /* EM4X50_H */ diff --git a/armsrc/epa.c b/armsrc/epa.c index 867f4a43f..777549728 100644 --- a/armsrc/epa.c +++ b/armsrc/epa.c @@ -113,24 +113,21 @@ static char iso_type = 0; //----------------------------------------------------------------------------- // Wrapper for sending APDUs to type A and B cards //----------------------------------------------------------------------------- -int EPA_APDU(uint8_t *apdu, size_t length, uint8_t *response) { +static int EPA_APDU(uint8_t *apdu, size_t length, uint8_t *response, uint16_t respmaxlen) { switch (iso_type) { case 'a': return iso14_apdu(apdu, (uint16_t) length, false, response, NULL); - break; case 'b': - return iso14443b_apdu(apdu, length, response); - break; + return iso14443b_apdu(apdu, length, response, respmaxlen); default: return 0; - break; } } //----------------------------------------------------------------------------- // Closes the communication channel and turns off the field //----------------------------------------------------------------------------- -void EPA_Finish() { +void EPA_Finish(void) { FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); LEDsoff(); iso_type = 0; @@ -149,9 +146,8 @@ void EPA_Finish() { // TODO: Support elements with long tags (tag is longer than 1 byte) // TODO: Support proprietary PACE domain parameters //----------------------------------------------------------------------------- -size_t EPA_Parse_CardAccess(uint8_t *data, - size_t length, - pace_version_info_t *pace_info) { +size_t EPA_Parse_CardAccess(uint8_t *data, size_t length, pace_version_info_t *pace_info) { + size_t index = 0; while (index <= length - 2) { @@ -165,19 +161,22 @@ size_t EPA_Parse_CardAccess(uint8_t *data, index += (data[index - 1] & 0x7F); } } + // OID else if (data[index] == 0x06) { // is this a PACE OID? if (data[index + 1] == 0x0A // length matches - && memcmp(data + index + 2, - oid_pace_start, - sizeof(oid_pace_start)) == 0 // content matches + && memcmp(data + index + 2, oid_pace_start, sizeof(oid_pace_start)) == 0 // content matches && pace_info != NULL) { + // first, clear the pace_info struct memset(pace_info, 0, sizeof(pace_version_info_t)); + memcpy(pace_info->oid, data + index + 2, sizeof(pace_info->oid)); + // a PACE OID is followed by the version index += data[index + 1] + 2; + if (data[index] == 02 && data[index + 1] == 01) { pace_info->version = data[index + 2]; index += 3; @@ -189,6 +188,7 @@ size_t EPA_Parse_CardAccess(uint8_t *data, pace_info->parameter_id = data[index + 2]; index += 3; } + } else { // skip this OID index += 2 + data[index + 1]; @@ -227,7 +227,10 @@ int EPA_Read_CardAccess(uint8_t *buffer, size_t max_length) { // select the file EF.CardAccess rapdu_length = EPA_APDU((uint8_t *)apdu_select_binary_cardaccess, sizeof(apdu_select_binary_cardaccess), - response_apdu); + response_apdu, + sizeof(response_apdu) + ); + if (rapdu_length < 6 || response_apdu[rapdu_length - 4] != 0x90 || response_apdu[rapdu_length - 3] != 0x00) { @@ -238,7 +241,10 @@ int EPA_Read_CardAccess(uint8_t *buffer, size_t max_length) { // read the file rapdu_length = EPA_APDU((uint8_t *)apdu_read_binary, sizeof(apdu_read_binary), - response_apdu); + response_apdu, + sizeof(response_apdu) + ); + if (rapdu_length <= 6 || response_apdu[rapdu_length - 4] != 0x90 || response_apdu[rapdu_length - 3] != 0x00) { @@ -248,22 +254,22 @@ int EPA_Read_CardAccess(uint8_t *buffer, size_t max_length) { // copy the content into the buffer // length of data available: apdu_length - 4 (ISO frame) - 2 (SW) - size_t to_copy = rapdu_length - 6; - to_copy = to_copy < max_length ? to_copy : max_length; - memcpy(buffer, response_apdu + 2, to_copy); - return to_copy; + size_t len = rapdu_length - 6; + len = len < max_length ? len : max_length; + memcpy(buffer, response_apdu + 2, len); + return len; } //----------------------------------------------------------------------------- // Abort helper function for EPA_PACE_Collect_Nonce // sets relevant data in ack, sends the response //----------------------------------------------------------------------------- -static void EPA_PACE_Collect_Nonce_Abort(uint8_t step, int func_return) { +static void EPA_PACE_Collect_Nonce_Abort(uint32_t cmd, uint8_t step, int func_return) { // power down the field EPA_Finish(); // send the USB packet - reply_mix(CMD_ACK, step, func_return, 0, 0, 0); + reply_mix(cmd, step, func_return, 0, 0, 0); } //----------------------------------------------------------------------------- @@ -283,28 +289,28 @@ void EPA_PACE_Collect_Nonce(PacketCommandNG *c) { // set up communication int func_return = EPA_Setup(); if (func_return != 0) { - EPA_PACE_Collect_Nonce_Abort(1, func_return); + EPA_PACE_Collect_Nonce_Abort(CMD_HF_EPA_COLLECT_NONCE, 1, func_return); return; } // read the CardAccess file // this array will hold the CardAccess file uint8_t card_access[256] = {0}; - int card_access_length = EPA_Read_CardAccess(card_access, 256); + int cardlen = EPA_Read_CardAccess(card_access, 256); // the response has to be at least this big to hold the OID - if (card_access_length < 18) { - EPA_PACE_Collect_Nonce_Abort(2, card_access_length); + if (cardlen < 18) { + EPA_PACE_Collect_Nonce_Abort(CMD_HF_EPA_COLLECT_NONCE, 2, cardlen); return; } // this will hold the PACE info of the card pace_version_info_t pace_version_info; + // search for the PACE OID - func_return = EPA_Parse_CardAccess(card_access, - card_access_length, - &pace_version_info); + func_return = EPA_Parse_CardAccess(card_access, cardlen, &pace_version_info); + if (func_return != 0 || pace_version_info.version == 0) { - EPA_PACE_Collect_Nonce_Abort(3, func_return); + EPA_PACE_Collect_Nonce_Abort(CMD_HF_EPA_COLLECT_NONCE, 3, func_return); return; } @@ -313,25 +319,29 @@ void EPA_PACE_Collect_Nonce(PacketCommandNG *c) { func_return = EPA_PACE_MSE_Set_AT(pace_version_info, 2); // check if the command succeeded if (func_return != 0) { - EPA_PACE_Collect_Nonce_Abort(4, func_return); + EPA_PACE_Collect_Nonce_Abort(CMD_HF_EPA_COLLECT_NONCE, 4, func_return); return; } // now get the nonce uint8_t nonce[256] = {0}; - uint8_t requested_size = (uint8_t)c->oldarg[0]; - func_return = EPA_PACE_Get_Nonce(requested_size, nonce); + + struct p { + uint32_t m; + } PACKED; + struct p *packet = (struct p*)c->data.asBytes; + + func_return = EPA_PACE_Get_Nonce(packet->m, nonce); // check if the command succeeded if (func_return < 0) { - EPA_PACE_Collect_Nonce_Abort(5, func_return); + EPA_PACE_Collect_Nonce_Abort(CMD_HF_EPA_COLLECT_NONCE, 5, func_return); return; } - // all done, return EPA_Finish(); // save received information - reply_mix(CMD_ACK, 0, func_return, 0, nonce, func_return); + reply_mix(CMD_HF_EPA_COLLECT_NONCE, 0, func_return, 0, nonce, func_return); } //----------------------------------------------------------------------------- @@ -343,21 +353,18 @@ void EPA_PACE_Collect_Nonce(PacketCommandNG *c) { // code on failure. //----------------------------------------------------------------------------- int EPA_PACE_Get_Nonce(uint8_t requested_length, uint8_t *nonce) { + // build the APDU uint8_t apdu[sizeof(apdu_general_authenticate_pace_get_nonce) + 1]; + // copy the constant part - memcpy(apdu, - apdu_general_authenticate_pace_get_nonce, - sizeof(apdu_general_authenticate_pace_get_nonce)); + memcpy(apdu, apdu_general_authenticate_pace_get_nonce, sizeof(apdu_general_authenticate_pace_get_nonce)); + // append Le (requested length + 2 due to tag/length taking 2 bytes) in RAPDU apdu[sizeof(apdu_general_authenticate_pace_get_nonce)] = requested_length + 4; - // send it uint8_t response_apdu[262]; - int send_return = EPA_APDU(apdu, - sizeof(apdu), - response_apdu); - // check if the command succeeded + int send_return = EPA_APDU(apdu, sizeof(apdu), response_apdu, sizeof(response_apdu)); if (send_return < 6 || response_apdu[send_return - 4] != 0x90 || response_apdu[send_return - 3] != 0x00) { @@ -387,26 +394,31 @@ int EPA_PACE_Get_Nonce(uint8_t requested_length, uint8_t *nonce) { int EPA_PACE_MSE_Set_AT(pace_version_info_t pace_version_info, uint8_t password) { // create the MSE: Set AT APDU uint8_t apdu[23]; + // the minimum length (will be increased as more data is added) size_t apdu_length = 20; + // copy the constant part - memcpy(apdu, - apdu_mse_set_at_start, - sizeof(apdu_mse_set_at_start)); + memcpy(apdu, apdu_mse_set_at_start, sizeof(apdu_mse_set_at_start)); + // type: OID apdu[5] = 0x80; + // length of the OID apdu[6] = sizeof(pace_version_info.oid); + // copy the OID - memcpy(apdu + 7, - pace_version_info.oid, - sizeof(pace_version_info.oid)); + memcpy(apdu + 7, pace_version_info.oid, sizeof(pace_version_info.oid)); + // type: password apdu[17] = 0x83; + // length: 1 apdu[18] = 1; + // password apdu[19] = password; + // if standardized domain parameters are used, copy the ID if (pace_version_info.parameter_id != 0) { apdu_length += 3; @@ -417,17 +429,23 @@ int EPA_PACE_MSE_Set_AT(pace_version_info_t pace_version_info, uint8_t password) // copy the parameter ID apdu[22] = pace_version_info.parameter_id; } + // now set Lc to the actual length apdu[4] = apdu_length - 5; + // send it uint8_t response_apdu[6]; - int send_return = EPA_APDU(apdu, - apdu_length, - response_apdu); + int send_return = EPA_APDU(apdu, apdu_length, response_apdu, sizeof(response_apdu)); + + Dbprintf("send ret %d bytes", send_return); + +// Dbhexdump(send_return, response_apdu, false); + // check if the command succeeded - if (send_return != 6 - || response_apdu[send_return - 4] != 0x90 - || response_apdu[send_return - 3] != 0x00) { + if (send_return != 6) +// && response_apdu[send_return - 4] != 0x90 +// || response_apdu[send_return - 3] != 0x00) + { return 1; } return 0; @@ -480,7 +498,9 @@ void EPA_PACE_Replay(PacketCommandNG *c) { StartCountUS(); func_return = EPA_APDU(apdus_replay[i].data, apdu_lengths_replay[i], - response_apdu); + response_apdu, + sizeof(response_apdu) + ); timings[i] = GetCountUS(); // every step but the last one should succeed if (i < ARRAYLEN(apdu_lengths_replay) - 1 @@ -501,7 +521,7 @@ void EPA_PACE_Replay(PacketCommandNG *c) { // Set up a communication channel (Card Select, PPS) // Returns 0 on success or a non-zero error code on failure //----------------------------------------------------------------------------- -int EPA_Setup() { +int EPA_Setup(void) { // first, look for type A cards // power up the field @@ -536,6 +556,6 @@ int EPA_Setup() { iso_type = 'b'; return 0; } - Dbprintf("No card found."); + Dbprintf("No card found"); return 1; } diff --git a/armsrc/epa.h b/armsrc/epa.h index 66a95c059..237238181 100644 --- a/armsrc/epa.h +++ b/armsrc/epa.h @@ -23,12 +23,12 @@ typedef struct { } pace_version_info_t; // general functions -void EPA_Finish(); +void EPA_Finish(void); size_t EPA_Parse_CardAccess(uint8_t *data, size_t length, pace_version_info_t *pace_info); int EPA_Read_CardAccess(uint8_t *buffer, size_t max_length); -int EPA_Setup(); +int EPA_Setup(void); // PACE related functions int EPA_PACE_MSE_Set_AT(pace_version_info_t pace_version_info, uint8_t password); diff --git a/armsrc/felica.c b/armsrc/felica.c index 2cb23b48c..53f78d17b 100644 --- a/armsrc/felica.c +++ b/armsrc/felica.c @@ -35,13 +35,13 @@ static uint32_t felica_lasttime_prox2air_start; static void iso18092_setup(uint8_t fpga_minor_mode); static uint8_t felica_select_card(felica_card_select_t *card); static void TransmitFor18092_AsReader(uint8_t *frame, int len, uint32_t *timing, uint8_t power, uint8_t highspeed); -bool WaitForFelicaReply(uint16_t maxbytes); +static bool WaitForFelicaReply(uint16_t maxbytes); -void iso18092_set_timeout(uint32_t timeout) { +static void iso18092_set_timeout(uint32_t timeout) { felica_timeout = timeout + (DELAY_AIR2ARM_AS_READER + DELAY_ARM2AIR_AS_READER) / (16 * 8) + 2; } -uint32_t iso18092_get_timeout(void) { +static uint32_t iso18092_get_timeout(void) { return felica_timeout - (DELAY_AIR2ARM_AS_READER + DELAY_ARM2AIR_AS_READER) / (16 * 8) - 2; } @@ -80,7 +80,7 @@ static struct { # define SYNC_16BIT 0xB24D #endif -static void FelicaFrameReset() { +static void FelicaFrameReset(void) { FelicaFrame.state = STATE_UNSYNCD; FelicaFrame.posCnt = 0; FelicaFrame.crc_ok = false; @@ -336,7 +336,7 @@ static void BuildFliteRdblk(uint8_t *idm, int blocknum, uint16_t *blocks) { } static void TransmitFor18092_AsReader(uint8_t *frame, int len, uint32_t *timing, uint8_t power, uint8_t highspeed) { - uint8_t flags = FPGA_MAJOR_MODE_HF_ISO18092; + uint16_t flags = FPGA_MAJOR_MODE_HF_ISO18092; if (power) flags |= FPGA_HF_ISO18092_FLAG_READER; if (highspeed) @@ -431,7 +431,7 @@ bool WaitForFelicaReply(uint16_t maxbytes) { ); if (DBGLEVEL >= DBG_DEBUG) Dbprintf("All bytes received! STATE_FULL"); return true; - } else if (c++ > timeout && FelicaFrame.state == STATE_UNSYNCD) { + } else if (c++ > timeout && (FelicaFrame.state == STATE_UNSYNCD || FelicaFrame.state == STATE_TRYING_SYNC)) { if (DBGLEVEL >= DBG_DEBUG) Dbprintf("Error: Timeout! STATE_UNSYNCD"); return false; } @@ -445,7 +445,7 @@ static void iso18092_setup(uint8_t fpga_minor_mode) { if (DBGLEVEL >= DBG_DEBUG) Dbprintf("Start iso18092_setup"); LEDsoff(); - FpgaDownloadAndGo(FPGA_BITSTREAM_HF); + FpgaDownloadAndGo(FPGA_BITSTREAM_HF_FELICA); // allocate command receive buffer BigBuf_free(); @@ -464,7 +464,7 @@ static void iso18092_setup(uint8_t fpga_minor_mode) { SetAdcMuxFor(GPIO_MUXSEL_HIPKD); // Set up the synchronous serial port - FpgaSetupSsc(); + FpgaSetupSsc(FPGA_MAJOR_MODE_HF_ISO18092); // LSB transfer. Remember to set it back to MSB with AT91C_BASE_SSC->SSC_RFMR = SSC_FRAME_MODE_BITS_IN_WORD(8) | SSC_FRAME_MODE_WORDS_PER_TRANSFER(0); @@ -481,7 +481,7 @@ static void iso18092_setup(uint8_t fpga_minor_mode) { LED_D_ON(); } -void felica_reset_frame_mode() { +static void felica_reset_frame_mode(void) { switch_off(); //Resetting Frame mode (First set in fpgaloader.c) AT91C_BASE_SSC->SSC_RFMR = SSC_FRAME_MODE_BITS_IN_WORD(8) | AT91C_SSC_MSBF | SSC_FRAME_MODE_WORDS_PER_TRANSFER(0); @@ -738,7 +738,7 @@ void felica_sim_lite(uint64_t uid) { #define RES_SVC_LEN 11 + 3 -void felica_dump_lite_s() { +void felica_dump_lite_s(void) { uint8_t ndef[8]; uint8_t poll[10] = { 0xb2, 0x4d, 0x06, FELICA_POLL_REQ, 0xff, 0xff, 0x00, 0x00, 0x09, 0x21}; uint16_t liteblks[28] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x90, 0x91, 0x92, 0xa0}; diff --git a/armsrc/felica.h b/armsrc/felica.h index ef34dc108..885815abb 100644 --- a/armsrc/felica.h +++ b/armsrc/felica.h @@ -17,6 +17,6 @@ void felica_sendraw(PacketCommandNG *c); void felica_sniff(uint32_t samplesToSkip, uint32_t triggersToSkip); void felica_sim_lite(uint64_t uid); -void felica_dump_lite_s(); +void felica_dump_lite_s(void); #endif diff --git a/armsrc/flashmem.c b/armsrc/flashmem.c index e3a20cacc..f09ae8c40 100644 --- a/armsrc/flashmem.c +++ b/armsrc/flashmem.c @@ -16,8 +16,8 @@ /// Calculates the value of the CSR DLYBCT field given the desired delay (in ns) #define SPI_DLYBCT(delay, masterClock) ((uint32_t) ((((masterClock) / 1000000) * (delay)) / 32000) << 24) - -uint32_t FLASHMEM_SPIBAUDRATE = FLASH_BAUD; +static uint32_t FLASHMEM_SPIBAUDRATE = FLASH_BAUD; +#define FASTFLASH (FLASHMEM_SPIBAUDRATE > FLASH_MINFAST) void FlashmemSetSpiBaudrate(uint32_t baudrate) { FLASHMEM_SPIBAUDRATE = baudrate; @@ -25,7 +25,7 @@ void FlashmemSetSpiBaudrate(uint32_t baudrate) { } // initialize -bool FlashInit() { +bool FlashInit(void) { FlashSetup(FLASHMEM_SPIBAUDRATE); StartTicks(); @@ -435,7 +435,7 @@ bool Flash_WipeMemoryPage(uint8_t page) { return true; } // Wipes flash memory completely, fills with 0xFF -bool Flash_WipeMemory() { +bool Flash_WipeMemory(void) { if (!FlashInit()) { if (DBGLEVEL > 3) Dbprintf("Flash_WriteData init fail"); return false; @@ -462,7 +462,7 @@ bool Flash_WipeMemory() { } // enable the flash write -void Flash_WriteEnable() { +void Flash_WriteEnable(void) { FlashSendLastByte(WRITEENABLE); if (DBGLEVEL > 3) Dbprintf("Flash Write enabled"); } @@ -523,7 +523,7 @@ void Flash_EraseChip(void) { */ void Flashmem_print_status(void) { - DbpString(_BLUE_("Flash memory")); + DbpString(_CYAN_("Flash memory")); Dbprintf(" Baudrate................" _GREEN_("%d MHz"), FLASHMEM_SPIBAUDRATE / 1000000); if (!FlashInit()) { @@ -562,7 +562,7 @@ void Flashmem_print_info(void) { if (!FlashInit()) return; - DbpString(_BLUE_("Flash memory dictionary loaded")); + DbpString(_CYAN_("Flash memory dictionary loaded")); // load dictionary offsets. uint8_t keysum[2]; diff --git a/armsrc/flashmem.h b/armsrc/flashmem.h index 42fc3d2f0..54a101ea6 100644 --- a/armsrc/flashmem.h +++ b/armsrc/flashmem.h @@ -106,12 +106,10 @@ #define FLASH_FASTBAUD MCK #define FLASH_MINBAUD FLASH_FASTBAUD -#define FASTFLASH (FLASHMEM_SPIBAUDRATE > FLASH_MINFAST) - //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// void FlashmemSetSpiBaudrate(uint32_t baudrate); -bool FlashInit(); +bool FlashInit(void); void FlashSetup(uint32_t baudrate); void FlashStop(void); bool Flash_WaitIdle(void); @@ -122,9 +120,9 @@ void Flash_TransferAdresse(uint32_t address); bool Flash_CheckBusy(uint32_t timeout); -void Flash_WriteEnable(); +void Flash_WriteEnable(void); bool Flash_WipeMemoryPage(uint8_t page); -bool Flash_WipeMemory(); +bool Flash_WipeMemory(void); bool Flash_Erase4k(uint8_t block, uint8_t sector); //bool Flash_Erase32k(uint32_t address); bool Flash_Erase64k(uint8_t block); diff --git a/armsrc/fpgaloader.c b/armsrc/fpgaloader.c index a5ca3f6d1..2df952214 100644 --- a/armsrc/fpgaloader.c +++ b/armsrc/fpgaloader.c @@ -17,10 +17,19 @@ #include "ticks.h" #include "dbprint.h" #include "util.h" -#include "zlib.h" #include "fpga.h" #include "string.h" +#include "lz4.h" // uncompress + +typedef struct lz4_stream_s { + LZ4_streamDecode_t *lz4StreamDecode; + char *next_in; + int avail_in; +} lz4_stream; + +typedef lz4_stream *lz4_streamp; + // remember which version of the bitstream we have already downloaded to the FPGA static int downloaded_bitstream = 0; @@ -30,8 +39,6 @@ extern uint8_t _binary_obj_fpga_all_bit_z_start, _binary_obj_fpga_all_bit_z_end; static uint8_t *fpga_image_ptr = NULL; static uint32_t uncompressed_bytes_cnt; -#define OUTPUT_BUFFER_LEN 80 - //----------------------------------------------------------------------------- // Set up the Serial Peripheral Interface as master // Used to write the FPGA config word @@ -127,7 +134,7 @@ void SetupSpi(int mode) { // Set up the synchronous serial port with the set of options that fits // the FPGA mode. Both RX and TX are always enabled. //----------------------------------------------------------------------------- -void FpgaSetupSsc(void) { +void FpgaSetupSsc(uint16_t fpga_mode) { // First configure the GPIOs, and get ourselves a clock. AT91C_BASE_PIOA->PIO_ASR = GPIO_SSC_FRAME | @@ -145,12 +152,16 @@ void FpgaSetupSsc(void) { // data and frame signal is sampled on falling edge of RK AT91C_BASE_SSC->SSC_RCMR = SSC_CLOCK_MODE_SELECT(1) | SSC_CLOCK_MODE_START(1); - // 8 bits per transfer, no loopback, MSB first, 1 transfer per sync + // 8, 16 or 32 bits per transfer, no loopback, MSB first, 1 transfer per sync // pulse, no output sync - AT91C_BASE_SSC->SSC_RFMR = SSC_FRAME_MODE_BITS_IN_WORD(8) | AT91C_SSC_MSBF | SSC_FRAME_MODE_WORDS_PER_TRANSFER(0); + if ((fpga_mode & FPGA_MAJOR_MODE_MASK) == FPGA_MAJOR_MODE_HF_READER && FpgaGetCurrent() == FPGA_BITSTREAM_HF) { + AT91C_BASE_SSC->SSC_RFMR = SSC_FRAME_MODE_BITS_IN_WORD(16) | AT91C_SSC_MSBF | SSC_FRAME_MODE_WORDS_PER_TRANSFER(0); + } else { + AT91C_BASE_SSC->SSC_RFMR = SSC_FRAME_MODE_BITS_IN_WORD(8) | AT91C_SSC_MSBF | SSC_FRAME_MODE_WORDS_PER_TRANSFER(0); + } - // TX clock comes from TK pin, no clock output, outputs change on falling - // edge of TK, frame sync is sampled on rising edge of TK, start TX on rising edge of TF + // TX clock comes from TK pin, no clock output, outputs change on rising edge of TK, + // TF (frame sync) is sampled on falling edge of TK, start TX on rising edge of TF AT91C_BASE_SSC->SSC_TCMR = SSC_CLOCK_MODE_SELECT(2) | SSC_CLOCK_MODE_START(5); // tx framing is the same as the rx framing @@ -164,7 +175,7 @@ void FpgaSetupSsc(void) { // a single buffer as a circular buffer (so that we just chain back to // ourselves, not to another buffer). //----------------------------------------------------------------------------- -bool FpgaSetupSscDma(uint8_t *buf, int len) { +bool FpgaSetupSscDma(uint8_t *buf, uint16_t len) { if (buf == NULL) return false; FpgaDisableSscDma(); @@ -177,21 +188,25 @@ bool FpgaSetupSscDma(uint8_t *buf, int len) { } //---------------------------------------------------------------------------- -// Uncompress (inflate) the FPGA data. Returns one decompressed byte with -// each call. +// Uncompress (inflate) the FPGA data. Returns one decompressed byte with each call. //---------------------------------------------------------------------------- -static int get_from_fpga_combined_stream(z_streamp compressed_fpga_stream, uint8_t *output_buffer) { - if (fpga_image_ptr == compressed_fpga_stream->next_out) { // need more data - compressed_fpga_stream->next_out = output_buffer; - compressed_fpga_stream->avail_out = OUTPUT_BUFFER_LEN; +static int get_from_fpga_combined_stream(lz4_streamp compressed_fpga_stream, uint8_t *output_buffer) { + if (fpga_image_ptr == output_buffer + FPGA_RING_BUFFER_BYTES) { // need more data fpga_image_ptr = output_buffer; - int res = inflate(compressed_fpga_stream, Z_SYNC_FLUSH); - - if (res != Z_OK) - Dbprintf("inflate returned: %d, %s", res, compressed_fpga_stream->msg); - - if (res < 0) + int cmp_bytes; + memcpy(&cmp_bytes, compressed_fpga_stream->next_in, sizeof(int)); + compressed_fpga_stream->next_in += 4; + compressed_fpga_stream->avail_in -= cmp_bytes + 4; + int res = LZ4_decompress_safe_continue(compressed_fpga_stream->lz4StreamDecode, + compressed_fpga_stream->next_in, + (char *)output_buffer, + cmp_bytes, + FPGA_RING_BUFFER_BYTES); + if (res <= 0) { + Dbprintf("inflate returned: %d", res); return res; + } + compressed_fpga_stream->next_in += cmp_bytes; } uncompressed_bytes_cnt++; return *fpga_image_ptr++; @@ -202,8 +217,8 @@ static int get_from_fpga_combined_stream(z_streamp compressed_fpga_stream, uint8 // are combined into one big file: // 288 bytes from FPGA file 1, followed by 288 bytes from FGPA file 2, etc. //---------------------------------------------------------------------------- -static int get_from_fpga_stream(int bitstream_version, z_streamp compressed_fpga_stream, uint8_t *output_buffer) { - while ((uncompressed_bytes_cnt / FPGA_INTERLEAVE_SIZE) % fpga_bitstream_num != (bitstream_version - 1)) { +static int get_from_fpga_stream(int bitstream_version, lz4_streamp compressed_fpga_stream, uint8_t *output_buffer) { + while ((uncompressed_bytes_cnt / FPGA_INTERLEAVE_SIZE) % g_fpga_bitstream_num != (bitstream_version - 1)) { // skip undesired data belonging to other bitstream_versions get_from_fpga_combined_stream(compressed_fpga_stream, output_buffer); } @@ -211,37 +226,23 @@ static int get_from_fpga_stream(int bitstream_version, z_streamp compressed_fpga return get_from_fpga_combined_stream(compressed_fpga_stream, output_buffer); } -static voidpf fpga_inflate_malloc(voidpf opaque, uInt items, uInt size) { - return BigBuf_malloc(items * size); -} - -// free eventually allocated BigBuf memory -static void fpga_inflate_free(voidpf opaque, voidpf address) { - BigBuf_free(); - BigBuf_Clear_ext(false); -} - //---------------------------------------------------------------------------- // Initialize decompression of the respective (HF or LF) FPGA stream //---------------------------------------------------------------------------- -static bool reset_fpga_stream(int bitstream_version, z_streamp compressed_fpga_stream, uint8_t *output_buffer) { +static bool reset_fpga_stream(int bitstream_version, lz4_streamp compressed_fpga_stream, uint8_t *output_buffer) { uint8_t header[FPGA_BITSTREAM_FIXED_HEADER_SIZE]; uncompressed_bytes_cnt = 0; // initialize z_stream structure for inflate: - compressed_fpga_stream->next_in = &_binary_obj_fpga_all_bit_z_start; + compressed_fpga_stream->next_in = (char *)&_binary_obj_fpga_all_bit_z_start; compressed_fpga_stream->avail_in = &_binary_obj_fpga_all_bit_z_end - &_binary_obj_fpga_all_bit_z_start; - compressed_fpga_stream->next_out = output_buffer; - compressed_fpga_stream->avail_out = OUTPUT_BUFFER_LEN; - compressed_fpga_stream->zalloc = &fpga_inflate_malloc; - compressed_fpga_stream->zfree = &fpga_inflate_free; - int res = inflateInit2(compressed_fpga_stream, 0); - if (res < 0) + int res = LZ4_setStreamDecode(compressed_fpga_stream->lz4StreamDecode, NULL, 0); + if (res == 0) return false; - fpga_image_ptr = output_buffer; + fpga_image_ptr = output_buffer + FPGA_RING_BUFFER_BYTES; for (uint16_t i = 0; i < FPGA_BITSTREAM_FIXED_HEADER_SIZE; i++) header[i] = get_from_fpga_stream(bitstream_version, compressed_fpga_stream, output_buffer); @@ -266,7 +267,7 @@ static void DownloadFPGA_byte(uint8_t w) { } // Download the fpga image starting at current stream position with length FpgaImageLen bytes -static void DownloadFPGA(int bitstream_version, int FpgaImageLen, z_streamp compressed_fpga_stream, uint8_t *output_buffer) { +static void DownloadFPGA(int bitstream_version, int FpgaImageLen, lz4_streamp compressed_fpga_stream, uint8_t *output_buffer) { int i = 0; AT91C_BASE_PIOA->PIO_OER = GPIO_FPGA_ON; @@ -348,9 +349,11 @@ static void DownloadFPGA(int bitstream_version, int FpgaImageLen, z_streamp comp * (big endian), bytes content. Except for section 'e' which has 4 bytes * length. */ -static int bitparse_find_section(int bitstream_version, char section_name, uint32_t *section_length, z_streamp compressed_fpga_stream, uint8_t *output_buffer) { - int result = 0; +static int bitparse_find_section(int bitstream_version, char section_name, uint32_t *section_length, lz4_streamp compressed_fpga_stream, uint8_t *output_buffer) { + #define MAX_FPGA_BIT_STREAM_HEADER_SEARCH 100 // maximum number of bytes to search for the requested section + + int result = 0; uint16_t numbytes = 0; while (numbytes < MAX_FPGA_BIT_STREAM_HEADER_SEARCH) { char current_name = get_from_fpga_stream(bitstream_version, compressed_fpga_stream, output_buffer); @@ -407,8 +410,6 @@ void FpgaDownloadAndGo(int bitstream_version) { // Send waiting time extension request as this will take a while send_wtx(1500); - z_stream compressed_fpga_stream; - uint8_t output_buffer[OUTPUT_BUFFER_LEN] = {0x00}; bool verbose = (DBGLEVEL > 3); @@ -416,6 +417,11 @@ void FpgaDownloadAndGo(int bitstream_version) { BigBuf_free(); BigBuf_Clear_ext(verbose); + lz4_stream compressed_fpga_stream; + LZ4_streamDecode_t lz4StreamDecode_body = {{ 0 }}; + compressed_fpga_stream.lz4StreamDecode = &lz4StreamDecode_body; + uint8_t *output_buffer = BigBuf_malloc(FPGA_RING_BUFFER_BYTES); + if (!reset_fpga_stream(bitstream_version, &compressed_fpga_stream, output_buffer)) return; @@ -425,8 +431,6 @@ void FpgaDownloadAndGo(int bitstream_version) { downloaded_bitstream = bitstream_version; } - inflateEnd(&compressed_fpga_stream); - // turn off antenna FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); @@ -440,7 +444,7 @@ void FpgaDownloadAndGo(int bitstream_version) { // The bit format is: C3 C2 C1 C0 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 // where C is the 4 bit command and D is the 12 bit data // -// @params cmd and v gets or over eachother. Take careful note of overlapping bits. +// @params cmd and v gets OR:ED over each other. Take careful note of overlapping bits. //----------------------------------------------------------------------------- void FpgaSendCommand(uint16_t cmd, uint16_t v) { SetupSpi(SPI_FPGA_MODE); @@ -508,8 +512,8 @@ void SetAdcMuxFor(uint32_t whichGpio) { } void Fpga_print_status(void) { - DbpString(_BLUE_("Currently loaded FPGA image")); - Dbprintf(" mode....................%s", fpga_version_information[downloaded_bitstream - 1]); + DbpString(_CYAN_("Current FPGA image")); + Dbprintf(" mode....................%s", g_fpga_version_information[downloaded_bitstream - 1]); } int FpgaGetCurrent(void) { @@ -521,10 +525,13 @@ int FpgaGetCurrent(void) { // if HF, Disable SSC DMA // turn off trace and leds off. void switch_off(void) { - if (DBGLEVEL > 3) Dbprintf("switch_off"); + if (DBGLEVEL > 3) { + Dbprintf("switch_off"); + } FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - if (downloaded_bitstream == FPGA_BITSTREAM_HF) + if (downloaded_bitstream == FPGA_BITSTREAM_HF) { FpgaDisableSscDma(); + } set_tracing(false); LEDsoff(); } diff --git a/armsrc/fpgaloader.h b/armsrc/fpgaloader.h index 636c5b7b7..530dc21b4 100644 --- a/armsrc/fpgaloader.h +++ b/armsrc/fpgaloader.h @@ -20,6 +20,7 @@ // definitions for multiple FPGA config files support #define FPGA_BITSTREAM_LF 1 #define FPGA_BITSTREAM_HF 2 +#define FPGA_BITSTREAM_HF_FELICA 3 /* Communication between ARM / FPGA is done inside armsrc/fpgaloader.c (function FpgaSendCommand) @@ -52,23 +53,26 @@ thres| x x x x x x x x #define FPGA_CMD_TRACE_ENABLE (2<<12) // C // Definitions for the FPGA configuration word. +#define FPGA_MAJOR_MODE_MASK 0x01C0 +#define FPGA_MINOR_MODE_MASK 0x003F + // LF -#define FPGA_MAJOR_MODE_LF_READER (0<<5) -#define FPGA_MAJOR_MODE_LF_EDGE_DETECT (1<<5) -#define FPGA_MAJOR_MODE_LF_PASSTHRU (2<<5) -#define FPGA_MAJOR_MODE_LF_ADC (3<<5) +#define FPGA_MAJOR_MODE_LF_READER (0<<6) +#define FPGA_MAJOR_MODE_LF_EDGE_DETECT (1<<6) +#define FPGA_MAJOR_MODE_LF_PASSTHRU (2<<6) +#define FPGA_MAJOR_MODE_LF_ADC (3<<6) // HF -#define FPGA_MAJOR_MODE_HF_READER_TX (0<<5) // D -#define FPGA_MAJOR_MODE_HF_READER_RX_XCORR (1<<5) // D -#define FPGA_MAJOR_MODE_HF_SIMULATOR (2<<5) // D -#define FPGA_MAJOR_MODE_HF_ISO14443A (3<<5) // D -#define FPGA_MAJOR_MODE_HF_SNOOP (4<<5) // D -#define FPGA_MAJOR_MODE_HF_ISO18092 (5<<5) // D -#define FPGA_MAJOR_MODE_HF_GET_TRACE (6<<5) // D +#define FPGA_MAJOR_MODE_HF_READER (0<<6) // D +#define FPGA_MAJOR_MODE_HF_SIMULATOR (1<<6) // D +#define FPGA_MAJOR_MODE_HF_ISO14443A (2<<6) // D +#define FPGA_MAJOR_MODE_HF_SNIFF (3<<6) // D +#define FPGA_MAJOR_MODE_HF_ISO18092 (4<<6) // D +#define FPGA_MAJOR_MODE_HF_GET_TRACE (5<<6) // D // BOTH HF / LF -#define FPGA_MAJOR_MODE_OFF (7<<5) // D +#define FPGA_MAJOR_MODE_OFF (7<<6) // D + // Options for LF_READER #define FPGA_LF_ADC_READER_FIELD 0x1 @@ -78,13 +82,20 @@ thres| x x x x x x x x #define FPGA_LF_EDGE_DETECT_READER_FIELD 0x1 #define FPGA_LF_EDGE_DETECT_TOGGLE_MODE 0x2 -// Options for the HF reader, tx to tag -#define FPGA_HF_READER_TX_SHALLOW_MOD 0x1 +// Options for the HF reader +#define FPGA_HF_READER_MODE_RECEIVE_IQ (0<<0) +#define FPGA_HF_READER_MODE_RECEIVE_AMPLITUDE (1<<0) +#define FPGA_HF_READER_MODE_RECEIVE_PHASE (2<<0) +#define FPGA_HF_READER_MODE_SEND_FULL_MOD (3<<0) +#define FPGA_HF_READER_MODE_SEND_SHALLOW_MOD (4<<0) +#define FPGA_HF_READER_MODE_SNIFF_IQ (5<<0) +#define FPGA_HF_READER_MODE_SNIFF_AMPLITUDE (6<<0) +#define FPGA_HF_READER_MODE_SNIFF_PHASE (7<<0) +#define FPGA_HF_READER_MODE_SEND_JAM (8<<0) -// Options for the HF reader, correlating against rx from tag -#define FPGA_HF_READER_RX_XCORR_848_KHZ 0x1 -#define FPGA_HF_READER_RX_XCORR_SNOOP 0x2 -#define FPGA_HF_READER_RX_XCORR_QUARTER 0x4 +#define FPGA_HF_READER_SUBCARRIER_848_KHZ (0<<4) +#define FPGA_HF_READER_SUBCARRIER_424_KHZ (1<<4) +#define FPGA_HF_READER_SUBCARRIER_212_KHZ (2<<4) // Options for the HF simulated tag, how to modulate #define FPGA_HF_SIMULATOR_NO_MODULATION 0x0 // 0000 @@ -112,9 +123,9 @@ void FpgaEnableTracing(void); void FpgaDisableTracing(void); void FpgaDownloadAndGo(int bitstream_version); // void FpgaGatherVersion(int bitstream_version, char *dst, int len); -void FpgaSetupSsc(void); +void FpgaSetupSsc(uint16_t fpga_mode); void SetupSpi(int mode); -bool FpgaSetupSscDma(uint8_t *buf, int len); +bool FpgaSetupSscDma(uint8_t *buf, uint16_t len); void Fpga_print_status(void); int FpgaGetCurrent(void); void SetAdcMuxFor(uint32_t whichGpio); diff --git a/armsrc/frozen.c b/armsrc/frozen.c index 41f2179cd..b8a6f3a02 100644 --- a/armsrc/frozen.c +++ b/armsrc/frozen.c @@ -780,8 +780,7 @@ int json_printf_array(struct json_out *out, va_list *ap) { } #ifdef _WIN32 -int cs_win_vsnprintf(char *str, size_t size, const char *format, - va_list ap) WEAK; +int cs_win_vsnprintf(char *str, size_t size, const char *format, va_list ap) WEAK; int cs_win_vsnprintf(char *str, size_t size, const char *format, va_list ap) { int res = _vsnprintf(str, size, format, ap); va_end(ap); @@ -863,14 +862,21 @@ struct json_scanf_info { int json_unescape(const char *src, int slen, char *dst, int dlen) WEAK; int json_unescape(const char *src, int slen, char *dst, int dlen) { - char *send = (char *) src + slen, *dend = dst + dlen, *orig_dst = dst, *p; + if (dst == NULL || dlen == 0) + return JSON_STRING_INVALID; + + char *send = (char *) src + slen; + char *dend = dst + dlen; + char *orig_dst = dst; + char *p; const char *esc1 = "\"\\/bfnrt", *esc2 = "\"\\/\b\f\n\r\t"; while (src < send) { if (*src == '\\') { - if (++src >= send) return JSON_STRING_INCOMPLETE; + if (++src >= send) { return JSON_STRING_INCOMPLETE; } + if (*src == 'u') { - if (send - src < 5) return JSON_STRING_INCOMPLETE; + if (send - src < 5) { return JSON_STRING_INCOMPLETE; } /* Here we go: this is a \u.... escape. Process simple one-byte chars */ if (src[1] == '0' && src[2] == '0') { /* This is \u00xx character from the ASCII range */ @@ -881,12 +887,16 @@ int json_unescape(const char *src, int slen, char *dst, int dlen) { return JSON_STRING_INVALID; } } else if ((p = (char *) strchr(esc1, *src)) != NULL) { - if (dst < dend) *dst = esc2[p - esc1]; + if (dst < dend) { + *dst = esc2[p - esc1]; + } } else { return JSON_STRING_INVALID; } } else { - if (dst < dend) *dst = *src; + if (dst < dend) { + *dst = *src; + } } dst++; src++; @@ -1461,10 +1471,9 @@ char *json_vasprintf(const char *fmt, va_list ap) { char *json_asprintf(const char *fmt, ...) WEAK; char *json_asprintf(const char *fmt, ...) { - char *result = NULL; va_list ap; va_start(ap, fmt); - result = json_vasprintf(fmt, ap); + char *result = json_vasprintf(fmt, ap); va_end(ap); return result; } diff --git a/armsrc/hfsnoop.c b/armsrc/hfsnoop.c index 770280b9b..ec13dbc85 100644 --- a/armsrc/hfsnoop.c +++ b/armsrc/hfsnoop.c @@ -18,29 +18,21 @@ #include "appmain.h" #include "cmd.h" -static void RAMFUNC optimizedSniff(void) { - int n = BigBuf_max_traceLen() / sizeof(uint16_t); // take all memory - - uint16_t *dest = (uint16_t *)BigBuf_get_addr(); - uint16_t *destend = dest + n - 1; - - // Reading data loop - while (dest <= destend) { +static void RAMFUNC optimizedSniff(uint16_t *dest, uint16_t dsize) { + while (dsize > 0) { if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_RXRDY) { *dest = (uint16_t)(AT91C_BASE_SSC->SSC_RHR); dest++; + dsize -= sizeof(dsize); } } - //setting tracelen - important! it was set by buffer overflow before - set_tracelen(BigBuf_max_traceLen()); } -void HfSniff(int samplesToSkip, int triggersToSkip) { +int HfSniff(uint32_t samplesToSkip, uint32_t triggersToSkip, uint16_t *len) { BigBuf_free(); - BigBuf_Clear(); + BigBuf_Clear_ext(false); - Dbprintf("Skipping first %d sample pairs, Skipping %d triggers.\n", samplesToSkip, triggersToSkip); - int trigger_cnt = 0; + Dbprintf("Skipping first %d sample pairs, Skipping %d triggers", samplesToSkip, triggersToSkip); LED_D_ON(); @@ -49,59 +41,91 @@ void HfSniff(int samplesToSkip, int triggersToSkip) { SetAdcMuxFor(GPIO_MUXSEL_HIPKD); // Set up the synchronous serial port - FpgaSetupSsc(); + FpgaSetupSsc(FPGA_MAJOR_MODE_HF_SNIFF); // Setting Frame Mode For better performance on high speed data transfer. AT91C_BASE_SSC->SSC_RFMR = SSC_FRAME_MODE_BITS_IN_WORD(16); - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_SNOOP); + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_SNIFF); SpinDelay(100); - uint16_t r = 0; - while (!BUTTON_PRESS() && !data_available()) { + *len = (BigBuf_max_traceLen() & 0xFFFE); + uint8_t *mem = BigBuf_malloc(*len); + + uint32_t trigger_cnt = 0; + uint16_t r = 0, interval = 0; + + bool pressed = false; + while (pressed == false) { WDT_HIT(); + // cancel w usb command. + if (interval == 2000) { + if (data_available()) + break; + + interval = 0; + } else { + interval++; + } + + // check if trigger is reached if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) { r = (uint16_t)AT91C_BASE_SSC->SSC_RHR; - r = MAX(r & 0xff, r >> 8); - if (r >= 180) { // 0xB4 ?? - if (++trigger_cnt > triggersToSkip) + + r = MAX(r & 0xFF, r >> 8); + + // 180 (0xB4) arbitary value to see if a strong RF field is near. + if (r > 180) { + + if (++trigger_cnt > triggersToSkip) { break; + } } } + + pressed = BUTTON_PRESS(); } - if (!BUTTON_PRESS()) { - int waitcount = samplesToSkip; // lets wait 40000 ticks of pck0 - while (waitcount != 0) { + if (pressed == false) { - if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) - waitcount--; + // skip samples loop + while (samplesToSkip != 0) { + + if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) { + samplesToSkip--; + } + } + + optimizedSniff((uint16_t *)mem, *len); + + if (DBGLEVEL >= DBG_INFO) { + Dbprintf("Trigger kicked in (%d >= 180)", r); + Dbprintf("Collected %u samples", *len); } - optimizedSniff(); - Dbprintf("Trigger kicked! Value: %d, Dumping Samples Hispeed now.", r); } //Resetting Frame mode (First set in fpgaloader.c) AT91C_BASE_SSC->SSC_RFMR = SSC_FRAME_MODE_BITS_IN_WORD(8) | AT91C_SSC_MSBF | SSC_FRAME_MODE_WORDS_PER_TRANSFER(0); - - DbpString("HF Sniffing end"); - FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); LED_D_OFF(); + FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); + BigBuf_free(); + return (pressed) ? PM3_EOPABORTED : PM3_SUCCESS; } void HfPlotDownload(void) { - uint8_t *buf = ToSend; - uint8_t *this_buf = buf; + + tosend_t *ts = get_tosend(); + uint8_t *this_buf = ts->buf; FpgaDownloadAndGo(FPGA_BITSTREAM_HF); - FpgaSetupSsc(); + FpgaSetupSsc(FPGA_MAJOR_MODE_HF_GET_TRACE); AT91C_BASE_PDC_SSC->PDC_PTCR = AT91C_PDC_RXTDIS; // Disable DMA Transfer AT91C_BASE_PDC_SSC->PDC_RPR = (uint32_t) this_buf; // start transfer to this memory address AT91C_BASE_PDC_SSC->PDC_RCR = PM3_CMD_DATA_SIZE; // transfer this many samples - buf[0] = (uint8_t)AT91C_BASE_SSC->SSC_RHR; // clear receive register + ts->buf[0] = (uint8_t)AT91C_BASE_SSC->SSC_RHR; // clear receive register AT91C_BASE_PDC_SSC->PDC_PTCR = AT91C_PDC_RXTEN; // Start DMA transfer FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_GET_TRACE); // let FPGA transfer its internal Block-RAM @@ -109,7 +133,7 @@ void HfPlotDownload(void) { LED_B_ON(); for (size_t i = 0; i < FPGA_TRACE_SIZE; i += PM3_CMD_DATA_SIZE) { // prepare next DMA transfer: - uint8_t *next_buf = buf + ((i + PM3_CMD_DATA_SIZE) % (2 * PM3_CMD_DATA_SIZE)); + uint8_t *next_buf = ts->buf + ((i + PM3_CMD_DATA_SIZE) % (2 * PM3_CMD_DATA_SIZE)); AT91C_BASE_PDC_SSC->PDC_RNPR = (uint32_t)next_buf; AT91C_BASE_PDC_SSC->PDC_RNCR = PM3_CMD_DATA_SIZE; diff --git a/armsrc/hfsnoop.h b/armsrc/hfsnoop.h index 049536940..8ed263fa5 100644 --- a/armsrc/hfsnoop.h +++ b/armsrc/hfsnoop.h @@ -12,6 +12,8 @@ #ifndef __HFSNOOP_H #define __HFSNOOP_H -void HfSniff(int, int); +#include "proxmark3_arm.h" + +int HfSniff(uint32_t samplesToSkip, uint32_t triggersToSkip, uint16_t *len); void HfPlotDownload(void); #endif diff --git a/armsrc/hitag2.c b/armsrc/hitag2.c index 7e4c7ca14..eab276bad 100644 --- a/armsrc/hitag2.c +++ b/armsrc/hitag2.c @@ -36,7 +36,7 @@ #include "lfsampling.h" #include "lfdemod.h" #include "commonutil.h" - +#include "appmain.h" #define test_bit(data, i) (*(data + (i/8)) >> (7-(i % 8))) & 1 #define set_bit(data, i) *(data + (i/8)) |= (1 << (7-(i % 8))) @@ -48,8 +48,8 @@ static bool bCrypto; // Is in auth stage static bool bAuthenticating; // Successful password auth -bool bSelecting; -bool bCollision; +static bool bSelecting; +static bool bCollision; static bool bPwd; static bool bSuccessful; @@ -89,14 +89,14 @@ static uint8_t password[4]; static uint8_t NrAr[8]; static uint8_t key[8]; static uint8_t writedata[4]; -uint8_t logdata_0[4], logdata_1[4]; -uint8_t nonce[4]; -bool key_no; +static uint8_t logdata_0[4], logdata_1[4]; +static uint8_t nonce[4]; +static bool key_no; static uint64_t cipher_state; -int16_t blocknr; -size_t flipped_bit = 0; -uint32_t byte_value = 0; +static int16_t blocknr; +static size_t flipped_bit = 0; +static uint32_t byte_value = 0; static int hitag2_reset(void) { tag.state = TAG_STATE_RESET; @@ -373,7 +373,7 @@ static uint32_t hitag_reader_send_frame(const uint8_t *frame, size_t frame_len) return wait; } -uint8_t hitag_crc(uint8_t *data, size_t length) { +static uint8_t hitag_crc(uint8_t *data, size_t length) { uint8_t crc = 0xff; unsigned int byte, bit; for (byte = 0; byte < ((length + 7) / 8); byte++) { @@ -411,7 +411,7 @@ void fix_ac_decoding(uint8_t *input, size_t len) { // looks at number of received bits. // 0 = collision? // 32 = good response -bool hitag_plain(uint8_t *rx, const size_t rxlen, uint8_t *tx, size_t *txlen, bool hitag_s) { +static bool hitag_plain(uint8_t *rx, const size_t rxlen, uint8_t *tx, size_t *txlen, bool hitag_s) { uint8_t crc; *txlen = 0; switch (rxlen) { @@ -480,7 +480,7 @@ bool hitag_plain(uint8_t *rx, const size_t rxlen, uint8_t *tx, size_t *txlen, bo } -bool hitag1_authenticate(uint8_t *rx, const size_t rxlen, uint8_t *tx, size_t *txlen) { +static bool hitag1_authenticate(uint8_t *rx, const size_t rxlen, uint8_t *tx, size_t *txlen) { uint8_t crc; *txlen = 0; switch (rxlen) { @@ -997,42 +997,48 @@ void SniffHitag2(void) { lf_init(false, false); - logging = false; + g_logging = false; size_t periods = 0; uint8_t periods_bytes[4]; - int16_t checked = 0; +// int16_t checked = 0; /*bool waiting_for_first_edge = true;*/ LED_C_ON(); + uint32_t signal_size = 10000; while (!BUTTON_PRESS()) { + // use malloc + initSampleBufferEx(&signal_size, false); + WDT_HIT(); - // only every 1000th times, in order to save time when collecting samples. - if (checked == 1000) { - if (data_available()) { - checked = -1; - break; - } else { - checked = 0; - } - } - ++checked; + /* + // only every 1000th times, in order to save time when collecting samples. + if (checked == 1000) { + if (data_available()) { + checked = -1; + break; + } else { + checked = 0; + } + } + ++checked; + */ // Receive frame, watch for at most T0*EOF periods // lf_reset_counter(); // Wait "infinite" for reader modulation - periods = lf_detect_gap(20000); + periods = lf_detect_gap(10000); // Test if we detected the first reader modulation edge if (periods != 0) { - if (logging == false) { - logging = true; + if (g_logging == false) { + g_logging = true; LED_D_ON(); } } @@ -1042,7 +1048,6 @@ void SniffHitag2(void) { num_to_bytes(periods, 4, periods_bytes); LogTrace(periods_bytes, 4, 0, 0, NULL, true); } - } lf_finalize(); @@ -1062,9 +1067,9 @@ void SimulateHitag2(bool tag_mem_supplied, uint8_t *data) { lf_init(false, true); int response = 0; - uint8_t rx[HITAG_FRAME_LEN]; + uint8_t rx[HITAG_FRAME_LEN] = {0}; size_t rxlen = 0; - uint8_t tx[HITAG_FRAME_LEN]; + uint8_t tx[HITAG_FRAME_LEN] = {0}; size_t txlen = 0; auth_table_len = 0; @@ -1108,8 +1113,11 @@ void SimulateHitag2(bool tag_mem_supplied, uint8_t *data) { // int16_t checked = 0; // SIMULATE + uint32_t signal_size = 10000; + while (BUTTON_PRESS() == false) { - while (!BUTTON_PRESS()) { + // use malloc + initSampleBufferEx(&signal_size, true); LED_D_ON(); @@ -1238,7 +1246,7 @@ void SimulateHitag2(bool tag_mem_supplied, uint8_t *data) { // Check if frame was captured if (rxlen > 4) { - LogTrace(rx, nbytes(rxlen), response, 0, NULL, true); + LogTrace(rx, nbytes(rxlen), response, response, NULL, true); // Process the incoming frame (rx) and prepare the outgoing frame (tx) hitag2_handle_reader_command(rx, rxlen, tx, &txlen); @@ -1283,9 +1291,9 @@ void ReaderHitag(hitag_function htf, hitag_data *htd) { uint32_t command_start = 0, command_duration = 0; uint32_t response_start = 0, response_duration = 0; - uint8_t rx[HITAG_FRAME_LEN]; + uint8_t rx[HITAG_FRAME_LEN] = {0}; size_t rxlen = 0; - uint8_t txbuf[HITAG_FRAME_LEN]; + uint8_t txbuf[HITAG_FRAME_LEN] = {0}; uint8_t *tx = txbuf; size_t txlen = 0; @@ -1397,21 +1405,23 @@ void ReaderHitag(hitag_function htf, hitag_data *htd) { uint8_t attempt_count = 0; // Tag specific configuration settings (sof, timings, etc.) - if (htf < 10) { - // hitagS settings - t_wait_1 = 204; - t_wait_2 = 128; - flipped_bit = 0; - tag_size = 8; - DBG DbpString("Configured for hitagS reader"); - } else if (htf < 20) { +// TODO HTS + /* if (htf <= HTS_LAST_CMD) { + // hitagS settings + t_wait_1 = 204; + t_wait_2 = 128; + flipped_bit = 0; + tag_size = 8; + DBG DbpString("Configured for hitagS reader"); + } else */ + if (htf <= HT1_LAST_CMD) { // hitag1 settings t_wait_1 = 204; t_wait_2 = 128; tag_size = 256; flipped_bit = 0; DBG DbpString("Configured for hitag1 reader"); - } else if (htf < 30) { + } else if (htf <= HT2_LAST_CMD) { // hitag2 settings t_wait_1 = HITAG_T_WAIT_1_MIN; t_wait_2 = HITAG_T_WAIT_2_MIN; @@ -1428,12 +1438,17 @@ void ReaderHitag(hitag_function htf, hitag_data *htd) { size_t nrzs = 0; int16_t checked = 0; - while (!bStop && !BUTTON_PRESS()) { + uint32_t signal_size = 10000; + + while (bStop == false && BUTTON_PRESS() == false) { + + // use malloc + initSampleBufferEx(&signal_size, true); WDT_HIT(); // only every 1000th times, in order to save time when collecting samples. - if (checked == 1000) { + if (checked == 4000) { if (data_available()) { checked = -1; break; @@ -1613,13 +1628,13 @@ void ReaderHitag(hitag_function htf, hitag_data *htd) { } // Pack the response into a byte array - for (size_t i = 5; i < nrzs; i++) { + for (size_t i = 5; i < nrzs && rxlen < (sizeof(rx) << 3); i++) { uint8_t bit = nrz_samples[i]; if (bit > 1) { // When Manchester detects impossible symbol it writes "7" DBG Dbprintf("Error in Manchester decoding, abort"); break; } - rx[rxlen / 8] |= bit << (7 - (rxlen % 8)); + rx[rxlen >> 3] |= bit << (7 - (rxlen % 8)); rxlen++; } @@ -1721,28 +1736,32 @@ void WriterHitag(hitag_function htf, hitag_data *htd, int page) { lf_init(true, false); // Tag specific configuration settings (sof, timings, etc.) - if (htf < 10) { - // hitagS settings - t_wait_1 = 204; - t_wait_2 = 128; - /*tag_size = 256;*/ - flipped_bit = 0; - tag_size = 8; - DbpString("Configured for hitagS writer"); - } else if (htf < 20) { - // hitag1 settings - t_wait_1 = 204; - t_wait_2 = 128; - tag_size = 256; - flipped_bit = 0; - DbpString("Configured for hitag1 writer"); - } else if (htf < 30) { - // hitag2 settings - t_wait_1 = HITAG_T_WAIT_1_MIN; - t_wait_2 = HITAG_T_WAIT_2_MIN; - tag_size = 48; - DbpString("Configured for hitag2 writer"); - } +// TODO HTS + /* if (htf <= HTS_LAST_CMD) { + // hitagS settings + t_wait_1 = 204; + t_wait_2 = 128; + //tag_size = 256; + flipped_bit = 0; + tag_size = 8; + DbpString("Configured for hitagS writer"); + } else */ +// TODO HT1 + /* if (htf <= HT1_LAST_CMD) { + // hitag1 settings + t_wait_1 = 204; + t_wait_2 = 128; + tag_size = 256; + flipped_bit = 0; + DbpString("Configured for hitag1 writer"); + } else */ +// if (htf <= HT2_LAST_CMD) { + // hitag2 settings + t_wait_1 = HITAG_T_WAIT_1_MIN; + t_wait_2 = HITAG_T_WAIT_2_MIN; + tag_size = 48; + DbpString("Configured for hitag2 writer"); +// } uint8_t tag_modulation; size_t max_nrzs = (8 * HITAG_FRAME_LEN + 5) * 2; // up to 2 nrzs per bit @@ -1750,10 +1769,14 @@ void WriterHitag(hitag_function htf, hitag_data *htd, int page) { size_t nrzs = 0; int16_t checked = 0; - while (!bStop && !BUTTON_PRESS()) { + uint32_t signal_size = 10000; + while (bStop == false && BUTTON_PRESS() == false) { - // only every 1000th times, in order to save time when collecting samples. - if (checked == 1000) { + // use malloc + initSampleBufferEx(&signal_size, true); + + // only every 4000th times, in order to save time when collecting samples. + if (checked == 4000) { if (data_available()) { checked = -1; break; @@ -1914,12 +1937,13 @@ void WriterHitag(hitag_function htf, hitag_data *htd, int page) { } // Pack the response into a byte array - for (size_t i = 5; i < nrzs; i++) { + for (size_t i = 5; i < nrzs && rxlen < (sizeof(rx) << 3); i++) { uint8_t bit = nrz_samples[i]; if (bit > 1) { // When Manchester detects impossible symbol it writes "7" break; } - rx[rxlen / 8] |= bit << (7 - (rxlen % 8)); + // >> 3 instead of div by 8 + rx[rxlen >> 3] |= bit << (7 - (rxlen % 8)); rxlen++; } diff --git a/armsrc/hitag2crack.c b/armsrc/hitag2crack.c index faf530897..a79c166d6 100644 --- a/armsrc/hitag2crack.c +++ b/armsrc/hitag2crack.c @@ -17,9 +17,9 @@ #define READP0CMD "1100000111" #define ERROR_RESPONSE "F402889C" -extern const uint8_t Hitag2Sync[5]; -extern bool CryptoActive; -extern Hitag_State Hitag_Crypto_State; +static const uint8_t Hitag2Sync[5]; +static bool CryptoActive; +static Hitag_State Hitag_Crypto_State; // hitag2_crack implements the first crack algorithm described in the paper, // Gone In 360 Seconds by Verdult, Garcia and Balasch. diff --git a/armsrc/hitagS.c b/armsrc/hitagS.c index 8e9a4bb88..7a49d65cd 100644 --- a/armsrc/hitagS.c +++ b/armsrc/hitagS.c @@ -48,8 +48,7 @@ static int temp2 = 0; static int sof_bits; // number of start-of-frame bits static uint8_t pwdh0, pwdl0, pwdl1; // password bytes static uint32_t rnd = 0x74124485; // randomnumber -size_t blocknr; -bool end = false; +static bool end = false; //#define SENDBIT_TEST /* array index 3 2 1 0 // bytes in sim.bin file are 0 1 2 3 @@ -110,7 +109,7 @@ bool end = false; * Implementation of the crc8 calculation from Hitag S * from http://www.proxmark.org/files/Documents/125%20kHz%20-%20Hitag/HitagS.V11.pdf */ -void calc_crc(unsigned char *crc, unsigned char data, unsigned char Bitcount) { +static void calc_crc(unsigned char *crc, unsigned char data, unsigned char Bitcount) { *crc ^= data; // crc = crc (exor) data do { if (*crc & 0x80) { // if (MSB-CRC == 1) @@ -333,7 +332,7 @@ static int check_select(uint8_t *rx, uint32_t uid) { return 0; } -void hitagS_set_frame_modulation() { +static void hitagS_set_frame_modulation(void) { switch (tag.mode) { case HT_STANDARD: sof_bits = 1; @@ -434,8 +433,8 @@ static void hitagS_handle_reader_command(uint8_t *rx, const size_t rxlen, temp2++; *txlen = 32; state = _hitag2_init(REV64(tag.key), - REV32(tag.pages[0][0]), - REV32(((rx[3] << 24) + (rx[2] << 16) + (rx[1] << 8) + rx[0])) + REV32((tag.pages[0][3] << 24) + (tag.pages[0][2] << 16) + (tag.pages[0][1] << 8) + tag.pages[0][0]), + REV32((rx[3] << 24) + (rx[2] << 16) + (rx[1] << 8) + rx[0]) ); Dbprintf(",{0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X}", rx[0], rx[1], rx[2], rx[3], rx[4], rx[5], rx[6], rx[7]); @@ -446,7 +445,7 @@ static void hitagS_handle_reader_command(uint8_t *rx, const size_t rxlen, _hitag2_byte(&state); //send con2, pwdh0, pwdl0, pwdl1 encrypted as a response - tx[0] = _hitag2_byte(&state) ^ ((tag.pages[0][1] >> 16) & 0xff); + tx[0] = _hitag2_byte(&state) ^ tag.pages[1][2]; tx[1] = _hitag2_byte(&state) ^ tag.pwdh0; tx[2] = _hitag2_byte(&state) ^ tag.pwdl0; tx[3] = _hitag2_byte(&state) ^ tag.pwdl1; @@ -454,7 +453,7 @@ static void hitagS_handle_reader_command(uint8_t *rx, const size_t rxlen, //add crc8 *txlen = 40; crc = CRC_PRESET; - calc_crc(&crc, ((tag.pages[0][1] >> 16) & 0xff), 8); + calc_crc(&crc, tag.pages[1][2], 8); calc_crc(&crc, tag.pwdh0, 8); calc_crc(&crc, tag.pwdl0, 8); calc_crc(&crc, tag.pwdl1, 8); @@ -466,10 +465,16 @@ static void hitagS_handle_reader_command(uint8_t *rx, const size_t rxlen, if (temp2 % 2 == 0) { tag.uid = 0x11223344; - tag.pages[0][0] = 0x44332211; + tag.pages[0][0] = 0x11; + tag.pages[0][1] = 0x22; + tag.pages[0][2] = 0x33; + tag.pages[0][3] = 0x44; } else { tag.uid = 0x55667788; - tag.pages[0][0] = 0x88776655; + tag.pages[0][0] = 0x55; + tag.pages[0][1] = 0x66; + tag.pages[0][2] = 0x77; + tag.pages[0][3] = 0x88; } */ } @@ -480,16 +485,20 @@ static void hitagS_handle_reader_command(uint8_t *rx, const size_t rxlen, //data received to be written if (tag.tstate == HT_WRITING_PAGE_DATA) { tag.tstate = HT_NO_OP; - tag.pages[page_to_be_written / 4][page_to_be_written % 4] = (rx[0] - << 0) + (rx[1] << 8) + (rx[2] << 16) + (rx[3] << 24); + tag.pages[page_to_be_written][0] = rx[0]; + tag.pages[page_to_be_written][1] = rx[1]; + tag.pages[page_to_be_written][2] = rx[2]; + tag.pages[page_to_be_written][3] = rx[3]; //send ack *txlen = 2; tx[0] = 0x40; page_to_be_written = 0; hitagS_set_frame_modulation(); } else if (tag.tstate == HT_WRITING_BLOCK_DATA) { - tag.pages[page_to_be_written / 4][page_to_be_written % 4] = (rx[0] - << 24) + (rx[1] << 16) + (rx[2] << 8) + rx[3]; + tag.pages[page_to_be_written][0] = rx[0]; + tag.pages[page_to_be_written][1] = rx[1]; + tag.pages[page_to_be_written][2] = rx[2]; + tag.pages[page_to_be_written][3] = rx[3]; //send ack *txlen = 2; tx[0] = 0x40; @@ -889,9 +898,12 @@ void SimulateHitagSTag(bool tag_mem_supplied, uint8_t *data) { } tag.uid = ((tag.pages[0][3]) << 24) | ((tag.pages[0][2]) << 16) | ((tag.pages[0][1]) << 8) | tag.pages[0][0]; - tag.key = ((tag.pages[3][3]) << 24) | ((tag.pages[3][2]) << 16) | ((tag.pages[3][1]) << 8) | tag.pages[3][0]; - tag.key <<= 16; - tag.key += ((tag.pages[2][3]) << 8) + tag.pages[2][2]; + tag.key = (((uint64_t)tag.pages[3][3]) << 40) | + (((uint64_t)tag.pages[3][2]) << 32) | + (((uint64_t)tag.pages[3][1]) << 24) | + (((uint64_t)tag.pages[3][0]) << 16) | + (((uint64_t)tag.pages[2][3]) << 8) | + (((uint64_t)tag.pages[2][2])); tag.pwdl0 = tag.pages[2][0]; tag.pwdl1 = tag.pages[2][1]; tag.pwdh0 = tag.pages[1][3]; @@ -1027,7 +1039,7 @@ void SimulateHitagSTag(bool tag_mem_supplied, uint8_t *data) { // Check if frame was captured if (rxlen > 0) { // frame_count++; - LogTrace(rx, nbytes(rxlen), response, 0, NULL, true); + LogTrace(rx, nbytes(rxlen), response, response, NULL, true); // Disable timer 1 with external trigger to avoid triggers during our own modulation AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKDIS; @@ -1075,7 +1087,7 @@ void SimulateHitagSTag(bool tag_mem_supplied, uint8_t *data) { DbpString("Sim Stopped"); } -void hitagS_receive_frame(uint8_t *rx, size_t *rxlen, int *response) { +static void hitagS_receive_frame(uint8_t *rx, size_t *rxlen, int *response) { // Reset values for receiving frames memset(rx, 0x00, HITAG_FRAME_LEN * sizeof(uint8_t)); @@ -1269,7 +1281,7 @@ void ReadHitagS(hitag_function htf, hitag_data *htd) { // Check if frame was captured and store it if (rxlen > 0) { // frame_count++; - LogTrace(rx, nbytes(rxlen), response, 0, NULL, false); + LogTrace(rx, nbytes(rxlen), response, response, NULL, false); } // By default reset the transmission buffer @@ -1398,7 +1410,7 @@ void ReadHitagS(hitag_function htf, hitag_data *htd) { // Add transmitted frame to total count if (txlen > 0) { // frame_count++; - LogTrace(tx, nbytes(txlen), HITAG_T_WAIT_2, 0, NULL, true); + LogTrace(tx, nbytes(txlen), HITAG_T_WAIT_2, HITAG_T_WAIT_2, NULL, true); } hitagS_receive_frame(rx, &rxlen, &response); @@ -1526,7 +1538,7 @@ void WritePageHitagS(hitag_function htf, hitag_data *htd, int page) { // Check if frame was captured and store it if (rxlen > 0) { // frame_count++; - LogTrace(rx, nbytes(rxlen), response, 0, NULL, false); + LogTrace(rx, nbytes(rxlen), response, response, NULL, false); } //check for valid input @@ -1613,7 +1625,7 @@ void WritePageHitagS(hitag_function htf, hitag_data *htd, int page) { // Add transmitted frame to total count if (txlen > 0) { // frame_count++; - LogTrace(tx, nbytes(txlen), HITAG_T_WAIT_2, 0, NULL, true); + LogTrace(tx, nbytes(txlen), HITAG_T_WAIT_2, HITAG_T_WAIT_2, NULL, true); } hitagS_receive_frame(rx, &rxlen, &response); @@ -1645,7 +1657,7 @@ void check_challenges(bool file_given, uint8_t *data) { size_t rxlen = 0; uint8_t txbuf[HITAG_FRAME_LEN]; int t_wait = HITAG_T_WAIT_MAX; - int lastbit, STATE = 0;; + int lastbit, STATE = 0; bool bStop; int response_bit[200]; unsigned char mask = 1; @@ -1720,7 +1732,7 @@ void check_challenges(bool file_given, uint8_t *data) { // Check if frame was captured and store it if (rxlen > 0) { // frame_count++; - LogTrace(rx, nbytes(rxlen), response, 0, NULL, false); + LogTrace(rx, nbytes(rxlen), response, response, NULL, false); } uint8_t *tx = txbuf; @@ -1852,7 +1864,7 @@ void check_challenges(bool file_given, uint8_t *data) { // Add transmitted frame to total count if (txlen > 0) { // frame_count++; - LogTrace(tx, nbytes(txlen), HITAG_T_WAIT_2, 0, NULL, true); + LogTrace(tx, nbytes(txlen), HITAG_T_WAIT_2, HITAG_T_WAIT_2, NULL, true); } hitagS_receive_frame(rx, &rxlen, &response); diff --git a/armsrc/i2c.c b/armsrc/i2c.c index 3d1f050c3..1ca742893 100644 --- a/armsrc/i2c.c +++ b/armsrc/i2c.c @@ -27,19 +27,19 @@ #define SDA_H HIGH(GPIO_SDA) #define SDA_L LOW(GPIO_SDA) -#define SCL_read (AT91C_BASE_PIOA->PIO_PDSR & GPIO_SCL) -#define SDA_read (AT91C_BASE_PIOA->PIO_PDSR & GPIO_SDA) +#define SCL_read ((AT91C_BASE_PIOA->PIO_PDSR & GPIO_SCL) == GPIO_SCL) +#define SDA_read ((AT91C_BASE_PIOA->PIO_PDSR & GPIO_SDA) == GPIO_SDA) #define I2C_ERROR "I2C_WaitAck Error" -volatile unsigned long c; +static volatile uint32_t c; // Direct use the loop to delay. 6 instructions loop, Masterclock 48MHz, // delay=1 is about 200kbps // timer. // I2CSpinDelayClk(4) = 12.31us // I2CSpinDelayClk(1) = 3.07us -void __attribute__((optimize("O0"))) I2CSpinDelayClk(uint16_t delay) { +static void __attribute__((optimize("O0"))) I2CSpinDelayClk(uint16_t delay) { for (c = delay * 2; c; c--) {}; } @@ -47,6 +47,12 @@ void __attribute__((optimize("O0"))) I2CSpinDelayClk(uint16_t delay) { #define I2C_DELAY_2CLK I2CSpinDelayClk(2) #define I2C_DELAY_XCLK(x) I2CSpinDelayClk((x)) +#define I2C_DELAY_100us I2CSpinDelayClk( 100 / 3) +#define I2C_DELAY_600us I2CSpinDelayClk( 600 / 3) +#define I2C_DELAY_10ms I2CSpinDelayClk( 10 * 1000 / 3 ) +#define I2C_DELAY_30ms I2CSpinDelayClk( 30 * 1000 / 3 ) +#define I2C_DELAY_100ms I2CSpinDelayClk( 100 * 1000 / 3) + #define ISO7618_MAX_FRAME 255 // try i2c bus recovery at 100kHz = 5us high, 5us low @@ -69,6 +75,7 @@ void I2C_recovery(void) { //a STOP signal (SDA from low to high while CLK is high) SDA_L; WaitUS(5); + SCL_H; WaitUS(2); SDA_H; @@ -127,11 +134,11 @@ void I2C_Reset_EnterMainProgram(void) { StartTicks(); I2C_init(); I2C_SetResetStatus(0, 0, 0); - WaitMS(30); + I2C_DELAY_30ms; I2C_SetResetStatus(1, 0, 0); - WaitMS(30); + I2C_DELAY_30ms; I2C_SetResetStatus(1, 1, 1); - WaitMS(10); + I2C_DELAY_10ms; } // Reset the SIM_Adapter, then enter the bootloader program @@ -140,13 +147,13 @@ void I2C_Reset_EnterBootloader(void) { StartTicks(); I2C_init(); I2C_SetResetStatus(0, 1, 1); - WaitMS(100); + I2C_DELAY_100ms; I2C_SetResetStatus(1, 1, 1); - WaitMS(10); + I2C_DELAY_10ms; } // Wait for the clock to go High. -bool WaitSCL_H_delay(uint32_t delay) { +static bool WaitSCL_H_delay(uint32_t delay) { while (delay--) { if (SCL_read) { return true; @@ -158,11 +165,11 @@ bool WaitSCL_H_delay(uint32_t delay) { // 5000 * 3.07us = 15350us. 15.35ms // 15000 * 3.07us = 46050us. 46.05ms -bool WaitSCL_H(void) { +static bool WaitSCL_H(void) { return WaitSCL_H_delay(15000); } -bool WaitSCL_L_delay(uint32_t delay) { +static bool WaitSCL_L_delay(uint32_t delay) { while (delay--) { if (!SCL_read) { return true; @@ -172,26 +179,26 @@ bool WaitSCL_L_delay(uint32_t delay) { return false; } // 5000 * 3.07us = 15350us. 15.35ms -bool WaitSCL_L(void) { +static bool WaitSCL_L(void) { return WaitSCL_L_delay(15000); } // Wait max 1800ms or until SCL goes LOW. // It timeout reading response from card // Which ever comes first -bool WaitSCL_L_timeout(void) { - volatile uint16_t delay = 1800; +static bool WaitSCL_L_timeout(void) { + volatile uint32_t delay = 18000; while (delay--) { // exit on SCL LOW if (!SCL_read) return true; - WaitMS(1); + I2C_DELAY_100us; } return (delay == 0); } -bool I2C_Start(void) { +static bool I2C_Start(void) { I2C_DELAY_XCLK(4); SDA_H; @@ -209,7 +216,7 @@ bool I2C_Start(void) { return true; } -bool I2C_WaitForSim() { +static bool I2C_WaitForSim(void) { // wait for data from card if (!WaitSCL_L_timeout()) @@ -218,14 +225,14 @@ bool I2C_WaitForSim() { // 8051 speaks with smart card. // 1000*50*3.07 = 153.5ms // 1byte transfer == 1ms with max frame being 256bytes - if (!WaitSCL_H_delay(10 * 1000 * 50)) + if (!WaitSCL_H_delay(30 * 1000 * 50)) return false; return true; } // send i2c STOP -void I2C_Stop(void) { +static void I2C_Stop(void) { SCL_L; I2C_DELAY_2CLK; SDA_L; @@ -238,7 +245,7 @@ void I2C_Stop(void) { } // Send i2c ACK -void I2C_Ack(void) { +static void I2C_Ack(void) { SCL_L; I2C_DELAY_2CLK; SDA_L; @@ -251,7 +258,7 @@ void I2C_Ack(void) { } // Send i2c NACK -void I2C_NoAck(void) { +static void I2C_NoAck(void) { SCL_L; I2C_DELAY_2CLK; SDA_H; @@ -263,7 +270,7 @@ void I2C_NoAck(void) { I2C_DELAY_2CLK; } -bool I2C_WaitAck(void) { +static bool I2C_WaitAck(void) { SCL_L; I2C_DELAY_1CLK; SDA_H; @@ -282,7 +289,7 @@ bool I2C_WaitAck(void) { return true; } -void I2C_SendByte(uint8_t data) { +static void I2C_SendByte(uint8_t data) { uint8_t bits = 8; while (bits--) { @@ -308,7 +315,7 @@ void I2C_SendByte(uint8_t data) { SCL_L; } -int16_t I2C_ReadByte(void) { +static int16_t I2C_ReadByte(void) { uint8_t bits = 8, b = 0; SDA_H; @@ -433,7 +440,9 @@ int16_t I2C_BufferRead(uint8_t *data, uint8_t len, uint8_t device_cmd, uint8_t d // extra wait 500us (514us measured) // 200us (xx measured) - WaitUS(600); +// WaitUS(600); + I2C_DELAY_600us; + bool bBreak = true; uint16_t readcount = 0; @@ -474,7 +483,7 @@ int16_t I2C_BufferRead(uint8_t *data, uint8_t len, uint8_t device_cmd, uint8_t d *data = (uint8_t)tmp & 0xFF; len--; - // 读å–的第一个字节为åŽç»­é•¿åº¦ + // The first byte in response is the message length if (!readcount && (len > *data)) { len = *data; @@ -601,7 +610,7 @@ bool I2C_WriteFW(uint8_t *data, uint8_t len, uint8_t msb, uint8_t lsb, uint8_t d } void I2C_print_status(void) { - DbpString(_BLUE_("Smart card module (ISO 7816)")); + DbpString(_CYAN_("Smart card module (ISO 7816)")); uint8_t maj, min; if (I2C_get_version(&maj, &min) == PM3_SUCCESS) Dbprintf(" version................." _YELLOW_("v%x.%02d"), maj, min); @@ -617,9 +626,8 @@ int I2C_get_version(uint8_t *maj, uint8_t *min) { *maj = resp[0]; *min = resp[1]; return PM3_SUCCESS; - } else { - return PM3_EDEVNOTSUPP; } + return PM3_EDEVNOTSUPP; } // Will read response from smart card module, retries 3 times to get the data. @@ -650,7 +658,7 @@ bool sc_rx_bytes(uint8_t *dest, uint8_t *destlen) { return true; } -bool GetATR(smart_card_atr_t *card_ptr) { +bool GetATR(smart_card_atr_t *card_ptr, bool verbose) { if (!card_ptr) return false; @@ -658,19 +666,18 @@ bool GetATR(smart_card_atr_t *card_ptr) { card_ptr->atr_len = 0; memset(card_ptr->atr, 0, sizeof(card_ptr->atr)); - // Send ATR // start [C0 01] stop start C1 len aa bb cc stop] I2C_WriteCmd(I2C_DEVICE_CMD_GENERATE_ATR, I2C_DEVICE_ADDRESS_MAIN); //wait for sim card to answer. - // 1byte = 1ms , max frame 256bytes. SHould wait 256ms atleast just in case. - if (!I2C_WaitForSim()) + // 1byte = 1ms , max frame 256bytes. Should wait 256ms atleast just in case. + if (I2C_WaitForSim() == false) return false; // read bytes from module uint8_t len = sizeof(card_ptr->atr); - if (!sc_rx_bytes(card_ptr->atr, &len)) + if (sc_rx_bytes(card_ptr->atr, &len) == false) return false; uint8_t pos_td = 1; @@ -698,17 +705,19 @@ bool GetATR(smart_card_atr_t *card_ptr) { } card_ptr->atr_len = len; - LogTrace(card_ptr->atr, card_ptr->atr_len, 0, 0, NULL, false); + if (verbose) { + LogTrace(card_ptr->atr, card_ptr->atr_len, 0, 0, NULL, false); + } + return true; } void SmartCardAtr(void) { smart_card_atr_t card; LED_D_ON(); - clear_trace(); set_tracing(true); I2C_Reset_EnterMainProgram(); - bool isOK = GetATR(&card); + bool isOK = GetATR(&card, true); reply_mix(CMD_ACK, isOK, sizeof(smart_card_atr_t), 0, &card, sizeof(smart_card_atr_t)); set_tracing(false); LEDsoff(); @@ -722,10 +731,13 @@ void SmartCardRaw(uint64_t arg0, uint64_t arg1, uint8_t *data) { uint8_t *resp = BigBuf_malloc(ISO7618_MAX_FRAME); smartcard_command_t flags = arg0; - if ((flags & SC_CONNECT)) + if ((flags & SC_CLEARLOG) == SC_CLEARLOG) clear_trace(); - set_tracing(true); + if ((flags & SC_LOG) == SC_LOG) + set_tracing(true); + else + set_tracing(false); if ((flags & SC_CONNECT)) { @@ -733,7 +745,7 @@ void SmartCardRaw(uint64_t arg0, uint64_t arg1, uint8_t *data) { if ((flags & SC_SELECT)) { smart_card_atr_t card; - bool gotATR = GetATR(&card); + bool gotATR = GetATR(&card, true); //reply_old(CMD_ACK, gotATR, sizeof(smart_card_atr_t), 0, &card, sizeof(smart_card_atr_t)); if (!gotATR) goto OUT; @@ -799,7 +811,8 @@ void SmartCardUpgrade(uint64_t arg0) { } // writing takes time. - WaitMS(50); +// WaitMS(50); + I2C_DELAY_100ms; // read res = I2C_ReadFW(verfiydata, size, msb, lsb, I2C_DEVICE_ADDRESS_BOOT); diff --git a/armsrc/i2c.h b/armsrc/i2c.h index 7b1707502..5f0f6dd18 100644 --- a/armsrc/i2c.h +++ b/armsrc/i2c.h @@ -33,8 +33,9 @@ int16_t I2C_BufferRead(uint8_t *data, uint8_t len, uint8_t device_cmd, uint8_t d int16_t I2C_ReadFW(uint8_t *data, uint8_t len, uint8_t msb, uint8_t lsb, uint8_t device_address); bool I2C_WriteFW(uint8_t *data, uint8_t len, uint8_t msb, uint8_t lsb, uint8_t device_address); +bool sc_rx_bytes(uint8_t *dest, uint8_t *destlen); // -bool GetATR(smart_card_atr_t *card_ptr); +bool GetATR(smart_card_atr_t *card_ptr, bool verbose); // generice functions void SmartCardAtr(void); diff --git a/armsrc/iclass.c b/armsrc/iclass.c index 9ab2b5013..7f22b59cc 100644 --- a/armsrc/iclass.c +++ b/armsrc/iclass.c @@ -3,6 +3,7 @@ // Hagen Fritsch - June 2010 // Gerhard de Koning Gans - May 2011 // Gerhard de Koning Gans - June 2012 - Added iClass card and reader emulation +// piwi - 2019 // // This code is licensed to you under the terms of the GNU GPL, version 2 or, // at your option, any later version. See the LICENSE.txt file for the text of @@ -10,32 +11,10 @@ //----------------------------------------------------------------------------- // Routines to support iClass. //----------------------------------------------------------------------------- -// Based on ISO14443a implementation. Still in experimental phase. // Contribution made during a security research at Radboud University Nijmegen // // Please feel free to contribute and extend iClass support!! //----------------------------------------------------------------------------- -// -// FIX: -// ==== -// We still have sometimes a demodulation error when sniffing iClass communication. -// The resulting trace of a read-block-03 command may look something like this: -// -// + 22279: : 0c 03 e8 01 -// -// ...with an incorrect answer... -// -// + 85: 0: TAG ff! ff! ff! ff! ff! ff! ff! ff! bb 33 bb 00 01! 0e! 04! bb !crc -// -// We still left the error signalling bytes in the traces like 0xbb -// -// A correct trace should look like this: -// -// + 21112: : 0c 03 e8 01 -// + 85: 0: TAG ff ff ff ff ff ff ff ff ea f5 -// -//----------------------------------------------------------------------------- - #include "iclass.h" #include "proxmark3_arm.h" @@ -54,531 +33,38 @@ #include "dbprint.h" #include "protocols.h" #include "ticks.h" +#include "iso15693.h" -static int g_wait = 290; -static int timeout = 5000; -static uint32_t time_rdr = 0; -static uint32_t time_response = 0; - -static int SendIClassAnswer(uint8_t *resp, int respLen, uint16_t delay); -int doIClassSimulation(int simulationMode, uint8_t *reader_mac_buf); - -#define MODE_SIM_CSN 0 -#define MODE_EXIT_AFTER_MAC 1 -#define MODE_FULLSIM 2 - -#ifndef ICLASS_DMA_BUFFER_SIZE -# define ICLASS_DMA_BUFFER_SIZE 256 -#endif +static uint8_t get_pagemap(const picopass_hdr *hdr) { + return (hdr->conf.fuses & (FUSE_CRYPT0 | FUSE_CRYPT1)) >> 3; +} // The length of a received command will in most cases be no more than 18 bytes. -// 32 should be enough! +// we expect max 34 (32+2) bytes as tag answer (response to READ4) #ifndef ICLASS_BUFFER_SIZE -#define ICLASS_BUFFER_SIZE 32 +#define ICLASS_BUFFER_SIZE 34 + 2 #endif +#ifndef ICLASS_16KS_SIZE +#define ICLASS_16KS_SIZE 0x100 * 8 +#endif + +// iCLASS has a slightly different timing compared to ISO15693. According to the picopass data sheet the tag response is expected 330us after +// the reader command. This is measured from end of reader EOF to first modulation of the tag's SOF which starts with a 56,64us unmodulated period. +// 330us = 140 ssp_clk cycles @ 423,75kHz when simulating. +// 56,64us = 24 ssp_clk_cycles +#define DELAY_ICLASS_VCD_TO_VICC_SIM (140 - 26) // (140 - 24) + +// times in ssp_clk_cycles @ 3,3625MHz when acting as reader +#define DELAY_ICLASS_VICC_TO_VCD_READER DELAY_ISO15693_VICC_TO_VCD_READER + +// times in samples @ 212kHz when acting as reader +#define ICLASS_READER_TIMEOUT_ACTALL 330 // 1558us, nominal 330us + 7slots*160us = 1450us +#define ICLASS_READER_TIMEOUT_UPDATE 3390 // 16000us, nominal 4-15ms +#define ICLASS_READER_TIMEOUT_OTHERS 80 // 380us, nominal 330us + #define AddCrc(data, len) compute_crc(CRC_ICLASS, (data), (len), (data)+(len), (data)+(len)+1) -//----------------------------------------------------------------------------- -// The software UART that receives commands from the reader, and its state -// variables. -//----------------------------------------------------------------------------- -/* -typedef struct { - enum { - STATE_UNSYNCD, - STATE_START_OF_COMMUNICATION, - STATE_RECEIVING - } state; - uint16_t shiftReg; - int bitCnt; - int byteCnt; -// int byteCntMax; - int posCnt; - int nOutOfCnt; - int OutOfCnt; - int syncBit; - int samples; - int highCnt; - int swapper; - int counter; - int bitBuffer; - int dropPosition; - uint8_t *output; -} tUartIc; -*/ -typedef struct { - enum { - DEMOD_IC_UNSYNCD, - DEMOD_IC_START_OF_COMMUNICATION, - DEMOD_IC_START_OF_COMMUNICATION2, - DEMOD_IC_START_OF_COMMUNICATION3, - DEMOD_IC_SOF_COMPLETE, - DEMOD_IC_MANCHESTER_D, - DEMOD_IC_MANCHESTER_E, - DEMOD_IC_END_OF_COMMUNICATION, - DEMOD_IC_END_OF_COMMUNICATION2, - DEMOD_IC_MANCHESTER_F, - DEMOD_IC_ERROR_WAIT - } state; - int bitCount; - int posCount; - int syncBit; - uint16_t shiftReg; - uint32_t buffer; - uint32_t buffer2; - uint32_t buffer3; - int buff; - int samples; - int len; - enum { - SUB_NONE, - SUB_FIRST_HALF, - SUB_SECOND_HALF, - SUB_BOTH - } sub; - uint8_t *output; -} tDemodIc; - -/* -* Abrasive's uart implementation -* https://github.com/abrasive/proxmark3/commit/2b8bff7daea8ae1193bf7ee29b1fa46e95218902 -*/ -// Static vars for UART -typedef struct { - bool synced; - bool frame; - bool frame_done; - uint8_t *buf; - int len; -} tUartIc; -static tUartIc Uart; - -static void OnError(uint8_t reason) { - reply_mix(CMD_ACK, 0, reason, 0, 0, 0); - switch_off(); -} - -static void uart_reset(void) { - Uart.frame_done = false; - Uart.synced = false; - Uart.frame = false; -} - -static void uart_init(uint8_t *data) { - Uart.buf = data; - uart_reset(); -} - -static void uart_bit(uint8_t bit) { - static uint8_t buf = 0xff; - static uint8_t n_buf; - static int nmsg_byte; - buf <<= 1; - buf |= bit ? 1 : 0; - - if (!Uart.frame) { - if (buf == 0x7b) { // 0b0111 1011 - Uart.frame = true; - n_buf = 0; - Uart.len = 0; - nmsg_byte = 0; - } - } else { - static uint8_t msg_byte; - n_buf++; - if (n_buf == 8) { - msg_byte >>= 2; - switch (buf) { - case 0xbf: // 0 - 1011 1111 - break; - case 0xef: // 1 - 1110 1111 - msg_byte |= (1 << 6); - break; - case 0xfb: // 2 - 1111 1011 - msg_byte |= (2 << 6); - break; - case 0xfe: // 3 - 1111 1110 - msg_byte |= (3 << 6); - break; - case 0xdf: // eof - 1101 1111 - Uart.frame = false; - Uart.synced = false; - Uart.frame_done = true; - break; - default: - Uart.frame = false; - Uart.synced = false; - Dbprintf("[-] bad %02X at %d:%d", buf, Uart.len, nmsg_byte); - } - - if (Uart.frame) { // data bits - nmsg_byte += 2; - if (nmsg_byte >= 8) { - Uart.buf[Uart.len++] = msg_byte; - nmsg_byte = 0; - } - } - n_buf = 0; - buf = 0xff; - } - } -} - -static void uart_samples(uint8_t byte) { - static uint32_t buf; - static int window; - static int drop_next = 0; - - uint32_t falling; - int lz; - - if (!Uart.synced) { - if (byte == 0xFF) - return; - buf = 0xFFFFFFFF; - window = 0; - drop_next = 0; - Uart.synced = true; - } - - buf <<= 8; - buf |= byte; - - if (drop_next) { - drop_next = 0; - return; - } - -again: - falling = ~buf & ((buf >> 1) ^ buf) & (0xFF << window); - - uart_bit(!falling); - - if (!falling) - return; - - lz = __builtin_clz(falling) - 24 + window; - - // aim to get falling edge on fourth-leftmost bit of window - window += 3 - lz; - - if (window < 0) { - window += 8; - drop_next = 1; - } else if (window >= 8) { - window -= 8; - goto again; - } -} - - -/* -static void UartReset(){ - Uart.state = STATE_UNSYNCD; - Uart.shiftReg = 0; - Uart.bitCnt = 0; - Uart.byteCnt = 0; - Uart.posCnt = 0; - Uart.nOutOfCnt = 0; - Uart.OutOfCnt = 0; - Uart.syncBit = 0; - Uart.samples = 0; - Uart.highCnt = 0; - Uart.swapper = 0; - Uart.counter = 0; - Uart.bitBuffer = 0; - Uart.dropPosition = 0; -} -*/ - -/* -* READER TO CARD -* 1 out of 4 Decoding -* 1 out of 256 Decoding -*/ -/* -static RAMFUNC int OutOfNDecoding(int bit) { - //int error = 0; - int bitright; - - if (!Uart.bitBuffer) { - Uart.bitBuffer = bit ^ 0xFF0; - return false; - } else { - Uart.bitBuffer <<= 4; - Uart.bitBuffer ^= bit; - } - - // if (Uart.swapper) { - // Uart.output[Uart.byteCnt] = Uart.bitBuffer & 0xFF; - // Uart.byteCnt++; - // Uart.swapper = 0; - // if (Uart.byteCnt > 15) return true; - // } - // else { - // Uart.swapper = 1; - // } - - if (Uart.state != STATE_UNSYNCD) { - Uart.posCnt++; - - if ((Uart.bitBuffer & Uart.syncBit) ^ Uart.syncBit) - bit = 0; - else - bit = 1; - - if (((Uart.bitBuffer << 1) & Uart.syncBit) ^ Uart.syncBit) - bitright = 0; - else - bitright = 1; - - if(bit != bitright) - bit = bitright; - - - // So, now we only have to deal with *bit*, lets see... - if (Uart.posCnt == 1) { - // measurement first half bitperiod - if (!bit) { - // Drop in first half means that we are either seeing - // an SOF or an EOF. - - if (Uart.nOutOfCnt == 1) { - // End of Communication - Uart.state = STATE_UNSYNCD; - Uart.highCnt = 0; - if (Uart.byteCnt == 0) { - // Its not straightforward to show single EOFs - // So just leave it and do not return TRUE - Uart.output[0] = 0xf0; - Uart.byteCnt++; - } else { - return true; - } - } else if (Uart.state != STATE_START_OF_COMMUNICATION) { - // When not part of SOF or EOF, it is an error - Uart.state = STATE_UNSYNCD; - Uart.highCnt = 0; - //error = 4; - } - } - } else { - // measurement second half bitperiod - // Count the bitslot we are in... (ISO 15693) - Uart.nOutOfCnt++; - - if (!bit) { - if (Uart.dropPosition) { - if (Uart.state == STATE_START_OF_COMMUNICATION) { - //error = 1; - } else { - //error = 7; - } - // It is an error if we already have seen a drop in current frame - Uart.state = STATE_UNSYNCD; - Uart.highCnt = 0; - } else { - Uart.dropPosition = Uart.nOutOfCnt; - } - } - Uart.posCnt = 0; - - if (Uart.nOutOfCnt == Uart.OutOfCnt && Uart.OutOfCnt == 4) { - Uart.nOutOfCnt = 0; - - if (Uart.state == STATE_START_OF_COMMUNICATION) { - if (Uart.dropPosition == 4) { - Uart.state = STATE_RECEIVING; - Uart.OutOfCnt = 256; - } else if (Uart.dropPosition == 3) { - Uart.state = STATE_RECEIVING; - Uart.OutOfCnt = 4; - //Uart.output[Uart.byteCnt] = 0xdd; - //Uart.byteCnt++; - } else { - Uart.state = STATE_UNSYNCD; - Uart.highCnt = 0; - } - Uart.dropPosition = 0; - } else { - // RECEIVING DATA - // 1 out of 4 - if (!Uart.dropPosition) { - Uart.state = STATE_UNSYNCD; - Uart.highCnt = 0; - //error = 9; - } else { - Uart.shiftReg >>= 2; - - // Swap bit order - Uart.dropPosition--; - //if(Uart.dropPosition == 1) { Uart.dropPosition = 2; } - //else if(Uart.dropPosition == 2) { Uart.dropPosition = 1; } - - Uart.shiftReg ^= ((Uart.dropPosition & 0x03) << 6); - Uart.bitCnt += 2; - Uart.dropPosition = 0; - - if (Uart.bitCnt == 8) { - Uart.output[Uart.byteCnt] = (Uart.shiftReg & 0xff); - Uart.byteCnt++; - Uart.bitCnt = 0; - Uart.shiftReg = 0; - } - } - } - } else if (Uart.nOutOfCnt == Uart.OutOfCnt) { - // RECEIVING DATA - // 1 out of 256 - if (!Uart.dropPosition) { - Uart.state = STATE_UNSYNCD; - Uart.highCnt = 0; - //error = 3; - } else { - Uart.dropPosition--; - Uart.output[Uart.byteCnt] = (Uart.dropPosition & 0xff); - Uart.byteCnt++; - Uart.bitCnt = 0; - Uart.shiftReg = 0; - Uart.nOutOfCnt = 0; - Uart.dropPosition = 0; - } - } -*/ -/*if (error) { - Uart.output[Uart.byteCnt] = 0xAA; - Uart.byteCnt++; - Uart.output[Uart.byteCnt] = error & 0xFF; - Uart.byteCnt++; - Uart.output[Uart.byteCnt] = 0xAA; - Uart.byteCnt++; - Uart.output[Uart.byteCnt] = (Uart.bitBuffer >> 8) & 0xFF; - Uart.byteCnt++; - Uart.output[Uart.byteCnt] = Uart.bitBuffer & 0xFF; - Uart.byteCnt++; - Uart.output[Uart.byteCnt] = (Uart.syncBit >> 3) & 0xFF; - Uart.byteCnt++; - Uart.output[Uart.byteCnt] = 0xAA; - Uart.byteCnt++; - return true; -}*/ -/* - } - } else { - bit = Uart.bitBuffer & 0xf0; - bit >>= 4; - bit ^= 0x0F; // drops become 1s ;-) - if (bit) { - // should have been high or at least (4 * 128) / fc - // according to ISO this should be at least (9 * 128 + 20) / fc - if (Uart.highCnt == 8) { - // we went low, so this could be start of communication - // it turns out to be safer to choose a less significant - // syncbit... so we check whether the neighbour also represents the drop - Uart.posCnt = 1; // apparently we are busy with our first half bit period - Uart.syncBit = bit & 8; - Uart.samples = 3; - - if (!Uart.syncBit) { Uart.syncBit = bit & 4; Uart.samples = 2; } - else if (bit & 4) { Uart.syncBit = bit & 4; Uart.samples = 2; bit <<= 2; } - - if (!Uart.syncBit) { Uart.syncBit = bit & 2; Uart.samples = 1; } - else if (bit & 2) { Uart.syncBit = bit & 2; Uart.samples = 1; bit <<= 1; } - - if (!Uart.syncBit) { Uart.syncBit = bit & 1; Uart.samples = 0; - if (Uart.syncBit && (Uart.bitBuffer & 8)) { - Uart.syncBit = 8; - - // the first half bit period is expected in next sample - Uart.posCnt = 0; - Uart.samples = 3; - } - } else if (bit & 1) { Uart.syncBit = bit & 1; Uart.samples = 0; } - - Uart.syncBit <<= 4; - Uart.state = STATE_START_OF_COMMUNICATION; - Uart.bitCnt = 0; - Uart.byteCnt = 0; - Uart.nOutOfCnt = 0; - Uart.OutOfCnt = 4; // Start at 1/4, could switch to 1/256 - Uart.dropPosition = 0; - Uart.shiftReg = 0; - //error = 0; - } else { - Uart.highCnt = 0; - } - } else { - if (Uart.highCnt < 8) - Uart.highCnt++; - } - } - return false; -} -*/ -//============================================================================= -// Manchester -//============================================================================= -static tDemodIc Demod; -static void DemodIcReset() { - Demod.bitCount = 0; - Demod.posCount = 0; - Demod.syncBit = 0; - Demod.shiftReg = 0; - Demod.buffer = 0; - Demod.buffer2 = 0; - Demod.buffer3 = 0; - Demod.buff = 0; - Demod.samples = 0; - Demod.len = 0; - Demod.sub = SUB_NONE; - Demod.state = DEMOD_IC_UNSYNCD; -} -static void DemodIcInit(uint8_t *data) { - Demod.output = data; - DemodIcReset(); -} - -// UART debug -// it adds the debug values which will be put in the tracelog, -// visible on client when running 'hf list iclass' -/* -pm3 --> hf li iclass -Recorded Activity (TraceLen = 162 bytes) - Start | End | Src | Data (! denotes parity error) | CRC | Annotation | -------------|------------|-----|-----------------------------------------------------------------|-----|--------------------| - 0 | 0 | Rdr |0a | | ACTALL - 1280 | 1280 | Tag |bb! 33! bb! 01 02 04 08 bb! | ok | - 1280 | 1280 | Rdr |0c | | IDENTIFY - 1616 | 1616 | Tag |bb! 33! bb! 00! 02 00! 02 bb! | ok | - 1616 | 1616 | Rdr |0a | | ACTALL - 2336 | 2336 | Tag |bb! d4! bb! 02 08 00! 08 bb! | ok | - 2336 | 2336 | Rdr |0c | | IDENTIFY - 2448 | 2448 | Tag |bb! 33! bb! 00! 00! 00! 02 bb! | ok | - 2448 | 2448 | Rdr |0a | | ACTALL - 2720 | 2720 | Tag |bb! d4! bb! 08 0b 01 04 bb! | ok | - 2720 | 2720 | Rdr |0c | | IDENTIFY - 3232 | 3232 | Tag |bb! d4! bb! 02 02 08 04 bb! | ok | -*/ -static void uart_debug(int error, int bit) { - Demod.output[Demod.len] = 0xBB; - Demod.len++; - Demod.output[Demod.len] = error & 0xFF; - Demod.len++; - Demod.output[Demod.len] = 0xBB; - Demod.len++; - Demod.output[Demod.len] = bit & 0xFF; - Demod.len++; - Demod.output[Demod.len] = Demod.buffer & 0xFF; - Demod.len++; - // Look harder ;-) - Demod.output[Demod.len] = Demod.buffer2 & 0xFF; - Demod.len++; - Demod.output[Demod.len] = Demod.syncBit & 0xFF; - Demod.len++; - Demod.output[Demod.len] = 0xBB; - Demod.len++; -} /* * CARD TO READER @@ -596,568 +82,63 @@ static void uart_debug(int error, int bit) { * * So for current implementation in ISO15693, its 330 µs from end of reader, to start of card. */ -static RAMFUNC int ManchesterDecoding_iclass(uint32_t v) { - int bit; - int modulation; - int error = 0; - - bit = Demod.buffer; - Demod.buffer = Demod.buffer2; - Demod.buffer2 = Demod.buffer3; - Demod.buffer3 = v; - - // too few bits? - if (Demod.buff < 3) { - Demod.buff++; - return false; - } - - if (Demod.state == DEMOD_IC_UNSYNCD) { - Demod.output[Demod.len] = 0xfa; - Demod.syncBit = 0; - //Demod.samples = 0; - Demod.posCount = 1; // This is the first half bit period, so after syncing handle the second part - - if (bit & 0x08) - Demod.syncBit = 0x08; - - if (bit & 0x04) { - if (Demod.syncBit) - bit <<= 4; - - Demod.syncBit = 0x04; - } - - if (bit & 0x02) { - if (Demod.syncBit) - bit <<= 2; - - Demod.syncBit = 0x02; - } - - if (bit & 0x01 && Demod.syncBit) - Demod.syncBit = 0x01; - - if (Demod.syncBit) { - Demod.len = 0; - Demod.state = DEMOD_IC_START_OF_COMMUNICATION; - Demod.sub = SUB_FIRST_HALF; - Demod.bitCount = 0; - Demod.shiftReg = 0; - Demod.samples = 0; - - if (Demod.posCount) { - - switch (Demod.syncBit) { - case 0x08: - Demod.samples = 3; - break; - case 0x04: - Demod.samples = 2; - break; - case 0x02: - Demod.samples = 1; - break; - case 0x01: - Demod.samples = 0; - break; - } - // SOF must be long burst... otherwise stay unsynced!!! - if (!(Demod.buffer & Demod.syncBit) || !(Demod.buffer2 & Demod.syncBit)) - Demod.state = DEMOD_IC_UNSYNCD; - - } else { - // SOF must be long burst... otherwise stay unsynced!!! - if (!(Demod.buffer2 & Demod.syncBit) || !(Demod.buffer3 & Demod.syncBit)) { - Demod.state = DEMOD_IC_UNSYNCD; - error = 0x88; - uart_debug(error, bit); - return false; - } - } - } - return false; - } - - // state is DEMOD is in SYNC from here on. - - modulation = bit & Demod.syncBit; - modulation |= ((bit << 1) ^ ((Demod.buffer & 0x08) >> 3)) & Demod.syncBit; - Demod.samples += 4; - - if (Demod.posCount == 0) { - Demod.posCount = 1; - Demod.sub = (modulation) ? SUB_FIRST_HALF : SUB_NONE; - return false; - } - - Demod.posCount = 0; - - if (modulation) { - - if (Demod.sub == SUB_FIRST_HALF) - Demod.sub = SUB_BOTH; - else - Demod.sub = SUB_SECOND_HALF; - } - - if (Demod.sub == SUB_NONE) { - if (Demod.state == DEMOD_IC_SOF_COMPLETE) { - Demod.output[Demod.len] = 0x0f; - Demod.len++; - Demod.state = DEMOD_IC_UNSYNCD; - return true; - } else { - Demod.state = DEMOD_IC_ERROR_WAIT; - error = 0x33; - } - } - - switch (Demod.state) { - - case DEMOD_IC_START_OF_COMMUNICATION: - if (Demod.sub == SUB_BOTH) { - - Demod.state = DEMOD_IC_START_OF_COMMUNICATION2; - Demod.posCount = 1; - Demod.sub = SUB_NONE; - } else { - Demod.output[Demod.len] = 0xab; - Demod.state = DEMOD_IC_ERROR_WAIT; - error = 0xd2; - } - break; - - case DEMOD_IC_START_OF_COMMUNICATION2: - if (Demod.sub == SUB_SECOND_HALF) { - Demod.state = DEMOD_IC_START_OF_COMMUNICATION3; - } else { - Demod.output[Demod.len] = 0xab; - Demod.state = DEMOD_IC_ERROR_WAIT; - error = 0xd3; - } - break; - - case DEMOD_IC_START_OF_COMMUNICATION3: - if (Demod.sub == SUB_SECOND_HALF) { - Demod.state = DEMOD_IC_SOF_COMPLETE; - } else { - Demod.output[Demod.len] = 0xab; - Demod.state = DEMOD_IC_ERROR_WAIT; - error = 0xd4; - } - break; - - case DEMOD_IC_SOF_COMPLETE: - case DEMOD_IC_MANCHESTER_D: - case DEMOD_IC_MANCHESTER_E: - // OPPOSITE FROM ISO14443 - 11110000 = 0 (1 in 14443) - // 00001111 = 1 (0 in 14443) - if (Demod.sub == SUB_SECOND_HALF) { // SUB_FIRST_HALF - Demod.bitCount++; - Demod.shiftReg = (Demod.shiftReg >> 1) ^ 0x100; - Demod.state = DEMOD_IC_MANCHESTER_D; - } else if (Demod.sub == SUB_FIRST_HALF) { // SUB_SECOND_HALF - Demod.bitCount++; - Demod.shiftReg >>= 1; - Demod.state = DEMOD_IC_MANCHESTER_E; - } else if (Demod.sub == SUB_BOTH) { - Demod.state = DEMOD_IC_MANCHESTER_F; - } else { - Demod.state = DEMOD_IC_ERROR_WAIT; - error = 0x55; - } - break; - - case DEMOD_IC_MANCHESTER_F: - // Tag response does not need to be a complete byte! - if (Demod.len > 0 || Demod.bitCount > 0) { - if (Demod.bitCount > 1) { // was > 0, do not interpret last closing bit, is part of EOF - Demod.shiftReg >>= (9 - Demod.bitCount); // right align data - Demod.output[Demod.len] = Demod.shiftReg & 0xff; - Demod.len++; - } - - Demod.state = DEMOD_IC_UNSYNCD; - return true; - } else { - Demod.output[Demod.len] = 0xad; - Demod.state = DEMOD_IC_ERROR_WAIT; - error = 0x03; - } - break; - - case DEMOD_IC_ERROR_WAIT: - Demod.state = DEMOD_IC_UNSYNCD; - break; - - default: - Demod.output[Demod.len] = 0xdd; - Demod.state = DEMOD_IC_UNSYNCD; - break; - } - - if (Demod.bitCount >= 8) { - Demod.shiftReg >>= 1; - Demod.output[Demod.len] = (Demod.shiftReg & 0xff); - Demod.len++; - Demod.bitCount = 0; - Demod.shiftReg = 0; - } - - if (error) { - uart_debug(error, bit); - return true; - } - - return false; -} //============================================================================= -// Finally, a `sniffer' for iClass communication +// a `sniffer' for iClass communication // Both sides of communication! //============================================================================= -static void iclass_setup_sniff(void) { - if (DBGLEVEL > 3) Dbprintf("iclass_setup_sniff Enter"); - - LEDsoff(); - - FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - - FpgaDownloadAndGo(FPGA_BITSTREAM_HF); - - // connect Demodulated Signal to ADC: - SetAdcMuxFor(GPIO_MUXSEL_HIPKD); - - // Set up the synchronous serial port - FpgaSetupSsc(); - - BigBuf_free(); - BigBuf_Clear_ext(false); - clear_trace(); - set_tracing(true); - - // Initialize Demod and Uart structs - DemodIcInit(BigBuf_malloc(ICLASS_BUFFER_SIZE)); - - uart_init(BigBuf_malloc(ICLASS_BUFFER_SIZE)); - //UartIcInit(BigBuf_malloc(ICLASS_BUFFER_SIZE)); - - if (DBGLEVEL > 1) { - // Print debug information about the buffer sizes - Dbprintf("[+] Sniffing buffers initialized:"); - Dbprintf(" Trace: %i bytes", BigBuf_max_traceLen()); - Dbprintf(" Reader -> tag: %i bytes", ICLASS_BUFFER_SIZE); - Dbprintf(" tag -> Reader: %i bytes", ICLASS_BUFFER_SIZE); - Dbprintf(" DMA: %i bytes", ICLASS_DMA_BUFFER_SIZE); - } - - // Set FPGA in the appropriate mode - // put the FPGA in the appropriate mode - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_SNIFFER); - SpinDelay(200); - - // Start the SSP timer - StartCountSspClk(); - - LED_A_ON(); - if (DBGLEVEL > 3) Dbprintf("[+] iclass_setup_sniff Exit"); +void SniffIClass(uint8_t jam_search_len, uint8_t *jam_search_string) { + SniffIso15693(jam_search_len, jam_search_string); } -//----------------------------------------------------------------------------- -// Record the sequence of commands sent by the reader to the tag, with -// triggering so that we start recording at the point that the tag is moved -// near the reader. -//----------------------------------------------------------------------------- -// turn off afterwards -void RAMFUNC SniffIClass(void) { - - //int datalen = 0; - uint32_t previous_data = 0; - uint32_t time_0 = 0, time_start = 0, time_stop; - uint32_t sniffCounter = 0; - bool TagIsActive = false; - bool ReaderIsActive = false; - - iclass_setup_sniff(); - - // The DMA buffer, used to stream samples from the FPGA - // *dmaBuf is the start reference. - uint8_t *dmaBuf = BigBuf_malloc(ICLASS_DMA_BUFFER_SIZE); - // pointer to samples from fpga - uint8_t *data = dmaBuf; - - // Setup and start DMA. - if (!FpgaSetupSscDma(dmaBuf, ICLASS_DMA_BUFFER_SIZE)) { - if (DBGLEVEL > 1) DbpString("[-] FpgaSetupSscDma failed. Exiting"); - return; +static void rotateCSN(uint8_t *original_csn, uint8_t *rotated_csn) { + for (uint8_t i = 0; i < 8; i++) { + rotated_csn[i] = (original_csn[i] >> 3) | (original_csn[(i + 1) % 8] << 5); } - - // time ZERO, the point from which it all is calculated. - time_0 = GetCountSspClk(); - - // loop and listen - // every sample (1byte in data), - // contains HIGH nibble = reader data - // contains LOW nibble = tag data - // so two bytes are needed in order to get 1byte of either reader or tag data. (ie 2 sample bytes) - // since reader data is manchester encoded, we need 2bytes of data in order to get one demoded byte. (ie: 4 sample bytes) - uint16_t checked = 0; - for (;;) { - WDT_HIT(); - - if (checked == 1000) { - if (BUTTON_PRESS() || data_available()) break; - checked = 0; - } - ++checked; - - previous_data <<= 8; - previous_data |= *data; - - sniffCounter++; - data++; - - if (data == dmaBuf + ICLASS_DMA_BUFFER_SIZE) { - data = dmaBuf; - AT91C_BASE_PDC_SSC->PDC_RNPR = (uint32_t) dmaBuf; - AT91C_BASE_PDC_SSC->PDC_RNCR = ICLASS_DMA_BUFFER_SIZE; - } - - // every odd sample - if (sniffCounter & 0x01) { - // no need to try decoding reader data if the tag is sending - // READER TO CARD - if (!TagIsActive) { - LED_C_INV(); - // HIGH nibble is always reader data. - uint8_t reader_byte = (previous_data & 0xF0) | (*data >> 4); - uart_samples(reader_byte); - if (Uart.frame_done) { - time_stop = GetCountSspClk() - time_0; - LogTrace(Uart.buf, Uart.len, time_start, time_stop, NULL, true); - DemodIcReset(); - uart_reset(); - } else { - time_start = GetCountSspClk() - time_0; - } - ReaderIsActive = Uart.frame_done; - } - } - // every four sample - if ((sniffCounter % 4) == 0) { - // need two samples to feed Manchester - // no need to try decoding tag data if the reader is sending - and we cannot afford the time - // CARD TO READER - if (!ReaderIsActive) { - LED_C_INV(); - // LOW nibble is always tag data. - /* - uint32_t tag_byte = - ((previous_data & 0x0F000000) >> 8 ) | - ((previous_data & 0x000F0000) >> 4 ) | - ((previous_data & 0x00000F00) ) | - ((previous_data & 0x0000000F) << 4 ) | - (*data & 0xF); - */ - - - uint8_t tag_byte = ((previous_data & 0xF) << 4) | (*data & 0xF); - if (ManchesterDecoding_iclass(tag_byte)) { - time_stop = GetCountSspClk() - time_0; - LogTrace(Demod.output, Demod.len, time_start, time_stop, NULL, false); - DemodIcReset(); - uart_reset(); - } else { - time_start = GetCountSspClk() - time_0; - } - TagIsActive = (Demod.state != DEMOD_IC_UNSYNCD); - } - } - } // end main loop - - /* - if (DBGLEVEL >= 1) { - DbpString("[+] Sniff statistics:"); - Dbhexdump(ICLASS_DMA_BUFFER_SIZE, data, false); - } - */ - switch_off(); } -void rotateCSN(uint8_t *originalCSN, uint8_t *rotatedCSN) { - int i; - for (i = 0; i < 8; i++) - rotatedCSN[i] = (originalCSN[i] >> 3) | (originalCSN[(i + 1) % 8] << 5); -} - -//----------------------------------------------------------------------------- -// SIMULATION -// Wait for commands from reader -// Stop when button is pressed -// Or return TRUE when command is captured -//----------------------------------------------------------------------------- -static bool GetIClassCommandFromReader(uint8_t *received, int *len, int maxLen) { - // Set FPGA mode to "simulated ISO 14443 tag", no modulation (listen - // only, since we are receiving, not transmitting). - // Signal field is off with the appropriate LED - LED_D_OFF(); - uart_init(received); - - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_TAGSIM_LISTEN); - // clear RXRDY: - uint8_t b = (uint8_t)AT91C_BASE_SSC->SSC_RHR; - (void)b; - - uint16_t checked = 0; - for (;;) { - - WDT_HIT(); - - if (checked == 1000) { - if (BUTTON_PRESS() || data_available()) return false; - checked = 0; - } - ++checked; - - // keep tx buffer in a defined state anyway. - if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) - AT91C_BASE_SSC->SSC_THR = 0x00; - - // wait for byte to become available in rx holding register - if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) { - b = (uint8_t)AT91C_BASE_SSC->SSC_RHR; - - uart_samples(b); - if (Uart.frame_done) { - *len = Uart.len; - return true; - } - } - } - return false; +// Encode SOF only +static void CodeIClassTagSOF(void) { + tosend_reset(); + tosend_t *ts = get_tosend(); + ts->buf[++ts->max] = 0x1D; + ts->max++; } /* -static uint8_t encode4Bits(const uint8_t b) { - // OTA, the least significant bits first - // Manchester encoding added - // The columns are - // 1 - Bit value to send - // 2 - Reversed (big-endian) - // 3 - Machester Encoded - // 4 - Hex values - - uint8_t c = b & 0xF; - switch (c) { - // 1 2 3 4 - case 15: - return 0x55; // 1111 -> 1111 -> 01010101 -> 0x55 - case 14: - return 0x95; // 1110 -> 0111 -> 10010101 -> 0x95 - case 13: - return 0x65; // 1101 -> 1011 -> 01100101 -> 0x65 - case 12: - return 0xa5; // 1100 -> 0011 -> 10100101 -> 0xa5 - case 11: - return 0x59; // 1011 -> 1101 -> 01011001 -> 0x59 - case 10: - return 0x99; // 1010 -> 0101 -> 10011001 -> 0x99 - case 9: - return 0x69; // 1001 -> 1001 -> 01101001 -> 0x69 - case 8: - return 0xa9; // 1000 -> 0001 -> 10101001 -> 0xa9 - case 7: - return 0x56; // 0111 -> 1110 -> 01010110 -> 0x56 - case 6: - return 0x96; // 0110 -> 0110 -> 10010110 -> 0x96 - case 5: - return 0x66; // 0101 -> 1010 -> 01100110 -> 0x66 - case 4: - return 0xa6; // 0100 -> 0010 -> 10100110 -> 0xa6 - case 3: - return 0x5a; // 0011 -> 1100 -> 01011010 -> 0x5a - case 2: - return 0x9a; // 0010 -> 0100 -> 10011010 -> 0x9a - case 1: - return 0x6a; // 0001 -> 1000 -> 01101010 -> 0x6a - default: - return 0xaa; // 0000 -> 0000 -> 10101010 -> 0xaa - } -} -*/ - -static uint8_t lut_enc[] = { 0xAA, 0x6A, 0x9A, 0x5A, 0xA6, 0x66, 0x96, 0x56, 0xA9, 0x69, 0x99, 0x59, 0xA5, 0x65, 0x95, 0x55 }; - -//----------------------------------------------------------------------------- -// Prepare tag messages -//----------------------------------------------------------------------------- -static void CodeIClassTagAnswer(const uint8_t *cmd, int len) { - /* - * SOF comprises 3 parts; - * * An unmodulated time of 56.64 us - * * 24 pulses of 423.75 kHz (fc/32) - * * A logic 1, which starts with an unmodulated time of 18.88us - * followed by 8 pulses of 423.75kHz (fc/32) - * - * - * EOF comprises 3 parts: - * - A logic 0 (which starts with 8 pulses of fc/32 followed by an unmodulated - * time of 18.88us. - * - 24 pulses of fc/32 - * - An unmodulated time of 56.64 us - * - * - * A logic 0 starts with 8 pulses of fc/32 - * followed by an unmodulated time of 256/fc (~18,88us). - * - * A logic 0 starts with unmodulated time of 256/fc (~18,88us) followed by - * 8 pulses of fc/32 (also 18.88us) - * - * The mode FPGA_HF_SIMULATOR_MODULATE_424K_8BIT which we use to simulate tag, - * works like this. - * - A 1-bit input to the FPGA becomes 8 pulses on 423.5kHz (fc/32) (18.88us). - * - A 0-bit input to the FPGA becomes an unmodulated time of 18.88us - * - * In this mode - * SOF can be written as 00011101 = 0x1D - * EOF can be written as 10111000 = 0xb8 - * logic 1 be written as 01 = 0x1 - * logic 0 be written as 10 = 0x2 - * - * */ - ToSendReset(); - - // Send SOF - ToSend[++ToSendMax] = 0x1D; - - int i; - for (i = 0; i < len; i++) { - uint8_t b = cmd[i]; - ToSend[++ToSendMax] = lut_enc[b & 0xF]; // least significant half - ToSend[++ToSendMax] = lut_enc[(b >> 4) & 0xF]; // most significant half - } - - // Send EOF - ToSend[++ToSendMax] = 0xB8; - //lastProxToAirDuration = 8*ToSendMax - 3*8 - 3*8;//Not counting zeroes in the beginning or end - // Convert from last byte pos to length - ToSendMax++; -} - -// Only SOF -static void CodeIClassTagSOF() { - //So far a dummy implementation, not used - //int lastProxToAirDuration =0; - - ToSendReset(); - // Send SOF - ToSend[++ToSendMax] = 0x1D; - // lastProxToAirDuration = 8*ToSendMax - 3*8;//Not counting zeroes in the beginning - - // Convert from last byte pos to length - ToSendMax++; -} + * SOF comprises 3 parts; + * * An unmodulated time of 56.64 us + * * 24 pulses of 423.75 kHz (fc/32) + * * A logic 1, which starts with an unmodulated time of 18.88us + * followed by 8 pulses of 423.75kHz (fc/32) + * + * + * EOF comprises 3 parts: + * - A logic 0 (which starts with 8 pulses of fc/32 followed by an unmodulated + * time of 18.88us. + * - 24 pulses of fc/32 + * - An unmodulated time of 56.64 us + * + * + * A logic 0 starts with 8 pulses of fc/32 + * followed by an unmodulated time of 256/fc (~18,88us). + * + * A logic 0 starts with unmodulated time of 256/fc (~18,88us) followed by + * 8 pulses of fc/32 (also 18.88us) + * + * The mode FPGA_HF_SIMULATOR_MODULATE_424K_8BIT which we use to simulate tag, + * works like this. + * - A 1-bit input to the FPGA becomes 8 pulses on 423.5kHz (fc/32) (18.88us). + * - A 0-bit input to the FPGA becomes an unmodulated time of 18.88us + * + * In this mode + * SOF can be written as 00011101 = 0x1D + * EOF can be written as 10111000 = 0xb8 + * logic 1 be written as 01 = 0x1 + * logic 0 be written as 10 = 0x2 + * + * + */ /** * @brief SimulateIClass simulates an iClass card. @@ -1173,70 +154,90 @@ static void CodeIClassTagSOF() { */ // turn off afterwards void SimulateIClass(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain) { + iclass_simulate(arg0, arg1, arg2, datain, NULL, NULL); +} - if (DBGLEVEL > 3) Dbprintf("[+] iClass_simulate Enter"); +void iclass_simulate(uint8_t sim_type, uint8_t num_csns, bool send_reply, uint8_t *datain, uint8_t *dataout, uint16_t *dataoutlen) { LEDsoff(); - FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - // this will clear out bigbuf memory, the eload command must select this before! - FpgaDownloadAndGo(FPGA_BITSTREAM_HF); - FpgaSetupSsc(); - SetAdcMuxFor(GPIO_MUXSEL_HIPKD); + Iso15693InitTag(); - // Enable and clear the trace clear_trace(); - set_tracing(true); - uint32_t simType = arg0; - uint32_t numberOfCSNS = arg1; + // only logg if we are called from the client. + set_tracing(send_reply); //Use the emulator memory for SIM uint8_t *emulator = BigBuf_get_EM_addr(); uint8_t mac_responses[PM3_CMD_DATA_SIZE] = { 0 }; - if (simType == 0) { + if (sim_type == ICLASS_SIM_MODE_CSN) { // Use the CSN from commandline memcpy(emulator, datain, 8); - doIClassSimulation(MODE_SIM_CSN, NULL); - } else if (simType == 1) { - //Default CSN - uint8_t csn_crc[] = { 0x03, 0x1f, 0xec, 0x8a, 0xf7, 0xff, 0x12, 0xe0, 0x00, 0x00 }; - // Use the CSN from commandline - memcpy(emulator, csn_crc, 8); - doIClassSimulation(MODE_SIM_CSN, NULL); - } else if (simType == 2) { + do_iclass_simulation(ICLASS_SIM_MODE_CSN, NULL); - Dbprintf("[+] going into attack mode, %d CSNS sent", numberOfCSNS); + } else if (sim_type == ICLASS_SIM_MODE_CSN_DEFAULT) { + //Default CSN + uint8_t csn[] = { 0x03, 0x1f, 0xec, 0x8a, 0xf7, 0xff, 0x12, 0xe0 }; + // Use the CSN from commandline + memcpy(emulator, csn, 8); + do_iclass_simulation(ICLASS_SIM_MODE_CSN, NULL); + + } else if (sim_type == ICLASS_SIM_MODE_READER_ATTACK) { + + Dbprintf("going into attack mode, %d CSNS sent", num_csns); // In this mode, a number of csns are within datain. We'll simulate each one, one at a time // in order to collect MAC's from the reader. This can later be used in an offlne-attack // in order to obtain the keys, as in the "dismantling iclass"-paper. #define EPURSE_MAC_SIZE 16 int i = 0; - for (; i < numberOfCSNS && i * EPURSE_MAC_SIZE + 8 < PM3_CMD_DATA_SIZE; i++) { - // The usb data is 512 bytes, fitting 65 8-byte CSNs in there. + for (; i < num_csns && i * EPURSE_MAC_SIZE + 8 < PM3_CMD_DATA_SIZE; i++) { memcpy(emulator, datain + (i * 8), 8); - if (doIClassSimulation(MODE_EXIT_AFTER_MAC, mac_responses + i * EPURSE_MAC_SIZE)) { + if (do_iclass_simulation(ICLASS_SIM_MODE_EXIT_AFTER_MAC, mac_responses + i * EPURSE_MAC_SIZE)) { + + if (dataoutlen) + *dataoutlen = i * EPURSE_MAC_SIZE; + // Button pressed - reply_old(CMD_ACK, CMD_HF_ICLASS_SIMULATE, i, 0, mac_responses, i * EPURSE_MAC_SIZE); + if (send_reply) + reply_old(CMD_ACK, CMD_HF_ICLASS_SIMULATE, i, 0, mac_responses, i * EPURSE_MAC_SIZE); goto out; } } - reply_old(CMD_ACK, CMD_HF_ICLASS_SIMULATE, i, 0, mac_responses, i * EPURSE_MAC_SIZE); + if (dataoutlen) + *dataoutlen = i * EPURSE_MAC_SIZE; + + if (send_reply) + reply_old(CMD_ACK, CMD_HF_ICLASS_SIMULATE, i, 0, mac_responses, i * EPURSE_MAC_SIZE); + + } else if (sim_type == ICLASS_SIM_MODE_FULL) { - } else if (simType == 3) { //This is 'full sim' mode, where we use the emulator storage for data. //ie: BigBuf_get_EM_addr should be previously filled with data from the "eload" command - doIClassSimulation(MODE_FULLSIM, NULL); - } else if (simType == 4) { + picopass_hdr *hdr = (picopass_hdr *)BigBuf_get_EM_addr(); + uint8_t pagemap = get_pagemap(hdr); + if (pagemap == PICOPASS_NON_SECURE_PAGEMODE) { + do_iclass_simulation_nonsec(); + } else { + do_iclass_simulation(ICLASS_SIM_MODE_FULL, NULL); + } + + } else if (sim_type == ICLASS_SIM_MODE_CONFIG_CARD) { + + // config card + do_iclass_simulation(ICLASS_SIM_MODE_FULL, NULL); + // swap bin + + } else if (sim_type == ICLASS_SIM_MODE_READER_ATTACK_KEYROLL) { // This is the KEYROLL version of sim 2. // the collected data (mac_response) is doubled out since we are trying to collect both keys in the keyroll process. // Keyroll iceman 9 csns * 8 * 2 = 144 // keyroll CARL55 15csns * 8 * 2 = 15 * 8 * 2 = 240 - Dbprintf("[+] going into attack keyroll mode, %d CSNS sent", numberOfCSNS); + Dbprintf("going into attack keyroll mode, %d CSNS sent", num_csns); // In this mode, a number of csns are within datain. We'll simulate each one, one at a time // in order to collect MAC's from the reader. This can later be used in an offlne-attack // in order to obtain the keys, as in the "dismantling iclass"-paper. @@ -1245,53 +246,81 @@ void SimulateIClass(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain // attack below is same as SIM 2, but we run the CSN twice to collected the mac for both keys. int i = 0; // The usb data is 512 bytes, fitting 65 8-byte CSNs in there. iceman fork uses 9 CSNS - for (; i < numberOfCSNS && i * EPURSE_MAC_SIZE + 8 < PM3_CMD_DATA_SIZE; i++) { + for (; i < num_csns && i * EPURSE_MAC_SIZE + 8 < PM3_CMD_DATA_SIZE; i++) { memcpy(emulator, datain + (i * 8), 8); // keyroll 1 - if (doIClassSimulation(MODE_EXIT_AFTER_MAC, mac_responses + i * EPURSE_MAC_SIZE)) { - reply_old(CMD_ACK, CMD_HF_ICLASS_SIMULATE, i * 2, 0, mac_responses, i * EPURSE_MAC_SIZE * 2); + if (do_iclass_simulation(ICLASS_SIM_MODE_EXIT_AFTER_MAC, mac_responses + i * EPURSE_MAC_SIZE)) { + + if (dataoutlen) + *dataoutlen = i * EPURSE_MAC_SIZE * 2; + + if (send_reply) + reply_old(CMD_ACK, CMD_HF_ICLASS_SIMULATE, i * 2, 0, mac_responses, i * EPURSE_MAC_SIZE * 2); + // Button pressed goto out; } // keyroll 2 - if (doIClassSimulation(MODE_EXIT_AFTER_MAC, mac_responses + (i + numberOfCSNS) * EPURSE_MAC_SIZE)) { - reply_old(CMD_ACK, CMD_HF_ICLASS_SIMULATE, i * 2, 0, mac_responses, i * EPURSE_MAC_SIZE * 2); + if (do_iclass_simulation(ICLASS_SIM_MODE_EXIT_AFTER_MAC, mac_responses + (i + num_csns) * EPURSE_MAC_SIZE)) { + + if (dataoutlen) + *dataoutlen = i * EPURSE_MAC_SIZE * 2; + + if (send_reply) + reply_old(CMD_ACK, CMD_HF_ICLASS_SIMULATE, i * 2, 0, mac_responses, i * EPURSE_MAC_SIZE * 2); + // Button pressed goto out; } } + + if (dataoutlen) + *dataoutlen = i * EPURSE_MAC_SIZE * 2; + // double the amount of collected data. - reply_old(CMD_ACK, CMD_HF_ICLASS_SIMULATE, i * 2, 0, mac_responses, i * EPURSE_MAC_SIZE * 2); + if (send_reply) + reply_old(CMD_ACK, CMD_HF_ICLASS_SIMULATE, i * 2, 0, mac_responses, i * EPURSE_MAC_SIZE * 2); } else { // We may want a mode here where we hardcode the csns to use (from proxclone). // That will speed things up a little, but not required just yet. - DbpString("[-] the mode is not implemented, reserved for future use"); + DbpString("the mode is not implemented, reserved for future use"); } out: + if (dataout && dataoutlen) + memcpy(dataout, mac_responses, *dataoutlen); + switch_off(); BigBuf_free_keep_EM(); } /** + * Simulation assumes a SECURE PAGE simulation with authentication and application areas. + * + * * @brief Does the actual simulation * @param csn - csn to use * @param breakAfterMacReceived if true, returns after reader MAC has been received. */ -int doIClassSimulation(int simulationMode, uint8_t *reader_mac_buf) { +int do_iclass_simulation(int simulationMode, uint8_t *reader_mac_buf) { // free eventually allocated BigBuf memory BigBuf_free_keep_EM(); - State cipher_state; + uint16_t page_size = 32 * 8; + uint8_t current_page = 0; - uint8_t *csn = BigBuf_get_EM_addr(); - uint8_t *emulator = csn; - uint8_t sof_data[] = { 0x0F} ; + // maintain cipher states for both credit and debit key for each page + State cipher_state_KD[8]; + State cipher_state_KC[8]; + State *cipher_state = &cipher_state_KD[0]; + + uint8_t *emulator = BigBuf_get_EM_addr(); + uint8_t *csn = emulator; // CSN followed by two CRC bytes uint8_t anticoll_data[10] = { 0 }; @@ -1305,28 +334,616 @@ int doIClassSimulation(int simulationMode, uint8_t *reader_mac_buf) { AddCrc(anticoll_data, 8); AddCrc(csn_data, 8); - uint8_t diversified_key[8] = { 0 }; + uint8_t diversified_kd[8] = { 0 }; + uint8_t diversified_kc[8] = { 0 }; + uint8_t *diversified_key = diversified_kd; + + // configuration block + uint8_t conf_block[10] = {0x12, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0xFF, 0x3C, 0x00, 0x00}; // e-Purse uint8_t card_challenge_data[8] = { 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; - //uint8_t card_challenge_data[8] = { 0 }; - if (simulationMode == MODE_FULLSIM) { - //The diversified key should be stored on block 3 - //Get the diversified key from emulator memory - memcpy(diversified_key, emulator + (8 * 3), 8); - //Card challenge, a.k.a e-purse is on block 2 - memcpy(card_challenge_data, emulator + (8 * 2), 8); + // AIA + uint8_t aia_data[10] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00}; - //Precalculate the cipher state, feeding it the CC - cipher_state = opt_doTagMAC_1(card_challenge_data, diversified_key); + if (simulationMode == ICLASS_SIM_MODE_FULL) { + + memcpy(conf_block, emulator + (8 * 1), 8); // blk 1 + memcpy(card_challenge_data, emulator + (8 * 2), 8); // e-purse, blk 2 + memcpy(diversified_kd, emulator + (8 * 3), 8); // Kd, blk 3 + memcpy(diversified_kc, emulator + (8 * 4), 8); // Kc, blk 4 + + // (iceman) this only works for 2KS / 16KS tags. + // Use application data from block 5 + memcpy(aia_data, emulator + (8 * 5), 8); } + + AddCrc(conf_block, 8); + AddCrc(aia_data, 8); + // set epurse of sim2,4 attack if (reader_mac_buf != NULL) { memcpy(reader_mac_buf, card_challenge_data, 8); } - int exitLoop = 0; + if ((conf_block[5] & 0x80) == 0x80) { + page_size = 256 * 8; + } + + // From PicoPass DS: + // When the page is in personalization mode this bit is equal to 1. + // Once the application issuer has personalized and coded its dedicated areas, this bit must be set to 0: + // the page is then "in application mode". + bool personalization_mode = conf_block[7] & 0x80; + + uint8_t block_wr_lock = conf_block[3]; + + // chip memory may be divided in 8 pages + uint8_t max_page = ((conf_block[4] & 0x10) == 0x10) ? 0 : 7; + + // pre-calculate the cipher states, feeding it the CC + cipher_state_KD[0] = opt_doTagMAC_1(card_challenge_data, diversified_kd); + cipher_state_KC[0] = opt_doTagMAC_1(card_challenge_data, diversified_kc); + + if (simulationMode == ICLASS_SIM_MODE_FULL) { + + for (int i = 1; i < max_page; i++) { + + uint8_t *epurse = emulator + (i * page_size) + (8 * 2); + uint8_t *kd = emulator + (i * page_size) + (8 * 3); + uint8_t *kc = emulator + (i * page_size) + (8 * 4); + + cipher_state_KD[i] = opt_doTagMAC_1(epurse, kd); + cipher_state_KC[i] = opt_doTagMAC_1(epurse, kc); + } + } + + // Anti-collision process: + // Reader 0a + // Tag 0f + // Reader 0c + // Tag anticoll. CSN + // Reader 81 anticoll. CSN + // Tag CSN + + uint8_t *modulated_response = NULL; + int modulated_response_size = 0; + uint8_t *trace_data = NULL; + int trace_data_size = 0; + + // Respond SOF -- takes 1 bytes + uint8_t *resp_sof = BigBuf_malloc(1); + int resp_sof_len; + + // Anticollision CSN (rotated CSN) + // 22: Takes 2 bytes for SOF/EOF and 10 * 2 = 20 bytes (2 bytes/byte) + uint8_t *resp_anticoll = BigBuf_malloc(22); + int resp_anticoll_len; + + // CSN (block 0) + // 22: Takes 2 bytes for SOF/EOF and 10 * 2 = 20 bytes (2 bytes/byte) + uint8_t *resp_csn = BigBuf_malloc(22); + int resp_csn_len; + + // configuration (blk 1) PICOPASS 2ks + uint8_t *resp_conf = BigBuf_malloc(22); + int resp_conf_len; + + // e-Purse (blk 2) + // 18: Takes 2 bytes for SOF/EOF and 8 * 2 = 16 bytes (2 bytes/bit) + uint8_t *resp_cc = BigBuf_malloc(18); + int resp_cc_len; + + // Kd, Kc (blocks 3 and 4). Cannot be read. Always respond with 0xff bytes only + uint8_t *resp_ff = BigBuf_malloc(22); + int resp_ff_len; + uint8_t ff_data[10] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00}; + AddCrc(ff_data, 8); + + // Application Issuer Area (blk 5) + uint8_t *resp_aia = BigBuf_malloc(22); + int resp_aia_len; + + // receive command + uint8_t *receivedCmd = BigBuf_malloc(MAX_FRAME_SIZE); + + // Prepare card messages + tosend_t *ts = get_tosend(); + + // First card answer: SOF + CodeIClassTagSOF(); + memcpy(resp_sof, ts->buf, ts->max); + resp_sof_len = ts->max; + + // Anticollision CSN + CodeIso15693AsTag(anticoll_data, sizeof(anticoll_data)); + memcpy(resp_anticoll, ts->buf, ts->max); + resp_anticoll_len = ts->max; + + // CSN (block 0) + CodeIso15693AsTag(csn_data, sizeof(csn_data)); + memcpy(resp_csn, ts->buf, ts->max); + resp_csn_len = ts->max; + + // Configuration (block 1) + CodeIso15693AsTag(conf_block, sizeof(conf_block)); + memcpy(resp_conf, ts->buf, ts->max); + resp_conf_len = ts->max; + + // e-Purse (block 2) + CodeIso15693AsTag(card_challenge_data, sizeof(card_challenge_data)); + memcpy(resp_cc, ts->buf, ts->max); + resp_cc_len = ts->max; + + // Kd, Kc (blocks 3 and 4) + CodeIso15693AsTag(ff_data, sizeof(ff_data)); + memcpy(resp_ff, ts->buf, ts->max); + resp_ff_len = ts->max; + + // Application Issuer Area (block 5) + CodeIso15693AsTag(aia_data, sizeof(aia_data)); + memcpy(resp_aia, ts->buf, ts->max); + resp_aia_len = ts->max; + + //This is used for responding to READ-block commands or other data which is dynamically generated + //First the 'trace'-data, not encoded for FPGA + uint8_t *data_generic_trace = BigBuf_malloc(34); // 32 bytes data + 2byte CRC is max tag answer + + //Then storage for the modulated data + //Each bit is doubled when modulated for FPGA, and we also have SOF and EOF (2 bytes) + uint8_t *data_response = BigBuf_malloc((34 * 2) + 3); + + enum { IDLE, ACTIVATED, SELECTED, HALTED } chip_state = IDLE; + + bool button_pressed = false; + uint8_t cmd, options, block; + int len = 0; + bool exit_loop = false; + bool using_kc = false; + int kc_attempt = 0; + + while (exit_loop == false) { + WDT_HIT(); + + // Now look at the reader command and provide appropriate responses + // default is no response: + modulated_response = NULL; + modulated_response_size = 0; + trace_data = NULL; + trace_data_size = 0; + + uint32_t reader_eof_time = 0; + len = GetIso15693CommandFromReader(receivedCmd, MAX_FRAME_SIZE, &reader_eof_time); + if (len < 0) { + button_pressed = true; + exit_loop = true; + continue; + } + + // extra response data + cmd = receivedCmd[0] & 0xF; + options = (receivedCmd[0] >> 4) & 0xFF; + block = receivedCmd[1]; + + if (cmd == ICLASS_CMD_ACTALL && len == 1) { // 0x0A + // Reader in anti collision phase + modulated_response = resp_sof; + modulated_response_size = resp_sof_len; + chip_state = ACTIVATED; + goto send; + + } else if (cmd == ICLASS_CMD_READ_OR_IDENTIFY && len == 1) { // 0x0C + // Reader asks for anti collision CSN + if (chip_state == SELECTED || chip_state == ACTIVATED) { + modulated_response = resp_anticoll; + modulated_response_size = resp_anticoll_len; + trace_data = anticoll_data; + trace_data_size = sizeof(anticoll_data); + } + goto send; + + } else if (cmd == ICLASS_CMD_SELECT && len == 9) { + // Reader selects anticollision CSN. + // Tag sends the corresponding real CSN + if (chip_state == ACTIVATED || chip_state == SELECTED) { + if (!memcmp(receivedCmd + 1, anticoll_data, 8)) { + modulated_response = resp_csn; + modulated_response_size = resp_csn_len; + trace_data = csn_data; + trace_data_size = sizeof(csn_data); + chip_state = SELECTED; + } else { + chip_state = IDLE; + } + } else if (chip_state == HALTED || chip_state == IDLE) { + // RESELECT with CSN + if (!memcmp(receivedCmd + 1, csn_data, 8)) { + modulated_response = resp_csn; + modulated_response_size = resp_csn_len; + trace_data = csn_data; + trace_data_size = sizeof(csn_data); + chip_state = SELECTED; + } + } + goto send; + + + } else if (cmd == ICLASS_CMD_READ_OR_IDENTIFY && len == 4) { // 0x0C + + if (chip_state != SELECTED) { + goto send; + } + if (simulationMode == ICLASS_SIM_MODE_EXIT_AFTER_MAC) { + // provide defaults for blocks 0 ... 5 + + // block0,1,2,5 is always readable. + switch (block) { + case 0: { // csn (0c 00) + modulated_response = resp_csn; + modulated_response_size = resp_csn_len; + trace_data = csn_data; + trace_data_size = sizeof(csn_data); + goto send; + } + case 1: { // configuration (0c 01) + modulated_response = resp_conf; + modulated_response_size = resp_conf_len; + trace_data = conf_block; + trace_data_size = sizeof(conf_block); + goto send; + } + case 2: {// e-purse (0c 02) + modulated_response = resp_cc; + modulated_response_size = resp_cc_len; + trace_data = card_challenge_data; + trace_data_size = sizeof(card_challenge_data); + // set epurse of sim2,4 attack + if (reader_mac_buf != NULL) { + memcpy(reader_mac_buf, card_challenge_data, 8); + } + goto send; + } + case 3: + case 4: { // Kd, Kc, always respond with 0xff bytes + modulated_response = resp_ff; + modulated_response_size = resp_ff_len; + trace_data = ff_data; + trace_data_size = sizeof(ff_data); + goto send; + } + case 5: { // Application Issuer Area (0c 05) + modulated_response = resp_aia; + modulated_response_size = resp_aia_len; + trace_data = aia_data; + trace_data_size = sizeof(aia_data); + goto send; + } + } // switch + } else if (simulationMode == ICLASS_SIM_MODE_FULL) { + if (block == 3 || block == 4) { // Kd, Kc, always respond with 0xff bytes + modulated_response = resp_ff; + modulated_response_size = resp_ff_len; + trace_data = ff_data; + trace_data_size = sizeof(ff_data); + } else { // use data from emulator memory + memcpy(data_generic_trace, emulator + (current_page * page_size) + (block * 8), 8); + AddCrc(data_generic_trace, 8); + trace_data = data_generic_trace; + trace_data_size = 10; + CodeIso15693AsTag(trace_data, trace_data_size); + memcpy(data_response, ts->buf, ts->max); + modulated_response = data_response; + modulated_response_size = ts->max; + } + goto send; + } + + } else if (cmd == ICLASS_CMD_READCHECK && block == 0x02 && len == 2) { // 0x88 + // Read e-purse KD (88 02) KC (18 02) + if (chip_state != SELECTED) { + goto send; + } + + // debit key + if (receivedCmd[0] == 0x88) { + cipher_state = &cipher_state_KD[current_page]; + diversified_key = diversified_kd; + using_kc = false; + } else { + cipher_state = &cipher_state_KC[current_page]; + diversified_key = diversified_kc; + using_kc = true; + } + + modulated_response = resp_cc; + modulated_response_size = resp_cc_len; + trace_data = card_challenge_data; + trace_data_size = sizeof(card_challenge_data); + goto send; + + } else if (cmd == ICLASS_CMD_CHECK && len == 9) { // 0x05 + + // Reader random and reader MAC!!! + if (chip_state != SELECTED) { + goto send; + } + + if (simulationMode == ICLASS_SIM_MODE_FULL) { + // NR, from reader, is in receivedCmd +1 + opt_doTagMAC_2(*cipher_state, receivedCmd + 1, data_generic_trace, diversified_key); + + /* + uint8_t _mac[4] = {0}; + opt_doReaderMAC_2(*cipher_state, receivedCmd + 1, _mac, diversified_key); + + if (_mac[0] != receivedCmd[5] || _mac[1] != receivedCmd[6] || _mac[2] != receivedCmd[7] || _mac[3] != receivedCmd[8]) { + Dbprintf("reader auth " _RED_("failed")); + Dbprintf("hf iclass lookup u %02x%02x%02x%02x%02x%02x%02x%02x p %02x%02x%02x%02x%02x%02x%02x%02x m %02x%02x%02x%02x%02x%02x%02x%02x f iclass_default_keys.dic", + csn_data[0], csn_data[1], csn_data[2], csn_data[3], csn_data[4], csn_data[5], csn_data[6], csn_data[7], + card_challenge_data[0], card_challenge_data[1], card_challenge_data[2], card_challenge_data[3], + card_challenge_data[4], card_challenge_data[5], card_challenge_data[6], card_challenge_data[7], + receivedCmd[1], receivedCmd[2], receivedCmd[3], receivedCmd[4], + receivedCmd[5], receivedCmd[6], receivedCmd[7], receivedCmd[8] + ); + + goto send; + } + */ + + trace_data = data_generic_trace; + trace_data_size = 4; + CodeIso15693AsTag(trace_data, trace_data_size); + memcpy(data_response, ts->buf, ts->max); + modulated_response = data_response; + modulated_response_size = ts->max; + + if (using_kc) + kc_attempt++; + + } else { + // Not fullsim, we don't respond + chip_state = HALTED; + + if (simulationMode == ICLASS_SIM_MODE_EXIT_AFTER_MAC) { + + if (DBGLEVEL == DBG_EXTENDED) { + Dbprintf("CSN: %02x %02x %02x %02x %02x %02x %02x %02x", csn[0], csn[1], csn[2], csn[3], csn[4], csn[5], csn[6], csn[7]); + Dbprintf("RDR: (len=%02d): %02x %02x %02x %02x %02x %02x %02x %02x %02x", len, + receivedCmd[0], receivedCmd[1], receivedCmd[2], + receivedCmd[3], receivedCmd[4], receivedCmd[5], + receivedCmd[6], receivedCmd[7], receivedCmd[8]); + } else { + Dbprintf("CSN: %02x .... %02x OK", csn[0], csn[7]); + } + if (reader_mac_buf != NULL) { + // save NR and MAC for sim 2,4 + memcpy(reader_mac_buf + 8, receivedCmd + 1, 8); + } + exit_loop = true; + } + } + goto send; + + } else if (cmd == ICLASS_CMD_HALT && options == 0 && len == 1) { + + if (chip_state != SELECTED) { + goto send; + } + // Reader ends the session + modulated_response = resp_sof; + modulated_response_size = resp_sof_len; + chip_state = HALTED; + goto send; + + } else if (simulationMode == ICLASS_SIM_MODE_FULL && cmd == ICLASS_CMD_READ4 && len == 4) { // 0x06 + + if (chip_state != SELECTED) { + goto send; + } + //Read block + memcpy(data_generic_trace, emulator + (current_page * page_size) + (block * 8), 32); + AddCrc(data_generic_trace, 32); + trace_data = data_generic_trace; + trace_data_size = 34; + CodeIso15693AsTag(trace_data, trace_data_size); + memcpy(data_response, ts->buf, ts->max); + modulated_response = data_response; + modulated_response_size = ts->max; + goto send; + + } else if (cmd == ICLASS_CMD_UPDATE && (len == 12 || len == 14)) { + + // We're expected to respond with the data+crc, exactly what's already in the receivedCmd + // receivedCmd is now UPDATE 1b | ADDRESS 1b | DATA 8b | Signature 4b or CRC 2b + if (chip_state != SELECTED) { + goto send; + } + // is chip in ReadOnly (RO) + if ((block_wr_lock & 0x80) == 0) goto send; + + if (block == 12 && (block_wr_lock & 0x40) == 0) goto send; + if (block == 11 && (block_wr_lock & 0x20) == 0) goto send; + if (block == 10 && (block_wr_lock & 0x10) == 0) goto send; + if (block == 9 && (block_wr_lock & 0x08) == 0) goto send; + if (block == 8 && (block_wr_lock & 0x04) == 0) goto send; + if (block == 7 && (block_wr_lock & 0x02) == 0) goto send; + if (block == 6 && (block_wr_lock & 0x01) == 0) goto send; + + if (block == 2) { // update e-purse + memcpy(card_challenge_data, receivedCmd + 2, 8); + CodeIso15693AsTag(card_challenge_data, sizeof(card_challenge_data)); + memcpy(resp_cc, ts->buf, ts->max); + resp_cc_len = ts->max; + cipher_state_KD[current_page] = opt_doTagMAC_1(card_challenge_data, diversified_kd); + cipher_state_KC[current_page] = opt_doTagMAC_1(card_challenge_data, diversified_kc); + if (simulationMode == ICLASS_SIM_MODE_FULL) { + memcpy(emulator + (current_page * page_size) + (8 * 2), card_challenge_data, 8); + } + } else if (block == 3) { // update Kd + for (int i = 0; i < 8; i++) { + if (personalization_mode) { + diversified_kd[i] = receivedCmd[2 + i]; + } else { + diversified_kd[i] ^= receivedCmd[2 + i]; + } + } + cipher_state_KD[current_page] = opt_doTagMAC_1(card_challenge_data, diversified_kd); + if (simulationMode == ICLASS_SIM_MODE_FULL) { + memcpy(emulator + (current_page * page_size) + (8 * 3), diversified_kd, 8); + } + } else if (block == 4) { // update Kc + for (int i = 0; i < 8; i++) { + if (personalization_mode) { + diversified_kc[i] = receivedCmd[2 + i]; + } else { + diversified_kc[i] ^= receivedCmd[2 + i]; + } + } + cipher_state_KC[current_page] = opt_doTagMAC_1(card_challenge_data, diversified_kc); + if (simulationMode == ICLASS_SIM_MODE_FULL) { + memcpy(emulator + (current_page * page_size) + (8 * 4), diversified_kc, 8); + } + } else if (simulationMode == ICLASS_SIM_MODE_FULL) { + // update emulator memory + memcpy(emulator + (current_page * page_size) + (8 * block), receivedCmd + 2, 8); + } + + memcpy(data_generic_trace, receivedCmd + 2, 8); + AddCrc(data_generic_trace, 8); + trace_data = data_generic_trace; + trace_data_size = 10; + CodeIso15693AsTag(trace_data, trace_data_size); + memcpy(data_response, ts->buf, ts->max); + modulated_response = data_response; + modulated_response_size = ts->max; + goto send; + + } else if (cmd == ICLASS_CMD_PAGESEL && len == 4) { // 0x84 + // Pagesel, + // - enables to select a page in the selected chip memory and return its configuration block + // Chips with a single page will not answer to this command + // Otherwise, we should answer 8bytes (conf block 1) + 2bytes CRC + if (chip_state != SELECTED) { + goto send; + } + + if (simulationMode == ICLASS_SIM_MODE_FULL && max_page > 0) { + + // if on 2k, always ignore 3msb, & 0x1F) + uint8_t page = receivedCmd[1] & 0x1F; + if (page > max_page) { + goto send; + } + + current_page = page; + + memcpy(data_generic_trace, emulator + (current_page * page_size) + (8 * 1), 8); + memcpy(diversified_kd, emulator + (current_page * page_size) + (8 * 3), 8); + memcpy(diversified_kc, emulator + (current_page * page_size) + (8 * 4), 8); + + cipher_state = &cipher_state_KD[current_page]; + + personalization_mode = data_generic_trace[7] & 0x80; + block_wr_lock = data_generic_trace[3]; + + AddCrc(data_generic_trace, 8); + + trace_data = data_generic_trace; + trace_data_size = 10; + + CodeIso15693AsTag(trace_data, trace_data_size); + memcpy(data_response, ts->buf, ts->max); + modulated_response = data_response; + modulated_response_size = ts->max; + } + goto send; + + } else if (cmd == ICLASS_CMD_DETECT) { // 0x0F + // not supported yet, ignore + } else if (cmd == 0x26 && len == 5) { + // standard ISO15693 INVENTORY command. Ignore. + } else { + // Never seen this command before + if (DBGLEVEL >= DBG_EXTENDED) + print_result("Unhandled command received ", receivedCmd, len); + } + +send: + /** + A legit tag has about 330us delay between reader EOT and tag SOF. + **/ + if (modulated_response_size > 0) { + uint32_t response_time = reader_eof_time + DELAY_ICLASS_VCD_TO_VICC_SIM; + TransmitTo15693Reader(modulated_response, modulated_response_size, &response_time, 0, false); + LogTrace_ISO15693(trace_data, trace_data_size, response_time * 32, (response_time * 32) + (modulated_response_size * 32 * 64), NULL, false); + } + + if (chip_state == HALTED) { + uint32_t wait_time = GetCountSspClk() + ICLASS_READER_TIMEOUT_ACTALL; + while (GetCountSspClk() < wait_time) {}; + } + + // CC attack + // wait to trigger the reader bug, then wait 1000ms + if (kc_attempt > 3) { + uint32_t wait_time = GetCountSspClk() + (16000 * 100); + while (GetCountSspClk() < wait_time) {}; + kc_attempt = 0; + exit_loop = true; + } + } + + LEDsoff(); + + if (button_pressed) + DbpString("button pressed"); + + return button_pressed; +} + +int do_iclass_simulation_nonsec(void) { + // free eventually allocated BigBuf memory + BigBuf_free_keep_EM(); + + uint16_t page_size = 32 * 8; + uint8_t current_page = 0; + + uint8_t *emulator = BigBuf_get_EM_addr(); + uint8_t *csn = emulator; + + // CSN followed by two CRC bytes + uint8_t anticoll_data[10] = { 0 }; + uint8_t csn_data[10] = { 0 }; + memcpy(csn_data, csn, sizeof(csn_data)); + + // Construct anticollision-CSN + rotateCSN(csn_data, anticoll_data); + + // Compute CRC on both CSNs + AddCrc(anticoll_data, 8); + AddCrc(csn_data, 8); + + // configuration block + uint8_t conf_block[10] = {0x12, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0xFF, 0x3C, 0x00, 0x00}; + + // AIA + uint8_t aia_data[10] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00}; + + memcpy(conf_block, emulator + (8 * 1), 8); + memcpy(aia_data, emulator + (8 * 2), 8); + + AddCrc(conf_block, 8); + AddCrc(aia_data, 8); + + if ((conf_block[5] & 0x80) == 0x80) { + page_size = 256 * 8; + } + + // chip memory may be divided in 8 pages + uint8_t max_page = ((conf_block[4] & 0x10) == 0x10) ? 0 : 7; + + // Anti-collision process: // Reader 0a // Tag 0f // Reader 0c @@ -1341,7 +958,7 @@ int doIClassSimulation(int simulationMode, uint8_t *reader_mac_buf) { // Respond SOF -- takes 1 bytes uint8_t *resp_sof = BigBuf_malloc(2); - int resp_sof_Len; + int resp_sof_len; // Anticollision CSN (rotated CSN) // 22: Takes 2 bytes for SOF/EOF and 10 * 2 = 20 bytes (2 bytes/byte) @@ -1353,286 +970,256 @@ int doIClassSimulation(int simulationMode, uint8_t *reader_mac_buf) { uint8_t *resp_csn = BigBuf_malloc(28); int resp_csn_len; - // configuration Picopass 2ks + // configuration (blk 1) PICOPASS 2ks uint8_t *resp_conf = BigBuf_malloc(28); int resp_conf_len; - uint8_t conf_data[10] = {0x12, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0xFF, 0x3C, 0x00, 0x00}; - AddCrc(conf_data, 8); - // e-Purse - // 18: Takes 2 bytes for SOF/EOF and 8 * 2 = 16 bytes (2 bytes/bit) - uint8_t *resp_cc = BigBuf_malloc(28); - int resp_cc_len; - - // Application Issuer Area + // Application Issuer Area (blk 5) uint8_t *resp_aia = BigBuf_malloc(28); int resp_aia_len; - uint8_t aia_data[10] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00}; - if (simulationMode == MODE_FULLSIM) { - - // (iceman) this only works for 2KS / 16KS tags. - // Use application data from block 5 - memcpy(aia_data, emulator + (8 * 5), 8); - - // older 2K / 16K tags has its application issuer data on block 2 - } - AddCrc(aia_data, 8); // receive command uint8_t *receivedCmd = BigBuf_malloc(MAX_FRAME_SIZE); - int len = 0; // Prepare card messages - ToSendMax = 0; + tosend_t *ts = get_tosend(); + ts->max = 0; // First card answer: SOF CodeIClassTagSOF(); - memcpy(resp_sof, ToSend, ToSendMax); - resp_sof_Len = ToSendMax; + memcpy(resp_sof, ts->buf, ts->max); + resp_sof_len = ts->max; // Anticollision CSN - CodeIClassTagAnswer(anticoll_data, sizeof(anticoll_data)); - memcpy(resp_anticoll, ToSend, ToSendMax); - resp_anticoll_len = ToSendMax; + CodeIso15693AsTag(anticoll_data, sizeof(anticoll_data)); + memcpy(resp_anticoll, ts->buf, ts->max); + resp_anticoll_len = ts->max; - // CSN - CodeIClassTagAnswer(csn_data, sizeof(csn_data)); - memcpy(resp_csn, ToSend, ToSendMax); - resp_csn_len = ToSendMax; + // CSN (block 0) + CodeIso15693AsTag(csn_data, sizeof(csn_data)); + memcpy(resp_csn, ts->buf, ts->max); + resp_csn_len = ts->max; - // Configuration - CodeIClassTagAnswer(conf_data, sizeof(conf_data)); - memcpy(resp_conf, ToSend, ToSendMax); - resp_conf_len = ToSendMax; + // Configuration (block 1) + CodeIso15693AsTag(conf_block, sizeof(conf_block)); + memcpy(resp_conf, ts->buf, ts->max); + resp_conf_len = ts->max; - // e-Purse - CodeIClassTagAnswer(card_challenge_data, sizeof(card_challenge_data)); - memcpy(resp_cc, ToSend, ToSendMax); - resp_cc_len = ToSendMax; - - // Application Issuer Area - CodeIClassTagAnswer(aia_data, sizeof(aia_data)); - memcpy(resp_aia, ToSend, ToSendMax); - resp_aia_len = ToSendMax; + // Application Issuer Area (block 2) + CodeIso15693AsTag(aia_data, sizeof(aia_data)); + memcpy(resp_aia, ts->buf, ts->max); + resp_aia_len = ts->max; //This is used for responding to READ-block commands or other data which is dynamically generated //First the 'trace'-data, not encoded for FPGA - uint8_t *data_generic_trace = BigBuf_malloc((8 * 4) + 2);//8 bytes data + 2byte CRC is max tag answer + uint8_t *data_generic_trace = BigBuf_malloc(32 + 2); // 32 bytes data + 2byte CRC is max tag answer //Then storage for the modulated data //Each bit is doubled when modulated for FPGA, and we also have SOF and EOF (2 bytes) - uint8_t *data_response = BigBuf_malloc(((8 * 4) + 2) * 2 + 2); + uint8_t *data_response = BigBuf_malloc((32 + 2) * 2 + 2); - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_TAGSIM_LISTEN); - SpinDelay(100); - StartCountSspClk(); + enum { IDLE, ACTIVATED, SELECTED, HALTED } chip_state = IDLE; - // To control where we are in the protocol - uint32_t time_0 = GetCountSspClk(); - uint32_t t2r_stime = 0, t2r_etime = 0; - uint32_t r2t_stime, r2t_etime = 0; - LED_A_ON(); - bool buttonPressed = false; + bool button_pressed = false; uint8_t cmd, options, block; + int len = 0; - while (!exitLoop) { + bool exit_loop = false; + while (exit_loop == false) { WDT_HIT(); - //Signal tracer, can be used to get a trigger for an oscilloscope.. - LED_B_OFF(); - LED_C_OFF(); - - r2t_stime = (GetCountSspClk() - time_0) << 4; - if (!GetIClassCommandFromReader(receivedCmd, &len, 0)) { - buttonPressed = true; - exitLoop = true; + uint32_t reader_eof_time = 0; + len = GetIso15693CommandFromReader(receivedCmd, MAX_FRAME_SIZE, &reader_eof_time); + if (len < 0) { + button_pressed = true; + exit_loop = true; continue; } - r2t_etime = ((GetCountSspClk() - time_0) << 4) - r2t_stime; - // 330us normal wait, adjusted for our execution - - LED_C_ON(); //Signal tracer + // Now look at the reader command and provide appropriate responses + // default is no response: + modulated_response = NULL; + modulated_response_size = 0; + trace_data = NULL; + trace_data_size = 0; + // extra response data cmd = receivedCmd[0] & 0xF; options = (receivedCmd[0] >> 4) & 0xFF; block = receivedCmd[1]; - if (cmd == ICLASS_CMD_ACTALL) { // 0x0A - // Reader in anticollission phase - modulated_response = resp_sof; - modulated_response_size = resp_sof_Len; //order = 1; - trace_data = sof_data; - trace_data_size = sizeof(sof_data); - // adjusted for 330 + (160*num of slot) + if (cmd == ICLASS_CMD_ACTALL && len == 1) { // 0x0A + // Reader in anti collision phase + if (chip_state != HALTED) { + modulated_response = resp_sof; + modulated_response_size = resp_sof_len; + chip_state = ACTIVATED; + } goto send; - } else if (cmd == ICLASS_CMD_READ_OR_IDENTIFY) { // 0x0C - if (len == 1) { - // Reader asks for anticollission CSN + + } else if (cmd == ICLASS_CMD_READ_OR_IDENTIFY && len == 1) { // 0x0C + // Reader asks for anti collision CSN + if (chip_state == SELECTED || chip_state == ACTIVATED) { modulated_response = resp_anticoll; - modulated_response_size = resp_anticoll_len; //order = 2; + modulated_response_size = resp_anticoll_len; trace_data = anticoll_data; trace_data_size = sizeof(anticoll_data); - goto send; } + goto send; - if (len == 4) { - // block0,1,2,5 is always readable. - switch (block) { - case 0: // csn (0c 00) - modulated_response = resp_csn; - modulated_response_size = resp_csn_len; - trace_data = csn_data; - trace_data_size = sizeof(csn_data); - goto send; - case 1: // configuration (0c 01) - modulated_response = resp_conf; - modulated_response_size = resp_conf_len; - trace_data = conf_data; - trace_data_size = sizeof(conf_data); - goto send; - case 2: // e-purse (0c 02) - modulated_response = resp_cc; - modulated_response_size = resp_cc_len; - trace_data = card_challenge_data; - trace_data_size = sizeof(card_challenge_data); - // set epurse of sim2,4 attack - if (reader_mac_buf != NULL) { - memcpy(reader_mac_buf, card_challenge_data, 8); - } - goto send; - case 5:// Application Issuer Area (0c 05) - modulated_response = resp_aia; - modulated_response_size = resp_aia_len; - trace_data = aia_data; - trace_data_size = sizeof(aia_data); - goto send; - default : { - if (simulationMode == MODE_FULLSIM) { // 0x0C - //Read block - //Take the data... - memcpy(data_generic_trace, emulator + (block << 3), 8); - AddCrc(data_generic_trace, 8); - trace_data = data_generic_trace; - trace_data_size = 10; - CodeIClassTagAnswer(trace_data, trace_data_size); - memcpy(modulated_response, ToSend, ToSendMax); - modulated_response_size = ToSendMax; - goto send; - } - break; - } - }//swith - }// if 4 - } else if (cmd == ICLASS_CMD_SELECT) { // 0x81 - // Reader selects anticollission CSN. + } else if (cmd == ICLASS_CMD_SELECT && len == 9) { + // Reader selects anticollision CSN. // Tag sends the corresponding real CSN - modulated_response = resp_csn; - modulated_response_size = resp_csn_len; //order = 3; - trace_data = csn_data; - trace_data_size = sizeof(csn_data); - goto send; - } else if (cmd == ICLASS_CMD_READCHECK) { // 0x88 - // Read e-purse KD (88 02) KC (18 02) - modulated_response = resp_cc; - modulated_response_size = resp_cc_len; //order = 4; - trace_data = card_challenge_data; - trace_data_size = sizeof(card_challenge_data); - LED_B_ON(); - goto send; - } else if (cmd == ICLASS_CMD_CHECK) { // 0x05 - // Reader random and reader MAC!!! - if (simulationMode == MODE_FULLSIM) { - // NR, from reader, is in receivedCmd +1 - opt_doTagMAC_2(cipher_state, receivedCmd + 1, data_generic_trace, diversified_key); - - trace_data = data_generic_trace; - trace_data_size = 4; - CodeIClassTagAnswer(trace_data, trace_data_size); - memcpy(data_response, ToSend, ToSendMax); - modulated_response = data_response; - modulated_response_size = ToSendMax; - } else { - // Not fullsim, we don't respond - // We do not know what to answer, so lets keep quiet - modulated_response = resp_sof; - modulated_response_size = 0; - trace_data = NULL; - trace_data_size = 0; - - if (simulationMode == MODE_EXIT_AFTER_MAC) { - - if (DBGLEVEL == DBG_EXTENDED) { - Dbprintf("[+] CSN: %02x %02x %02x %02x %02x %02x %02x %02x", csn[0], csn[1], csn[2], csn[3], csn[4], csn[5], csn[6], csn[7]); - Dbprintf("[+] RDR: (len=%02d): %02x %02x %02x %02x %02x %02x %02x %02x %02x", len, - receivedCmd[0], receivedCmd[1], receivedCmd[2], - receivedCmd[3], receivedCmd[4], receivedCmd[5], - receivedCmd[6], receivedCmd[7], receivedCmd[8]); - } else { - Dbprintf("[+] CSN: %02x .... %02x OK", csn[0], csn[7]); - } - if (reader_mac_buf != NULL) { - memcpy(reader_mac_buf + 8, receivedCmd + 1, 8); - } - exitLoop = true; + if (chip_state == ACTIVATED || chip_state == SELECTED) { + if (!memcmp(receivedCmd + 1, anticoll_data, 8)) { + modulated_response = resp_csn; + modulated_response_size = resp_csn_len; + trace_data = csn_data; + trace_data_size = sizeof(csn_data); + chip_state = SELECTED; + } else { + chip_state = IDLE; + } + } else if (chip_state == HALTED) { + // RESELECT with CSN + if (!memcmp(receivedCmd + 1, csn_data, 8)) { + modulated_response = resp_csn; + modulated_response_size = resp_csn_len; + trace_data = csn_data; + trace_data_size = sizeof(csn_data); + chip_state = SELECTED; } } goto send; + + + } else if (cmd == ICLASS_CMD_READ_OR_IDENTIFY && len == 4) { // 0x0C + + if (chip_state != SELECTED) { + goto send; + } + + switch (block) { + case 0: { // csn (0c 00) + modulated_response = resp_csn; + modulated_response_size = resp_csn_len; + trace_data = csn_data; + trace_data_size = sizeof(csn_data); + goto send; + } + case 1: { // configuration (0c 01) + modulated_response = resp_conf; + modulated_response_size = resp_conf_len; + trace_data = conf_block; + trace_data_size = sizeof(conf_block); + goto send; + } + case 2: { // Application Issuer Area (0c 02) + modulated_response = resp_aia; + modulated_response_size = resp_aia_len; + trace_data = aia_data; + trace_data_size = sizeof(aia_data); + goto send; + } + default : { + memcpy(data_generic_trace, emulator + (block << 3), 8); + AddCrc(data_generic_trace, 8); + trace_data = data_generic_trace; + trace_data_size = 10; + CodeIso15693AsTag(trace_data, trace_data_size); + memcpy(data_response, ts->buf, ts->max); + modulated_response = data_response; + modulated_response_size = ts->max; + goto send; + } + } // swith + + } else if (cmd == ICLASS_CMD_READCHECK) { // 0x88 + goto send; + + } else if (cmd == ICLASS_CMD_CHECK && len == 9) { // 0x05 + goto send; + } else if (cmd == ICLASS_CMD_HALT && options == 0 && len == 1) { + + if (chip_state != SELECTED) { + goto send; + } // Reader ends the session modulated_response = resp_sof; - modulated_response_size = 0; //order = 0; - trace_data = NULL; - trace_data_size = 0; + modulated_response_size = resp_sof_len; + chip_state = HALTED; goto send; - } else if (simulationMode == MODE_FULLSIM && cmd == ICLASS_CMD_READ4 && len == 4) { // 0x06 + + } else if (cmd == ICLASS_CMD_READ4 && len == 4) { // 0x06 + + if (chip_state != SELECTED) { + goto send; + } //Read block - //Take the data... - memcpy(data_generic_trace, emulator + (block << 3), 8 * 4); + memcpy(data_generic_trace, emulator + (current_page * page_size) + (block * 8), 8 * 4); AddCrc(data_generic_trace, 8 * 4); trace_data = data_generic_trace; trace_data_size = 34; - CodeIClassTagAnswer(trace_data, trace_data_size); - memcpy(modulated_response, ToSend, ToSendMax); - modulated_response_size = ToSendMax; + CodeIso15693AsTag(trace_data, trace_data_size); + memcpy(data_response, ts->buf, ts->max); + modulated_response = data_response; + modulated_response_size = ts->max; goto send; - } else if (simulationMode == MODE_FULLSIM && cmd == ICLASS_CMD_UPDATE) { - //Probably the reader wants to update the nonce. Let's just ignore that for now. - // OBS! If this is implemented, don't forget to regenerate the cipher_state - //We're expected to respond with the data+crc, exactly what's already in the receivedcmd - //receivedcmd is now UPDATE 1b | ADDRESS 1b| DATA 8b| Signature 4b or CRC 2b| + } else if (cmd == ICLASS_CMD_UPDATE && (len == 12 || len == 14)) { + + // We're expected to respond with the data+crc, exactly what's already in the receivedCmd + // receivedCmd is now UPDATE 1b | ADDRESS 1b | DATA 8b | Signature 4b or CRC 2b + if (chip_state != SELECTED) { + goto send; + } + + // update emulator memory + memcpy(emulator + (current_page * page_size) + (8 * block), receivedCmd + 2, 8); - //Take the data... memcpy(data_generic_trace, receivedCmd + 2, 8); AddCrc(data_generic_trace, 8); trace_data = data_generic_trace; trace_data_size = 10; - CodeIClassTagAnswer(trace_data, trace_data_size); - - memcpy(data_response, ToSend, ToSendMax); + CodeIso15693AsTag(trace_data, trace_data_size); + memcpy(data_response, ts->buf, ts->max); modulated_response = data_response; - modulated_response_size = ToSendMax; -// response_delay = 4600 * 1.5; // tPROG 4-15ms + modulated_response_size = ts->max; goto send; -// } else if(receivedCmd[0] == ICLASS_CMD_PAGESEL) { // 0x84 - //Pagesel - //Pagesel enables to select a page in the selected chip memory and return its configuration block - //Chips with a single page will not answer to this command - // It appears we're fine ignoring this. - //Otherwise, we should answer 8bytes (block) + 2bytes CRC -// } else if(receivedCmd[0] == ICLASS_CMD_DETECT) { // 0x0F - } else { - //#db# Unknown command received from reader (len=5): 26 1 0 f6 a 44 44 44 44 - // Never seen this command before - if (DBGLEVEL == DBG_EXTENDED) - print_result("[-] Unhandled command received ", receivedCmd, len); - // Do not respond - modulated_response = resp_sof; - modulated_response_size = 0; //order = 0; - trace_data = NULL; - trace_data_size = 0; + } else if (cmd == ICLASS_CMD_PAGESEL && len == 4) { // 0x84 + // Pagesel, + // - enables to select a page in the selected chip memory and return its configuration block + // Chips with a single page will not answer to this command + // Otherwise, we should answer 8bytes (conf block 1) + 2bytes CRC + if (chip_state != SELECTED) { + goto send; + } + + if (max_page > 0) { + + current_page = receivedCmd[1]; + + memcpy(data_generic_trace, emulator + (current_page * page_size) + (8 * 1), 8); + AddCrc(data_generic_trace, 8); + trace_data = data_generic_trace; + trace_data_size = 10; + + CodeIso15693AsTag(trace_data, trace_data_size); + memcpy(data_response, ts->buf, ts->max); + modulated_response = data_response; + modulated_response_size = ts->max; + } + goto send; + +// } else if(cmd == ICLASS_CMD_DETECT) { // 0x0F + } else if (cmd == 0x26 && len == 5) { + // standard ISO15693 INVENTORY command. Ignore. + } else { + // Never seen this command before + if (DBGLEVEL >= DBG_EXTENDED) + print_result("Unhandled command received ", receivedCmd, len); } send: @@ -1640,660 +1227,383 @@ send: A legit tag has about 330us delay between reader EOT and tag SOF. **/ if (modulated_response_size > 0) { - t2r_stime = GetCountSspClkDelta(time_0) << 4; - SendIClassAnswer(modulated_response, modulated_response_size, 0); - t2r_etime = ((GetCountSspClk() - time_0) << 4) - t2r_stime; + uint32_t response_time = reader_eof_time + DELAY_ICLASS_VCD_TO_VICC_SIM; + TransmitTo15693Reader(modulated_response, modulated_response_size, &response_time, 0, false); + LogTrace_ISO15693(trace_data, trace_data_size, response_time * 32, (response_time * 32) + (modulated_response_size * 32 * 64), NULL, false); } - - LogTrace(receivedCmd, len, r2t_stime, r2t_etime, NULL, true); - - if (trace_data != NULL) - LogTrace(trace_data, trace_data_size, t2r_stime, t2r_etime, NULL, false); } LEDsoff(); - if (buttonPressed) - DbpString("[+] button pressed"); + if (button_pressed) + DbpString("button pressed"); + + return button_pressed; - return buttonPressed; } -/** - * @brief sends our simulated tag answer - * @param resp - * @param respLen - * @param delay - */ -static int SendIClassAnswer(uint8_t *resp, int respLen, uint16_t delay) { - int i = 0; - volatile uint8_t b; - - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_SIMULATOR | FPGA_HF_SIMULATOR_MODULATE_424K_8BIT); - - AT91C_BASE_SSC->SSC_THR = 0x00; - - uint16_t checked = 0; - for (;;) { - - if (checked == 1000) { - if (BUTTON_PRESS() || data_available()) return 0; - checked = 0; - } - ++checked; - - // Prevent rx holding register from overflowing - if ((AT91C_BASE_SSC->SSC_SR & AT91C_SSC_RXRDY)) { - b = AT91C_BASE_SSC->SSC_RHR; - (void) b; - } - - // Put byte into tx holding register as soon as it is ready - if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) { - b = 0x00; - if (i < respLen) { - b = resp[i]; - //Hack - //b = 0xAC; - } - i++; - AT91C_BASE_SSC->SSC_THR = b; - } -// if (i > respLen + 4) break; - if (i > respLen + 1) break; - } - return 0; +// THE READER CODE +static void iclass_send_as_reader(uint8_t *frame, int len, uint32_t *start_time, uint32_t *end_time) { + CodeIso15693AsReader(frame, len); + tosend_t *ts = get_tosend(); + TransmitTo15693Tag(ts->buf, ts->max, start_time); + *end_time = *start_time + (32 * ((8 * ts->max) - 4)); // substract the 4 padding bits after EOF + LogTrace_ISO15693(frame, len, (*start_time * 4), (*end_time * 4), NULL, true); } -/// THE READER CODE +static bool iclass_send_cmd_with_retries(uint8_t *cmd, size_t cmdsize, uint8_t *resp, size_t max_resp_size, + uint8_t expected_size, uint8_t tries, uint32_t *start_time, + uint16_t timeout, uint32_t *eof_time) { + while (tries-- > 0) { -//----------------------------------------------------------------------------- -// Transmit the command (to the tag) that was placed in ToSend[]. -//----------------------------------------------------------------------------- -static void TransmitIClassCommand(const uint8_t *cmd, int len, int *wait) { + iclass_send_as_reader(cmd, cmdsize, start_time, eof_time); - int c = 0; - bool firstpart = true; - uint8_t sendbyte; - - time_rdr = 0; - - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_READER_MOD); - - AT91C_BASE_SSC->SSC_THR = 0x00; - - // make sure we timeout previous comms. - if (*wait) - SpinDelayUs(*wait); - - for (;;) { - - WDT_HIT(); - - // Put byte into tx holding register as soon as it is ready - if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) { - - // DOUBLE THE SAMPLES! - if (firstpart) { - sendbyte = (cmd[c] & 0xf0) | (cmd[c] >> 4); - } else { - sendbyte = (cmd[c] & 0x0f) | (cmd[c] << 4); - c++; - } - - if (sendbyte == 0xff) - sendbyte = 0xfe; - - AT91C_BASE_SSC->SSC_THR = sendbyte; - firstpart = !firstpart; - - if (c >= len) break; - } - } - - time_rdr = GetCountSspClk(); -} - -//----------------------------------------------------------------------------- -// Prepare iClass reader command to send to FPGA -//----------------------------------------------------------------------------- -void CodeIClassCommand(const uint8_t *cmd, int len) { - int i, j, k; - - ToSendReset(); - - // (SOC) Start of Communication: 1 out of 4 - ToSend[++ToSendMax] = 0xf0; - ToSend[++ToSendMax] = 0x00; - ToSend[++ToSendMax] = 0x0f; - ToSend[++ToSendMax] = 0x00; - - // Modulate the bytes - for (i = 0; i < len; i++) { - uint8_t b = cmd[i]; - for (j = 0; j < 4; j++) { - for (k = 0; k < 4; k++) { - - if (k == (b & 3)) - ToSend[++ToSendMax] = 0x0f; - else - ToSend[++ToSendMax] = 0x00; - } - b >>= 2; - } - } - - // (EOC) End of Communication - ToSend[++ToSendMax] = 0x00; - ToSend[++ToSendMax] = 0x00; - ToSend[++ToSendMax] = 0xf0; - ToSend[++ToSendMax] = 0x00; - - // Convert from last character reference to length - ToSendMax++; -} - -void ReaderTransmitIClass_ext(uint8_t *frame, int len, int wait) { - - // This is tied to other size changes - CodeIClassCommand(frame, len); - - // Select the card - TransmitIClassCommand(ToSend, ToSendMax, &wait); - LED_A_ON(); - - LogTrace(frame, len, rsamples, rsamples, NULL, true); -} -void ReaderTransmitIClass(uint8_t *frame, int len) { - ReaderTransmitIClass_ext(frame, len, 330); -} - -//----------------------------------------------------------------------------- -// Wait a certain time for tag response -// If a response is captured return TRUE -// If it takes too long return FALSE -//----------------------------------------------------------------------------- -static int GetIClassAnswer(uint8_t *receivedResponse, int maxLen, int *wait) { - // buffer needs to be 512 bytes - // maxLen is not used... - bool skip = false; - - LED_D_ON(); - // Set FPGA mode to "reader listen mode", no modulation (listen - // only, since we are receiving, not transmitting). - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_READER_LISTEN); - - // Setup UART/DEMOD to receive - DemodIcInit(receivedResponse); - - SpinDelayUs(g_wait); //310 Tout= 330us (iso15603-2) (330/21.3) take consideration for clock increments. - - // clear RXRDY: - uint8_t b = (uint8_t)AT91C_BASE_SSC->SSC_RHR; - (void)b; - - uint16_t checked = 0; - - uint32_t card_start = GetCountSspClk(); - for (;;) { - WDT_HIT(); - - if (checked == 1000) { - if (BUTTON_PRESS() || data_available()) return false; - checked = 0; - } - ++checked; - - // Wait for byte be become available in rx holding register - if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) { - - b = (uint8_t)AT91C_BASE_SSC->SSC_RHR; - skip = !skip; - if (skip) continue; - - if (ManchesterDecoding_iclass(b & 0x0f)) { - time_response = GetCountSspClk() - card_start; - return true; - } else if (GetCountSspClkDelta(card_start) > timeout && Demod.state == DEMOD_IC_UNSYNCD) { - return false; - } - } - } - return false; -} - -int ReaderReceiveIClass(uint8_t *receivedAnswer) { - - if (GetIClassAnswer(receivedAnswer, 0, NULL) == false) - return 0; - - LogTrace(receivedAnswer, Demod.len, rsamples, rsamples, NULL, false); - return Demod.len; -} - -void setupIclassReader() { - - LEDsoff(); - - // Start from off (no field generated) - // Signal field is off with the appropriate LED - FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - - FpgaDownloadAndGo(FPGA_BITSTREAM_HF); - - FpgaSetupSsc(); - - SetAdcMuxFor(GPIO_MUXSEL_HIPKD); - - clear_trace(); - set_tracing(true); - - // Now give it time to spin up. - // Signal field is on with the appropriate LED - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_ISO14443A | FPGA_HF_ISO14443A_READER_MOD); - SpinDelay(500); - - StartCountSspClk(); - - LED_A_ON(); -} - -bool sendCmdGetResponseWithRetries(uint8_t *command, size_t cmdsize, uint8_t *resp, uint8_t expected_size, int8_t retries) { - while (retries-- > 0) { - - ReaderTransmitIClass(command, cmdsize); - - //iceman - if received size is bigger than expected, we smash the stack here - // since its called with fixed sized arrays - - // update/write command takes 4ms to 15ms before responding - int old_wait = g_wait; - if ((command[0] & 0xF) == ICLASS_CMD_UPDATE) - g_wait = 3900; - - uint8_t got_n = ReaderReceiveIClass(resp); - - g_wait = old_wait; - - // 0xBB is the internal debug separator byte.. - if (expected_size != got_n || (resp[0] == 0xBB || resp[7] == 0xBB || resp[2] == 0xBB)) { - //try again -// SpinDelayUs(360); - continue; - } - - if (got_n == expected_size) + if (resp == NULL) { return true; + } + + if (expected_size == GetIso15693AnswerFromTag(resp, max_resp_size, timeout, eof_time)) { + return true; + } } return false; } /** * @brief Talks to an iclass tag, sends the commands to get CSN and CC. - * @param card_data where the CSN and CC are stored for return - * @return 0 = fail - * 1 = Got CSN - * 2 = Got CSN and CC + * @param card_data where the CSN, CONFIG, CC are stored for return + * 8 bytes csn + 8 bytes config + 8 bytes CC + * @return false = fail + * true = Got all. */ -uint8_t handshakeIclassTag_ext(uint8_t *card_data, bool use_credit_key) { - - // act_all... - static uint8_t act_all[] = { ICLASS_CMD_ACTALL }; - static uint8_t identify[] = { ICLASS_CMD_READ_OR_IDENTIFY, 0x00, 0x73, 0x33 }; - static uint8_t select[] = { 0x80 | ICLASS_CMD_SELECT, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - uint8_t readcheck_cc[] = { 0x80 | ICLASS_CMD_READCHECK, 0x02 }; - - // Bit 4: K.If this bit equals to one, the READCHECK will use the Credit Key (Kc); if equals to zero, Debit Key (Kd) willbe used - // bit 7: parity. - - if (use_credit_key) - readcheck_cc[0] = 0x10 | ICLASS_CMD_READCHECK; +static bool select_iclass_tag_ex(uint8_t *card_data, bool use_credit_key, uint32_t *eof_time, uint8_t *status) { + static uint8_t act_all[] = { ICLASS_CMD_ACTALL }; + static uint8_t identify[] = { ICLASS_CMD_READ_OR_IDENTIFY, 0x00, 0x73, 0x33 }; + static uint8_t read_conf[] = { ICLASS_CMD_READ_OR_IDENTIFY, 0x01, 0xfa, 0x22 }; + uint8_t select[] = { 0x80 | ICLASS_CMD_SELECT, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + uint8_t read_aia[] = { ICLASS_CMD_READ_OR_IDENTIFY, 0x05, 0xde, 0x64}; + uint8_t read_check_cc[] = { 0x80 | ICLASS_CMD_READCHECK, 0x02 }; uint8_t resp[ICLASS_BUFFER_SIZE] = {0}; - // Send act_all ( 330 timeout + 160 timeslot); - ReaderTransmitIClass_ext(act_all, 1, 330 + 180); + picopass_hdr *hdr = (picopass_hdr *)card_data; - // Card present? - if (ReaderReceiveIClass(resp) == 0) - return 0; + // Bit 4: K.If this bit equals to one, the READCHECK will use the Credit Key (Kc); if equals to zero, Debit Key (Kd) will be used + // bit 7: parity. + if (use_credit_key) + read_check_cc[0] = 0x10 | ICLASS_CMD_READCHECK; - //Send Identify - ReaderTransmitIClass(identify, 1); + // wakeup + uint32_t start_time = GetCountSspClk(); + iclass_send_as_reader(act_all, 1, &start_time, eof_time); + int len = GetIso15693AnswerFromTag(resp, sizeof(resp), ICLASS_READER_TIMEOUT_ACTALL, eof_time); + if (len < 0) + return false; - //We expect a 10-byte response here, 8 byte anticollision-CSN and 2 byte CRC - if (ReaderReceiveIClass(resp) != 10) - return 0; + // send Identify + start_time = *eof_time + DELAY_ICLASS_VICC_TO_VCD_READER; + iclass_send_as_reader(identify, 1, &start_time, eof_time); - //Copy the Anti-collision CSN to our select-packet + // expect a 10-byte response here, 8 byte anticollision-CSN and 2 byte CRC + len = GetIso15693AnswerFromTag(resp, sizeof(resp), ICLASS_READER_TIMEOUT_OTHERS, eof_time); + if (len != 10) + return false; + + // copy the Anti-collision CSN to our select-packet memcpy(&select[1], resp, 8); - //Select the card - ReaderTransmitIClass(select, sizeof(select)); + // select the card + start_time = *eof_time + DELAY_ICLASS_VICC_TO_VCD_READER; + iclass_send_as_reader(select, sizeof(select), &start_time, eof_time); - //We expect a 10-byte response here, 8 byte CSN and 2 byte CRC - if (ReaderReceiveIClass(resp) != 10) - return 0; + // expect a 10-byte response here, 8 byte CSN and 2 byte CRC + len = GetIso15693AnswerFromTag(resp, sizeof(resp), ICLASS_READER_TIMEOUT_OTHERS, eof_time); + if (len != 10) + return false; - // Card selected, now read e-purse (cc) (block2) (only 8 bytes no CRC) - // ReaderTransmitIClass(readcheck_cc, sizeof(readcheck_cc)); - // if (ReaderReceiveIClass(resp) == 8) { - // //Save CC (e-purse) in response data - // memcpy(card_data+8, resp, 8); - // read_status++; - // } + // save CSN + memcpy(hdr->csn, resp, sizeof(hdr->csn)); - //Success - level 1, we got CSN - //Save CSN in response data - memcpy(card_data, resp, 8); + // card selected, now read config (block1) (only 8 bytes no CRC) + start_time = *eof_time + DELAY_ICLASS_VICC_TO_VCD_READER; + iclass_send_as_reader(read_conf, sizeof(read_conf), &start_time, eof_time); - bool isBlk_2 = sendCmdGetResponseWithRetries(readcheck_cc, sizeof(readcheck_cc), resp, 8, 3); + // expect a 8-byte response here + len = GetIso15693AnswerFromTag(resp, sizeof(resp), ICLASS_READER_TIMEOUT_OTHERS, eof_time); + if (len != 10) + return false; - //Flag that we got to at least stage 1, read CSN - if (isBlk_2 == false) { - return 1; + // save CONF + memcpy((uint8_t *)&hdr->conf, resp, sizeof(hdr->conf)); + + if (status) + *status |= (FLAG_ICLASS_CSN | FLAG_ICLASS_CONF); + + uint8_t pagemap = get_pagemap(hdr); + if (pagemap != PICOPASS_NON_SECURE_PAGEMODE) { + + // read App Issuer Area block 5 + start_time = *eof_time + DELAY_ICLASS_VICC_TO_VCD_READER; + iclass_send_as_reader(read_aia, sizeof(read_aia), &start_time, eof_time); + + // expect a 10-byte response here + len = GetIso15693AnswerFromTag(resp, sizeof(resp), ICLASS_READER_TIMEOUT_OTHERS, eof_time); + if (len != 10) + return false; + + if (status) { + *status |= FLAG_ICLASS_AIA; + memcpy(hdr->app_issuer_area, resp, sizeof(hdr->app_issuer_area)); + } + + // card selected, now read e-purse (cc) (block2) (only 8 bytes no CRC) + start_time = *eof_time + DELAY_ICLASS_VICC_TO_VCD_READER; + iclass_send_as_reader(read_check_cc, sizeof(read_check_cc), &start_time, eof_time); + + // expect a 8-byte response here + len = GetIso15693AnswerFromTag(resp, sizeof(resp), ICLASS_READER_TIMEOUT_OTHERS, eof_time); + if (len != 8) + return false; + + memcpy(hdr->epurse, resp, sizeof(hdr->epurse)); + *status |= FLAG_ICLASS_CC; + + } else { + + // read App Issuer Area block 2 + read_aia[1] = 0x02; + read_aia[2] = 0x61; + read_aia[3] = 0x10; + + start_time = *eof_time + DELAY_ICLASS_VICC_TO_VCD_READER; + iclass_send_as_reader(read_aia, sizeof(read_aia), &start_time, eof_time); + + // expect a 10-byte response here + len = GetIso15693AnswerFromTag(resp, sizeof(resp), ICLASS_READER_TIMEOUT_OTHERS, eof_time); + if (len != 10) + return false; + + if (status) { + *status |= FLAG_ICLASS_AIA; + memcpy(card_data + (8 * 2), resp, 8); + } } - //Save CC (e-purse) in response data - memcpy(card_data + 8, resp, 8); - - // we got all data; - return 2; + return true; } -uint8_t handshakeIclassTag(uint8_t *card_data) { - return handshakeIclassTag_ext(card_data, false); + +bool select_iclass_tag(uint8_t *card_data, bool use_credit_key, uint32_t *eof_time) { + uint8_t result = 0; + return select_iclass_tag_ex(card_data, use_credit_key, eof_time, &result); } // Reader iClass Anticollission // turn off afterwards -void ReaderIClass(uint8_t arg0) { +void ReaderIClass(uint8_t flags) { - uint8_t card_data[6 * 8] = {0}; - uint8_t last_csn[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - uint8_t resp[ICLASS_BUFFER_SIZE]; - - memset(card_data, 0xFF, sizeof(card_data)); + uint8_t card_data[6 * 8] = {0xFF}; +// uint8_t last_csn[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + uint8_t resp[ICLASS_BUFFER_SIZE] = {0}; memset(resp, 0xFF, sizeof(resp)); - //Read conf block CRC(0x01) => 0xfa 0x22 - uint8_t readConf[] = { ICLASS_CMD_READ_OR_IDENTIFY, 0x01, 0xfa, 0x22}; +// bool flag_readonce = flags & FLAG_ICLASS_READER_ONLY_ONCE; // flag to read until one tag is found successfully + bool use_credit_key = flags & FLAG_ICLASS_READER_CREDITKEY; // flag to use credit key - //Read App Issuer Area block CRC(0x05) => 0xde 0x64 - uint8_t readAA[] = { ICLASS_CMD_READ_OR_IDENTIFY, 0x05, 0xde, 0x64}; - - uint16_t tryCnt = 0; - - bool abort_after_read = arg0 & FLAG_ICLASS_READER_ONLY_ONCE; // flag to read until one tag is found successfully - bool try_once = arg0 & FLAG_ICLASS_READER_ONE_TRY; // flag to not to loop continuously, looking for tag - bool use_credit_key = arg0 & FLAG_ICLASS_READER_CEDITKEY; // flag to use credit key - bool flagReadConfig = arg0 & FLAG_ICLASS_READER_CONF; // flag to read block1, configuration - bool flagReadCC = arg0 & FLAG_ICLASS_READER_CC; // flag to read block2, e-purse - bool flagReadAIA = arg0 & FLAG_ICLASS_READER_AIA; // flag to read block5, application issuer area - - setupIclassReader(); - - uint16_t checked = 0; - bool userCancelled = BUTTON_PRESS() || data_available(); - while (!userCancelled) { - - WDT_HIT(); - - // if only looking for one card try 2 times if we missed it the first time - if (try_once && tryCnt > 10) { - if (DBGLEVEL > 1) DbpString("Failed to find a tag"); - break; - } - - tryCnt++; - uint8_t result_status = 0; - - int read_status = handshakeIclassTag_ext(card_data, use_credit_key); - - if (read_status == 0) continue; - if (read_status == 1) result_status = FLAG_ICLASS_READER_CSN; - if (read_status == 2) result_status = FLAG_ICLASS_READER_CSN | FLAG_ICLASS_READER_CC; - - // handshakeIclass returns CSN|CC, but the actual block - // layout is CSN|CONFIG|CC, so here we reorder the data, - // moving CC forward 8 bytes - memcpy(card_data + 16, card_data + 8, 8); - - //Read block 1, config - if (flagReadConfig) { - if (sendCmdGetResponseWithRetries(readConf, sizeof(readConf), resp, 10, 5)) { - result_status |= FLAG_ICLASS_READER_CONF; - memcpy(card_data + 8, resp, 8); - } else { - if (DBGLEVEL > 1) DbpString("Failed to dump config block"); - } - } - - //Read block 5, AIA - if (flagReadAIA) { - if (sendCmdGetResponseWithRetries(readAA, sizeof(readAA), resp, 10, 5)) { - result_status |= FLAG_ICLASS_READER_AIA; - memcpy(card_data + (8 * 5), resp, 8); - } else { - if (DBGLEVEL > 1) DbpString("Failed to dump AA block"); - } - } - - // 0 : CSN - // 1 : Configuration - // 2 : e-purse - // 3 : kd / debit / aa2 (write-only) - // 4 : kc / credit / aa1 (write-only) - // 5 : AIA, Application issuer area - // - //Then we can 'ship' back the 6 * 8 bytes of data, - // with 0xFF:s in block 3 and 4. - - LED_B_ON(); - //Send back to client, but don't bother if we already sent this - - // only useful if looping in arm (not try_once && not abort_after_read) - if (memcmp(last_csn, card_data, 8) != 0) { - // If caller requires that we get Conf, CC, AA, continue until we got it - if (DBGLEVEL >= DBG_EXTENDED) { - Dbprintf("STATUS %02X | CSN %c | CONF %c | CC %c | AIA %c | ONCE %c | 1TRY %c", - result_status, - (result_status & FLAG_ICLASS_READER_CSN) ? 'Y' : 'N', - (result_status & FLAG_ICLASS_READER_CONF) ? 'Y' : 'N', - (result_status & FLAG_ICLASS_READER_CC) ? 'Y' : 'N', - (result_status & FLAG_ICLASS_READER_AIA) ? 'Y' : 'N' - ); - Dbprintf(" aar %c | to %c, | uc %c | frc %c | fra %c | cc %c", - abort_after_read ? 'Y' : 'N', - try_once ? 'Y' : 'N', - use_credit_key ? 'Y' : 'N', - flagReadConfig ? 'Y' : 'N', - flagReadAIA ? 'Y' : 'N', - flagReadCC ? 'Y' : 'N' - ); - } - - bool send = (result_status & FLAG_ICLASS_READER_CSN); - if (flagReadCC) - send |= (result_status & FLAG_ICLASS_READER_CC); - if (flagReadAIA) - send |= (result_status & FLAG_ICLASS_READER_AIA); - if (flagReadConfig) - send |= (result_status & FLAG_ICLASS_READER_CONF); - - if (DBGLEVEL >= DBG_EXTENDED) Dbprintf("SEND %c", send ? 'y' : 'n'); - - if (send) { - reply_mix(CMD_ACK, result_status, 0, 0, card_data, sizeof(card_data)); - if (abort_after_read) { - LED_B_OFF(); - return; - } - //Save that we already sent this.... - memcpy(last_csn, card_data, 8); - } - } - LED_B_OFF(); - - if (checked == 1000) { - userCancelled = BUTTON_PRESS() || data_available(); - checked = 0; - } - ++checked; + if ((flags & FLAG_ICLASS_READER_INIT) == FLAG_ICLASS_READER_INIT) { + Iso15693InitReader(); } - if (userCancelled) { + if ((flags & FLAG_ICLASS_READER_CLEARTRACE) == FLAG_ICLASS_READER_CLEARTRACE) { + clear_trace(); + } + + uint8_t result_status = 0; + uint32_t eof_time = 0; + bool status = select_iclass_tag_ex(card_data, use_credit_key, &eof_time, &result_status); + if (status == false) { reply_mix(CMD_ACK, 0xFF, 0, 0, card_data, 0); switch_off(); - } else { - reply_mix(CMD_ACK, 0, 0, 0, card_data, 0); + return; } -} -// turn off afterwards -void ReaderIClass_Replay(uint8_t arg0, uint8_t *mac) { - uint8_t cardsize = 0; - uint8_t mem = 0; - uint8_t check[] = { 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - uint8_t read[] = { 0x0c, 0x00, 0x00, 0x00 }; - uint8_t card_data[PM3_CMD_DATA_SIZE] = {0}; - uint8_t resp[ICLASS_BUFFER_SIZE] = {0}; + // Page mapping for secure mode + // 0 : CSN + // 1 : Configuration + // 2 : e-purse + // 3 : kd / debit / aa2 (write-only) + // 4 : kc / credit / aa1 (write-only) + // 5 : AIA, Application issuer area + // + // Page mapping for non secure mode + // 0 : CSN + // 1 : Configuration + // 2 : AIA, Application issuer area - static struct memory_t { - int k16; - int book; - int k2; - int lockauth; - int keyaccess; - } memory; + // Return to client, e 6 * 8 bytes of data. + // with 0xFF:s in block 3 and 4. - setupIclassReader(); + LED_B_ON(); + reply_mix(CMD_ACK, result_status, 0, 0, card_data, sizeof(card_data)); - while (!BUTTON_PRESS()) { + //Send back to client, but don't bother if we already sent this - + // only useful if looping in arm (not try_once && not abort_after_read) + /* + if (memcmp(last_csn, card_data, 8) != 0) { - WDT_HIT(); - - uint8_t read_status = handshakeIclassTag(card_data); - if (read_status < 2) continue; - - //for now replay captured auth (as cc not updated) - memcpy(check + 5, mac, 4); - - if (!sendCmdGetResponseWithRetries(check, sizeof(check), resp, 4, 5)) { - DbpString("Error: Authentication Fail!"); - continue; + reply_mix(CMD_ACK, result_status, 0, 0, card_data, sizeof(card_data)); + if (flag_readonce) { + LED_B_OFF(); + return; } - - //first get configuration block (block 1) - read[1] = 1; - AddCrc(read + 1, 1); - - if (!sendCmdGetResponseWithRetries(read, sizeof(read), resp, 10, 5)) { - DbpString("Dump config (block 1) failed"); - continue; - } - - mem = resp[5]; - memory.k16 = (mem & 0x80); - memory.book = (mem & 0x20); - memory.k2 = (mem & 0x8); - memory.lockauth = (mem & 0x2); - memory.keyaccess = (mem & 0x1); - - cardsize = memory.k16 ? 255 : 32; - - WDT_HIT(); - //Set card_data to all zeroes, we'll fill it with data - memset(card_data, 0x0, PM3_CMD_DATA_SIZE); - uint8_t failedRead = 0; - uint32_t stored_data_length = 0; - - //then loop around remaining blocks - for (uint16_t block = 0; block < cardsize; block++) { - - read[1] = block; - AddCrc(read + 1, 1); - - if (sendCmdGetResponseWithRetries(read, sizeof(read), resp, 10, 5)) { - Dbprintf(" %02x: %02x %02x %02x %02x %02x %02x %02x %02x", - block, resp[0], resp[1], resp[2], - resp[3], resp[4], resp[5], - resp[6], resp[7] - ); - - //Fill up the buffer - memcpy(card_data + stored_data_length, resp, 8); - stored_data_length += 8; - if (stored_data_length + 8 > PM3_CMD_DATA_SIZE) { - //Time to send this off and start afresh - reply_old(CMD_ACK, - stored_data_length,//data length - failedRead,//Failed blocks? - 0,//Not used ATM - card_data, - stored_data_length - ); - //reset - stored_data_length = 0; - failedRead = 0; - } - } else { - failedRead = 1; - stored_data_length += 8;//Otherwise, data becomes misaligned - Dbprintf("Failed to dump block %d", block); - } - } - - //Send off any remaining data - if (stored_data_length > 0) { - reply_old(CMD_ACK, - stored_data_length,//data length - failedRead,//Failed blocks? - 0,//Not used ATM - card_data, - stored_data_length - ); - } - //If we got here, let's break - break; + LED_B_OFF(); } - //Signal end of transmission - reply_old(CMD_ACK, - 0,//data length - 0,//Failed blocks? - 0,//Not used ATM - card_data, - 0 - ); + */ + +// if (userCancelled) { +// reply_mix(CMD_ACK, 0xFF, 0, 0, card_data, 0); +// switch_off(); +// } else { +// reply_mix(CMD_ACK, result_status, 0, 0, card_data, 0); +// } + switch_off(); } -// not used. ?!? ( CMD_HF_ICLASS_READCHECK) // turn off afterwards -void iClass_ReadCheck(uint8_t blockno, uint8_t keytype) { - uint8_t readcheck[] = { keytype, blockno }; - uint8_t resp[] = {0, 0, 0, 0, 0, 0, 0, 0}; - size_t isOK = 0; - isOK = sendCmdGetResponseWithRetries(readcheck, sizeof(readcheck), resp, sizeof(resp), 6); - reply_mix(CMD_ACK, isOK, 0, 0, 0, 0); +void ReaderIClass_Replay(uint8_t *rnr, uint8_t *mac) { + + BigBuf_free(); + + uint8_t check[] = { ICLASS_CMD_CHECK, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + + memcpy(check + 1, rnr, 4); + memcpy(check + 5, mac, 4); + + uint8_t *card_data = BigBuf_malloc(ICLASS_16KS_SIZE); + if (card_data == NULL) { + DbpString("fail to allocate memory"); + reply_ng(CMD_HF_ICLASS_REPLAY, PM3_EMALLOC, NULL, 0); + return; + } + memset(card_data, 0xFF, ICLASS_16KS_SIZE); + + uint32_t start_time = 0; + uint32_t eof_time = 0; + + Iso15693InitReader(); + + picopass_hdr hdr = {0}; + bool res = select_iclass_tag((uint8_t *)&hdr, false, &eof_time); + if (res == false) { + reply_ng(CMD_HF_ICLASS_REPLAY, PM3_ETIMEOUT, NULL, 0); + switch_off(); + return; + } + + uint8_t resp[10] = {0}; + + //for now replay captured auth (as cc not updated) + start_time = eof_time + DELAY_ICLASS_VICC_TO_VCD_READER; + res = iclass_send_cmd_with_retries(check, sizeof(check), resp, sizeof(resp), 4, 3, &start_time, ICLASS_READER_TIMEOUT_OTHERS, &eof_time); + if (res == false) { + reply_ng(CMD_HF_ICLASS_REPLAY, PM3_ETIMEOUT, NULL, 0); + switch_off(); + return; + } + + uint8_t mem = hdr.conf.mem_config; + uint8_t cardsize = ((mem & 0x80) == 0x80) ? 255 : 32; + + /* + static struct memory_t { + int k16; + int book; + int k2; + int lockauth; + int keyaccess; + } memory; + + // memory.k16 = ((mem & 0x80) == 0x80); + // memory.book = ((mem & 0x20) == 0x20); + // memory.k2 = ((mem & 0x08) == 0x08); + // memory.lockauth = ((mem & 0x02) == 0x02); + // memory.keyaccess = ((mem & 0x01) == 0x01); + // uint8_t cardsize = memory.k16 ? 255 : 32; + */ + + bool dumpsuccess = true; + + // main read loop + uint16_t i; + for (i = 0; i <= cardsize; i++) { + + uint8_t c[] = {ICLASS_CMD_READ_OR_IDENTIFY, i, 0x00, 0x00}; + AddCrc(c + 1, 1); + + res = iclass_send_cmd_with_retries(c, sizeof(c), resp, sizeof(resp), 10, 3, &start_time, ICLASS_READER_TIMEOUT_OTHERS, &eof_time); + if (res) { + memcpy(card_data + (8 * i), resp, 8); + } else { + Dbprintf("failed to read block %u ( 0x%02x)", i, i); + dumpsuccess = false; + } + } + + struct p { + bool isOK; + uint16_t block_cnt; + uint32_t bb_offset; + } PACKED response; + + response.isOK = dumpsuccess; + response.block_cnt = i; + response.bb_offset = card_data - BigBuf_get_addr(); + reply_ng(CMD_HF_ICLASS_REPLAY, PM3_SUCCESS, (uint8_t *)&response, sizeof(response)); + + BigBuf_free(); switch_off(); } // used with function select_and_auth (cmdhficlass.c) // which needs to authenticate before doing more things like read/write -void iClass_Authentication(uint8_t *mac) { - uint8_t check[] = { ICLASS_CMD_CHECK, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - uint8_t resp[ICLASS_BUFFER_SIZE]; +// selects and authenticate to a card, sends back div_key and mac to client. +void iClass_Authentication(uint8_t *msg) { +} + +bool authenticate_iclass_tag(iclass_auth_req_t *payload, picopass_hdr *hdr, uint32_t *start_time, uint32_t *eof_time, uint8_t *mac_out) { + + uint8_t cmd_check[9] = { ICLASS_CMD_CHECK }; + uint8_t div_key[8] = {0}; + uint8_t mac[4] = {0}; + uint8_t resp_auth[4] = {0}; + uint8_t ccnr[12] = {0}; + + uint8_t *pmac = mac; + if (mac_out) + pmac = mac_out; + + memcpy(ccnr, hdr->epurse, sizeof(hdr->epurse)); + + if (payload->use_raw) + memcpy(div_key, payload->key, 8); + else + iclass_calc_div_key(hdr->csn, payload->key, div_key, payload->use_elite); + + if (payload->use_credit_key) + memcpy(hdr->key_c, div_key, sizeof(hdr->key_c)); + else + memcpy(hdr->key_d, div_key, sizeof(hdr->key_d)); + + opt_doReaderMAC(ccnr, div_key, pmac); // copy MAC to check command (readersignature) - check[5] = mac[0]; - check[6] = mac[1]; - check[7] = mac[2]; - check[8] = mac[3]; - //memcpy(check+5, mac, 4); + cmd_check[5] = pmac[0]; + cmd_check[6] = pmac[1]; + cmd_check[7] = pmac[2]; + cmd_check[8] = pmac[3]; - // 6 retries - uint8_t isOK = sendCmdGetResponseWithRetries(check, sizeof(check), resp, 4, 6); - reply_ng(CMD_HF_ICLASS_AUTH, PM3_SUCCESS, (uint8_t *)&isOK, sizeof(uint8_t)); + return iclass_send_cmd_with_retries(cmd_check, sizeof(cmd_check), resp_auth, sizeof(resp_auth), 4, 2, start_time, ICLASS_READER_TIMEOUT_OTHERS, eof_time); } typedef struct iclass_premac { @@ -2308,12 +1618,14 @@ typedef struct iclass_premac { * to cover debit and credit key. (AA1/AA2) */ void iClass_Authentication_fast(uint64_t arg0, uint64_t arg1, uint8_t *datain) { + uint8_t i = 0, isOK = 0; - uint8_t lastChunk = ((arg0 >> 8) & 0xFF); +// uint8_t lastChunk = ((arg0 >> 8) & 0xFF); bool use_credit_key = ((arg0 >> 16) & 0xFF); uint8_t keyCount = arg1 & 0xFF; - uint8_t check[] = { ICLASS_CMD_CHECK, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - uint8_t resp[ICLASS_BUFFER_SIZE]; + + uint8_t check[9] = { ICLASS_CMD_CHECK }; + uint8_t resp[ICLASS_BUFFER_SIZE] = {0}; uint8_t readcheck_cc[] = { 0x80 | ICLASS_CMD_READCHECK, 0x02 }; if (use_credit_key) @@ -2326,39 +1638,28 @@ void iClass_Authentication_fast(uint64_t arg0, uint64_t arg1, uint8_t *datain) { LED_A_ON(); + // fresh start switch_off(); SpinDelay(20); - setupIclassReader(); + Iso15693InitReader(); + uint32_t start_time = 0, eof_time = 0; + + if (select_iclass_tag(card_data, use_credit_key, &eof_time) == false) + goto out; + + start_time = eof_time + DELAY_ICLASS_VICC_TO_VCD_READER; + + // since select_iclass_tag call sends s readcheck, we start with sending first response. uint16_t checked = 0; - int read_status = 0; - uint8_t startup_limit = 10; - while (read_status != 2) { - - if (checked == 1000) { - if (BUTTON_PRESS() || !data_available()) goto out; - checked = 0; - } - ++checked; - - read_status = handshakeIclassTag_ext(card_data, use_credit_key); - if (startup_limit-- == 0) { - Dbprintf("[-] Handshake status | %d (fail 10)", read_status); - isOK = 99; - goto out; - } - }; - // since handshakeIclassTag_ext call sends s readcheck, we start with sending first response. - - checked = 0; // Keychunk loop for (i = 0; i < keyCount; i++) { // Allow button press / usb cmd to interrupt device if (checked == 1000) { - if (BUTTON_PRESS() || !data_available()) goto out; + if (BUTTON_PRESS() || data_available()) goto out; checked = 0; } ++checked; @@ -2373,125 +1674,338 @@ void iClass_Authentication_fast(uint64_t arg0, uint64_t arg1, uint8_t *datain) { check[8] = keys[i].mac[3]; // expect 4bytes, 3 retries times.. - isOK = sendCmdGetResponseWithRetries(check, sizeof(check), resp, 4, 3); + isOK = iclass_send_cmd_with_retries(check, sizeof(check), resp, sizeof(resp), 4, 2, &start_time, ICLASS_READER_TIMEOUT_OTHERS, &eof_time); if (isOK) goto out; + start_time = eof_time + DELAY_ICLASS_VICC_TO_VCD_READER; // Auth Sequence MUST begin with reading e-purse. (block2) // Card selected, now read e-purse (cc) (block2) (only 8 bytes no CRC) - ReaderTransmitIClass(readcheck_cc, sizeof(readcheck_cc)); + iclass_send_as_reader(readcheck_cc, sizeof(readcheck_cc), &start_time, &eof_time); LED_B_OFF(); } out: // send keyindex. - reply_mix(CMD_ACK, isOK, i, 0, 0, 0); - - if (isOK >= 1 || lastChunk) { - switch_off(); - LED_A_OFF(); - } - - LED_B_OFF(); - LED_C_OFF(); + reply_mix(CMD_HF_ICLASS_CHKKEYS, isOK, i, 0, 0, 0); + switch_off(); } // Tries to read block. -// retries 10times. -bool iClass_ReadBlock(uint8_t blockno, uint8_t *data, uint8_t len) { +// retries 3times. +// reply 8 bytes block +bool iclass_read_block(uint16_t blockno, uint8_t *data, uint32_t *start_time, uint32_t *eof_time) { uint8_t resp[10]; - uint8_t cmd[] = {ICLASS_CMD_READ_OR_IDENTIFY, blockno, 0x00, 0x00}; - AddCrc(cmd + 1, 1); - // expect size 10, retry 5times - bool isOK = sendCmdGetResponseWithRetries(cmd, sizeof(cmd), resp, 10, 5); - memcpy(data, resp, len); + uint8_t c[] = {ICLASS_CMD_READ_OR_IDENTIFY, blockno, 0x00, 0x00}; + AddCrc(c + 1, 1); + bool isOK = iclass_send_cmd_with_retries(c, sizeof(c), resp, sizeof(resp), 10, 2, start_time, ICLASS_READER_TIMEOUT_OTHERS, eof_time); + if (isOK) + memcpy(data, resp, 8); return isOK; } // turn off afterwards -// readblock 8 + 2. only want 8. -void iClass_ReadBlk(uint8_t blockno) { - struct p { - bool isOK; - uint8_t blockdata[8]; - } PACKED result; +// send in authentication needed data, if to use auth. +// reply 8 bytes block if send_reply (for client) +void iClass_ReadBlock(uint8_t *msg) { - result.isOK = iClass_ReadBlock(blockno, result.blockdata, sizeof(result.blockdata)); + iclass_auth_req_t *payload = (iclass_auth_req_t *)msg; + + iclass_readblock_resp_t response = { .isOK = true }; + memset(response.data, 0, sizeof(response.data)); + + uint8_t cmd_read[] = {ICLASS_CMD_READ_OR_IDENTIFY, payload->blockno, 0x00, 0x00}; + AddCrc(cmd_read + 1, 1); + + Iso15693InitReader(); + + // select tag. + uint32_t eof_time = 0; + picopass_hdr hdr = {0}; + bool res = select_iclass_tag((uint8_t *)&hdr, payload->use_credit_key, &eof_time); + if (res == false) { + if (payload->send_reply) { + response.isOK = res; + reply_ng(CMD_HF_ICLASS_READBL, PM3_ETIMEOUT, (uint8_t *)&response, sizeof(response)); + } + goto out; + } + + uint32_t start_time = eof_time + DELAY_ICLASS_VICC_TO_VCD_READER; + + // authenticate + if (payload->do_auth) { + + res = authenticate_iclass_tag(payload, &hdr, &start_time, &eof_time, NULL); + if (res == false) { + if (payload->send_reply) { + response.isOK = res; + reply_ng(CMD_HF_ICLASS_READBL, PM3_ETIMEOUT, (uint8_t *)&response, sizeof(response)); + } + goto out; + } + } + + start_time = eof_time + DELAY_ICLASS_VICC_TO_VCD_READER; + + // read data + uint8_t resp[10]; + res = iclass_send_cmd_with_retries(cmd_read, sizeof(cmd_read), resp, sizeof(resp), 10, 3, &start_time, ICLASS_READER_TIMEOUT_OTHERS, &eof_time); + if (res) { + memcpy(response.data, resp, sizeof(response.data)); + if (payload->send_reply) { + reply_ng(CMD_HF_ICLASS_READBL, PM3_SUCCESS, (uint8_t *)&response, sizeof(response)); + } + } else { + if (payload->send_reply) { + response.isOK = res; + reply_ng(CMD_HF_ICLASS_READBL, PM3_ETIMEOUT, (uint8_t *)&response, sizeof(response)); + } + } + +out: switch_off(); - reply_ng(CMD_HF_ICLASS_READBL, PM3_SUCCESS, (uint8_t *)&result, sizeof(result)); } +// Dump command seems to dump a block related portion of card memory. +// I suppose it will need to do an authentatication to AA1, read its blocks by calling this. +// then authenticate AA2, and read those blocks by calling this. +// By the looks at it only 2K cards is supported, or first page dumps on larger cards. // turn off afterwards -void iClass_Dump(uint8_t blockno, uint8_t numblks) { - uint8_t blockdata[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - bool isOK = false; - uint8_t blkCnt = 0; +void iClass_Dump(uint8_t *msg) { BigBuf_free(); - uint8_t *dataout = BigBuf_malloc(255 * 8); + + iclass_dump_req_t *cmd = (iclass_dump_req_t *)msg; + iclass_auth_req_t *req = &cmd->req; + + uint8_t *dataout = BigBuf_malloc(ICLASS_16KS_SIZE); if (dataout == NULL) { - DbpString("[!] fail to allocate memory"); - OnError(1); + DbpString("fail to allocate memory"); + if (req->send_reply) { + reply_ng(CMD_HF_ICLASS_DUMP, PM3_EMALLOC, NULL, 0); + } + switch_off(); return; } - // fill mem with 0xFF - memset(dataout, 0xFF, 255 * 8); + memset(dataout, 0xFF, ICLASS_16KS_SIZE); - for (; blkCnt < numblks; blkCnt++) { - isOK = iClass_ReadBlock(blockno + blkCnt, blockdata, sizeof(blockdata)); + Iso15693InitReader(); - // 0xBB is the internal debug separator byte.. - if (!isOK || (blockdata[0] == 0xBB || blockdata[7] == 0xBB || blockdata[2] == 0xBB)) { //try again - isOK = iClass_ReadBlock(blockno + blkCnt, blockdata, sizeof(blockdata)); - if (!isOK) { - Dbprintf("[!] block %02X failed to read", blkCnt + blockno); - break; + // select tag. + uint32_t eof_time = 0; + picopass_hdr hdr = {0}; + bool res = select_iclass_tag((uint8_t *)&hdr, req->use_credit_key, &eof_time); + if (res == false) { + if (req->send_reply) { + reply_ng(CMD_HF_ICLASS_DUMP, PM3_ETIMEOUT, NULL, 0); + } + switch_off(); + return; + } + + uint32_t start_time = eof_time + DELAY_ICLASS_VICC_TO_VCD_READER; + + // authenticate + if (req->do_auth) { + res = authenticate_iclass_tag(req, &hdr, &start_time, &eof_time, NULL); + if (res == false) { + if (req->send_reply) { + reply_ng(CMD_HF_ICLASS_DUMP, PM3_ETIMEOUT, NULL, 0); } + switch_off(); + return; + } + } + + start_time = eof_time + DELAY_ICLASS_VICC_TO_VCD_READER; + + bool dumpsuccess = true; + + // main read loop + uint16_t i; + for (i = cmd->start_block; i <= cmd->end_block; i++) { + + uint8_t resp[10]; + uint8_t c[] = {ICLASS_CMD_READ_OR_IDENTIFY, i, 0x00, 0x00}; + AddCrc(c + 1, 1); + + res = iclass_send_cmd_with_retries(c, sizeof(c), resp, sizeof(resp), 10, 3, &start_time, ICLASS_READER_TIMEOUT_OTHERS, &eof_time); + if (res) { + memcpy(dataout + (8 * i), resp, 8); + } else { + Dbprintf("failed to read block %u ( 0x%02x)", i, i); + dumpsuccess = false; } - memcpy(dataout + (blkCnt * 8), blockdata, 8); } switch_off(); - //return pointer to dump memory in arg3 - reply_mix(CMD_ACK, isOK, blkCnt, BigBuf_max_traceLen(), 0, 0); + + // copy diversified key back. + if (req->do_auth) { + if (req->use_credit_key) + memcpy(dataout + (8 * 4), hdr.key_c, 8); + else + memcpy(dataout + (8 * 3), hdr.key_d, 8); + } + + if (req->send_reply) { + struct p { + bool isOK; + uint16_t block_cnt; + uint32_t bb_offset; + } PACKED response; + + response.isOK = dumpsuccess; + response.block_cnt = i; + response.bb_offset = dataout - BigBuf_get_addr(); + reply_ng(CMD_HF_ICLASS_DUMP, PM3_SUCCESS, (uint8_t *)&response, sizeof(response)); + } + BigBuf_free(); } -bool iClass_WriteBlock_ext(uint8_t blockno, uint8_t *data) { - uint8_t resp[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - uint8_t write[] = { 0x80 | ICLASS_CMD_UPDATE, blockno, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +static bool iclass_writeblock_ext(uint8_t blockno, uint8_t *data) { + + uint8_t write[16] = { 0x80 | ICLASS_CMD_UPDATE, blockno }; memcpy(write + 2, data, 12); // data + mac AddCrc(write + 1, 13); - return sendCmdGetResponseWithRetries(write, sizeof(write), resp, sizeof(resp), 5); + + uint8_t resp[10] = {0}; + uint32_t eof_time = 0, start_time = 0; + bool isOK = iclass_send_cmd_with_retries(write, sizeof(write), resp, sizeof(resp), 10, 3, &start_time, ICLASS_READER_TIMEOUT_UPDATE, &eof_time); + if (isOK == false) { + return false; + } + + uint8_t all_ff[8] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + if (blockno == 2) { + // check response. e-purse update swaps first and second half + if (memcmp(data + 4, resp, 4) || memcmp(data, resp + 4, 4)) { + return false; + } + } else if (blockno == 3 || blockno == 4) { + // check response. Key updates always return 0xffffffffffffffff + if (memcmp(all_ff, resp, 8)) { + return false; + } + } else { + // check response. All other updates return unchanged data + if (memcmp(data, resp, 8)) { + return false; + } + } + + return true; } // turn off afterwards -void iClass_WriteBlock(uint8_t blockno, uint8_t *data) { - uint8_t isOK = iClass_WriteBlock_ext(blockno, data); +void iClass_WriteBlock(uint8_t *msg) { + + LED_A_ON(); + + iclass_writeblock_req_t *payload = (iclass_writeblock_req_t *)msg; + + uint8_t write[16] = { 0x80 | ICLASS_CMD_UPDATE, payload->req.blockno }; + + Iso15693InitReader(); + + // select tag. + uint32_t eof_time = 0; + picopass_hdr hdr = {0}; + bool res = select_iclass_tag((uint8_t *)&hdr, payload->req.use_credit_key, &eof_time); + if (res == false) { + goto out; + } + + uint32_t start_time = eof_time + DELAY_ICLASS_VICC_TO_VCD_READER; + + uint8_t mac[4] = {0}; + + // authenticate + if (payload->req.do_auth) { + + res = authenticate_iclass_tag(&payload->req, &hdr, &start_time, &eof_time, mac); + if (res == false) { + goto out; + } + } + + // calc new mac for write + uint8_t wb[9]; + wb[0] = payload->req.blockno; + memcpy(wb + 1, payload->data, 8); + + if (payload->req.use_credit_key) + doMAC_N(wb, sizeof(wb), hdr.key_c, mac); + else + doMAC_N(wb, sizeof(wb), hdr.key_d, mac); + + memcpy(write + 2, payload->data, 8); // data + memcpy(write + 10, mac, sizeof(mac)); // mac + AddCrc(write + 1, 13); + + start_time = eof_time + DELAY_ICLASS_VICC_TO_VCD_READER; + + uint8_t resp[10] = {0}; + res = iclass_send_cmd_with_retries(write, sizeof(write), resp, sizeof(resp), 10, 3, &start_time, ICLASS_READER_TIMEOUT_UPDATE, &eof_time); + if (res == false) { + goto out; + } + + // verify write + uint8_t all_ff[8] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + if (payload->req.blockno == 2) { + // check response. e-purse update swaps first and second half + if (memcmp(payload->data + 4, resp, 4) || memcmp(payload->data, resp + 4, 4)) { + res = false; + goto out; + } + } else if (payload->req.blockno == 3 || payload->req.blockno == 4) { + // check response. Key updates always return 0xffffffffffffffff + if (memcmp(all_ff, resp, 8)) { + res = false; + goto out; + } + } else { + // check response. All other updates return unchanged data + if (memcmp(payload->data, resp, 8)) { + res = false; + goto out; + } + } + +out: switch_off(); - reply_ng(CMD_HF_ICLASS_WRITEBL, PM3_SUCCESS, (uint8_t *)&isOK, sizeof(uint8_t)); + + if (payload->req.send_reply) + reply_ng(CMD_HF_ICLASS_WRITEBL, PM3_SUCCESS, (uint8_t *)&res, sizeof(uint8_t)); } // turn off afterwards void iClass_Clone(uint8_t startblock, uint8_t endblock, uint8_t *data) { - int i, written = 0; - int total_block = (endblock - startblock) + 1; - for (i = 0; i < total_block; i++) { - // block number - if (iClass_WriteBlock_ext(startblock + i, data + (i * 12))) { - Dbprintf("Write block [%02x] successful", startblock + i); +} + +void iClass_Restore(uint8_t *msg) { + + iclass_restore_req_t *cmd = (iclass_restore_req_t *)msg; +// iclass_auth_req_t *req = &cmd->req; + + LED_A_ON(); + uint16_t written = 0; + uint16_t total_blocks = (cmd->end_block - cmd->start_block) + 1; + for (uint8_t b = cmd->start_block; b < total_blocks; b++) { + + if (iclass_writeblock_ext(b, cmd->data + ((b - cmd->start_block) * 12))) { + Dbprintf("Write block [%02x] successful", b); written++; } else { - Dbprintf("Write block [%02x] failed", startblock + i); + Dbprintf("Write block [%02x] failed", b); } } switch_off(); - - uint8_t isOK = 0; - if (written == total_block) - isOK = 1; - + uint8_t isOK = (written == total_blocks) ? 1 : 0; reply_ng(CMD_HF_ICLASS_CLONE, PM3_SUCCESS, (uint8_t *)&isOK, sizeof(uint8_t)); } diff --git a/armsrc/iclass.h b/armsrc/iclass.h index a9edbdfed..3776aa385 100644 --- a/armsrc/iclass.h +++ b/armsrc/iclass.h @@ -1,6 +1,7 @@ //----------------------------------------------------------------------------- // Jonathan Westhues, Aug 2005 // Gerhard de Koning Gans, April 2008, May 2011 +// Iceman, August 2020 // // This code is licensed to you under the terms of the GNU GPL, version 2 or, // at your option, any later version. See the LICENSE.txt file for the text of @@ -12,18 +13,30 @@ #define __ICLASS_H #include "common.h" +#include "pm3_cmd.h" -void RAMFUNC SniffIClass(void); -void SimulateIClass(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain); +void SniffIClass(uint8_t jam_search_len, uint8_t *jam_search_string); void ReaderIClass(uint8_t arg0); -void ReaderIClass_Replay(uint8_t arg0, uint8_t *mac); -void iClass_Authentication(uint8_t *mac); -void iClass_Authentication_fast(uint64_t arg0, uint64_t arg1, uint8_t *datain); -void iClass_WriteBlock(uint8_t blockno, uint8_t *data); -void iClass_ReadBlk(uint8_t blockno); -bool iClass_ReadBlock(uint8_t blockno, uint8_t *data, uint8_t len); -void iClass_Dump(uint8_t blockno, uint8_t numblks); -void iClass_Clone(uint8_t startblock, uint8_t endblock, uint8_t *data); -void iClass_ReadCheck(uint8_t blockno, uint8_t keytype); +void ReaderIClass_Replay(uint8_t *rnr, uint8_t *mac); +void iClass_WriteBlock(uint8_t *msg); +void iClass_Dump(uint8_t *msg); + +void iClass_Restore(uint8_t *msg); +void iClass_Clone(uint8_t startblock, uint8_t endblock, uint8_t *data); + +int do_iclass_simulation_nonsec(void); +int do_iclass_simulation(int simulationMode, uint8_t *reader_mac_buf); +void SimulateIClass(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *datain); +void iclass_simulate(uint8_t sim_type, uint8_t num_csns, bool send_reply, uint8_t *datain, uint8_t *dataout, uint16_t *dataoutlen); + +void iClass_Authentication_fast(uint64_t arg0, uint64_t arg1, uint8_t *datain); +void iClass_Authentication(uint8_t *bytes); +bool iclass_auth(iclass_auth_req_t *payload, uint8_t *out); + +void iClass_ReadBlock(uint8_t *msg); +bool iclass_read_block(uint16_t blockno, uint8_t *data, uint32_t *start_time, uint32_t *eof_time); + +bool select_iclass_tag(uint8_t *card_data, bool use_credit_key, uint32_t *eof_time); +bool authenticate_iclass_tag(iclass_auth_req_t *payload, picopass_hdr *hdr, uint32_t *start_time, uint32_t *eof_time, uint8_t *mac_out); #endif diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index 402d35d8a..d5417f108 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -31,9 +31,9 @@ static uint32_t iso14a_timeout; // if iso14443a not active - transmit/receive dont try to execute static bool hf_field_active = false; -uint8_t colpos = 0; -int rsamples = 0; -uint8_t trigger = 0; +static uint8_t colpos = 0; +int g_rsamples = 0; +uint8_t g_trigger = 0; // the block number for the ISO14443-4 PCB static uint8_t iso14_pcb_blocknum = 0; @@ -67,7 +67,7 @@ static uint8_t iso14_pcb_blocknum = 0; #define DELAY_ARM2AIR_AS_READER (4*16 + 8*16 + 8 + 8 + 1) // The FPGA will report its internal sending delay in -uint16_t FpgaSendQueueDelay; +static uint16_t FpgaSendQueueDelay; // the 5 first bits are the number of bits buffered in mod_sig_buf // the last three bits are the remaining ticks/2 after the mod_sig_buf shift #define DELAY_FPGA_QUEUE (FpgaSendQueueDelay<<1) @@ -123,7 +123,7 @@ static uint32_t LastProxToAirDuration; #define SEC_Z 0xc0 void iso14a_set_trigger(bool enable) { - trigger = enable; + g_trigger = enable; } void iso14a_set_timeout(uint32_t timeout) { @@ -184,14 +184,14 @@ static tUart14a Uart; // 0011 - a 2 tick wide pause, or a three tick wide pause shifted left // 0111 - a 2 tick wide pause shifted left // 1001 - a 2 tick wide pause shifted right -const bool Mod_Miller_LUT[] = { +static const bool Mod_Miller_LUT[] = { false, true, false, true, false, false, false, true, false, true, false, false, false, false, false, false }; #define IsMillerModulationNibble1(b) (Mod_Miller_LUT[(b & 0x000000F0) >> 4]) #define IsMillerModulationNibble2(b) (Mod_Miller_LUT[(b & 0x0000000F)]) -tUart14a *GetUart14a() { +tUart14a *GetUart14a(void) { return &Uart; } @@ -351,11 +351,11 @@ RAMFUNC bool MillerDecoding(uint8_t bit, uint32_t non_real_time) { // 8 ticks modulated: A collision. Save the collision position and treat as Sequence D // Note 1: the bitstream may start at any time. We therefore need to sync. // Note 2: parameter offset is used to determine the position of the parity bits (required for the anticollision command only) -tDemod14a Demod; +static tDemod14a Demod; // Lookup-Table to decide if 4 raw bits are a modulation. // We accept three or four "1" in any position -const bool Mod_Manchester_LUT[] = { +static const bool Mod_Manchester_LUT[] = { false, false, false, false, false, false, false, true, false, false, false, true, false, true, true, true }; @@ -363,7 +363,7 @@ const bool Mod_Manchester_LUT[] = { #define IsManchesterModulationNibble1(b) (Mod_Manchester_LUT[(b & 0x00F0) >> 4]) #define IsManchesterModulationNibble2(b) (Mod_Manchester_LUT[(b & 0x000F)]) -tDemod14a *GetDemod14a() { +tDemod14a *GetDemod14a(void) { return &Demod; } void Demod14aReset(void) { @@ -480,7 +480,7 @@ RAMFUNC int ManchesterDecoding(uint8_t bit, uint16_t offset, uint32_t non_real_t // Thinfilm, Kovio mangels ISO14443A in the way that they don't use start bit nor parity bits. -RAMFUNC int ManchesterDecoding_Thinfilm(uint8_t bit) { +static RAMFUNC int ManchesterDecoding_Thinfilm(uint8_t bit) { Demod.twoBits = (Demod.twoBits << 8) | bit; if (Demod.state == DEMOD_14A_UNSYNCD) { @@ -585,10 +585,6 @@ void RAMFUNC SniffIso14443a(uint8_t param) { uint8_t *receivedResp = BigBuf_malloc(MAX_FRAME_SIZE); uint8_t *receivedRespPar = BigBuf_malloc(MAX_PARITY_SIZE); - // The DMA buffer, used to stream samples from the FPGA - uint8_t *dmaBuf = BigBuf_malloc(DMA_BUFFER_SIZE); - uint8_t *data = dmaBuf; - uint8_t previous_data = 0; int maxDataLen = 0, dataLen; bool TagIsActive = false; @@ -600,10 +596,14 @@ void RAMFUNC SniffIso14443a(uint8_t param) { // Set up the demodulator for the reader -> tag commands Uart14aInit(receivedCmd, receivedCmdPar); - DbpString("Starting to sniff"); + Dbprintf("Starting to sniff. Press PM3 Button to stop."); + + // The DMA buffer, used to stream samples from the FPGA + dmabuf8_t *dma = get_dma8(); + uint8_t *data = dma->buf; // Setup and start DMA. - if (!FpgaSetupSscDma((uint8_t *) dmaBuf, DMA_BUFFER_SIZE)) { + if (!FpgaSetupSscDma((uint8_t *) dma->buf, DMA_BUFFER_SIZE)) { if (DBGLEVEL > 1) Dbprintf("FpgaSetupSscDma failed. Exiting"); return; } @@ -621,7 +621,7 @@ void RAMFUNC SniffIso14443a(uint8_t param) { WDT_HIT(); LED_A_ON(); - int register readBufDataP = data - dmaBuf; + int register readBufDataP = data - dma->buf; int register dmaBufDataP = DMA_BUFFER_SIZE - AT91C_BASE_PDC_SSC->PDC_RCR; if (readBufDataP <= dmaBufDataP) dataLen = dmaBufDataP - readBufDataP; @@ -640,13 +640,13 @@ void RAMFUNC SniffIso14443a(uint8_t param) { // primary buffer was stopped( <-- we lost data! if (!AT91C_BASE_PDC_SSC->PDC_RCR) { - AT91C_BASE_PDC_SSC->PDC_RPR = (uint32_t) dmaBuf; + AT91C_BASE_PDC_SSC->PDC_RPR = (uint32_t) dma->buf; AT91C_BASE_PDC_SSC->PDC_RCR = DMA_BUFFER_SIZE; Dbprintf("[-] RxEmpty ERROR | data length %d", dataLen); // temporary } // secondary buffer sets as primary, secondary buffer was stopped if (!AT91C_BASE_PDC_SSC->PDC_RNCR) { - AT91C_BASE_PDC_SSC->PDC_RNPR = (uint32_t) dmaBuf; + AT91C_BASE_PDC_SSC->PDC_RNPR = (uint32_t) dma->buf; AT91C_BASE_PDC_SSC->PDC_RNCR = DMA_BUFFER_SIZE; } @@ -710,16 +710,15 @@ void RAMFUNC SniffIso14443a(uint8_t param) { previous_data = *data; rx_samples++; data++; - if (data == dmaBuf + DMA_BUFFER_SIZE) { - data = dmaBuf; + if (data == dma->buf + DMA_BUFFER_SIZE) { + data = dma->buf; } } // end main loop FpgaDisableTracing(); if (DBGLEVEL >= DBG_ERROR) { - Dbprintf("maxDataLen=%d, Uart.state=%x, Uart.len=%d", maxDataLen, Uart.state, Uart.len); - Dbprintf("traceLen=" _YELLOW_("%d")", Uart.output[0]="_YELLOW_("%08x"), BigBuf_get_traceLen(), (uint32_t)Uart.output[0]); + Dbprintf("trace len = " _YELLOW_("%d"), BigBuf_get_traceLen()); } switch_off(); } @@ -729,62 +728,61 @@ void RAMFUNC SniffIso14443a(uint8_t param) { //----------------------------------------------------------------------------- static void CodeIso14443aAsTagPar(const uint8_t *cmd, uint16_t len, uint8_t *par, bool collision) { - //uint8_t localCol = 0; - ToSendReset(); + tosend_reset(); + + tosend_t *ts = get_tosend(); // Correction bit, might be removed when not needed - ToSendStuffBit(0); - ToSendStuffBit(0); - ToSendStuffBit(0); - ToSendStuffBit(0); - ToSendStuffBit(1); // <----- - ToSendStuffBit(0); - ToSendStuffBit(0); - ToSendStuffBit(0); + tosend_stuffbit(0); + tosend_stuffbit(0); + tosend_stuffbit(0); + tosend_stuffbit(0); + tosend_stuffbit(1); // <----- + tosend_stuffbit(0); + tosend_stuffbit(0); + tosend_stuffbit(0); // Send startbit - ToSend[++ToSendMax] = SEC_D; - LastProxToAirDuration = 8 * ToSendMax - 4; + ts->buf[++ts->max] = SEC_D; + LastProxToAirDuration = 8 * ts->max - 4; for (uint16_t i = 0; i < len; i++) { uint8_t b = cmd[i]; // Data bits for (uint16_t j = 0; j < 8; j++) { - //if (collision && (localCol >= colpos)){ if (collision) { - ToSend[++ToSendMax] = SEC_COLL; - //localCol++; + ts->buf[++ts->max] = SEC_COLL; } else { if (b & 1) { - ToSend[++ToSendMax] = SEC_D; + ts->buf[++ts->max] = SEC_D; } else { - ToSend[++ToSendMax] = SEC_E; + ts->buf[++ts->max] = SEC_E; } b >>= 1; } } if (collision) { - ToSend[++ToSendMax] = SEC_COLL; - LastProxToAirDuration = 8 * ToSendMax; + ts->buf[++ts->max] = SEC_COLL; + LastProxToAirDuration = 8 * ts->max; } else { // Get the parity bit if (par[i >> 3] & (0x80 >> (i & 0x0007))) { - ToSend[++ToSendMax] = SEC_D; - LastProxToAirDuration = 8 * ToSendMax - 4; + ts->buf[++ts->max] = SEC_D; + LastProxToAirDuration = 8 * ts->max - 4; } else { - ToSend[++ToSendMax] = SEC_E; - LastProxToAirDuration = 8 * ToSendMax; + ts->buf[++ts->max] = SEC_E; + LastProxToAirDuration = 8 * ts->max; } } } // Send stopbit - ToSend[++ToSendMax] = SEC_F; + ts->buf[++ts->max] = SEC_F; // Convert from last byte pos to length - ToSendMax++; + ts->max++; } static void CodeIso14443aAsTagEx(const uint8_t *cmd, uint16_t len, bool collision) { @@ -799,37 +797,39 @@ static void CodeIso14443aAsTag(const uint8_t *cmd, uint16_t len) { static void Code4bitAnswerAsTag(uint8_t cmd) { uint8_t b = cmd; - ToSendReset(); + tosend_reset(); + + tosend_t *ts = get_tosend(); // Correction bit, might be removed when not needed - ToSendStuffBit(0); - ToSendStuffBit(0); - ToSendStuffBit(0); - ToSendStuffBit(0); - ToSendStuffBit(1); // 1 - ToSendStuffBit(0); - ToSendStuffBit(0); - ToSendStuffBit(0); + tosend_stuffbit(0); + tosend_stuffbit(0); + tosend_stuffbit(0); + tosend_stuffbit(0); + tosend_stuffbit(1); // 1 + tosend_stuffbit(0); + tosend_stuffbit(0); + tosend_stuffbit(0); // Send startbit - ToSend[++ToSendMax] = SEC_D; + ts->buf[++ts->max] = SEC_D; for (uint8_t i = 0; i < 4; i++) { if (b & 1) { - ToSend[++ToSendMax] = SEC_D; - LastProxToAirDuration = 8 * ToSendMax - 4; + ts->buf[++ts->max] = SEC_D; + LastProxToAirDuration = 8 * ts->max - 4; } else { - ToSend[++ToSendMax] = SEC_E; - LastProxToAirDuration = 8 * ToSendMax; + ts->buf[++ts->max] = SEC_E; + LastProxToAirDuration = 8 * ts->max; } b >>= 1; } // Send stopbit - ToSend[++ToSendMax] = SEC_F; + ts->buf[++ts->max] = SEC_F; // Convert from last byte pos to length - ToSendMax++; + ts->max++; } //----------------------------------------------------------------------------- @@ -887,32 +887,36 @@ bool prepare_tag_modulation(tag_response_info_t *response_info, size_t max_buffe // Prepare the tag modulation bits from the message CodeIso14443aAsTag(response_info->response, response_info->response_n); + tosend_t *ts = get_tosend(); + // Make sure we do not exceed the free buffer space - if (ToSendMax > max_buffer_size) { - Dbprintf("Out of memory, when modulating bits for tag answer:"); + if (ts->max > max_buffer_size) { + Dbprintf("ToSend buffer, Out-of-bound, when modulating bits for tag answer:"); Dbhexdump(response_info->response_n, response_info->response, false); return false; } // Copy the byte array, used for this modulation to the buffer position - memcpy(response_info->modulation, ToSend, ToSendMax); + memcpy(response_info->modulation, ts->buf, ts->max); // Store the number of bytes that were used for encoding/modulation and the time needed to transfer them - response_info->modulation_n = ToSendMax; + response_info->modulation_n = ts->max; response_info->ProxToAirDuration = LastProxToAirDuration; return true; } bool prepare_allocated_tag_modulation(tag_response_info_t *response_info, uint8_t **buffer, size_t *max_buffer_size) { + tosend_t *ts = get_tosend(); + // Retrieve and store the current buffer index response_info->modulation = *buffer; // Forward the prepare tag modulation function to the inner function if (prepare_tag_modulation(response_info, *max_buffer_size)) { // Update the free buffer offset and the remaining buffer size - *buffer += ToSendMax; - *max_buffer_size -= ToSendMax; + *buffer += ts->max; + *max_buffer_size -= ts->max; return true; } else { return false; @@ -980,14 +984,26 @@ bool SimulateIso14443aInit(int tagType, int flags, uint8_t *data, tag_response_i // some first pages of UL/NTAG dump is special data mfu_dump_t *mfu_header = (mfu_dump_t *) BigBuf_get_EM_addr(); *pages = MAX(mfu_header->pages, 19); + // counters and tearing flags - for (int i = 0; i < 3; i++) { + // for old dumps with all zero headers, we need to set default values. + for (uint8_t i = 0; i < 3; i++) { + counters[i] = le24toh(mfu_header->counter_tearing[i]); - tearings[i] = mfu_header->counter_tearing[i][3]; + + if (mfu_header->counter_tearing[i][3] != 0x00) { + tearings[i] = mfu_header->counter_tearing[i][3]; + } } + // GET_VERSION - memcpy(rVERSION, mfu_header->version, 8); + if (memcmp(mfu_header->version, "\x00\x00\x00\x00\x00\x00\x00\x00", 8) == 0) { + memcpy(rVERSION, "\x00\x04\x04\x02\x01\x00\x11\x03", 8); + } else { + memcpy(rVERSION, mfu_header->version, 8); + } AddCrc14A(rVERSION, sizeof(rVERSION) - 2); + // READ_SIG memcpy(rSIGN, mfu_header->signature, 32); AddCrc14A(rSIGN, sizeof(rSIGN) - 2); @@ -1150,8 +1166,8 @@ void SimulateIso14443aTag(uint8_t tagType, uint8_t flags, uint8_t *data) { // Such a response is less time critical, so we can prepare them on the fly #define DYNAMIC_RESPONSE_BUFFER_SIZE 64 #define DYNAMIC_MODULATION_BUFFER_SIZE 512 - uint8_t dynamic_response_buffer[DYNAMIC_RESPONSE_BUFFER_SIZE]; - uint8_t dynamic_modulation_buffer[DYNAMIC_MODULATION_BUFFER_SIZE]; + uint8_t dynamic_response_buffer[DYNAMIC_RESPONSE_BUFFER_SIZE] = {0}; + uint8_t dynamic_modulation_buffer[DYNAMIC_MODULATION_BUFFER_SIZE] = {0}; tag_response_info_t dynamic_response_info = { .response = dynamic_response_buffer, .response_n = 0, @@ -1487,10 +1503,13 @@ void SimulateIso14443aTag(uint8_t tagType, uint8_t flags, uint8_t *data) { uint8_t pwd[4]; emlGetMemBt(pwd, (pages - 1) * 4 + MFU_DUMP_PREFIX_LENGTH, sizeof(pwd)); if (memcmp(receivedCmd + 1, pwd, 4) == 0) { - uint8_t cmd[4]; - emlGetMemBt(cmd, pages * 4 + MFU_DUMP_PREFIX_LENGTH, 2); - AddCrc14A(cmd, sizeof(cmd) - 2); - EmSendCmd(cmd, sizeof(cmd)); + uint8_t pack[4]; + emlGetMemBt(pack, pages * 4 + MFU_DUMP_PREFIX_LENGTH, 2); + if (memcmp(pack, "\x00\x00\x00\x00", 4) == 0) { + memcpy(pack, "\x80\x80\x00\x00", 4); + } + AddCrc14A(pack, sizeof(pack) - 2); + EmSendCmd(pack, sizeof(pack)); } else { EmSend4bit(CARD_NACK_NA); if (DBGLEVEL >= DBG_DEBUG) Dbprintf("Auth attempt: %08x", bytes_to_num(receivedCmd + 1, 4)); @@ -1613,7 +1632,7 @@ void SimulateIso14443aTag(uint8_t tagType, uint8_t flags, uint8_t *data) { // prepare a delayed transfer. This simply shifts ToSend[] by a number // of bits specified in the delay parameter. -void PrepareDelayedTransfer(uint16_t delay) { +static void PrepareDelayedTransfer(uint16_t delay) { delay &= 0x07; if (!delay) return; @@ -1623,12 +1642,14 @@ void PrepareDelayedTransfer(uint16_t delay) { for (uint16_t i = 0; i < delay; i++) bitmask |= (0x01 << i); - ToSend[ToSendMax++] = 0x00; + tosend_t *ts = get_tosend(); - for (uint16_t i = 0; i < ToSendMax; i++) { - uint8_t bits_to_shift = ToSend[i] & bitmask; - ToSend[i] = ToSend[i] >> delay; - ToSend[i] = ToSend[i] | (bits_shifted << (8 - delay)); + ts->buf[ts->max++] = 0x00; + + for (uint16_t i = 0; i < ts->max; i++) { + uint8_t bits_to_shift = ts->buf[i] & bitmask; + ts->buf[i] = ts->buf[i] >> delay; + ts->buf[i] = ts->buf[i] | (bits_shifted << (8 - delay)); bits_shifted = bits_to_shift; } } @@ -1683,14 +1704,15 @@ static void TransmitFor14443a(const uint8_t *cmd, uint16_t len, uint32_t *timing //----------------------------------------------------------------------------- // Prepare reader command (in bits, support short frames) to send to FPGA //----------------------------------------------------------------------------- -void CodeIso14443aBitsAsReaderPar(const uint8_t *cmd, uint16_t bits, const uint8_t *par) { +static void CodeIso14443aBitsAsReaderPar(const uint8_t *cmd, uint16_t bits, const uint8_t *par) { int last = 0; - ToSendReset(); + tosend_reset(); + tosend_t *ts = get_tosend(); // Start of Communication (Seq. Z) - ToSend[++ToSendMax] = SEC_Z; - LastProxToAirDuration = 8 * (ToSendMax + 1) - 6; + ts->buf[++ts->max] = SEC_Z; + LastProxToAirDuration = 8 * (ts->max + 1) - 6; size_t bytecount = nbytes(bits); // Generate send structure for the data bits @@ -1702,17 +1724,17 @@ void CodeIso14443aBitsAsReaderPar(const uint8_t *cmd, uint16_t bits, const uint8 for (j = 0; j < bitsleft; j++) { if (b & 1) { // Sequence X - ToSend[++ToSendMax] = SEC_X; - LastProxToAirDuration = 8 * (ToSendMax + 1) - 2; + ts->buf[++ts->max] = SEC_X; + LastProxToAirDuration = 8 * (ts->max + 1) - 2; last = 1; } else { if (last == 0) { // Sequence Z - ToSend[++ToSendMax] = SEC_Z; - LastProxToAirDuration = 8 * (ToSendMax + 1) - 6; + ts->buf[++ts->max] = SEC_Z; + LastProxToAirDuration = 8 * (ts->max + 1) - 6; } else { // Sequence Y - ToSend[++ToSendMax] = SEC_Y; + ts->buf[++ts->max] = SEC_Y; last = 0; } } @@ -1724,17 +1746,17 @@ void CodeIso14443aBitsAsReaderPar(const uint8_t *cmd, uint16_t bits, const uint8 // Get the parity bit if (par[i >> 3] & (0x80 >> (i & 0x0007))) { // Sequence X - ToSend[++ToSendMax] = SEC_X; - LastProxToAirDuration = 8 * (ToSendMax + 1) - 2; + ts->buf[++ts->max] = SEC_X; + LastProxToAirDuration = 8 * (ts->max + 1) - 2; last = 1; } else { if (last == 0) { // Sequence Z - ToSend[++ToSendMax] = SEC_Z; - LastProxToAirDuration = 8 * (ToSendMax + 1) - 6; + ts->buf[++ts->max] = SEC_Z; + LastProxToAirDuration = 8 * (ts->max + 1) - 6; } else { // Sequence Y - ToSend[++ToSendMax] = SEC_Y; + ts->buf[++ts->max] = SEC_Y; last = 0; } } @@ -1744,25 +1766,26 @@ void CodeIso14443aBitsAsReaderPar(const uint8_t *cmd, uint16_t bits, const uint8 // End of Communication: Logic 0 followed by Sequence Y if (last == 0) { // Sequence Z - ToSend[++ToSendMax] = SEC_Z; - LastProxToAirDuration = 8 * (ToSendMax + 1) - 6; + ts->buf[++ts->max] = SEC_Z; + LastProxToAirDuration = 8 * (ts->max + 1) - 6; } else { // Sequence Y - ToSend[++ToSendMax] = SEC_Y; + ts->buf[++ts->max] = SEC_Y; } - ToSend[++ToSendMax] = SEC_Y; + ts->buf[++ts->max] = SEC_Y; // Convert to length of command: - ToSendMax++; + ts->max++; } //----------------------------------------------------------------------------- // Prepare reader command to send to FPGA //----------------------------------------------------------------------------- -void CodeIso14443aAsReaderPar(const uint8_t *cmd, uint16_t len, const uint8_t *par) { +/* +static void CodeIso14443aAsReaderPar(const uint8_t *cmd, uint16_t len, const uint8_t *par) { CodeIso14443aBitsAsReaderPar(cmd, len * 8, par); } - +*/ //----------------------------------------------------------------------------- // Wait for commands from reader // Stop when button is pressed (return 1) or field was gone (return 2) @@ -1954,7 +1977,8 @@ int EmSendCmd14443aRaw(uint8_t *resp, uint16_t respLen) { int EmSend4bit(uint8_t resp) { Code4bitAnswerAsTag(resp); - int res = EmSendCmd14443aRaw(ToSend, ToSendMax); + tosend_t *ts = get_tosend(); + int res = EmSendCmd14443aRaw(ts->buf, ts->max); // do the tracing for the previous reader request and this tag answer: uint8_t par[1] = {0x00}; GetParity(&resp, 1, par); @@ -1975,7 +1999,9 @@ int EmSendCmdPar(uint8_t *resp, uint16_t respLen, uint8_t *par) { } int EmSendCmdParEx(uint8_t *resp, uint16_t respLen, uint8_t *par, bool collision) { CodeIso14443aAsTagPar(resp, respLen, par, collision); - int res = EmSendCmd14443aRaw(ToSend, ToSendMax); + tosend_t *ts = get_tosend(); + int res = EmSendCmd14443aRaw(ts->buf, ts->max); + // do the tracing for the previous reader request and this tag answer: EmLogTrace(Uart.output, Uart.len, @@ -2014,13 +2040,6 @@ int EmSendPrecompiledCmd(tag_response_info_t *p_response) { LastTimeProxToAirStart * 16 + DELAY_ARM2AIR_AS_TAG, (LastTimeProxToAirStart + p_response->ProxToAirDuration) * 16 + DELAY_ARM2AIR_AS_TAG, par); - - if (DBGLEVEL >= DBG_EXTENDED) { - Dbprintf("response_info->response %02X", p_response->response); - Dbprintf("response_info->response_n %02X", p_response->response_n); - Dbprintf("response_info->par %02X", &(p_response->par)); - } - return ret; } @@ -2143,8 +2162,9 @@ void ReaderTransmitBitsPar(uint8_t *frame, uint16_t bits, uint8_t *par, uint32_t CodeIso14443aBitsAsReaderPar(frame, bits, par); // Send command to tag - TransmitFor14443a(ToSend, ToSendMax, timing); - if (trigger) LED_A_ON(); + tosend_t *ts = get_tosend(); + TransmitFor14443a(ts->buf, ts->max, timing); + if (g_trigger) LED_A_ON(); LogTrace(frame, nbytes(bits), (LastTimeProxToAirStart << 4) + DELAY_ARM2AIR_AS_READER, ((LastTimeProxToAirStart + LastProxToAirDuration) << 4) + DELAY_ARM2AIR_AS_READER, par, true); } @@ -2153,7 +2173,7 @@ void ReaderTransmitPar(uint8_t *frame, uint16_t len, uint8_t *par, uint32_t *tim ReaderTransmitBitsPar(frame, len * 8, par, timing); } -void ReaderTransmitBits(uint8_t *frame, uint16_t len, uint32_t *timing) { +static void ReaderTransmitBits(uint8_t *frame, uint16_t len, uint32_t *timing) { // Generate parity and redirect uint8_t par[MAX_PARITY_SIZE] = {0x00}; GetParity(frame, len / 8, par); @@ -2167,7 +2187,7 @@ void ReaderTransmit(uint8_t *frame, uint16_t len, uint32_t *timing) { ReaderTransmitBitsPar(frame, len * 8, par, timing); } -int ReaderReceiveOffset(uint8_t *receivedAnswer, uint16_t offset, uint8_t *par) { +static int ReaderReceiveOffset(uint8_t *receivedAnswer, uint16_t offset, uint8_t *par) { if (!GetIso14443aAnswerFromTag(receivedAnswer, par, offset)) return false; LogTrace(receivedAnswer, Demod.len, Demod.startTime * 16 - DELAY_AIR2ARM_AS_READER, Demod.endTime * 16 - DELAY_AIR2ARM_AS_READER, par, false); @@ -2521,7 +2541,7 @@ void iso14443a_setup(uint8_t fpga_minor_mode) { FpgaDownloadAndGo(FPGA_BITSTREAM_HF); // Set up the synchronous serial port - FpgaSetupSsc(); + FpgaSetupSsc(FPGA_MAJOR_MODE_HF_ISO14443A); // connect Demodulated Signal to ADC: SetAdcMuxFor(GPIO_MUXSEL_HIPKD); @@ -2545,7 +2565,6 @@ void iso14443a_setup(uint8_t fpga_minor_mode) { hf_field_active = true; } - void hf_field_off(void) { FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); LEDsoff(); @@ -2769,7 +2788,7 @@ OUT: // Determine the distance between two nonces. // Assume that the difference is small, but we don't know which is first. // Therefore try in alternating directions. -int32_t dist_nt(uint32_t nt1, uint32_t nt2) { +static int32_t dist_nt(uint32_t nt1, uint32_t nt2) { if (nt1 == nt2) return 0; diff --git a/armsrc/iso14443b.c b/armsrc/iso14443b.c index 10beb4489..f2738f7b4 100644 --- a/armsrc/iso14443b.c +++ b/armsrc/iso14443b.c @@ -1,5 +1,6 @@ //----------------------------------------------------------------------------- // Jonathan Westhues, split Nov 2006 +// piwi 2018 // // This code is licensed to you under the terms of the GNU GPL, version 2 or, // at your option, any later version. See the LICENSE.txt file for the text of @@ -24,20 +25,39 @@ #include "dbprint.h" #include "ticks.h" -#ifndef FWT_TIMEOUT_14B + +// Delays in SSP_CLK ticks. +// SSP_CLK runs at 13,56MHz / 32 = 423.75kHz when simulating a tag +#define DELAY_READER_TO_ARM 8 +#define DELAY_ARM_TO_READER 0 + +//SSP_CLK runs at 13.56MHz / 4 = 3,39MHz when acting as reader. All values should be multiples of 16 +#define DELAY_ARM_TO_TAG 16 +#define DELAY_TAG_TO_ARM 32 + +//SSP_CLK runs at 13.56MHz / 4 = 3,39MHz when sniffing. All values should be multiples of 16 +#define DELAY_TAG_TO_ARM_SNIFF 32 +#define DELAY_READER_TO_ARM_SNIFF 32 + // defaults to 2000ms +#ifndef FWT_TIMEOUT_14B # define FWT_TIMEOUT_14B 35312 #endif -#ifndef ISO14443B_DMA_BUFFER_SIZE -# define ISO14443B_DMA_BUFFER_SIZE 512 //changed this from 256 -#endif + + // 330/848kHz = 1558us / 4 == 400us, +#define ISO14443B_READER_TIMEOUT 1700 //330 + +// 1024/3.39MHz = 302.1us between end of tag response and next reader cmd +#define DELAY_ISO14443B_VICC_TO_VCD_READER 600 // 1024 +#define DELAY_ISO14443B_VCD_TO_VICC_READER 600// 1056 + #ifndef RECEIVE_MASK -# define RECEIVE_MASK (ISO14443B_DMA_BUFFER_SIZE-1) +# define RECEIVE_MASK (DMA_BUFFER_SIZE - 1) #endif // Guard Time (per 14443-2) #ifndef TR0 -# define TR0 32 //this value equals 8 ETU = 32 ssp clk (w/ 424 khz) +# define TR0 64 // TR0 max is 256/fs = 256/(848kHz) = 302us or 64 samples from FPGA #endif // Synchronization time (per 14443-2) @@ -50,12 +70,7 @@ #endif // 4sample -#define SEND4STUFFBIT(x) ToSendStuffBit(x);ToSendStuffBit(x);ToSendStuffBit(x);ToSendStuffBit(x); -//#define SEND4STUFFBIT(x) ToSendStuffBit(x); -// iceman, this threshold value, what makes 8 a good amplitude for this IQ values? -#ifndef SUBCARRIER_DETECT_THRESHOLD -# define SUBCARRIER_DETECT_THRESHOLD 8 -#endif +#define SEND4STUFFBIT(x) tosend_stuffbit(x);tosend_stuffbit(x);tosend_stuffbit(x);tosend_stuffbit(x); static void iso14b_set_timeout(uint32_t timeout); static void iso14b_set_maxframesize(uint16_t size); @@ -64,17 +79,158 @@ static void iso14b_set_maxframesize(uint16_t size); static uint8_t pcb_blocknum = 0; static uint32_t iso14b_timeout = FWT_TIMEOUT_14B; + +/* ISO 14443 B +* +* Reader to card | ASK - Amplitude Shift Keying Modulation (PCD to PICC for Type B) (NRZ-L encodig) +* Card to reader | BPSK - Binary Phase Shift Keying Modulation, (PICC to PCD for Type B) +* +* fc - carrier frequency 13.56 MHz +* TR0 - Guard Time per 14443-2 +* TR1 - Synchronization Time per 14443-2 +* TR2 - PICC to PCD Frame Delay Time (per 14443-3 Amendment 1) +* +* Elementary Time Unit (ETU) is +* - 128 Carrier Cycles (9.4395 µS) = 8 Subcarrier Units +* - 1 ETU = 1 bit +* - 10 ETU = 1 startbit, 8 databits, 1 stopbit (10bits length) +* - startbit is a 0 +* - stopbit is a 1 +* +* Start of frame (SOF) is +* - [10-11] ETU of ZEROS, unmodulated time +* - [2-3] ETU of ONES, +* +* End of frame (EOF) is +* - [10-11] ETU of ZEROS, unmodulated time +* +* -TO VERIFY THIS BELOW- +* The mode FPGA_MAJOR_MODE_HF_SIMULATOR | FPGA_HF_SIMULATOR_MODULATE_BPSK which we use to simulate tag +* works like this: +* - A 1-bit input to the FPGA becomes 8 pulses at 847.5kHz (1.18µS / pulse) == 9.44us +* - A 0-bit input to the FPGA becomes an unmodulated time of 1.18µS or does it become 8 nonpulses for 9.44us +* +* FPGA doesn't seem to work with ETU. It seems to work with pulse / duration instead. +* +* Card sends data ub 847.e kHz subcarrier +* subcar |duration| FC division +* -------+--------+------------ +* 106kHz | 9.44µS | FC/128 +* 212kHz | 4.72µS | FC/64 +* 424kHz | 2.36µS | FC/32 +* 848kHz | 1.18µS | FC/16 +* -------+--------+------------ +* +* Reader data transmission: +* - no modulation ONES +* - SOF +* - Command, data and CRC_B +* - EOF +* - no modulation ONES +* +* Card data transmission +* - TR1 +* - SOF +* - data (each bytes is: 1startbit, 8bits, 1stopbit) +* - CRC_B +* - EOF +* +* FPGA implementation : +* At this point only Type A is implemented. This means that we are using a +* bit rate of 106 kbit/s, or fc/128. Oversample by 4, which ought to make +* things practical for the ARM (fc/32, 423.8 kbits/s, ~50 kbytes/s) +* +* Let us report a correlation every 64 samples. I.e. +* one Q/I pair after 4 subcarrier cycles for the 848kHz subcarrier, +* one Q/I pair after 2 subcarrier cycles for the 424kHz subcarrier, +* one Q/I pair for each subcarrier cyle for the 212kHz subcarrier. +*/ + + + //============================================================================= // An ISO 14443 Type B tag. We listen for commands from the reader, using -// a kind of thing that's implemented in software. When we get a +// a UART kind of thing that's implemented in software. When we get a // frame (i.e., a group of bytes between SOF and EOF), we check the CRC. // If it's good, then we can do something appropriate with it, and send // a response. //============================================================================= +//----------------------------------------------------------------------------- +// Code up a string of octets at layer 2 (including CRC, we don't generate +// that here) so that they can be transmitted to the reader. Doesn't transmit +// them yet, just leaves them ready to send in ToSend[]. +//----------------------------------------------------------------------------- +static void CodeIso14443bAsTag(const uint8_t *cmd, int len) { + int i; + + tosend_reset(); + + // Transmit a burst of ones, as the initial thing that lets the + // reader get phase sync. + // This loop is TR1, per specification + // TR1 minimum must be > 80/fs + // TR1 maximum 200/fs + // 80/fs < TR1 < 200/fs + // 10 ETU < TR1 < 24 ETU + + // Send TR1. + // 10-11 ETU * 4times samples ONES + for (i = 0; i < 20; i++) { + SEND4STUFFBIT(1); + } + + // Send SOF. + // 10-11 ETU * 4times samples ZEROS + for (i = 0; i < 10; i++) { + SEND4STUFFBIT(0); + } + + // 2-3 ETU * 4times samples ONES + for (i = 0; i < 2; i++) { + SEND4STUFFBIT(1); + } + + // data + for (i = 0; i < len; i++) { + + // Start bit + SEND4STUFFBIT(0); + + // Data bits + uint8_t b = cmd[i]; + for (int j = 0; j < 8; j++) { + SEND4STUFFBIT(b & 1); + b >>= 1; + } + + // Stop bit + SEND4STUFFBIT(1); + + // Extra Guard bit + // For PICC it ranges 0-18us (1etu = 9us) + //SEND4STUFFBIT(1); + } + + // Send EOF. + // 10-11 ETU * 4 sample rate = ZEROS + for (i = 0; i < 10; i++) { + SEND4STUFFBIT(0); + } + + // why this? + for (i = 0; i < 2; i++) { + SEND4STUFFBIT(1); + } + + tosend_t *ts = get_tosend(); + // Convert from last byte pos to length + ts->max++; +} //----------------------------------------------------------------------------- -// The software that receives commands from the reader, and its state variables. +// The software UART that receives commands from the reader, and its state +// variables. //----------------------------------------------------------------------------- static struct { enum { @@ -91,7 +247,7 @@ static struct { uint8_t *output; } Uart; -static void Uart14bReset() { +static void Uart14bReset(void) { Uart.state = STATE_14B_UNSYNCD; Uart.shiftReg = 0; Uart.bitCnt = 0; @@ -103,12 +259,15 @@ static void Uart14bReset() { static void Uart14bInit(uint8_t *data) { Uart.output = data; Uart14bReset(); -// memset(Uart.output, 0x00, MAX_FRAME_SIZE); } //----------------------------------------------------------------------------- // The software Demod that receives commands from the tag, and its state variables. //----------------------------------------------------------------------------- + +#define NOISE_THRESHOLD 80 // don't try to correlate noise +#define MAX_PREVIOUS_AMPLITUDE (-1 - NOISE_THRESHOLD) + static struct { enum { DEMOD_UNSYNCD, @@ -121,20 +280,16 @@ static struct { uint16_t bitCount; int posCount; int thisBit; - /* this had been used to add RSSI (Received Signal Strength Indication) to traces. Currently not implemented. - int metric; - int metricN; - */ uint16_t shiftReg; + uint16_t max_len; uint8_t *output; uint16_t len; int sumI; int sumQ; - uint32_t startTime, endTime; } Demod; // Clear out the state of the "UART" that receives from the tag. -static void Demod14bReset() { +static void Demod14bReset(void) { Demod.state = DEMOD_UNSYNCD; Demod.bitCount = 0; Demod.posCount = 0; @@ -143,14 +298,12 @@ static void Demod14bReset() { Demod.len = 0; Demod.sumI = 0; Demod.sumQ = 0; - Demod.startTime = 0; - Demod.endTime = 0; } -static void Demod14bInit(uint8_t *data) { +static void Demod14bInit(uint8_t *data, uint16_t max_len) { Demod.output = data; + Demod.max_len = max_len; Demod14bReset(); - // memset(Demod.output, 0x00, MAX_FRAME_SIZE); } @@ -173,152 +326,17 @@ static void iso14b_set_timeout(uint32_t timeout) { timeout = MAX_TIMEOUT; iso14b_timeout = timeout; - if (DBGLEVEL >= 3) Dbprintf("ISO14443B Timeout set to %ld fwt", iso14b_timeout); + if (DBGLEVEL >= DBG_DEBUG) Dbprintf("ISO14443B Timeout set to %ld fwt", iso14b_timeout); } + static void iso14b_set_maxframesize(uint16_t size) { if (size > 256) size = MAX_FRAME_SIZE; Uart.byteCntMax = size; - if (DBGLEVEL >= 3) Dbprintf("ISO14443B Max frame size set to %d bytes", Uart.byteCntMax); + if (DBGLEVEL >= DBG_DEBUG) Dbprintf("ISO14443B Max frame size set to %d bytes", Uart.byteCntMax); } -//----------------------------------------------------------------------------- -// Code up a string of octets at layer 2 (including CRC, we don't generate -// that here) so that they can be transmitted to the reader. Doesn't transmit -// them yet, just leaves them ready to send in ToSend[]. -//----------------------------------------------------------------------------- -static void CodeIso14443bAsTag(const uint8_t *cmd, int len) { - /* ISO 14443 B - * - * Reader to card | ASK - Amplitude Shift Keying Modulation (PCD to PICC for Type B) (NRZ-L encodig) - * Card to reader | BPSK - Binary Phase Shift Keying Modulation, (PICC to PCD for Type B) - * - * fc - carrier frequency 13.56 MHz - * TR0 - Guard Time per 14443-2 - * TR1 - Synchronization Time per 14443-2 - * TR2 - PICC to PCD Frame Delay Time (per 14443-3 Amendment 1) - * - * Elementary Time Unit (ETU) is - * - 128 Carrier Cycles (9.4395 µS) = 8 Subcarrier Units - * - 1 ETU = 1 bit - * - 10 ETU = 1 startbit, 8 databits, 1 stopbit (10bits length) - * - startbit is a 0 - * - stopbit is a 1 - * - * Start of frame (SOF) is - * - [10-11] ETU of ZEROS, unmodulated time - * - [2-3] ETU of ONES, - * - * End of frame (EOF) is - * - [10-11] ETU of ZEROS, unmodulated time - * - * -TO VERIFY THIS BELOW- - * The mode FPGA_MAJOR_MODE_HF_SIMULATOR | FPGA_HF_SIMULATOR_MODULATE_BPSK which we use to simulate tag - * works like this: - * - A 1-bit input to the FPGA becomes 8 pulses at 847.5kHz (1.18µS / pulse) == 9.44us - * - A 0-bit input to the FPGA becomes an unmodulated time of 1.18µS or does it become 8 nonpulses for 9.44us - * - * FPGA doesn't seem to work with ETU. It seems to work with pulse / duration instead. - * - * Card sends data ub 847.e kHz subcarrier - * subcar |duration| FC division - * -------+--------+------------ - * 106kHz | 9.44µS | FC/128 - * 212kHz | 4.72µS | FC/64 - * 424kHz | 2.36µS | FC/32 - * 848kHz | 1.18µS | FC/16 - * -------+--------+------------ - * - * Reader data transmission: - * - no modulation ONES - * - SOF - * - Command, data and CRC_B - * - EOF - * - no modulation ONES - * - * Card data transmission - * - TR1 - * - SOF - * - data (each bytes is: 1startbit, 8bits, 1stopbit) - * - CRC_B - * - EOF - * - * FPGA implementation : - * At this point only Type A is implemented. This means that we are using a - * bit rate of 106 kbit/s, or fc/128. Oversample by 4, which ought to make - * things practical for the ARM (fc/32, 423.8 kbits/s, ~50 kbytes/s) - * - */ - - ToSendReset(); - - // Transmit a burst of ones, as the initial thing that lets the - // reader get phase sync. - // This loop is TR1, per specification - // TR1 minimum must be > 80/fs - // TR1 maximum 200/fs - // 80/fs < TR1 < 200/fs - // 10 ETU < TR1 < 24 ETU - - // Send TR1. - // 10-11 ETU * 4times samples ONES - for (int i = 0; i < 10; i++) { SEND4STUFFBIT(1); } - - // Send SOF. - // 10-11 ETU * 4times samples ZEROS - for (int i = 0; i < 10; i++) { SEND4STUFFBIT(0); } - //for(i = 0; i < 10; i++) { ToSendStuffBit(0); } - - // 2-3 ETU * 4times samples ONES - for (int i = 0; i < 3; i++) { SEND4STUFFBIT(1); } - //for(i = 0; i < 3; i++) { ToSendStuffBit(1); } - - // data - for (int i = 0; i < len; ++i) { - - // Start bit - SEND4STUFFBIT(0); - //ToSendStuffBit(0); - - // Data bits - uint8_t b = cmd[i]; - for (int j = 0; j < 8; ++j) { - // if(b & 1) { - // SEND4STUFFBIT(1); - // //ToSendStuffBit(1); - // } else { - // SEND4STUFFBIT(0); - // //ToSendStuffBit(0); - // } - SEND4STUFFBIT(b & 1); - b >>= 1; - } - - // Stop bit - SEND4STUFFBIT(1); - //ToSendStuffBit(1); - - // Extra Guard bit - // For PICC it ranges 0-18us (1etu = 9us) - SEND4STUFFBIT(1); - //ToSendStuffBit(1); - } - - // Send EOF. - // 10-11 ETU * 4 sample rate = ZEROS - for (int i = 0; i < 10; i++) { SEND4STUFFBIT(0); } - //for(i = 0; i < 10; i++) { ToSendStuffBit(0); } - - // why this? - for (int i = 0; i < 2; i++) { SEND4STUFFBIT(1); } - //for(i = 0; i < 40; i++) { ToSendStuffBit(1); } - - // Convert from last byte pos to length - ++ToSendMax; -} - - /* Receive & handle a bit coming from the reader. * * This function is called 4 times per bit (every 2 subcarrier cycles). @@ -331,10 +349,10 @@ static void CodeIso14443bAsTag(const uint8_t *cmd, int len) { * Returns: true if we received a EOF * false if we are still waiting for some more */ -static RAMFUNC int Handle14443bReaderUartBit(uint8_t bit) { +static RAMFUNC int Handle14443bSampleFromReader(uint8_t bit) { switch (Uart.state) { case STATE_14B_UNSYNCD: - if (!bit) { + if (bit == false) { // we went low, so this could be the beginning of an SOF Uart.state = STATE_14B_GOT_FALLING_EDGE_OF_SOF; Uart.posCnt = 0; @@ -344,7 +362,9 @@ static RAMFUNC int Handle14443bReaderUartBit(uint8_t bit) { case STATE_14B_GOT_FALLING_EDGE_OF_SOF: Uart.posCnt++; + if (Uart.posCnt == 2) { // sample every 4 1/fs in the middle of a bit + if (bit) { if (Uart.bitCnt > 9) { // we've seen enough consecutive @@ -362,7 +382,11 @@ static RAMFUNC int Handle14443bReaderUartBit(uint8_t bit) { } Uart.bitCnt++; } - if (Uart.posCnt >= 4) Uart.posCnt = 0; + + if (Uart.posCnt >= 4) { + Uart.posCnt = 0; + } + if (Uart.bitCnt > 12) { // Give up if we see too many zeros without a one, too. LED_A_OFF(); @@ -372,11 +396,16 @@ static RAMFUNC int Handle14443bReaderUartBit(uint8_t bit) { case STATE_14B_AWAITING_START_BIT: Uart.posCnt++; + if (bit) { - if (Uart.posCnt > 50 / 2) { // max 57us between characters = 49 1/fs, max 3 etus after low phase of SOF = 24 1/fs + + // max 57us between characters = 49 1/fs, + // max 3 etus after low phase of SOF = 24 1/fs + if (Uart.posCnt > 50 / 2) { // stayed high for too long between characters, error Uart.state = STATE_14B_UNSYNCD; } + } else { // falling edge, this starts the data byte Uart.posCnt = 0; @@ -387,7 +416,9 @@ static RAMFUNC int Handle14443bReaderUartBit(uint8_t bit) { break; case STATE_14B_RECEIVING_DATA: + Uart.posCnt++; + if (Uart.posCnt == 2) { // time to sample a bit Uart.shiftReg >>= 1; @@ -396,14 +427,16 @@ static RAMFUNC int Handle14443bReaderUartBit(uint8_t bit) { } Uart.bitCnt++; } + if (Uart.posCnt >= 4) { Uart.posCnt = 0; } + if (Uart.bitCnt == 10) { if ((Uart.shiftReg & 0x200) && !(Uart.shiftReg & 0x001)) { // this is a data byte, with correct // start and stop bits - Uart.output[Uart.byteCnt] = (Uart.shiftReg >> 1) & 0xff; + Uart.output[Uart.byteCnt] = (Uart.shiftReg >> 1) & 0xFF; Uart.byteCnt++; if (Uart.byteCnt >= Uart.byteCntMax) { @@ -454,42 +487,16 @@ static int GetIso14443bCommandFromReader(uint8_t *received, uint16_t *len) { LED_D_OFF(); FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_SIMULATOR | FPGA_HF_SIMULATOR_NO_MODULATION); - StartCountSspClk(); - - volatile uint8_t b; - - // clear receiving shift register and holding register - // What does this loop do? Is it TR1? - // loop is a wait/delay ? - /* - for(uint8_t c = 0; c < 10;) { - - // keep tx buffer in a defined state anyway. - if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) { - AT91C_BASE_SSC->SSC_THR = 0xFF; - ++c; - } - } - */ // Now run a `software UART' on the stream of incoming samples. Uart14bInit(received); - uint8_t mask; - while (!BUTTON_PRESS()) { + while (BUTTON_PRESS() == false) { WDT_HIT(); - // keep tx buffer in a defined state anyway. - if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) { - AT91C_BASE_SSC->SSC_THR = 0x00; - } - - // Wait for byte be become available in rx holding register - if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_RXRDY) { - - b = (uint8_t) AT91C_BASE_SSC->SSC_RHR; - - for (mask = 0x80; mask != 0; mask >>= 1) { - if (Handle14443bReaderUartBit(b & mask)) { + if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) { + uint8_t b = (uint8_t)AT91C_BASE_SSC->SSC_RHR; + for (uint8_t mask = 0x80; mask != 0x00; mask >>= 1) { + if (Handle14443bSampleFromReader(b & mask)) { *len = Uart.byteCnt; return true; } @@ -499,75 +506,25 @@ static int GetIso14443bCommandFromReader(uint8_t *received, uint16_t *len) { return false; } -void ClearFpgaShiftingRegisters(void) { - - volatile uint8_t b; - - // clear receiving shift register and holding register - while (!(AT91C_BASE_SSC->SSC_SR & AT91C_SSC_RXRDY)) {}; - - b = AT91C_BASE_SSC->SSC_RHR; - (void) b; - - while (!(AT91C_BASE_SSC->SSC_SR & AT91C_SSC_RXRDY)) {}; - - b = AT91C_BASE_SSC->SSC_RHR; - (void) b; - - // wait for the FPGA to signal fdt_indicator == 1 (the FPGA is ready to queue new data in its delay line) - for (uint8_t j = 0; j < 5; j++) { // allow timeout - better late than never - while (!(AT91C_BASE_SSC->SSC_SR & AT91C_SSC_RXRDY)) {}; - if (AT91C_BASE_SSC->SSC_RHR) break; - } - - // Clear TXRDY: - //AT91C_BASE_SSC->SSC_THR = 0xFF; -} - -void WaitForFpgaDelayQueueIsEmpty(uint16_t delay) { - // Ensure that the FPGA Delay Queue is empty before we switch to TAGSIM_LISTEN again: - uint8_t fpga_queued_bits = delay >> 3; // twich /8 ?? >>3, - for (uint8_t i = 0; i <= fpga_queued_bits / 8 + 1;) { - if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) { - AT91C_BASE_SSC->SSC_THR = 0xFF; - i++; - } - } -} static void TransmitFor14443b_AsTag(uint8_t *response, uint16_t len) { - volatile uint32_t b; - // Signal field is off with the appropriate LED LED_D_OFF(); - //uint16_t fpgasendQueueDelay = 0; // Modulate BPSK FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_SIMULATOR | FPGA_HF_SIMULATOR_MODULATE_BPSK); - SpinDelay(40); - - ClearFpgaShiftingRegisters(); - - FpgaSetupSsc(); + AT91C_BASE_SSC->SSC_THR = 0xFF; + FpgaSetupSsc(FPGA_MAJOR_MODE_HF_SIMULATOR); // Transmit the response. for (uint16_t i = 0; i < len;) { // Put byte into tx holding register as soon as it is ready if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_TXRDY) { - AT91C_BASE_SSC->SSC_THR = response[++i]; - } - - // Prevent rx holding register from overflowing - if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) { - b = AT91C_BASE_SSC->SSC_RHR; - (void)b; + AT91C_BASE_SSC->SSC_THR = response[i++]; } } - - //WaitForFpgaDelayQueueIsEmpty(fpgasendQueueDelay); - AT91C_BASE_SSC->SSC_THR = 0xFF; } //----------------------------------------------------------------------------- // Main loop of simulated tag: receive commands from reader, decide what @@ -575,41 +532,26 @@ static void TransmitFor14443b_AsTag(uint8_t *response, uint16_t len) { //----------------------------------------------------------------------------- void SimulateIso14443bTag(uint32_t pupi) { - // setup device. - FpgaDownloadAndGo(FPGA_BITSTREAM_HF); - // connect Demodulated Signal to ADC: - SetAdcMuxFor(GPIO_MUXSEL_HIPKD); - // Set up the synchronous serial port - FpgaSetupSsc(); - - // allocate command receive buffer - BigBuf_free(); - BigBuf_Clear_ext(false); - - clear_trace(); //sim - set_tracing(true); - - uint16_t len, cmdsReceived = 0; - int cardSTATE = SIM_NOFIELD; - int vHf = 0; // in mV - // uint32_t time_0 = 0; - // uint32_t t2r_time = 0; - // uint32_t r2t_time = 0; - uint8_t *receivedCmd = BigBuf_malloc(MAX_FRAME_SIZE); - + LED_A_ON(); // the only commands we understand is WUPB, AFI=0, Select All, N=1: -// static const uint8_t cmdWUPB[] = { ISO14443B_REQB, 0x00, 0x08, 0x39, 0x73 }; // WUPB +// static const uint8_t cmdWUPB[] = { ISO14443B_REQB, 0x00, 0x08, 0x39, 0x73 }; // WUPB // ... and REQB, AFI=0, Normal Request, N=1: -// static const uint8_t cmdREQB[] = { ISO14443B_REQB, 0x00, 0x00, 0x71, 0xFF }; // REQB +// static const uint8_t cmdREQB[] = { ISO14443B_REQB, 0x00, 0x00, 0x71, 0xFF }; // REQB + // ... and HLTB +// static const uint8_t cmdHLTB[] = { 0x50, 0xff, 0xff, 0xff, 0xff }; // HLTB // ... and ATTRIB -// static const uint8_t cmdATTRIB[] = { ISO14443B_ATTRIB, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; // ATTRIB +// static const uint8_t cmdATTRIB[] = { ISO14443B_ATTRIB, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; // ATTRIB // ... if not PUPI/UID is supplied we always respond with ATQB, PUPI = 820de174, Application Data = 0x20381922, // supports only 106kBit/s in both directions, max frame size = 32Bytes, // supports ISO14443-4, FWI=8 (77ms), NAD supported, CID not supported: - uint8_t respATQB[] = { 0x50, 0x82, 0x0d, 0xe1, 0x74, 0x20, 0x38, 0x19, - 0x22, 0x00, 0x21, 0x85, 0x5e, 0xd7 - }; + uint8_t respATQB[] = { + 0x50, + 0x82, 0x0d, 0xe1, 0x74, + 0x20, 0x38, 0x19, + 0x22, 0x00, 0x21, 0x85, + 0x5e, 0xd7 + }; // response to HLTB and ATTRIB static const uint8_t respOK[] = {0x00, 0x78, 0xF0}; @@ -620,30 +562,58 @@ void SimulateIso14443bTag(uint32_t pupi) { AddCrc14B(respATQB, 12); } + // setup device. + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); + + // connect Demodulated Signal to ADC: + SetAdcMuxFor(GPIO_MUXSEL_HIPKD); + + // Set up the synchronous serial port + FpgaSetupSsc(FPGA_MAJOR_MODE_HF_SIMULATOR); + + // allocate command receive buffer + BigBuf_free(); + BigBuf_Clear_ext(false); + clear_trace(); + set_tracing(true); + + uint16_t len, cmdsReceived = 0; + int cardSTATE = SIM_NOFIELD; + int vHf = 0; // in mV + + tosend_t *ts = get_tosend(); + + uint8_t *receivedCmd = BigBuf_malloc(MAX_FRAME_SIZE); + // prepare "ATQB" tag answer (encoded): CodeIso14443bAsTag(respATQB, sizeof(respATQB)); - uint8_t *encodedATQB = BigBuf_malloc(ToSendMax); - uint16_t encodedATQBLen = ToSendMax; - memcpy(encodedATQB, ToSend, ToSendMax); + uint8_t *encodedATQB = BigBuf_malloc(ts->max); + uint16_t encodedATQBLen = ts->max; + memcpy(encodedATQB, ts->buf, ts->max); // prepare "OK" tag answer (encoded): CodeIso14443bAsTag(respOK, sizeof(respOK)); - uint8_t *encodedOK = BigBuf_malloc(ToSendMax); - uint16_t encodedOKLen = ToSendMax; - memcpy(encodedOK, ToSend, ToSendMax); + uint8_t *encodedOK = BigBuf_malloc(ts->max); + uint16_t encodedOKLen = ts->max; + memcpy(encodedOK, ts->buf, ts->max); // Simulation loop - while (!BUTTON_PRESS() && !data_available()) { + while (BUTTON_PRESS() == false) { WDT_HIT(); + //iceman: limit with 2000 times.. + if (data_available()) { + break; + } + // find reader field if (cardSTATE == SIM_NOFIELD) { #if defined RDV4 - vHf = (MAX_ADC_HF_VOLTAGE_RDV40 * AvgAdc(ADC_CHAN_HF_RDV40)) >> 10; + vHf = (MAX_ADC_HF_VOLTAGE_RDV40 * SumAdc(ADC_CHAN_HF_RDV40, 32)) >> 15; #else - vHf = (MAX_ADC_HF_VOLTAGE * AvgAdc(ADC_CHAN_HF)) >> 10; + vHf = (MAX_ADC_HF_VOLTAGE * SumAdc(ADC_CHAN_HF, 32)) >> 15; #endif if (vHf > MF_MINFIELDV) { cardSTATE = SIM_IDLE; @@ -714,15 +684,21 @@ void SimulateIso14443bTag(uint32_t pupi) { // - SLOT MARKER // - ISO7816 // - emulate with a memory dump - Dbprintf("new cmd from reader: len=%d, cmdsRecvd=%d", len, cmdsReceived); + if (DBGLEVEL >= DBG_DEBUG) + Dbprintf("new cmd from reader: len=%d, cmdsRecvd=%d", len, cmdsReceived); // CRC Check if (len >= 3) { // if crc exists - if (!check_crc(CRC_14443_B, receivedCmd, len)) - DbpString("+++CRC fail"); - else - DbpString("CRC passes"); + if (!check_crc(CRC_14443_B, receivedCmd, len)) { + if (DBGLEVEL >= DBG_DEBUG) { + DbpString("CRC fail"); + } + } + } else { + if (DBGLEVEL >= DBG_DEBUG) { + DbpString("CRC passed"); + } } cardSTATE = SIM_IDLE; } @@ -734,8 +710,10 @@ void SimulateIso14443bTag(uint32_t pupi) { ++cmdsReceived; } - if (DBGLEVEL >= 2) + + if (DBGLEVEL >= DBG_DEBUG) Dbprintf("Emulator stopped. Trace length: %d ", BigBuf_get_traceLen()); + switch_off(); //simulate } @@ -760,303 +738,313 @@ void SimulateIso14443bTag(uint32_t pupi) { * false if we are still waiting for some more * */ -static RAMFUNC int Handle14443bTagSamplesDemod(int ci, int cq) { - int v = 0, myI = ABS(ci), myQ = ABS(cq); +static RAMFUNC int Handle14443bSamplesFromTag(int ci, int cq) { + + int v; // The soft decision on the bit uses an estimate of just the // quadrant of the reference angle, not the exact angle. #define MAKE_SOFT_DECISION() { \ - if (Demod.sumI > 0) { \ - v = ci; \ - } else { \ - v = -ci; \ - } \ - if (Demod.sumQ > 0) { \ - v += cq; \ - } else { \ - v -= cq; \ - } \ - } + if(Demod.sumI > 0) { \ + v = ci; \ + } else { \ + v = -ci; \ + } \ + if(Demod.sumQ > 0) { \ + v += cq; \ + } else { \ + v -= cq; \ + } \ + } -// Subcarrier amplitude v = sqrt(ci^2 + cq^2), approximated here by abs(ci) + abs(cq) +#define SUBCARRIER_DETECT_THRESHOLD 8 // Subcarrier amplitude v = sqrt(ci^2 + cq^2), approximated here by max(abs(ci),abs(cq)) + 1/2*min(abs(ci),abs(cq))) -#define CHECK_FOR_SUBCARRIER_old() { \ - if (ci < 0) { \ - if (cq < 0) { /* ci < 0, cq < 0 */ \ - if (cq < ci) { \ - v = -cq - (ci >> 1); \ - } else { \ - v = -ci - (cq >> 1); \ - } \ - } else { /* ci < 0, cq >= 0 */ \ - if (cq < -ci) { \ - v = -ci + (cq >> 1); \ - } else { \ - v = cq - (ci >> 1); \ - } \ - } \ - } else { \ - if (cq < 0) { /* ci >= 0, cq < 0 */ \ - if (-cq < ci) { \ - v = ci - (cq >> 1); \ - } else { \ - v = -cq + (ci >> 1); \ - } \ - } else { /* ci >= 0, cq >= 0 */ \ - if (cq < ci) { \ - v = ci + (cq >> 1); \ - } else { \ - v = cq + (ci >> 1); \ - } \ - } \ - } \ - } +#define AMPLITUDE(ci,cq) (MAX(ABS(ci),ABS(cq)) + (MIN(ABS(ci),ABS(cq))/2)) -//note: couldn't we just use MAX(ABS(ci),ABS(cq)) + (MIN(ABS(ci),ABS(cq))/2) from common.h - marshmellow -#define CHECK_FOR_SUBCARRIER() { v = MAX(myI, myQ) + (MIN(myI, myQ) >> 1); } + switch(Demod.state) { - switch (Demod.state) { - case DEMOD_UNSYNCD: - - CHECK_FOR_SUBCARRIER(); - - // subcarrier detected - - if (v > SUBCARRIER_DETECT_THRESHOLD) { - Demod.state = DEMOD_PHASE_REF_TRAINING; - Demod.sumI = ci; - Demod.sumQ = cq; - Demod.posCount = 1; - } - break; - - case DEMOD_PHASE_REF_TRAINING: - if (Demod.posCount < 8) { - - CHECK_FOR_SUBCARRIER(); - - if (v > SUBCARRIER_DETECT_THRESHOLD) { - // set the reference phase (will code a logic '1') by averaging over 32 1/fs. - // note: synchronization time > 80 1/fs - Demod.sumI += ci; - Demod.sumQ += cq; - Demod.posCount++; - } else { + case DEMOD_UNSYNCD: { + if (AMPLITUDE(ci, cq) > SUBCARRIER_DETECT_THRESHOLD) { // subcarrier detected + Demod.state = DEMOD_PHASE_REF_TRAINING; + Demod.sumI = ci; + Demod.sumQ = cq; + Demod.posCount = 1; + } + break; + } + case DEMOD_PHASE_REF_TRAINING: { + if (Demod.posCount < 8) { + if (AMPLITUDE(ci, cq) > SUBCARRIER_DETECT_THRESHOLD) { + // set the reference phase (will code a logic '1') by averaging over 32 1/fs. + // note: synchronization time > 80 1/fs + Demod.sumI += ci; + Demod.sumQ += cq; + Demod.posCount++; + } else { // subcarrier lost - Demod.state = DEMOD_UNSYNCD; - } - } else { - Demod.state = DEMOD_AWAITING_FALLING_EDGE_OF_SOF; - } - break; + Demod.state = DEMOD_UNSYNCD; + } + } else { + Demod.state = DEMOD_AWAITING_FALLING_EDGE_OF_SOF; + } + break; + } + case DEMOD_AWAITING_FALLING_EDGE_OF_SOF: { - case DEMOD_AWAITING_FALLING_EDGE_OF_SOF: + MAKE_SOFT_DECISION(); - MAKE_SOFT_DECISION(); + if (v < 0) { // logic '0' detected + Demod.state = DEMOD_GOT_FALLING_EDGE_OF_SOF; + Demod.posCount = 0; // start of SOF sequence + } else { + if (Demod.posCount > 200 / 4) { // maximum length of TR1 = 200 1/fs + Demod.state = DEMOD_UNSYNCD; + } + } + Demod.posCount++; + break; + } + case DEMOD_GOT_FALLING_EDGE_OF_SOF: { - if (v < 0) { // logic '0' detected - Demod.state = DEMOD_GOT_FALLING_EDGE_OF_SOF; - Demod.posCount = 0; // start of SOF sequence - } else { - // maximum length of TR1 = 200 1/fs - if (Demod.posCount > 200 / 4) Demod.state = DEMOD_UNSYNCD; - } - Demod.posCount++; - break; + Demod.posCount++; + MAKE_SOFT_DECISION(); - case DEMOD_GOT_FALLING_EDGE_OF_SOF: - Demod.posCount++; + if (v > 0) { + if (Demod.posCount < 9 * 2) { // low phase of SOF too short (< 9 etu). Note: spec is >= 10, but FPGA tends to "smear" edges + Demod.state = DEMOD_UNSYNCD; + } else { + LED_C_ON(); // Got SOF + Demod.posCount = 0; + Demod.bitCount = 0; + Demod.len = 0; + Demod.state = DEMOD_AWAITING_START_BIT; + } + } else { + if (Demod.posCount > 14 * 2) { // low phase of SOF too long (> 12 etu) + Demod.state = DEMOD_UNSYNCD; + LED_C_OFF(); + } + } + break; + } + case DEMOD_AWAITING_START_BIT: { + Demod.posCount++; + MAKE_SOFT_DECISION(); + if (v > 0) { + if (Demod.posCount > 6 * 2) { // max 19us between characters = 16 1/fs, max 3 etu after low phase of SOF = 24 1/fs + LED_C_OFF(); + if (Demod.bitCount == 0 && Demod.len == 0) { // received SOF only, this is valid for iClass/Picopass + return true; + } else { + Demod.state = DEMOD_UNSYNCD; + } + } + } else { // start bit detected + Demod.posCount = 1; // this was the first half + Demod.thisBit = v; + Demod.shiftReg = 0; + Demod.state = DEMOD_RECEIVING_DATA; + } + break; + } + case DEMOD_RECEIVING_DATA: { - MAKE_SOFT_DECISION(); + MAKE_SOFT_DECISION(); - if (v > 0) { - // low phase of SOF too short (< 9 etu). Note: spec is >= 10, but FPGA tends to "smear" edges - if (Demod.posCount < 9 * 2) { - Demod.state = DEMOD_UNSYNCD; - } else { - LED_C_ON(); // Got SOF - Demod.state = DEMOD_AWAITING_START_BIT; - Demod.posCount = 0; - Demod.len = 0; - } - } else { - // low phase of SOF too long (> 12 etu) - if (Demod.posCount > 14 * 2) { - Demod.state = DEMOD_UNSYNCD; - LED_C_OFF(); - } - } - break; + if (Demod.posCount == 0) { // first half of bit + Demod.thisBit = v; + Demod.posCount = 1; + } else { // second half of bit + Demod.thisBit += v; - case DEMOD_AWAITING_START_BIT: - Demod.posCount++; + Demod.shiftReg >>= 1; + if (Demod.thisBit > 0) { // logic '1' + Demod.shiftReg |= 0x200; + } - MAKE_SOFT_DECISION(); + Demod.bitCount++; + if (Demod.bitCount == 10) { - if (v > 0) { - if (Demod.posCount > 6 * 2) { // max 19us between characters = 16 1/fs, max 3 etu after low phase of SOF = 24 1/fs - Demod.state = DEMOD_UNSYNCD; - LED_C_OFF(); - } - } else { // start bit detected - Demod.bitCount = 0; - Demod.posCount = 1; // this was the first half - Demod.thisBit = v; - Demod.shiftReg = 0; - Demod.state = DEMOD_RECEIVING_DATA; - } - break; + uint16_t s = Demod.shiftReg; - case DEMOD_RECEIVING_DATA: - - MAKE_SOFT_DECISION(); - - if (Demod.posCount == 0) { - // first half of bit - Demod.thisBit = v; - Demod.posCount = 1; - } else { - // second half of bit - Demod.thisBit += v; - Demod.shiftReg >>= 1; - - // OR in a logic '1' - if (Demod.thisBit > 0) - Demod.shiftReg |= 0x200; - - Demod.bitCount++; - - // 1 start 8 data 1 stop = 10 - if (Demod.bitCount == 10) { - - uint16_t s = Demod.shiftReg; - - // stop bit == '1', start bit == '0' - if ((s & 0x200) && (s & 0x001) == 0) { - // left shift to drop the startbit - uint8_t b = (s >> 1); - Demod.output[Demod.len] = b; - ++Demod.len; - Demod.state = DEMOD_AWAITING_START_BIT; - } else { - // this one is a bit hard, either its a correc byte or its unsynced. - Demod.state = DEMOD_UNSYNCD; - LED_C_OFF(); - - // This is EOF (start, stop and all data bits == '0' - if (s == 0) return true; - } - } - Demod.posCount = 0; - } - break; - - default: - Demod.state = DEMOD_UNSYNCD; - LED_C_OFF(); - break; - } - return false; + if ((s & 0x200) && !(s & 0x001)) { // stop bit == '1', start bit == '0' + Demod.output[Demod.len] = (s >> 1); + Demod.len++; + Demod.bitCount = 0; + Demod.state = DEMOD_AWAITING_START_BIT; + } else { + Demod.state = DEMOD_UNSYNCD; + LED_C_OFF(); + if (s == 0x000) { + // This is EOF (start, stop and all data bits == '0' + return true; + } + } + } + Demod.posCount = 0; + } + break; + } + default: { + Demod.state = DEMOD_UNSYNCD; + LED_C_OFF(); + break; + } + } + return false; } /* * Demodulate the samples we received from the tag, also log to tracebuffer - * quiet: set to 'TRUE' to disable debug output */ -static void GetTagSamplesFor14443bDemod() { - bool finished = false; -// int lastRxCounter = ISO14443B_DMA_BUFFER_SIZE; - uint32_t time_0 = 0, time_stop = 0; +static int Get14443bAnswerFromTag(uint8_t *response, uint16_t max_len, int timeout, uint32_t *eof_time) { - BigBuf_free(); + int samples = 0, ret = 0; // Set up the demodulator for tag -> reader responses. - Demod14bInit(BigBuf_malloc(MAX_FRAME_SIZE)); + Demod14bInit(response, max_len); - // The DMA buffer, used to stream samples from the FPGA - int8_t *dmaBuf = (int8_t *) BigBuf_malloc(ISO14443B_DMA_BUFFER_SIZE); - int8_t *upTo = dmaBuf; - - // Setup and start DMA. - if (!FpgaSetupSscDma((uint8_t *) dmaBuf, ISO14443B_DMA_BUFFER_SIZE)) { - if (DBGLEVEL > 1) Dbprintf("FpgaSetupSscDma failed. Exiting"); - return; - } + // wait for last transfer to complete + while (!(AT91C_BASE_SSC->SSC_SR & AT91C_SSC_TXEMPTY)) {}; // And put the FPGA in the appropriate mode - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR | FPGA_HF_READER_RX_XCORR_848_KHZ); + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_SUBCARRIER_848_KHZ | FPGA_HF_READER_MODE_RECEIVE_IQ); - // get current clock - time_0 = GetCountSspClk(); + // Setup and start DMA. + FpgaSetupSsc(FPGA_MAJOR_MODE_HF_READER); - // rx counter - dma counter? (how much?) & (mod) mask > 2. (since 2bytes at the time is read) - while (!finished) { + // The DMA buffer, used to stream samples from the FPGA + dmabuf16_t *dma = get_dma16(); + if (FpgaSetupSscDma((uint8_t *) dma->buf, DMA_BUFFER_SIZE) == false) { + if (DBGLEVEL > DBG_ERROR) Dbprintf("FpgaSetupSscDma failed. Exiting"); + return -1; + } - LED_A_INV(); - WDT_HIT(); + uint32_t dma_start_time = 0; + uint16_t *upTo = dma->buf; - // LSB is a fpga signal bit. - int ci = upTo[0]; - int cq = upTo[1]; - upTo += 2; -// lastRxCounter -= 2; + for (;;) { - // restart DMA buffer to receive again. - if (upTo >= dmaBuf + ISO14443B_DMA_BUFFER_SIZE) { - upTo = dmaBuf; -// lastRxCounter = ISO14443B_DMA_BUFFER_SIZE; - AT91C_BASE_PDC_SSC->PDC_RNPR = (uint32_t) upTo; - AT91C_BASE_PDC_SSC->PDC_RNCR = ISO14443B_DMA_BUFFER_SIZE; + volatile uint16_t behindBy = ((uint16_t *)AT91C_BASE_PDC_SSC->PDC_RPR - upTo) & (DMA_BUFFER_SIZE - 1); + if (behindBy == 0) + continue; + + samples++; + + if (samples == 1) { + // DMA has transferred the very first data + dma_start_time = GetCountSspClk() & 0xfffffff0; } - // https://github.com/Proxmark/proxmark3/issues/103 - bool gotFrame = Handle14443bTagSamplesDemod(ci, cq); - time_stop = GetCountSspClk() - time_0; + volatile int8_t ci = *upTo >> 8; + volatile int8_t cq = *upTo; + upTo++; + + // we have read all of the DMA buffer content. + if (upTo >= dma->buf + DMA_BUFFER_SIZE) { - finished = (time_stop > iso14b_timeout || gotFrame); + // start reading the circular buffer from the beginning again + upTo = dma->buf; + + // DMA Counter Register had reached 0, already rotated. + if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_ENDRX)) { + + // primary buffer was stopped + if (AT91C_BASE_PDC_SSC->PDC_RCR == false) { + AT91C_BASE_PDC_SSC->PDC_RPR = (uint32_t) dma->buf; + AT91C_BASE_PDC_SSC->PDC_RCR = DMA_BUFFER_SIZE; + } + // secondary buffer sets as primary, secondary buffer was stopped + if (AT91C_BASE_PDC_SSC->PDC_RNCR == false) { + AT91C_BASE_PDC_SSC->PDC_RNPR = (uint32_t) dma->buf; + AT91C_BASE_PDC_SSC->PDC_RNCR = DMA_BUFFER_SIZE; + } + + WDT_HIT(); + if (BUTTON_PRESS()) { + DbpString("stopped"); + break; + } + } + } + + if (Handle14443bSamplesFromTag(ci, cq)) { + + *eof_time = dma_start_time + (samples * 16) - DELAY_TAG_TO_ARM; // end of EOF + + if (Demod.len > Demod.max_len) { + ret = -2; // overflow + } + break; + } + + if (samples > timeout && Demod.state < DEMOD_PHASE_REF_TRAINING) { + ret = -1; + break; + } } FpgaDisableSscDma(); - if (upTo) - upTo = NULL; + if (ret < 0) { + return ret; + } - if (Demod.len > 0) - LogTrace(Demod.output, Demod.len, time_0, time_stop, NULL, false); + if (Demod.len > 0) { + uint32_t sof_time = *eof_time + - (Demod.len * 8 * 8 * 16) // time for byte transfers + - (32 * 16) // time for SOF transfer + - 0; // time for EOF transfer + LogTrace(Demod.output, Demod.len, (sof_time * 4), (*eof_time * 4), NULL, false); + } + + return Demod.len; } //----------------------------------------------------------------------------- // Transmit the command (to the tag) that was placed in ToSend[]. //----------------------------------------------------------------------------- -static void TransmitFor14443b_AsReader(void) { - int c; +static void TransmitFor14443b_AsReader(uint32_t *start_time) { + + tosend_t *ts = get_tosend(); + + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_MODE_SEND_SHALLOW_MOD); - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_TX | FPGA_HF_READER_TX_SHALLOW_MOD); - SpinDelay(60); - - // What does this loop do? Is it TR1? - // 0xFF = 8 bits of 1. 1 bit == 1Etu,.. - // loop 10 * 8 = 80 ETU of delay, with a non modulated signal. why? - // 80*9 = 720us. - - for (c = 0; c < 50;) { - - if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) { - AT91C_BASE_SSC->SSC_THR = 0xFF; - c++; - } + if (*start_time < DELAY_ARM_TO_TAG) { + *start_time = DELAY_ARM_TO_TAG; } - // Send frame loop - for (c = 0; c < ToSendMax;) { - - // Put byte into tx holding register as soon as it is ready - if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) { - AT91C_BASE_SSC->SSC_THR = ToSend[c++]; - } + *start_time = (*start_time - DELAY_ARM_TO_TAG) & 0xfffffff0; + + if (GetCountSspClk() > *start_time) { // we may miss the intended time + *start_time = (GetCountSspClk() + 16) & 0xfffffff0; // next possible time } - WDT_HIT(); + + // wait + while (GetCountSspClk() < *start_time) ; + + LED_B_ON(); + for (int c = 0; c < ts->max; c++) { + volatile uint8_t data = ts->buf[c]; + + for (int i = 0; i < 8; i++) { + uint16_t send_word = (data & 0x80) ? 0x0000 : 0xffff; + + while (!(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY))) ; + + AT91C_BASE_SSC->SSC_THR = send_word; + + while (!(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY))) ; + AT91C_BASE_SSC->SSC_THR = send_word; + + data <<= 1; + } + WDT_HIT(); + } + LED_B_OFF(); + + *start_time += DELAY_ARM_TO_TAG; } //----------------------------------------------------------------------------- @@ -1079,87 +1067,81 @@ static void CodeIso14443bAsReader(const uint8_t *cmd, int len) { * 1 "stuffbit" = 1ETU (9us) */ - ToSendReset(); + tosend_reset(); // Send SOF // 10-11 ETUs of ZERO - for (int i = 0; i < 10; ++i) ToSendStuffBit(0); + for (int i = 0; i < 10; i++) + tosend_stuffbit(0); + // 2-3 ETUs of ONE - ToSendStuffBit(1); - ToSendStuffBit(1); -// ToSendStuffBit(1); + tosend_stuffbit(1); + tosend_stuffbit(1); // Sending cmd, LSB // from here we add BITS - for (int i = 0; i < len; ++i) { + for (int i = 0; i < len; i++) { // Start bit - ToSendStuffBit(0); + tosend_stuffbit(0); // Data bits uint8_t b = cmd[i]; - // if ( b & 1 ) ToSendStuffBit(1); else ToSendStuffBit(0); - // if ( (b>>1) & 1) ToSendStuffBit(1); else ToSendStuffBit(0); - // if ( (b>>2) & 1) ToSendStuffBit(1); else ToSendStuffBit(0); - // if ( (b>>3) & 1) ToSendStuffBit(1); else ToSendStuffBit(0); - // if ( (b>>4) & 1) ToSendStuffBit(1); else ToSendStuffBit(0); - // if ( (b>>5) & 1) ToSendStuffBit(1); else ToSendStuffBit(0); - // if ( (b>>6) & 1) ToSendStuffBit(1); else ToSendStuffBit(0); - // if ( (b>>7) & 1) ToSendStuffBit(1); else ToSendStuffBit(0); - ToSendStuffBit(b & 1); - ToSendStuffBit((b >> 1) & 1); - ToSendStuffBit((b >> 2) & 1); - ToSendStuffBit((b >> 3) & 1); - ToSendStuffBit((b >> 4) & 1); - ToSendStuffBit((b >> 5) & 1); - ToSendStuffBit((b >> 6) & 1); - ToSendStuffBit((b >> 7) & 1); + tosend_stuffbit(b & 1); + tosend_stuffbit((b >> 1) & 1); + tosend_stuffbit((b >> 2) & 1); + tosend_stuffbit((b >> 3) & 1); + tosend_stuffbit((b >> 4) & 1); + tosend_stuffbit((b >> 5) & 1); + tosend_stuffbit((b >> 6) & 1); + tosend_stuffbit((b >> 7) & 1); // Stop bit - ToSendStuffBit(1); + tosend_stuffbit(1); // EGT extra guard time // For PCD it ranges 0-57us (1etu = 9us) - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(1); +// tosend_stuffbit(1); +// tosend_stuffbit(1); +// tosend_stuffbit(1); } // Send EOF // 10-11 ETUs of ZERO - for (int i = 0; i < 10; ++i) ToSendStuffBit(0); + for (int i = 0; i < 10; i++) + tosend_stuffbit(0); // Transition time. TR0 - guard time // 8ETUS minum? // Per specification, Subcarrier must be stopped no later than 2 ETUs after EOF. // I'm guessing this is for the FPGA to be able to send all bits before we switch to listening mode - for (int i = 0; i < 24 ; ++i) ToSendStuffBit(1); + + // ensure that last byte is filled up + for (int i = 0; i < 8 ; ++i) + tosend_stuffbit(1); // TR1 - Synchronization time // Convert from last character reference to length - ToSendMax++; + tosend_t *ts = get_tosend(); + ts->max++; } /* * Convenience function to encode, transmit and trace iso 14443b comms */ -static void CodeAndTransmit14443bAsReader(const uint8_t *cmd, int len) { - - uint32_t time_start = GetCountSspClk(); - +static void CodeAndTransmit14443bAsReader(const uint8_t *cmd, int len, uint32_t *start_time, uint32_t *eof_time) { + tosend_t *ts = get_tosend(); CodeIso14443bAsReader(cmd, len); - - TransmitFor14443b_AsReader(); - - if (trigger) LED_A_ON(); - - LogTrace(cmd, len, time_start, GetCountSspClk() - time_start, NULL, true); + TransmitFor14443b_AsReader(start_time); + *eof_time = *start_time + (32 * (8 * ts->max)); + LogTrace(cmd, len, *start_time, *eof_time, NULL, true); } /* Sends an APDU to the tag * TODO: check CRC and preamble */ -uint8_t iso14443b_apdu(uint8_t const *message, size_t message_length, uint8_t *response) { +uint8_t iso14443b_apdu(uint8_t const *message, size_t message_length, uint8_t *response, uint16_t respmaxlen) { + LED_A_ON(); uint8_t message_frame[message_length + 4]; // PCB message_frame[0] = 0x0A | pcb_blocknum; @@ -1170,84 +1152,113 @@ uint8_t iso14443b_apdu(uint8_t const *message, size_t message_length, uint8_t *r memcpy(message_frame + 2, message, message_length); // EDC (CRC) AddCrc14B(message_frame, message_length + 2); + // send - CodeAndTransmit14443bAsReader(message_frame, message_length + 4); //no + uint32_t start_time = 0; + uint32_t eof_time = 0; + CodeAndTransmit14443bAsReader(message_frame, sizeof(message_frame), &start_time, &eof_time); + // get response - GetTagSamplesFor14443bDemod(); //no - - FpgaDisableTracing(); - - if (Demod.len < 3) - return 0; - - // VALIDATE CRC - if (!check_crc(CRC_14443_B, Demod.output, Demod.len)) { - if (DBGLEVEL > 3) Dbprintf("crc fail ICE"); + if (response == NULL) { + LED_A_OFF(); return 0; } - // copy response contents - if (response != NULL) - memcpy(response, Demod.output, Demod.len); - return Demod.len; + eof_time += DELAY_ISO14443B_VCD_TO_VICC_READER; + int retlen = Get14443bAnswerFromTag(response, respmaxlen, ISO14443B_READER_TIMEOUT, &eof_time); + FpgaDisableTracing(); + + if (retlen < 3) { + LED_A_OFF(); + return 0; + } + + // VALIDATE CRC + if (!check_crc(CRC_14443_B, response, retlen)) { + if (DBGLEVEL > DBG_DEBUG) DbpString("CRC fail"); + return 0; + } + + return retlen; } /** * SRx Initialise. */ -uint8_t iso14443b_select_srx_card(iso14b_card_select_t *card) { +static uint8_t iso14443b_select_srx_card(iso14b_card_select_t *card) { // INITIATE command: wake up the tag using the INITIATE static const uint8_t init_srx[] = { ISO14443B_INITIATE, 0x00, 0x97, 0x5b }; - // SELECT command (with space for CRC) - uint8_t select_srx[] = { ISO14443B_SELECT, 0x00, 0x00, 0x00}; + uint8_t r_init[3] = {0x0}; + uint8_t r_select[3] = {0x0}; + uint8_t r_papid[10] = {0x0}; + + uint32_t start_time = 0; + uint32_t eof_time = 0; + CodeAndTransmit14443bAsReader(init_srx, sizeof(init_srx), &start_time, &eof_time); - CodeAndTransmit14443bAsReader(init_srx, sizeof(init_srx)); - GetTagSamplesFor14443bDemod(); //no + eof_time += DELAY_ISO14443B_VCD_TO_VICC_READER; + int retlen = Get14443bAnswerFromTag(r_init, sizeof(r_init), ISO14443B_READER_TIMEOUT, &eof_time); FpgaDisableTracing(); - if (Demod.len == 0) + if (retlen <= 0) return 2; // Randomly generated Chip ID - if (card) card->chipid = Demod.output[0]; - - select_srx[1] = Demod.output[0]; + if (card) { + card->chipid = Demod.output[0]; + } + // SELECT command (with space for CRC) + uint8_t select_srx[] = { ISO14443B_SELECT, 0x00, 0x00, 0x00}; + select_srx[1] = r_init[0]; + AddCrc14B(select_srx, 2); - CodeAndTransmit14443bAsReader(select_srx, sizeof(select_srx)); - GetTagSamplesFor14443bDemod(); //no + start_time = eof_time + DELAY_ISO14443B_VICC_TO_VCD_READER; + CodeAndTransmit14443bAsReader(select_srx, sizeof(select_srx), &start_time, &eof_time); + + eof_time += DELAY_ISO14443B_VCD_TO_VICC_READER; + retlen = Get14443bAnswerFromTag(r_select, sizeof(r_select), ISO14443B_READER_TIMEOUT, &eof_time); FpgaDisableTracing(); - if (Demod.len != 3) + if (retlen != 3) { return 2; + } // Check the CRC of the answer: - if (!check_crc(CRC_14443_B, Demod.output, Demod.len)) + if (!check_crc(CRC_14443_B, r_select, retlen)) { return 3; + } // Check response from the tag: should be the same UID as the command we just sent: - if (select_srx[1] != Demod.output[0]) + if (select_srx[1] != r_select[0]) { return 1; + } // First get the tag's UID: select_srx[0] = ISO14443B_GET_UID; AddCrc14B(select_srx, 1); - CodeAndTransmit14443bAsReader(select_srx, 3); // Only first three bytes for this one - GetTagSamplesFor14443bDemod(); //no + + start_time = eof_time + DELAY_ISO14443B_VICC_TO_VCD_READER; + CodeAndTransmit14443bAsReader(select_srx, 3, &start_time, &eof_time); // Only first three bytes for this one + + eof_time += DELAY_ISO14443B_VCD_TO_VICC_READER; + retlen = Get14443bAnswerFromTag(r_papid, sizeof(r_papid), ISO14443B_READER_TIMEOUT, &eof_time); FpgaDisableTracing(); - if (Demod.len != 10) + if (retlen != 10) { return 2; + } // The check the CRC of the answer - if (!check_crc(CRC_14443_B, Demod.output, Demod.len)) + if (!check_crc(CRC_14443_B, r_papid, retlen)) { return 3; - + } + if (card) { card->uidlen = 8; - memcpy(card->uid, Demod.output, 8); + memcpy(card->uid, r_papid, 8); } return 0; @@ -1258,55 +1269,68 @@ uint8_t iso14443b_select_srx_card(iso14b_card_select_t *card) { * TODO: Support multiple cards (perform anticollision) * TODO: Verify CRC checksums */ -uint8_t iso14443b_select_card(iso14b_card_select_t *card) { +int iso14443b_select_card(iso14b_card_select_t *card) { // WUPB command (including CRC) // Note: WUPB wakes up all tags, REQB doesn't wake up tags in HALT state static const uint8_t wupb[] = { ISO14443B_REQB, 0x00, 0x08, 0x39, 0x73 }; // ATTRIB command (with space for CRC) uint8_t attrib[] = { ISO14443B_ATTRIB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00}; + uint8_t r_pupid[14] = {0x0}; + uint8_t r_attrib[3] = {0x0}; + // first, wake up the tag - CodeAndTransmit14443bAsReader(wupb, sizeof(wupb)); - GetTagSamplesFor14443bDemod(); //select_card + uint32_t start_time = 0; + uint32_t eof_time = 0; + CodeAndTransmit14443bAsReader(wupb, sizeof(wupb), &start_time, &eof_time); + + eof_time += DELAY_ISO14443B_VCD_TO_VICC_READER;; + int retlen = Get14443bAnswerFromTag(r_pupid, sizeof(r_pupid), ISO14443B_READER_TIMEOUT, &eof_time); FpgaDisableTracing(); // ATQB too short? - if (Demod.len < 14) - return 2; + if (retlen < 14) { + return -1; + } // VALIDATE CRC - if (!check_crc(CRC_14443_B, Demod.output, Demod.len)) - return 3; + if (!check_crc(CRC_14443_B, r_pupid, retlen)) { + return -2; + } if (card) { card->uidlen = 4; - memcpy(card->uid, Demod.output + 1, 4); - memcpy(card->atqb, Demod.output + 5, 7); + memcpy(card->uid, r_pupid + 1, 4); + memcpy(card->atqb, r_pupid + 5, 7); } // copy the PUPI to ATTRIB ( PUPI == UID ) - memcpy(attrib + 1, Demod.output + 1, 4); + memcpy(attrib + 1, r_pupid + 1, 4); // copy the protocol info from ATQB (Protocol Info -> Protocol_Type) into ATTRIB (Param 3) - attrib[7] = Demod.output[10] & 0x0F; + attrib[7] = r_pupid[10] & 0x0F; AddCrc14B(attrib, 9); - - CodeAndTransmit14443bAsReader(attrib, sizeof(attrib)); - GetTagSamplesFor14443bDemod();//select_card + start_time = eof_time + DELAY_ISO14443B_VICC_TO_VCD_READER; + CodeAndTransmit14443bAsReader(attrib, sizeof(attrib), &start_time, &eof_time); + + eof_time += DELAY_ISO14443B_VCD_TO_VICC_READER; + retlen = Get14443bAnswerFromTag(r_attrib, sizeof(r_attrib), ISO14443B_READER_TIMEOUT, &eof_time); FpgaDisableTracing(); // Answer to ATTRIB too short? - if (Demod.len < 3) - return 2; + if (retlen < 3) { + return -1; + } // VALIDATE CRC - if (!check_crc(CRC_14443_B, Demod.output, Demod.len)) - return 3; + if (!check_crc(CRC_14443_B, r_attrib, retlen)) { + return -2; + } if (card) { // CID - card->cid = Demod.output[0]; + card->cid = r_attrib[0]; // MAX FRAME uint16_t maxFrame = card->atqb[5] >> 4; @@ -1332,22 +1356,26 @@ uint8_t iso14443b_select_card(iso14b_card_select_t *card) { // Set up ISO 14443 Type B communication (similar to iso14443a_setup) // field is setup for "Sending as Reader" -void iso14443b_setup() { +void iso14443b_setup(void) { LEDsoff(); FpgaDownloadAndGo(FPGA_BITSTREAM_HF); + // allocate command receive buffer + BigBuf_free(); + BigBuf_Clear_ext(false); + // Initialize Demod and Uart structs - Demod14bInit(BigBuf_malloc(MAX_FRAME_SIZE)); + Demod14bInit(BigBuf_malloc(MAX_FRAME_SIZE), MAX_FRAME_SIZE); Uart14bInit(BigBuf_malloc(MAX_FRAME_SIZE)); // connect Demodulated Signal to ADC: SetAdcMuxFor(GPIO_MUXSEL_HIPKD); // Set up the synchronous serial port - FpgaSetupSsc(); + FpgaSetupSsc(FPGA_MAJOR_MODE_HF_READER); // Signal field is on with the appropriate LED - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_TX | FPGA_HF_READER_TX_SHALLOW_MOD); + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_MODE_SEND_SHALLOW_MOD); SpinDelay(100); // Start the timer @@ -1365,108 +1393,79 @@ void iso14443b_setup() { // // I tried to be systematic and check every answer of the tag, every CRC, etc... //----------------------------------------------------------------------------- -static bool ReadSTBlock(uint8_t block) { - uint8_t cmd[] = {ISO14443B_READ_BLK, block, 0x00, 0x00}; +static bool ReadSTBlock(uint8_t blocknr, uint8_t *block) { + uint8_t cmd[] = {ISO14443B_READ_BLK, blocknr, 0x00, 0x00}; AddCrc14B(cmd, 2); - CodeAndTransmit14443bAsReader(cmd, sizeof(cmd)); - GetTagSamplesFor14443bDemod(); + + uint8_t r_block[6] = {0}; + + uint32_t start_time = 0; + uint32_t eof_time = 0; + CodeAndTransmit14443bAsReader(cmd, sizeof(cmd), &start_time, &eof_time); + + eof_time += DELAY_ISO14443B_VCD_TO_VICC_READER; + int retlen = Get14443bAnswerFromTag(r_block, sizeof(r_block), ISO14443B_READER_TIMEOUT, &eof_time); FpgaDisableTracing(); // Check if we got an answer from the tag - if (Demod.len != 6) { + if (retlen != 6) { DbpString("[!] expected 6 bytes from tag, got less..."); return false; } // The check the CRC of the answer - if (!check_crc(CRC_14443_B, Demod.output, Demod.len)) { - DbpString("[!] CRC Error block!"); + if (!check_crc(CRC_14443_B, r_block, retlen)) { + DbpString("CRC fail"); return false; } + + if (block) { + memcpy(block, r_block, 4); + } + + Dbprintf("Address=%02x, Contents=%08x, CRC=%04x", + blocknr, + (r_block[3] << 24) + (r_block[2] << 16) + (r_block[1] << 8) + r_block[0], + (r_block[4] << 8) + r_block[5]); + return true; } -void ReadSTMemoryIso14443b(uint8_t numofblocks) { - // Make sure that we start from off, since the tags are stateful; - // confusing things will happen if we don't reset them between reads. - //switch_off(); - uint8_t i = 0x00; - uint8_t *buf = BigBuf_malloc(sizeof(iso14b_card_select_t)); +void ReadSTMemoryIso14443b(uint16_t numofblocks) { iso14443b_setup(); - iso14b_card_select_t *card = (iso14b_card_select_t *)buf; - uint8_t res = iso14443b_select_srx_card(card); + uint8_t *mem = BigBuf_malloc((numofblocks + 1) * 4 ); + iso14b_card_select_t card; + uint8_t res = iso14443b_select_srx_card(&card); + + int isOK = PM3_SUCCESS; // 0: OK 2: attrib fail, 3:crc fail, - if (res > 0) goto out; - - Dbprintf("[+] Tag memory dump, block 0 to %d", numofblocks); + if (res > 0) { + isOK = PM3_ETIMEOUT; + goto out; + } ++numofblocks; - for (;;) { - if (i == numofblocks) { - DbpString("System area block (0xFF):"); - i = 0xff; + for (uint8_t i = 0; i < numofblocks; i++) { + + if (ReadSTBlock(i, mem + ( i * 4)) == false) { + isOK = PM3_ETIMEOUT; + break; } - - uint8_t retries = 3; - do { - res = ReadSTBlock(i); - } while (!res && --retries); - - if (!res && !retries) { - goto out; - } - - // Now print out the memory location: - Dbprintf("Address=%02x, Contents=%08x, CRC=%04x", i, - (Demod.output[3] << 24) + (Demod.output[2] << 16) + (Demod.output[1] << 8) + Demod.output[0], - (Demod.output[4] << 8) + Demod.output[5]); - - if (i == 0xff) break; - ++i; } + + // System area block (0xFF) + if (ReadSTBlock(0xFF, mem + (numofblocks * 4)) == false) + isOK = PM3_ETIMEOUT; out: - switch_off(); // disconnect raw - SpinDelay(20); -} -static void iso1444b_setup_sniff(void) { + reply_ng(CMD_HF_SRI_READ, isOK, mem, numofblocks * 4); - LEDsoff(); - FpgaDownloadAndGo(FPGA_BITSTREAM_HF); BigBuf_free(); - BigBuf_Clear_ext(false); - clear_trace(); - set_tracing(true); - - // Initialize Demod and Uart structs - Demod14bInit(BigBuf_malloc(MAX_FRAME_SIZE)); - Uart14bInit(BigBuf_malloc(MAX_FRAME_SIZE)); - - if (DBGLEVEL > 1) { - // Print debug information about the buffer sizes - Dbprintf("[+] Sniff buffers initialized:"); - Dbprintf("[+] trace: %i bytes", BigBuf_max_traceLen()); - Dbprintf("[+] reader -> tag: %i bytes", MAX_FRAME_SIZE); - Dbprintf("[+] tag -> reader: %i bytes", MAX_FRAME_SIZE); - Dbprintf("[+] DMA: %i bytes", ISO14443B_DMA_BUFFER_SIZE); - } - - // connect Demodulated Signal to ADC: - SetAdcMuxFor(GPIO_MUXSEL_HIPKD); - - // Setup for the DMA. - FpgaSetupSsc(); - - // Set FPGA in the appropriate mode - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR | FPGA_HF_READER_RX_XCORR_848_KHZ | FPGA_HF_READER_RX_XCORR_SNOOP); - SpinDelay(20); - - // Start the SSP timer - StartCountSspClk(); + switch_off(); } //============================================================================= @@ -1486,99 +1485,185 @@ static void iso1444b_setup_sniff(void) { * DMA Buffer - ISO14443B_DMA_BUFFER_SIZE * Demodulated samples received - all the rest */ -void RAMFUNC SniffIso14443b(void) { +void SniffIso14443b(void) { - uint32_t time_0 = 0, time_start = 0, time_stop; + LEDsoff(); + LED_A_ON(); + + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); + + DbpString("Starting to sniff. Press PM3 Button to stop."); + + BigBuf_free(); + clear_trace(); + set_tracing(true); + + // Initialize Demod and Uart structs + uint8_t dm_buf[MAX_FRAME_SIZE] = {0}; + Demod14bInit(dm_buf, sizeof(dm_buf)); + + uint8_t ua_buf[MAX_FRAME_SIZE] = {0}; + Uart14bInit(ua_buf); + + //Demod14bInit(BigBuf_malloc(MAX_FRAME_SIZE), MAX_FRAME_SIZE); + //Uart14bInit(BigBuf_malloc(MAX_FRAME_SIZE)); + + // Set FPGA in the appropriate mode + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_SUBCARRIER_848_KHZ | FPGA_HF_READER_MODE_SNIFF_IQ); +// FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_SUBCARRIER_848_KHZ | FPGA_HF_READER_MODE_SNIFF_AMPLITUDE); + + // connect Demodulated Signal to ADC: + SetAdcMuxFor(GPIO_MUXSEL_HIPKD); + FpgaSetupSsc(FPGA_MAJOR_MODE_HF_READER); + + StartCountSspClk(); + + // The DMA buffer, used to stream samples from the FPGA + dmabuf16_t *dma = get_dma16(); + + // Setup and start DMA. + if (!FpgaSetupSscDma((uint8_t *) dma->buf, DMA_BUFFER_SIZE)) { + if (DBGLEVEL > DBG_ERROR) DbpString("FpgaSetupSscDma failed. Exiting"); + switch_off(); + return; + } // We won't start recording the frames that we acquire until we trigger; // a good trigger condition to get started is probably when we see a // response from the tag. - bool TagIsActive = false; - bool ReaderIsActive = false; + bool tag_is_active = false; + bool reader_is_active = false; + bool expect_tag_answer = false; + int dma_start_time = 0; + + // Count of samples received so far, so that we can include timing + int samples = 0; - iso1444b_setup_sniff(); + uint16_t *upTo = dma->buf; - // The DMA buffer, used to stream samples from the FPGA - int8_t *dmaBuf = (int8_t *) BigBuf_malloc(ISO14443B_DMA_BUFFER_SIZE); - int8_t *data = dmaBuf; + for (;;) { - // Setup and start DMA. - if (!FpgaSetupSscDma((uint8_t *) dmaBuf, ISO14443B_DMA_BUFFER_SIZE)) { - if (DBGLEVEL > 1) Dbprintf("[!] FpgaSetupSscDma failed. Exiting"); - BigBuf_free(); - return; - } + volatile int behind_by = ((uint16_t *)AT91C_BASE_PDC_SSC->PDC_RPR - upTo) & (DMA_BUFFER_SIZE - 1); + if (behind_by < 1) continue; - // time ZERO, the point from which it all is calculated. - time_0 = GetCountSspClk(); + samples++; + if (samples == 1) { + // DMA has transferred the very first data + dma_start_time = GetCountSspClk() & 0xfffffff0; + } - // loop and listen - while (!BUTTON_PRESS()) { - WDT_HIT(); + volatile int8_t ci = *upTo >> 8; + volatile int8_t cq = *upTo; + upTo++; - int ci = data[0]; - int cq = data[1]; - data += 2; + // we have read all of the DMA buffer content. + if (upTo >= dma->buf + DMA_BUFFER_SIZE) { - if (data >= dmaBuf + ISO14443B_DMA_BUFFER_SIZE) { - data = dmaBuf; - AT91C_BASE_PDC_SSC->PDC_RNPR = (uint32_t) dmaBuf; - AT91C_BASE_PDC_SSC->PDC_RNCR = ISO14443B_DMA_BUFFER_SIZE; + // start reading the circular buffer from the beginning again + upTo = dma->buf; + + // DMA Counter Register had reached 0, already rotated. + if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_ENDRX)) { + + // primary buffer was stopped + if (AT91C_BASE_PDC_SSC->PDC_RCR == false) { + AT91C_BASE_PDC_SSC->PDC_RPR = (uint32_t) dma->buf; + AT91C_BASE_PDC_SSC->PDC_RCR = DMA_BUFFER_SIZE; + } + // secondary buffer sets as primary, secondary buffer was stopped + if (AT91C_BASE_PDC_SSC->PDC_RNCR == false) { + AT91C_BASE_PDC_SSC->PDC_RNPR = (uint32_t) dma->buf; + AT91C_BASE_PDC_SSC->PDC_RNCR = DMA_BUFFER_SIZE; + } + + WDT_HIT(); + if (BUTTON_PRESS()) { + DbpString("Sniff stopped"); + break; + } + } } // no need to try decoding reader data if the tag is sending - if (!TagIsActive) { + if (tag_is_active == false) { - LED_A_INV(); - - if (Handle14443bReaderUartBit(ci & 0x01)) { - time_stop = GetCountSspClk() - time_0; - LogTrace(Uart.output, Uart.byteCnt, time_start, time_stop, NULL, true); + if (Handle14443bSampleFromReader(ci & 0x01)) { + uint32_t eof_time = dma_start_time + (samples * 16) + 8; // - DELAY_READER_TO_ARM_SNIFF; // end of EOF + if (Uart.byteCnt > 0) { + uint32_t sof_time = eof_time + - Uart.byteCnt * 1 // time for byte transfers + - 32 * 16 // time for SOF transfer + - 16 * 16; // time for EOF transfer + LogTrace(Uart.output, Uart.byteCnt, (sof_time * 4), (eof_time * 4), NULL, true); + } + // And ready to receive another command. Uart14bReset(); Demod14bReset(); - } else { - time_start = GetCountSspClk() - time_0; + reader_is_active = false; + expect_tag_answer = true; } - if (Handle14443bReaderUartBit(cq & 0x01)) { - time_stop = GetCountSspClk() - time_0; - LogTrace(Uart.output, Uart.byteCnt, time_start, time_stop, NULL, true); + if (Handle14443bSampleFromReader(cq & 0x01)) { + + uint32_t eof_time = dma_start_time + (samples * 16) + 16; // - DELAY_READER_TO_ARM_SNIFF; // end of EOF + if (Uart.byteCnt > 0) { + uint32_t sof_time = eof_time + - Uart.byteCnt * 1 // time for byte transfers + - 32 * 16 // time for SOF transfer + - 16 * 16; // time for EOF transfer + LogTrace(Uart.output, Uart.byteCnt, (sof_time * 4), (eof_time * 4), NULL, true); + } + // And ready to receive another command Uart14bReset(); Demod14bReset(); - } else { - time_start = GetCountSspClk() - time_0; + reader_is_active = false; + expect_tag_answer = true; } - ReaderIsActive = (Uart.state > STATE_14B_GOT_FALLING_EDGE_OF_SOF); + + reader_is_active = (Uart.state > STATE_14B_GOT_FALLING_EDGE_OF_SOF); } // no need to try decoding tag data if the reader is sending - and we cannot afford the time - if (!ReaderIsActive) { + if (reader_is_active == false && expect_tag_answer) { - // is this | 0x01 the error? & 0xfe in https://github.com/Proxmark/proxmark3/issues/103 - // LSB is a fpga signal bit. - if (Handle14443bTagSamplesDemod(ci, cq)) { - time_stop = GetCountSspClk() - time_0; - LogTrace(Demod.output, Demod.len, time_start, time_stop, NULL, false); + if (Handle14443bSamplesFromTag((ci >> 1), (cq >> 1))) { + + uint32_t eof_time = dma_start_time + (samples * 16); // - DELAY_TAG_TO_ARM_SNIFF; // end of EOF + uint32_t sof_time = eof_time + - Demod.len * 8 * 8 * 16 // time for byte transfers + - (32 * 16) // time for SOF transfer + - 0; // time for EOF transfer + + LogTrace(Demod.output, Demod.len, (sof_time * 4), (eof_time * 4), NULL, false); + // And ready to receive another response. Uart14bReset(); Demod14bReset(); + expect_tag_answer = false; + tag_is_active = false; } else { - time_start = GetCountSspClk() - time_0; + tag_is_active = (Demod.state > DEMOD_GOT_FALLING_EDGE_OF_SOF); } - TagIsActive = (Demod.state > DEMOD_GOT_FALLING_EDGE_OF_SOF); } } - if (DBGLEVEL >= 2) { - DbpString("[+] Sniff statistics:"); - Dbprintf("[+] uart State: %x ByteCount: %i ByteCountMax: %i", Uart.state, Uart.byteCnt, Uart.byteCntMax); - Dbprintf("[+] trace length: %i", BigBuf_get_traceLen()); - } - + FpgaDisableTracing(); switch_off(); + + DbpString(""); + DbpString(_CYAN_("Sniff statistics")); + DbpString("================================="); + Dbprintf(" DecodeTag State........%d", Demod.state); + Dbprintf(" DecodeTag byteCnt......%d", Demod.len); + Dbprintf(" DecodeTag posCount.....%d", Demod.posCount); + Dbprintf(" DecodeReader State.....%d", Uart.state); + Dbprintf(" DecodeReader byteCnt...%d", Uart.byteCnt); + Dbprintf(" DecodeReader posCount..%d", Uart.posCnt); + Dbprintf(" Trace length..........." _YELLOW_("%d"), BigBuf_get_traceLen()); + DbpString(""); } -void iso14b_set_trigger(bool enable) { - trigger = enable; +static void iso14b_set_trigger(bool enable) { + g_trigger = enable; } /* @@ -1593,15 +1678,13 @@ void iso14b_set_trigger(bool enable) { * */ void SendRawCommand14443B_Ex(PacketCommandNG *c) { + iso14b_command_t param = c->oldarg[0]; size_t len = c->oldarg[1] & 0xffff; uint32_t timeout = c->oldarg[2]; uint8_t *cmd = c->data.asBytes; - uint8_t status; - uint32_t sendlen = sizeof(iso14b_card_select_t); - uint8_t buf[PM3_CMD_DATA_SIZE] = {0x00}; - if (DBGLEVEL > 3) Dbprintf("14b raw: param, %04x", param); + if (DBGLEVEL > DBG_DEBUG) Dbprintf("14b raw: param, %04x", param); // turn on trigger (LED_A) if ((param & ISO14B_REQUEST_TRIGGER) == ISO14B_REQUEST_TRIGGER) @@ -1617,25 +1700,28 @@ void SendRawCommand14443B_Ex(PacketCommandNG *c) { set_tracing(true); + int status; + uint32_t sendlen = sizeof(iso14b_card_select_t); + iso14b_card_select_t card; + if ((param & ISO14B_SELECT_STD) == ISO14B_SELECT_STD) { - iso14b_card_select_t *card = (iso14b_card_select_t *)buf; - status = iso14443b_select_card(card); - reply_mix(CMD_ACK, status, sendlen, 0, buf, sendlen); - // 0: OK 2: attrib fail, 3:crc fail, - if (status > 0) goto out; + status = iso14443b_select_card(&card); + reply_mix(CMD_HF_ISO14443B_COMMAND, status, sendlen, 0, (uint8_t*)&card, sendlen); + // 0: OK -1: attrib fail, -2:crc fail, + if (status != 0) goto out; } if ((param & ISO14B_SELECT_SR) == ISO14B_SELECT_SR) { - iso14b_card_select_t *card = (iso14b_card_select_t *)buf; - status = iso14443b_select_srx_card(card); - reply_mix(CMD_ACK, status, sendlen, 0, buf, sendlen); + status = iso14443b_select_srx_card(&card); + reply_mix(CMD_HF_ISO14443B_COMMAND, status, sendlen, 0, (uint8_t*)&card, sendlen); // 0: OK 2: demod fail, 3:crc fail, if (status > 0) goto out; } if ((param & ISO14B_APDU) == ISO14B_APDU) { - status = iso14443b_apdu(cmd, len, buf); - reply_mix(CMD_ACK, status, status, 0, buf, status); + uint8_t buf[100] = {0}; + status = iso14443b_apdu(cmd, len, buf, sizeof(buf)); + reply_mix(CMD_HF_ISO14443B_COMMAND, status, status, 0, buf, status); } if ((param & ISO14B_RAW) == ISO14B_RAW) { @@ -1643,14 +1729,18 @@ void SendRawCommand14443B_Ex(PacketCommandNG *c) { AddCrc14B(cmd, len); len += 2; } + uint8_t buf[100] = {0}; + + uint32_t start_time = 0; + uint32_t eof_time = 0; + CodeAndTransmit14443bAsReader(cmd, len, &start_time, &eof_time); - CodeAndTransmit14443bAsReader(cmd, len); // raw - GetTagSamplesFor14443bDemod(); // raw + eof_time += DELAY_ISO14443B_VCD_TO_VICC_READER; + status = Get14443bAnswerFromTag(buf, sizeof(buf), 5 * ISO14443B_READER_TIMEOUT, &eof_time); // raw FpgaDisableTracing(); sendlen = MIN(Demod.len, PM3_CMD_DATA_SIZE); - status = (Demod.len > 0) ? 0 : 1; - reply_old(CMD_ACK, status, sendlen, 0, Demod.output, sendlen); + reply_mix(CMD_HF_ISO14443B_COMMAND, status, sendlen, 0, Demod.output, sendlen); } out: diff --git a/armsrc/iso14443b.h b/armsrc/iso14443b.h index 12ee316e9..ac2c4f831 100644 --- a/armsrc/iso14443b.h +++ b/armsrc/iso14443b.h @@ -26,22 +26,19 @@ # define AddCrc14B(data, len) compute_crc(CRC_14443_B, (data), (len), (data)+(len), (data)+(len)+1) #endif -void iso14443b_setup(); -uint8_t iso14443b_apdu(uint8_t const *message, size_t message_length, uint8_t *response); -uint8_t iso14443b_select_card(iso14b_card_select_t *card); +void iso14443b_setup(void); +uint8_t iso14443b_apdu(uint8_t const *message, size_t message_length, uint8_t *response, uint16_t respmaxlen); + +int iso14443b_select_card(iso14b_card_select_t *card); uint8_t iso14443b_select_card_srx(iso14b_card_select_t *card); void SimulateIso14443bTag(uint32_t pupi); void AcquireRawAdcSamplesIso14443b(uint32_t parameter); -void ReadSTMemoryIso14443b(uint8_t numofblocks); -void RAMFUNC SniffIso14443b(void); +void ReadSTMemoryIso14443b(uint16_t numofblocks); +void SniffIso14443b(void); void SendRawCommand14443B(uint32_t, uint32_t, uint8_t, uint8_t[]); void SendRawCommand14443B_Ex(PacketCommandNG *c); -// testfunctions -void WaitForFpgaDelayQueueIsEmpty(uint16_t delay); -void ClearFpgaShiftingRegisters(void); - // States for 14B SIM command #define SIM_NOFIELD 0 #define SIM_IDLE 1 diff --git a/armsrc/iso15693.c b/armsrc/iso15693.c index a35ac4c57..428cf80ff 100644 --- a/armsrc/iso15693.c +++ b/armsrc/iso15693.c @@ -2,25 +2,23 @@ // Jonathan Westhues, split Nov 2006 // Modified by Greg Jones, Jan 2009 // Modified by Adrian Dabrowski "atrox", Mar-Sept 2010,Oct 2011 -// Modified by Christian Herrmann "iceman", 2017 +// Modified by Christian Herrmann "iceman", 2017, 2020 +// Modified by piwi, Oct 2018 // // This code is licensed to you under the terms of the GNU GPL, version 2 or, // at your option, any later version. See the LICENSE.txt file for the text of // the license. //----------------------------------------------------------------------------- // Routines to support ISO 15693. This includes both the reader software and -// the `fake tag' modes, but at the moment I've implemented only the reader -// stuff, and that barely. -// Modified to perform modulation onboard in arm rather than on PC -// Also added additional reader commands (SELECT, READ etc.) +// the `fake tag' modes. //----------------------------------------------------------------------------- -// The ISO 15693 describes two transmission modes from reader to tag, and 4 -// transmission modes from tag to reader. As of Mar 2010 this code only -// supports one of each: "1of4" mode from reader to tag, and the highspeed -// variant with one subcarrier from card to reader. -// As long, as the card fully support ISO 15693 this is no problem, since the -// reader chooses both data rates, but some non-standard tags do not. Further for -// the simulation to work, we will need to support all data rates. + +// The ISO 15693 describes two transmission modes from reader to tag, and four +// transmission modes from tag to reader. As of Oct 2018 this code supports +// both reader modes and the high speed variant with one subcarrier from card to reader. +// As long as the card fully support ISO 15693 this is no problem, since the +// reader chooses both data rates, but some non-standard tags do not. +// For card simulation, the code supports both high and low speed modes with one subcarrier. // // VCD (reader) -> VICC (tag) // 1 out of 256: @@ -47,15 +45,11 @@ // *) UID is always used "transmission order" (LSB), which is reverse to display order // TODO / BUGS / ISSUES: -// *) writing to tags takes longer: we miss the answer from the tag in most cases -// -> tweak the read-timeout times -// *) signal decoding from the card is still a bit shaky. -// *) signal decoding is unable to detect collissions. -// *) add anti-collission support for inventory-commands +// *) signal decoding is unable to detect collisions. +// *) add anti-collision support for inventory-commands // *) read security status of a block -// *) sniffing and simulation do only support one transmission mode. need to support -// all 8 transmission combinations -// *) remove or refactor code under "depricated" +// *) sniffing and simulation do not support two subcarrier modes. +// *) remove or refactor code under "deprecated" // *) document all the functions #include "iso15693.h" @@ -73,415 +67,1121 @@ #include "BigBuf.h" #include "crc16.h" +// Delays in SSP_CLK ticks. +// SSP_CLK runs at 13,56MHz / 32 = 423.75kHz when simulating a tag +#define DELAY_READER_TO_ARM 8 +#define DELAY_ARM_TO_READER 0 + +//SSP_CLK runs at 13.56MHz / 4 = 3,39MHz when acting as reader. All values should be multiples of 16 +#define DELAY_ARM_TO_TAG 16 +#define DELAY_TAG_TO_ARM 32 + +//SSP_CLK runs at 13.56MHz / 4 = 3,39MHz when sniffing. All values should be multiples of 16 +#define DELAY_TAG_TO_ARM_SNIFF 32 +#define DELAY_READER_TO_ARM_SNIFF 32 + +// times in samples @ 212kHz when acting as reader +#define ISO15693_READER_TIMEOUT 330 // 330/212kHz = 1558us +#define ISO15693_READER_TIMEOUT_WRITE 4700 // 4700/212kHz = 22ms, nominal 20ms + +// iceman: This defines below exists in the header file, just here for my easy reading +// Delays in SSP_CLK ticks. +// SSP_CLK runs at 13,56MHz / 32 = 423.75kHz when simulating a tag +//#define DELAY_ISO15693_VCD_TO_VICC_SIM 132 // 132/423.75kHz = 311.5us from end of command EOF to start of tag response + +//SSP_CLK runs at 13.56MHz / 4 = 3,39MHz when acting as reader. All values should be multiples of 16 +//#define DELAY_ISO15693_VCD_TO_VICC_READER 1056 // 1056/3,39MHz = 311.5us from end of command EOF to start of tag response +//#define DELAY_ISO15693_VICC_TO_VCD_READER 1024 // 1024/3.39MHz = 302.1us between end of tag response and next reader command + + /////////////////////////////////////////////////////////////////////// // ISO 15693 Part 2 - Air Interface -// This section basicly contains transmission and receiving of bits +// This section basically contains transmission and receiving of bits /////////////////////////////////////////////////////////////////////// +// buffers +#define ISO15693_MAX_RESPONSE_LENGTH 36 // allows read single block with the maximum block size of 256bits. Read multiple blocks not supported yet +#define ISO15693_MAX_COMMAND_LENGTH 45 // allows write single block with the maximum block size of 256bits. Write multiple blocks not supported yet + // 32 + 2 crc + 1 #define ISO15_MAX_FRAME 35 #define CMD_ID_RESP 5 #define CMD_READ_RESP 13 #define CMD_INV_RESP 12 -#define FrameSOF Iso15693FrameSOF -#define Logic0 Iso15693Logic0 -#define Logic1 Iso15693Logic1 -#define FrameEOF Iso15693FrameEOF - //#define Crc(data, len) Crc(CRC_15693, (data), (len)) #define CheckCrc15(data, len) check_crc(CRC_15693, (data), (len)) #define AddCrc15(data, len) compute_crc(CRC_15693, (data), (len), (data)+(len), (data)+(len)+1) -static void BuildIdentifyRequest(uint8_t *cmdout); -//static void BuildReadBlockRequest(uint8_t *cmdout, uint8_t *uid, uint8_t blockNumber ); -static void BuildInventoryResponse(uint8_t *cmdout, uint8_t *uid); +static void BuildIdentifyRequest(uint8_t *cmd); // --------------------------- + // Signal Processing // --------------------------- // prepare data using "1 out of 4" code for later transmission -// resulting data rate is 26,48 kbit/s (fc/512) +// resulting data rate is 26.48 kbit/s (fc/512) // cmd ... data // n ... length of data -static void CodeIso15693AsReader(uint8_t *cmd, int n) { - int i, j; +static uint8_t encode15_lut[] = { + 0x40, // 01000000 + 0x10, // 00010000 + 0x04, // 00000100 + 0x01 // 00000001 +}; - ToSendReset(); +void CodeIso15693AsReader(uint8_t *cmd, int n) { - // Give it a bit of slack at the beginning - for (i = 0; i < 24; i++) - ToSendStuffBit(1); + tosend_reset(); + tosend_t *ts = get_tosend(); // SOF for 1of4 - ToSendStuffBit(0); - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(0); - ToSendStuffBit(1); - ToSendStuffBit(1); - for (i = 0; i < n; i++) { - for (j = 0; j < 8; j += 2) { - int these = (cmd[i] >> j) & 3; - switch (these) { - case 0: - ToSendStuffBit(1); - ToSendStuffBit(0); - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(1); - break; - case 1: - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(0); - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(1); - break; - case 2: - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(0); - ToSendStuffBit(1); - ToSendStuffBit(1); - break; - case 3: - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(0); - break; - } - } - } - // EOF - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(0); - ToSendStuffBit(1); + ts->buf[++ts->max] = 0x84; //10000100 - // And slack at the end, too. - for (i = 0; i < 24; i++) - ToSendStuffBit(1); + // data + for (int i = 0; i < n; i++) { + + volatile uint8_t b = (cmd[i] >> 0) & 0x03; + ts->buf[++ts->max] = encode15_lut[b]; + + b = (cmd[i] >> 2) & 0x03; + ts->buf[++ts->max] = encode15_lut[b]; + + b = (cmd[i] >> 4) & 0x03; + ts->buf[++ts->max] = encode15_lut[b]; + + b = (cmd[i] >> 6) & 0x03; + ts->buf[++ts->max] = encode15_lut[b]; + } + + // EOF + ts->buf[++ts->max] = 0x20; //0010 + 0000 padding + ts->max++; } -// encode data using "1 out of 256" sheme +// Encode EOF only +static void CodeIso15693AsReaderEOF(void) { + tosend_reset(); + tosend_t *ts = get_tosend(); + ts->buf[++ts->max] = 0x20; + ts->max++; +} + + +// encode data using "1 out of 256" scheme // data rate is 1,66 kbit/s (fc/8192) // is designed for more robust communication over longer distances static void CodeIso15693AsReader256(uint8_t *cmd, int n) { - int i, j; - ToSendReset(); - - // Give it a bit of slack at the beginning - for (i = 0; i < 24; i++) - ToSendStuffBit(1); + tosend_reset(); + tosend_t *ts = get_tosend(); // SOF for 1of256 - ToSendStuffBit(0); - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(0); + ts->buf[++ts->max] = 0x81; //10000001 - for (i = 0; i < n; i++) { - for (j = 0; j <= 255; j++) { + // data + for (int i = 0; i < n; i++) { + for (int j = 0; j <= 255; j++) { if (cmd[i] == j) { - ToSendStuffBit(1); - ToSendStuffBit(0); + tosend_stuffbit(0); + tosend_stuffbit(1); } else { - ToSendStuffBit(1); - ToSendStuffBit(1); + tosend_stuffbit(0); + tosend_stuffbit(0); } } } - // EOF - ToSendStuffBit(1); - ToSendStuffBit(1); - ToSendStuffBit(0); - ToSendStuffBit(1); - // And slack at the end, too. - for (i = 0; i < 24; i++) - ToSendStuffBit(1); + // EOF + ts->buf[++ts->max] = 0x20; //0010 + 0000 padding + ts->max++; } -// Transmit the command (to the tag) that was placed in ToSend[]. -static void TransmitTo15693Tag(const uint8_t *cmd, int len, int *samples, int *wait) { +static const uint8_t encode_4bits[16] = { +// 0 1 2 3 + 0xaa, 0x6a, 0x9a, 0x5a, +// 4 5 6 7 + 0xa6, 0x66, 0x96, 0x56, +// 8 9 A B + 0xa9, 0x69, 0x99, 0x59, +// C D E F + 0xa5, 0x65, 0x95, 0x55 +}; - int c; - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_TX); +void CodeIso15693AsTag(uint8_t *cmd, size_t len) { + /* + * SOF comprises 3 parts; + * * An unmodulated time of 56.64 us + * * 24 pulses of 423.75 kHz (fc/32) + * * A logic 1, which starts with an unmodulated time of 18.88us + * followed by 8 pulses of 423.75kHz (fc/32) + * + * EOF comprises 3 parts: + * - A logic 0 (which starts with 8 pulses of fc/32 followed by an unmodulated + * time of 18.88us. + * - 24 pulses of fc/32 + * - An unmodulated time of 56.64 us + * + * A logic 0 starts with 8 pulses of fc/32 + * followed by an unmodulated time of 256/fc (~18,88us). + * + * A logic 0 starts with unmodulated time of 256/fc (~18,88us) followed by + * 8 pulses of fc/32 (also 18.88us) + * + * A bit here becomes 8 pulses of fc/32. Therefore: + * The SOF can be written as 00011101 = 0x1D + * The EOF can be written as 10111000 = 0xb8 + * A logic 1 is 01 + * A logic 0 is 10 + * + * */ + tosend_reset(); + tosend_t *ts = get_tosend(); - if (wait) { - for (c = 0; c < *wait;) { - if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) { - AT91C_BASE_SSC->SSC_THR = 0x00; // For exact timing! - ++c; - } - WDT_HIT(); - } + // SOF + ts->buf[++ts->max] = 0x1D; // 00011101 + + // data + for (int i = 0; i < len; i += 2) { + ts->buf[++ts->max] = encode_4bits[cmd[i] & 0xF]; + ts->buf[++ts->max] = encode_4bits[cmd[i] >> 4]; + ts->buf[++ts->max] = encode_4bits[cmd[i + 1] & 0xF]; + ts->buf[++ts->max] = encode_4bits[cmd[i + 1] >> 4]; } - c = 0; - for (;;) { - if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) { - AT91C_BASE_SSC->SSC_THR = cmd[c]; - if (++c >= len) break; + // EOF + ts->buf[++ts->max] = 0xB8; // 10111000 + ts->max++; +} + +// Transmit the command (to the tag) that was placed in cmd[]. +void TransmitTo15693Tag(const uint8_t *cmd, int len, uint32_t *start_time) { + + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_MODE_SEND_FULL_MOD); + + if (*start_time < DELAY_ARM_TO_TAG) { + *start_time = DELAY_ARM_TO_TAG; + } + + *start_time = (*start_time - DELAY_ARM_TO_TAG) & 0xfffffff0; + + if (GetCountSspClk() > *start_time) { // we may miss the intended time + *start_time = (GetCountSspClk() + 16) & 0xfffffff0; // next possible time + } + + // wait + while (GetCountSspClk() < *start_time) ; + + LED_B_ON(); + for (int c = 0; c < len; c++) { + volatile uint8_t data = cmd[c]; + + for (uint8_t i = 0; i < 8; i++) { + uint16_t send_word = (data & 0x80) ? 0xffff : 0x0000; + while (!(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY))) ; + AT91C_BASE_SSC->SSC_THR = send_word; + while (!(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY))) ; + AT91C_BASE_SSC->SSC_THR = send_word; + data <<= 1; } WDT_HIT(); } + LED_B_OFF(); - if (samples) { - if (wait) - *samples = (c + *wait) << 3; - else - *samples = c << 3; - } + *start_time = *start_time + DELAY_ARM_TO_TAG; } //----------------------------------------------------------------------------- -// Transmit the command (to the reader) that was placed in ToSend[]. +// Transmit the tag response (to the reader) that was placed in cmd[]. //----------------------------------------------------------------------------- -static void TransmitTo15693Reader(const uint8_t *cmd, int len, int *samples, int *wait) { - int c = 0; +void TransmitTo15693Reader(const uint8_t *cmd, size_t len, uint32_t *start_time, uint32_t slot_time, bool slow) { + + // don't use the FPGA_HF_SIMULATOR_MODULATE_424K_8BIT minor mode. It would spoil GetCountSspClk() FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_SIMULATOR | FPGA_HF_SIMULATOR_MODULATE_424K); - if (wait) { - for (c = 0; c < *wait;) { - if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) { - AT91C_BASE_SSC->SSC_THR = 0x00; // For exact timing! - ++c; - } - WDT_HIT(); + uint32_t modulation_start_time = *start_time - DELAY_ARM_TO_READER + 3 * 8; // no need to transfer the unmodulated start of SOF + + while (GetCountSspClk() > (modulation_start_time & 0xfffffff8) + 3) { // we will miss the intended time + if (slot_time) { + modulation_start_time += slot_time; // use next available slot + } else { + modulation_start_time = (modulation_start_time & 0xfffffff8) + 8; // next possible time } } - c = 0; - for (;;) { - if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) { - AT91C_BASE_SSC->SSC_THR = cmd[c]; - if (++c >= len) break; + // wait + while (GetCountSspClk() < (modulation_start_time & 0xfffffff8)) ; + + uint8_t shift_delay = modulation_start_time & 0x00000007; + + *start_time = modulation_start_time + DELAY_ARM_TO_READER - 3 * 8; + + LED_C_ON(); + uint8_t bits_to_shift = 0x00; + uint8_t bits_to_send = 0x00; + + for (size_t c = 0; c < len; c++) { + for (int i = (c == 0 ? 4 : 7); i >= 0; i--) { + + uint8_t cmd_bits = ((cmd[c] >> i) & 0x01) ? 0xff : 0x00; + + for (int j = 0; j < (slow ? 4 : 1);) { + if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_TXRDY) { + bits_to_send = bits_to_shift << (8 - shift_delay) | cmd_bits >> shift_delay; + AT91C_BASE_SSC->SSC_THR = bits_to_send; + bits_to_shift = cmd_bits; + j++; + } + } } WDT_HIT(); } - if (samples) { - if (wait) - *samples = (c + *wait) << 3; - else - *samples = c << 3; + + // send the remaining bits, padded with 0: + bits_to_send = bits_to_shift << (8 - shift_delay); + if (bits_to_send) { + for (; ;) { + if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_TXRDY) { + AT91C_BASE_SSC->SSC_THR = bits_to_send; + break; + } + } } + LED_C_OFF(); } +//============================================================================= +// An ISO 15693 decoder for tag responses (one subcarrier only). +// Uses cross correlation to identify each bit and EOF. +// This function is called 8 times per bit (every 2 subcarrier cycles). +// Subcarrier frequency fs is 424kHz, 1/fs = 2,36us, +// i.e. function is called every 4,72us +// LED handling: +// LED C -> ON once we have received the SOF and are expecting the rest. +// LED C -> OFF once we have received EOF or are unsynced +// +// Returns: true if we received a EOF +// false if we are still waiting for some more +//============================================================================= + +#define NOISE_THRESHOLD 80 // don't try to correlate noise +#define MAX_PREVIOUS_AMPLITUDE (-1 - NOISE_THRESHOLD) + +typedef struct { + enum { + STATE_TAG_SOF_LOW, + STATE_TAG_SOF_RISING_EDGE, + STATE_TAG_SOF_HIGH, + STATE_TAG_SOF_HIGH_END, + STATE_TAG_RECEIVING_DATA, + STATE_TAG_EOF, + STATE_TAG_EOF_TAIL + } state; + int bitCount; + int posCount; + enum { + LOGIC0, + LOGIC1, + SOF_PART1, + SOF_PART2 + } lastBit; + uint16_t shiftReg; + uint16_t max_len; + uint8_t *output; + int len; + int sum1; + int sum2; + int threshold_sof; + int threshold_half; + uint16_t previous_amplitude; +} DecodeTag_t; + //----------------------------------------------------------------------------- // DEMODULATE tag answer //----------------------------------------------------------------------------- -static int DemodAnswer(uint8_t *received, uint8_t *dest, uint16_t samplecount) { +static RAMFUNC int Handle15693SamplesFromTag(uint16_t amplitude, DecodeTag_t *tag) { - int i, j; - int max = 0, maxPos = 0, skip = 4; - int k = 0; // this will be our return value + switch (tag->state) { - // First, correlate for SOF - for (i = 0; i < samplecount; i++) { - int corr = 0; - for (j = 0; j < ARRAYLEN(FrameSOF); j += skip) { - corr += FrameSOF[j] * dest[i + (j / skip)]; - } - if (corr > max) { - max = corr; - maxPos = i; - } - } - // DbpString("SOF at %d, correlation %d", maxPos,max/(ARRAYLEN(FrameSOF)/skip)); - - // greg - If correlation is less than 1 then there's little point in continuing - if ((max / (ARRAYLEN(FrameSOF) / skip)) < 1) - return k; - - i = maxPos + ARRAYLEN(FrameSOF) / skip; - - uint8_t outBuf[ISO15_MAX_FRAME]; - memset(outBuf, 0, sizeof(outBuf)); - uint8_t mask = 0x01; - for (;;) { - int corr0 = 0, corr1 = 0, corrEOF = 0; - for (j = 0; j < ARRAYLEN(Logic0); j += skip) { - corr0 += Logic0[j] * dest[i + (j / skip)]; - } - for (j = 0; j < ARRAYLEN(Logic1); j += skip) { - corr1 += Logic1[j] * dest[i + (j / skip)]; - } - for (j = 0; j < ARRAYLEN(FrameEOF); j += skip) { - corrEOF += FrameEOF[j] * dest[i + (j / skip)]; - } - // Even things out by the length of the target waveform. - corr0 *= 4; - corr1 *= 4; - // if (DBGLEVEL >= DBG_EXTENDED) - // Dbprintf("Corr1 %d, Corr0 %d, CorrEOF %d", corr1, corr0, corrEOF); - - if (corrEOF > corr1 && corrEOF > corr0) + case STATE_TAG_SOF_LOW: { + // waiting for a rising edge + if (amplitude > NOISE_THRESHOLD + tag->previous_amplitude) { + if (tag->posCount > 10) { + tag->threshold_sof = amplitude - tag->previous_amplitude; // to be divided by 2 + tag->threshold_half = 0; + tag->state = STATE_TAG_SOF_RISING_EDGE; + } else { + tag->posCount = 0; + } + } else { + tag->posCount++; + tag->previous_amplitude = amplitude; + } break; - - if (corr1 > corr0) { - i += ARRAYLEN(Logic1) / skip; - outBuf[k] |= mask; - } else { - i += ARRAYLEN(Logic0) / skip; } - mask <<= 1; - - if (mask == 0) { - k++; - mask = 0x01; + case STATE_TAG_SOF_RISING_EDGE: { + if (amplitude > tag->threshold_sof + tag->previous_amplitude) { // edge still rising + if (amplitude > tag->threshold_sof + tag->threshold_sof) { // steeper edge, take this as time reference + tag->posCount = 1; + } else { + tag->posCount = 2; + } + tag->threshold_sof = (amplitude - tag->previous_amplitude) / 2; + } else { + tag->posCount = 2; + tag->threshold_sof = tag->threshold_sof / 2; + } + tag->state = STATE_TAG_SOF_HIGH; + break; } - if ((i + (int)ARRAYLEN(FrameEOF)) >= samplecount - 1) { - //Dbprintf("[!] ran off end! %d | %d",( i + (int)ARRAYLEN(FrameEOF)), samplecount-1); + case STATE_TAG_SOF_HIGH: { + // waiting for 10 times high. Take average over the last 8 + if (amplitude > tag->threshold_sof) { + tag->posCount++; + if (tag->posCount > 2) { + tag->threshold_half += amplitude; // keep track of average high value + } + if (tag->posCount == 10) { + tag->threshold_half >>= 2; // (4 times 1/2 average) + tag->state = STATE_TAG_SOF_HIGH_END; + } + } else { // high phase was too short + tag->posCount = 1; + tag->previous_amplitude = amplitude; + tag->state = STATE_TAG_SOF_LOW; + } + break; + } + + case STATE_TAG_SOF_HIGH_END: { + // check for falling edge + if (tag->posCount == 13 && amplitude < tag->threshold_sof) { + tag->lastBit = SOF_PART1; // detected 1st part of SOF (12 samples low and 12 samples high) + tag->shiftReg = 0; + tag->bitCount = 0; + tag->len = 0; + tag->sum1 = amplitude; + tag->sum2 = 0; + tag->posCount = 2; + tag->state = STATE_TAG_RECEIVING_DATA; + LED_C_ON(); + } else { + tag->posCount++; + if (tag->posCount > 13) { // high phase too long + tag->posCount = 0; + tag->previous_amplitude = amplitude; + tag->state = STATE_TAG_SOF_LOW; + LED_C_OFF(); + } + } + break; + } + + case STATE_TAG_RECEIVING_DATA: { + if (tag->posCount == 1) { + tag->sum1 = 0; + tag->sum2 = 0; + } + + if (tag->posCount <= 4) { + tag->sum1 += amplitude; + } else { + tag->sum2 += amplitude; + } + + if (tag->posCount == 8) { + if (tag->sum1 > tag->threshold_half && tag->sum2 > tag->threshold_half) { // modulation in both halves + if (tag->lastBit == LOGIC0) { // this was already part of EOF + tag->state = STATE_TAG_EOF; + } else { + tag->posCount = 0; + tag->previous_amplitude = amplitude; + tag->state = STATE_TAG_SOF_LOW; + LED_C_OFF(); + } + } else if (tag->sum1 < tag->threshold_half && tag->sum2 > tag->threshold_half) { // modulation in second half + // logic 1 + if (tag->lastBit == SOF_PART1) { // still part of SOF + tag->lastBit = SOF_PART2; // SOF completed + } else { + tag->lastBit = LOGIC1; + tag->shiftReg >>= 1; + tag->shiftReg |= 0x80; + tag->bitCount++; + if (tag->bitCount == 8) { + tag->output[tag->len] = tag->shiftReg; + tag->len++; + + if (tag->len > tag->max_len) { + // buffer overflow, give up + LED_C_OFF(); + return true; + } + tag->bitCount = 0; + tag->shiftReg = 0; + } + } + } else if (tag->sum1 > tag->threshold_half && tag->sum2 < tag->threshold_half) { // modulation in first half + // logic 0 + if (tag->lastBit == SOF_PART1) { // incomplete SOF + tag->posCount = 0; + tag->previous_amplitude = amplitude; + tag->state = STATE_TAG_SOF_LOW; + LED_C_OFF(); + } else { + tag->lastBit = LOGIC0; + tag->shiftReg >>= 1; + tag->bitCount++; + + if (tag->bitCount == 8) { + tag->output[tag->len] = tag->shiftReg; + tag->len++; + + if (tag->len > tag->max_len) { + // buffer overflow, give up + tag->posCount = 0; + tag->previous_amplitude = amplitude; + tag->state = STATE_TAG_SOF_LOW; + LED_C_OFF(); + } + tag->bitCount = 0; + tag->shiftReg = 0; + } + } + } else { // no modulation + if (tag->lastBit == SOF_PART2) { // only SOF (this is OK for iClass) + LED_C_OFF(); + return true; + } else { + tag->posCount = 0; + tag->state = STATE_TAG_SOF_LOW; + LED_C_OFF(); + } + } + tag->posCount = 0; + } + tag->posCount++; + break; + } + + case STATE_TAG_EOF: { + if (tag->posCount == 1) { + tag->sum1 = 0; + tag->sum2 = 0; + } + + if (tag->posCount <= 4) { + tag->sum1 += amplitude; + } else { + tag->sum2 += amplitude; + } + + if (tag->posCount == 8) { + if (tag->sum1 > tag->threshold_half && tag->sum2 < tag->threshold_half) { // modulation in first half + tag->posCount = 0; + tag->state = STATE_TAG_EOF_TAIL; + } else { + tag->posCount = 0; + tag->previous_amplitude = amplitude; + tag->state = STATE_TAG_SOF_LOW; + LED_C_OFF(); + } + } + tag->posCount++; + break; + } + + case STATE_TAG_EOF_TAIL: { + if (tag->posCount == 1) { + tag->sum1 = 0; + tag->sum2 = 0; + } + + if (tag->posCount <= 4) { + tag->sum1 += amplitude; + } else { + tag->sum2 += amplitude; + } + + if (tag->posCount == 8) { + if (tag->sum1 < tag->threshold_half && tag->sum2 < tag->threshold_half) { // no modulation in both halves + LED_C_OFF(); + return true; + } else { + tag->posCount = 0; + tag->previous_amplitude = amplitude; + tag->state = STATE_TAG_SOF_LOW; + LED_C_OFF(); + } + } + tag->posCount++; break; } } - if (DBGLEVEL >= DBG_EXTENDED) Dbprintf("ice: demod bytes %u", k); - - if (mask != 0x01) { // this happens, when we miss the EOF - - // TODO: for some reason this happens quite often - if (DBGLEVEL >= DBG_ERROR && k != 0) Dbprintf("[!] error, uneven octet! (extra bits!) mask %02x", mask); - //if (mask < 0x08) k--; // discard the last uneven octet; - // 0x08 is an assumption - but works quite often - } - - for (i = 0; i < k; i++) - received[i] = outBuf[i]; - - // return the number of bytes demodulated - return k; + return false; } -// Read from Tag -// Parameters: -// received -// samples -// elapsed -// returns: -// number of decoded bytes -// logging enabled -static int GetIso15693AnswerFromTag(uint8_t *received, int *elapsed) { +static void DecodeTagReset(DecodeTag_t *tag) { + tag->posCount = 0; + tag->state = STATE_TAG_SOF_LOW; + tag->previous_amplitude = MAX_PREVIOUS_AMPLITUDE; +} -#define SIGNAL_BUFF_SIZE 15000 - // get current clock - uint32_t time_0 = GetCountSspClk(); - uint32_t time_stop = 0; - bool getNext = false; - int counter = 0, ci, cq = 0; - uint8_t *buf = BigBuf_malloc(SIGNAL_BUFF_SIZE); +static void DecodeTagInit(DecodeTag_t *tag, uint8_t *data, uint16_t max_len) { + tag->output = data; + tag->max_len = max_len; + DecodeTagReset(tag); +} - if (elapsed) *elapsed = 0; +/* + * Receive and decode the tag response, also log to tracebuffer + */ +int GetIso15693AnswerFromTag(uint8_t *response, uint16_t max_len, uint16_t timeout, uint32_t *eof_time) { - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR); + int samples = 0, ret = 0; + + // the Decoder data structure + DecodeTag_t dtm = { 0 }; + DecodeTag_t *dt = &dtm; + DecodeTagInit(dt, response, max_len); + + // wait for last transfer to complete + while (!(AT91C_BASE_SSC->SSC_SR & AT91C_SSC_TXEMPTY)); + + // And put the FPGA in the appropriate mode + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_SUBCARRIER_424_KHZ | FPGA_HF_READER_MODE_RECEIVE_AMPLITUDE); + + // Setup and start DMA. + FpgaSetupSsc(FPGA_MAJOR_MODE_HF_READER); + + // The DMA buffer, used to stream samples from the FPGA + dmabuf16_t *dma = get_dma16(); + + // Setup and start DMA. + if (FpgaSetupSscDma((uint8_t *) dma->buf, DMA_BUFFER_SIZE) == false) { + if (DBGLEVEL > DBG_ERROR) Dbprintf("FpgaSetupSscDma failed. Exiting"); + return -4; + } + + uint32_t dma_start_time = 0; + uint16_t *upTo = dma->buf; for (;;) { - WDT_HIT(); - if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) { - AT91C_BASE_SSC->SSC_THR = 0x00; //0x43; - // To make use of exact timing of next command from reader!! - if (elapsed)(*elapsed)++; + volatile uint16_t behindBy = ((uint16_t *)AT91C_BASE_PDC_SSC->PDC_RPR - upTo) & (DMA_BUFFER_SIZE - 1); + if (behindBy == 0) + continue; + + samples++; + if (samples == 1) { + // DMA has transferred the very first data + dma_start_time = GetCountSspClk() & 0xfffffff0; } - if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) { - ci = (int8_t)AT91C_BASE_SSC->SSC_RHR; - ci = ABS(ci); + volatile uint16_t tagdata = *upTo++; - // The samples are correlations against I and Q versions of the - // tone that the tag AM-modulates, so every other sample is I, - // every other is Q. We just want power, so abs(I) + abs(Q) is - // close to what we want. - // iceman 2016, amplitude sqrt(abs(i) + abs(q)) - if (getNext) { + if (upTo >= dma->buf + DMA_BUFFER_SIZE) { // we have read all of the DMA buffer content. + upTo = dma->buf; // start reading the circular buffer from the beginning - buf[counter++] = (uint8_t)(MAX(ci, cq) + (MIN(ci, cq) >> 1)); + // DMA Counter Register had reached 0, already rotated. + if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_ENDRX)) { - if (counter >= SIGNAL_BUFF_SIZE) + // primary buffer was stopped + if (AT91C_BASE_PDC_SSC->PDC_RCR == false) { + AT91C_BASE_PDC_SSC->PDC_RPR = (uint32_t) dma->buf; + AT91C_BASE_PDC_SSC->PDC_RCR = DMA_BUFFER_SIZE; + } + // secondary buffer sets as primary, secondary buffer was stopped + if (AT91C_BASE_PDC_SSC->PDC_RNCR == false) { + AT91C_BASE_PDC_SSC->PDC_RNPR = (uint32_t) dma->buf; + AT91C_BASE_PDC_SSC->PDC_RNCR = DMA_BUFFER_SIZE; + } + + WDT_HIT(); + if (BUTTON_PRESS()) { + DbpString("stopped"); break; - } else { - cq = ci; + } } - getNext = !getNext; } + + if (Handle15693SamplesFromTag(tagdata, dt)) { + + *eof_time = dma_start_time + (samples * 16) - DELAY_TAG_TO_ARM; // end of EOF + + if (dt->lastBit == SOF_PART2) { + *eof_time -= (8 * 16); // needed 8 additional samples to confirm single SOF (iCLASS) + } + if (dt->len > dt->max_len) { + ret = -2; // buffer overflow + Dbprintf("overflow (%d > %d", dt->len, dt->max_len); + } + break; + } + + // timeout + if (samples > timeout && dt->state < STATE_TAG_RECEIVING_DATA) { + ret = -3; + break; + } + } - time_stop = GetCountSspClk() - time_0 ; - int len = DemodAnswer(received, buf, counter); - LogTrace(received, len, time_0 << 4, time_stop << 4, NULL, false); - BigBuf_free(); - return len; + + FpgaDisableSscDma(); + + uint32_t sof_time = *eof_time + - (dt->len * 8 * 8 * 16) // time for byte transfers + - (32 * 16) // time for SOF transfer + - (dt->lastBit != SOF_PART2 ? (32 * 16) : 0); // time for EOF transfer + + if (DBGLEVEL >= DBG_EXTENDED) { + Dbprintf("samples = %d, ret = %d, Decoder: state = %d, lastBit = %d, len = %d, bitCount = %d, posCount = %d, maxlen = %u", + samples, + ret, + dt->state, + dt->lastBit, + dt->len, + dt->bitCount, + dt->posCount, + dt->max_len + ); + Dbprintf("timing: sof_time = %d, eof_time = %d", (sof_time * 4), (*eof_time * 4)); + } + + if (ret < 0) { + return ret; + } + + LogTrace_ISO15693(dt->output, dt->len, (sof_time * 4), (*eof_time * 4), NULL, false); + return dt->len; } -// Now the GetISO15693 message from sniffing command -// logging enable, -static int GetIso15693AnswerFromSniff(uint8_t *received, int *samples, int *elapsed) { +//============================================================================= +// An ISO15693 decoder for reader commands. +// +// This function is called 4 times per bit (every 2 subcarrier cycles). +// Subcarrier frequency fs is 848kHz, 1/fs = 1,18us, i.e. function is called every 2,36us +// LED handling: +// LED B -> ON once we have received the SOF and are expecting the rest. +// LED B -> OFF once we have received EOF or are in error state or unsynced +// +// Returns: true if we received a EOF +// false if we are still waiting for some more +//============================================================================= - bool getNext = false; - int counter = 0, ci, cq = 0; - uint32_t time_0 = 0, time_stop = 0; - uint8_t *buf = BigBuf_get_addr(); +typedef struct { + enum { + STATE_READER_UNSYNCD, + STATE_READER_AWAIT_1ST_FALLING_EDGE_OF_SOF, + STATE_READER_AWAIT_1ST_RISING_EDGE_OF_SOF, + STATE_READER_AWAIT_2ND_FALLING_EDGE_OF_SOF, + STATE_READER_AWAIT_2ND_RISING_EDGE_OF_SOF, + STATE_READER_AWAIT_END_OF_SOF_1_OUT_OF_4, + STATE_READER_RECEIVE_DATA_1_OUT_OF_4, + STATE_READER_RECEIVE_DATA_1_OUT_OF_256, + STATE_READER_RECEIVE_JAMMING + } state; + enum { + CODING_1_OUT_OF_4, + CODING_1_OUT_OF_256 + } Coding; + uint8_t shiftReg; + uint8_t bitCount; + int byteCount; + int byteCountMax; + int posCount; + int sum1, sum2; + uint8_t *output; + uint8_t jam_search_len; + uint8_t *jam_search_string; +} DecodeReader_t; - // get current clock - time_0 = GetCountSspClk(); +static void DecodeReaderInit(DecodeReader_t *reader, uint8_t *data, uint16_t max_len, uint8_t jam_search_len, uint8_t *jam_search_string) { + reader->output = data; + reader->byteCountMax = max_len; + reader->state = STATE_READER_UNSYNCD; + reader->byteCount = 0; + reader->bitCount = 0; + reader->posCount = 1; + reader->shiftReg = 0; + reader->jam_search_len = jam_search_len; + reader->jam_search_string = jam_search_string; +} - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR); +static void DecodeReaderReset(DecodeReader_t *reader) { + reader->state = STATE_READER_UNSYNCD; +} - for (;;) { - WDT_HIT(); - - if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) { - - ci = (int8_t)AT91C_BASE_SSC->SSC_RHR; - ci = ABS(ci); - - // The samples are correlations against I and Q versions of the - // tone that the tag AM-modulates, so every other sample is I, - // every other is Q. We just want power, so abs(I) + abs(Q) is - // close to what we want. - if (getNext) { - - buf[counter++] = (uint8_t)(MAX(ci, cq) + (MIN(ci, cq) >> 1)); - - if (counter >= 20000) - break; - } else { - cq = ci; +//static inline __attribute__((always_inline)) +static int RAMFUNC Handle15693SampleFromReader(bool bit, DecodeReader_t *reader) { + switch (reader->state) { + case STATE_READER_UNSYNCD: + // wait for unmodulated carrier + if (bit) { + reader->state = STATE_READER_AWAIT_1ST_FALLING_EDGE_OF_SOF; } - getNext = !getNext; - } + break; + + case STATE_READER_AWAIT_1ST_FALLING_EDGE_OF_SOF: + if (!bit) { + // we went low, so this could be the beginning of a SOF + reader->posCount = 1; + reader->state = STATE_READER_AWAIT_1ST_RISING_EDGE_OF_SOF; + } + break; + + case STATE_READER_AWAIT_1ST_RISING_EDGE_OF_SOF: + reader->posCount++; + if (bit) { // detected rising edge + if (reader->posCount < 4) { // rising edge too early (nominally expected at 5) + reader->state = STATE_READER_AWAIT_1ST_FALLING_EDGE_OF_SOF; + } else { // SOF + reader->state = STATE_READER_AWAIT_2ND_FALLING_EDGE_OF_SOF; + } + } else { + if (reader->posCount > 5) { // stayed low for too long + DecodeReaderReset(reader); + } else { + // do nothing, keep waiting + } + } + break; + + case STATE_READER_AWAIT_2ND_FALLING_EDGE_OF_SOF: + + reader->posCount++; + + if (bit == false) { // detected a falling edge + + if (reader->posCount < 20) { // falling edge too early (nominally expected at 21 earliest) + DecodeReaderReset(reader); + } else if (reader->posCount < 23) { // SOF for 1 out of 4 coding + reader->Coding = CODING_1_OUT_OF_4; + reader->state = STATE_READER_AWAIT_2ND_RISING_EDGE_OF_SOF; + } else if (reader->posCount < 28) { // falling edge too early (nominally expected at 29 latest) + DecodeReaderReset(reader); + } else { // SOF for 1 out of 256 coding + reader->Coding = CODING_1_OUT_OF_256; + reader->state = STATE_READER_AWAIT_2ND_RISING_EDGE_OF_SOF; + } + + } else { + if (reader->posCount > 29) { // stayed high for too long + reader->state = STATE_READER_AWAIT_1ST_FALLING_EDGE_OF_SOF; + } else { + // do nothing, keep waiting + } + } + break; + + case STATE_READER_AWAIT_2ND_RISING_EDGE_OF_SOF: + + reader->posCount++; + + if (bit) { // detected rising edge + if (reader->Coding == CODING_1_OUT_OF_256) { + if (reader->posCount < 32) { // rising edge too early (nominally expected at 33) + reader->state = STATE_READER_AWAIT_1ST_FALLING_EDGE_OF_SOF; + } else { + reader->posCount = 1; + reader->bitCount = 0; + reader->byteCount = 0; + reader->sum1 = 1; + reader->state = STATE_READER_RECEIVE_DATA_1_OUT_OF_256; + LED_B_ON(); + } + } else { // CODING_1_OUT_OF_4 + if (reader->posCount < 24) { // rising edge too early (nominally expected at 25) + reader->state = STATE_READER_AWAIT_1ST_FALLING_EDGE_OF_SOF; + } else { + reader->posCount = 1; + reader->state = STATE_READER_AWAIT_END_OF_SOF_1_OUT_OF_4; + } + } + } else { + if (reader->Coding == CODING_1_OUT_OF_256) { + if (reader->posCount > 34) { // signal stayed low for too long + DecodeReaderReset(reader); + } else { + // do nothing, keep waiting + } + } else { // CODING_1_OUT_OF_4 + if (reader->posCount > 26) { // signal stayed low for too long + DecodeReaderReset(reader); + } else { + // do nothing, keep waiting + } + } + } + break; + + case STATE_READER_AWAIT_END_OF_SOF_1_OUT_OF_4: + + reader->posCount++; + + if (bit) { + if (reader->posCount == 9) { + reader->posCount = 1; + reader->bitCount = 0; + reader->byteCount = 0; + reader->sum1 = 1; + reader->state = STATE_READER_RECEIVE_DATA_1_OUT_OF_4; + LED_B_ON(); + } else { + // do nothing, keep waiting + } + } else { // unexpected falling edge + DecodeReaderReset(reader); + } + break; + + case STATE_READER_RECEIVE_DATA_1_OUT_OF_4: + + reader->posCount++; + + if (reader->posCount == 1) { + + reader->sum1 = bit ? 1 : 0; + + } else if (reader->posCount <= 4) { + + if (bit) + reader->sum1++; + + } else if (reader->posCount == 5) { + + reader->sum2 = bit ? 1 : 0; + + } else { + if (bit) + reader->sum2++; + } + + if (reader->posCount == 8) { + reader->posCount = 0; + if (reader->sum1 <= 1 && reader->sum2 >= 3) { // EOF + LED_B_OFF(); // Finished receiving + DecodeReaderReset(reader); + if (reader->byteCount != 0) { + return true; + } + + } else if (reader->sum1 >= 3 && reader->sum2 <= 1) { // detected a 2bit position + reader->shiftReg >>= 2; + reader->shiftReg |= (reader->bitCount << 6); + } + + if (reader->bitCount == 15) { // we have a full byte + + reader->output[reader->byteCount++] = reader->shiftReg; + if (reader->byteCount > reader->byteCountMax) { + // buffer overflow, give up + LED_B_OFF(); + DecodeReaderReset(reader); + } + + reader->bitCount = 0; + reader->shiftReg = 0; + if (reader->byteCount == reader->jam_search_len) { + if (!memcmp(reader->output, reader->jam_search_string, reader->jam_search_len)) { + LED_D_ON(); + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_MODE_SEND_JAM); + reader->state = STATE_READER_RECEIVE_JAMMING; + } + } + + } else { + reader->bitCount++; + } + } + break; + + case STATE_READER_RECEIVE_DATA_1_OUT_OF_256: + + reader->posCount++; + + if (reader->posCount == 1) { + reader->sum1 = bit ? 1 : 0; + } else if (reader->posCount <= 4) { + if (bit) reader->sum1++; + } else if (reader->posCount == 5) { + reader->sum2 = bit ? 1 : 0; + } else if (bit) { + reader->sum2++; + } + + if (reader->posCount == 8) { + reader->posCount = 0; + if (reader->sum1 <= 1 && reader->sum2 >= 3) { // EOF + LED_B_OFF(); // Finished receiving + DecodeReaderReset(reader); + if (reader->byteCount != 0) { + return true; + } + + } else if (reader->sum1 >= 3 && reader->sum2 <= 1) { // detected the bit position + reader->shiftReg = reader->bitCount; + } + + if (reader->bitCount == 255) { // we have a full byte + reader->output[reader->byteCount++] = reader->shiftReg; + if (reader->byteCount > reader->byteCountMax) { + // buffer overflow, give up + LED_B_OFF(); + DecodeReaderReset(reader); + } + + if (reader->byteCount == reader->jam_search_len) { + if (!memcmp(reader->output, reader->jam_search_string, reader->jam_search_len)) { + LED_D_ON(); + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_MODE_SEND_JAM); + reader->state = STATE_READER_RECEIVE_JAMMING; + } + } + } + reader->bitCount++; + } + break; + + case STATE_READER_RECEIVE_JAMMING: + + reader->posCount++; + + if (reader->Coding == CODING_1_OUT_OF_4) { + if (reader->posCount == 7 * 16) { // 7 bits jammed + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_MODE_SNIFF_AMPLITUDE); // stop jamming + // FpgaDisableTracing(); + LED_D_OFF(); + } else if (reader->posCount == 8 * 16) { + reader->posCount = 0; + reader->output[reader->byteCount++] = 0x00; + reader->state = STATE_READER_RECEIVE_DATA_1_OUT_OF_4; + } + } else { + if (reader->posCount == 7 * 256) { // 7 bits jammend + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_MODE_SNIFF_AMPLITUDE); // stop jamming + LED_D_OFF(); + } else if (reader->posCount == 8 * 256) { + reader->posCount = 0; + reader->output[reader->byteCount++] = 0x00; + reader->state = STATE_READER_RECEIVE_DATA_1_OUT_OF_256; + } + } + break; + + default: + LED_B_OFF(); + DecodeReaderReset(reader); + break; } - time_stop = GetCountSspClk() - time_0; - int k = DemodAnswer(received, buf, counter); - LogTrace(received, k, time_0 << 4, time_stop << 4, NULL, false); - return k; + return false; +} + +//----------------------------------------------------------------------------- +// Receive a command (from the reader to us, where we are the simulated tag), +// and store it in the given buffer, up to the given maximum length. Keeps +// spinning, waiting for a well-framed command, until either we get one +// (returns len) or someone presses the pushbutton on the board (returns -1). +// +// Assume that we're called with the SSC (to the FPGA) and ADC path set +// correctly. +//----------------------------------------------------------------------------- + +int GetIso15693CommandFromReader(uint8_t *received, size_t max_len, uint32_t *eof_time) { + int samples = 0; + bool gotFrame = false; + + // the decoder data structure + DecodeReader_t *dr = (DecodeReader_t *)BigBuf_malloc(sizeof(DecodeReader_t)); + DecodeReaderInit(dr, received, max_len, 0, NULL); + + // wait for last transfer to complete + while (!(AT91C_BASE_SSC->SSC_SR & AT91C_SSC_TXEMPTY)); + + LED_D_OFF(); + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_SIMULATOR | FPGA_HF_SIMULATOR_NO_MODULATION); + + // clear receive register and wait for next transfer + uint32_t temp = AT91C_BASE_SSC->SSC_RHR; + (void) temp; + while (!(AT91C_BASE_SSC->SSC_SR & AT91C_SSC_RXRDY)) ; + + // Setup and start DMA. + dmabuf8_t *dma = get_dma8(); + if (FpgaSetupSscDma(dma->buf, DMA_BUFFER_SIZE) == false) { + if (DBGLEVEL > DBG_ERROR) Dbprintf("FpgaSetupSscDma failed. Exiting"); + return -4; + } + uint8_t *upTo = dma->buf; + + uint32_t dma_start_time = GetCountSspClk() & 0xfffffff8; + + for (;;) { + volatile uint16_t behindBy = ((uint8_t *)AT91C_BASE_PDC_SSC->PDC_RPR - upTo) & (DMA_BUFFER_SIZE - 1); + if (behindBy == 0) continue; + + if (samples == 0) { + // DMA has transferred the very first data + dma_start_time = GetCountSspClk() & 0xfffffff0; + } + + volatile uint8_t b = *upTo++; + if (upTo >= dma->buf + DMA_BUFFER_SIZE) { // we have read all of the DMA buffer content. + upTo = dma->buf; // start reading the circular buffer from the beginning + if (behindBy > (9 * DMA_BUFFER_SIZE / 10)) { + Dbprintf("About to blow circular buffer - aborted! behindBy %d", behindBy); + break; + } + } + if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_ENDRX)) { // DMA Counter Register had reached 0, already rotated. + AT91C_BASE_PDC_SSC->PDC_RNPR = (uint32_t) dma->buf; // refresh the DMA Next Buffer and + AT91C_BASE_PDC_SSC->PDC_RNCR = DMA_BUFFER_SIZE; // DMA Next Counter registers + } + + for (int i = 7; i >= 0; i--) { + if (Handle15693SampleFromReader((b >> i) & 0x01, dr)) { + *eof_time = dma_start_time + samples - DELAY_READER_TO_ARM; // end of EOF + gotFrame = true; + break; + } + samples++; + } + + if (gotFrame) { + break; + } + + if (BUTTON_PRESS()) { + dr->byteCount = -1; + break; + } + + WDT_HIT(); + } + + FpgaDisableSscDma(); + + if (DBGLEVEL >= DBG_EXTENDED) { + Dbprintf("samples = %d, gotFrame = %d, Decoder: state = %d, len = %d, bitCount = %d, posCount = %d", + samples, gotFrame, dr->state, dr->byteCount, + dr->bitCount, dr->posCount); + } + + if (dr->byteCount >= 0) { + uint32_t sof_time = *eof_time + - dr->byteCount * (dr->Coding == CODING_1_OUT_OF_4 ? 128 : 2048) // time for byte transfers + - 32 // time for SOF transfer + - 16; // time for EOF transfer + LogTrace_ISO15693(dr->output, dr->byteCount, (sof_time * 32), (*eof_time * 32), NULL, true); + } + + return dr->byteCount; } //----------------------------------------------------------------------------- @@ -490,134 +1190,241 @@ static int GetIso15693AnswerFromSniff(uint8_t *received, int *samples, int *elap // so that it can be downloaded to a PC and processed there. //----------------------------------------------------------------------------- void AcquireRawAdcSamplesIso15693(void) { - int c = 0, getNext = false; - int ci, cq = 0; + LED_A_ON(); + uint8_t *dest = BigBuf_malloc(4000); FpgaDownloadAndGo(FPGA_BITSTREAM_HF); + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER); + LED_D_ON(); + FpgaSetupSsc(FPGA_MAJOR_MODE_HF_READER); SetAdcMuxFor(GPIO_MUXSEL_HIPKD); - FpgaSetupSsc(); + + uint8_t cmd[5]; + BuildIdentifyRequest(cmd); + CodeIso15693AsReader(cmd, sizeof(cmd)); + + // Give the tags time to energize + SpinDelay(100); // Now send the command - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_TX); - SpinDelay(200); + tosend_t *ts = get_tosend(); - uint8_t *buf = BigBuf_get_addr(); + uint32_t start_time = 0; + TransmitTo15693Tag(ts->buf, ts->max, &start_time); - uint32_t time_start = GetCountSspClk(); - uint8_t cmd[CMD_ID_RESP] = {0}; - BuildIdentifyRequest(cmd); + // wait for last transfer to complete + while (!(AT91C_BASE_SSC->SSC_SR & AT91C_SSC_TXEMPTY)) ; - // sending command - c = 0; - for (;;) { - WDT_HIT(); - - if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) { - AT91C_BASE_SSC->SSC_THR = ToSend[c]; - c++; - if (c == ToSendMax + 3) { - break; - } - } - } - - - LogTrace(cmd, CMD_ID_RESP, time_start << 4, (GetCountSspClk() - time_start) << 4, NULL, true); - - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR); - - c = 0; - for (;;) { - WDT_HIT(); + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_SUBCARRIER_424_KHZ | FPGA_HF_READER_MODE_RECEIVE_AMPLITUDE); + for (int c = 0; c < 4000;) { if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) { - - ci = (int8_t)AT91C_BASE_SSC->SSC_RHR; - ci = ABS(ci); - - // The samples are correlations against I and Q versions of the - // tone that the tag AM-modulates, so every other sample is I, - // every other is Q. We just want power, so abs(I) + abs(Q) is - // close to what we want. - // iceman 2016, amplitude sqrt(abs(i) + abs(q)) - if (getNext) { - - buf[c++] = (uint8_t)(MAX(ci, cq) + (MIN(ci, cq) >> 1)); - - if (c >= 7000) break; - - } else { - cq = ci; - } - getNext = !getNext; - } - } -} - -// switch_off, initreader, no logging -void RecordRawAdcSamplesIso15693(void) { - - int c = 0, getNext = false; - int ci, cq = 0; - - Iso15693InitReader(); - - uint8_t *buf = BigBuf_get_addr(); - - for (;;) { - WDT_HIT(); - - if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) { - - ci = (int8_t)AT91C_BASE_SSC->SSC_RHR; - ci = ABS(ci); - // The samples are correlations against I and Q versions of the - // tone that the tag AM-modulates, so every other sample is I, - // every other is Q. We just want power, so abs(I) + abs(Q) is - // close to what we want. - if (getNext) { - - buf[c++] = (uint8_t)(MAX(ci, cq) + (MIN(ci, cq) >> 1)); - - if (c >= 7000) - break; - } else { - cq = ci; - } - - getNext = !getNext; + uint16_t r = AT91C_BASE_SSC->SSC_RHR; + dest[c++] = r >> 5; } } - Dbprintf("done"); - switch_off(); -} - -// Initialize the proxmark as iso15k reader -// (this might produces glitches that confuse some tags -void Iso15693InitReader(void) { + FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); LEDsoff(); +} + +void SniffIso15693(uint8_t jam_search_len, uint8_t *jam_search_string) { + + LEDsoff(); + LED_A_ON(); + + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); + + DbpString("Starting to sniff. Press PM3 Button to stop."); + + BigBuf_free(); clear_trace(); set_tracing(true); + DecodeTag_t dtag = {0}; + uint8_t response[ISO15693_MAX_RESPONSE_LENGTH] = {0}; + DecodeTagInit(&dtag, response, sizeof(response)); + + DecodeReader_t dreader = {0}; + uint8_t cmd[ISO15693_MAX_COMMAND_LENGTH] = {0}; + DecodeReaderInit(&dreader, cmd, sizeof(cmd), jam_search_len, jam_search_string); + + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_MODE_SNIFF_AMPLITUDE); + LED_D_OFF(); + + SetAdcMuxFor(GPIO_MUXSEL_HIPKD); + FpgaSetupSsc(FPGA_MAJOR_MODE_HF_READER); + + StartCountSspClk(); + + // The DMA buffer, used to stream samples from the FPGA + dmabuf16_t *dma = get_dma16(); + + // Setup and start DMA. + if (FpgaSetupSscDma((uint8_t *) dma->buf, DMA_BUFFER_SIZE) == false) { + if (DBGLEVEL > DBG_ERROR) DbpString("FpgaSetupSscDma failed. Exiting"); + switch_off(); + return; + } + + bool tag_is_active = false; + bool reader_is_active = false; + bool expect_tag_answer = false; + int dma_start_time = 0; + + // Count of samples received so far, so that we can include timing + int samples = 0; + + uint16_t *upTo = dma->buf; + + for (;;) { + + volatile int behind_by = ((uint16_t *)AT91C_BASE_PDC_SSC->PDC_RPR - upTo) & (DMA_BUFFER_SIZE - 1); + if (behind_by < 1) continue; + + samples++; + if (samples == 1) { + // DMA has transferred the very first data + dma_start_time = GetCountSspClk() & 0xfffffff0; + } + + volatile uint16_t sniffdata = *upTo++; + + // we have read all of the DMA buffer content + if (upTo >= dma->buf + DMA_BUFFER_SIZE) { + + // start reading the circular buffer from the beginning + upTo = dma->buf; + + // DMA Counter Register had reached 0, already rotated. + if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_ENDRX)) { + + // primary buffer was stopped + if (AT91C_BASE_PDC_SSC->PDC_RCR == false) { + AT91C_BASE_PDC_SSC->PDC_RPR = (uint32_t) dma->buf; + AT91C_BASE_PDC_SSC->PDC_RCR = DMA_BUFFER_SIZE; + } + // secondary buffer sets as primary, secondary buffer was stopped + if (AT91C_BASE_PDC_SSC->PDC_RNCR == false) { + AT91C_BASE_PDC_SSC->PDC_RNPR = (uint32_t) dma->buf; + AT91C_BASE_PDC_SSC->PDC_RNCR = DMA_BUFFER_SIZE; + } + + WDT_HIT(); + if (BUTTON_PRESS()) { + DbpString("Sniff stopped"); + break; + } + } + } + + // no need to try decoding reader data if the tag is sending + if (tag_is_active == false) { + + if (Handle15693SampleFromReader((sniffdata & 0x02) >> 1, &dreader)) { + + uint32_t eof_time = dma_start_time + (samples * 16) + 8 - DELAY_READER_TO_ARM_SNIFF; // end of EOF + if (dreader.byteCount > 0) { + uint32_t sof_time = eof_time + - dreader.byteCount * (dreader.Coding == CODING_1_OUT_OF_4 ? 128 * 16 : 2048 * 16) // time for byte transfers + - 32 * 16 // time for SOF transfer + - 16 * 16; // time for EOF transfer + LogTrace_ISO15693(dreader.output, dreader.byteCount, (sof_time * 4), (eof_time * 4), NULL, true); + } + // And ready to receive another command. + DecodeReaderReset(&dreader); + DecodeTagReset(&dtag); + reader_is_active = false; + expect_tag_answer = true; + + } else if (Handle15693SampleFromReader(sniffdata & 0x01, &dreader)) { + + uint32_t eof_time = dma_start_time + (samples * 16) + 16 - DELAY_READER_TO_ARM_SNIFF; // end of EOF + if (dreader.byteCount > 0) { + uint32_t sof_time = eof_time + - dreader.byteCount * (dreader.Coding == CODING_1_OUT_OF_4 ? 128 * 16 : 2048 * 16) // time for byte transfers + - 32 * 16 // time for SOF transfer + - 16 * 16; // time for EOF transfer + LogTrace_ISO15693(dreader.output, dreader.byteCount, (sof_time * 4), (eof_time * 4), NULL, true); + } + // And ready to receive another command + DecodeReaderReset(&dreader); + DecodeTagReset(&dtag); + reader_is_active = false; + expect_tag_answer = true; + + } else { + reader_is_active = (dreader.state >= STATE_READER_RECEIVE_DATA_1_OUT_OF_4); + } + } + + if (reader_is_active == false && expect_tag_answer) { // no need to try decoding tag data if the reader is currently sending or no answer expected yet + + if (Handle15693SamplesFromTag(sniffdata >> 2, &dtag)) { + + uint32_t eof_time = dma_start_time + (samples * 16) - DELAY_TAG_TO_ARM_SNIFF; // end of EOF + if (dtag.lastBit == SOF_PART2) { + eof_time -= (8 * 16); // needed 8 additional samples to confirm single SOF (iCLASS) + } + uint32_t sof_time = eof_time + - dtag.len * 8 * 8 * 16 // time for byte transfers + - (32 * 16) // time for SOF transfer + - (dtag.lastBit != SOF_PART2 ? (32 * 16) : 0); // time for EOF transfer + + LogTrace_ISO15693(dtag.output, dtag.len, (sof_time * 4), (eof_time * 4), NULL, false); + // And ready to receive another response. + DecodeTagReset(&dtag); + DecodeReaderReset(&dreader); + expect_tag_answer = false; + tag_is_active = false; + } else { + tag_is_active = (dtag.state >= STATE_TAG_RECEIVING_DATA); + } + } + + } + + FpgaDisableTracing(); + switch_off(); + + DbpString(""); + DbpString(_CYAN_("Sniff statistics")); + DbpString("================================="); + Dbprintf(" DecodeTag State........%d", dtag.state); + Dbprintf(" DecodeTag byteCnt......%d", dtag.len); + Dbprintf(" DecodeTag posCount.....%d", dtag.posCount); + Dbprintf(" DecodeReader State.....%d", dreader.state); + Dbprintf(" DecodeReader byteCnt...%d", dreader.byteCount); + Dbprintf(" DecodeReader posCount..%d", dreader.posCount); + Dbprintf(" Trace length..........." _YELLOW_("%d"), BigBuf_get_traceLen()); + DbpString(""); + +} + +// Initialize Proxmark3 as ISO15693 reader +void Iso15693InitReader(void) { + + LEDsoff(); FpgaDownloadAndGo(FPGA_BITSTREAM_HF); // Start from off (no field generated) FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); SpinDelay(10); + // switch field on + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER); + LED_D_ON(); + + // initialize SSC and select proper AD input + FpgaSetupSsc(FPGA_MAJOR_MODE_HF_READER); SetAdcMuxFor(GPIO_MUXSEL_HIPKD); - FpgaSetupSsc(); + set_tracing(true); - // Give the tags time to energize - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR); - SpinDelay(200); + // give tags some time to energize + SpinDelay(250); - // Start the timer StartCountSspClk(); - - LED_A_ON(); } /////////////////////////////////////////////////////////////////////// @@ -625,75 +1432,19 @@ void Iso15693InitReader(void) { // This section basicly contains transmission and receiving of bits /////////////////////////////////////////////////////////////////////// -// Encode (into the ToSend buffers) an identify request, which is the first +// Encode an identify request, which is the first // thing that you must send to a tag to get a response. // It expects "cmdout" to be at least CMD_ID_RESP large -static void BuildIdentifyRequest(uint8_t *cmdout) { - uint8_t cmd[CMD_ID_RESP] = {0, ISO15_CMD_INVENTORY, 0, 0, 0}; +// When READER: +static void BuildIdentifyRequest(uint8_t *cmd) { // flags cmd[0] = ISO15_REQ_SUBCARRIER_SINGLE | ISO15_REQ_DATARATE_HIGH | ISO15_REQ_INVENTORY | ISO15_REQINV_SLOT1; + // inventory command code + cmd[1] = ISO15_CMD_INVENTORY; // no mask cmd[2] = 0x00; // CRC AddCrc15(cmd, 3); - // coding as high speed (1 out of 4) - CodeIso15693AsReader(cmd, CMD_ID_RESP); - memcpy(cmdout, cmd, CMD_ID_RESP); -} - -// uid is in transmission order (which is reverse of display order) -/* -static void BuildReadBlockRequest(uint8_t **out, uint8_t *uid, uint8_t blockNumber ) { - uint8_t cmd[CMD_READ_RESP] = {0,0,0,0,0,0,0,0,0,0,0,0,0}; - // If we set the Option_Flag in this request, the VICC will respond with the secuirty status of the block - // followed by teh block data - // one sub-carrier, inventory, 1 slot, fast rate - cmd[0] = (1 << 6)| (1 << 5) | (1 << 1); // no SELECT bit, ADDR bit, OPTION bit - // READ BLOCK command code - cmd[1] = 0x20; - // UID may be optionally specified here - // 64-bit UID - cmd[2] = uid[0]; - cmd[3] = uid[1]; - cmd[4] = uid[2]; - cmd[5] = uid[3]; - cmd[6] = uid[4]; - cmd[7] = uid[5]; - cmd[8] = uid[6]; - cmd[9] = uid[7]; // 0xe0; // always e0 (not exactly unique) - // Block number to read - cmd[10] = blockNumber;//0x00; - // CRC - AddCrc15(cmd, 11); - CodeIso15693AsReader(cmd, CMD_READ_RESP); - memcpy(out, cmd, CMD_ID_RESP); -} -*/ - -// Now the VICC>VCD responses when we are simulating a tag -// It expects "out" to be at least CMD_INV_RESP large -static void BuildInventoryResponse(uint8_t *cmdout, uint8_t *uid) { - - uint8_t cmd[CMD_INV_RESP] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - - // one sub-carrier, inventory, 1 slot, fast rate - // AFI is at bit 5 (1<<4) when doing an INVENTORY - //(1 << 2) | (1 << 5) | (1 << 1); - cmd[0] = 0; // - cmd[1] = 0; // DSFID (data storage format identifier). 0x00 = not supported - // 64-bit UID - cmd[2] = uid[7]; //0x32; - cmd[3] = uid[6]; //0x4b; - cmd[4] = uid[5]; //0x03; - cmd[5] = uid[4]; //0x01; - cmd[6] = uid[3]; //0x00; - cmd[7] = uid[2]; //0x10; - cmd[8] = uid[1]; //0x05; - cmd[9] = uid[0]; //0xe0; - // CRC - AddCrc15(cmd, 10); - CodeIso15693AsReader(cmd, CMD_INV_RESP); - memcpy(cmdout, cmd, CMD_INV_RESP); } // Universal Method for sending to and recv bytes from a tag @@ -703,36 +1454,47 @@ static void BuildInventoryResponse(uint8_t *cmdout, uint8_t *uid) { // If you do not need the answer use NULL for *recv[] // return: length of received data // logging enabled -int SendDataTag(uint8_t *send, int sendlen, bool init, int speed, uint8_t *outdata) { +int SendDataTag(uint8_t *send, int sendlen, bool init, bool speed_fast, uint8_t *recv, + uint16_t max_recv_len, uint32_t start_time, uint16_t timeout, uint32_t *eof_time) { - int t_samples = 0, wait = 0, elapsed = 0, answer_len = 0; - - LEDsoff(); - - if (init) Iso15693InitReader(); - - LED_A_ON(); - - if (!speed) - CodeIso15693AsReader256(send, sendlen); // low speed (1 out of 256) - else - CodeIso15693AsReader(send, sendlen); // high speed (1 out of 4) - - LED_A_INV(); - - uint32_t time_start = GetCountSspClk(); - - TransmitTo15693Tag(ToSend, ToSendMax, &t_samples, &wait); - LogTrace(send, sendlen, time_start << 4, (GetCountSspClk() - time_start) << 4, NULL, true); - - // Now wait for a response - if (outdata != NULL) { - LED_B_INV(); - answer_len = GetIso15693AnswerFromTag(outdata, &elapsed); + if (init) { + Iso15693InitReader(); + start_time = GetCountSspClk(); } - LEDsoff(); - return answer_len; + if (speed_fast) { + // high speed (1 out of 4) + CodeIso15693AsReader(send, sendlen); + } else { + // low speed (1 out of 256) + CodeIso15693AsReader256(send, sendlen); + } + + tosend_t *ts = get_tosend(); + TransmitTo15693Tag(ts->buf, ts->max, &start_time); + *eof_time = start_time + 32 * ((8 * ts->max) - 4); // substract the 4 padding bits after EOF + LogTrace_ISO15693(send, sendlen, (start_time * 4), (*eof_time * 4), NULL, true); + + int res = 0; + if (recv != NULL) { + res = GetIso15693AnswerFromTag(recv, max_recv_len, timeout, eof_time); + } + return res; +} + +int SendDataTagEOF(uint8_t *recv, uint16_t max_recv_len, uint32_t start_time, uint16_t timeout, uint32_t *eof_time) { + + CodeIso15693AsReaderEOF(); + tosend_t *ts = get_tosend(); + TransmitTo15693Tag(ts->buf, ts->max, &start_time); + uint32_t end_time = start_time + 32 * (8 * ts->max - 4); // substract the 4 padding bits after EOF + LogTrace_ISO15693(NULL, 0, (start_time * 4), (end_time * 4), NULL, true); + + int res = 0; + if (recv != NULL) { + res = GetIso15693AnswerFromTag(recv, max_recv_len, timeout, eof_time); + } + return res; } // -------------------------------------------------------------------- @@ -741,13 +1503,16 @@ int SendDataTag(uint8_t *send, int sendlen, bool init, int speed, uint8_t *outda // Decodes a message from a tag and displays its metadata and content #define DBD15STATLEN 48 -void DbdecodeIso15693Answer(int len, uint8_t *d) { +static void DbdecodeIso15693Answer(int len, uint8_t *d) { if (len > 3) { + char status[DBD15STATLEN + 1] = {0}; - if (d[0] & (1 << 3)) + + if (d[0] & ISO15_RES_EXT) strncat(status, "ProtExt ", DBD15STATLEN - strlen(status)); - if (d[0] & 1) { + + if (d[0] & ISO15_RES_ERROR) { // error strncat(status, "Error ", DBD15STATLEN - strlen(status)); switch (d[1]) { @@ -787,9 +1552,9 @@ void DbdecodeIso15693Answer(int len, uint8_t *d) { } if (CheckCrc15(d, len)) - strncat(status, "[+] crc OK", DBD15STATLEN - strlen(status)); + strncat(status, "[+] crc (" _GREEN_("OK") ")", DBD15STATLEN - strlen(status)); else - strncat(status, "[!] crc fail", DBD15STATLEN - strlen(status)); + strncat(status, "[!] crc (" _RED_("fail") ")", DBD15STATLEN - strlen(status)); if (DBGLEVEL >= DBG_ERROR) Dbprintf("%s", status); } @@ -806,41 +1571,35 @@ void DbdecodeIso15693Answer(int len, uint8_t *d) { // ok // parameter is unused !?! void ReaderIso15693(uint32_t parameter) { - int answerLen1 = 0; - int tsamples = 0, wait = 0, elapsed = 0; - // set up device/fpga - Iso15693InitReader(); - uint8_t *answer1 = BigBuf_malloc(50); - uint8_t *answer2 = BigBuf_malloc(50); + LED_A_ON(); + set_tracing(true); - // Blank arrays - memset(answer1, 0x00, 50); - memset(answer2, 0x00, 50); + uint8_t *answer = BigBuf_malloc(ISO15693_MAX_RESPONSE_LENGTH); + memset(answer, 0x00, ISO15693_MAX_RESPONSE_LENGTH); - // Now send the IDENTIFY command // FIRST WE RUN AN INVENTORY TO GET THE TAG UID // THIS MEANS WE CAN PRE-BUILD REQUESTS TO SAVE CPU TIME - uint32_t time_start = GetCountSspClk(); - uint8_t cmd[CMD_ID_RESP] = {0}; - BuildIdentifyRequest(cmd); - TransmitTo15693Tag(ToSend, ToSendMax, &tsamples, &wait); - LogTrace(cmd, CMD_ID_RESP, time_start << 4, (GetCountSspClk() - time_start) << 4, NULL, true); - // Now wait for a response - answerLen1 = GetIso15693AnswerFromTag(answer1, &elapsed) ; + // Send the IDENTIFY command + uint8_t cmd[5] = {0}; + BuildIdentifyRequest(cmd); + uint32_t start_time = 0; + uint32_t eof_time; + int answerLen = SendDataTag(cmd, sizeof(cmd), true, true, answer, ISO15693_MAX_RESPONSE_LENGTH, start_time, ISO15693_READER_TIMEOUT, &eof_time); + start_time = eof_time + DELAY_ISO15693_VICC_TO_VCD_READER; // we should do a better check than this - if (answerLen1 >= 12) { + if (answerLen >= 12) { uint8_t uid[8]; - uid[0] = answer1[9]; // always E0 - uid[1] = answer1[8]; // IC Manufacturer code - uid[2] = answer1[7]; - uid[3] = answer1[6]; - uid[4] = answer1[5]; - uid[5] = answer1[4]; - uid[6] = answer1[3]; - uid[7] = answer1[2]; + uid[0] = answer[9]; // always E0 + uid[1] = answer[8]; // IC Manufacturer code + uid[2] = answer[7]; + uid[3] = answer[6]; + uid[4] = answer[5]; + uid[5] = answer[4]; + uid[6] = answer[3]; + uid[7] = answer[2]; if (DBGLEVEL >= DBG_EXTENDED) { Dbprintf("[+] UID = %02X%02X%02X%02X%02X%02X%02X%02X", @@ -853,82 +1612,140 @@ void ReaderIso15693(uint32_t parameter) { // arg1 = len of response (12 bytes) // arg2 = rtf // asbytes = uid. - reply_old(CMD_ACK, 1, sizeof(uid), 0, uid, sizeof(uid)); + reply_mix(CMD_ACK, 1, sizeof(uid), 0, uid, sizeof(uid)); } if (DBGLEVEL >= DBG_EXTENDED) { - Dbprintf("[+] %d octets read from IDENTIFY request:", answerLen1); - DbdecodeIso15693Answer(answerLen1, answer1); - Dbhexdump(answerLen1, answer1, true); + Dbprintf("[+] %d octets read from IDENTIFY request:", answerLen); + DbdecodeIso15693Answer(answerLen, answer); + Dbhexdump(answerLen, answer, true); } switch_off(); + BigBuf_free(); +} + +// When SIM: initialize the Proxmark3 as ISO15693 tag +void Iso15693InitTag(void) { + + FpgaDownloadAndGo(FPGA_BITSTREAM_HF); + + // Start from off (no field generated) + FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); + LEDsoff(); + SpinDelay(10); + + // switch simulation FPGA + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_SIMULATOR | FPGA_HF_SIMULATOR_NO_MODULATION); + + // initialize SSC and select proper AD input + FpgaSetupSsc(FPGA_MAJOR_MODE_HF_SIMULATOR); + SetAdcMuxFor(GPIO_MUXSEL_HIPKD); + + clear_trace(); + set_tracing(true); + + StartCountSspClk(); } // Simulate an ISO15693 TAG, perform anti-collision and then print any reader commands // all demodulation performed in arm rather than host. - greg -void SimTagIso15693(uint32_t parameter, uint8_t *uid) { +void SimTagIso15693(uint8_t *uid) { - LEDsoff(); - FpgaDownloadAndGo(FPGA_BITSTREAM_HF); - SetAdcMuxFor(GPIO_MUXSEL_HIPKD); - FpgaSetupSsc(); - // Start from off (no field generated) - FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - SpinDelay(200); + // free eventually allocated BigBuf memory + BigBuf_free_keep_EM(); + + Iso15693InitTag(); LED_A_ON(); - uint32_t time_start; - int samples = 0, tsamples = 0; - int wait = 0, elapsed = 0; - Dbprintf("ISO-15963 Simulating uid: %02X%02X%02X%02X%02X%02X%02X%02X", uid[0], uid[1], uid[2], uid[3], uid[4], uid[5], uid[6], uid[7]); - uint8_t buf[ISO15_MAX_FRAME]; - memset(buf, 0x00, sizeof(buf)); - LED_C_ON(); - // Build a suitable reponse to the reader INVENTORY cocmmand - // not so obsvious, but in the call to BuildInventoryResponse, the command is copied to the global ToSend buffer used below. - uint8_t cmd[CMD_INV_RESP] = {0}; - BuildInventoryResponse(cmd, uid); + // Build INVENTORY command + uint8_t resp_inv[CMD_INV_RESP] = {0}; - while (!BUTTON_PRESS() && !data_available()) { + resp_inv[0] = 0; // No error, no protocol format extension + resp_inv[1] = 0; // DSFID (data storage format identifier). 0x00 = not supported + + // 64-bit UID + resp_inv[2] = uid[7]; + resp_inv[3] = uid[6]; + resp_inv[4] = uid[5]; + resp_inv[5] = uid[4]; + resp_inv[6] = uid[3]; + resp_inv[7] = uid[2]; + resp_inv[8] = uid[1]; + resp_inv[9] = uid[0]; + + // CRC + AddCrc15(resp_inv, 10); + CodeIso15693AsTag(resp_inv, CMD_INV_RESP); + + tosend_t *ts = get_tosend(); + + enum { NO_FIELD, IDLE, ACTIVATED, SELECTED, HALTED } chip_state = NO_FIELD; + + bool button_pressed = false; + int vHf = 0; // in mV + + bool exit_loop = false; + while (exit_loop == false) { WDT_HIT(); - // Listen to reader - int ans = GetIso15693AnswerFromSniff(buf, &samples, &elapsed) ; + // find reader field + if (chip_state == NO_FIELD) { - // we should do a better check than this - if (ans >= 1) { - - time_start = GetCountSspClk(); - TransmitTo15693Reader(ToSend, ToSendMax, &tsamples, &wait); - LogTrace(cmd, CMD_INV_RESP, time_start << 4, (GetCountSspClk() - time_start) << 4, NULL, true); - - if (DBGLEVEL >= DBG_EXTENDED) { - Dbprintf("[+] %d octets read from reader command: %x %x %x %x %x %x %x %x", ans, - buf[0], buf[1], buf[2], buf[3], - buf[4], buf[5], buf[6], buf[7] - ); +#if defined RDV4 + vHf = (MAX_ADC_HF_VOLTAGE_RDV40 * SumAdc(ADC_CHAN_HF_RDV40, 32)) >> 15; +#else + vHf = (MAX_ADC_HF_VOLTAGE * SumAdc(ADC_CHAN_HF, 32)) >> 15; +#endif + if (vHf > MF_MINFIELDV) { + chip_state = IDLE; + LED_A_ON(); + } else { + continue; } } + + // Listen to reader + uint8_t cmd[ISO15693_MAX_COMMAND_LENGTH]; + uint32_t reader_eof_time = 0; + int cmd_len = GetIso15693CommandFromReader(cmd, sizeof(cmd), &reader_eof_time); + if (cmd_len < 0) { + Dbprintf("button pressed, exiting"); + button_pressed = true; + exit_loop = true; + break; + } + + // TODO: check more flags + if ((cmd_len >= 5) && (cmd[0] & ISO15_REQ_INVENTORY) && (cmd[1] == ISO15_CMD_INVENTORY)) { + bool slow = !(cmd[0] & ISO15_REQ_DATARATE_HIGH); + uint32_t response_time = reader_eof_time + DELAY_ISO15693_VCD_TO_VICC_SIM; + TransmitTo15693Reader(ts->buf, ts->max, &response_time, 0, slow); + LogTrace_ISO15693(resp_inv, CMD_INV_RESP, response_time * 32, (response_time * 32) + (ts->max * 32 * 64), NULL, false); + + chip_state = SELECTED; + } } + switch_off(); + + if (button_pressed) + DbpString("button pressed"); + + reply_ng(CMD_HF_ISO15693_SIMULATE, PM3_SUCCESS, NULL, 0); } // Since there is no standardized way of reading the AFI out of a tag, we will brute force it // (some manufactures offer a way to read the AFI, though) void BruteforceIso15693Afi(uint32_t speed) { - uint8_t data[7] = {0, 0, 0, 0, 0, 0, 0}; - uint8_t buf[ISO15_MAX_FRAME]; - memset(buf, 0x00, sizeof(buf)); - int datalen = 0, recvlen = 0; - bool aborted = false; - + uint8_t data[7] = {0}; + uint8_t recv[ISO15693_MAX_RESPONSE_LENGTH]; Iso15693InitReader(); // first without AFI @@ -938,31 +1755,40 @@ void BruteforceIso15693Afi(uint32_t speed) { data[1] = ISO15_CMD_INVENTORY; data[2] = 0; // AFI AddCrc15(data, 3); - datalen = 5; - recvlen = SendDataTag(data, datalen, false, speed, buf); + + int datalen = 5; + uint32_t eof_time = 0; + uint32_t start_time = GetCountSspClk(); + int recvlen = SendDataTag(data, datalen, true, speed, recv, sizeof(recv), 0, ISO15693_READER_TIMEOUT, &eof_time); + start_time = eof_time + DELAY_ISO15693_VICC_TO_VCD_READER; WDT_HIT(); if (recvlen >= 12) { - Dbprintf("NoAFI UID = %s", iso15693_sprintUID(NULL, buf + 2)); + Dbprintf("NoAFI UID = %s", iso15693_sprintUID(NULL, recv + 2)); } // now with AFI data[0] |= ISO15_REQINV_AFI; - //data[1] = ISO15_CMD_INVENTORY; data[2] = 0; // AFI data[3] = 0; // mask length // 4 + 2crc datalen = 6; + bool aborted = false; for (uint16_t i = 0; i < 256; i++) { + data[2] = i & 0xFF; AddCrc15(data, 4); - recvlen = SendDataTag(data, datalen, false, speed, buf); + + recvlen = SendDataTag(data, datalen, false, speed, recv, sizeof(recv), start_time, ISO15693_READER_TIMEOUT, &eof_time); + start_time = eof_time + DELAY_ISO15693_VICC_TO_VCD_READER; + WDT_HIT(); + if (recvlen >= 12) { - Dbprintf("AFI = %i UID = %s", i, iso15693_sprintUID(NULL, buf + 2)); + Dbprintf("AFI = %i UID = %s", i, iso15693_sprintUID(NULL, recv + 2)); } aborted = BUTTON_PRESS(); @@ -984,34 +1810,230 @@ void BruteforceIso15693Afi(uint32_t speed) { } // Allows to directly send commands to the tag via the client -// Has to increase dialog between device and client. +// OBS: doesn't turn off rf field afterwards. void DirectTag15693Command(uint32_t datalen, uint32_t speed, uint32_t recv, uint8_t *data) { - bool init = true; - int buflen = 0; - uint8_t buf[ISO15_MAX_FRAME]; - memset(buf, 0x00, sizeof(buf)); + LED_A_ON(); + + int recvlen = 0; + uint8_t recvbuf[ISO15693_MAX_RESPONSE_LENGTH]; + uint32_t eof_time = 0; + uint16_t timeout; + bool request_answer = false; + + switch (data[1]) { + case ISO15_CMD_WRITE: + case ISO15_CMD_LOCK: + case ISO15_CMD_WRITEMULTI: + case ISO15_CMD_WRITEAFI: + case ISO15_CMD_LOCKAFI: + case ISO15_CMD_WRITEDSFID: + case ISO15_CMD_LOCKDSFID: + timeout = ISO15693_READER_TIMEOUT_WRITE; + request_answer = data[0] & ISO15_REQ_OPTION; + break; + default: + timeout = ISO15693_READER_TIMEOUT; + } if (DBGLEVEL >= DBG_EXTENDED) { - DbpString("[+] SEND"); - Dbhexdump(datalen, data, true); + Dbprintf("SEND:"); + Dbhexdump(datalen, data, false); } - buflen = SendDataTag(data, datalen, init, speed, (recv ? buf : NULL)); + uint32_t start_time = 0; + recvlen = SendDataTag(data, datalen, true, speed, (recv ? recvbuf : NULL), sizeof(recvbuf), start_time, timeout, &eof_time); + + // send a single EOF to get the tag response + if (request_answer) { + start_time = eof_time + DELAY_ISO15693_VICC_TO_VCD_READER; + recvlen = SendDataTagEOF((recv ? recvbuf : NULL), sizeof(recvbuf), start_time, ISO15693_READER_TIMEOUT, &eof_time); + } + + // for the time being, switch field off to protect rdv4.0 + // note: this prevents using hf 15 cmd with s option - which isn't implemented yet anyway + FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); + LED_D_OFF(); if (recv) { - buflen = (buflen > ISO15_MAX_FRAME) ? ISO15_MAX_FRAME : buflen; - LED_B_ON(); - reply_old(CMD_ACK, buflen, 0, 0, buf, buflen); - LED_B_OFF(); + if (recvlen > ISO15693_MAX_RESPONSE_LENGTH) { + recvlen = ISO15693_MAX_RESPONSE_LENGTH; + } + reply_mix(CMD_ACK, recvlen, 0, 0, recvbuf, recvlen); if (DBGLEVEL >= DBG_EXTENDED) { - DbpString("[+] RECV"); - DbdecodeIso15693Answer(buflen, buf); - Dbhexdump(buflen, buf, true); + + Dbprintf("RECV:"); + if (recvlen > 0) { + Dbhexdump(recvlen, recvbuf, false); + DbdecodeIso15693Answer(recvlen, recvbuf); + } } } else { - reply_old(CMD_ACK, 1, 0, 0, 0, 0); + reply_mix(CMD_ACK, 1, 0, 0, 0, 0); } } + +/* +SLIx functions from official master forks. + +void LockPassSlixIso15693(uint32_t pass_id, uint32_t password) { + + LED_A_ON(); + + uint8_t cmd_inventory[] = {ISO15693_REQ_DATARATE_HIGH | ISO15693_REQ_INVENTORY | ISO15693_REQINV_SLOT1, 0x01, 0x00, 0x00, 0x00 }; + uint8_t cmd_get_rnd[] = {ISO15693_REQ_DATARATE_HIGH, 0xB2, 0x04, 0x00, 0x00 }; + uint8_t cmd_set_pass[] = {ISO15693_REQ_DATARATE_HIGH, 0xB3, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + //uint8_t cmd_write_pass[] = {ISO15693_REQ_DATARATE_HIGH | ISO15693_REQ_ADDRESS, 0xB4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + uint8_t cmd_lock_pass[] = {ISO15693_REQ_DATARATE_HIGH | ISO15693_REQ_ADDRESS, 0xB5, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00 }; + uint16_t crc; + int recvlen = 0; + uint8_t recvbuf[ISO15693_MAX_RESPONSE_LENGTH]; + uint32_t start_time = 0; + bool done = false; + + // setup 'get random number' command + crc = Iso15693Crc(cmd_get_rnd, 3); + cmd_get_rnd[3] = crc & 0xff; + cmd_get_rnd[4] = crc >> 8; + + Dbprintf("LockPass: Press button lock password, long-press to terminate."); + + while (!done) { + + LED_D_ON(); + switch(BUTTON_HELD(1000)) { + case BUTTON_SINGLE_CLICK: + Dbprintf("LockPass: Reset 'DONE'-LED (A)"); + LED_A_OFF(); + LED_B_OFF(); + LED_C_OFF(); + break; + case BUTTON_HOLD: + Dbprintf("LockPass: Terminating"); + done = true; + break; + default: + SpinDelay(50); + continue; + } + + if (done) [ + break; + } + + recvlen = SendDataTag(cmd_get_rnd, sizeof(cmd_get_rnd), true, true, recvbuf, sizeof(recvbuf), start_time); + if (recvlen != 5) { + LED_C_ON(); + } else { + Dbprintf("LockPass: Received random 0x%02X%02X (%d)", recvbuf[1], recvbuf[2], recvlen); + + // setup 'set password' command + cmd_set_pass[4] = ((password>>0) &0xFF) ^ recvbuf[1]; + cmd_set_pass[5] = ((password>>8) &0xFF) ^ recvbuf[2]; + cmd_set_pass[6] = ((password>>16) &0xFF) ^ recvbuf[1]; + cmd_set_pass[7] = ((password>>24) &0xFF) ^ recvbuf[2]; + + crc = Iso15693Crc(cmd_set_pass, 8); + cmd_set_pass[8] = crc & 0xff; + cmd_set_pass[9] = crc >> 8; + + Dbprintf("LockPass: Sending old password to end privacy mode", cmd_set_pass[4], cmd_set_pass[5], cmd_set_pass[6], cmd_set_pass[7]); + recvlen = SendDataTag(cmd_set_pass, sizeof(cmd_set_pass), false, true, recvbuf, sizeof(recvbuf), start_time); + if (recvlen != 3) { + Dbprintf("LockPass: Failed to set password (%d)", recvlen); + LED_B_ON(); + } else { + crc = Iso15693Crc(cmd_inventory, 3); + cmd_inventory[3] = crc & 0xff; + cmd_inventory[4] = crc >> 8; + + Dbprintf("LockPass: Searching for tag..."); + recvlen = SendDataTag(cmd_inventory, sizeof(cmd_inventory), false, true, recvbuf, sizeof(recvbuf), start_time); + if (recvlen != 12) { + Dbprintf("LockPass: Failed to read inventory (%d)", recvlen); + LED_B_ON(); + LED_C_ON(); + } else { + + Dbprintf("LockPass: Answer from %02X%02X%02X%02X%02X%02X%02X%02X", recvbuf[9], recvbuf[8], recvbuf[7], recvbuf[6], recvbuf[5], recvbuf[4], recvbuf[3], recvbuf[2]); + + memcpy(&cmd_lock_pass[3], &recvbuf[2], 8); + + cmd_lock_pass[8+3] = pass_id; + + crc = Iso15693Crc(cmd_lock_pass, 8+4); + cmd_lock_pass[8+4] = crc & 0xff; + cmd_lock_pass[8+5] = crc >> 8; + + Dbprintf("LockPass: locking to password 0x%02X%02X%02X%02X for ID %02X", cmd_set_pass[4], cmd_set_pass[5], cmd_set_pass[6], cmd_set_pass[7], pass_id); + + recvlen = SendDataTag(cmd_lock_pass, sizeof(cmd_lock_pass), false, true, recvbuf, sizeof(recvbuf), start_time); + if (recvlen != 3) { + Dbprintf("LockPass: Failed to lock password (%d)", recvlen); + } else { + Dbprintf("LockPass: Successful (%d)", recvlen); + } + LED_A_ON(); + } + } } + } + + Dbprintf("LockPass: Finishing"); + FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); + + cmd_send(CMD_ACK, recvlen, 0, 0, recvbuf, recvlen); + LED_A_OFF(); + LED_B_OFF(); + LED_C_OFF(); + LED_D_OFF(); +} +*/ + +//----------------------------------------------------------------------------- +// Work with "magic Chinese" card. +// +//----------------------------------------------------------------------------- + +// Set the UID on Magic ISO15693 tag (based on Iceman's LUA-script). +void SetTag15693Uid(uint8_t *uid) { + + LED_A_ON(); + + uint8_t cmd[4][9] = { + {ISO15_REQ_DATARATE_HIGH, ISO15_CMD_WRITE, 0x3e, 0x00, 0x00, 0x00, 0x00}, + {ISO15_REQ_DATARATE_HIGH, ISO15_CMD_WRITE, 0x3f, 0x69, 0x96, 0x00, 0x00}, + {ISO15_REQ_DATARATE_HIGH, ISO15_CMD_WRITE, 0x38}, + {ISO15_REQ_DATARATE_HIGH, ISO15_CMD_WRITE, 0x39} + }; + + // Command 3 : 02 21 38 u8u7u6u5 (where uX = uid byte X) + cmd[2][3] = uid[7]; + cmd[2][4] = uid[6]; + cmd[2][5] = uid[5]; + cmd[2][6] = uid[4]; + + // Command 4 : 02 21 39 u4u3u2u1 (where uX = uid byte X) + cmd[3][3] = uid[3]; + cmd[3][4] = uid[2]; + cmd[3][5] = uid[1]; + cmd[3][6] = uid[0]; + + AddCrc15(cmd[0], 7); + AddCrc15(cmd[1], 7); + AddCrc15(cmd[2], 7); + AddCrc15(cmd[3], 7); + + uint8_t recvbuf[ISO15693_MAX_RESPONSE_LENGTH]; + + uint32_t start_time = 0; + uint32_t eof_time = 0; + for (int i = 0; i < 4; i++) { + SendDataTag(cmd[i], sizeof(cmd[i]), i == 0 ? true : false, true, recvbuf, sizeof(recvbuf), start_time, ISO15693_READER_TIMEOUT_WRITE, &eof_time); + start_time = eof_time + DELAY_ISO15693_VICC_TO_VCD_READER; + } + + reply_ng(CMD_HF_ISO15693_CSETUID, PM3_SUCCESS, NULL, 0); + switch_off(); +} \ No newline at end of file diff --git a/armsrc/iso15693.h b/armsrc/iso15693.h index 2233ba9fd..168cee42c 100644 --- a/armsrc/iso15693.h +++ b/armsrc/iso15693.h @@ -12,15 +12,41 @@ #define __ISO15693_H #include "common.h" - #include "pm3_cmd.h" // struct -void RecordRawAdcSamplesIso15693(void); + +// Delays in SSP_CLK ticks. +// SSP_CLK runs at 13,56MHz / 32 = 423.75kHz when simulating a tag +#define DELAY_ISO15693_VCD_TO_VICC_SIM 132 // 132/423.75kHz = 311.5us from end of command EOF to start of tag response + +//SSP_CLK runs at 13.56MHz / 4 = 3,39MHz when acting as reader. All values should be multiples of 16 +#define DELAY_ISO15693_VCD_TO_VICC_READER 1056 // 1056/3,39MHz = 311.5us from end of command EOF to start of tag response +#define DELAY_ISO15693_VICC_TO_VCD_READER 1024 // 1024/3.39MHz = 302.1us between end of tag response and next reader command + +void Iso15693InitReader(void); +void Iso15693InitTag(void); +void CodeIso15693AsReader(uint8_t *cmd, int n); +void CodeIso15693AsTag(uint8_t *cmd, size_t len); + +void TransmitTo15693Reader(const uint8_t *cmd, size_t len, uint32_t *start_time, uint32_t slot_time, bool slow); +int GetIso15693CommandFromReader(uint8_t *received, size_t max_len, uint32_t *eof_time); +void TransmitTo15693Tag(const uint8_t *cmd, int len, uint32_t *start_time); +int GetIso15693AnswerFromTag(uint8_t *response, uint16_t max_len, uint16_t timeout, uint32_t *eof_time); + +//void RecordRawAdcSamplesIso15693(void); void AcquireRawAdcSamplesIso15693(void); void ReaderIso15693(uint32_t parameter); // Simulate an ISO15693 reader - greg -void SimTagIso15693(uint32_t parameter, uint8_t *uid); // simulate an ISO15693 tag - greg +void SimTagIso15693(uint8_t *uid); // simulate an ISO15693 tag - greg void BruteforceIso15693Afi(uint32_t speed); // find an AFI of a tag - atrox void DirectTag15693Command(uint32_t datalen, uint32_t speed, uint32_t recv, uint8_t *data); // send arbitrary commands from CLI - atrox void Iso15693InitReader(void); +void SniffIso15693(uint8_t jam_search_len, uint8_t *jam_search_string); + +int SendDataTag(uint8_t *send, int sendlen, bool init, bool speed_fast, uint8_t *recv, + uint16_t max_recv_len, uint32_t start_time, uint16_t timeout, uint32_t *eof_time); + +int SendDataTagEOF(uint8_t *recv, uint16_t max_recv_len, uint32_t start_time, uint16_t timeout, uint32_t *eof_time); + +void SetTag15693Uid(uint8_t *uid); #endif diff --git a/armsrc/legicrf.c b/armsrc/legicrf.c index 35ac379ad..1d2693347 100644 --- a/armsrc/legicrf.c +++ b/armsrc/legicrf.c @@ -64,8 +64,7 @@ static uint32_t last_frame_end; /* ts of last bit of previews rx or tx frame */ //----------------------------------------------------------------------------- // I/O interface abstraction (FPGA -> ARM) //----------------------------------------------------------------------------- - -static inline uint8_t rx_byte_from_fpga() { +static uint8_t rx_byte_from_fpga(void) { for (;;) { WDT_HIT(); @@ -92,7 +91,8 @@ static inline uint8_t rx_byte_from_fpga() { // // Note: The SSC receiver is never synchronized the calculation may be performed // on a i/q pair from two subsequent correlations, but does not matter. -static inline int32_t sample_power() { +// Note: inlining this function would fail with -Os +static int32_t sample_power(void) { int32_t q = (int8_t)rx_byte_from_fpga(); q = ABS(q); int32_t i = (int8_t)rx_byte_from_fpga(); @@ -108,7 +108,9 @@ static inline int32_t sample_power() { // // Note: The demodulator would be drifting (18.9us * 5 != 100us), rx_frame // has a delay loop that aligns rx_bit calls to the TAG tx timeslots. -static inline bool rx_bit() { + +// Note: inlining this function would fail with -Os +static bool rx_bit(void) { int32_t power; for (size_t i = 0; i < 5; ++i) { @@ -127,7 +129,7 @@ static inline bool rx_bit() { // be circumvented, but the adventage over bitbang would be little. //----------------------------------------------------------------------------- -static inline void tx_bit(bool bit) { +static void tx_bit(bool bit) { // insert pause LOW(GPIO_SSC_DOUT); last_frame_end += RWD_TIME_PAUSE; @@ -150,7 +152,7 @@ static inline void tx_bit(bool bit) { //----------------------------------------------------------------------------- static void tx_frame(uint32_t frame, uint8_t len) { - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_TX); + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_MODE_SEND_FULL_MOD); // wait for next tx timeslot last_frame_end += RWD_FRAME_WAIT; @@ -178,9 +180,7 @@ static void tx_frame(uint32_t frame, uint8_t len) { } static uint32_t rx_frame(uint8_t len) { - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR - | FPGA_HF_READER_RX_XCORR_848_KHZ - | FPGA_HF_READER_RX_XCORR_QUARTER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_SUBCARRIER_212_KHZ | FPGA_HF_READER_MODE_RECEIVE_IQ); // hold sampling until card is expected to respond last_frame_end += TAG_FRAME_WAIT; @@ -206,11 +206,9 @@ static uint32_t rx_frame(uint8_t len) { return frame; } -static bool rx_ack() { +static bool rx_ack(void) { // change fpga into rx mode - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR - | FPGA_HF_READER_RX_XCORR_848_KHZ - | FPGA_HF_READER_RX_XCORR_QUARTER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_SUBCARRIER_212_KHZ | FPGA_HF_READER_MODE_RECEIVE_IQ); // hold sampling until card is expected to respond last_frame_end += TAG_FRAME_WAIT; @@ -277,14 +275,12 @@ static int init_card(uint8_t cardtype, legic_card_select_t *p_card) { static void init_reader(bool clear_mem) { // configure FPGA FpgaDownloadAndGo(FPGA_BITSTREAM_HF); - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR - | FPGA_HF_READER_RX_XCORR_848_KHZ - | FPGA_HF_READER_RX_XCORR_QUARTER); + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER | FPGA_HF_READER_SUBCARRIER_212_KHZ | FPGA_HF_READER_MODE_RECEIVE_IQ); SetAdcMuxFor(GPIO_MUXSEL_HIPKD); LED_A_ON(); // configure SSC with defaults - FpgaSetupSsc(); + FpgaSetupSsc(FPGA_MAJOR_MODE_HF_READER); // re-claim GPIO_SSC_DOUT as GPIO and enable output AT91C_BASE_PIOA->PIO_OER = GPIO_SSC_DOUT; @@ -382,7 +378,7 @@ static int16_t read_byte(uint16_t index, uint8_t cmd_sz) { // Transmit write command, wait until (3.6ms) the tag sends back an unencrypted // ACK ('1' bit) and forward the prng time based. -bool write_byte(uint16_t index, uint8_t byte, uint8_t addr_sz) { +static bool write_byte(uint16_t index, uint8_t byte, uint8_t addr_sz) { uint32_t cmd = index << 1 | LEGIC_WRITE; // prepare command uint8_t crc = calc_crc4(cmd, addr_sz + 1, byte); // calculate crc cmd |= byte << (addr_sz + 1); // append value @@ -431,7 +427,7 @@ void LegicRfInfo(void) { // read MCC and check against UID int16_t mcc = read_byte(4, card.cmdsize); - int16_t calc_mcc = CRC8Legic(card.uid, 4);; + int16_t calc_mcc = CRC8Legic(card.uid, 4); if (mcc != calc_mcc) { reply_mix(CMD_ACK, 0, 0, 0, 0, 0); goto OUT; diff --git a/armsrc/legicrfsim.c b/armsrc/legicrfsim.c index ee658f4bd..2ca65f54a 100644 --- a/armsrc/legicrfsim.c +++ b/armsrc/legicrfsim.c @@ -65,7 +65,8 @@ static uint32_t last_frame_end; /* ts of last bit of previews rx or tx frame */ //----------------------------------------------------------------------------- // Returns true if a pulse/pause is received within timeout -static inline bool wait_for(bool value, const uint32_t timeout) { +// Note: inlining this function would fail with -Os +static bool wait_for(bool value, const uint32_t timeout) { while ((bool)(AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_DIN) != value) { if (GetCountSspClk() > timeout) { return false; @@ -83,7 +84,7 @@ static inline bool wait_for(bool value, const uint32_t timeout) { // - A bit length >80.2us is a 1 // - A bit length <80.2us is a 0 // - A bit length >148.6us is a code violation -static inline int8_t rx_bit() { +static int8_t rx_bit(void) { // backup ts for threshold calculation uint32_t bit_start = last_frame_end; @@ -126,7 +127,8 @@ static inline int8_t rx_bit() { // Note: The Subcarrier is not disabled during bits to prevent glitches. This is // not mandatory but results in a cleaner signal. tx_frame will disable // the subcarrier when the frame is done. -static inline void tx_bit(bool bit) { +// Note: inlining this function would fail with -Os +static void tx_bit(bool bit) { LED_C_ON(); if (bit) { @@ -177,7 +179,7 @@ static void tx_frame(uint32_t frame, uint8_t len) { LogTrace(cmdbytes, sizeof(cmdbytes), last_frame_start, last_frame_end, NULL, false); } -static void tx_ack() { +static void tx_ack(void) { // wait for ack timeslot last_frame_end += TAG_ACK_WAIT; legic_prng_forward(TAG_ACK_WAIT / TAG_BIT_PERIOD - 1); @@ -298,15 +300,14 @@ static int32_t init_card(uint8_t cardtype, legic_card_select_t *p_card) { return 0; } -static void init_tag() { +static void init_tag(void) { // configure FPGA FpgaDownloadAndGo(FPGA_BITSTREAM_HF); - FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_SIMULATOR - | FPGA_HF_SIMULATOR_MODULATE_212K); + FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_SIMULATOR | FPGA_HF_SIMULATOR_MODULATE_212K); SetAdcMuxFor(GPIO_MUXSEL_HIPKD); // configure SSC with defaults - FpgaSetupSsc(); + FpgaSetupSsc(FPGA_MAJOR_MODE_HF_SIMULATOR); // first pull output to low to prevent glitches then re-claim GPIO_SSC_DOUT LOW(GPIO_SSC_DOUT); diff --git a/armsrc/lfadc.c b/armsrc/lfadc.c index 0a85312bc..1fb1bccde 100644 --- a/armsrc/lfadc.c +++ b/armsrc/lfadc.c @@ -11,6 +11,7 @@ #include "fpgaloader.h" #include "ticks.h" #include "dbprint.h" +#include "appmain.h" // Sam7s has several timers, we will use the source TIMER_CLOCK1 (aka AT91C_TC_CLKS_TIMER_DIV1_CLOCK) // TIMER_CLOCK1 = MCK/2, MCK is running at 48 MHz, Timer is running at 48/2 = 24 MHz @@ -25,13 +26,18 @@ // T0 = timer/carrier = 1500kHz/125kHz = 1500000/125000 = 6 //#define HITAG_T0 3 +////////////////////////////////////////////////////////////////////////////// +// Exported global variables +////////////////////////////////////////////////////////////////////////////// + +bool g_logging = true; + ////////////////////////////////////////////////////////////////////////////// // Global variables ////////////////////////////////////////////////////////////////////////////// -bool rising_edge = false; -bool logging = true; -bool reader_mode = false; +static bool rising_edge = false; +static bool reader_mode = false; ////////////////////////////////////////////////////////////////////////////// // Auxiliary functions @@ -46,8 +52,8 @@ bool lf_test_periods(size_t expected, size_t count) { ////////////////////////////////////////////////////////////////////////////// // Low frequency (LF) adc passthrough functionality ////////////////////////////////////////////////////////////////////////////// -uint8_t previous_adc_val = 0; -uint8_t adc_avg = 0; +static uint8_t previous_adc_val = 0; +static uint8_t adc_avg = 0; void lf_sample_mean(void) { uint8_t periods = 0; @@ -65,32 +71,16 @@ void lf_sample_mean(void) { Dbprintf("LF ADC average %u", adc_avg); } -size_t lf_count_edge_periods_ex(size_t max, bool wait, bool detect_gap) { +static size_t lf_count_edge_periods_ex(size_t max, bool wait, bool detect_gap) { size_t periods = 0; - volatile uint8_t adc_val; uint8_t avg_peak = adc_avg + 3, avg_through = adc_avg - 3; -// int16_t checked = 0; - - while (!BUTTON_PRESS()) { - - // only every 100th times, in order to save time when collecting samples. - /* - if (checked == 1000) { - if (data_available()) { - break; - } else { - checked = 0; - } - } - ++checked; - */ - WDT_HIT(); + while (BUTTON_PRESS() == false) { if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) { - adc_val = AT91C_BASE_SSC->SSC_RHR; + volatile uint8_t adc_val = AT91C_BASE_SSC->SSC_RHR; periods++; - if (logging) logSampleSimple(adc_val); + if (g_logging) logSampleSimple(adc_val); // Only test field changes if state of adc values matter if (wait == false) { @@ -100,6 +90,7 @@ size_t lf_count_edge_periods_ex(size_t max, bool wait, bool detect_gap) { if (adc_val == 0) { return periods; } + } else { // Trigger on a modulation swap by observing an edge change if (rising_edge) { @@ -120,7 +111,8 @@ size_t lf_count_edge_periods_ex(size_t max, bool wait, bool detect_gap) { if (periods >= max) return 0; } } - if (logging) logSampleSimple(0xFF); + + if (g_logging) logSampleSimple(0xFF); return 0; } @@ -132,7 +124,7 @@ size_t lf_detect_gap(size_t max) { return lf_count_edge_periods_ex(max, false, true); } -void lf_reset_counter() { +void lf_reset_counter(void) { // TODO: find out the correct reset settings for tag and reader mode // if (reader_mode) { @@ -147,15 +139,16 @@ void lf_reset_counter() { // } } -bool lf_get_tag_modulation() { +bool lf_get_tag_modulation(void) { return (rising_edge == false); } -bool lf_get_reader_modulation() { +bool lf_get_reader_modulation(void) { return rising_edge; } void lf_wait_periods(size_t periods) { + // wait detect gap lf_count_edge_periods_ex(periods, true, false); } @@ -188,7 +181,7 @@ void lf_init(bool reader, bool simulate) { SetAdcMuxFor(GPIO_MUXSEL_LOPKD); // Now set up the SSC to get the ADC samples that are now streaming at us. - FpgaSetupSsc(); + FpgaSetupSsc(FPGA_MAJOR_MODE_LF_READER); // When in reader mode, give the field a bit of time to settle. // 313T0 = 313 * 8us = 2504us = 2.5ms Hitag2 tags needs to be fully powered. @@ -223,12 +216,12 @@ void lf_init(bool reader, bool simulate) { uint32_t bufsize = 10000; // use malloc - if (logging) initSampleBufferEx(&bufsize, true); + if (g_logging) initSampleBufferEx(&bufsize, true); lf_sample_mean(); } -void lf_finalize() { +void lf_finalize(void) { // Disable timers AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS; AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKDIS; @@ -245,40 +238,40 @@ void lf_finalize() { } size_t lf_detect_field_drop(size_t max) { - size_t periods = 0; -// int16_t checked = 0; + /* + size_t periods = 0; + // int16_t checked = 0; - while (!BUTTON_PRESS()) { + while (BUTTON_PRESS() == false) { - /* - // only every 1000th times, in order to save time when collecting samples. - if (checked == 1000) { - if (data_available()) { - checked = -1; - break; - } else { - checked = 0; - } + // // only every 1000th times, in order to save time when collecting samples. + // if (checked == 4000) { + // if (data_available()) { + // checked = -1; + // break; + // } else { + // checked = 0; + // } + // } + // ++checked; + + WDT_HIT(); + + if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) { + periods++; + volatile uint8_t adc_val = AT91C_BASE_SSC->SSC_RHR; + + if (g_logging) logSampleSimple(adc_val); + + if (adc_val == 0) { + rising_edge = false; + return periods; } - ++checked; - */ - WDT_HIT(); - - if (AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) { - periods++; - volatile uint8_t adc_val = AT91C_BASE_SSC->SSC_RHR; - - if (logging) logSampleSimple(adc_val); - - if (adc_val == 0) { - rising_edge = false; - return periods; + if (periods == max) return 0; } - - if (periods == max) return 0; } - } + */ return 0; } diff --git a/armsrc/lfadc.h b/armsrc/lfadc.h index 09e5762c6..1c8a4211f 100644 --- a/armsrc/lfadc.h +++ b/armsrc/lfadc.h @@ -15,21 +15,21 @@ #include "util.h" #include "string.h" -extern bool logging; +extern bool g_logging; void lf_sample_mean(void); bool lf_test_periods(size_t expected, size_t count); size_t lf_count_edge_periods(size_t max); size_t lf_detect_gap(size_t max); -void lf_reset_counter(); +void lf_reset_counter(void); -bool lf_get_tag_modulation(); -bool lf_get_reader_modulation(); +bool lf_get_tag_modulation(void); +bool lf_get_reader_modulation(void); void lf_wait_periods(size_t periods); //void lf_init(bool reader); void lf_init(bool reader, bool simulate); -void lf_finalize(); +void lf_finalize(void); size_t lf_detect_field_drop(size_t max); bool lf_manchester_send_bytes(const uint8_t *frame, size_t frame_len); void lf_modulation(bool modulation); diff --git a/armsrc/lfops.c b/armsrc/lfops.c index c65696d1a..b29844476 100644 --- a/armsrc/lfops.c +++ b/armsrc/lfops.c @@ -27,6 +27,7 @@ #include "protocols.h" #include "pmflash.h" #include "flashmem.h" // persistence on flash +#include "appmain.h" // print stack /* Notes about EM4xxx timings. @@ -171,7 +172,7 @@ t55xx_configurations_t T55xx_Timing = { #define T55XX_LONGLEADINGREFERENCE 4 // Value to tell Write Bit to send long reference // ATA55xx shared presets & routines -static uint32_t GetT55xxClockBit(uint32_t clock) { +static uint32_t GetT55xxClockBit(uint8_t clock) { switch (clock) { case 128: return T55x7_BITRATE_RF_128; @@ -198,7 +199,7 @@ void printT55xxConfig(void) { #define PRN_NA sprintf(s + strlen(s), _RED_("N/A") " | "); - DbpString(_BLUE_("LF T55XX config")); + DbpString(_CYAN_("LF T55XX config")); Dbprintf(" [r] [a] [b] [c] [d] [e] [f] [g]"); Dbprintf(" mode |start|write|write|write| read|write|write"); Dbprintf(" | gap | gap | 0 | 1 | gap | 2 | 3"); @@ -261,8 +262,9 @@ void printT55xxConfig(void) { else PRN_NA; + // remove last space s[strlen(s)] = 0; - DbpString(s); + DbpStringEx(FLAG_LOG, s, sizeof(s)); } DbpString(""); } @@ -621,7 +623,7 @@ void ReadTItag(void) { StopTicks(); } -void WriteTIbyte(uint8_t b) { +static void WriteTIbyte(uint8_t b) { int i = 0; // modulate 8 bits out to the antenna @@ -677,7 +679,7 @@ void AcquireTiType(void) { AT91C_BASE_SSC->SSC_TCMR = 0; // Transmit Frame Mode Register AT91C_BASE_SSC->SSC_TFMR = 0; - // iceman, FpgaSetupSsc() ?? the code above? can it be replaced? + // iceman, FpgaSetupSsc(FPGA_MAJOR_MODE_LF_READER) ?? the code above? can it be replaced? LED_D_ON(); // modulate antenna @@ -720,7 +722,7 @@ void AcquireTiType(void) { } // reset SSC - FpgaSetupSsc(); + FpgaSetupSsc(FPGA_MAJOR_MODE_LF_READER); } // arguments: 64bit data split into 32bit idhi:idlo and optional 16bit crc @@ -1223,32 +1225,52 @@ void CmdNRZsimTAG(uint8_t invert, uint8_t separator, uint8_t clk, uint16_t size, } // loop to get raw HID waveform then FSK demodulate the TAG ID from it -void CmdHIDdemodFSK(int findone, uint32_t *high, uint32_t *low, int ledcontrol) { - uint8_t *dest = BigBuf_get_addr(); +int lf_hid_watch(int findone, uint32_t *high, uint32_t *low) { + size_t size; uint32_t hi2 = 0, hi = 0, lo = 0; int dummyIdx = 0; // Configure to go in 125kHz listen mode LFSetupFPGAForADC(LF_DIVISOR_125, true); + uint8_t *dest = BigBuf_get_addr(); + BigBuf_Clear_keep_EM(); + clear_trace(); + set_tracing(false); + //clear read buffer BigBuf_Clear_keep_EM(); - while (!BUTTON_PRESS() && !data_available()) { + int res = PM3_SUCCESS; + uint16_t interval = 0; + while (BUTTON_PRESS() == false) { WDT_HIT(); - if (ledcontrol) LED_A_ON(); + + // cancel w usb command. + if (interval == 4000) { + if (data_available()) { + res = PM3_EOPABORTED; + break; + } + interval = 0; + } else { + interval++; + } DoAcquisition_default(-1, false); + // FSK demodulator - size = 50 * 128 * 2; //big enough to catch 2 sequences of largest format + // 50 * 128 * 2 - big enough to catch 2 sequences of largest format + size = MIN(12800, BigBuf_max_traceLen()); + int idx = HIDdemodFSK(dest, &size, &hi2, &hi, &lo, &dummyIdx); if (idx < 0) continue; if (idx > 0 && lo > 0 && (size == 96 || size == 192)) { // go over previously decoded manchester data and decode into usable tag ID if (hi2 != 0) { //extra large HID tags 88/192 bits - Dbprintf("TAG ID: %x%08x%08x (%d)", + Dbprintf("TAG ID: " _GREEN_("%x%08x%08x") " (%d)", hi2, hi, lo, @@ -1310,25 +1332,40 @@ void CmdHIDdemodFSK(int findone, uint32_t *high, uint32_t *low, int ledcontrol) hi2 = hi = lo = idx = 0; } FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - DbpString("HID fsk demod stopped"); - if (ledcontrol) LED_A_OFF(); + BigBuf_free(); + LEDsoff(); + return res; } // loop to get raw HID waveform then FSK demodulate the TAG ID from it -void CmdAWIDdemodFSK(int findone, uint32_t *high, uint32_t *low, int ledcontrol) { +int lf_awid_watch(int findone, uint32_t *high, uint32_t *low) { - uint8_t *dest = BigBuf_get_addr(); size_t size; int dummyIdx = 0; + uint8_t *dest = BigBuf_get_addr(); BigBuf_Clear_keep_EM(); + clear_trace(); + set_tracing(false); LFSetupFPGAForADC(LF_DIVISOR_125, true); - while (!BUTTON_PRESS() && !data_available()) { + int res = PM3_SUCCESS; + uint16_t interval = 0; + while (BUTTON_PRESS() == false) { WDT_HIT(); - if (ledcontrol) LED_A_ON(); + + // cancel w usb command. + if (interval == 4000) { + if (data_available()) { + res = PM3_EOPABORTED; + break; + } + interval = 0; + } else { + interval++; + } DoAcquisition_default(-1, false); // FSK demodulator @@ -1379,20 +1416,19 @@ void CmdAWIDdemodFSK(int findone, uint32_t *high, uint32_t *low, int ledcontrol) uint32_t fac = bytebits_to_byte(dest + 9, 8); uint32_t cardnum = bytebits_to_byte(dest + 17, 16); uint32_t code1 = bytebits_to_byte(dest + 8, fmtLen); - Dbprintf("AWID Found - BitLength: %d, FC: %d, Card: %d - Wiegand: %x, Raw: %08x%08x%08x", fmtLen, fac, cardnum, code1, rawHi2, rawHi, rawLo); + Dbprintf("AWID Found - Bit length: " _GREEN_("%d") ", FC: " _GREEN_("%d") ", Card: " _GREEN_("%d") " - Wiegand: %x, Raw: %08x%08x%08x", fmtLen, fac, cardnum, code1, rawHi2, rawHi, rawLo); } else { uint32_t cardnum = bytebits_to_byte(dest + 8 + (fmtLen - 17), 16); if (fmtLen > 32) { uint32_t code1 = bytebits_to_byte(dest + 8, fmtLen - 32); uint32_t code2 = bytebits_to_byte(dest + 8 + (fmtLen - 32), 32); - Dbprintf("AWID Found - BitLength: %d -unknown BitLength- (%d) - Wiegand: %x%08x, Raw: %08x%08x%08x", fmtLen, cardnum, code1, code2, rawHi2, rawHi, rawLo); + Dbprintf("AWID Found - Bit length: " _GREEN_("%d") " -unknown bit length- (%d) - Wiegand: %x%08x, Raw: %08x%08x%08x", fmtLen, cardnum, code1, code2, rawHi2, rawHi, rawLo); } else { uint32_t code1 = bytebits_to_byte(dest + 8, fmtLen); - Dbprintf("AWID Found - BitLength: %d -unknown BitLength- (%d) - Wiegand: %x, Raw: %08x%08x%08x", fmtLen, cardnum, code1, rawHi2, rawHi, rawLo); + Dbprintf("AWID Found - Bit length: " _GREEN_("%d") " -unknown bit length- (%d) - Wiegand: %x, Raw: %08x%08x%08x", fmtLen, cardnum, code1, rawHi2, rawHi, rawLo); } } if (findone) { - if (ledcontrol) LED_A_OFF(); *high = rawHi; *low = rawLo; break; @@ -1400,26 +1436,40 @@ void CmdAWIDdemodFSK(int findone, uint32_t *high, uint32_t *low, int ledcontrol) } FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - DbpString("AWID fsk demod stopped"); - if (ledcontrol) LED_A_OFF(); + BigBuf_free(); + LEDsoff(); + return res; } -void CmdEM410xdemod(int findone, uint32_t *high, uint64_t *low, int ledcontrol) { - uint8_t *dest = BigBuf_get_addr(); +int lf_em410x_watch(int findone, uint32_t *high, uint64_t *low) { size_t size, idx = 0; int clk = 0, invert = 0, maxErr = 20; uint32_t hi = 0; uint64_t lo = 0; + uint8_t *dest = BigBuf_get_addr(); + clear_trace(); + set_tracing(false); BigBuf_Clear_keep_EM(); LFSetupFPGAForADC(LF_DIVISOR_125, true); - while (!BUTTON_PRESS() && !data_available()) { - + int res = PM3_SUCCESS; + uint16_t interval = 0; + while (BUTTON_PRESS() == false) { WDT_HIT(); - if (ledcontrol) LED_A_ON(); + + // cancel w usb command. + if (interval == 4000) { + if (data_available()) { + res = PM3_EOPABORTED; + break; + } + interval = 0; + } else { + interval++; + } DoAcquisition_default(-1, false); @@ -1427,14 +1477,14 @@ void CmdEM410xdemod(int findone, uint32_t *high, uint64_t *low, int ledcontrol) //askdemod and manchester decode int errCnt = askdemod(dest, &size, &clk, &invert, maxErr, 0, 1); - WDT_HIT(); - if (errCnt > 50) continue; + WDT_HIT(); + errCnt = Em410xDecode(dest, &size, &idx, &hi, &lo); if (errCnt == 1) { if (size == 128) { - Dbprintf("EM XL TAG ID: %06x%08x%08x - (%05d_%03d_%08d)", + Dbprintf("EM XL TAG ID: " _GREEN_("%06x%08x%08x") " - ( %05d_%03d_%08d )", hi, (uint32_t)(lo >> 32), (uint32_t)lo, @@ -1442,7 +1492,7 @@ void CmdEM410xdemod(int findone, uint32_t *high, uint64_t *low, int ledcontrol) (uint32_t)((lo >> 16LL) & 0xFF), (uint32_t)(lo & 0xFFFFFF)); } else { - Dbprintf("EM TAG ID: %02x%08x - (%05d_%03d_%08d)", + Dbprintf("EM TAG ID: " _GREEN_("%02x%08x") " - ( %05d_%03d_%08d )", (uint32_t)(lo >> 32), (uint32_t)lo, (uint32_t)(lo & 0xFFFF), @@ -1451,7 +1501,6 @@ void CmdEM410xdemod(int findone, uint32_t *high, uint64_t *low, int ledcontrol) } if (findone) { - if (ledcontrol) LED_A_OFF(); *high = hi; *low = lo; break; @@ -1462,33 +1511,46 @@ void CmdEM410xdemod(int findone, uint32_t *high, uint64_t *low, int ledcontrol) } FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - DbpString("EM man/ask demod stopped"); - if (ledcontrol) LED_A_OFF(); + BigBuf_free(); + LEDsoff(); + return res; } -void CmdIOdemodFSK(int findone, uint32_t *high, uint32_t *low, int ledcontrol) { - - uint8_t *dest = BigBuf_get_addr(); +int lf_io_watch(int findone, uint32_t *high, uint32_t *low) { int dummyIdx = 0; uint32_t code = 0, code2 = 0; - uint8_t version = 0, facilitycode = 0, crc = 0; - uint16_t number = 0, calccrc = 0; - - size_t size = BigBuf_max_traceLen(); + uint8_t version = 0, facilitycode = 0; + uint16_t number = 0; + uint8_t *dest = BigBuf_get_addr(); BigBuf_Clear_keep_EM(); + clear_trace(); + set_tracing(false); // Configure to go in 125kHz listen mode LFSetupFPGAForADC(LF_DIVISOR_125, true); - while (!BUTTON_PRESS() && !data_available()) { + int res = PM3_SUCCESS; + uint16_t interval = 0; + while (BUTTON_PRESS() == false) { + WDT_HIT(); - if (ledcontrol) LED_A_ON(); + + // cancel w usb command. + if (interval == 4000) { + if (data_available()) { + res = PM3_EOPABORTED; + break; + } + interval = 0; + } else { + interval++; + } DoAcquisition_default(-1, false); - size = MIN(12000, BigBuf_max_traceLen()); + size_t size = MIN(12000, BigBuf_max_traceLen()); //fskdemod and get start index int idx = detectIOProx(dest, &size, &dummyIdx); @@ -1528,18 +1590,9 @@ void CmdIOdemodFSK(int findone, uint32_t *high, uint32_t *low, int ledcontrol) { facilitycode = bytebits_to_byte(dest + idx + 18, 8); number = (bytebits_to_byte(dest + idx + 36, 8) << 8) | (bytebits_to_byte(dest + idx + 45, 8)); //36,9 - crc = bytebits_to_byte(dest + idx + 54, 8); - for (uint8_t i = 1; i < 6; ++i) - calccrc += bytebits_to_byte(dest + idx + 9 * i, 8); - calccrc &= 0xff; - calccrc = 0xff - calccrc; + Dbprintf("IO Prox " _GREEN_("XSF(%02d)%02x:%05d") " (%08x%08x) (%s)", version, facilitycode, number, code, code2); - char *crcStr = (crc == calccrc) ? "ok" : "!crc"; - - Dbprintf("IO Prox XSF(%02d)%02x:%05d (%08x%08x) [%02x %s]", version, facilitycode, number, code, code2, crc, crcStr); - // if we're only looking for one tag if (findone) { - if (ledcontrol) LED_A_OFF(); *high = code; *low = code2; break; @@ -1547,12 +1600,11 @@ void CmdIOdemodFSK(int findone, uint32_t *high, uint32_t *low, int ledcontrol) { code = code2 = 0; version = facilitycode = 0; number = 0; - calccrc = 0; } - FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - DbpString("IOProx fsk demod stopped"); - if (ledcontrol) LED_A_OFF(); + BigBuf_free(); + LEDsoff(); + return res; } /*------------------------------ @@ -1570,10 +1622,10 @@ void TurnReadLFOn(uint32_t delay) { FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER | FPGA_LF_ADC_READER_FIELD); // measure antenna strength. - //int adcval = ((MAX_ADC_LF_VOLTAGE * AvgAdc(ADC_CHAN_LF)) >> 10); + //int adcval = ((MAX_ADC_LF_VOLTAGE * (SumAdc(ADC_CHAN_LF, 32) >> 1)) >> 14); WaitUS(delay); } -void TurnReadLF_off(uint32_t delay) { +static void TurnReadLF_off(uint32_t delay) { FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); WaitUS(delay); } @@ -1585,7 +1637,7 @@ void TurnReadLF_off(uint32_t delay) { #define T55_LLR_REF (136 * 8) // Write one bit to chip -void T55xxWriteBit(uint8_t bit, uint8_t downlink_idx) { +static void T55xxWriteBit(uint8_t bit, uint8_t downlink_idx) { switch (bit) { case 0 : @@ -1621,7 +1673,7 @@ void T55xxWriteBit(uint8_t bit, uint8_t downlink_idx) { // num_bits - how many bits (low x bits of data) Max 32 bits at a time // max_len - how many bytes can the bit_array hold (ensure no buffer overflow) // returns "Next" bit offset / bits stored (for next store) -uint8_t T55xx_SetBits(uint8_t *bs, uint8_t start_offset, uint32_t data, uint8_t num_bits, uint8_t max_len) { +static uint8_t T55xx_SetBits(uint8_t *bs, uint8_t start_offset, uint32_t data, uint8_t num_bits, uint8_t max_len) { int8_t next_offset = start_offset; // Check if data will fit. @@ -1645,7 +1697,7 @@ uint8_t T55xx_SetBits(uint8_t *bs, uint8_t start_offset, uint32_t data, uint8_t } // Send one downlink command to the card -void T55xx_SendCMD(uint32_t data, uint32_t pwd, uint16_t arg) { +static void T55xx_SendCMD(uint32_t data, uint32_t pwd, uint16_t arg) { /* arg bits @@ -1959,13 +2011,12 @@ void T55xxReadBlock(uint8_t page, bool pwd_mode, bool brute_mem, uint8_t block, flags |= (downlink_mode & 3) << 3; if (brute_mem) flags |= 0x0100; -// T55xxReadBlockExt (flags,block,pwd); + size_t samples = 12000; - // bool brute_mem = (flags & 0x0100) >> 8; LED_A_ON(); - if (brute_mem) samples = 1024; + if (brute_mem) samples = 2048; //-- Set Read Flag to ensure SendCMD does not add "data" to the packet //-- flags |= 0x40; @@ -1993,44 +2044,59 @@ void T55xxReadBlock(uint8_t page, bool pwd_mode, bool brute_mem, uint8_t block, DoPartialAcquisition(0, false, samples, 0); // Turn the field off - if (!brute_mem) { + if (brute_mem == false) { FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); reply_ng(CMD_LF_T55XX_READBL, PM3_SUCCESS, NULL, 0); LED_A_OFF(); } - } + void T55xx_ChkPwds(uint8_t flags) { - DbpString("[+] T55XX Check pwds using flashmemory starting"); +#define CHK_SAMPLES_SIGNAL 2048 + +#ifdef WITH_FLASH + DbpString(_CYAN_("T55XX Check pwds using flashmemory starting")); +#else + DbpString(_CYAN_("T55XX Check pwds starting")); +#endif - uint8_t ret = 0; // First get baseline and setup LF mode. - // tends to mess up BigBuf - uint8_t *buf = BigBuf_get_addr(); - uint32_t b1, baseline = 0; - uint8_t downlink_mode = (flags >> 3) & 0x03; + uint8_t *buf = BigBuf_get_addr(); + uint8_t downlink_mode = (flags >> 3) & 0x03; + uint64_t b1, baseline_faulty = 0; - // collect baseline for failed attempt + DbpString("Determine baseline..."); + + // collect baseline for failed attempt ( should give me block1 ) uint8_t x = 32; while (x--) { b1 = 0; - T55xxReadBlock(0, 0, true, 1, 0, downlink_mode); - for (uint16_t j = 0; j < 1024; ++j) - b1 += buf[j]; - + T55xxReadBlock(0, 0, true, 0, 0, downlink_mode); + for (uint16_t j = 0; j < CHK_SAMPLES_SIGNAL; ++j) { + b1 += (buf[j] * buf[j]); + } b1 *= b1; b1 >>= 8; - baseline += b1; + baseline_faulty += b1; } + baseline_faulty >>= 5; - baseline >>= 5; - Dbprintf("[=] Baseline determined [%u]", baseline); + if (DBGLEVEL >= DBG_DEBUG) + Dbprintf("Baseline " _YELLOW_("%llu"), baseline_faulty); uint8_t *pwds = BigBuf_get_EM_addr(); - uint16_t pwdCount = 0; - uint32_t candidate = 0; + uint16_t pwd_count = 0; + + struct p { + bool found; + uint32_t candidate; + } PACKED payload; + + payload.found = false; + payload.candidate = 0; + #ifdef WITH_FLASH BigBuf_Clear_EM(); @@ -2040,57 +2106,67 @@ void T55xx_ChkPwds(uint8_t flags) { if (isok != sizeof(counter)) goto OUT; - pwdCount = (uint16_t)(counter[1] << 8 | counter[0]); - - if (pwdCount == 0 || pwdCount == 0xFFFF) + pwd_count = (uint16_t)(counter[1] << 8 | counter[0]); + if (pwd_count == 0) goto OUT; - isok = Flash_ReadData(DEFAULT_T55XX_KEYS_OFFSET + 2, pwds, pwdCount * 4); - if (isok != pwdCount * 4) + // since flash can report way too many pwds, we need to limit it. + // bigbuff EM size is determined by CARD_MEMORY_SIZE + // a password is 4bytes. + uint16_t pwd_size_available = MIN(CARD_MEMORY_SIZE, pwd_count * 4); + + // adjust available pwd_count + pwd_count = pwd_size_available / 4; + + isok = Flash_ReadData(DEFAULT_T55XX_KEYS_OFFSET + 2, pwds, pwd_size_available); + if (isok != pwd_size_available) goto OUT; - Dbprintf("[=] Password dictionary count %d ", pwdCount); + Dbprintf("Password dictionary count " _YELLOW_("%d"), pwd_count); + #endif - uint32_t pwd = 0, curr = 0, prev = 0; - for (uint16_t i = 0; i < pwdCount; ++i) { + uint64_t curr = 0, prev = 0; + int32_t idx = -1; - if (BUTTON_PRESS() && !data_available()) { - goto OUT; - } + for (uint32_t i = 0; i < pwd_count; i++) { - pwd = bytes_to_num(pwds + i * 4, 4); + uint32_t pwd = bytes_to_num(pwds + (i * 4), 4); T55xxReadBlock(0, true, true, 0, pwd, downlink_mode); - // calc mean of BigBuf 1024 samples. - uint32_t sum = 0; - for (uint16_t j = 0; j < 1024; ++j) { - sum += buf[j]; + uint64_t sum = 0; + for (uint16_t j = 0; j < CHK_SAMPLES_SIGNAL; ++j) { + sum += (buf[j] * buf[j]); } - sum *= sum; sum >>= 8; - int32_t tmp = (sum - baseline); - curr = ABS(tmp); - - Dbprintf("[=] Pwd %08X | ABS %u", pwd, curr); + int64_t tmp_dist = (baseline_faulty - sum); + curr = ABS(tmp_dist); + if (DBGLEVEL >= DBG_DEBUG) + Dbprintf("%08x has distance " _YELLOW_("%llu"), pwd, curr); + if (curr > prev) { - Dbprintf("[=] --> ABS %u Candidate %08X <--", curr, pwd); - candidate = pwd; + idx = i; prev = curr; } } - if (candidate) - ret = 1; + if (idx != -1) { + payload.found = true; + payload.candidate = bytes_to_num(pwds + (idx * 4), 4); + } +#ifdef WITH_FLASH OUT: +#endif + FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); - reply_mix(CMD_ACK, ret, candidate, 0, 0, 0); LEDsoff(); + reply_ng(CMD_LF_T55XX_CHK_PWDS, PM3_SUCCESS, (uint8_t*)&payload, sizeof(payload)); + BigBuf_free(); } void T55xxWakeUp(uint32_t pwd, uint8_t flags) { @@ -2107,7 +2183,7 @@ void T55xxWakeUp(uint32_t pwd, uint8_t flags) { /*-------------- Cloning routines -----------*/ -void WriteT55xx(uint32_t *blockdata, uint8_t startblock, uint8_t numblocks) { +static void WriteT55xx(uint32_t *blockdata, uint8_t startblock, uint8_t numblocks) { t55xx_write_block_t cmd; cmd.pwd = 0; @@ -2182,17 +2258,26 @@ void CopyVikingtoT55xx(uint8_t *blocks, uint8_t Q5) { reply_ng(CMD_LF_VIKING_CLONE, PM3_SUCCESS, NULL, 0); } +int copy_em410x_to_t55xx(uint8_t card, uint8_t clock, uint32_t id_hi, uint32_t id_lo) { + // Define 9bit header for EM410x tags #define EM410X_HEADER 0x1FF #define EM410X_ID_LENGTH 40 -void WriteEM410x(uint32_t card, uint32_t id_hi, uint32_t id_lo) { + uint32_t clockbits = 0; + if (card == 1) { //t55x7 + clockbits = GetT55xxClockBit(clock); + if (clockbits == 0) { + Dbprintf("Invalid clock rate: %d", clock); + return PM3_EINVARG; + } + } + int i; uint64_t id = EM410X_HEADER; uint64_t rev_id = 0; // reversed ID int c_parity[4]; // column parity int r_parity = 0; // row parity - uint32_t clock = 0; // Reverse ID bits given as parameter (for simpler operations) for (i = 0; i < EM410X_ID_LENGTH; ++i) { @@ -2242,33 +2327,29 @@ void WriteEM410x(uint32_t card, uint32_t id_hi, uint32_t id_lo) { // Add stop bit id <<= 1; - Dbprintf("Started writing %s tag ...", card ? "T55x7" : "T5555"); LED_D_ON(); // Write EM410x ID uint32_t data[] = {0, (uint32_t)(id >> 32), (uint32_t)(id & 0xFFFFFFFF)}; - clock = (card & 0xFF00) >> 8; + // default to 64 clock = (clock == 0) ? 64 : clock; Dbprintf("Clock rate: %d", clock); - if (card & 0xFF) { //t55x7 - clock = GetT55xxClockBit(clock); - if (clock == 0) { - Dbprintf("Invalid clock rate: %d", clock); - return; - } - data[0] = clock | T55x7_MODULATION_MANCHESTER | (2 << T55x7_MAXBLOCK_SHIFT); - } else { //t5555 (Q5) + + if (card == 1) { // T55x7 + data[0] = clockbits | T55x7_MODULATION_MANCHESTER | (2 << T55x7_MAXBLOCK_SHIFT); + } else { // T5555 (Q5) data[0] = T5555_SET_BITRATE(clock) | T5555_MODULATION_MANCHESTER | (2 << T5555_MAXBLOCK_SHIFT); } WriteT55xx(data, 0, 3); - LED_D_OFF(); + LEDsoff(); Dbprintf("Tag %s written with 0x%08x%08x\n", card ? "T55x7" : "T5555", (uint32_t)(id >> 32), (uint32_t)id); + return PM3_SUCCESS; } //----------------------------------- @@ -2281,10 +2362,10 @@ void WriteEM410x(uint32_t card, uint32_t id_hi, uint32_t id_lo) { #define FWD_CMD_READ 0x9 #define FWD_CMD_DISABLE 0x5 -uint8_t forwardLink_data[64]; //array of forwarded bits -uint8_t *forward_ptr; //ptr for forward message preparation -uint8_t fwd_bit_sz; //forwardlink bit counter -uint8_t *fwd_write_ptr; //forwardlink bit pointer +static uint8_t forwardLink_data[64]; //array of forwarded bits +static uint8_t *forward_ptr; //ptr for forward message preparation +static uint8_t fwd_bit_sz; //forwardlink bit counter +static uint8_t *fwd_write_ptr; //forwardlink bit pointer //==================================================================== // prepares command bits @@ -2299,7 +2380,7 @@ uint8_t *fwd_write_ptr; //forwardlink bit pointer // These timings work for 4469/4269/4305 (with the 55*8 above) // WRITE_0 = 23*8 , 9*8 -uint8_t Prepare_Cmd(uint8_t cmd) { +static uint8_t Prepare_Cmd(uint8_t cmd) { *forward_ptr++ = 0; //start bit *forward_ptr++ = 0; //second pause for 4050 code @@ -2319,7 +2400,7 @@ uint8_t Prepare_Cmd(uint8_t cmd) { // prepares address bits // see EM4469 spec //==================================================================== -uint8_t Prepare_Addr(uint8_t addr) { +static uint8_t Prepare_Addr(uint8_t addr) { register uint8_t line_parity; @@ -2340,7 +2421,7 @@ uint8_t Prepare_Addr(uint8_t addr) { // prepares data bits intreleaved with parity bits // see EM4469 spec //==================================================================== -uint8_t Prepare_Data(uint16_t data_low, uint16_t data_hi) { +static uint8_t Prepare_Data(uint16_t data_low, uint16_t data_hi) { register uint8_t column_parity; register uint8_t i, j; @@ -2376,7 +2457,7 @@ uint8_t Prepare_Data(uint16_t data_low, uint16_t data_hi) { // Requires: forwarLink_data filled with valid bits (1 bit per byte) // fwd_bit_count set with number of bits to be sent //==================================================================== -void SendForward(uint8_t fwd_bit_count) { +static void SendForward(uint8_t fwd_bit_count) { // iceman, 21.3us increments for the USclock verification. // 55FC * 8us == 440us / 21.3 === 20.65 steps. could be too short. Go for 56FC instead @@ -2410,7 +2491,7 @@ void SendForward(uint8_t fwd_bit_count) { } } -void EM4xLogin(uint32_t pwd) { +static void EM4xLogin(uint32_t pwd) { uint8_t len; forward_ptr = forwardLink_data; len = Prepare_Cmd(FWD_CMD_LOGIN); @@ -2531,9 +2612,10 @@ void Cotag(uint32_t arg0) { LED_A_ON(); - LFSetupFPGAForADC(LF_FREQ2DIV(132), true); + LFSetupFPGAForADC(LF_DIVISOR_125, true); //clear buffer now so it does not interfere with timing later + BigBuf_free(); BigBuf_Clear_ext(false); //send COTAG start pulse @@ -2542,22 +2624,41 @@ void Cotag(uint32_t arg0) { ON(740) OFF(2035) ON(1000) + +/* + ON(800) OFF(2200) + ON(3600) OFF(2200) + ON(800) OFF(2200) + ON(3400) +*/ switch (rawsignal) { - case 0: - doCotagAcquisition(40000); + case 0: { + doCotagAcquisition(); + reply_ng(CMD_LF_COTAG_READ, PM3_SUCCESS, NULL, 0); break; - case 1: - doCotagAcquisitionManchester(); + } + case 1: { + uint8_t *dest = BigBuf_malloc(COTAG_BITS); + uint16_t bits = doCotagAcquisitionManchester(dest, COTAG_BITS); + reply_ng(CMD_LF_COTAG_READ, PM3_SUCCESS, dest, bits); break; - case 2: + } + case 2: { DoAcquisition_config(false, 0); + reply_ng(CMD_LF_COTAG_READ, PM3_SUCCESS, NULL, 0); break; + } + default: { + reply_ng(CMD_LF_COTAG_READ, PM3_SUCCESS, NULL, 0); + break; + } } + // Turn the field off - FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); // field off - reply_ng(CMD_LF_COTAG_READ, PM3_SUCCESS, NULL, 0); + FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); LEDsoff(); + } /* diff --git a/armsrc/lfops.h b/armsrc/lfops.h index b697cffd1..2d76bef48 100644 --- a/armsrc/lfops.h +++ b/armsrc/lfops.h @@ -15,10 +15,6 @@ #include "pm3_cmd.h" // struct -extern uint8_t decimation; -extern uint8_t bits_per_sample ; -extern bool averaging; - void AcquireRawAdcSamples125k(int divisor); void ModThenAcquireRawAdcSamples125k(uint32_t delay_off, uint32_t period_0, uint32_t period_1, uint8_t *command); void ReadTItag(void); @@ -39,13 +35,17 @@ void CmdASKsimTAG(uint8_t encoding, uint8_t invert, uint8_t separator, uint8_t c void CmdPSKsimTAG(uint8_t carrier, uint8_t invert, uint8_t clk, uint16_t size, uint8_t *bits, bool ledcontrol); void CmdNRZsimTAG(uint8_t invert, uint8_t separator, uint8_t clk, uint16_t size, uint8_t *bits, bool ledcontrol); -void CmdHIDdemodFSK(int findone, uint32_t *high, uint32_t *low, int ledcontrol); -void CmdAWIDdemodFSK(int findone, uint32_t *high, uint32_t *low, int ledcontrol); // Realtime demodulation mode for AWID26 -void CmdEM410xdemod(int findone, uint32_t *high, uint64_t *low, int ledcontrol); -void CmdIOdemodFSK(int findone, uint32_t *high, uint32_t *low, int ledcontrol); +int lf_hid_watch(int findone, uint32_t *high, uint32_t *low); +int lf_awid_watch(int findone, uint32_t *high, uint32_t *low); // Realtime demodulation mode for AWID26 +int lf_em410x_watch(int findone, uint32_t *high, uint64_t *low); +int lf_io_watch(int findone, uint32_t *high, uint32_t *low); + void CopyHIDtoT55x7(uint32_t hi2, uint32_t hi, uint32_t lo, uint8_t longFMT); // Clone an HID card to T5557/T5567 + void CopyVikingtoT55xx(uint8_t *blocks, uint8_t Q5); -void WriteEM410x(uint32_t card, uint32_t id_hi, uint32_t id_lo); + +int copy_em410x_to_t55xx(uint8_t card, uint8_t clock, uint32_t id_hi, uint32_t id_lo); + void T55xxResetRead(uint8_t flags); //id T55xxWriteBlock(uint32_t data, uint8_t blockno, uint32_t pwd, uint8_t flags); void T55xxWriteBlock(uint8_t *data); diff --git a/armsrc/lfsampling.c b/armsrc/lfsampling.c index 2851dc08b..6d58250d1 100644 --- a/armsrc/lfsampling.c +++ b/armsrc/lfsampling.c @@ -16,6 +16,7 @@ #include "util.h" #include "lfdemod.h" #include "string.h" // memset +#include "appmain.h" // print stack /* Default LF config is set to: @@ -27,17 +28,35 @@ Default LF config is set to: samples_to_skip = 0 verbose = YES */ -sample_config config = { 1, 8, 1, LF_DIVISOR_125, 0, 0, 1} ; +static sample_config config = { 1, 8, 1, LF_DIVISOR_125, 0, 0, 1} ; -void printConfig() { +// Holds bit packed struct of samples. +static BitstreamOut data = {0, 0, 0}; + +// internal struct to keep track of samples gathered +static sampling_t samples = {0, 0, 0, 0}; + +void printConfig(void) { uint32_t d = config.divisor; - DbpString(_BLUE_("LF Sampling config")); - Dbprintf(" [q] divisor.............%d ( "_GREEN_("%d.%02d kHz")")", d, 12000 / (d + 1), ((1200000 + (d + 1) / 2) / (d + 1)) - ((12000 / (d + 1)) * 100)); + DbpString(_CYAN_("LF Sampling config")); + Dbprintf(" [q] divisor.............%d ( "_GREEN_("%d.%02d kHz")" )", d, 12000 / (d + 1), ((1200000 + (d + 1) / 2) / (d + 1)) - ((12000 / (d + 1)) * 100)); Dbprintf(" [b] bits per sample.....%d", config.bits_per_sample); Dbprintf(" [d] decimation..........%d", config.decimation); Dbprintf(" [a] averaging...........%s", (config.averaging) ? "Yes" : "No"); Dbprintf(" [t] trigger threshold...%d", config.trigger_threshold); Dbprintf(" [s] samples to skip.....%d ", config.samples_to_skip); + + DbpString(_CYAN_("LF Sampling Stack")); + print_stack_usage(); +} + +void printSamples(void) { + DbpString(_CYAN_("LF Sampling memory usage")); +// Dbprintf(" decimation counter...%d", samples.dec_counter); +// Dbprintf(" sum..................%u", samples.sum); + Dbprintf(" counter.............." _YELLOW_("%u"), samples.counter); + Dbprintf(" total saved.........." _YELLOW_("%u"), samples.total_saved); + print_stack_usage(); } /** @@ -90,7 +109,7 @@ sample_config *getSamplingConfig(void) { * @param stream * @param bit */ -void pushBit(BitstreamOut *stream, uint8_t bit) { +static void pushBit(BitstreamOut *stream, uint8_t bit) { int bytepos = stream->position >> 3; // divide by 8 int bitpos = stream->position & 7; *(stream->buffer + bytepos) &= ~(1 << (7 - bitpos)); @@ -99,36 +118,33 @@ void pushBit(BitstreamOut *stream, uint8_t bit) { stream->numbits++; } -// Holds bit packed struct of samples. -BitstreamOut data = {0, 0, 0}; - -// internal struct to keep track of samples gathered -sampling_t samples = {0, 0, 0, 0}; - void initSampleBuffer(uint32_t *sample_size) { initSampleBufferEx(sample_size, false); } void initSampleBufferEx(uint32_t *sample_size, bool use_malloc) { - - BigBuf_free(); + if (sample_size == NULL) { + Dbprintf("initSampleBufferEx, param NULL"); + return; + } + BigBuf_free_keep_EM(); // We can't erase the buffer now, it would drastically delay the acquisition - if (use_malloc) { - if (sample_size == NULL || *sample_size == 0) { + if (*sample_size == 0) { *sample_size = BigBuf_max_traceLen(); data.buffer = BigBuf_get_addr(); } else { *sample_size = MIN(*sample_size, BigBuf_max_traceLen()); data.buffer = BigBuf_malloc(*sample_size); - } } else { - if (sample_size == NULL || *sample_size == 0) { + if (*sample_size == 0) { *sample_size = BigBuf_max_traceLen(); + } else { + *sample_size = MIN(*sample_size, BigBuf_max_traceLen()); } data.buffer = BigBuf_get_addr(); } @@ -136,11 +152,11 @@ void initSampleBufferEx(uint32_t *sample_size, bool use_malloc) { // samples.dec_counter = 0; samples.sum = 0; - samples.counter = 0; + samples.counter = *sample_size; samples.total_saved = 0; } -uint32_t getSampleCounter() { +uint32_t getSampleCounter(void) { return samples.total_saved; } @@ -152,13 +168,13 @@ void logSample(uint8_t sample, uint8_t decimation, uint8_t bits_per_sample, bool if (!data.buffer) return; + // keep track of total gather samples regardless how many was discarded. + if (samples.counter-- == 0) return; + if (bits_per_sample == 0) bits_per_sample = 1; if (bits_per_sample > 8) bits_per_sample = 8; if (decimation == 0) decimation = 1; - // keep track of total gather samples regardless how many was discarded. - samples.counter++; - if (avg) { samples.sum += sample; } @@ -219,15 +235,16 @@ void LFSetupFPGAForADC(int divisor, bool reader_field) { // Connect the A/D to the peak-detected low-frequency path. SetAdcMuxFor(GPIO_MUXSEL_LOPKD); - // 50ms for the resonant antenna to settle. - if (reader_field) - SpinDelay(50); // Now set up the SSC to get the ADC samples that are now streaming at us. - FpgaSetupSsc(); + FpgaSetupSsc(FPGA_MAJOR_MODE_LF_READER); // start a 1.5ticks is 1us StartTicks(); + + // 50ms for the resonant antenna to settle. + if (reader_field) + WaitMS(50); } /** @@ -250,13 +267,19 @@ uint32_t DoAcquisition(uint8_t decimation, uint8_t bits_per_sample, bool avg, in initSampleBuffer(&sample_size); + if (DBGLEVEL >= DBG_DEBUG) { + Dbprintf("lf sampling - after init"); + printSamples(); + } + uint32_t cancel_counter = 0; int16_t checked = 0; - while (!BUTTON_PRESS()) { + while (BUTTON_PRESS() == false) { - // only every 1000th times, in order to save time when collecting samples. - if (checked == 1000) { + // only every 4000th times, in order to save time when collecting samples. + // interruptible only when logging not yet triggered + if ((checked >= 4000) && (trigger_threshold > 0)) { if (data_available()) { checked = -1; break; @@ -269,7 +292,6 @@ uint32_t DoAcquisition(uint8_t decimation, uint8_t bits_per_sample, bool avg, in WDT_HIT(); if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_TXRDY) { -// AT91C_BASE_SSC->SSC_THR = 0x43; LED_D_ON(); } @@ -342,7 +364,7 @@ uint32_t DoPartialAcquisition(int trigger_threshold, bool verbose, uint32_t samp return DoAcquisition(1, 8, 0, trigger_threshold, verbose, sample_size, cancel_after, 0); } -uint32_t ReadLF(bool reader_field, bool verbose, uint32_t sample_size) { +static uint32_t ReadLF(bool reader_field, bool verbose, uint32_t sample_size) { if (verbose) printConfig(); @@ -364,7 +386,7 @@ uint32_t SampleLF(bool verbose, uint32_t sample_size) { * Initializes the FPGA for sniffer-mode (field off), and acquires the samples. * @return number of bits sampled **/ -uint32_t SniffLF() { +uint32_t SniffLF(void) { BigBuf_Clear_ext(false); return ReadLF(false, true, 0); } @@ -393,9 +415,18 @@ void doT55x7Acquisition(size_t sample_size) { uint16_t checker = 0; + if (DBGLEVEL >= DBG_DEBUG) { + Dbprintf("doT55x7Acquisition - after init"); + print_stack_usage(); + } + while (skipCnt < 1000 && (i < bufsize)) { - if (checker == 1000) { - if (BUTTON_PRESS() || data_available()) + + if (BUTTON_PRESS()) + break; + + if (checker == 4000) { + if (data_available()) break; else checker = 0; @@ -448,131 +479,103 @@ void doT55x7Acquisition(size_t sample_size) { **/ #define COTAG_T1 384 -#define COTAG_T2 (COTAG_T1>>1) -#define COTAG_ONE_THRESHOLD 128+10 -#define COTAG_ZERO_THRESHOLD 128-10 +#define COTAG_T2 (COTAG_T1 >> 1) +#define COTAG_ONE_THRESHOLD 127+5 +#define COTAG_ZERO_THRESHOLD 127-5 #ifndef COTAG_BITS #define COTAG_BITS 264 #endif -void doCotagAcquisition(size_t sample_size) { +void doCotagAcquisition(void) { - uint8_t *dest = BigBuf_get_addr(); uint16_t bufsize = BigBuf_max_traceLen(); - - if (bufsize > sample_size) - bufsize = sample_size; + uint8_t *dest = BigBuf_malloc(bufsize); dest[0] = 0; - uint8_t firsthigh = 0, firstlow = 0; - uint16_t i = 0; - uint16_t noise_counter = 0; - uint16_t checker = 0; + bool firsthigh = false, firstlow = false; + uint16_t i = 0, noise_counter = 0; - while ((i < bufsize) && (noise_counter < (COTAG_T1 << 1))) { - if (checker == 1000) { - if (BUTTON_PRESS() || data_available()) - break; - else - checker = 0; - } else { - ++checker; - } + while ((i < bufsize) && (noise_counter < COTAG_T1 << 1)) { + + if (BUTTON_PRESS()) + break; WDT_HIT(); - if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_TXRDY) { - LED_D_ON(); - } - if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_RXRDY) { + volatile uint8_t sample = (uint8_t)AT91C_BASE_SSC->SSC_RHR; // find first peak - if (!firsthigh) { + if (firsthigh == false) { if (sample < COTAG_ONE_THRESHOLD) { noise_counter++; continue; } + noise_counter = 0; - firsthigh = 1; + firsthigh = true; } - if (!firstlow) { + + if (firstlow == false) { if (sample > COTAG_ZERO_THRESHOLD) { noise_counter++; continue; } + noise_counter = 0; - firstlow = 1; + firstlow = true; } - ++i; - - if (sample > COTAG_ONE_THRESHOLD) - dest[i] = 255; - else if (sample < COTAG_ZERO_THRESHOLD) - dest[i] = 0; - else - dest[i] = dest[i - 1]; + if (++i < bufsize) { + if (sample > COTAG_ONE_THRESHOLD) { + dest[i] = 255; + } else if (sample < COTAG_ZERO_THRESHOLD) { + dest[i] = 0; + } else { + dest[i] = dest[i - 1]; + } + } } } // Ensure that DC offset removal and noise check is performed for any device-side processing - removeSignalOffset(dest, bufsize); - computeSignalProperties(dest, bufsize); + removeSignalOffset(dest, i); + computeSignalProperties(dest, i); } -uint32_t doCotagAcquisitionManchester() { - - uint8_t *dest = BigBuf_get_addr(); - uint16_t bufsize = BigBuf_max_traceLen(); - - if (bufsize > COTAG_BITS) - bufsize = COTAG_BITS; +uint16_t doCotagAcquisitionManchester(uint8_t *dest, uint16_t destlen) { + if (dest == NULL) + return 0; + dest[0] = 0; - uint8_t firsthigh = 0, firstlow = 0; - uint16_t sample_counter = 0, period = 0; - uint8_t curr = 0, prev = 0; - uint16_t noise_counter = 0; - uint16_t checker = 0; - while ((sample_counter < bufsize) && (noise_counter < (COTAG_T1 << 1))) { - if (checker == 1000) { - if (BUTTON_PRESS() || data_available()) - break; - else - checker = 0; - } else { - ++checker; - } + bool firsthigh = false, firstlow = false; + uint8_t curr = 0, prev = 0; + uint16_t i = 0; + uint16_t period = 0; + + while ((i < destlen) && BUTTON_PRESS() == false) { WDT_HIT(); - if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_TXRDY) { - LED_D_ON(); - } - if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_RXRDY) { volatile uint8_t sample = (uint8_t)AT91C_BASE_SSC->SSC_RHR; // find first peak - if (!firsthigh) { + if (firsthigh == false) { if (sample < COTAG_ONE_THRESHOLD) { - noise_counter++; continue; } - noise_counter = 0; - firsthigh = 1; + firsthigh = true; } - if (!firstlow) { + if (firstlow == false) { if (sample > COTAG_ZERO_THRESHOLD) { - noise_counter++; continue; } - noise_counter = 0; - firstlow = 1; + firstlow = true; } // set sample 255, 0, or previous @@ -592,10 +595,11 @@ uint32_t doCotagAcquisitionManchester() { continue; } - dest[sample_counter] = curr; - ++sample_counter; + dest[i] = curr; + ++i; period = COTAG_T1; } } - return sample_counter; + + return i; } diff --git a/armsrc/lfsampling.h b/armsrc/lfsampling.h index bad90d62c..137738163 100644 --- a/armsrc/lfsampling.h +++ b/armsrc/lfsampling.h @@ -21,8 +21,8 @@ typedef struct { * acquisition of Cotag LF signal. Similar to other LF, since the Cotag has such long datarate RF/384 * and is Manchester?, we directly gather the manchester data into bigbuff **/ -void doCotagAcquisition(size_t sample_size); -uint32_t doCotagAcquisitionManchester(void); +void doCotagAcquisition(void); +uint16_t doCotagAcquisitionManchester(uint8_t *dest, uint16_t destlen); /** * acquisition of T55x7 LF signal. Similar to other LF, but adjusted with @marshmellows thresholds @@ -40,7 +40,7 @@ uint32_t SampleLF(bool verbose, uint32_t sample_size); * Initializes the FPGA for sniff-mode (field off), and acquires the samples. * @return number of bits sampled **/ -uint32_t SniffLF(); +uint32_t SniffLF(void); uint32_t DoAcquisition(uint8_t decimation, uint8_t bits_per_sample, bool avg, int16_t trigger_threshold, bool verbose, uint32_t sample_size, uint32_t cancel_after, int32_t samples_to_skip); @@ -73,7 +73,7 @@ void initSampleBuffer(uint32_t *sample_size); void initSampleBufferEx(uint32_t *sample_size, bool use_malloc); void logSampleSimple(uint8_t sample); void logSample(uint8_t sample, uint8_t decimation, uint8_t bits_per_sample, bool avg); -uint32_t getSampleCounter(); +uint32_t getSampleCounter(void); /** * Setup the FPGA to listen for samples. This method downloads the FPGA bitstream @@ -97,8 +97,9 @@ void LFSetupFPGAForADC(int divisor, bool reader_field); */ void setSamplingConfig(sample_config *sc); -sample_config *getSamplingConfig(); +sample_config *getSamplingConfig(void); -void printConfig(); +void printConfig(void); +void printSamples(void); #endif // __LFSAMPLING_H diff --git a/armsrc/mifarecmd.c b/armsrc/mifarecmd.c index 0266af633..d99698ba8 100644 --- a/armsrc/mifarecmd.c +++ b/armsrc/mifarecmd.c @@ -44,7 +44,7 @@ // send an incomplete dummy response in order to trigger the card's authentication failure timeout #ifndef CHK_TIMEOUT -# define CHK_TIMEOUT() { \ +# define CHK_TIMEOUT(void) { \ ReaderTransmit(&dummy_answer, 1, NULL); \ uint32_t timeout = GetCountSspClk() + HARDNESTED_AUTHENTICATION_TIMEOUT; \ while (GetCountSspClk() < timeout) {}; \ @@ -627,7 +627,7 @@ void MifareUSetPwd(uint8_t arg0, uint8_t *datain) { } // Return 1 if the nonce is invalid else return 0 -int valid_nonce(uint32_t Nt, uint32_t NtEnc, uint32_t Ks1, uint8_t *parity) { +static int valid_nonce(uint32_t Nt, uint32_t NtEnc, uint32_t Ks1, uint8_t *parity) { return ((oddparity8((Nt >> 24) & 0xFF) == ((parity[0]) ^ oddparity8((NtEnc >> 24) & 0xFF) ^ BIT(Ks1, 16))) & \ (oddparity8((Nt >> 16) & 0xFF) == ((parity[1]) ^ oddparity8((NtEnc >> 16) & 0xFF) ^ BIT(Ks1, 8))) & \ (oddparity8((Nt >> 8) & 0xFF) == ((parity[2]) ^ oddparity8((NtEnc >> 8) & 0xFF) ^ BIT(Ks1, 0)))) ? 1 : 0; @@ -1229,7 +1229,7 @@ typedef struct chk_t { // 2 = failed to select. // 1 = wrong key // 0 = correct key -uint8_t chkKey(struct chk_t *c) { +static uint8_t chkKey(struct chk_t *c) { uint8_t i = 0, res = 2; while (i < 5) { // this part is from Piwi's faster nonce collecting part in Hardnested. @@ -1250,7 +1250,7 @@ uint8_t chkKey(struct chk_t *c) { return res; } -uint8_t chkKey_readb(struct chk_t *c, uint8_t *keyb) { +static uint8_t chkKey_readb(struct chk_t *c, uint8_t *keyb) { if (!iso14443a_fast_select_card(c->uid, c->cl)) return 2; @@ -1275,7 +1275,7 @@ uint8_t chkKey_readb(struct chk_t *c, uint8_t *keyb) { return res; } -void chkKey_scanA(struct chk_t *c, struct sector_t *k_sector, uint8_t *found, uint8_t *sectorcnt, uint8_t *foundkeys) { +static void chkKey_scanA(struct chk_t *c, struct sector_t *k_sector, uint8_t *found, uint8_t *sectorcnt, uint8_t *foundkeys) { for (uint8_t s = 0; s < *sectorcnt; s++) { // skip already found A keys @@ -1293,7 +1293,7 @@ void chkKey_scanA(struct chk_t *c, struct sector_t *k_sector, uint8_t *found, ui } } -void chkKey_scanB(struct chk_t *c, struct sector_t *k_sector, uint8_t *found, uint8_t *sectorcnt, uint8_t *foundkeys) { +static void chkKey_scanB(struct chk_t *c, struct sector_t *k_sector, uint8_t *found, uint8_t *sectorcnt, uint8_t *foundkeys) { for (uint8_t s = 0; s < *sectorcnt; s++) { // skip already found B keys @@ -1313,7 +1313,7 @@ void chkKey_scanB(struct chk_t *c, struct sector_t *k_sector, uint8_t *found, ui // loop all A keys, // when A is found but not B, try to read B. -void chkKey_loopBonly(struct chk_t *c, struct sector_t *k_sector, uint8_t *found, uint8_t *sectorcnt, uint8_t *foundkeys) { +static void chkKey_loopBonly(struct chk_t *c, struct sector_t *k_sector, uint8_t *found, uint8_t *sectorcnt, uint8_t *foundkeys) { // read Block B, if A is found. for (uint8_t s = 0; s < *sectorcnt; ++s) { @@ -1387,15 +1387,21 @@ void MifareChkKeys_fast(uint32_t arg0, uint32_t arg1, uint32_t arg2, uint8_t *da keyCount = size[1] << 8 | size[0]; - if (keyCount == 0 || keyCount == 0xFFFF) + if (keyCount == 0) goto OUT; - datain = BigBuf_malloc(keyCount * 6); + // limit size of availlable for keys in bigbuff + // a key is 6bytes + uint16_t key_mem_available = MIN(BigBuf_get_size(), keyCount * 6); + + keyCount = key_mem_available / 6; + + datain = BigBuf_malloc(key_mem_available); if (datain == NULL) goto OUT; - isok = Flash_ReadData(DEFAULT_MF_KEYS_OFFSET + 2, datain, keyCount * 6); - if (isok != keyCount * 6) + isok = Flash_ReadData(DEFAULT_MF_KEYS_OFFSET + 2, datain, key_mem_available); + if (isok != key_mem_available) goto OUT; } @@ -1638,7 +1644,7 @@ OUT: bar |= ((uint16_t)(found[m] & 1) << j++); } - uint8_t *tmp = BigBuf_malloc(480 + 10); + uint8_t *tmp = BigBuf_malloc(480 + 10); memcpy(tmp, k_sector, sectorcnt * sizeof(sector_t)); num_to_bytes(foo, 8, tmp + 480); tmp[488] = bar & 0xFF; @@ -1702,14 +1708,16 @@ void MifareChkKeys(uint8_t *datain) { bool found; } PACKED keyresult; keyresult.found = false; - uint8_t blockNo, keyType; - uint16_t keyCount; - bool clearTrace, have_uid = false; + bool have_uid = false; + + uint8_t keyType = datain[0]; + uint8_t blockNo = datain[1]; + bool clearTrace = datain[2]; + uint16_t key_count = (datain[3] << 8) | datain[4]; + + uint16_t key_mem_available = MIN((PM3_CMD_DATA_SIZE - 5), key_count * 6); + key_count = key_mem_available / 6; - keyType = datain[0]; - blockNo = datain[1]; - clearTrace = datain[2]; - keyCount = (datain[3] << 8) | datain[4]; datain += 5; LEDsoff(); @@ -1725,7 +1733,7 @@ void MifareChkKeys(uint8_t *datain) { set_tracing(false); - for (i = 0; i < keyCount; i++) { + for (i = 0; i < key_count; i++) { // Iceman: use piwi's faster nonce collecting part in hardnested. if (!have_uid) { // need a full select cycle to get the uid first @@ -1840,7 +1848,7 @@ void MifarePersonalizeUID(uint8_t keyType, uint8_t perso_option, uint64_t key) { int len = mifare_sendcmd_short(pcs, true, MIFARE_EV1_PERSONAL_UID, perso_option, receivedAnswer, receivedAnswerPar, NULL); if (len != 1 || receivedAnswer[0] != CARD_ACK) { if (DBGLEVEL >= DBG_ERROR) Dbprintf("Cmd Error: %02x", receivedAnswer[0]); - break;; + break; } if (mifare_classic_halt(pcs, cuid)) { @@ -1932,7 +1940,7 @@ int MifareECardLoad(uint8_t sectorcnt, uint8_t keytype) { clear_trace(); set_tracing(true); - int retval; + int retval = PM3_SUCCESS; if (!iso14443a_select_card(uid, NULL, &cuid, true, 0, true)) { retval = PM3_ESOFT; @@ -1944,8 +1952,9 @@ int MifareECardLoad(uint8_t sectorcnt, uint8_t keytype) { uint64_t ui64Key = emlGetKey(sectorNo, keytype); if (sectorNo == 0) { if (mifare_classic_auth(pcs, cuid, FirstBlockOfSector(sectorNo), keytype, ui64Key, AUTH_FIRST)) { + retval = PM3_ESOFT; if (DBGLEVEL > DBG_ERROR) Dbprintf("Sector[%2d]. Auth error", sectorNo); - break; + goto out; } } else { if (mifare_classic_auth(pcs, cuid, FirstBlockOfSector(sectorNo), keytype, ui64Key, AUTH_NESTED)) { @@ -1965,16 +1974,14 @@ int MifareECardLoad(uint8_t sectorcnt, uint8_t keytype) { emlSetMem(dataoutbuf, FirstBlockOfSector(sectorNo) + blockNo, 1); } else { // sector trailer, keep the keys, set only the AC emlGetMem(dataoutbuf2, FirstBlockOfSector(sectorNo) + blockNo, 1); - memcpy(&dataoutbuf2[6], &dataoutbuf[6], 4); + memcpy(dataoutbuf2 + 6, dataoutbuf + 6, 4); emlSetMem(dataoutbuf2, FirstBlockOfSector(sectorNo) + blockNo, 1); } } } - if (mifare_classic_halt(pcs, cuid)) { - if (DBGLEVEL > DBG_ERROR) - Dbprintf("Halt error"); - } + int res = mifare_classic_halt(pcs, cuid); + (void)res; if (DBGLEVEL >= DBG_INFO) DbpString("Emulator fill sectors finished"); @@ -2000,9 +2007,9 @@ out: // bit 6 - wipe tag. //----------------------------------------------------------------------------- // magic uid card generation 1 commands -uint8_t wupC1[] = { MIFARE_MAGICWUPC1 }; -uint8_t wupC2[] = { MIFARE_MAGICWUPC2 }; -uint8_t wipeC[] = { MIFARE_MAGICWIPEC }; +static uint8_t wupC1[] = { MIFARE_MAGICWUPC1 }; +static uint8_t wupC2[] = { MIFARE_MAGICWUPC2 }; +static uint8_t wipeC[] = { MIFARE_MAGICWIPEC }; void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain) { @@ -2190,7 +2197,7 @@ void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain) { OnSuccessMagic(); } -void MifareCIdent() { +void MifareCIdent(void) { // variables uint8_t isGen = 0; uint8_t rec[1] = {0x00}; @@ -2248,7 +2255,7 @@ OUT: BigBuf_free(); } -void MifareHasStaticNonce() { +void MifareHasStaticNonce(void) { // variables int retval = PM3_SUCCESS, len; @@ -2297,7 +2304,7 @@ OUT: crypto1_deinit(pcs); } -void OnSuccessMagic() { +void OnSuccessMagic(void) { FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); LEDsoff(); set_tracing(false); diff --git a/armsrc/mifarecmd.h b/armsrc/mifarecmd.h index a4bf2b30b..2d9a4799a 100644 --- a/armsrc/mifarecmd.h +++ b/armsrc/mifarecmd.h @@ -41,18 +41,17 @@ int MifareECardLoadExt(uint8_t sectorcnt, uint8_t keytype); void MifareCSetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain); // Work with "magic Chinese" card void MifareCGetBlock(uint32_t arg0, uint32_t arg1, uint8_t *datain); -void MifareCIdent(); // is "magic chinese" card? -void MifareHasStaticNonce(); // Has the tag a static nonce? +void MifareCIdent(void); // is "magic chinese" card? +void MifareHasStaticNonce(void); // Has the tag a static nonce? void MifareSetMod(uint8_t *datain); void MifarePersonalizeUID(uint8_t keyType, uint8_t perso_option, uint64_t key); void MifareUSetPwd(uint8_t arg0, uint8_t *datain); -void OnSuccessMagic(); +void OnSuccessMagic(void); void OnErrorMagic(uint8_t reason); int32_t dist_nt(uint32_t nt1, uint32_t nt2); -void ReaderMifare(bool first_try, uint8_t block, uint8_t keytype); //void RAMFUNC SniffMifare(uint8_t param); void Mifare_DES_Auth1(uint8_t arg0, uint8_t *datain); diff --git a/armsrc/mifaredesfire.c b/armsrc/mifaredesfire.c index 1fb77ab0e..d578d026b 100644 --- a/armsrc/mifaredesfire.c +++ b/armsrc/mifaredesfire.c @@ -25,7 +25,7 @@ #define RECEIVE_SIZE 64 // the block number for the ISO14443-4 PCB -uint8_t pcb_blocknum = 0; +static uint8_t pcb_blocknum = 0; // Deselect card by sending a s-block. the crc is precalced for speed static uint8_t deselect_cmd[] = {0xc2, 0xe0, 0xb4}; @@ -33,10 +33,10 @@ static uint8_t deselect_cmd[] = {0xc2, 0xe0, 0xb4}; /* PCB CID CMD PAYLOAD */ //static uint8_t __res[MAX_FRAME_SIZE]; -struct desfire_key skey = {0}; +static struct desfire_key skey = {0}; static desfirekey_t sessionkey = &skey; -bool InitDesfireCard() { +bool InitDesfireCard(void) { pcb_blocknum = 0; @@ -107,7 +107,7 @@ void MifareSendCommand(uint8_t *datain) { LED_B_OFF(); } -void MifareDesfireGetInformation() { +void MifareDesfireGetInformation(void) { LEDsoff(); @@ -270,7 +270,8 @@ void MifareDES_Auth1(uint8_t *datain) { LED_B_OFF(); LED_C_OFF(); - if (payload->key == NULL) { + + if (payload->keylen == 0) { if (payload->algo == MFDES_AUTH_DES) { memcpy(keybytes, PICC_MASTER_KEY8, 8); } else if (payload->algo == MFDES_ALGO_AES || payload->algo == MFDES_ALGO_3DES) { @@ -682,7 +683,7 @@ size_t CreateAPDU(uint8_t *datain, size_t len, uint8_t *dataout) { // crc_update(&desfire_crc32, byte, 8); // uint32_t crc = crc_finish(&desfire_crc32); -void OnSuccess() { +void OnSuccess(void) { pcb_blocknum = 0; ReaderTransmit(deselect_cmd, 3, NULL); if (mifare_ultra_halt()) { diff --git a/armsrc/mifaredesfire.h b/armsrc/mifaredesfire.h index 1e19ec49f..b34e436f1 100644 --- a/armsrc/mifaredesfire.h +++ b/armsrc/mifaredesfire.h @@ -13,14 +13,14 @@ #include "common.h" -bool InitDesfireCard(); +bool InitDesfireCard(void); void MifareSendCommand(uint8_t *datain); -void MifareDesfireGetInformation(); +void MifareDesfireGetInformation(void); void MifareDES_Auth1(uint8_t *datain); void ReaderMifareDES(uint32_t param, uint32_t param2, uint8_t *datain); int DesfireAPDU(uint8_t *cmd, size_t cmd_len, uint8_t *dataout); size_t CreateAPDU(uint8_t *datain, size_t len, uint8_t *dataout); -void OnSuccess(); +void OnSuccess(void); void OnError(uint8_t reason); void OnErrorNG(uint16_t cmd, uint8_t reason); diff --git a/armsrc/mifaresim.c b/armsrc/mifaresim.c index ecc0ee505..60f9a7810 100644 --- a/armsrc/mifaresim.c +++ b/armsrc/mifaresim.c @@ -539,9 +539,9 @@ void Mifare1ksim(uint16_t flags, uint8_t exitAfterNReads, uint8_t *datain, uint1 if (cardSTATE == MFEMUL_NOFIELD) { #if defined RDV4 - vHf = (MAX_ADC_HF_VOLTAGE_RDV40 * AvgAdc(ADC_CHAN_HF_RDV40)) >> 10; + vHf = (MAX_ADC_HF_VOLTAGE_RDV40 * SumAdc(ADC_CHAN_HF_RDV40, 32)) >> 15; #else - vHf = (MAX_ADC_HF_VOLTAGE * AvgAdc(ADC_CHAN_HF)) >> 10; + vHf = (MAX_ADC_HF_VOLTAGE * SumAdc(ADC_CHAN_HF, 32)) >> 15; #endif if (vHf > MF_MINFIELDV) { diff --git a/armsrc/mifaresniff_disabled.c b/armsrc/mifaresniff_disabled.c index 6ccdc8e6c..76d25d228 100644 --- a/armsrc/mifaresniff_disabled.c +++ b/armsrc/mifaresniff_disabled.c @@ -308,7 +308,7 @@ bool RAMFUNC MfSniffLogic(const uint8_t *data, uint16_t len, uint8_t *parity, ui } */ -void RAMFUNC MfSniffSend() { +void RAMFUNC MfSniffSend(void) { uint16_t tracelen = BigBuf_get_traceLen(); int packlen = tracelen; // total number of bytes to send uint8_t *data = BigBuf_get_addr(); diff --git a/armsrc/mifareutil.c b/armsrc/mifareutil.c index 893db4763..71c57a963 100644 --- a/armsrc/mifareutil.c +++ b/armsrc/mifareutil.c @@ -355,7 +355,7 @@ int mifare_ultra_auth(uint8_t *keybytes) { return 1; } -int mifare_ultra_readblockEx(uint8_t blockNo, uint8_t *blockData) { +static int mifare_ultra_readblockEx(uint8_t blockNo, uint8_t *blockData) { uint16_t len = 0; uint8_t bt[2] = {0x00, 0x00}; uint8_t receivedAnswer[MAX_FRAME_SIZE] = {0x00}; @@ -509,7 +509,7 @@ int mifare_classic_halt(struct Crypto1State *pcs, uint32_t uid) { return mifare_classic_halt_ex(pcs); } -int mifare_ultra_halt() { +int mifare_ultra_halt(void) { uint16_t len = 0; uint8_t receivedAnswer[4] = {0x00, 0x00, 0x00, 0x00}; len = mifare_sendcmd_short(NULL, CRYPT_NONE, ISO14443A_CMD_HALT, 0x00, receivedAnswer, NULL, NULL); diff --git a/armsrc/mifareutil.h b/armsrc/mifareutil.h index 64eb04545..b1d6396d5 100644 --- a/armsrc/mifareutil.h +++ b/armsrc/mifareutil.h @@ -75,7 +75,7 @@ int mifare_ultra_auth(uint8_t *keybytes); int mifare_ultra_readblock(uint8_t blockNo, uint8_t *blockData); //int mifare_ultra_writeblock_compat(uint8_t blockNo, uint8_t *blockData); int mifare_ultra_writeblock(uint8_t blockNo, uint8_t *blockData); -int mifare_ultra_halt(); +int mifare_ultra_halt(void); // desfire int mifare_sendcmd_special(struct Crypto1State *pcs, uint8_t crypted, uint8_t cmd, uint8_t *data, uint8_t *answer, uint8_t *answer_parity, uint32_t *timing); diff --git a/armsrc/nprintf.c b/armsrc/nprintf.c index 645454b4e..1ce3842d3 100644 --- a/armsrc/nprintf.c +++ b/armsrc/nprintf.c @@ -127,7 +127,7 @@ typedef struct { // internal buffer output -static inline void _out_buffer(char character, void *buffer, size_t idx, size_t maxlen) { +static void _out_buffer(char character, void *buffer, size_t idx, size_t maxlen) { if (idx < maxlen) { ((char *)buffer)[idx] = character; } @@ -135,7 +135,7 @@ static inline void _out_buffer(char character, void *buffer, size_t idx, size_t // internal null output -static inline void _out_null(char character, void *buffer, size_t idx, size_t maxlen) { +static void _out_null(char character, void *buffer, size_t idx, size_t maxlen) { (void)character; (void)buffer; (void)idx; @@ -144,7 +144,7 @@ static inline void _out_null(char character, void *buffer, size_t idx, size_t ma // internal _putchar wrapper -static inline void _out_char(char character, void *buffer, size_t idx, size_t maxlen) { +static void _out_char(char character, void *buffer, size_t idx, size_t maxlen) { (void)buffer; (void)idx; (void)maxlen; @@ -155,7 +155,7 @@ static inline void _out_char(char character, void *buffer, size_t idx, size_t ma // internal output function wrapper -static inline void _out_fct(char character, void *buffer, size_t idx, size_t maxlen) { +static void _out_fct(char character, void *buffer, size_t idx, size_t maxlen) { (void)idx; (void)maxlen; if (character) { @@ -167,7 +167,7 @@ static inline void _out_fct(char character, void *buffer, size_t idx, size_t max // internal secure strlen // \return The length of the string (excluding the terminating 0) limited by 'maxsize' -static inline unsigned int _strnlen_s(const char *str, size_t maxsize) { +static unsigned int _strnlen_s(const char *str, size_t maxsize) { const char *s; for (s = str; *s && maxsize--; ++s); return (unsigned int)(s - str); @@ -176,7 +176,7 @@ static inline unsigned int _strnlen_s(const char *str, size_t maxsize) { // internal test if char is a digit (0-9) // \return true if char is a digit -static inline bool _is_digit(char ch) { +static bool _is_digit(char ch) { return (ch >= '0') && (ch <= '9'); } diff --git a/armsrc/optimized_cipher.c b/armsrc/optimized_cipher.c index 0f762a8d6..98c2034e2 100644 --- a/armsrc/optimized_cipher.c +++ b/armsrc/optimized_cipher.c @@ -77,7 +77,15 @@ -- piwi 2019 **/ +/** + add the possibility to do iCLASS on device only + -- iceman 2020 +**/ + #include "optimized_cipher.h" +#include "optimized_elite.h" +#include "optimized_ikeys.h" +#include "optimized_cipherutils.h" static const uint8_t opt_select_LUT[256] = { 00, 03, 02, 01, 02, 03, 00, 01, 04, 07, 07, 04, 06, 07, 05, 04, @@ -241,11 +249,34 @@ static void opt_MAC(uint8_t *k, uint8_t *input, uint8_t *out) { opt_output(k, &_init, out); } +static void opt_MAC_N(uint8_t *k, uint8_t *input, uint8_t in_size, uint8_t *out) { + State _init = { + ((k[0] ^ 0x4c) + 0xEC) & 0xFF,// l + ((k[0] ^ 0x4c) + 0x21) & 0xFF,// r + 0x4c, // b + 0xE012 // t + }; + + opt_suc(k, &_init, input, in_size, false); + opt_output(k, &_init, out); +} + void opt_doReaderMAC(uint8_t *cc_nr_p, uint8_t *div_key_p, uint8_t mac[4]) { uint8_t dest [] = {0, 0, 0, 0, 0, 0, 0, 0}; opt_MAC(div_key_p, cc_nr_p, dest); memcpy(mac, dest, 4); - return; +} + +void opt_doReaderMAC_2(State _init, uint8_t *nr, uint8_t mac[4], const uint8_t *div_key_p) { + opt_suc(div_key_p, &_init, nr, 4, false); + opt_output(div_key_p, &_init, mac); +} + + +void doMAC_N(uint8_t *in_p, uint8_t in_size, uint8_t *div_key_p, uint8_t mac[4]) { + uint8_t dest [] = {0, 0, 0, 0, 0, 0, 0, 0}; + opt_MAC_N(div_key_p, in_p, in_size, dest); + memcpy(mac, dest, 4); } void opt_doTagMAC(uint8_t *cc_p, const uint8_t *div_key_p, uint8_t mac[4]) { @@ -257,7 +288,6 @@ void opt_doTagMAC(uint8_t *cc_p, const uint8_t *div_key_p, uint8_t mac[4]) { }; opt_suc(div_key_p, &_init, cc_p, 12, true); opt_output(div_key_p, &_init, mac); - return; } /** @@ -291,5 +321,24 @@ State opt_doTagMAC_1(uint8_t *cc_p, const uint8_t *div_key_p) { void opt_doTagMAC_2(State _init, uint8_t *nr, uint8_t mac[4], const uint8_t *div_key_p) { opt_suc(div_key_p, &_init, nr, 4, true); opt_output(div_key_p, &_init, mac); - return; +} + + +void iclass_calc_div_key(uint8_t *csn, uint8_t *key, uint8_t *div_key, bool elite) { + if (elite) { + uint8_t keytable[128] = {0}; + uint8_t key_index[8] = {0}; + uint8_t key_sel[8] = { 0 }; + uint8_t key_sel_p[8] = { 0 }; + hash2(key, keytable); + hash1(csn, key_index); + for (uint8_t i = 0; i < 8 ; i++) + key_sel[i] = keytable[key_index[i]]; + + //Permute from iclass format to standard format + permutekey_rev(key_sel, key_sel_p); + diversifyKey(csn, key_sel_p, div_key); + } else { + diversifyKey(csn, key, div_key); + } } diff --git a/armsrc/optimized_cipher.h b/armsrc/optimized_cipher.h index c6df25ab8..587f6b7a6 100644 --- a/armsrc/optimized_cipher.h +++ b/armsrc/optimized_cipher.h @@ -21,6 +21,9 @@ typedef struct { /** The reader MAC is MAC(key, CC * NR ) **/ void opt_doReaderMAC(uint8_t *cc_nr_p, uint8_t *div_key_p, uint8_t mac[4]); + +void opt_doReaderMAC_2(State _init, uint8_t *nr, uint8_t mac[4], const uint8_t *div_key_p); + /** * The tag MAC is MAC(key, CC * NR * 32x0)) */ @@ -46,4 +49,6 @@ State opt_doTagMAC_1(uint8_t *cc_p, const uint8_t *div_key_p); */ void opt_doTagMAC_2(State _init, uint8_t *nr, uint8_t mac[4], const uint8_t *div_key_p); +void doMAC_N(uint8_t *in_p, uint8_t in_size, uint8_t *div_key_p, uint8_t mac[4]); +void iclass_calc_div_key(uint8_t *csn, uint8_t *key, uint8_t *div_key, bool elite); #endif // OPTIMIZED_CIPHER_H diff --git a/armsrc/optimized_cipherutils.c b/armsrc/optimized_cipherutils.c new file mode 100644 index 000000000..c51f83f9b --- /dev/null +++ b/armsrc/optimized_cipherutils.c @@ -0,0 +1,140 @@ +/***************************************************************************** + * WARNING + * + * THIS CODE IS CREATED FOR EXPERIMENTATION AND EDUCATIONAL USE ONLY. + * + * USAGE OF THIS CODE IN OTHER WAYS MAY INFRINGE UPON THE INTELLECTUAL + * PROPERTY OF OTHER PARTIES, SUCH AS INSIDE SECURE AND HID GLOBAL, + * AND MAY EXPOSE YOU TO AN INFRINGEMENT ACTION FROM THOSE PARTIES. + * + * THIS CODE SHOULD NEVER BE USED TO INFRINGE PATENTS OR INTELLECTUAL PROPERTY RIGHTS. + * + ***************************************************************************** + * + * This file is part of loclass. It is a reconstructon of the cipher engine + * used in iClass, and RFID techology. + * + * The implementation is based on the work performed by + * Flavio D. Garcia, Gerhard de Koning Gans, Roel Verdult and + * Milosch Meriac in the paper "Dismantling IClass". + * + * Copyright (C) 2014 Martin Holst Swende + * + * This 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, or, at your option, any later version. + * + * This file 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 loclass. If not, see . + * + * + ****************************************************************************/ +#include "optimized_cipherutils.h" +#include + +/** + * + * @brief Return and remove the first bit (x0) in the stream : + * @param stream + * @return + */ +bool headBit(BitstreamIn *stream) { + int bytepos = stream->position >> 3; // divide by 8 + int bitpos = (stream->position++) & 7; // mask out 00000111 + return (*(stream->buffer + bytepos) >> (7 - bitpos)) & 1; +} +/** + * @brief Return and remove the last bit (xn) in the stream: + * @param stream + * @return + */ +bool tailBit(BitstreamIn *stream) { + int bitpos = stream->numbits - 1 - (stream->position++); + + int bytepos = bitpos >> 3; + bitpos &= 7; + return (*(stream->buffer + bytepos) >> (7 - bitpos)) & 1; +} +/** + * @brief Pushes bit onto the stream + * @param stream + * @param bit + */ +void pushBit(BitstreamOut *stream, bool bit) { + int bytepos = stream->position >> 3; // divide by 8 + int bitpos = stream->position & 7; + *(stream->buffer + bytepos) |= (bit) << (7 - bitpos); + stream->position++; + stream->numbits++; +} + +/** + * @brief Pushes the lower six bits onto the stream + * as b0 b1 b2 b3 b4 b5 b6 + * @param stream + * @param bits + */ +void push6bits(BitstreamOut *stream, uint8_t bits) { + pushBit(stream, bits & 0x20); + pushBit(stream, bits & 0x10); + pushBit(stream, bits & 0x08); + pushBit(stream, bits & 0x04); + pushBit(stream, bits & 0x02); + pushBit(stream, bits & 0x01); +} + +/** + * @brief bitsLeft + * @param stream + * @return number of bits left in stream + */ +int bitsLeft(BitstreamIn *stream) { + return stream->numbits - stream->position; +} +/** + * @brief numBits + * @param stream + * @return Number of bits stored in stream + */ +void x_num_to_bytes(uint64_t n, size_t len, uint8_t *dest) { + while (len--) { + dest[len] = (uint8_t) n; + n >>= 8; + } +} + +uint64_t x_bytes_to_num(uint8_t *src, size_t len) { + uint64_t num = 0; + while (len--) { + num = (num << 8) | (*src); + src++; + } + return num; +} + +uint8_t reversebytes(uint8_t b) { + b = (b & 0xF0) >> 4 | (b & 0x0F) << 4; + b = (b & 0xCC) >> 2 | (b & 0x33) << 2; + b = (b & 0xAA) >> 1 | (b & 0x55) << 1; + return b; +} + +void reverse_arraybytes(uint8_t *arr, size_t len) { + uint8_t i; + for (i = 0; i < len ; i++) { + arr[i] = reversebytes(arr[i]); + } +} + +void reverse_arraycopy(uint8_t *arr, uint8_t *dest, size_t len) { + uint8_t i; + for (i = 0; i < len ; i++) { + dest[i] = reversebytes(arr[i]); + } +} + diff --git a/armsrc/optimized_cipherutils.h b/armsrc/optimized_cipherutils.h new file mode 100644 index 000000000..63ba8b8aa --- /dev/null +++ b/armsrc/optimized_cipherutils.h @@ -0,0 +1,66 @@ +/***************************************************************************** + * WARNING + * + * THIS CODE IS CREATED FOR EXPERIMENTATION AND EDUCATIONAL USE ONLY. + * + * USAGE OF THIS CODE IN OTHER WAYS MAY INFRINGE UPON THE INTELLECTUAL + * PROPERTY OF OTHER PARTIES, SUCH AS INSIDE SECURE AND HID GLOBAL, + * AND MAY EXPOSE YOU TO AN INFRINGEMENT ACTION FROM THOSE PARTIES. + * + * THIS CODE SHOULD NEVER BE USED TO INFRINGE PATENTS OR INTELLECTUAL PROPERTY RIGHTS. + * + ***************************************************************************** + * + * This file is part of loclass. It is a reconstructon of the cipher engine + * used in iClass, and RFID techology. + * + * The implementation is based on the work performed by + * Flavio D. Garcia, Gerhard de Koning Gans, Roel Verdult and + * Milosch Meriac in the paper "Dismantling IClass". + * + * Copyright (C) 2014 Martin Holst Swende + * + * This 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, or, at your option, any later version. + * + * This file 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 loclass. If not, see . + * + * + ****************************************************************************/ +#ifndef CIPHERUTILS_H +#define CIPHERUTILS_H +#include +#include +#include + +typedef struct { + uint8_t *buffer; + uint8_t numbits; + uint8_t position; +} BitstreamIn; + +typedef struct { + uint8_t *buffer; + uint8_t numbits; + uint8_t position; +} BitstreamOut; + +bool headBit(BitstreamIn *stream); +bool tailBit(BitstreamIn *stream); +void pushBit(BitstreamOut *stream, bool bit); +int bitsLeft(BitstreamIn *stream); + +void push6bits(BitstreamOut *stream, uint8_t bits); +void x_num_to_bytes(uint64_t n, size_t len, uint8_t *dest); +uint64_t x_bytes_to_num(uint8_t *src, size_t len); +uint8_t reversebytes(uint8_t b); +void reverse_arraybytes(uint8_t *arr, size_t len); +void reverse_arraycopy(uint8_t *arr, uint8_t *dest, size_t len); +#endif // CIPHERUTILS_H diff --git a/armsrc/optimized_elite.c b/armsrc/optimized_elite.c new file mode 100644 index 000000000..c84dd58be --- /dev/null +++ b/armsrc/optimized_elite.c @@ -0,0 +1,238 @@ +/***************************************************************************** + * WARNING + * + * THIS CODE IS CREATED FOR EXPERIMENTATION AND EDUCATIONAL USE ONLY. + * + * USAGE OF THIS CODE IN OTHER WAYS MAY INFRINGE UPON THE INTELLECTUAL + * PROPERTY OF OTHER PARTIES, SUCH AS INSIDE SECURE AND HID GLOBAL, + * AND MAY EXPOSE YOU TO AN INFRINGEMENT ACTION FROM THOSE PARTIES. + * + * THIS CODE SHOULD NEVER BE USED TO INFRINGE PATENTS OR INTELLECTUAL PROPERTY RIGHTS. + * + ***************************************************************************** + * + * This file is part of loclass. It is a reconstructon of the cipher engine + * used in iClass, and RFID techology. + * + * The implementation is based on the work performed by + * Flavio D. Garcia, Gerhard de Koning Gans, Roel Verdult and + * Milosch Meriac in the paper "Dismantling IClass". + * + * Copyright (C) 2014 Martin Holst Swende + * + * This 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, or, at your option, any later version. + * + * This file 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 loclass. If not, see . + * + * + * + ****************************************************************************/ +#include "optimized_elite.h" + +#include +#include +#include +#include "mbedtls/des.h" +#include "optimized_ikeys.h" + +/** + * @brief Permutes a key from standard NIST format to Iclass specific format + * from http://www.proxmark.org/forum/viewtopic.php?pid=11220#p11220 + * + * If you permute [6c 8d 44 f9 2a 2d 01 bf] you get [8a 0d b9 88 bb a7 90 ea] as shown below. + * + * 1 0 1 1 1 1 1 1 bf + * 0 0 0 0 0 0 0 1 01 + * 0 0 1 0 1 1 0 1 2d + * 0 0 1 0 1 0 1 0 2a + * 1 1 1 1 1 0 0 1 f9 + * 0 1 0 0 0 1 0 0 44 + * 1 0 0 0 1 1 0 1 8d + * 0 1 1 0 1 1 0 0 6c + * + * 8 0 b 8 b a 9 e + * a d 9 8 b 7 0 a + * + * @param key + * @param dest + */ +void permutekey(uint8_t key[8], uint8_t dest[8]) { + int i; + for (i = 0 ; i < 8 ; i++) { + dest[i] = (((key[7] & (0x80 >> i)) >> (7 - i)) << 7) | + (((key[6] & (0x80 >> i)) >> (7 - i)) << 6) | + (((key[5] & (0x80 >> i)) >> (7 - i)) << 5) | + (((key[4] & (0x80 >> i)) >> (7 - i)) << 4) | + (((key[3] & (0x80 >> i)) >> (7 - i)) << 3) | + (((key[2] & (0x80 >> i)) >> (7 - i)) << 2) | + (((key[1] & (0x80 >> i)) >> (7 - i)) << 1) | + (((key[0] & (0x80 >> i)) >> (7 - i)) << 0); + } +} +/** + * Permutes a key from iclass specific format to NIST format + * @brief permutekey_rev + * @param key + * @param dest + */ +void permutekey_rev(uint8_t key[8], uint8_t dest[8]) { + int i; + for (i = 0 ; i < 8 ; i++) { + dest[7 - i] = (((key[0] & (0x80 >> i)) >> (7 - i)) << 7) | + (((key[1] & (0x80 >> i)) >> (7 - i)) << 6) | + (((key[2] & (0x80 >> i)) >> (7 - i)) << 5) | + (((key[3] & (0x80 >> i)) >> (7 - i)) << 4) | + (((key[4] & (0x80 >> i)) >> (7 - i)) << 3) | + (((key[5] & (0x80 >> i)) >> (7 - i)) << 2) | + (((key[6] & (0x80 >> i)) >> (7 - i)) << 1) | + (((key[7] & (0x80 >> i)) >> (7 - i)) << 0); + } +} + +/** + * Helper function for hash1 + * @brief rr + * @param val + * @return + */ +static uint8_t rr(uint8_t val) { + return val >> 1 | ((val & 1) << 7); +} + +/** + * Helper function for hash1 + * @brief rl + * @param val + * @return + */ +static uint8_t rl(uint8_t val) { + return val << 1 | ((val & 0x80) >> 7); +} + +/** + * Helper function for hash1 + * @brief swap + * @param val + * @return + */ +static uint8_t swap(uint8_t val) { + return ((val >> 4) & 0xFF) | ((val & 0xFF) << 4); +} + +/** + * Hash1 takes CSN as input, and determines what bytes in the keytable will be used + * when constructing the K_sel. + * @param csn the CSN used + * @param k output + */ +void hash1(uint8_t csn[], uint8_t k[]) { + k[0] = csn[0] ^ csn[1] ^ csn[2] ^ csn[3] ^ csn[4] ^ csn[5] ^ csn[6] ^ csn[7]; + k[1] = csn[0] + csn[1] + csn[2] + csn[3] + csn[4] + csn[5] + csn[6] + csn[7]; + k[2] = rr(swap(csn[2] + k[1])); + k[3] = rl(swap(csn[3] + k[0])); + k[4] = ~rr(csn[4] + k[2]) + 1; + k[5] = ~rl(csn[5] + k[3]) + 1; + k[6] = rr(csn[6] + (k[4] ^ 0x3c)); + k[7] = rl(csn[7] + (k[5] ^ 0xc3)); + + k[7] &= 0x7F; + k[6] &= 0x7F; + k[5] &= 0x7F; + k[4] &= 0x7F; + k[3] &= 0x7F; + k[2] &= 0x7F; + k[1] &= 0x7F; + k[0] &= 0x7F; +} +/** +Definition 14. Define the rotate key function rk : (F 82 ) 8 × N → (F 82 ) 8 as +rk(x [0] . . . x [7] , 0) = x [0] . . . x [7] +rk(x [0] . . . x [7] , n + 1) = rk(rl(x [0] ) . . . rl(x [7] ), n) +**/ +static void rk(uint8_t *key, uint8_t n, uint8_t *outp_key) { + memcpy(outp_key, key, 8); + uint8_t j; + while (n-- > 0) { + for (j = 0; j < 8 ; j++) + outp_key[j] = rl(outp_key[j]); + } + return; +} + +static mbedtls_des_context ctx_enc; +static mbedtls_des_context ctx_dec; + +static void desdecrypt_iclass(uint8_t *iclass_key, uint8_t *input, uint8_t *output) { + uint8_t key_std_format[8] = {0}; + permutekey_rev(iclass_key, key_std_format); + mbedtls_des_setkey_dec(&ctx_dec, key_std_format); + mbedtls_des_crypt_ecb(&ctx_dec, input, output); +} + +static void desencrypt_iclass(uint8_t *iclass_key, uint8_t *input, uint8_t *output) { + uint8_t key_std_format[8] = {0}; + permutekey_rev(iclass_key, key_std_format); + mbedtls_des_setkey_enc(&ctx_enc, key_std_format); + mbedtls_des_crypt_ecb(&ctx_enc, input, output); +} + +/** + * @brief Insert uint8_t[8] custom master key to calculate hash2 and return key_select. + * @param key unpermuted custom key + * @param hash1 hash1 + * @param key_sel output key_sel=h[hash1[i]] + */ +void hash2(uint8_t *key64, uint8_t *outp_keytable) { + /** + *Expected: + * High Security Key Table + + 00 F1 35 59 A1 0D 5A 26 7F 18 60 0B 96 8A C0 25 C1 + 10 BF A1 3B B0 FF 85 28 75 F2 1F C6 8F 0E 74 8F 21 + 20 14 7A 55 16 C8 A9 7D B3 13 0C 5D C9 31 8D A9 B2 + 30 A3 56 83 0F 55 7E DE 45 71 21 D2 6D C1 57 1C 9C + 40 78 2F 64 51 42 7B 64 30 FA 26 51 76 D3 E0 FB B6 + 50 31 9F BF 2F 7E 4F 94 B4 BD 4F 75 91 E3 1B EB 42 + 60 3F 88 6F B8 6C 2C 93 0D 69 2C D5 20 3C C1 61 95 + 70 43 08 A0 2F FE B3 26 D7 98 0B 34 7B 47 70 A0 AB + + **** The 64-bit HS Custom Key Value = 5B7C62C491C11B39 ******/ + uint8_t key64_negated[8] = {0}; + uint8_t z[8][8] = {{0}, {0}}; + uint8_t temp_output[8] = {0}; + + //calculate complement of key + int i; + for (i = 0; i < 8; i++) + key64_negated[i] = ~key64[i]; + + // Once again, key is on iclass-format + desencrypt_iclass(key64, key64_negated, z[0]); + + uint8_t y[8][8] = {{0}, {0}}; + + // y[0]=DES_dec(z[0],~key) + // Once again, key is on iclass-format + desdecrypt_iclass(z[0], key64_negated, y[0]); + + for (i = 1; i < 8; i++) { + rk(key64, i, temp_output); + desdecrypt_iclass(temp_output, z[i - 1], z[i]); + desencrypt_iclass(temp_output, y[i - 1], y[i]); + } + + if (outp_keytable != NULL) { + for (i = 0 ; i < 8 ; i++) { + memcpy(outp_keytable + i * 16, y[i], 8); + memcpy(outp_keytable + 8 + i * 16, z[i], 8); + } + } +} diff --git a/armsrc/optimized_elite.h b/armsrc/optimized_elite.h new file mode 100644 index 000000000..281ecf0bb --- /dev/null +++ b/armsrc/optimized_elite.h @@ -0,0 +1,62 @@ +/***************************************************************************** + * WARNING + * + * THIS CODE IS CREATED FOR EXPERIMENTATION AND EDUCATIONAL USE ONLY. + * + * USAGE OF THIS CODE IN OTHER WAYS MAY INFRINGE UPON THE INTELLECTUAL + * PROPERTY OF OTHER PARTIES, SUCH AS INSIDE SECURE AND HID GLOBAL, + * AND MAY EXPOSE YOU TO AN INFRINGEMENT ACTION FROM THOSE PARTIES. + * + * THIS CODE SHOULD NEVER BE USED TO INFRINGE PATENTS OR INTELLECTUAL PROPERTY RIGHTS. + * + ***************************************************************************** + * + * This file is part of loclass. It is a reconstructon of the cipher engine + * used in iClass, and RFID techology. + * + * The implementation is based on the work performed by + * Flavio D. Garcia, Gerhard de Koning Gans, Roel Verdult and + * Milosch Meriac in the paper "Dismantling IClass". + * + * Copyright (C) 2014 Martin Holst Swende + * + * This 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, or, at your option, any later version. + * + * This file 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 loclass. If not, see . + * + * + ****************************************************************************/ + + +#ifndef ELITE_CRACK_H +#define ELITE_CRACK_H + +#include +#include + +void permutekey(uint8_t key[8], uint8_t dest[8]); +/** + * Permutes a key from iclass specific format to NIST format + * @brief permutekey_rev + * @param key + * @param dest + */ +void permutekey_rev(uint8_t key[8], uint8_t dest[8]); +/** + * Hash1 takes CSN as input, and determines what bytes in the keytable will be used + * when constructing the K_sel. + * @param csn the CSN used + * @param k output + */ +void hash1(uint8_t *csn, uint8_t *k); +void hash2(uint8_t *key64, uint8_t *outp_keytable); + +#endif diff --git a/armsrc/optimized_ikeys.c b/armsrc/optimized_ikeys.c new file mode 100644 index 000000000..eeb00e562 --- /dev/null +++ b/armsrc/optimized_ikeys.c @@ -0,0 +1,324 @@ +/***************************************************************************** + * WARNING + * + * THIS CODE IS CREATED FOR EXPERIMENTATION AND EDUCATIONAL USE ONLY. + * + * USAGE OF THIS CODE IN OTHER WAYS MAY INFRINGE UPON THE INTELLECTUAL + * PROPERTY OF OTHER PARTIES, SUCH AS INSIDE SECURE AND HID GLOBAL, + * AND MAY EXPOSE YOU TO AN INFRINGEMENT ACTION FROM THOSE PARTIES. + * + * THIS CODE SHOULD NEVER BE USED TO INFRINGE PATENTS OR INTELLECTUAL PROPERTY RIGHTS. + * + ***************************************************************************** + * + * This file is part of loclass. It is a reconstructon of the cipher engine + * used in iClass, and RFID techology. + * + * The implementation is based on the work performed by + * Flavio D. Garcia, Gerhard de Koning Gans, Roel Verdult and + * Milosch Meriac in the paper "Dismantling IClass". + * + * Copyright (C) 2014 Martin Holst Swende + * + * This 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, or, at your option, any later version. + * + * This file 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 loclass. If not, see . + * + * + ****************************************************************************/ + +/** +From "Dismantling iclass": + This section describes in detail the built-in key diversification algorithm of iClass. + Besides the obvious purpose of deriving a card key from a master key, this + algorithm intends to circumvent weaknesses in the cipher by preventing the + usage of certain ‘weak’ keys. In order to compute a diversified key, the iClass + reader first encrypts the card identity id with the master key K, using single + DES. The resulting ciphertext is then input to a function called hash0 which + outputs the diversified key k. + + k = hash0(DES enc (id, K)) + + Here the DES encryption of id with master key K outputs a cryptogram c + of 64 bits. These 64 bits are divided as c = x, y, z [0] , . . . , z [7] ∈ F 82 × F 82 × (F 62 ) 8 + which is used as input to the hash0 function. This function introduces some + obfuscation by performing a number of permutations, complement and modulo + operations, see Figure 2.5. Besides that, it checks for and removes patterns like + similar key bytes, which could produce a strong bias in the cipher. Finally, the + output of hash0 is the diversified card key k = k [0] , . . . , k [7] ∈ (F 82 ) 8 . + +**/ +#include "optimized_ikeys.h" + +#include +#include +#include +#include "mbedtls/des.h" +#include "optimized_cipherutils.h" + +uint8_t pi[35] = { + 0x0F, 0x17, 0x1B, 0x1D, 0x1E, 0x27, 0x2B, 0x2D, + 0x2E, 0x33, 0x35, 0x39, 0x36, 0x3A, 0x3C, 0x47, + 0x4B, 0x4D, 0x4E, 0x53, 0x55, 0x56, 0x59, 0x5A, + 0x5C, 0x63, 0x65, 0x66, 0x69, 0x6A, 0x6C, 0x71, + 0x72, 0x74, 0x78 +}; + +static mbedtls_des_context ctx_enc; + +/** + * @brief The key diversification algorithm uses 6-bit bytes. + * This implementation uses 64 bit uint to pack seven of them into one + * variable. When they are there, they are placed as follows: + * XXXX XXXX N0 .... N7, occupying the last 48 bits. + * + * This function picks out one from such a collection + * @param all + * @param n bitnumber + * @return + */ +static uint8_t getSixBitByte(uint64_t c, int n) { + return (c >> (42 - 6 * n)) & 0x3F; +} + +/** + * @brief Puts back a six-bit 'byte' into a uint64_t. + * @param c buffer + * @param z the value to place there + * @param n bitnumber. + */ +static void pushbackSixBitByte(uint64_t *c, uint8_t z, int n) { + //0x XXXX YYYY ZZZZ ZZZZ ZZZZ + // ^z0 ^z7 + //z0: 1111 1100 0000 0000 + + uint64_t masked = z & 0x3F; + uint64_t eraser = 0x3F; + masked <<= 42 - 6 * n; + eraser <<= 42 - 6 * n; + + //masked <<= 6*n; + //eraser <<= 6*n; + + eraser = ~eraser; + (*c) &= eraser; + (*c) |= masked; + +} +/** + * @brief Swaps the z-values. + * If the input value has format XYZ0Z1...Z7, the output will have the format + * XYZ7Z6...Z0 instead + * @param c + * @return + */ +static uint64_t swapZvalues(uint64_t c) { + uint64_t newz = 0; + pushbackSixBitByte(&newz, getSixBitByte(c, 0), 7); + pushbackSixBitByte(&newz, getSixBitByte(c, 1), 6); + pushbackSixBitByte(&newz, getSixBitByte(c, 2), 5); + pushbackSixBitByte(&newz, getSixBitByte(c, 3), 4); + pushbackSixBitByte(&newz, getSixBitByte(c, 4), 3); + pushbackSixBitByte(&newz, getSixBitByte(c, 5), 2); + pushbackSixBitByte(&newz, getSixBitByte(c, 6), 1); + pushbackSixBitByte(&newz, getSixBitByte(c, 7), 0); + newz |= (c & 0xFFFF000000000000); + return newz; +} + +/** +* @return 4 six-bit bytes chunked into a uint64_t,as 00..00a0a1a2a3 +*/ +static uint64_t ck(int i, int j, uint64_t z) { + if (i == 1 && j == -1) { + // ck(1, −1, z [0] . . . z [3] ) = z [0] . . . z [3] + return z; + } else if (j == -1) { + // ck(i, −1, z [0] . . . z [3] ) = ck(i − 1, i − 2, z [0] . . . z [3] ) + return ck(i - 1, i - 2, z); + } + + if (getSixBitByte(z, i) == getSixBitByte(z, j)) { + //ck(i, j − 1, z [0] . . . z [i] ↠j . . . z [3] ) + uint64_t newz = 0; + int c; + for (c = 0; c < 4; c++) { + uint8_t val = getSixBitByte(z, c); + if (c == i) + pushbackSixBitByte(&newz, j, c); + else + pushbackSixBitByte(&newz, val, c); + } + return ck(i, j - 1, newz); + } else { + return ck(i, j - 1, z); + } +} +/** + + Definition 8. + Let the function check : (F 62 ) 8 → (F 62 ) 8 be defined as + check(z [0] . . . z [7] ) = ck(3, 2, z [0] . . . z [3] ) · ck(3, 2, z [4] . . . z [7] ) + + where ck : N × N × (F 62 ) 4 → (F 62 ) 4 is defined as + + ck(1, −1, z [0] . . . z [3] ) = z [0] . . . z [3] + ck(i, −1, z [0] . . . z [3] ) = ck(i − 1, i − 2, z [0] . . . z [3] ) + ck(i, j, z [0] . . . z [3] ) = + ck(i, j − 1, z [0] . . . z [i] ↠j . . . z [3] ), if z [i] = z [j] ; + ck(i, j − 1, z [0] . . . z [3] ), otherwise + + otherwise. +**/ + +static uint64_t check(uint64_t z) { + //These 64 bits are divided as c = x, y, z [0] , . . . , z [7] + + // ck(3, 2, z [0] . . . z [3] ) + uint64_t ck1 = ck(3, 2, z); + + // ck(3, 2, z [4] . . . z [7] ) + uint64_t ck2 = ck(3, 2, z << 24); + + //The ck function will place the values + // in the middle of z. + ck1 &= 0x00000000FFFFFF000000; + ck2 &= 0x00000000FFFFFF000000; + + return ck1 | ck2 >> 24; +} + +static void permute(BitstreamIn *p_in, uint64_t z, int l, int r, BitstreamOut *out) { + if (bitsLeft(p_in) == 0) + return; + + bool pn = tailBit(p_in); + if (pn) { // pn = 1 + uint8_t zl = getSixBitByte(z, l); + + push6bits(out, zl + 1); + permute(p_in, z, l + 1, r, out); + } else { // otherwise + uint8_t zr = getSixBitByte(z, r); + + push6bits(out, zr); + permute(p_in, z, l, r + 1, out); + } +} + +/** + * @brief + *Definition 11. Let the function hash0 : F 82 × F 82 × (F 62 ) 8 → (F 82 ) 8 be defined as + * hash0(x, y, z [0] . . . z [7] ) = k [0] . . . k [7] where + * z'[i] = (z[i] mod (63-i)) + i i = 0...3 + * z'[i+4] = (z[i+4] mod (64-i)) + i i = 0...3 + * ẑ = check(z'); + * @param c + * @param k this is where the diversified key is put (should be 8 bytes) + * @return + */ +void hash0(uint64_t c, uint8_t k[8]) { + c = swapZvalues(c); + + //These 64 bits are divided as c = x, y, z [0] , . . . , z [7] + // x = 8 bits + // y = 8 bits + // z0-z7 6 bits each : 48 bits + uint8_t x = (c & 0xFF00000000000000) >> 56; + uint8_t y = (c & 0x00FF000000000000) >> 48; + uint64_t zP = 0; + + for (int n = 0; n < 4 ; n++) { + uint8_t zn = getSixBitByte(c, n); + uint8_t zn4 = getSixBitByte(c, n + 4); + uint8_t _zn = (zn % (63 - n)) + n; + uint8_t _zn4 = (zn4 % (64 - n)) + n; + pushbackSixBitByte(&zP, _zn, n); + pushbackSixBitByte(&zP, _zn4, n + 4); + } + + uint64_t zCaret = check(zP); + uint8_t p = pi[x % 35]; + + if (x & 1) //Check if x7 is 1 + p = ~p; + + BitstreamIn p_in = { &p, 8, 0 }; + uint8_t outbuffer[] = {0, 0, 0, 0, 0, 0, 0, 0}; + BitstreamOut out = {outbuffer, 0, 0}; + permute(&p_in, zCaret, 0, 4, &out); //returns 48 bits? or 6 8-bytes + + //Out is now a buffer containing six-bit bytes, should be 48 bits + // if all went well + //Shift z-values down onto the lower segment + + uint64_t zTilde = x_bytes_to_num(outbuffer, sizeof(outbuffer)); + + zTilde >>= 16; + + for (int i = 0; i < 8; i++) { + // the key on index i is first a bit from y + // then six bits from z, + // then a bit from p + + // Init with zeroes + k[i] = 0; + // First, place yi leftmost in k + //k[i] |= (y << i) & 0x80 ; + + // First, place y(7-i) leftmost in k + k[i] |= (y << (7 - i)) & 0x80 ; + + uint8_t zTilde_i = getSixBitByte(zTilde, i); + // zTildeI is now on the form 00XXXXXX + // with one leftshift, it'll be + // 0XXXXXX0 + // So after leftshift, we can OR it into k + // However, when doing complement, we need to + // again MASK 0XXXXXX0 (0x7E) + zTilde_i <<= 1; + + //Finally, add bit from p or p-mod + //Shift bit i into rightmost location (mask only after complement) + uint8_t p_i = p >> i & 0x1; + + if (k[i]) { // yi = 1 + k[i] |= ~zTilde_i & 0x7E; + k[i] |= p_i & 1; + k[i] += 1; + + } else { // otherwise + k[i] |= zTilde_i & 0x7E; + k[i] |= (~p_i) & 1; + } + } +} +/** + * @brief Performs Elite-class key diversification + * @param csn + * @param key + * @param div_key + */ +void diversifyKey(uint8_t *csn, uint8_t *key, uint8_t *div_key) { + // Prepare the DES key + mbedtls_des_setkey_enc(&ctx_enc, key); + + uint8_t crypted_csn[8] = {0}; + + // Calculate DES(CSN, KEY) + mbedtls_des_crypt_ecb(&ctx_enc, csn, crypted_csn); + + //Calculate HASH0(DES)) + uint64_t c_csn = x_bytes_to_num(crypted_csn, sizeof(crypted_csn)); + + hash0(c_csn, div_key); +} + diff --git a/armsrc/optimized_ikeys.h b/armsrc/optimized_ikeys.h new file mode 100644 index 000000000..91fa406ad --- /dev/null +++ b/armsrc/optimized_ikeys.h @@ -0,0 +1,69 @@ +/***************************************************************************** + * WARNING + * + * THIS CODE IS CREATED FOR EXPERIMENTATION AND EDUCATIONAL USE ONLY. + * + * USAGE OF THIS CODE IN OTHER WAYS MAY INFRINGE UPON THE INTELLECTUAL + * PROPERTY OF OTHER PARTIES, SUCH AS INSIDE SECURE AND HID GLOBAL, + * AND MAY EXPOSE YOU TO AN INFRINGEMENT ACTION FROM THOSE PARTIES. + * + * THIS CODE SHOULD NEVER BE USED TO INFRINGE PATENTS OR INTELLECTUAL PROPERTY RIGHTS. + * + ***************************************************************************** + * + * This file is part of loclass. It is a reconstructon of the cipher engine + * used in iClass, and RFID techology. + * + * The implementation is based on the work performed by + * Flavio D. Garcia, Gerhard de Koning Gans, Roel Verdult and + * Milosch Meriac in the paper "Dismantling IClass". + * + * Copyright (C) 2014 Martin Holst Swende + * + * This 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, or, at your option, any later version. + * + * This file 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 loclass. If not, see . + * + * + ****************************************************************************/ + +#ifndef IKEYS_H +#define IKEYS_H + +#include + +/** + * @brief + *Definition 11. Let the function hash0 : F 82 × F 82 × (F 62 ) 8 → (F 82 ) 8 be defined as + * hash0(x, y, z [0] . . . z [7] ) = k [0] . . . k [7] where + * z'[i] = (z[i] mod (63-i)) + i i = 0...3 + * z'[i+4] = (z[i+4] mod (64-i)) + i i = 0...3 + * ẑ = check(z'); + * @param c + * @param k this is where the diversified key is put (should be 8 bytes) + * @return + */ +void hash0(uint64_t c, uint8_t k[8]); +/** + * @brief Performs Elite-class key diversification + * @param csn + * @param key + * @param div_key + */ + +void diversifyKey(uint8_t csn[8], uint8_t key[8], uint8_t div_key[8]); +/** + * @brief Permutes a key from standard NIST format to Iclass specific format + * @param key + * @param dest + */ + +#endif // IKEYS_H diff --git a/armsrc/pcf7931.c b/armsrc/pcf7931.c index 21a739f45..6ad44d7c4 100644 --- a/armsrc/pcf7931.c +++ b/armsrc/pcf7931.c @@ -173,7 +173,7 @@ bool IsBlock1PCF7931(uint8_t *block) { return false; } -void ReadPCF7931() { +void ReadPCF7931(void) { int found_blocks = 0; // successfully read blocks int max_blocks = 8; // readable blocks uint8_t memory_blocks[8][17]; // PCF content diff --git a/armsrc/pcf7931.h b/armsrc/pcf7931.h index 67a11f5f8..b9ad40a92 100644 --- a/armsrc/pcf7931.h +++ b/armsrc/pcf7931.h @@ -6,7 +6,7 @@ size_t DemodPCF7931(uint8_t **outBlocks); bool IsBlock0PCF7931(uint8_t *block); bool IsBlock1PCF7931(uint8_t *block); -void ReadPCF7931(); +void ReadPCF7931(void); void SendCmdPCF7931(uint32_t *tab); bool AddBytePCF7931(uint8_t byte, uint32_t *tab, int32_t l, int32_t p); bool AddBitPCF7931(bool b, uint32_t *tab, int32_t l, int32_t p); diff --git a/armsrc/printf.c b/armsrc/printf.c index 0dffbb037..2d18a9c53 100644 --- a/armsrc/printf.c +++ b/armsrc/printf.c @@ -47,7 +47,7 @@ typedef int ssize_t; #define NBBY 8 /* number of bits in a byte */ -char const hex2ascii_data[] = "0123456789abcdefghijklmnopqrstuvwxyz"; +static char const hex2ascii_data[] = "0123456789abcdefghijklmnopqrstuvwxyz"; #define hex2ascii(hex) (hex2ascii_data[hex]) #define toupper(c) ((c) - 0x20 * (((c) >= 'a') && ((c) <= 'z'))) diff --git a/armsrc/spiffs.c b/armsrc/spiffs.c index 3db0e3c27..dac1de449 100644 --- a/armsrc/spiffs.c +++ b/armsrc/spiffs.c @@ -108,7 +108,7 @@ static enum spiffs_mount_status { RDV40_SPIFFS_UNKNOWN } RDV40_SPIFFS_MOUNT_STATUS; -int rdv40_spiffs_mounted() { +static int rdv40_spiffs_mounted(void) { int ret = 0; switch (RDV40_SPIFFS_MOUNT_STATUS) { @@ -124,7 +124,7 @@ int rdv40_spiffs_mounted() { return ret; } -int rdv40_spiffs_mount() { +int rdv40_spiffs_mount(void) { if (rdv40_spiffs_mounted()) { Dbprintf("ERR: SPIFFS already mounted !"); return SPIFFS_ERR_MOUNTED; @@ -146,7 +146,7 @@ int rdv40_spiffs_mount() { return ret; } -int rdv40_spiffs_unmount() { +int rdv40_spiffs_unmount(void) { if (!rdv40_spiffs_mounted()) { Dbprintf("ERR: SPIFFS not mounted !"); return SPIFFS_ERR_NOT_MOUNTED; @@ -162,7 +162,7 @@ int rdv40_spiffs_unmount() { return ret; } -int rdv40_spiffs_check() { +int rdv40_spiffs_check(void) { rdv40_spiffs_lazy_mount(); SPIFFS_check(&fs); SPIFFS_gc_quick(&fs, 0); @@ -195,17 +195,17 @@ void read_from_spiffs(const char *filename, uint8_t *dst, uint32_t size) { SPIFFS_close(&fs, fd); } -void rename_in_spiffs(const char *old_filename, const char *new_filename) { +static void rename_in_spiffs(const char *old_filename, const char *new_filename) { if (SPIFFS_rename(&fs, old_filename, new_filename) < 0) Dbprintf("errno %i\n", SPIFFS_errno(&fs)); } -void remove_from_spiffs(const char *filename) { +static void remove_from_spiffs(const char *filename) { if (SPIFFS_remove(&fs, filename) < 0) Dbprintf("errno %i\n", SPIFFS_errno(&fs)); } -spiffs_stat stat_in_spiffs(const char *filename) { +static spiffs_stat stat_in_spiffs(const char *filename) { spiffs_stat s; if (SPIFFS_stat(&fs, filename, &s) < 0) Dbprintf("errno %i\n", SPIFFS_errno(&fs)); @@ -217,7 +217,7 @@ uint32_t size_in_spiffs(const char *filename) { return s.size; } -rdv40_spiffs_fsinfo info_of_spiffs() { +static rdv40_spiffs_fsinfo info_of_spiffs(void) { rdv40_spiffs_fsinfo fsinfo; fsinfo.blockSize = SPIFFS_CFG_LOG_BLOCK_SZ; fsinfo.pageSize = LOG_PAGE_SIZE; @@ -238,7 +238,7 @@ int exists_in_spiffs(const char *filename) { return rc == SPIFFS_OK; } -RDV40SpiFFSFileType filetype_in_spiffs(const char *filename) { +static RDV40SpiFFSFileType filetype_in_spiffs(const char *filename) { RDV40SpiFFSFileType filetype = RDV40_SPIFFS_FILETYPE_UNKNOWN; char symlinked[SPIFFS_OBJ_NAME_LEN]; sprintf(symlinked, "%s.lnk", filename); @@ -270,16 +270,16 @@ RDV40SpiFFSFileType filetype_in_spiffs(const char *filename) { } return filetype; } - -int is_valid_filename(const char *filename) { +/* +static int is_valid_filename(const char *filename) { if (filename == NULL) { return false; } uint32_t len = strlen(filename); return len > 0 && len < SPIFFS_OBJ_NAME_LEN; } - -void copy_in_spiffs(const char *src, const char *dst) { +*/ +static void copy_in_spiffs(const char *src, const char *dst) { uint32_t size = size_in_spiffs((char *)src); uint8_t *mem = BigBuf_malloc(size); read_from_spiffs((char *)src, (uint8_t *)mem, size); @@ -297,7 +297,7 @@ void copy_in_spiffs(const char *src, const char *dst) { // 1 if the mount status actually changed // so you know what to do IN CASE you wished to set things "back to previous // state" -int rdv40_spiffs_lazy_mount() { +int rdv40_spiffs_lazy_mount(void) { int changed = 0; if (!rdv40_spiffs_mounted()) { changed = rdv40_spiffs_mount(); @@ -309,7 +309,7 @@ int rdv40_spiffs_lazy_mount() { } // unmount if not already -int rdv40_spiffs_lazy_unmount() { +int rdv40_spiffs_lazy_unmount(void) { int changed = 0; if (rdv40_spiffs_mounted()) { changed = rdv40_spiffs_unmount(); @@ -362,7 +362,7 @@ void my_lazy_spiffs_act(){ // this lazy_mount since needed and can also report back the change on state implied by eventual mount, if needed rdv40_spiffs_lazy_read((const char *)".SHOULDRESET",(uint8_t *)resetret,4); if( resetret == "YESS" ) { uint8_t -changed = rdv40_spiffs_lazy_format(); // this will imply change only if we where +changed = rdv40_spiffs_lazy_format(void); // this will imply change only if we where already mounted beforehand, was the case after our reading without further rollback rdv40_spiffs_lazy_mount_rollback(changed); // so if we were mounted just get back to this state. If not, just don't. @@ -400,20 +400,20 @@ int rdv40_spiffs_lazy_mount_rollback(int changed) { // statement or some function taking function parameters // TODO : forbid writing to a filename which already exists as lnk ! // TODO : forbid writing to a filename.lnk which already exists without lnk ! -int rdv40_spiffs_write(char *filename, uint8_t *src, uint32_t size, RDV40SpiFFSSafetyLevel level) { +int rdv40_spiffs_write(const char *filename, uint8_t *src, uint32_t size, RDV40SpiFFSSafetyLevel level) { RDV40_SPIFFS_SAFE_FUNCTION( write_to_spiffs(filename, src, size); ) } -int rdv40_spiffs_append(char *filename, uint8_t *src, uint32_t size, RDV40SpiFFSSafetyLevel level) { +int rdv40_spiffs_append(const char *filename, uint8_t *src, uint32_t size, RDV40SpiFFSSafetyLevel level) { RDV40_SPIFFS_SAFE_FUNCTION( append_to_spiffs(filename, src, size); ) } // todo integrate reading symlinks transparently -int rdv40_spiffs_read(char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level) { +int rdv40_spiffs_read(const char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level) { RDV40_SPIFFS_SAFE_FUNCTION( read_from_spiffs(filename, dst, size); ) @@ -444,7 +444,7 @@ int rdv40_spiffs_stat(char *filename, uint32_t *buf, RDV40SpiFFSSafetyLevel leve ) } -int rdv40_spiffs_getfsinfo(rdv40_spiffs_fsinfo *fsinfo, RDV40SpiFFSSafetyLevel level) { +static int rdv40_spiffs_getfsinfo(rdv40_spiffs_fsinfo *fsinfo, RDV40SpiFFSSafetyLevel level) { RDV40_SPIFFS_SAFE_FUNCTION( // *fsinfo = info_of_spiffs(); // ) @@ -472,14 +472,18 @@ int rdv40_spiffs_is_symlink(const char *s) { // ATTENTION : you must NOT provide the whole filename (so please do not include the .lnk extension) // TODO : integrate in read_function int rdv40_spiffs_read_as_symlink(char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level) { - RDV40_SPIFFS_SAFE_FUNCTION( // - char linkdest[SPIFFS_OBJ_NAME_LEN]; // - char linkfilename[SPIFFS_OBJ_NAME_LEN]; // + RDV40_SPIFFS_SAFE_FUNCTION( + char linkdest[SPIFFS_OBJ_NAME_LEN]; + char linkfilename[SPIFFS_OBJ_NAME_LEN]; sprintf(linkfilename, "%s.lnk", filename); - if (DBGLEVEL > 1) Dbprintf("Linkk real filename is destination is : %s", linkfilename); + + if (DBGLEVEL > 1) Dbprintf("Linkk real filename is : " _YELLOW_("%s"), linkfilename); + read_from_spiffs((char *)linkfilename, (uint8_t *)linkdest, SPIFFS_OBJ_NAME_LEN); - if (DBGLEVEL > 1) Dbprintf("Symlink destination is : %s", linkdest); - read_from_spiffs((char *)linkdest, (uint8_t *)dst, size); // + + if (DBGLEVEL > 1) Dbprintf("Symlink destination is : " _YELLOW_("%s"), linkdest); + + read_from_spiffs((char *)linkdest, (uint8_t *)dst, size); ) } @@ -496,10 +500,10 @@ int rdv40_spiffs_read_as_symlink(char *filename, uint8_t *dst, uint32_t size, RD // rdv40_spiffs_read_as_symlink((uint8_t *)"world",(uint8_t *) buffer, orig_file_size, RDV40_SPIFFS_SAFETY_SAFE); // TODO : FORBID creating a symlink with a basename (before.lnk) which already exists as a file ! int rdv40_spiffs_make_symlink(char *linkdest, char *filename, RDV40SpiFFSSafetyLevel level) { - RDV40_SPIFFS_SAFE_FUNCTION( // - char linkfilename[SPIFFS_OBJ_NAME_LEN]; // + RDV40_SPIFFS_SAFE_FUNCTION( + char linkfilename[SPIFFS_OBJ_NAME_LEN]; sprintf(linkfilename, "%s.lnk", filename); - write_to_spiffs((char *)linkfilename, (uint8_t *)linkdest, SPIFFS_OBJ_NAME_LEN); // + write_to_spiffs((char *)linkfilename, (uint8_t *)linkdest, SPIFFS_OBJ_NAME_LEN); ) } @@ -510,8 +514,8 @@ int rdv40_spiffs_make_symlink(char *linkdest, char *filename, RDV40SpiFFSSafetyL // preexistance, avoiding a link being created if filename exists, or avoiding a file being created if // symlink exists with same name int rdv40_spiffs_read_as_filetype(char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level) { - RDV40_SPIFFS_SAFE_FUNCTION( // - RDV40SpiFFSFileType filetype = filetype_in_spiffs((char *)filename); // + RDV40_SPIFFS_SAFE_FUNCTION( + RDV40SpiFFSFileType filetype = filetype_in_spiffs((char *)filename); switch (filetype) { case RDV40_SPIFFS_FILETYPE_REAL: rdv40_spiffs_read((char *)filename, (uint8_t *)dst, size, level); @@ -523,7 +527,7 @@ int rdv40_spiffs_read_as_filetype(char *filename, uint8_t *dst, uint32_t size, R case RDV40_SPIFFS_FILETYPE_UNKNOWN: default: ; - } // + } ) } @@ -536,13 +540,13 @@ int rdv40_spiffs_read_as_filetype(char *filename, uint8_t *dst, uint32_t size, R //////////////////////////////////////////////////////////////////////////////// ///////// MISC HIGH LEVEL FUNCTIONS //////////////////////////////////////////// -#define SPIFFS_BANNER DbpString(_BLUE_("Flash Memory FileSystem tree (SPIFFS)")); +#define SPIFFS_BANNER DbpString(_CYAN_("Flash Memory FileSystem tree (SPIFFS)")); -void rdv40_spiffs_safe_print_fsinfo() { +void rdv40_spiffs_safe_print_fsinfo(void) { rdv40_spiffs_fsinfo fsinfo; rdv40_spiffs_getfsinfo(&fsinfo, RDV40_SPIFFS_SAFETY_SAFE); - DbpString(_BLUE_("Flash Memory FileSystem Info (SPIFFS)")); + DbpString(_CYAN_("Flash Memory FileSystem Info (SPIFFS)")); Dbprintf(" Logical Block Size........." _YELLOW_("%d")" bytes", fsinfo.blockSize); @@ -552,7 +556,7 @@ void rdv40_spiffs_safe_print_fsinfo() { Dbprintf(" Max Path Length............" _YELLOW_("%d")" chars", fsinfo.maxPathLength); DbpString(""); Dbprintf(" filesystem size used available use% mounted"); - Dbprintf(" spiffs %6d B %6d B %6d B"_YELLOW_("%2d%")" /" + Dbprintf(" spiffs %6d B %6d B %6d B " _YELLOW_("%2d%")" /" , fsinfo.totalBytes , fsinfo.usedBytes , fsinfo.freeBytes @@ -570,7 +574,7 @@ void rdv40_spiffs_safe_print_fsinfo() { void rdv40_spiffs_safe_print_tree(uint8_t banner) { if (banner) { - DbpString(_BLUE_("Flash Memory FileSystem tree (SPIFFS)")); + DbpString(_CYAN_("Flash Memory FileSystem tree (SPIFFS)")); Dbprintf("-------------------------------------"); } @@ -601,9 +605,40 @@ void rdv40_spiffs_safe_print_tree(uint8_t banner) { rdv40_spiffs_lazy_mount_rollback(changed); } +void rdv40_spiffs_safe_wipe(void) { + + int changed = rdv40_spiffs_lazy_mount(); + + spiffs_DIR d; + struct spiffs_dirent e; + struct spiffs_dirent *pe = &e; + SPIFFS_opendir(&fs, "/", &d); + + while ((pe = SPIFFS_readdir(&d, pe))) { + + if (rdv40_spiffs_is_symlink((const char *)pe->name)) { + + char linkdest[SPIFFS_OBJ_NAME_LEN]; + read_from_spiffs((char *)pe->name, (uint8_t *)linkdest, SPIFFS_OBJ_NAME_LEN); + + remove_from_spiffs(linkdest); + Dbprintf(".lnk removed %s", pe->name); + + remove_from_spiffs((char *)pe->name); + Dbprintf("removed %s", linkdest); + + } else { + remove_from_spiffs((char *)pe->name); + Dbprintf("removed %s", pe->name); + } + } + + SPIFFS_closedir(&d); + rdv40_spiffs_lazy_mount_rollback(changed); +} // Selftest function -void test_spiffs() { +void test_spiffs(void) { Dbprintf("----------------------------------------------"); Dbprintf("Testing SPIFFS operations"); Dbprintf("----------------------------------------------"); diff --git a/armsrc/spiffs.h b/armsrc/spiffs.h index f10c86db0..8754cb432 100644 --- a/armsrc/spiffs.h +++ b/armsrc/spiffs.h @@ -33,31 +33,33 @@ typedef struct rdv40_spiffs_fsinfo { int rdv40_spiffs_read_as_filetype(char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level); -int rdv40_spiffs_check(); -int rdv40_spiffs_lazy_unmount(); -int rdv40_spiffs_lazy_mount(); +int rdv40_spiffs_check(void); +int rdv40_spiffs_lazy_unmount(void); +int rdv40_spiffs_lazy_mount(void); int rdv40_spiffs_lazy_mount_rollback(int changed); -int rdv40_spiffs_write(char *filename, uint8_t *src, uint32_t size, RDV40SpiFFSSafetyLevel level); -int rdv40_spiffs_read(char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level); +int rdv40_spiffs_write(const char *filename, uint8_t *src, uint32_t size, RDV40SpiFFSSafetyLevel level); +int rdv40_spiffs_read(const char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level); int rdv40_spiffs_rename(char *old_filename, char *new_filename, RDV40SpiFFSSafetyLevel level); int rdv40_spiffs_remove(char *filename, RDV40SpiFFSSafetyLevel level); int rdv40_spiffs_read_as_symlink(char *filename, uint8_t *dst, uint32_t size, RDV40SpiFFSSafetyLevel level); void write_to_spiffs(const char *filename, uint8_t *src, uint32_t size); void read_from_spiffs(const char *filename, uint8_t *dst, uint32_t size); -void test_spiffs(); +void test_spiffs(void); void rdv40_spiffs_safe_print_tree(uint8_t banner); -int rdv40_spiffs_unmount(); -int rdv40_spiffs_mount(); +int rdv40_spiffs_unmount(void); +int rdv40_spiffs_mount(void); int rdv40_spiffs_is_symlink(const char *s); -void rdv40_spiffs_safe_print_fsinfo(); +void rdv40_spiffs_safe_print_fsinfo(void); int rdv40_spiffs_make_symlink(char *linkdest, char *filename, RDV40SpiFFSSafetyLevel level); void append_to_spiffs(const char *filename, uint8_t *src, uint32_t size); int rdv40_spiffs_copy(char *src, char *dst, RDV40SpiFFSSafetyLevel level); -int rdv40_spiffs_append(char *filename, uint8_t *src, uint32_t size, RDV40SpiFFSSafetyLevel level); +int rdv40_spiffs_append(const char *filename, uint8_t *src, uint32_t size, RDV40SpiFFSSafetyLevel level); int rdv40_spiffs_stat(char *filename, uint32_t *buf, RDV40SpiFFSSafetyLevel level); uint32_t size_in_spiffs(const char *filename); int exists_in_spiffs(const char *filename); +void rdv40_spiffs_safe_wipe(void); + #define SPIFFS_OK 0 #define SPIFFS_ERR_NOT_MOUNTED -10000 #define SPIFFS_ERR_FULL -10001 diff --git a/armsrc/spiffs_config.h b/armsrc/spiffs_config.h index 7710a65a8..0cf3b96f5 100644 --- a/armsrc/spiffs_config.h +++ b/armsrc/spiffs_config.h @@ -18,8 +18,6 @@ #include "string.h" #include "flashmem.h" -void Dbprintf(const char *fmt, ...); - //#include //#include // ----------- >8 ------------ diff --git a/armsrc/spiffs_hydrogen.c b/armsrc/spiffs_hydrogen.c index 7290e676a..a166c3b7a 100644 --- a/armsrc/spiffs_hydrogen.c +++ b/armsrc/spiffs_hydrogen.c @@ -39,13 +39,12 @@ s32_t SPIFFS_format(spiffs *fs) { return -1; } - s32_t res; SPIFFS_LOCK(fs); spiffs_block_ix bix = 0; while (bix < fs->block_count) { fs->max_erase_count = 0; - res = spiffs_erase_block(fs, bix); + s32_t res = spiffs_erase_block(fs, bix); if (res != SPIFFS_OK) { res = SPIFFS_ERR_ERASE_FAIL; } @@ -1121,11 +1120,11 @@ s32_t SPIFFS_check(spiffs *fs) { SPIFFS_LOCK(fs); res = spiffs_lookup_consistency_check(fs, 0); - + (void)res; res = spiffs_object_index_consistency_check(fs); - + (void)res; res = spiffs_page_consistency_check(fs); - + (void)res; res = spiffs_obj_lu_scan(fs); SPIFFS_UNLOCK(fs); diff --git a/armsrc/start.c b/armsrc/start.c index 3e6f34702..e2904f6e1 100644 --- a/armsrc/start.c +++ b/armsrc/start.c @@ -14,69 +14,40 @@ #include "proxmark3_arm.h" #include "appmain.h" -#include "zlib.h" +#include "lz4.h" #include "BigBuf.h" +#include "string.h" static uint8_t *next_free_memory; extern struct common_area common_area; extern char __data_src_start__, __data_start__, __data_end__, __bss_start__, __bss_end__; -static voidpf inflate_malloc(voidpf opaque, uInt items, uInt size) { - uint8_t *allocated_memory; - - allocated_memory = next_free_memory; - next_free_memory += items * size; - return allocated_memory; -} - -static void inflate_free(voidpf opaque, voidpf address) { - // nothing to do -} - static void uncompress_data_section(void) { - z_stream data_section; - next_free_memory = BigBuf_get_addr(); + int avail_in; + memcpy(&avail_in, &__data_start__, sizeof(int)); + int avail_out = &__data_end__ - &__data_start__; // uncompressed size. Correct. + // uncompress data segment to RAM + uintptr_t p = (uintptr_t)&__data_src_start__; + int res = LZ4_decompress_safe((char *)p + 4, &__data_start__, avail_in, avail_out); - // initialize zstream structure - data_section.next_in = (uint8_t *) &__data_src_start__; - data_section.avail_in = &__data_end__ - &__data_start__; // uncompressed size. Wrong but doesn't matter. - data_section.next_out = (uint8_t *) &__data_start__; - data_section.avail_out = &__data_end__ - &__data_start__; // uncompressed size. Correct. - data_section.zalloc = &inflate_malloc; - data_section.zfree = &inflate_free; - data_section.opaque = NULL; - - // initialize zlib for inflate - int res = inflateInit2(&data_section, 15); if (res < 0) return; - - // uncompress data segment to RAM - inflate(&data_section, Z_FINISH); - // save the size of the compressed data section - common_area.arg1 = data_section.total_in; + common_area.arg1 = res; } -void __attribute__((section(".startos"))) Vector(void) { +void __attribute__((section(".startos"))) Vector(void); +void Vector(void) { /* Stack should have been set up by the bootloader */ - // char *src; - char *dst, *end; uncompress_data_section(); /* Set up (that is: clear) BSS. */ - dst = &__bss_start__; - end = &__bss_end__; + char *dst = &__bss_start__; + char *end = &__bss_end__; while (dst < end) *dst++ = 0; - // Set up data segment: Copy from flash to ram - // src = &__data_src_start__; - // dst = &__data_start__; - // end = &__data_end__; - // while(dst < end) *dst++ = *src++; - AppMain(); } #endif diff --git a/armsrc/string.c b/armsrc/string.c index 8dbe26808..a3b49dcb1 100644 --- a/armsrc/string.c +++ b/armsrc/string.c @@ -20,6 +20,21 @@ void *memcpy(void *dest, const void *src, int len) { return dest; } +void *memmove(void *dest, const void *src, size_t len) { + char *d = dest; + const char *s = src; + if (d < s) + while (len--) + *d++ = *s++; + else { + char *lasts = (char *)s + (len - 1); + char *lastd = d + (len - 1); + while (len--) + *lastd-- = *lasts--; + } + return dest; +} + void *memset(void *dest, int c, int len) { uint8_t *d = dest; while ((len--) > 0) { diff --git a/armsrc/string.h b/armsrc/string.h index 0ebb4ab54..f4d6e3fc1 100644 --- a/armsrc/string.h +++ b/armsrc/string.h @@ -16,6 +16,7 @@ int strlen(const char *str); void *memcpy(void *dest, const void *src, int len); +void *memmove(void *dest, const void *src, size_t len); void *memset(void *dest, int c, int len); int memcmp(const void *av, const void *bv, int len); void memxor(uint8_t *dest, uint8_t *src, size_t len); @@ -33,6 +34,8 @@ char *strrchr(const char *s, int c); size_t strcspn(const char *s1, const char *s2); char *strpbrk(const char *s1, const char *s2); int strncmp(const char *s1, const char *s2, size_t n); +unsigned long strtoul(const char *p, char **out_p, int base); +long strtol(const char *p, char **out_p, int base); char c_tolower(int c); char c_isprint(unsigned char c); diff --git a/armsrc/thinfilm.c b/armsrc/thinfilm.c index e4b2e9b23..dc99bf4c7 100644 --- a/armsrc/thinfilm.c +++ b/armsrc/thinfilm.c @@ -30,7 +30,6 @@ void ReadThinFilm(void) { clear_trace(); - set_tracing(true); iso14443a_setup(FPGA_HF_ISO14443A_READER_LISTEN); @@ -49,9 +48,9 @@ void ReadThinFilm(void) { #define SEC_D 0xf0 #define SEC_E 0x0f #define SEC_F 0x00 -uint16_t FpgaSendQueueDelay; +static uint16_t FpgaSendQueueDelay; -uint16_t ReadReaderField(void) { +static uint16_t ReadReaderField(void) { #if defined RDV4 return AvgAdc(ADC_CHAN_HF_RDV40); #else @@ -60,18 +59,22 @@ uint16_t ReadReaderField(void) { } static void CodeThinfilmAsTag(const uint8_t *cmd, uint16_t len) { - ToSendReset(); + + tosend_reset(); + + tosend_t *ts = get_tosend(); + for (uint16_t i = 0; i < len; i++) { uint8_t b = cmd[i]; for (uint8_t j = 0; j < 8; j++) { - ToSend[++ToSendMax] = (b & 0x80) ? SEC_D : SEC_E; + ts->buf[++ts->max] = (b & 0x80) ? SEC_D : SEC_E; b <<= 1; } } - ToSendMax++; + ts->max++; } -int EmSendCmdThinfilmRaw(uint8_t *resp, uint16_t respLen) { +static int EmSendCmdThinfilmRaw(uint8_t *resp, uint16_t respLen) { volatile uint8_t b; uint16_t i = 0; uint32_t ThisTransferTime; @@ -122,7 +125,7 @@ void SimulateThinFilm(uint8_t *data, size_t len) { FpgaDownloadAndGo(FPGA_BITSTREAM_HF); // Set up the synchronous serial port - FpgaSetupSsc(); + FpgaSetupSsc(FPGA_MAJOR_MODE_HF_READER); // connect Demodulated Signal to ADC: SetAdcMuxFor(GPIO_MUXSEL_HIPKD); @@ -132,6 +135,8 @@ void SimulateThinFilm(uint8_t *data, size_t len) { uint16_t hf_baseline = ReadReaderField(); + tosend_t *ts = get_tosend(); + // Start the timer StartCountSspClk(); @@ -147,7 +152,8 @@ void SimulateThinFilm(uint8_t *data, size_t len) { if (hf_av < hf_baseline) hf_baseline = hf_av; if (hf_av > hf_baseline + 10) { - EmSendCmdThinfilmRaw(ToSend, ToSendMax); + + EmSendCmdThinfilmRaw(ts->buf, ts->max); if (!reader_detected) { LED_B_ON(); //Dbprintf("Reader detected, start beaming data"); diff --git a/armsrc/ticks.c b/armsrc/ticks.c index 0ce55e417..e8ac13f89 100644 --- a/armsrc/ticks.c +++ b/armsrc/ticks.c @@ -117,47 +117,61 @@ uint32_t RAMFUNC GetCountUS(void) { void StartCountSspClk(void) { AT91C_BASE_PMC->PMC_PCER |= (1 << AT91C_ID_TC0) | (1 << AT91C_ID_TC1) | (1 << AT91C_ID_TC2); // Enable Clock to all timers AT91C_BASE_TCB->TCB_BMR = AT91C_TCB_TC0XC0S_TIOA1 // XC0 Clock = TIOA1 - | AT91C_TCB_TC1XC1S_NONE // XC1 Clock = none - | AT91C_TCB_TC2XC2S_TIOA0; // XC2 Clock = TIOA0 + | AT91C_TCB_TC1XC1S_NONE // XC1 Clock = none + | AT91C_TCB_TC2XC2S_TIOA0; // XC2 Clock = TIOA0 // configure TC1 to create a short pulse on TIOA1 when a rising edge on TIOB1 (= ssp_clk from FPGA) occurs: AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKDIS; // disable TC1 AT91C_BASE_TC1->TC_CMR = AT91C_TC_CLKS_TIMER_DIV1_CLOCK // TC1 Clock = MCK(48MHz)/2 = 24MHz - | AT91C_TC_CPCSTOP // Stop clock on RC compare - | AT91C_TC_EEVTEDG_RISING // Trigger on rising edge of Event - | AT91C_TC_EEVT_TIOB // Event-Source: TIOB1 (= ssp_clk from FPGA = 13,56MHz/16) - | AT91C_TC_ENETRG // Enable external trigger event - | AT91C_TC_WAVESEL_UP // Upmode without automatic trigger on RC compare - | AT91C_TC_WAVE // Waveform Mode - | AT91C_TC_AEEVT_SET // Set TIOA1 on external event - | AT91C_TC_ACPC_CLEAR; // Clear TIOA1 on RC Compare - AT91C_BASE_TC1->TC_RC = 0x04; // RC Compare value = 0x04 + | AT91C_TC_CPCSTOP // Stop clock on RC compare + | AT91C_TC_EEVTEDG_RISING // Trigger on rising edge of Event + | AT91C_TC_EEVT_TIOB // Event-Source: TIOB1 (= ssp_clk from FPGA = 13,56MHz/16) + | AT91C_TC_ENETRG // Enable external trigger event + | AT91C_TC_WAVESEL_UP // Upmode without automatic trigger on RC compare + | AT91C_TC_WAVE // Waveform Mode + | AT91C_TC_AEEVT_SET // Set TIOA1 on external event + | AT91C_TC_ACPC_CLEAR; // Clear TIOA1 on RC Compare + AT91C_BASE_TC1->TC_RC = 0x01; // RC Compare value = 0x01, pulse width to TC0 // use TC0 to count TIOA1 pulses AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKDIS; // disable TC0 AT91C_BASE_TC0->TC_CMR = AT91C_TC_CLKS_XC0 // TC0 clock = XC0 clock = TIOA1 - | AT91C_TC_WAVE // Waveform Mode - | AT91C_TC_WAVESEL_UP // just count - | AT91C_TC_ACPA_CLEAR // Clear TIOA0 on RA Compare - | AT91C_TC_ACPC_SET; // Set TIOA0 on RC Compare + | AT91C_TC_WAVE // Waveform Mode + | AT91C_TC_WAVESEL_UP // just count + | AT91C_TC_ACPA_CLEAR // Clear TIOA0 on RA Compare + | AT91C_TC_ACPC_SET; // Set TIOA0 on RC Compare AT91C_BASE_TC0->TC_RA = 1; // RA Compare value = 1; pulse width to TC2 AT91C_BASE_TC0->TC_RC = 0; // RC Compare value = 0; increment TC2 on overflow // use TC2 to count TIOA0 pulses (giving us a 32bit counter (TC0/TC2) clocked by ssp_clk) AT91C_BASE_TC2->TC_CCR = AT91C_TC_CLKDIS; // disable TC2 AT91C_BASE_TC2->TC_CMR = AT91C_TC_CLKS_XC2 // TC2 clock = XC2 clock = TIOA0 - | AT91C_TC_WAVE // Waveform Mode - | AT91C_TC_WAVESEL_UP; // just count + | AT91C_TC_WAVE // Waveform Mode + | AT91C_TC_WAVESEL_UP; // just count AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG; // enable and reset TC0 AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG; // enable and reset TC1 AT91C_BASE_TC2->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG; // enable and reset TC2 + // // synchronize the counter with the ssp_frame signal. - // Note: FPGA must be in any iso14443 mode, otherwise the frame signal would not be present - while (!(AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_FRAME)); // wait for ssp_frame to go high (start of frame) + // Note: FPGA must be in a FPGA mode with SSC transfer, otherwise SSC_FRAME and SSC_CLK signals would not be present + // while (AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_FRAME); // wait for ssp_frame to be low - while (!(AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_CLK)); // wait for ssp_clk to go high + while (!(AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_FRAME)); // wait for ssp_frame to go high (start of frame) + while (!(AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_CLK)); // wait for ssp_clk to go high; 1st ssp_clk after start of frame + while (AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_CLK); // wait for ssp_clk to go low; + while (!(AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_CLK)); // wait for ssp_clk to go high; 2nd ssp_clk after start of frame + if ((AT91C_BASE_SSC->SSC_RFMR & SSC_FRAME_MODE_BITS_IN_WORD(32)) == SSC_FRAME_MODE_BITS_IN_WORD(16)) { // 16bit frame + while (AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_CLK); // wait for ssp_clk to go low; + while (!(AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_CLK)); // wait for ssp_clk to go high; 3rd ssp_clk after start of frame + while (AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_CLK); // wait for ssp_clk to go low; + while (!(AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_CLK)); // wait for ssp_clk to go high; 4th ssp_clk after start of frame + while (AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_CLK); // wait for ssp_clk to go low; + while (!(AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_CLK)); // wait for ssp_clk to go high; 5th ssp_clk after start of frame + while (AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_CLK); // wait for ssp_clk to go low; + while (!(AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_CLK)); // wait for ssp_clk to go high; 6th ssp_clk after start of frame + } // note: up to now two ssp_clk rising edges have passed since the rising edge of ssp_frame // it is now safe to assert a sync signal. This sets all timers to 0 on next active clock edge diff --git a/armsrc/ticks.h b/armsrc/ticks.h index b39ec52bd..9d8d178d5 100644 --- a/armsrc/ticks.h +++ b/armsrc/ticks.h @@ -30,10 +30,10 @@ uint32_t RAMFUNC GetCountUS(void); void ResetUSClock(void); void SpinDelayCountUs(uint32_t us); -void StartCountSspClk(); +void StartCountSspClk(void); void ResetSspClk(void); -uint32_t RAMFUNC GetCountSspClk(); -uint32_t RAMFUNC GetCountSspClkDelta(); +uint32_t RAMFUNC GetCountSspClk(void); +uint32_t RAMFUNC GetCountSspClkDelta(uint32_t start); void StartTicks(void); uint32_t GetTicks(void); diff --git a/armsrc/usart.c b/armsrc/usart.c index 2062c9441..b6ed97310 100644 --- a/armsrc/usart.c +++ b/armsrc/usart.c @@ -15,8 +15,8 @@ volatile AT91PS_USART pUS1 = AT91C_BASE_US1; volatile AT91PS_PIO pPIO = AT91C_BASE_PIOA; volatile AT91PS_PDC pPDC = AT91C_BASE_PDC_US1; -uint32_t usart_baudrate = 0; -uint8_t usart_parity = 0; +uint32_t g_usart_baudrate = 0; +uint8_t g_usart_parity = 0; /* void usart_close(void) { // Reset the USART mode @@ -41,8 +41,8 @@ void usart_close(void) { static uint8_t us_inbuf1[USART_BUFFLEN]; static uint8_t us_inbuf2[USART_BUFFLEN]; -uint8_t *usart_cur_inbuf = NULL; -uint16_t usart_cur_inbuf_off = 0; +static uint8_t *usart_cur_inbuf = NULL; +static uint16_t usart_cur_inbuf_off = 0; static uint8_t us_rxfifo[USART_FIFOLEN]; static size_t us_rxfifo_low = 0; static size_t us_rxfifo_high = 0; @@ -51,25 +51,32 @@ static size_t us_rxfifo_high = 0; static void usart_fill_rxfifo(void) { uint16_t rxfifo_free ; if (pUS1->US_RNCR == 0) { // One buffer got filled, backup buffer being used + if (us_rxfifo_low > us_rxfifo_high) rxfifo_free = us_rxfifo_low - us_rxfifo_high; else rxfifo_free = sizeof(us_rxfifo) - us_rxfifo_high + us_rxfifo_low; + uint16_t available = USART_BUFFLEN - usart_cur_inbuf_off; + if (available <= rxfifo_free) { + for (uint16_t i = 0; i < available; i++) { us_rxfifo[us_rxfifo_high++] = usart_cur_inbuf[usart_cur_inbuf_off + i]; if (us_rxfifo_high == sizeof(us_rxfifo)) us_rxfifo_high = 0; } + // Give next buffer pUS1->US_RNPR = (uint32_t)usart_cur_inbuf; pUS1->US_RNCR = USART_BUFFLEN; + // Swap current buff if (usart_cur_inbuf == us_inbuf1) usart_cur_inbuf = us_inbuf2; else usart_cur_inbuf = us_inbuf1; + usart_cur_inbuf_off = 0; } else { // Take only what we have room for @@ -83,12 +90,16 @@ static void usart_fill_rxfifo(void) { return; } } + if (pUS1->US_RCR < USART_BUFFLEN - usart_cur_inbuf_off) { // Current buffer partially filled + if (us_rxfifo_low > us_rxfifo_high) rxfifo_free = us_rxfifo_low - us_rxfifo_high; else rxfifo_free = sizeof(us_rxfifo) - us_rxfifo_high + us_rxfifo_low; + uint16_t available = USART_BUFFLEN - pUS1->US_RCR - usart_cur_inbuf_off; + if (available > rxfifo_free) available = rxfifo_free; for (uint16_t i = 0; i < available; i++) { @@ -150,7 +161,7 @@ uint32_t usart_read_ng(uint8_t *data, size_t len) { } // transfer from device to client -inline int usart_writebuffer_sync(uint8_t *data, size_t len) { +int usart_writebuffer_sync(uint8_t *data, size_t len) { // Wait for current PDC bank to be free // (and check next bank too, in case there will be a usart_writebuffer_async) @@ -166,9 +177,9 @@ inline int usart_writebuffer_sync(uint8_t *data, size_t len) { void usart_init(uint32_t baudrate, uint8_t parity) { if (baudrate != 0) - usart_baudrate = baudrate; + g_usart_baudrate = baudrate; if ((parity == 'N') || (parity == 'O') || (parity == 'E')) - usart_parity = parity; + g_usart_parity = parity; // For a nice detailed sample, interrupt driven but still relevant. // See https://www.sparkfun.com/datasheets/DevTools/SAM7/at91sam7%20serial%20communications.pdf @@ -197,7 +208,7 @@ void usart_init(uint32_t baudrate, uint8_t parity) { AT91C_US_NBSTOP_1_BIT | // 1 stop bit AT91C_US_CHMODE_NORMAL; // channel mode: normal - switch (usart_parity) { + switch (g_usart_parity) { case 'N': mode |= AT91C_US_PAR_NONE; // parity: none break; @@ -227,9 +238,9 @@ void usart_init(uint32_t baudrate, uint8_t parity) { // OVER = 1, -yes we are oversampling // baudrate == selected clock/8/CD --> this is ours // - uint32_t brgr = MCK / (usart_baudrate << 3); - // doing fp = round((mck / (usart_baudrate << 3) - brgr) * 8) with integers: - uint32_t fp = ((16 * MCK / (usart_baudrate << 3) - 16 * brgr) + 1) / 2; + uint32_t brgr = MCK / (g_usart_baudrate << 3); + // doing fp = round((mck / (g_usart_baudrate << 3) - brgr) * 8) with integers: + uint32_t fp = ((16 * MCK / (g_usart_baudrate << 3) - 16 * brgr) + 1) / 2; pUS1->US_BRGR = (fp << 16) | brgr; diff --git a/armsrc/usart.h b/armsrc/usart.h index 01ca0d809..5a7dea38f 100644 --- a/armsrc/usart.h +++ b/armsrc/usart.h @@ -9,8 +9,8 @@ // Higher baudrates are pointless, only increasing overflow risk -extern uint32_t usart_baudrate; -extern uint8_t usart_parity; +extern uint32_t g_usart_baudrate; +extern uint8_t g_usart_parity; void usart_init(uint32_t baudrate, uint8_t parity); int usart_writebuffer_sync(uint8_t *data, size_t len); diff --git a/armsrc/util.c b/armsrc/util.c index d1a4fb938..443c9e5f4 100644 --- a/armsrc/util.c +++ b/armsrc/util.c @@ -83,7 +83,7 @@ uint8_t hex2int(char hexchar) { } } -void LEDsoff() { +void LEDsoff(void) { LED_A_OFF(); LED_B_OFF(); LED_C_OFF(); @@ -289,40 +289,6 @@ int BUTTON_HELD(int ms) { return BUTTON_ERROR; } -/* Similar to FpgaGatherVersion this formats stored version information - * into a string representation. It takes a pointer to the struct version_information, - * verifies the magic properties, then stores a formatted string, prefixed by - * prefix in dst. - */ -void FormatVersionInformation(char *dst, int len, const char *prefix, void *version_information) { - struct version_information *v = (struct version_information *)version_information; - dst[0] = 0; - strncat(dst, prefix, len - 1); - if (v->magic != VERSION_INFORMATION_MAGIC) { - strncat(dst, "Missing/Invalid version information\n", len - strlen(dst) - 1); - return; - } - if (v->versionversion != 1) { - strncat(dst, "Version information not understood\n", len - strlen(dst) - 1); - return; - } - if (!v->present) { - strncat(dst, "Version information not available\n", len - strlen(dst) - 1); - return; - } - - strncat(dst, v->gitversion, len - strlen(dst) - 1); - if (v->clean == 0) { - strncat(dst, "-unclean", len - strlen(dst) - 1); - } else if (v->clean == 2) { - strncat(dst, "-suspect", len - strlen(dst) - 1); - } - - strncat(dst, " ", len - strlen(dst) - 1); - strncat(dst, v->buildtime, len - strlen(dst) - 1); - strncat(dst, "\n", len - strlen(dst) - 1); -} - bool data_available(void) { #ifdef WITH_FPC_USART_HOST return usb_poll_validate_length() || (usart_rxdata_available() > 0); diff --git a/armsrc/util.h b/armsrc/util.h index 40a7c3026..c6523a813 100644 --- a/armsrc/util.h +++ b/armsrc/util.h @@ -55,15 +55,15 @@ #endif #ifndef REV16 -#define REV16(x) (REV8(x) + (REV8 (x >> 8) << 8)) +#define REV16(x) (REV8(x) + (REV8 ((x) >> 8) << 8)) #endif #ifndef REV32 -#define REV32(x) (REV16(x) + (REV16(x >> 16) << 16)) +#define REV32(x) (REV16(x) + (REV16((x) >> 16) << 16)) #endif #ifndef REV64 -#define REV64(x) (REV32(x) + (REV32(x >> 32) << 32)) +#define REV64(x) (REV32(x) + (REV32((x) >> 32) << 32)) #endif #ifndef BIT32 @@ -91,7 +91,6 @@ void SpinUp(uint32_t speed); int BUTTON_CLICKED(int ms); int BUTTON_HELD(int ms); -void FormatVersionInformation(char *dst, int len, const char *prefix, void *version_information); bool data_available(void); #endif diff --git a/bootrom/Makefile b/bootrom/Makefile index 5c7823896..9a0359d2f 100644 --- a/bootrom/Makefile +++ b/bootrom/Makefile @@ -23,10 +23,10 @@ VERSIONSRC = version.c # THUMBSRC := # stdint.h provided locally until GCC 4.5 becomes C99 compliant -APP_CFLAGS = -I. -fno-strict-aliasing -ffunction-sections -fdata-sections +APP_CFLAGS = -I. -ffunction-sections -fdata-sections -# stack-protect , no-pie reduces size on Gentoo Hardened 8.2 gcc -APP_CFLAGS += -fno-stack-protector -fno-pie +# stack-protect , no-pie reduces size on Gentoo Hardened 8.2 gcc, no-common makes sure uninitalized vars doesn't end up in COMMON area +APP_CFLAGS += -fno-stack-protector -fno-pie -fno-common # Do not move this inclusion before the definition of {THUMB,ASM,ARM}SRC @@ -39,9 +39,12 @@ OBJS = $(OBJDIR)/bootrom.s19 # version.c should be remade on every compilation version.c: default_version.c $(info [=] GEN $@) - $(Q)sh ../tools/mkversion.sh > $@ || perl ../tools/mkversion.pl > $@ || $(CP) $^ $@ + $(Q)$(SH) ../tools/mkversion.sh > $@ || $(PERL) ../tools/mkversion.pl > $@ || $(CP) $< $@ -all: $(OBJS) +all: showinfo $(OBJS) + +showinfo: + $(info compiler version: $(shell $(CC) --version|head -n 1)) tarbin: $(OBJS) $(info [=] GEN $@) @@ -49,7 +52,7 @@ tarbin: $(OBJS) $(OBJDIR)/bootrom.elf: $(VERSIONOBJ) $(ASMOBJ) $(ARMOBJ) $(THUMBOBJ) $(info [=] LD $@) - $(Q)$(CC) $(LDFLAGS) -Wl,-T,ldscript-flash,-Map,$(patsubst %.elf,%.map,$@) -o $@ $^ $(LIBS) + $(Q)$(CC) $(CROSS_LDFLAGS) -Wl,-T,ldscript-flash,-Map,$(patsubst %.elf,%.map,$@) -o $@ $^ $(LIBS) clean: $(Q)$(RM) $(OBJDIR)$(PATHSEP)*.o @@ -68,7 +71,7 @@ uninstall: $(info [@] Uninstalling bootrom from $(DESTDIR)$(PREFIX)...) $(Q)$(RM) $(foreach fw,$(INSTALLFW),$(DESTDIR)$(PREFIX)$(PATHSEP)$(INSTALLFWRELPATH)$(PATHSEP)$(notdir $(fw))) -.PHONY: all clean help install +.PHONY: all clean help install showinfo help: @echo Multi-OS Makefile, you are running on $(DETECTED_OS) @echo Possible targets: diff --git a/bootrom/bootrom.c b/bootrom/bootrom.c index aa633f448..77305f22c 100644 --- a/bootrom/bootrom.c +++ b/bootrom/bootrom.c @@ -10,6 +10,7 @@ #include "usb_cdc.h" #include "proxmark3_arm.h" +#define DEBUG 0 struct common_area common_area __attribute__((section(".commonarea"))); unsigned int start_addr, end_addr, bootrom_unlocked; @@ -37,21 +38,19 @@ static int reply_old(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, } } - int result = PM3_EUNDEF; // Send frame and make sure all bytes are transmitted - - result = usb_write((uint8_t *)&txcmd, sizeof(PacketResponseOLD)); - - return result; + return usb_write((uint8_t *)&txcmd, sizeof(PacketResponseOLD)); } -void DbpString(char *str) { +#if DEBUG +static void DbpString(char *str) { uint8_t len = 0; while (str[len] != 0x00) len++; reply_old(CMD_DEBUG_PRINT_STRING, len, 0, 0, (uint8_t *)str, len); } +#endif static void ConfigClocks(void) { // we are using a 16 MHz crystal as the basis for everything @@ -76,8 +75,8 @@ static void Fatal(void) { for (;;) {}; } -void UsbPacketReceived(uint8_t *packet, int len) { - int i, dont_ack = 0; +static void UsbPacketReceived(uint8_t *packet) { + int dont_ack = 0; PacketCommandOLD *c = (PacketCommandOLD *)packet; //if ( len != sizeof(PacketCommandOLD`)) Fatal(); @@ -125,7 +124,7 @@ void UsbPacketReceived(uint8_t *packet, int len) { // We need to offset the writes or it will not fill the correct bank write buffer. offset = (AT91C_IFLASH_NB_OF_PAGES / 2) * AT91C_IFLASH_PAGE_SIZE / sizeof(uint32_t); } - for (i = 0 + (64 * j); i < 64 + (64 * j); i++) { + for (int i = 0 + (64 * j); i < 64 + (64 * j); i++) { _flash_start[offset + i] = c->d.asDwords[i]; } @@ -217,7 +216,7 @@ static void flash_mode(void) { // Check if there is a usb packet available if (usb_poll_validate_length()) { if (usb_read(rx, sizeof(rx))) { - UsbPacketReceived(rx, sizeof(rx)); + UsbPacketReceived(rx); } } @@ -235,6 +234,7 @@ static void flash_mode(void) { } } +void BootROM(void); void BootROM(void) { //------------ // First set up all the I/O pins; GPIOs configured directly, other ones @@ -312,7 +312,7 @@ void BootROM(void) { if (!common_area_present) { /* Common area not ok, initialize it */ - int i; + size_t i; /* Makeshift memset, no need to drag util.c into this */ for (i = 0; i < sizeof(common_area); i++) ((char *)&common_area)[i] = 0; diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 0bbf1067c..3ac98578b 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -1,220 +1,470 @@ +# Usage: +# mkdir build +# cd build +# cmake .. (see below for options) +# make (VERBOSE=1 if needed) +# # MINGW: # On ProxSpace 3.4: # cmake -G"MSYS Makefiles" .. # On Proxspace 3.3 or less, you need to install cmake: # pacman -S mingw-w64-x86_64-cmake # /mingw64/bin/cmake -G"MSYS Makefiles" .. +# +# Android cross-compilation: (ANDROID_ABI=arm64-v8a for a 64b version) +# cmake \ +# -DCMAKE_TOOLCHAIN_FILE=/build/cmake/android.toolchain.cmake \ +# -DANDROID_ABI=armeabi-v7a \ +# -DANDROID_NATIVE_API_LEVEL=android-19 \ +# -DSKIPBT=1 -DSKIPPYTHON=1 -DSKIPPTHREAD=1 .. cmake_minimum_required(VERSION 3.10) project(proxmark3) +SET (PM3_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/..) if(CMAKE_VERSION VERSION_LESS "3.7.0") set(CMAKE_INCLUDE_CURRENT_DIR ON) endif() -if(APPLE AND EXISTS /usr/local/opt/qt5) - # Homebrew installs Qt5 (up to at least 5.11.0) in - # /usr/local/qt5. Ensure that it can be found by CMake - # since it is not in the default /usr/local prefix. - # Add it to PATHS so that it doesn't override the - # CMAKE_PREFIX_PATH environment variable. - # QT_FIND_PACKAGE_OPTIONS should be passed to find_package, - # e.g. find_package(Qt5Core ${QT_FIND_PACKAGE_OPTIONS}) - list(APPEND QT_FIND_PACKAGE_OPTIONS PATHS /usr/local/opt/qt5) -endif() -set(QT_PACKAGELIST - Qt5Core - Qt5Widgets - Qt5Gui -) -set(Qt5_FOUND ON) -foreach(_qt_package IN LISTS QT_PACKAGELIST) - find_package(${_qt_package} QUIET ${QT_FIND_PACKAGE_OPTIONS}) - if(NOT ${_qt_package}_FOUND) - set(Qt5_FOUND OFF) - endif(NOT ${_qt_package}_FOUND) -endforeach() +find_package(PkgConfig) -SET (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake") +if (NOT SKIPQT EQUAL 1) + if(APPLE AND EXISTS /usr/local/opt/qt5) + # Homebrew installs Qt5 (up to at least 5.11.0) in + # /usr/local/qt5. Ensure that it can be found by CMake + # since it is not in the default /usr/local prefix. + # Add it to PATHS so that it doesn't override the + # CMAKE_PREFIX_PATH environment variable. + # QT_FIND_PACKAGE_OPTIONS should be passed to find_package, + # e.g. find_package(Qt5Core ${QT_FIND_PACKAGE_OPTIONS}) + list(APPEND QT_FIND_PACKAGE_OPTIONS PATHS /usr/local/opt/qt5) + endif(APPLE AND EXISTS /usr/local/opt/qt5) + set(QT_PACKAGELIST + Qt5Core + Qt5Widgets + Qt5Gui + ) + set(Qt5_FOUND ON) + foreach(_qt_package IN LISTS QT_PACKAGELIST) + find_package(${_qt_package} QUIET ${QT_FIND_PACKAGE_OPTIONS}) + set(Qt5_LIBRARIES ${${_qt_package}_LIBRARIES} ${Qt5_LIBRARIES}) + if(NOT ${_qt_package}_FOUND) + set(Qt5_FOUND OFF) + endif(NOT ${_qt_package}_FOUND) + endforeach() +endif (NOT SKIPQT EQUAL 1) -add_subdirectory(deps) +if (NOT SKIPBT EQUAL 1) + pkg_search_module(BLUEZ QUIET bluez) +endif (NOT SKIPBT EQUAL 1) + +if (NOT SKIPPYTHON EQUAL 1) + pkg_search_module(PYTHON3 QUIET python3) + pkg_search_module(PYTHON3EMBED QUIET python3-embed) +endif (NOT SKIPPYTHON EQUAL 1) + +# If cross-compiled, we need to init source and build. +if (CMAKE_TOOLCHAIN_FILE) + set(CFLAGS_EXTERNAL_LIB "CFLAGS=--target=${CMAKE_C_COMPILER_TARGET} -w") + set(EMBED_READLINE ON) + set(EMBED_BZIP2 ON) +endif (CMAKE_TOOLCHAIN_FILE) + +if (EMBED_READLINE OR EMBED_BZIP2) + include(ExternalProject) +endif (EMBED_READLINE OR EMBED_BZIP2) + +if (NOT SKIPREADLINE EQUAL 1) + if (APPLE) + find_path(READLINE_INCLUDE_DIRS readline/readline.h /usr/local/opt/readline/include /opt/local/include /opt/include /usr/local/include /usr/include NO_DEFAULT_PATH) + find_library(READLINE_LIBRARIES readline /usr/local/opt/readline/lib /opt/local/lib /opt/lib /usr/local/lib /usr/lib NO_DEFAULT_PATH) + endif (APPLE) + if (EMBED_READLINE) + ExternalProject_Add(ncurses + URL http://ftp.gnu.org/pub/gnu/ncurses/ncurses-6.0.tar.gz + PREFIX deps/ncurses + DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/deps/ncurses + CONFIGURE_COMMAND ./configure CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} LD=${CMAKE_C_COMPILER} AR=${CMAKE_AR} RANLIB=${CMAKE_RANLIB} ${CFLAGS_EXTERNAL_LIB} --host=arm --disable-database --with-fallbacks=ansi-generic,ansi-mini,color_xterm,dtterm,dumb,Eterm,Eterm-256color,Eterm-88color,eterm-color,gnome,gnome-256color,guru,hurd,iTerm.app,konsole,konsole-16color,konsole-256color,konsole-base,konsole-linux,konsole-solaris,konsole-vt100,kterm,kterm-color,linux,linux-16color,linux-basic,mac,mlterm,mlterm-256color,mrxvt,mrxvt-256color,mterm,mterm-ansi,mvterm,nsterm,nsterm-16color,nsterm-256color,pty,putty,putty-256color,putty-vt100,rxvt,rxvt-16color,rxvt-256color,rxvt-88color,rxvt-basic,rxvt-color,screen,screen-16color,screen-256color,simpleterm,st-16color,st-256color,st52,st52-color,stv52,tt,tt52,unknown,vt100,vt102,vte,vte-256color,xterm,xterm-16color,xterm-256color,xterm-88color,xterm-basic,xterm-bold,xterm-color,xterm-utf8,xterm-vt220,xterm-vt52,xterm1,xtermc,xtermm --enable-termcap --without-ada --without-debug --without-dlsym --without-gpm --without-develop --without-tests --without-cxx-binding --with-termlib + BUILD_IN_SOURCE ON + BUILD_COMMAND make libs + INSTALL_COMMAND "" + LOG_DOWNLOAD ON + ) + ExternalProject_Add_StepTargets(ncurses configure build install) + + ExternalProject_Add(readline + URL ftp://ftp.gnu.org/gnu/readline/readline-7.0.tar.gz + PREFIX deps/readline + DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/deps/readline + CONFIGURE_COMMAND ./configure CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} LD=${CMAKE_C_COMPILER} AR=${CMAKE_AR} RANLIB=${CMAKE_RANLIB} ${CFLAGS_EXTERNAL_LIB} --host=arm --enable-static + BUILD_IN_SOURCE ON + BUILD_COMMAND make + INSTALL_COMMAND "" + LOG_DOWNLOAD ON + ) + ExternalProject_Add_StepTargets(readline configure build install) + set(READLINE_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/deps/readline/src/) + set(READLINE_LIBRARIES ${CMAKE_CURRENT_BINARY_DIR}/deps/readline/src/readline/libreadline.a ${CMAKE_CURRENT_BINARY_DIR}/deps/ncurses/src/ncurses/lib/libtinfo.a) + else (EMBED_READLINE) + find_path(READLINE_INCLUDE_DIRS readline/readline.h) + find_library(READLINE_LIBRARIES readline) + endif (EMBED_READLINE) + if (READLINE_INCLUDE_DIRS AND READLINE_LIBRARIES) + set(READLINE_FOUND ON) + endif (READLINE_INCLUDE_DIRS AND READLINE_LIBRARIES) +endif (NOT SKIPREADLINE EQUAL 1) + +if (NOT SKIPJANSSONSYSTEM EQUAL 1) + pkg_check_modules(PC_JANSSON QUIET jansson) + find_path(JANSSON_INCLUDE_DIRS + NAMES jansson.h + HINTS ${PC_JANSSON_INCLUDEDIR} ${PC_JANSSON_INCLUDE_DIRS}) + find_library(JANSSON_LIBRARIES + NAMES jansson libjansson + HINTS ${PC_JANSSON_LIBDIR} ${PC_JANSSON_LIBRARY_DIRS}) + if (JANSSON_INCLUDE_DIRS AND JANSSON_LIBRARIES) + set(JANSSON_FOUND ON) + endif (JANSSON_INCLUDE_DIRS AND JANSSON_LIBRARIES) +endif (NOT SKIPJANSSONSYSTEM EQUAL 1) + +if(EMBED_BZIP2) + set(BZIP2_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/deps/bzip2/src/bzip2) + ExternalProject_Add(bzip2 + GIT_REPOSITORY https://android.googlesource.com/platform/external/bzip2 + GIT_TAG platform-tools-30.0.2 + PREFIX deps/bzip2 + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/deps/bzip2 + CONFIGURE_COMMAND mkdir -p ${BZIP2_BUILD_DIR} && git archive --format tar HEAD | tar -C ${BZIP2_BUILD_DIR} -x + BUILD_IN_SOURCE ON + BUILD_COMMAND make -C ${BZIP2_BUILD_DIR} -j4 CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} LD=${CMAKE_C_COMPILER} AR=${CMAKE_AR} RANLIB=${CMAKE_RANLIB} ${CFLAGS_EXTERNAL_LIB} libbz2.a + INSTALL_COMMAND "" + LOG_DOWNLOAD ON + ) + ExternalProject_Add_StepTargets(bzip2 configure build install) + set(BZIP2_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/deps/bzip2/src/bzip2) + set(BZIP2_LIBRARIES ${CMAKE_CURRENT_BINARY_DIR}/deps/bzip2/src/bzip2/libbz2.a) + set(BZIP2_FOUND ON) +else(EMBED_BZIP2) + find_package (BZip2 REQUIRED) +endif(EMBED_BZIP2) + +if (NOT SKIPWHEREAMISYSTEM EQUAL 1) + find_path(WHEREAMI_INCLUDE_DIRS whereami.h) + find_library(WHEREAMI_LIBRARIES whereami) + if (WHEREAMI_INCLUDE_DIRS AND WHEREAMI_LIBRARIES) + set(WHEREAMI_FOUND ON) + endif (WHEREAMI_INCLUDE_DIRS AND WHEREAMI_LIBRARIES) +endif (NOT SKIPWHEREAMISYSTEM EQUAL 1) + +add_subdirectory(${PM3_ROOT}/client/deps deps) set (TARGET_SOURCES - src/proxmark3.c - ../common/commonutil.c - ../common/util_posix.c - ../common/parity.c - ../common/bucketsort.c - ../common/crapto1/crapto1.c - ../common/crapto1/crypto1.c - ../common/crc.c - ../common/crc16.c - ../common/crc32.c - ../common/crc64.c - ../common/lfdemod.c - ../common/legic_prng.c - ../common/iso15693tools.c - ../common/cardhelper.c - ../common/generator.c - src/crypto/asn1dump.c - src/crypto/asn1utils.c - src/crypto/libpcrypto.c - src/emv/test/cda_test.c - src/emv/test/crypto_test.c - src/emv/test/cryptotest.c - src/emv/test/dda_test.c - src/emv/test/sda_test.c - src/emv/apduinfo.c - src/emv/cmdemv.c - src/emv/crypto.c - src/emv/crypto_polarssl.c - src/emv/dol.c - src/emv/dump.c - src/emv/emv_pk.c - src/emv/emv_pki.c - src/emv/emv_pki_priv.c - src/emv/emv_roca.c - src/emv/emv_tags.c - src/emv/emvcore.c - src/emv/emvjson.c - src/emv/tlv.c - src/fido/additional_ca.c - src/fido/cbortools.c - src/fido/cose.c - src/fido/fidocore.c - src/loclass/cipher.c - src/loclass/cipherutils.c - src/loclass/elite_crack.c - src/loclass/hash1_brute.c - src/loclass/ikeys.c - src/mifare/mad.c - src/mifare/mfkey.c - src/mifare/mifare4.c - src/mifare/mifaredefault.c - src/mifare/mifarehost.c - src/mifare/ndef.c - src/mifare/desfire_crypto.c - src/uart/uart_posix.c - src/uart/uart_win32.c - src/ui/overlays.ui - src/aidsearch.c - src/cmdanalyse.c - src/cmdcrc.c - src/cmddata.c - src/cmdflashmem.c - src/cmdflashmemspiffs.c - src/cmdhf.c - src/cmdhf14a.c - src/cmdhf14b.c - src/cmdhf15.c - src/cmdhfcryptorf.c - src/cmdhfepa.c - src/cmdhffelica.c - src/cmdhffido.c - src/cmdhficlass.c - src/cmdhflegic.c - src/cmdhflist.c - src/cmdhflto.c - src/cmdhfmf.c - src/cmdhfmfdes.c - src/cmdhfmfhard.c - src/cmdhfmfp.c - src/cmdhfmfu.c - src/cmdhfthinfilm.c - src/cmdhftopaz.c - src/cmdhw.c - src/cmdlf.c - src/cmdlfawid.c - src/cmdlfcotag.c - src/cmdlfem4x.c - src/cmdlffdx.c - src/cmdlfgallagher.c - src/cmdlfguard.c - src/cmdlfhid.c - src/cmdlfhitag.c - src/cmdlfindala.c - src/cmdlfio.c - src/cmdlfjablotron.c - src/cmdlfkeri.c - src/cmdlfmotorola.c - src/cmdlfnedap.c - src/cmdlfnexwatch.c - src/cmdlfnoralsy.c - src/cmdlfpac.c - src/cmdlfparadox.c - src/cmdlfpcf7931.c - src/cmdlfpresco.c - src/cmdlfpyramid.c - src/cmdlfsecurakey.c - src/cmdlft55xx.c - src/cmdlfti.c - src/cmdlfverichip.c - src/cmdlfviking.c - src/cmdlfvisa2000.c - src/cmdmain.c - src/cmdparser.c - src/cmdscript.c - src/cmdsmartcard.c - src/cmdtrace.c - src/cmdusart.c - src/cmdwiegand.c - src/comms.c - src/fileutils.c - src/flash.c - src/graph.c - src/preferences.c - src/pm3_binlib.c - src/pm3_bitlib.c - src/prng.c - src/scandir.c - src/scripting.c - src/tea.c - src/ui.c - src/util.c - src/whereami.c - src/wiegand_formats.c - src/wiegand_formatutils.c + ${PM3_ROOT}/common/commonutil.c + ${PM3_ROOT}/common/util_posix.c + ${PM3_ROOT}/common/parity.c + ${PM3_ROOT}/common/bucketsort.c + ${PM3_ROOT}/common/crapto1/crapto1.c + ${PM3_ROOT}/common/crapto1/crypto1.c + ${PM3_ROOT}/common/crc.c + ${PM3_ROOT}/common/crc16.c + ${PM3_ROOT}/common/crc32.c + ${PM3_ROOT}/common/crc64.c + ${PM3_ROOT}/common/lfdemod.c + ${PM3_ROOT}/common/legic_prng.c + ${PM3_ROOT}/common/iso15693tools.c + ${PM3_ROOT}/common/cardhelper.c + ${PM3_ROOT}/common/generator.c + ${PM3_ROOT}/client/src/crypto/asn1dump.c + ${PM3_ROOT}/client/src/crypto/asn1utils.c + ${PM3_ROOT}/client/src/crypto/libpcrypto.c + ${PM3_ROOT}/client/src/emv/test/cda_test.c + ${PM3_ROOT}/client/src/emv/test/crypto_test.c + ${PM3_ROOT}/client/src/emv/test/cryptotest.c + ${PM3_ROOT}/client/src/emv/test/dda_test.c + ${PM3_ROOT}/client/src/emv/test/sda_test.c + ${PM3_ROOT}/client/src/emv/apduinfo.c + ${PM3_ROOT}/client/src/emv/cmdemv.c + ${PM3_ROOT}/client/src/emv/crypto.c + ${PM3_ROOT}/client/src/emv/crypto_polarssl.c + ${PM3_ROOT}/client/src/emv/dol.c + ${PM3_ROOT}/client/src/emv/dump.c + ${PM3_ROOT}/client/src/emv/emv_pk.c + ${PM3_ROOT}/client/src/emv/emv_pki.c + ${PM3_ROOT}/client/src/emv/emv_pki_priv.c + ${PM3_ROOT}/client/src/emv/emv_roca.c + ${PM3_ROOT}/client/src/emv/emv_tags.c + ${PM3_ROOT}/client/src/emv/emvcore.c + ${PM3_ROOT}/client/src/emv/emvjson.c + ${PM3_ROOT}/client/src/emv/tlv.c + ${PM3_ROOT}/client/src/fido/additional_ca.c + ${PM3_ROOT}/client/src/fido/cbortools.c + ${PM3_ROOT}/client/src/fido/cose.c + ${PM3_ROOT}/client/src/fido/fidocore.c + ${PM3_ROOT}/client/src/loclass/cipher.c + ${PM3_ROOT}/client/src/loclass/cipherutils.c + ${PM3_ROOT}/client/src/loclass/elite_crack.c + ${PM3_ROOT}/client/src/loclass/hash1_brute.c + ${PM3_ROOT}/client/src/loclass/ikeys.c + ${PM3_ROOT}/client/src/mifare/mad.c + ${PM3_ROOT}/client/src/mifare/mfkey.c + ${PM3_ROOT}/client/src/mifare/mifare4.c + ${PM3_ROOT}/client/src/mifare/mifaredefault.c + ${PM3_ROOT}/client/src/mifare/mifarehost.c + ${PM3_ROOT}/client/src/mifare/ndef.c + ${PM3_ROOT}/client/src/mifare/desfire_crypto.c + ${PM3_ROOT}/client/src/uart/uart_posix.c + ${PM3_ROOT}/client/src/uart/uart_win32.c + ${PM3_ROOT}/client/src/ui/overlays.ui + ${PM3_ROOT}/client/src/aidsearch.c + ${PM3_ROOT}/client/src/cmdanalyse.c + ${PM3_ROOT}/client/src/cmdcrc.c + ${PM3_ROOT}/client/src/cmddata.c + ${PM3_ROOT}/client/src/cmdflashmem.c + ${PM3_ROOT}/client/src/cmdflashmemspiffs.c + ${PM3_ROOT}/client/src/cmdhf.c + ${PM3_ROOT}/client/src/cmdhf14a.c + ${PM3_ROOT}/client/src/cmdhf14b.c + ${PM3_ROOT}/client/src/cmdhf15.c + ${PM3_ROOT}/client/src/cmdhfcryptorf.c + ${PM3_ROOT}/client/src/cmdhfepa.c + ${PM3_ROOT}/client/src/cmdhffelica.c + ${PM3_ROOT}/client/src/cmdhffido.c + ${PM3_ROOT}/client/src/cmdhficlass.c + ${PM3_ROOT}/client/src/cmdhflegic.c + ${PM3_ROOT}/client/src/cmdhflist.c + ${PM3_ROOT}/client/src/cmdhflto.c + ${PM3_ROOT}/client/src/cmdhfmf.c + ${PM3_ROOT}/client/src/cmdhfmfdes.c + ${PM3_ROOT}/client/src/cmdhfmfhard.c + ${PM3_ROOT}/client/src/cmdhfmfp.c + ${PM3_ROOT}/client/src/cmdhfmfu.c + ${PM3_ROOT}/client/src/cmdhfthinfilm.c + ${PM3_ROOT}/client/src/cmdhftopaz.c + ${PM3_ROOT}/client/src/cmdhw.c + ${PM3_ROOT}/client/src/cmdlf.c + ${PM3_ROOT}/client/src/cmdlfawid.c + ${PM3_ROOT}/client/src/cmdlfcotag.c + ${PM3_ROOT}/client/src/cmdlfem4x.c + ${PM3_ROOT}/client/src/cmdlfem4x50.c + ${PM3_ROOT}/client/src/cmdlffdx.c + ${PM3_ROOT}/client/src/cmdlfgallagher.c + ${PM3_ROOT}/client/src/cmdlfguard.c + ${PM3_ROOT}/client/src/cmdlfhid.c + ${PM3_ROOT}/client/src/cmdlfhitag.c + ${PM3_ROOT}/client/src/cmdlfindala.c + ${PM3_ROOT}/client/src/cmdlfio.c + ${PM3_ROOT}/client/src/cmdlfjablotron.c + ${PM3_ROOT}/client/src/cmdlfkeri.c + ${PM3_ROOT}/client/src/cmdlfmotorola.c + ${PM3_ROOT}/client/src/cmdlfnedap.c + ${PM3_ROOT}/client/src/cmdlfnexwatch.c + ${PM3_ROOT}/client/src/cmdlfnoralsy.c + ${PM3_ROOT}/client/src/cmdlfpac.c + ${PM3_ROOT}/client/src/cmdlfparadox.c + ${PM3_ROOT}/client/src/cmdlfpcf7931.c + ${PM3_ROOT}/client/src/cmdlfpresco.c + ${PM3_ROOT}/client/src/cmdlfpyramid.c + ${PM3_ROOT}/client/src/cmdlfsecurakey.c + ${PM3_ROOT}/client/src/cmdlft55xx.c + ${PM3_ROOT}/client/src/cmdlfti.c + ${PM3_ROOT}/client/src/cmdlfviking.c + ${PM3_ROOT}/client/src/cmdlfvisa2000.c + ${PM3_ROOT}/client/src/cmdmain.c + ${PM3_ROOT}/client/src/cmdparser.c + ${PM3_ROOT}/client/src/cmdscript.c + ${PM3_ROOT}/client/src/cmdsmartcard.c + ${PM3_ROOT}/client/src/cmdtrace.c + ${PM3_ROOT}/client/src/cmdusart.c + ${PM3_ROOT}/client/src/cmdwiegand.c + ${PM3_ROOT}/client/src/comms.c + ${PM3_ROOT}/client/src/fileutils.c + ${PM3_ROOT}/client/src/flash.c + ${PM3_ROOT}/client/src/graph.c + ${PM3_ROOT}/client/src/jansson_path.c + ${PM3_ROOT}/client/src/preferences.c + ${PM3_ROOT}/client/src/pm3_binlib.c + ${PM3_ROOT}/client/src/pm3_bitlib.c + ${PM3_ROOT}/client/src/prng.c + ${PM3_ROOT}/client/src/scandir.c + ${PM3_ROOT}/client/src/scripting.c + ${PM3_ROOT}/client/src/tea.c + ${PM3_ROOT}/client/src/ui.c + ${PM3_ROOT}/client/src/util.c + ${PM3_ROOT}/client/src/wiegand_formats.c + ${PM3_ROOT}/client/src/wiegand_formatutils.c + ${CMAKE_BINARY_DIR}/version.c ) +add_custom_command( + OUTPUT ${CMAKE_BINARY_DIR}/version.c + COMMAND sh ${PM3_ROOT}/tools/mkversion.sh > ${CMAKE_BINARY_DIR}/version.c || perl ${PM3_ROOT}/tools/mkversion.pl > ${CMAKE_BINARY_DIR}/version.c || ${CMAKE_COMMAND} -E copy ${PM3_ROOT}/common/default_version.c ${CMAKE_BINARY_DIR}/version.c + DEPENDS ${PM3_ROOT}/common/default_version.c +) + set(ADDITIONAL_SRC "") set(ADDITIONAL_LNK "") - +set(ADDITIONAL_DIRS "") +set(ADDITIONAL_LNKDIRS "") set(X86_CPUS x86 x86_64 i686) message(STATUS "CMAKE_SYSTEM_PROCESSOR := ${CMAKE_SYSTEM_PROCESSOR}") if (APPLE) - message("Apple device detected.") - set(ADDITIONAL_SRC src/util_darwin.h src/util_darwin.m ${ADDITIONAL_SRC}) + message(STATUS "Apple device detected.") + set(ADDITIONAL_SRC ${PM3_ROOT}/client/src/util_darwin.h ${PM3_ROOT}/client/src/util_darwin.m ${ADDITIONAL_SRC}) set(ADDITIONAL_LNK "-framework Foundation" "-framework AppKit") endif (APPLE) -if (Qt5_FOUND) - message("Qt5 library found, building gui :)") +if ((NOT SKIPQT EQUAL 1) AND (Qt5_FOUND)) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) set (TARGET_SOURCES - src/proxgui.cpp - src/proxguiqt.cpp + ${PM3_ROOT}/client/src/proxgui.cpp + ${PM3_ROOT}/client/src/proxguiqt.cpp ${TARGET_SOURCES}) add_definitions("-DHAVE_GUI") - set(ADDITIONAL_LNK Qt5::Core Qt5::Widgets Qt5::Gui ${ADDITIONAL_LNK}) -else (Qt5_FOUND) - message("Qt5 library not found, not building gui") + set(ADDITIONAL_LNK ${Qt5_LIBRARIES} ${ADDITIONAL_LNK}) +else ((NOT SKIPQT EQUAL 1) AND (Qt5_FOUND)) set(TARGET_SOURCES - src/guidummy.cpp + ${PM3_ROOT}/client/src/guidummy.cpp ${TARGET_SOURCES}) -endif (Qt5_FOUND) +endif ((NOT SKIPQT EQUAL 1) AND (Qt5_FOUND)) -add_executable( - proxmark3 +if (NOT SKIPBT EQUAL 1) + if (BLUEZ_FOUND) + add_definitions("-DHAVE_BLUEZ") + set(ADDITIONAL_LNK ${BLUEZ_LIBRARIES} ${ADDITIONAL_LNK}) + endif (BLUEZ_FOUND) +endif(NOT SKIPBT EQUAL 1) + +if (JANSSON_FOUND) + set(ADDITIONAL_DIRS ${JANSSON_INCLUDE_DIRS} ${ADDITIONAL_DIRS}) + set(ADDITIONAL_LNK ${JANSSON_LIBRARIES} ${ADDITIONAL_LNK}) +endif (JANSSON_FOUND) + +if (NOT SKIPPYTHON EQUAL 1) + if (PYTHON3EMBED_FOUND) + add_definitions(-DHAVE_PYTHON) + set(ADDITIONAL_DIRS ${PYTHON3EMBED_INCLUDE_DIRS} ${ADDITIONAL_DIRS}) + set(ADDITIONAL_LNK ${PYTHON3EMBED_LIBRARIES} ${ADDITIONAL_LNK}) + set(ADDITIONAL_LNKDIRS ${PYTHON3EMBED_LIBRARY_DIRS} ${ADDITIONAL_LNKDIRS}) + elseif (PYTHON3_FOUND) + add_definitions(-DHAVE_PYTHON) + set(ADDITIONAL_DIRS ${PYTHON3_INCLUDE_DIRS} ${ADDITIONAL_DIRS}) + set(ADDITIONAL_LNK ${PYTHON3_LIBRARIES} ${ADDITIONAL_LNK}) + set(ADDITIONAL_LNKDIRS ${PYTHON3_LIBRARY_DIRS} ${ADDITIONAL_LNKDIRS}) + endif (PYTHON3EMBED_FOUND) +endif (NOT SKIPPYTHON EQUAL 1) + +if (NOT SKIPREADLINE EQUAL 1) + if (READLINE_FOUND) + add_definitions("-DHAVE_READLINE") + set(ADDITIONAL_DIRS ${READLINE_INCLUDE_DIRS} ${ADDITIONAL_DIRS}) + set(ADDITIONAL_LNK ${READLINE_LIBRARIES} ${ADDITIONAL_LNK}) + endif (READLINE_FOUND) +endif(NOT SKIPREADLINE EQUAL 1) + +if (BZIP2_FOUND) + set(ADDITIONAL_DIRS ${BZIP2_INCLUDE_DIRS} ${ADDITIONAL_DIRS}) + set(ADDITIONAL_LNK ${BZIP2_LIBRARIES} ${ADDITIONAL_LNK}) +endif (BZIP2_FOUND) + +if (WHEREAMI_FOUND) + set(ADDITIONAL_DIRS ${WHEREAMI_INCLUDE_DIRS} ${ADDITIONAL_DIRS}) + set(ADDITIONAL_LNK ${WHEREAMI_LIBRARIES} ${ADDITIONAL_LNK}) +endif (WHEREAMI_FOUND) + +message(STATUS "===================================================================") +if (SKIPQT EQUAL 1) + message(STATUS "GUI support: skipped") +else (SKIPQT EQUAL 1) + if (Qt5_FOUND) + message(STATUS "GUI support: QT5 found, enabled") + else (Qt5_FOUND) + message(STATUS "GUI support: QT5 not found, disabled") + endif (Qt5_FOUND) +endif (SKIPQT EQUAL 1) + +if (SKIPBT EQUAL 1) + message(STATUS "native BT support: skipped") +else (SKIPBT EQUAL 1) + if (BLUEZ_FOUND) + message(STATUS "native BT support: Bluez found, enabled") + else (BLUEZ_FOUND) + message(STATUS "native BT support: Bluez not found, disabled") + endif (BLUEZ_FOUND) +endif(SKIPBT EQUAL 1) + +if (EMBED_BZIP2) + message(STATUS "Bzip2 library: embedded") +else (EMBED_BZIP2) + message(STATUS "Bzip2 library: system library found") +endif (EMBED_BZIP2) + +if (SKIPJANSSONSYSTEM EQUAL 1) + message(STATUS "Jansson library: local library forced") +else (SKIPJANSSONSYSTEM EQUAL 1) + if (JANSSON_FOUND) + message(STATUS "Jansson library: system library found") + else (JANSSON_FOUND) + message(STATUS "Jansson library: system library not found, using local library") + endif (JANSSON_FOUND) +endif (SKIPJANSSONSYSTEM EQUAL 1) + +if (SKIPPYTHON EQUAL 1) + message(STATUS "Python3 library: skipped") +else (SKIPPYTHON EQUAL 1) + if (PYTHON3EMBED_FOUND) + message(STATUS "Python3 library: Python3 embed found, enabled") + elseif (PYTHON_FOUND) + message(STATUS "Python3 library: Python3 found, enabled") + else (PYTHON3EMBED_FOUND) + message(STATUS "Python3 library: Python3 not found, disabled") + endif (PYTHON3EMBED_FOUND) +endif(SKIPPYTHON EQUAL 1) + +if (SKIPREADLINE EQUAL 1) + message(STATUS "Readline library: skipped") +else (SKIPREADLINE EQUAL 1) + if (READLINE_FOUND) + if (EMBED_READLINE) + message(STATUS "Readline library: embedded") + else (EMBED_READLINE) + message(STATUS "Readline library: system library found") + endif (EMBED_READLINE) + else (READLINE_FOUND) + message(STATUS "Readline library: Readline not found, disabled") + endif (READLINE_FOUND) +endif(SKIPREADLINE EQUAL 1) + +if (SKIPWHEREAMISYSTEM EQUAL 1) + message(STATUS "Whereami library: local library forced") +else (SKIPWHEREAMISYSTEM EQUAL 1) + if (WHEREAMI_FOUND) + message(STATUS "Whereami library: system library found") + else (WHEREAMI_FOUND) + message(STATUS "Whereami library: system library not found, using local library") + endif (WHEREAMI_FOUND) +endif (SKIPWHEREAMISYSTEM EQUAL 1) +message(STATUS "===================================================================") + +add_executable(proxmark3 + ${PM3_ROOT}/client/src/proxmark3.c ${TARGET_SOURCES} ${ADDITIONAL_SRC} ) target_compile_options(proxmark3 PUBLIC -Wall -Werror -O3) +if (EMBED_READLINE) + if (NOT SKIPREADLINE EQUAL 1) + add_dependencies(proxmark3 ncurses readline) + endif (NOT SKIPREADLINE EQUAL 1) +endif (EMBED_READLINE) +if (EMBED_BZIP2) + add_dependencies(proxmark3 bzip2) +endif (EMBED_BZIP2) if (MINGW) # Mingw uses by default Microsoft printf, we want the GNU printf (e.g. for %z) @@ -228,34 +478,64 @@ if (MINGW) endif (MINGW) target_include_directories(proxmark3 PRIVATE - ../common - ../common_fpga - ../include - src + ${PM3_ROOT}/common + ${PM3_ROOT}/common_fpga + ${PM3_ROOT}/include + ${PM3_ROOT}/client/src + ${PM3_ROOT}/client/include + ${ADDITIONAL_DIRS} ) -if (APPLE) - set_target_properties(proxmark3 PROPERTIES LINK_FLAGS "-Wl,-F/Library/Frameworks, -L/usr/local/opt/readline/lib") - set_target_properties(proxmark3 PROPERTIES COMPILE_FLAGS "-I/usr/local/opt/readline/include") -else (APPLE) +if (NOT APPLE) # required for Raspberry Pi, but breaks with clang (OSX). Need to be at the end of the linker line. set(ADDITIONAL_LNK ${ADDITIONAL_LNK} -Wl,--as-needed -latomic -Wl,--no-as-needed) -endif (APPLE) +endif (NOT APPLE) -find_library(cliparser REQUIRED) -find_library(jansson REQUIRED) -find_library(tinycbor REQUIRED) -find_library(lua REQUIRED) -find_library(mbedtls REQUIRED) -find_library(reveng REQUIRED) -find_library(z REQUIRED) -find_library(hardnested REQUIRED) +find_library(pm3rrg_rdv4_cliparser REQUIRED) +find_library(pm3rrg_rdv4_tinycbor REQUIRED) +find_library(pm3rrg_rdv4_lua REQUIRED) +find_library(pm3rrg_rdv4_mbedtls REQUIRED) +find_library(pm3rrg_rdv4_reveng REQUIRED) +find_library(pm3rrg_rdv4_hardnested REQUIRED) -target_link_libraries(proxmark3 PRIVATE readline pthread m mbedtls cliparser jansson lua tinycbor amiibo reveng z hardnested ${ADDITIONAL_LNK}) +if (NOT JANSSON_FOUND) + find_library(pm3rrg_rdv4_jansson REQUIRED) + set(ADDITIONAL_LNK pm3rrg_rdv4_jansson ${ADDITIONAL_LNK}) +endif (NOT JANSSON_FOUND) +if (NOT WHEREAMI_FOUND) + find_library(pm3rrg_rdv4_whereami REQUIRED) + set(ADDITIONAL_LNK pm3rrg_rdv4_whereami ${ADDITIONAL_LNK}) +endif (NOT WHEREAMI_FOUND) + +target_link_libraries(proxmark3 PRIVATE + m + pm3rrg_rdv4_mbedtls + pm3rrg_rdv4_cliparser + pm3rrg_rdv4_lua + pm3rrg_rdv4_tinycbor + pm3rrg_rdv4_amiibo + pm3rrg_rdv4_reveng + pm3rrg_rdv4_hardnested + ${ADDITIONAL_LNK}) + +if (NOT SKIPPTHREAD EQUAL 1) + target_link_libraries(proxmark3 PRIVATE pthread) +endif (NOT SKIPPTHREAD EQUAL 1) + +if (NOT SKIPPYTHON EQUAL 1) + # OSX have a hard time compiling python3 dependency with older cmake. + if (PYTHON3EMBED_FOUND OR PYTHON3_FOUND) + if (NOT CMAKE_VERSION VERSION_LESS 3.13) + target_link_directories(proxmark3 PRIVATE ${ADDITIONAL_LNKDIRS}) + elseif (APPLE) + message( SEND_ERROR "Your CMAKE version is too old for Apple platform, please update to a version >=3.13" ) + endif (NOT CMAKE_VERSION VERSION_LESS 3.13) + endif (PYTHON3EMBED_FOUND OR PYTHON3_FOUND) +endif (NOT SKIPPYTHON EQUAL 1) install(TARGETS proxmark3 DESTINATION "bin") -install(DIRECTORY cmdscripts lualibs luascripts resources dictionaries DESTINATION "share/proxmark3") +install(DIRECTORY cmdscripts lualibs luascripts pyscripts resources dictionaries DESTINATION "share/proxmark3") add_custom_command(OUTPUT lualibs/pm3_cmd.lua COMMAND "awk -f pm3_cmd_h2lua.awk ../include/pm3_cmd.h > lualibs/pm3_cmd.lua" diff --git a/client/Makefile b/client/Makefile index d3461a302..a4e8b193d 100644 --- a/client/Makefile +++ b/client/Makefile @@ -4,26 +4,163 @@ # the license. #----------------------------------------------------------------------------- -# reveng will compile without macros, but these may be useful: -# Add -DBMPMACRO to use bitmap size constant macros (edit config.h) -# Add -DNOFORCE to disable the -F switch -# Add -DPRESETS to compile with preset models (edit config.h) - # Must be called before any Makefile include ROOT_DIR:=$(dir $(realpath $(lastword $(MAKEFILE_LIST)))) include ../Makefile.defs INSTALLBIN = proxmark3 -INSTALLSHARE = cmdscripts lualibs luascripts resources dictionaries +INSTALLSHARE = cmdscripts lualibs luascripts pyscripts resources dictionaries VPATH = ../common src vpath %.dic dictionaries OBJDIR = obj -LDLIBS ?= -L/usr/local/lib -LDLIBS += -lreadline -lpthread -lm +ifeq ($(platform),Darwin) + # cf brew info qt: qt not symlinked anymore + PKG_CONFIG_ENV := PKG_CONFIG_PATH=/usr/local/opt/qt/lib/pkgconfig +endif +################### +# local libraries # +################### + +## Amiibo +AMIIBOLIBPATH = ./deps/amiitool +AMIIBOLIBINC = -I$(AMIIBOLIBPATH) +AMIIBOLIB = $(AMIIBOLIBPATH)/libamiibo.a + +## Cliparser / Argtable3 +CLIPARSERLIBPATH = ./deps/cliparser +CLIPARSERLIBINC = -I$(CLIPARSERLIBPATH) +CLIPARSERLIB = $(CLIPARSERLIBPATH)/libcliparser.a + +## Hardnested +HARDNESTEDLIBPATH = ./deps/hardnested +HARDNESTEDLIBINC = -I$(HARDNESTEDLIBPATH) +HARDNESTEDLIB = $(HARDNESTEDLIBPATH)/libhardnested.a + +## Jansson +JANSSONLIBPATH = ./deps/jansson +JANSSONLIBINC = -I$(JANSSONLIBPATH) +JANSSONLIB = $(JANSSONLIBPATH)/libjansson.a + +## Lua +LUALIBPATH = ./deps/liblua +LUALIBINC = -I$(LUALIBPATH) +LUALIB = $(LUALIBPATH)/liblua.a +LUAPLATFORM = generic +ifneq (,$(findstring MINGW,$(platform))) + LUAPLATFORM = mingw +else + ifeq ($(platform),Darwin) + LUAPLATFORM = macosx + else + LUALIB += -ldl + LUAPLATFORM = linux + endif +endif + +## Reveng +REVENGLIBPATH = ./deps/reveng +REVENGLIBINC = -I$(REVENGLIBPATH) +REVENGLIB = $(REVENGLIBPATH)/libreveng.a + +## Tinycbor +TINYCBORLIBPATH = ./deps/tinycbor +TINYCBORLIBINC = -I$(TINYCBORLIBPATH) +TINYCBORLIB = $(TINYCBORLIBPATH)/tinycbor.a + +## Whereami +WHEREAMILIBPATH = ./deps/whereami +WHEREAMILIBINC = -I$(WHEREAMILIBPATH) +WHEREAMILIB = $(WHEREAMILIBPATH)/libwhereami.a + +########################## +# common local libraries # +########################## + +## mbed TLS +MBEDTLSLIBPATH = ../common/mbedtls +MBEDTLSLIBINC = -I$(MBEDTLSLIBPATH) +MBEDTLSLIB = $(OBJDIR)/libmbedtls.a + +######################################################## +# optional system libraries to replace local libraries # +######################################################## + +## Amiibo +# not distributed as system library +LDLIBS += $(AMIIBOLIB) +INCLUDES += $(AMIIBOLIBINC) + +## Cliparser / Argtable3 +# not distributed as system library +LDLIBS += $(CLIPARSERLIB) +INCLUDES += $(CLIPARSERLIBINC) + +## Hardnested +# not distributed as system library +LDLIBS += $(HARDNESTEDLIB) +INCLUDES += $(HARDNESTEDLIBINC) + +## Jansson +ifneq ($(SKIPJANSSONSYSTEM),1) + JANSSONINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags jansson 2>/dev/null) + JANSSONLDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs jansson 2>/dev/null) + ifneq ($(JANSSONLDLIBS),) + JANSSONLIB = $(JANSSONLDLIBS) + JANSSONLIBINC = $(JANSSONINCLUDES) + JANSSON_FOUND = 1 + endif +endif +LDLIBS += $(JANSSONLIB) +INCLUDES += $(JANSSONLIBINC) + +## Lua +ifneq ($(SKIPLUASYSTEM),1) + LUAINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags lua5.2 2>/dev/null) + LUALDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs lua5.2 2>/dev/null) + ifneq ($(LUALDLIBS),) + LUALIB = $(LUALDLIBS) + LUALIBINC = $(LUAINCLUDES) + LUA_FOUND = 1 + endif +endif +LDLIBS += $(LUALIB) +INCLUDES += $(LUALIBINC) + +## mbed TLS +# system library cannot be used because it is compiled by default without CMAC support +LDLIBS +=$(MBEDTLSLIB) +INCLUDES += $(MBEDTLSLIBINC) + +## Reveng +# not distributed as system library +LDLIBS += $(REVENGLIB) +INCLUDES += $(REVENGLIBINC) + +## Tinycbor +# not distributed as system library +LDLIBS += $(TINYCBORLIB) +INCLUDES += $(TINYCBORLIBINC) + +## Whereami +ifneq ($(SKIPWHEREAMISYSTEM),1) + ifneq (,$(wildcard /usr/include/whereami.h)) + WHEREAMILIB = -lwhereami + WHEREAMILIBINC = + WHEREAMI_FOUND = 1 + endif +endif +LDLIBS += $(WHEREAMILIB) +INCLUDES += $(WHEREAMILIBINC) + +#################### +# system libraries # +#################### + +## Atomic # RPi Zero gcc requires -latomic # but MacOSX /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld # doesn't recognize option --as-needed @@ -31,35 +168,111 @@ ifneq ($(platform),Darwin) LDLIBS += -Wl,--as-needed -latomic -Wl,--no-as-needed endif -# local libraries -LUALIBPATH = ./deps/liblua -LUALIB = $(LUALIBPATH)/liblua.a -JANSSONLIBPATH = ./deps/jansson -JANSSONLIB = $(JANSSONLIBPATH)/libjansson.a -CBORLIBPATH = ./deps/tinycbor -CBORLIB = $(CBORLIBPATH)/tinycbor.a -REVENGPATH = ./deps/reveng -REVENGLIB = $(REVENGPATH)/libreveng.a -AMIIBOLIBPATH = ./deps/amiitool -AMIIBOLIB = $(AMIIBOLIBPATH)/libamiibo.a -HARDNESTEDPATH = ./deps/hardnested -HARDNESTEDLIB = $(HARDNESTEDPATH)/libhardnested.a -CLIPARSERPATH = ./deps/cliparser -CLIPARSERLIB = $(CLIPARSERPATH)/libcliparser.a +## BZIP2 +LDLIBS += -lbz2 -# common libraries -MBEDTLSLIBPATH = ../common/mbedtls -MBEDTLSLIB = $(OBJDIR)/libmbedtls.a -ZLIBPATH = ../common/zlib -ZLIB = $(OBJDIR)/libz.a +## Bluez (optional) +ifneq ($(SKIPBT),1) + BTINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags bluez 2>/dev/null) + BTLDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs bluez 2>/dev/null) + ifneq ($(BTLDLIBS),) + BTLIB = $(BTLDLIBS) + BTLIBINC = $(BTINCLUDES) + BT_FOUND = 1 + endif +endif +LDLIBS += $(BTLIB) +INCLUDES += $(BTLIBINC) -LIBS = -I$(LUALIBPATH) -I$(MBEDTLSLIBPATH) -I$(JANSSONLIBPATH) -I$(CBORLIBPATH) -I$(ZLIBPATH) -I$(REVENGPATH) -I$(AMIIBOLIBPATH) -I$(HARDNESTEDPATH) -I$(CLIPARSERPATH) -INCLUDES_CLIENT = -I./src -I../include -I../common -I../common_fpga $(LIBS) -CFLAGS ?= -Wall -Werror -O3 +## Math +LDLIBS += -lm + +## Pthread +# Some have no pthread, e.g. termux +ifneq ($(SKIPPTHREAD),1) + LDLIBS += -lpthread +endif + +## Python3 (optional) +ifneq ($(SKIPPYTHON),1) + PYTHONINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags python3 2>/dev/null) + PYTHONLDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs python3 2>/dev/null) + ifneq ($(PYTHONLDLIBS),) + PYTHONLIB = $(PYTHONLDLIBS) + PYTHONLIBINC = $(PYTHONINCLUDES) + PYTHON_FOUND = 1 + else + # since python3.8, applications willing to embed python must use -embed: + PYTHONINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags python3-embed 2>/dev/null) + PYTHONLDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs python3-embed 2>/dev/null) + ifneq ($(PYTHONLDLIBS),) + PYTHONLIB = $(PYTHONLDLIBS) + PYTHONLIBINC = $(PYTHONINCLUDES) + PYTHON_FOUND = 1 + endif + endif +endif +LDLIBS += $(PYTHONLIB) +INCLUDES += $(PYTHONLIBINC) + +## QT5 (or QT4 fallback) (optional) +ifneq ($(SKIPQT),1) + # Check for correctly configured Qt5 + QTINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags Qt5Core Qt5Widgets 2>/dev/null) + QTLDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs Qt5Core Qt5Widgets 2>/dev/null) + MOC = $(shell $(PKG_CONFIG_ENV) pkg-config --variable=host_bins Qt5Core)/moc + UIC = $(shell $(PKG_CONFIG_ENV) pkg-config --variable=host_bins Qt5Core)/uic + ifneq ($(QTLDLIBS),) + QT5_FOUND = 1 + else + # if Qt5 not found check for correctly configured Qt4 + QTINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags QtCore QtGui 2>/dev/null) + QTLDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs QtCore QtGui 2>/dev/null) + MOC = $(shell $(PKG_CONFIG_ENV) pkg-config --variable=moc_location QtCore) + UIC = $(shell $(PKG_CONFIG_ENV) pkg-config --variable=uic_location QtCore) + endif + ifeq ($(QTLDLIBS),) + # if both pkg-config commands failed, search in common places + ifneq ($(QTDIR),) + ifneq ($(wildcard $(QTDIR)/include/QtWidgets),) + # QT5 + QTINCLUDES = -I$(QTDIR)/include -I$(QTDIR)/include/QtCore -I$(QTDIR)/include/QtGui -I$(QTDIR)/include/QtWidgets + QTLDLIBS = -L$(QTDIR)/lib -lQt5Core -lQt5Gui -lQt5Widgets + QT5_FOUND = 1 + else + # QT4 + QTINCLUDES = -I$(QTDIR)/include -I$(QTDIR)/include/QtCore -I$(QTDIR)/include/QtGui + QTLDLIBS = -L$(QTDIR)/lib -lQtCore4 -lQtGui4 + endif + MOC = $(QTDIR)/bin/moc + UIC = $(QTDIR)/bin/uic + endif + endif + ifneq ($(QTLDLIBS),) + QT_FOUND = 1 + endif +endif +LDLIBS += $(QTLDLIBS) +CXXINCLUDES += $(QTINCLUDES) + +## Readline +ifneq ($(SKIPREADLINE),1) + ifeq ($(platform),Darwin) + LDLIBS += -L/usr/local/opt/readline/lib + INCLUDES += -I/usr/local/opt/readline/include + endif + LDLIBS += -lreadline + READLINE_FOUND = 1 +endif + +####################################################################################################### +CFLAGS ?= $(DEFCFLAGS) # We cannot just use CFLAGS+=... because it has impact on sub-makes if CFLAGS is defined in env: -PM3CFLAGS = $(CFLAGS) $(INCLUDES_CLIENT) +PM3CFLAGS = $(CFLAGS) +PM3CFLAGS += -I./src -I../include -I../common -I../common_fpga $(INCLUDES) # WIP Testing -#PM3CFLAGS = $(CFLAGS) -std=c11 -pedantic $(INCLUDES_CLIENT) +#PM3CFLAGS += -std=c11 -pedantic + PREFIX ?= /usr/local ifneq (,$(findstring MINGW,$(platform))) # Mingw uses by default Microsoft printf, we want the GNU printf (e.g. for %z) @@ -69,227 +282,304 @@ ifneq (,$(findstring MINGW,$(platform))) PM3CFLAGS += -D_ISOC99_SOURCE PM3CFLAGS += -mno-ms-bitfields -fexec-charset=cp850 endif + +ifeq ($(READLINE_FOUND),1) + PM3CFLAGS += -DHAVE_READLINE +endif + +ifeq ($(BT_FOUND),1) + PM3CFLAGS += -DHAVE_BLUEZ +endif + +ifeq ($(PYTHON_FOUND),1) + PM3CFLAGS += -DHAVE_PYTHON +endif + + CXXFLAGS ?= -Wall -Werror -O3 -PM3CXXFLAGS = $(CXXFLAGS) -I../include +PM3CXXFLAGS = $(CXXFLAGS) +PM3CXXFLAGS += -I../include -LUAPLATFORM = generic -ifneq (,$(findstring MINGW,$(platform))) - LUAPLATFORM = mingw -else - ifeq ($(platform),Darwin) - LUAPLATFORM = macosx - OBJCSRCS = util_darwin.m - LDFLAGS += -framework Foundation -framework AppKit - LDLIBS := -L/usr/local/opt/readline/lib $(LDLIBS) - LIBS := -I/usr/local/opt/readline/include $(LIBS) - # cf brew info qt: qt not symlinked anymore - PKG_CONFIG_ENV := PKG_CONFIG_ENV=/usr/local/opt/qt/lib/pkgconfig -else - LUALIB += -ldl - LUAPLATFORM = linux -endif -endif - -ifneq ($(SKIPQT),1) - # Check for correctly configured Qt5 - QTINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags Qt5Core Qt5Widgets 2>/dev/null) - QTLDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs Qt5Core Qt5Widgets 2>/dev/null) - MOC = $(shell $(PKG_CONFIG_ENV) pkg-config --variable=host_bins Qt5Core)/moc - UIC = $(shell $(PKG_CONFIG_ENV) pkg-config --variable=host_bins Qt5Core)/uic - ifeq ($(QTINCLUDES), ) - # if Qt5 not found check for correctly configured Qt4 - QTINCLUDES = $(shell $(PKG_CONFIG_ENV) pkg-config --cflags QtCore QtGui 2>/dev/null) - QTLDLIBS = $(shell $(PKG_CONFIG_ENV) pkg-config --libs QtCore QtGui 2>/dev/null) - MOC = $(shell $(PKG_CONFIG_ENV) pkg-config --variable=moc_location QtCore) - UIC = $(shell $(PKG_CONFIG_ENV) pkg-config --variable=uic_location QtCore) - else +ifeq ($(QT_FOUND),1) + PM3CFLAGS += -DHAVE_GUI + PM3CXXFLAGS += -DQT_NO_DEBUG + ifeq ($(QT5_FOUND),1) # On OSX Qt5 is claiming for a C++11 compiler (gnu++14 works too, but if nothing it fails) PM3CXXFLAGS += -fPIC -std=c++11 endif - ifeq ($(QTINCLUDES), ) - # if both pkg-config commands failed, search in common places - ifneq ($(QTDIR), ) - QTINCLUDES = -I$(QTDIR)/include -I$(QTDIR)/include/QtCore -I$(QTDIR)/include/QtGui - QTLDLIBS = -L$(QTDIR)/lib -lQtCore4 -lQtGui4 - ifneq ($(wildcard $(QTDIR)/include/QtWidgets),) - QTINCLUDES += -I$(QTDIR)/include/QtWidgets - QTLDLIBS = -L$(QTDIR)/lib -lQt5Widgets -lQt5Gui -lQt5Core - PM3CXXFLAGS += -fPIC -std=c++11 - endif - MOC = $(QTDIR)/bin/moc - UIC = $(QTDIR)/bin/uic +endif + +PM3LDFLAGS = $(LDFLAGS) +ifeq ($(platform),Darwin) + PM3LDFLAGS += -framework Foundation -framework AppKit +endif + +################### +# printing status # +################### + +$(info ===================================================================) +$(info Client platform: $(platform)) + +ifeq ($(SKIPQT),1) + $(info GUI support: skipped) +else + ifeq ($(QT_FOUND),1) + ifeq ($(QT5_FOUND),1) + $(info GUI support: QT5 found, enabled) + else + $(info GUI support: QT4 found, enabled) endif + else + $(info GUI support: QT not found, disabled) endif endif -ifneq ($(QTLDLIBS),) - QTGUISRCS = proxgui.cpp proxguiqt.cpp proxguiqt.moc.cpp - QTGUIOBJS = $(OBJDIR)/proxgui.o $(OBJDIR)/proxguiqt.o $(OBJDIR)/proxguiqt.moc.o - PM3CFLAGS += -DHAVE_GUI - PM3CXXFLAGS += -DQT_NO_DEBUG +ifeq ($(SKIPBT),1) + $(info native BT support: skipped) else - QTGUISRCS = guidummy.cpp - QTGUIOBJS = $(OBJDIR)/guidummy.o + ifeq ($(BT_FOUND),1) + $(info native BT support: Bluez found, enabled) + else + $(info native BT support: Bluez not found, disabled) + endif endif +ifeq ($(SKIPJANSSONSYSTEM),1) + $(info Jansson library: local library forced) +else ifeq ($(JANSSON_FOUND),1) + $(info Jansson library: system library found) +else + $(info Jansson library: system library not found, using local library) +endif + +ifeq ($(SKIPLUASYSTEM),1) + $(info Lua library: local library forced) +else + ifeq ($(LUA_FOUND),1) + $(info Lua library: system library found) + else + $(info Lua library: system library not found, using local library) + endif +endif + +ifeq ($(SKIPPYTHON),1) + $(info Python3 library: skipped) +else + ifeq ($(PYTHON_FOUND),1) + $(info Python3 library: Python3 v$(shell pkg-config --modversion python3) found, enabled) + else + $(info Python3 library: Python3 not found, disabled) + endif +endif + +ifeq ($(SKIPREADLINE),1) + $(info Readline library: skipped) +else + ifeq ($(READLINE_FOUND),1) + $(info Readline library: enabled) + else + $(info Readline library: Readline not found, disabled) + endif +endif + +ifeq ($(SKIPWHEREAMISYSTEM),1) + $(info Whereami library: local library forced) +else + ifeq ($(WHEREAMI_FOUND),1) + $(info Whereami library: system library found) + else + $(info Whereami library: system library not found, using local library) + endif +endif + +$(info compiler version: $(shell $(CC) --version|head -n 1)) +$(info ===================================================================) + +################ +# dependencies # +################ + # Flags to generate temporary dependency files DEPFLAGS = -MT $@ -MMD -MP -MF $(OBJDIR)/$*.Td # make temporary to final dependency files after successful compilation POSTCOMPILE = $(MV) -f $(OBJDIR)/$*.Td $(OBJDIR)/$*.d && $(TOUCH) $@ -CORESRCS = uart/uart_posix.c \ - uart/uart_win32.c \ - ui.c \ - commonutil.c \ - util.c \ - util_posix.c \ - scandir.c \ - crc16.c \ - crc32.c \ - comms.c +################ +# enumerations # +################ -CMDSRCS = crapto1/crapto1.c \ - crapto1/crypto1.c \ - mifare/mifaredefault.c \ - mifare/mfkey.c \ - tea.c \ - fido/additional_ca.c \ - fido/cose.c \ - fido/cbortools.c \ - fido/fidocore.c \ - crypto/asn1dump.c \ - crypto/libpcrypto.c\ - crypto/asn1utils.c\ - loclass/cipher.c \ - loclass/cipherutils.c \ - loclass/ikeys.c \ - loclass/elite_crack.c \ - fileutils.c \ - whereami.c \ - mifare/mifarehost.c \ - parity.c \ - crc.c \ - crc64.c \ - legic_prng.c \ - iso15693tools.c \ - prng.c \ - generator.c \ - graph.c \ - cmddata.c \ - lfdemod.c \ - emv/crypto_polarssl.c\ - emv/crypto.c\ - emv/emv_pk.c\ - emv/emv_pki.c\ - emv/emv_pki_priv.c\ - emv/test/cryptotest.c\ - emv/apduinfo.c \ - emv/dump.c \ - emv/tlv.c \ - emv/emv_tags.c \ - emv/dol.c \ - emv/emvjson.c\ - emv/emvcore.c \ - emv/test/crypto_test.c\ - emv/test/sda_test.c\ - emv/test/dda_test.c\ - emv/test/cda_test.c\ - emv/cmdemv.c \ - emv/emv_roca.c \ - mifare/mifare4.c \ - mifare/mad.c \ - mifare/ndef.c \ - mifare/desfire_crypto.c \ - cmdanalyse.c \ - cmdhf.c \ - cmdhflist.c \ - aidsearch.c \ - cmdhf14a.c \ - cmdhf14b.c \ - cmdhf15.c \ - cmdhfepa.c \ - cmdhflegic.c \ - cmdhficlass.c \ - cmdhfmf.c \ - cmdhfmfu.c \ - cmdhfmfp.c \ - cmdhfmfhard.c \ - cmdhfmfdes.c \ - cmdhftopaz.c \ - cmdhffido.c \ - cmdhffelica.c \ - cmdhfthinfilm.c \ - cmdhfcryptorf.c \ - cmdhflto.c \ - cmdhw.c \ - cmdlf.c \ - cmdlfawid.c \ - cmdlfcotag.c \ - cmdlfem4x.c \ - cmdlffdx.c \ - cmdlfguard.c \ - cmdlfgallagher.c \ - cmdlfhid.c \ - cmdlfhitag.c \ - cmdlfio.c \ - cmdlfindala.c \ - cmdlfjablotron.c \ - cmdlfkeri.c \ - cmdlfnexwatch.c \ - cmdlfnedap.c \ - cmdlfnoralsy.c \ - cmdlfpac.c \ - cmdlfparadox.c \ - cmdlfpcf7931.c \ - cmdlfpresco.c \ - cmdlfpyramid.c \ - cmdlfsecurakey.c \ - cmdlft55xx.c \ - cmdlfti.c \ - cmdlfviking.c \ - cmdlfvisa2000.c \ - cmdlfmotorola.c \ - cmdtrace.c \ - cmdflashmem.c \ - cmdflashmemspiffs.c \ - cmdsmartcard.c \ - cmdusart.c \ - cmdwiegand.c \ - cmdparser.c \ - cmdmain.c \ - pm3_binlib.c \ - scripting.c \ - cmdscript.c \ - pm3_bitlib.c \ - cmdcrc.c \ - bucketsort.c \ - flash.c \ - wiegand_formats.c \ - wiegand_formatutils.c \ - cardhelper.c \ - preferences.c +SRCS = aidsearch.c \ + cmdanalyse.c \ + cmdcrc.c \ + cmddata.c \ + cmdflashmem.c \ + cmdflashmemspiffs.c \ + cmdhf.c \ + cmdhf14a.c \ + cmdhf14b.c \ + cmdhf15.c \ + cmdhfcryptorf.c \ + cmdhfepa.c \ + cmdhffelica.c \ + cmdhffido.c \ + cmdhficlass.c \ + cmdhflegic.c \ + cmdhflist.c \ + cmdhflto.c \ + cmdhfmf.c \ + cmdhfmfdes.c \ + cmdhfmfhard.c \ + cmdhfmfu.c \ + cmdhfmfp.c \ + cmdhfthinfilm.c \ + cmdhftopaz.c \ + cmdhw.c \ + cmdlf.c \ + cmdlfawid.c \ + cmdlfcotag.c \ + cmdlfem4x.c \ + cmdlfem4x50.c \ + cmdlffdx.c \ + cmdlfguard.c \ + cmdlfgallagher.c \ + cmdlfhid.c \ + cmdlfhitag.c \ + cmdlfindala.c \ + cmdlfio.c \ + cmdlfjablotron.c \ + cmdlfkeri.c \ + cmdlfmotorola.c \ + cmdlfnedap.c \ + cmdlfnexwatch.c \ + cmdlfnoralsy.c \ + cmdlfpac.c \ + cmdlfparadox.c \ + cmdlfpcf7931.c \ + cmdlfpresco.c \ + cmdlfpyramid.c \ + cmdlfsecurakey.c \ + cmdlft55xx.c \ + cmdlfti.c \ + cmdlfviking.c \ + cmdlfvisa2000.c \ + cmdmain.c \ + cmdparser.c \ + cmdscript.c \ + cmdsmartcard.c \ + cmdtrace.c \ + cmdusart.c \ + cmdwiegand.c \ + comms.c \ + crypto/asn1dump.c \ + crypto/asn1utils.c\ + crypto/libpcrypto.c\ + emv/apduinfo.c \ + emv/cmdemv.c \ + emv/crypto.c\ + emv/crypto_polarssl.c\ + emv/dol.c \ + emv/dump.c \ + emv/emv_pk.c\ + emv/emv_pki.c\ + emv/emv_pki_priv.c\ + emv/emv_roca.c \ + emv/emv_tags.c \ + emv/emvcore.c \ + emv/emvjson.c\ + emv/tlv.c \ + emv/test/crypto_test.c\ + emv/test/cryptotest.c\ + emv/test/cda_test.c\ + emv/test/dda_test.c\ + emv/test/sda_test.c\ + fido/additional_ca.c \ + fido/cose.c \ + fido/cbortools.c \ + fido/fidocore.c \ + fileutils.c \ + flash.c \ + generator.c \ + graph.c \ + jansson_path.c \ + loclass/cipher.c \ + loclass/cipherutils.c \ + loclass/elite_crack.c \ + loclass/ikeys.c \ + mifare/desfire_crypto.c \ + mifare/mad.c \ + mifare/mfkey.c \ + mifare/mifare4.c \ + mifare/mifaredefault.c \ + mifare/mifarehost.c \ + mifare/ndef.c \ + pm3_binlib.c \ + pm3_bitlib.c \ + preferences.c \ + prng.c \ + proxmark3.c \ + scandir.c \ + uart/uart_posix.c \ + uart/uart_win32.c \ + scripting.c \ + tea.c \ + ui.c \ + util.c \ + version.c \ + wiegand_formats.c \ + wiegand_formatutils.c +# common +SRCS += bucketsort.c \ + cardhelper.c \ + crapto1/crapto1.c \ + crapto1/crypto1.c \ + crc.c \ + crc16.c \ + crc32.c \ + crc64.c \ + commonutil.c \ + iso15693tools.c \ + legic_prng.c \ + lfdemod.c \ + parity.c \ + util_posix.c +# gui +ifeq ($(QT_FOUND),1) + CXXSRCS = proxgui.cpp proxguiqt.cpp proxguiqt.moc.cpp +else + CXXSRCS = guidummy.cpp +endif -COREOBJS = $(CORESRCS:%.c=$(OBJDIR)/%.o) -CMDOBJS = $(CMDSRCS:%.c=$(OBJDIR)/%.o) -OBJCOBJS = $(OBJCSRCS:%.m=$(OBJDIR)/%.o) +# OS X +ifeq ($(platform),Darwin) + OBJCSRCS = util_darwin.m +endif + +OBJS = $(SRCS:%.c=$(OBJDIR)/%.o) +OBJS += $(CXXSRCS:%.cpp=$(OBJDIR)/%.o) +OBJS += $(OBJCSRCS:%.m=$(OBJDIR)/%.o) BINS = proxmark3 -CLEAN = $(BINS) src/*.moc.cpp src/ui/ui_overlays.h lualibs/pm3_cmd.lua lualibs/mfc_default_keys.lua + +CLEAN = $(BINS) src/version.c src/*.moc.cpp src/ui/ui_overlays.h lualibs/pm3_cmd.lua lualibs/mfc_default_keys.lua # transition: cleaning also old path stuff CLEAN += flasher *.moc.cpp ui/ui_overlays.h +########### +# targets # +########### + # need to assign dependancies to build these first... all: $(BINS) all-static: LDLIBS:=-static $(LDLIBS) all-static: $(BINS) -proxmark3: LDLIBS+=$(LUALIB) $(JANSSONLIB) $(MBEDTLSLIB) $(CBORLIB) $(ZLIB) $(REVENGLIB) $(AMIIBOLIB) $(HARDNESTEDLIB) $(CLIPARSERLIB) $(QTLDLIBS) -proxmark3: $(OBJDIR)/proxmark3.o $(COREOBJS) $(CMDOBJS) $(OBJCOBJS) $(QTGUIOBJS) $(LUALIB) $(JANSSONLIB) $(CBORLIB) $(REVENGLIB) $(MBEDTLSLIB) $(ZLIB) $(AMIIBOLIB) $(HARDNESTEDLIB) $(CLIPARSERLIB) lualibs/pm3_cmd.lua lualibs/mfc_default_keys.lua +proxmark3: $(OBJS) amiibo cliparser jansson hardnested lua mbedtls reveng tinycbor whereami lualibs/pm3_cmd.lua lualibs/mfc_default_keys.lua $(info [=] LD $@) - $(Q)$(LD) $(LDFLAGS) $(OBJDIR)/proxmark3.o $(COREOBJS) $(CMDOBJS) $(OBJCOBJS) $(QTGUIOBJS) $(LDLIBS) -o $@ + $(Q)$(LD) $(PM3LDFLAGS) $(OBJS) $(LDLIBS) -o $@ src/proxgui.cpp: src/ui/ui_overlays.h @@ -312,13 +602,16 @@ lualibs/mfc_default_keys.lua : mfc_default_keys.dic clean: $(Q)$(RM) $(CLEAN) $(Q)$(RMDIR) $(OBJDIR) - $(Q)$(MAKE) --no-print-directory -C $(LUALIBPATH) clean - $(Q)$(MAKE) --no-print-directory -C $(JANSSONLIBPATH) clean - $(Q)$(MAKE) --no-print-directory -C $(CBORLIBPATH) clean - $(Q)$(MAKE) --no-print-directory -C $(REVENGPATH) clean $(Q)$(MAKE) --no-print-directory -C $(AMIIBOLIBPATH) clean - $(Q)$(MAKE) --no-print-directory -C $(HARDNESTEDPATH) clean - $(Q)$(MAKE) --no-print-directory -C $(CLIPARSERPATH) clean + $(Q)$(MAKE) --no-print-directory -C $(CLIPARSERLIBPATH) clean + $(Q)$(MAKE) --no-print-directory -C $(HARDNESTEDLIBPATH) clean + $(Q)$(MAKE) --no-print-directory -C $(JANSSONLIBPATH) clean + $(Q)$(MAKE) --no-print-directory -C $(LUALIBPATH) clean + $(Q)$(MAKE) --no-print-directory -C $(REVENGLIBPATH) clean + $(Q)$(MAKE) --no-print-directory -C $(TINYCBORLIBPATH) clean + $(Q)$(MAKE) --no-print-directory -C $(WHEREAMILIBPATH) clean + @# Just in case someone compiled within these dirs: + $(Q)$(MAKE) --no-print-directory -C $(MBEDTLSLIBPATH) clean install: all $(info [@] Installing client to $(DESTDIR)$(PREFIX)...) @@ -346,45 +639,62 @@ tarbin: $(BINS) $(info [=] TAR ../proxmark3-$(platform)-bin.tar) $(Q)$(TAR) $(TARFLAGS) ../proxmark3-$(platform)-bin.tar $(BINS:%=client/%) $(WINBINS:%=client/%) -# local libraries: -$(LUALIB): - $(info [*] MAKE liblua for $(LUAPLATFORM)) - $(Q)$(MAKE) --no-print-directory -C $(LUALIBPATH) $(LUAPLATFORM) +########################### +# local libraries targets # +########################### -$(JANSSONLIB): - $(info [*] MAKE jansson) - $(Q)$(MAKE) --no-print-directory -C $(JANSSONLIBPATH) all - -$(CBORLIB): - $(info [*] MAKE tinycbor) - $(Q)$(MAKE) --no-print-directory -C $(CBORLIBPATH) all - -$(REVENGLIB): - $(info [*] MAKE reveng) - $(Q)$(MAKE) --no-print-directory -C $(REVENGPATH) all - -$(HARDNESTEDLIB): - $(info [*] MAKE hardnested) - $(Q)$(MAKE) --no-print-directory -C $(HARDNESTEDPATH) all - -$(AMIIBOLIB): - $(info [*] MAKE amiibo) +amiibo: + $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C $(AMIIBOLIBPATH) all -$(CLIPARSERLIB): - $(info [*] MAKE cliparser) - $(Q)$(MAKE) --no-print-directory -C $(CLIPARSERPATH) all +cliparser: + $(info [*] MAKE $@) + $(Q)$(MAKE) --no-print-directory -C $(CLIPARSERLIBPATH) all -# common libraries: -$(MBEDTLSLIB): - $(info [*] MAKE mbedtls) +hardnested: + $(info [*] MAKE $@) + $(Q)$(MAKE) --no-print-directory -C $(HARDNESTEDLIBPATH) all + +jansson: +ifneq ($(JANSSON_FOUND),1) + $(info [*] MAKE $@) + $(Q)$(MAKE) --no-print-directory -C $(JANSSONLIBPATH) all +endif + +lua: +ifneq ($(LUA_FOUND),1) + $(info [*] MAKE $@ for $(LUAPLATFORM)) + $(Q)$(MAKE) --no-print-directory -C $(LUALIBPATH) $(LUAPLATFORM) +endif + +mbedtls: + $(info [*] MAKE $@) $(Q)$(MAKE) --no-print-directory -C $(MBEDTLSLIBPATH) OBJDIR=$(ROOT_DIR)$(OBJDIR) BINDIR=$(ROOT_DIR)$(OBJDIR) all -$(ZLIB): - $(info [*] MAKE zlib) - $(Q)$(MAKE) --no-print-directory -C $(ZLIBPATH) OBJDIR=$(ROOT_DIR)$(OBJDIR) BINDIR=$(ROOT_DIR)$(OBJDIR) all +reveng: + $(info [*] MAKE $@) + $(Q)$(MAKE) --no-print-directory -C $(REVENGLIBPATH) all -.PHONY: all clean install uninstall +tinycbor: + $(info [*] MAKE $@) + $(Q)$(MAKE) --no-print-directory -C $(TINYCBORLIBPATH) all + +whereami: +ifneq ($(WHEREAMI_FOUND),1) + $(info [*] MAKE $@) + $(Q)$(MAKE) --no-print-directory -C $(WHEREAMILIBPATH) all +endif + +######## +# misc # +######## + +.PHONY: all clean install uninstall tarbin amiibo cliparser hardnested jansson lua mbedtls reveng tinycbor whereami + +# version.c should be remade on every compilation +src/version.c: default_version.c + $(info [=] GEN $@) + $(Q)$(SH) ../tools/mkversion.sh > $@ || $(PERL) ../tools/mkversion.pl > $@ || $(CP) $< $@ # easy printing of MAKE VARIABLES print-%: ; @echo $* = $($*) @@ -400,7 +710,7 @@ $(OBJDIR)/%.o : %.c $(OBJDIR)/%.d $(OBJDIR)/%.o : %.cpp $(OBJDIR)/%.d $(info [-] CXX $<) $(Q)$(MKDIR) $(dir $@) - $(Q)$(CXX) $(DEPFLAGS) $(PM3CXXFLAGS) $(QTINCLUDES) -c -o $@ $< + $(Q)$(CXX) $(DEPFLAGS) $(PM3CXXFLAGS) $(CXXINCLUDES) -c -o $@ $< $(Q)$(POSTCOMPILE) %.o: %.m @@ -410,10 +720,9 @@ $(OBJDIR)/%.o : %.m $(OBJDIR)/%.d $(Q)$(CC) $(DEPFLAGS) $(PM3CFLAGS) -c -o $@ $< $(Q)$(POSTCOMPILE) -DEPENDENCY_FILES = $(patsubst %.c, $(OBJDIR)/%.d, $(CORESRCS) $(CMDSRCS)) \ - $(patsubst %.cpp, $(OBJDIR)/%.d, $(QTGUISRCS)) \ - $(patsubst %.m, $(OBJDIR)/%.d, $(OBJCSRCS)) \ - $(OBJDIR)/proxmark3.d +DEPENDENCY_FILES = $(patsubst %.c, $(OBJDIR)/%.d, $(SRCS)) \ + $(patsubst %.cpp, $(OBJDIR)/%.d, $(CXXSRCS)) \ + $(patsubst %.m, $(OBJDIR)/%.d, $(OBJCSRCS)) $(DEPENDENCY_FILES): ; .PRECIOUS: $(DEPENDENCY_FILES) diff --git a/client/android/CMakeLists.txt b/client/android/CMakeLists.txt new file mode 100644 index 000000000..cc827d143 --- /dev/null +++ b/client/android/CMakeLists.txt @@ -0,0 +1,210 @@ +# version +cmake_minimum_required(VERSION 3.4.1) + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3 -fvisibility=hidden -w") + +# Root path into client +set(PM3_ROOT ../../) + +add_subdirectory(../deps deps) + +# Build zlib deps at external +if (CMAKE_MAKE_PROGRAM MATCHES ".*ninja.*") + set(BZIP2_INCLUDE_DIRS ${BZIP2_ROOT}) + set(BZIP2_LIBRARIES pm3rrg_rdv4_bzip2) + find_library(pm3rrg_rdv4_bzip2 REQUIRED) +elseif (UNIX) # Cross compile at Unix Makefile System. + # bzip2 dep. + include(ExternalProject) + set(CFLAGS_EXTERNAL_LIB "CFLAGS=--target=${CMAKE_C_COMPILER_TARGET} -w") + set(BZIP2_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/deps/bzip2/src/bzip2) + ExternalProject_Add(bzip2 + GIT_REPOSITORY https://android.googlesource.com/platform/external/bzip2 + GIT_TAG platform-tools-30.0.2 + PREFIX deps/bzip2 + #SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/deps/bzip2 + CONFIGURE_COMMAND mkdir -p ${BZIP2_BUILD_DIR} && git archive --format tar HEAD | tar -C ${BZIP2_BUILD_DIR} -x + BUILD_IN_SOURCE ON + BUILD_COMMAND make -C ${BZIP2_BUILD_DIR} -j4 CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} LD=${CMAKE_C_COMPILER} AR=${CMAKE_AR} RANLIB=${CMAKE_RANLIB} ${CFLAGS_EXTERNAL_LIB} libbz2.a + INSTALL_COMMAND "" + LOG_DOWNLOAD ON + ) + ExternalProject_Add_StepTargets(bzip2 configure build install) + set(BZIP2_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/deps/bzip2/src/bzip2) + set(BZIP2_LIBRARIES ${CMAKE_CURRENT_BINARY_DIR}/deps/bzip2/src/bzip2/libbz2.a) +else () + message(ERROR "Please implement your BZIP2 import.") +endif () + +# client resources +add_library(pm3rrg_rdv4 SHARED + ${PM3_ROOT}/common/commonutil.c + ${PM3_ROOT}/common/util_posix.c + ${PM3_ROOT}/common/parity.c + ${PM3_ROOT}/common/bucketsort.c + ${PM3_ROOT}/common/crapto1/crapto1.c + ${PM3_ROOT}/common/crapto1/crypto1.c + ${PM3_ROOT}/common/crc.c + ${PM3_ROOT}/common/crc16.c + ${PM3_ROOT}/common/crc32.c + ${PM3_ROOT}/common/crc64.c + ${PM3_ROOT}/common/lfdemod.c + ${PM3_ROOT}/common/legic_prng.c + ${PM3_ROOT}/common/iso15693tools.c + ${PM3_ROOT}/common/cardhelper.c + ${PM3_ROOT}/common/generator.c + ${PM3_ROOT}/client/src/crypto/asn1dump.c + ${PM3_ROOT}/client/src/crypto/asn1utils.c + ${PM3_ROOT}/client/src/crypto/libpcrypto.c + ${PM3_ROOT}/client/src/emv/test/cda_test.c + ${PM3_ROOT}/client/src/emv/test/crypto_test.c + ${PM3_ROOT}/client/src/emv/test/cryptotest.c + ${PM3_ROOT}/client/src/emv/test/dda_test.c + ${PM3_ROOT}/client/src/emv/test/sda_test.c + ${PM3_ROOT}/client/src/emv/apduinfo.c + ${PM3_ROOT}/client/src/emv/cmdemv.c + ${PM3_ROOT}/client/src/emv/crypto.c + ${PM3_ROOT}/client/src/emv/crypto_polarssl.c + ${PM3_ROOT}/client/src/emv/dol.c + ${PM3_ROOT}/client/src/emv/dump.c + ${PM3_ROOT}/client/src/emv/emv_pk.c + ${PM3_ROOT}/client/src/emv/emv_pki.c + ${PM3_ROOT}/client/src/emv/emv_pki_priv.c + ${PM3_ROOT}/client/src/emv/emv_roca.c + ${PM3_ROOT}/client/src/emv/emv_tags.c + ${PM3_ROOT}/client/src/emv/emvcore.c + ${PM3_ROOT}/client/src/emv/emvjson.c + ${PM3_ROOT}/client/src/emv/tlv.c + ${PM3_ROOT}/client/src/fido/additional_ca.c + ${PM3_ROOT}/client/src/fido/cbortools.c + ${PM3_ROOT}/client/src/fido/cose.c + ${PM3_ROOT}/client/src/fido/fidocore.c + ${PM3_ROOT}/client/src/loclass/cipher.c + ${PM3_ROOT}/client/src/loclass/cipherutils.c + ${PM3_ROOT}/client/src/loclass/elite_crack.c + ${PM3_ROOT}/client/src/loclass/hash1_brute.c + ${PM3_ROOT}/client/src/loclass/ikeys.c + ${PM3_ROOT}/client/src/mifare/mad.c + ${PM3_ROOT}/client/src/mifare/mfkey.c + ${PM3_ROOT}/client/src/mifare/mifare4.c + ${PM3_ROOT}/client/src/mifare/mifaredefault.c + ${PM3_ROOT}/client/src/mifare/mifarehost.c + ${PM3_ROOT}/client/src/mifare/ndef.c + ${PM3_ROOT}/client/src/mifare/desfire_crypto.c + ${PM3_ROOT}/client/src/uart/uart_posix.c + ${PM3_ROOT}/client/src/uart/uart_win32.c + ${PM3_ROOT}/client/src/ui/overlays.ui + ${PM3_ROOT}/client/src/aidsearch.c + ${PM3_ROOT}/client/src/cmdanalyse.c + ${PM3_ROOT}/client/src/cmdcrc.c + ${PM3_ROOT}/client/src/cmddata.c + ${PM3_ROOT}/client/src/cmdflashmem.c + ${PM3_ROOT}/client/src/cmdflashmemspiffs.c + ${PM3_ROOT}/client/src/cmdhf.c + ${PM3_ROOT}/client/src/cmdhf14a.c + ${PM3_ROOT}/client/src/cmdhf14b.c + ${PM3_ROOT}/client/src/cmdhf15.c + ${PM3_ROOT}/client/src/cmdhfcryptorf.c + ${PM3_ROOT}/client/src/cmdhfepa.c + ${PM3_ROOT}/client/src/cmdhffelica.c + ${PM3_ROOT}/client/src/cmdhffido.c + ${PM3_ROOT}/client/src/cmdhficlass.c + ${PM3_ROOT}/client/src/cmdhflegic.c + ${PM3_ROOT}/client/src/cmdhflist.c + ${PM3_ROOT}/client/src/cmdhflto.c + ${PM3_ROOT}/client/src/cmdhfmf.c + ${PM3_ROOT}/client/src/cmdhfmfdes.c + ${PM3_ROOT}/client/src/cmdhfmfhard.c + ${PM3_ROOT}/client/src/cmdhfmfp.c + ${PM3_ROOT}/client/src/cmdhfmfu.c + ${PM3_ROOT}/client/src/cmdhfthinfilm.c + ${PM3_ROOT}/client/src/cmdhftopaz.c + ${PM3_ROOT}/client/src/cmdhw.c + ${PM3_ROOT}/client/src/cmdlf.c + ${PM3_ROOT}/client/src/cmdlfawid.c + ${PM3_ROOT}/client/src/cmdlfcotag.c + ${PM3_ROOT}/client/src/cmdlfem4x.c + ${PM3_ROOT}/client/src/cmdlfem4x50.c + ${PM3_ROOT}/client/src/cmdlffdx.c + ${PM3_ROOT}/client/src/cmdlfgallagher.c + ${PM3_ROOT}/client/src/cmdlfguard.c + ${PM3_ROOT}/client/src/cmdlfhid.c + ${PM3_ROOT}/client/src/cmdlfhitag.c + ${PM3_ROOT}/client/src/cmdlfindala.c + ${PM3_ROOT}/client/src/cmdlfio.c + ${PM3_ROOT}/client/src/cmdlfjablotron.c + ${PM3_ROOT}/client/src/cmdlfkeri.c + ${PM3_ROOT}/client/src/cmdlfmotorola.c + ${PM3_ROOT}/client/src/cmdlfnedap.c + ${PM3_ROOT}/client/src/cmdlfnexwatch.c + ${PM3_ROOT}/client/src/cmdlfnoralsy.c + ${PM3_ROOT}/client/src/cmdlfpac.c + ${PM3_ROOT}/client/src/cmdlfparadox.c + ${PM3_ROOT}/client/src/cmdlfpcf7931.c + ${PM3_ROOT}/client/src/cmdlfpresco.c + ${PM3_ROOT}/client/src/cmdlfpyramid.c + ${PM3_ROOT}/client/src/cmdlfsecurakey.c + ${PM3_ROOT}/client/src/cmdlft55xx.c + ${PM3_ROOT}/client/src/cmdlfti.c + ${PM3_ROOT}/client/src/cmdlfverichip.c + ${PM3_ROOT}/client/src/cmdlfviking.c + ${PM3_ROOT}/client/src/cmdlfvisa2000.c + ${PM3_ROOT}/client/src/cmdmain.c + ${PM3_ROOT}/client/src/cmdparser.c + ${PM3_ROOT}/client/src/cmdscript.c + ${PM3_ROOT}/client/src/cmdsmartcard.c + ${PM3_ROOT}/client/src/cmdtrace.c + ${PM3_ROOT}/client/src/cmdusart.c + ${PM3_ROOT}/client/src/cmdwiegand.c + ${PM3_ROOT}/client/src/comms.c + ${PM3_ROOT}/client/src/fileutils.c + ${PM3_ROOT}/client/src/flash.c + ${PM3_ROOT}/client/src/graph.c + ${PM3_ROOT}/client/src/jansson_path.c + ${PM3_ROOT}/client/src/preferences.c + ${PM3_ROOT}/client/src/pm3_binlib.c + ${PM3_ROOT}/client/src/pm3_bitlib.c + ${PM3_ROOT}/client/src/prng.c + ${PM3_ROOT}/client/src/scandir.c + ${PM3_ROOT}/client/src/scripting.c + ${PM3_ROOT}/client/src/tea.c + ${PM3_ROOT}/client/src/ui.c + ${PM3_ROOT}/client/src/util.c + ${PM3_ROOT}/client/src/wiegand_formats.c + ${PM3_ROOT}/client/src/wiegand_formatutils.c + # android resources + jni_tools.c + pm3_main.c + ) + +# includes +target_include_directories(pm3rrg_rdv4 PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} + ${BZIP2_INCLUDE_DIRS} + ${PM3_ROOT}/include/ + ${PM3_ROOT}/common + ${PM3_ROOT}/common_fpga + ${PM3_ROOT}/client/src) + +find_library(pm3rrg_rdv4_cliparser REQUIRED) +find_library(pm3rrg_rdv4_jansson REQUIRED) +find_library(pm3rrg_rdv4_tinycbor REQUIRED) +find_library(pm3rrg_rdv4_lua REQUIRED) +find_library(pm3rrg_rdv4_mbedtls REQUIRED) +find_library(pm3rrg_rdv4_reveng REQUIRED) +find_library(pm3rrg_rdv4_hardnested REQUIRED) +find_library(pm3rrg_rdv4_whereami REQUIRED) + +target_link_libraries(pm3rrg_rdv4 + ${BZIP2_LIBRARIES} + pm3rrg_rdv4_hardnested + pm3rrg_rdv4_mbedtls + pm3rrg_rdv4_cliparser + pm3rrg_rdv4_jansson + pm3rrg_rdv4_lua + pm3rrg_rdv4_tinycbor + pm3rrg_rdv4_amiibo + pm3rrg_rdv4_reveng + pm3rrg_rdv4_whereami + android + log) \ No newline at end of file diff --git a/client/android/jni_tools.c b/client/android/jni_tools.c new file mode 100644 index 000000000..5c7558853 --- /dev/null +++ b/client/android/jni_tools.c @@ -0,0 +1,81 @@ +// +// Created by DXL on 2017/9/1. +// + +//including header +#include +#include +#include "stdbool.h" + +// native thread attach label +static bool g_IsAttach; + +// get current env for jvm +JNIEnv *getJniEnv() { + JNIEnv *currentThreadEnv; + g_IsAttach = false; + if ((*g_JavaVM)->GetEnv(g_JavaVM, (void **) ¤tThreadEnv, JNI_VERSION_1_4) != JNI_OK) { + LOGE("Get Env Fail!"); + if ((*g_JavaVM)->AttachCurrentThread(g_JavaVM, ¤tThreadEnv, NULL) != JNI_OK) { + LOGE("Attach the current thread Fail!"); + g_IsAttach = false; + return NULL; + } else { + g_IsAttach = true; + LOGE("Attach the current thread Success!"); + return currentThreadEnv; + } + } else { + g_IsAttach = false; + //LOGE("Get Env Success!"); + return currentThreadEnv; + } +} + +// detach native thread from jvm +void detachThread() { + if (g_IsAttach) { + (*g_JavaVM)->DetachCurrentThread(g_JavaVM); + } +} + +// cmd arg parse +CMD *parse_command_line(const char *commandStr) { + CMD *cmd = (CMD *) malloc(sizeof(CMD)); + if (!cmd) { + return NULL; + } + // copy the source to the heap + char *pTmp = strdup(commandStr); + // new memory size is default 20 for char ** + int size = 20; + cmd->cmd = (char **) malloc(size * sizeof(char **)); + if (!cmd->cmd) { + free(cmd); + return NULL; + } + // parse + char *pStr = strtok(pTmp, " "); + cmd->cmd[0] = pStr; + int count = 1; + for (; pStr != NULL; ++count) { + // Capacity expansion + if (count == (size - 1)) { + size += 20; + cmd->cmd = (char **) realloc(cmd->cmd, size * sizeof(char **)); + } + pStr = strtok(NULL, " "); + if (pStr) { + cmd->cmd[count] = pStr; + } + } + cmd->len = (count - 1); + return cmd; +} + +// cmd arg struct free +void free_command_line(CMD *cmd) { + free(cmd->cmd[0]); + free(cmd->cmd); + free(cmd); +} diff --git a/client/android/jni_tools.h b/client/android/jni_tools.h new file mode 100644 index 000000000..8e900374f --- /dev/null +++ b/client/android/jni_tools.h @@ -0,0 +1,40 @@ +// +// Created by dell on 2017/9/1. +// + +#ifndef DXL_TOOLS_H +#define DXL_TOOLS_H + +#include +#include +#include + +//JNI LOG +#define TAG "PM3" +#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE,TAG,__VA_ARGS__) +#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__) +#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG,__VA_ARGS__) +#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,TAG,__VA_ARGS__) +#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG,__VA_ARGS__) + +// a global jvm instance +JavaVM *g_JavaVM; + +// get current env for jvm +JNIEnv *getJniEnv(); + +// detach native thread from jvm, must native thread can detach! +void detachThread(); + +typedef struct { + char **cmd; + int len; +} CMD; + +// cmd arg parse +CMD *parse_command_line(const char *commandStr); + +// cmd arg struct free +void free_command_line(CMD *); + +#endif //DXL_TOOLS_H diff --git a/client/android/pm3_main.c b/client/android/pm3_main.c new file mode 100644 index 000000000..0da684e01 --- /dev/null +++ b/client/android/pm3_main.c @@ -0,0 +1,167 @@ +//----------------------------------------------------------------------------- +// Copyright (C) 2009 Michael Gernoth +// Copyright (C) 2010 iZsh +// +// This code is licensed to you under the terms of the GNU GPL, version 2 or, +// at your option, any later version. See the LICENSE.txt file for the text of +// the license. +//----------------------------------------------------------------------------- +// Main binary +//----------------------------------------------------------------------------- + +#include "proxmark3.h" + +#include +#include // for Mingw readline +#include +#include +#include +#include "usart_defs.h" +#include "util_posix.h" +#include "proxgui.h" +#include "cmdmain.h" +#include "ui.h" +#include "cmdhw.h" +#include "whereami.h" +#include "comms.h" +#include "fileutils.h" +#include "jni_tools.h" + +//iceman, todo: proxify socker server name. Maybe set in preferences? +// DXL reply, todo: +// Is a good idea, we can move this def to preferences, but not now. +// Because libpm3rrg_rdv4.so cant load preferences. +// I will impl a function to load preferences at future. +#define PM3_LOCAL_SOCKET_SERVER "DXL.COM.ASL" + +static char *g_android_executable_directory = NULL; +static char *g_android_user_directory = NULL; + +char version_information[] = {"ANDROID_LIBRARY 1.4.6 build by DXL"}; + +const char *get_my_executable_directory(void) { + if (g_android_executable_directory == NULL) { + char buf[FILE_PATH_SIZE] = {0}; + getcwd(buf, sizeof(buf)); + strncat(buf, PATHSEP, 1); + g_android_executable_directory = strdup(buf); + } + return g_android_executable_directory; +} + +const char *get_my_user_directory(void) { + return g_android_user_directory; +} + +void ShowGraphWindow(void) {} + +void HideGraphWindow(void) {} + +void RepaintGraphWindow(void) {} + +int push_cmdscriptfile(char *path, bool stayafter) { return PM3_SUCCESS; } + +static bool OpenPm3(void) { + if (conn.run) { return true; } + // Open with LocalSocket. Not a tcp connection! + bool ret = OpenProxmark("socket:"PM3_LOCAL_SOCKET_SERVER, false, 1000, false, 115200); + return ret; +} + +/* + * Transfers to the command buffer and waits for a new command to be executed + * */ +jint Console(JNIEnv *env, jobject instance, jstring cmd_) { + + if (!conn.run) { + if (OpenPm3() && TestProxmark() == PM3_SUCCESS) { + LOGD("Connected to device"); + PrintAndLogEx(SUCCESS, "Connected to device"); + } else { + LOGD("Failed to connect to device"); + PrintAndLogEx(ERR, "Failed to connect to device"); + CloseProxmark(); + } + } + + PrintAndLogEx(NORMAL, ""); + + char *cmd = (char *)((*env)->GetStringUTFChars(env, cmd_, 0)); + int ret = CommandReceived(cmd); + if (ret == 99) { + // exit / quit + // TODO: implement this + PrintAndLogEx(NORMAL, "Asked to exit, can't really do that yet..."); + } + + (*env)->ReleaseStringUTFChars(env, cmd_, cmd); + return ret; +} + +/* + * Is client running! + * */ +jboolean IsClientRunning(JNIEnv *env, jobject instance) { + return (jboolean)((jboolean) conn.run); +} + +/* + * test hw and fw and client. + * */ +jboolean TestPm3(JNIEnv *env, jobject instance) { + if (open() == false) { + CloseProxmark(); + return false; + } + bool ret = (TestProxmark() == PM3_SUCCESS); + return (jboolean)(ret); +} + +/* + * stop pm3 client + * */ +void ClosePm3(JNIEnv *env, jobject instance) { + CloseProxmark(); +} + +/* + * native function map to jvm + * */ + +//iceman: todo, pm3:ify java class root. Return codes, should match PM3_E* codes. +JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { + JNIEnv *jniEnv = NULL; + if ((*vm)->GetEnv(vm, (void **) &jniEnv, JNI_VERSION_1_4) != JNI_OK) { + return -1; + } + (*jniEnv)->GetJavaVM(jniEnv, &g_JavaVM); + jclass clazz = (*jniEnv)->FindClass(jniEnv, "cn/rrg/natives/Proxmark3RRGRdv4Tools"); + if (clazz == NULL) { + return -1; + } + jclass clz_test = (*jniEnv)->FindClass(jniEnv, "cn/rrg/devices/Proxmark3RRGRdv4"); + JNINativeMethod methods[] = { + {"startExecute", "(Ljava/lang/String;)I", (void *) Console}, + {"stopExecute", "()V", (void *) ClosePm3}, + {"isExecuting", "()Z", (void *) IsClientRunning} + }; + + JNINativeMethod methods1[] = { + {"testPm3", "()Z", (void *) TestPm3}, + {"closePm3", "()V", ClosePm3} + }; + + if ((*jniEnv)->RegisterNatives(jniEnv, clazz, methods, sizeof(methods) / sizeof(methods[0])) != + JNI_OK) { + return -1; + } + + if ((*jniEnv)->RegisterNatives(jniEnv, clz_test, methods1, + sizeof(methods1) / sizeof(methods1[0])) != JNI_OK) { + return -1; + } + + (*jniEnv)->DeleteLocalRef(jniEnv, clazz); + (*jniEnv)->DeleteLocalRef(jniEnv, clz_test); + return JNI_VERSION_1_4; +} diff --git a/client/deps/CMakeLists.txt b/client/deps/CMakeLists.txt index 6b577d438..f7b96a7ea 100644 --- a/client/deps/CMakeLists.txt +++ b/client/deps/CMakeLists.txt @@ -1,9 +1,27 @@ -include(cliparser.cmake) -include(tinycbor.cmake) -include(jansson.cmake) -include(lua.cmake) -include(mbedtls.cmake) -include(amiibo.cmake) -include(reveng.cmake) -include(zlib.cmake) -include(hardnested.cmake) \ No newline at end of file +if (NOT TARGET pm3rrg_rdv4_amiibo) + include(amiibo.cmake) +endif() +if (NOT TARGET pm3rrg_rdv4_cliparser) + include(cliparser.cmake) +endif() +if (NOT TARGET pm3rrg_rdv4_hardnested) + include(hardnested.cmake) +endif() +if (NOT TARGET pm3rrg_rdv4_jansson) + include(jansson.cmake) +endif() +if (NOT TARGET pm3rrg_rdv4_lua) + include(lua.cmake) +endif() +if (NOT TARGET pm3rrg_rdv4_mbedtls) + include(mbedtls.cmake) +endif() +if (NOT TARGET pm3rrg_rdv4_reveng) + include(reveng.cmake) +endif() +if (NOT TARGET pm3rrg_rdv4_tinycbor) + include(tinycbor.cmake) +endif() +if (NOT TARGET pm3rrg_rdv4_whereami) + include(whereami.cmake) +endif() diff --git a/client/deps/amiibo.cmake b/client/deps/amiibo.cmake index 857074f9e..234547cd1 100644 --- a/client/deps/amiibo.cmake +++ b/client/deps/amiibo.cmake @@ -5,12 +5,20 @@ #amiitool.c $(MYSRCS) ../../../../common/../../commonutil.c ../ui.c -lreadline -lm ../../../../common/mbedtls/libmbedtls.a \ #-o amiitool -add_library(amiibo STATIC +add_library(pm3rrg_rdv4_amiibo STATIC amiitool/amiibo.c amiitool/drbg.c amiitool/keygen.c ) -target_include_directories(amiibo PRIVATE ../../include ../../common) -target_include_directories(amiibo INTERFACE amiitool) -target_compile_options(amiibo PRIVATE -Wall -Werror -O3) +if (NOT TARGET pm3rrg_rdv4_mbedtls) + include(mbedtls.cmake) +endif() +find_library(pm3rrg_rdv4_mbedtls REQUIRED) +target_link_libraries(pm3rrg_rdv4_amiibo PRIVATE + m + pm3rrg_rdv4_mbedtls) +target_include_directories(pm3rrg_rdv4_amiibo PRIVATE ../../include ../../common) +target_include_directories(pm3rrg_rdv4_amiibo INTERFACE amiitool) +target_compile_options(pm3rrg_rdv4_amiibo PRIVATE -Wall -Werror -O3) +set_property(TARGET pm3rrg_rdv4_amiibo PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/amiitool/Makefile b/client/deps/amiitool/Makefile index 7fe532878..dd064227e 100644 --- a/client/deps/amiitool/Makefile +++ b/client/deps/amiitool/Makefile @@ -1,5 +1,5 @@ MYSRCPATHS = -MYINCLUDES = -I. -I.. -I../jansson -I../../../common -I../../../include +MYINCLUDES = -I. -I.. -I../jansson -I../../../common -I../../../common/mbedtls -I../../../include MYCFLAGS = MYDEFS = MYSRCS = \ diff --git a/client/deps/amiitool/amiibo.c b/client/deps/amiitool/amiibo.c index 809f611d3..cbe3a0ba0 100644 --- a/client/deps/amiitool/amiibo.c +++ b/client/deps/amiitool/amiibo.c @@ -6,14 +6,14 @@ */ #include "amiibo.h" -#include "mbedtls/md.h" -#include "mbedtls/aes.h" +#include "md.h" +#include "aes.h" #include "commonutil.h" #define HMAC_POS_DATA 0x008 #define HMAC_POS_TAG 0x1B4 -void nfc3d_amiibo_calc_seed(const uint8_t *dump, uint8_t *key) { +static void nfc3d_amiibo_calc_seed(const uint8_t *dump, uint8_t *key) { memcpy(key + 0x00, dump + 0x029, 0x02); memset(key + 0x02, 0x00, 0x0E); memcpy(key + 0x10, dump + 0x1D4, 0x08); @@ -21,14 +21,14 @@ void nfc3d_amiibo_calc_seed(const uint8_t *dump, uint8_t *key) { memcpy(key + 0x20, dump + 0x1E8, 0x20); } -void nfc3d_amiibo_keygen(const nfc3d_keygen_masterkeys *masterKeys, const uint8_t *dump, nfc3d_keygen_derivedkeys *derivedKeys) { +static void nfc3d_amiibo_keygen(const nfc3d_keygen_masterkeys *masterKeys, const uint8_t *dump, nfc3d_keygen_derivedkeys *derivedKeys) { uint8_t seed[NFC3D_KEYGEN_SEED_SIZE]; nfc3d_amiibo_calc_seed(dump, seed); nfc3d_keygen(masterKeys, seed, derivedKeys); } -void nfc3d_amiibo_cipher(const nfc3d_keygen_derivedkeys *keys, const uint8_t *in, uint8_t *out) { +static void nfc3d_amiibo_cipher(const nfc3d_keygen_derivedkeys *keys, const uint8_t *in, uint8_t *out) { mbedtls_aes_context aes; size_t nc_off = 0; unsigned char nonce_counter[16]; @@ -47,7 +47,7 @@ void nfc3d_amiibo_cipher(const nfc3d_keygen_derivedkeys *keys, const uint8_t *in memcpy(out + 0x1D4, in + 0x1D4, 0x034); } -void nfc3d_amiibo_tag_to_internal(const uint8_t *tag, uint8_t *intl) { +static void nfc3d_amiibo_tag_to_internal(const uint8_t *tag, uint8_t *intl) { memcpy(intl + 0x000, tag + 0x008, 0x008); memcpy(intl + 0x008, tag + 0x080, 0x020); memcpy(intl + 0x028, tag + 0x010, 0x024); @@ -57,7 +57,7 @@ void nfc3d_amiibo_tag_to_internal(const uint8_t *tag, uint8_t *intl) { memcpy(intl + 0x1DC, tag + 0x054, 0x02C); } -void nfc3d_amiibo_internal_to_tag(const uint8_t *intl, uint8_t *tag) { +static void nfc3d_amiibo_internal_to_tag(const uint8_t *intl, uint8_t *tag) { memcpy(tag + 0x008, intl + 0x000, 0x008); memcpy(tag + 0x080, intl + 0x008, 0x020); memcpy(tag + 0x010, intl + 0x028, 0x024); diff --git a/client/deps/amiitool/amiitool.c b/client/deps/amiitool/amiitool.c index b63222d50..d7cd08351 100644 --- a/client/deps/amiitool/amiitool.c +++ b/client/deps/amiitool/amiitool.c @@ -15,7 +15,7 @@ static char *self; -void amiitool_usage() { +void amiitool_usage(void) { fprintf(stderr, /*"amiitool build %i (commit %s-%08x)\n"*/ "by Marcos Del Sol Vives \n" diff --git a/client/deps/amiitool/drbg.c b/client/deps/amiitool/drbg.c index c1297920f..1aaba0a7f 100644 --- a/client/deps/amiitool/drbg.c +++ b/client/deps/amiitool/drbg.c @@ -8,7 +8,7 @@ #include "drbg.h" #include #include -#include "mbedtls/md.h" +#include "md.h" void nfc3d_drbg_init(nfc3d_drbg_ctx *ctx, const uint8_t *hmacKey, size_t hmacKeySize, const uint8_t *seed, size_t seedSize) { assert(ctx != NULL); diff --git a/client/deps/amiitool/keygen.c b/client/deps/amiitool/keygen.c index f148c0dc8..6322a0fe9 100644 --- a/client/deps/amiitool/keygen.c +++ b/client/deps/amiitool/keygen.c @@ -10,7 +10,7 @@ #include #include -void nfc3d_keygen_prepare_seed(const nfc3d_keygen_masterkeys *baseKeys, const uint8_t *baseSeed, uint8_t *output, size_t *outputSize) { +static void nfc3d_keygen_prepare_seed(const nfc3d_keygen_masterkeys *baseKeys, const uint8_t *baseSeed, uint8_t *output, size_t *outputSize) { assert(baseKeys != NULL); assert(baseSeed != NULL); assert(output != NULL); diff --git a/client/deps/cliparser.cmake b/client/deps/cliparser.cmake index 890fd39c5..b16451c07 100644 --- a/client/deps/cliparser.cmake +++ b/client/deps/cliparser.cmake @@ -1,11 +1,12 @@ -add_library(cliparser STATIC +add_library(pm3rrg_rdv4_cliparser STATIC cliparser/argtable3.c cliparser/cliparser.c ) -target_include_directories(cliparser PRIVATE +target_include_directories(pm3rrg_rdv4_cliparser PRIVATE ../../common ../../include ../src) -target_include_directories(cliparser INTERFACE cliparser) -target_compile_options(cliparser PRIVATE -Wall -Werror -O3) +target_include_directories(pm3rrg_rdv4_cliparser INTERFACE cliparser) +target_compile_options(pm3rrg_rdv4_cliparser PRIVATE -Wall -Werror -O3) +set_property(TARGET pm3rrg_rdv4_cliparser PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/cliparser/Makefile b/client/deps/cliparser/Makefile index 7f4409de0..4873372c4 100644 --- a/client/deps/cliparser/Makefile +++ b/client/deps/cliparser/Makefile @@ -1,6 +1,6 @@ MYSRCPATHS = MYINCLUDES = -I../../../common -I../../../include -I../../src -MYCFLAGS = +MYCFLAGS = -Wno-cast-align MYDEFS = MYSRCS = \ argtable3.c \ diff --git a/client/deps/cliparser/argtable3.c b/client/deps/cliparser/argtable3.c index f66c22d6d..f0b6a4d37 100644 --- a/client/deps/cliparser/argtable3.c +++ b/client/deps/cliparser/argtable3.c @@ -3398,13 +3398,13 @@ void trex_free(TRex *exp) { } TRexBool trex_match(TRex *exp, const TRexChar *text) { - const TRexChar *res = NULL; exp->_bol = text; exp->_eol = text + scstrlen(text); exp->_currsubexp = 0; - res = trex_matchnode(exp, exp->_nodes, text, NULL); - if (res == NULL || res != exp->_eol) + const TRexChar *res = trex_matchnode(exp, exp->_nodes, text, NULL); + if (res == NULL || res != exp->_eol) { return TRex_False; + } return TRex_True; } @@ -4135,7 +4135,8 @@ int arg_parse(int argc, char * *argv, void * *argtable) { */ static void arg_cat(char **pdest, const char *src, size_t *pndest) { char *dest = *pdest; - char *end = dest + *pndest; + // PM3 fix: leave room for null terminate char + char *end = dest + *pndest - 1; /*locate null terminator of dest string */ while (dest < end && *dest != 0) diff --git a/client/deps/cliparser/cliparser.c b/client/deps/cliparser/cliparser.c index 1845aff29..3eaec2b55 100644 --- a/client/deps/cliparser/cliparser.c +++ b/client/deps/cliparser/cliparser.c @@ -10,50 +10,53 @@ #include "cliparser.h" #include +#include +#ifndef ARRAYLEN +# define ARRAYLEN(x) (sizeof(x)/sizeof((x)[0])) +#endif -void **argtable = NULL; -size_t argtableLen = 0; -const char *programName = NULL; -const char *programHint = NULL; -const char *programHelp = NULL; -char buf[500] = {0}; - -int CLIParserInit(const char *vprogramName, const char *vprogramHint, const char *vprogramHelp) { - argtable = NULL; - argtableLen = 0; - programName = vprogramName; - programHint = vprogramHint; - programHelp = vprogramHelp; - memset(buf, 0x00, 500); +int CLIParserInit(CLIParserContext **ctx, const char *vprogramName, const char *vprogramHint, const char *vprogramHelp) { + *ctx = malloc(sizeof(CLIParserContext)); + if (!*ctx) { + printf("ERROR: Insufficient memory\n"); + fflush(stdout); + return 2; + } + (*ctx)->argtable = NULL; + (*ctx)->argtableLen = 0; + (*ctx)->programName = vprogramName; + (*ctx)->programHint = vprogramHint; + (*ctx)->programHelp = vprogramHelp; + memset((*ctx)->buf, 0x00, sizeof((*ctx)->buf)); return 0; } -int CLIParserParseArg(int argc, char **argv, void *vargtable[], size_t vargtableLen, bool allowEmptyExec) { +int CLIParserParseArg(CLIParserContext *ctx, int argc, char **argv, void *vargtable[], size_t vargtableLen, bool allowEmptyExec) { int nerrors; - argtable = vargtable; - argtableLen = vargtableLen; + ctx->argtable = vargtable; + ctx->argtableLen = vargtableLen; /* verify the argtable[] entries were allocated sucessfully */ - if (arg_nullcheck(argtable) != 0) { + if (arg_nullcheck(ctx->argtable) != 0) { /* NULL entries were detected, some allocations must have failed */ printf("ERROR: Insufficient memory\n"); fflush(stdout); return 2; } /* Parse the command line as defined by argtable[] */ - nerrors = arg_parse(argc, argv, argtable); + nerrors = arg_parse(argc, argv, ctx->argtable); /* special case: '--help' takes precedence over error reporting */ - if ((argc < 2 && !allowEmptyExec) || ((struct arg_lit *)argtable[0])->count > 0) { // help must be the first record - printf("Usage: %s", programName); - arg_print_syntaxv(stdout, argtable, "\n"); - if (programHint) - printf("%s\n\n", programHint); - arg_print_glossary(stdout, argtable, " %-20s %s\n"); + if ((argc < 2 && !allowEmptyExec) || ((struct arg_lit *)(ctx->argtable)[0])->count > 0) { // help must be the first record + printf("Usage: %s", ctx->programName); + arg_print_syntaxv(stdout, ctx->argtable, "\n"); + if (ctx->programHint) + printf("%s\n\n", ctx->programHint); + arg_print_glossary(stdout, ctx->argtable, " %-20s %s\n"); printf("\n"); - if (programHelp) - printf("%s \n", programHelp); + if (ctx->programHelp) + printf("%s \n", ctx->programHelp); fflush(stdout); return 1; @@ -62,8 +65,8 @@ int CLIParserParseArg(int argc, char **argv, void *vargtable[], size_t vargtable /* If the parser returned any errors then display them and exit */ if (nerrors > 0) { /* Display the error details contained in the arg_end struct.*/ - arg_print_errors(stdout, ((struct arg_end *)argtable[vargtableLen - 1]), programName); - printf("Try '%s --help' for more information.\n", programName); + arg_print_errors(stdout, ((struct arg_end *)(ctx->argtable)[vargtableLen - 1]), ctx->programName); + printf("Try '%s --help' for more information.\n", ctx->programName); fflush(stdout); return 3; } @@ -79,23 +82,24 @@ enum ParserState { #define isSpace(c)(c == ' ' || c == '\t') -int CLIParserParseString(const char *str, void *vargtable[], size_t vargtableLen, bool allowEmptyExec) { - return CLIParserParseStringEx(str, vargtable, vargtableLen, allowEmptyExec, false); +int CLIParserParseString(CLIParserContext *ctx, const char *str, void *vargtable[], size_t vargtableLen, bool allowEmptyExec) { + return CLIParserParseStringEx(ctx, str, vargtable, vargtableLen, allowEmptyExec, false); } -int CLIParserParseStringEx(const char *str, void *vargtable[], size_t vargtableLen, bool allowEmptyExec, bool clueData) { +int CLIParserParseStringEx(CLIParserContext *ctx, const char *str, void *vargtable[], size_t vargtableLen, bool allowEmptyExec, bool clueData) { int argc = 0; char *argv[200] = {NULL}; int len = strlen(str); - char *bufptr = buf; + memset(ctx->buf, 0x00, ARRAYLEN(ctx->buf)); + char *bufptr = ctx->buf; char *spaceptr = NULL; enum ParserState state = PS_FIRST; argv[argc++] = bufptr; // param0 = program name - memcpy(buf, programName, strlen(programName) + 1); // with 0x00 - bufptr += strlen(programName) + 1; + memcpy(ctx->buf, ctx->programName, strlen(ctx->programName) + 1); // with 0x00 + bufptr += strlen(ctx->programName) + 1; if (len) argv[argc++] = bufptr; @@ -140,14 +144,7 @@ int CLIParserParseStringEx(const char *str, void *vargtable[], size_t vargtableL } } - return CLIParserParseArg(argc, argv, vargtable, vargtableLen, allowEmptyExec); -} - -void CLIParserFree() { - arg_freetable(argtable, argtableLen); - argtable = NULL; - - return; + return CLIParserParseArg(ctx, argc, argv, vargtable, vargtableLen, allowEmptyExec); } // convertors diff --git a/client/deps/cliparser/cliparser.h b/client/deps/cliparser/cliparser.h index 866ee07d6..86ed21977 100644 --- a/client/deps/cliparser/cliparser.h +++ b/client/deps/cliparser/cliparser.h @@ -11,32 +11,41 @@ #ifndef __CLIPARSER_H #define __CLIPARSER_H #include "argtable3.h" +#include #include "util.h" #define arg_param_begin arg_lit0("hH", "help", "This help") #define arg_param_end arg_end(20) #define arg_getsize(a) (sizeof(a) / sizeof(a[0])) -#define arg_get_lit(n) (((struct arg_lit*)argtable[n])->count) -#define arg_get_int_count(n)(((struct arg_int*)argtable[n])->count) -#define arg_get_int(n) (((struct arg_int*)argtable[n])->ival[0]) -#define arg_get_int_def(n, def)(arg_get_int_count(n) ? (arg_get_int(n)) : (def)) -#define arg_get_str(n) ((struct arg_str*)argtable[n]) -#define arg_get_str_len(n) (strlen(((struct arg_str*)argtable[n])->sval[0])) +#define arg_get_lit(ctx, n) (((struct arg_lit*)((ctx)->argtable)[n])->count) +#define arg_get_int_count(ctx, n)(((struct arg_int*)((ctx)->argtable)[n])->count) +#define arg_get_int(ctx, n) (((struct arg_int*)((ctx)->argtable)[n])->ival[0]) +#define arg_get_int_def(ctx, n, def)(arg_get_int_count((ctx), n) ? (arg_get_int((ctx), n)) : (def)) +#define arg_get_str(ctx, n) ((struct arg_str*)((ctx)->argtable)[n]) +#define arg_get_str_len(ctx, n) (strlen(((struct arg_str*)((ctx)->argtable)[n])->sval[0])) #define arg_strx1(shortopts, longopts, datatype, glossary) (arg_strn((shortopts), (longopts), (datatype), 1, 250, (glossary))) #define arg_strx0(shortopts, longopts, datatype, glossary) (arg_strn((shortopts), (longopts), (datatype), 0, 250, (glossary))) -#define CLIExecWithReturn(cmd, atbl, ifempty) if (CLIParserParseString(cmd, atbl, arg_getsize(atbl), ifempty)){CLIParserFree();return PM3_ESOFT;} -#define CLIGetHexBLessWithReturn(paramnum, data, datalen, delta) if (CLIParamHexToBuf(arg_get_str(paramnum), data, sizeof(data) - (delta), datalen)) {CLIParserFree();return PM3_ESOFT;} -#define CLIGetHexWithReturn(paramnum, data, datalen) if (CLIParamHexToBuf(arg_get_str(paramnum), data, sizeof(data), datalen)) {CLIParserFree();return PM3_ESOFT;} -#define CLIGetStrWithReturn(paramnum, data, datalen) if (CLIParamStrToBuf(arg_get_str(paramnum), data, sizeof(data), datalen)) {CLIParserFree();return PM3_ESOFT;} +#define CLIParserFree(ctx) if ((ctx)) {arg_freetable(ctx->argtable, ctx->argtableLen); free((ctx)); (ctx)=NULL;} +#define CLIExecWithReturn(ctx, cmd, atbl, ifempty) if (CLIParserParseString(ctx, cmd, atbl, arg_getsize(atbl), ifempty)) {CLIParserFree((ctx)); return PM3_ESOFT;} +#define CLIGetHexBLessWithReturn(ctx, paramnum, data, datalen, delta) if (CLIParamHexToBuf(arg_get_str(ctx, paramnum), data, sizeof(data) - (delta), datalen)) {CLIParserFree((ctx)); return PM3_ESOFT;} +#define CLIGetHexWithReturn(ctx, paramnum, data, datalen) if (CLIParamHexToBuf(arg_get_str(ctx, paramnum), data, sizeof(data), datalen)) {CLIParserFree((ctx)); return PM3_ESOFT;} +#define CLIGetStrWithReturn(ctx, paramnum, data, datalen) if (CLIParamStrToBuf(arg_get_str(ctx, paramnum), data, sizeof(data), datalen)) {CLIParserFree((ctx)); return PM3_ESOFT;} -int CLIParserInit(const char *vprogramName, const char *vprogramHint, const char *vprogramHelp); -int CLIParserParseString(const char *str, void *vargtable[], size_t vargtableLen, bool allowEmptyExec); -int CLIParserParseStringEx(const char *str, void *vargtable[], size_t vargtableLen, bool allowEmptyExec, bool clueData); -int CLIParserParseArg(int argc, char **argv, void *vargtable[], size_t vargtableLen, bool allowEmptyExec); -void CLIParserFree(void); +typedef struct { + void **argtable; + size_t argtableLen; + const char *programName; + const char *programHint; + const char *programHelp; + char buf[1024 + 60]; +} CLIParserContext; +int CLIParserInit(CLIParserContext **ctx, const char *vprogramName, const char *vprogramHint, const char *vprogramHelp); +int CLIParserParseString(CLIParserContext *ctx, const char *str, void *vargtable[], size_t vargtableLen, bool allowEmptyExec); +int CLIParserParseStringEx(CLIParserContext *ctx, const char *str, void *vargtable[], size_t vargtableLen, bool allowEmptyExec, bool clueData); +int CLIParserParseArg(CLIParserContext *ctx, int argc, char **argv, void *vargtable[], size_t vargtableLen, bool allowEmptyExec); int CLIParamHexToBuf(struct arg_str *argstr, uint8_t *data, int maxdatalen, int *datalen); int CLIParamStrToBuf(struct arg_str *argstr, uint8_t *data, int maxdatalen, int *datalen); diff --git a/client/deps/hardnested.cmake b/client/deps/hardnested.cmake index 8945d68a8..6ec4f0297 100644 --- a/client/deps/hardnested.cmake +++ b/client/deps/hardnested.cmake @@ -1,10 +1,11 @@ -add_library(hardnested_nosimd OBJECT +add_library(pm3rrg_rdv4_hardnested_nosimd OBJECT hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) -target_compile_options(hardnested_nosimd PRIVATE -Wall -Werror -O3) +target_compile_options(pm3rrg_rdv4_hardnested_nosimd PRIVATE -Wall -Werror -O3) +set_property(TARGET pm3rrg_rdv4_hardnested_nosimd PROPERTY POSITION_INDEPENDENT_CODE ON) -target_include_directories(hardnested_nosimd PRIVATE +target_include_directories(pm3rrg_rdv4_hardnested_nosimd PRIVATE ../../common ../../include) @@ -18,92 +19,99 @@ message(STATUS "CMAKE_SYSTEM_PROCESSOR := ${CMAKE_SYSTEM_PROCESSOR}") if ("${CMAKE_SYSTEM_PROCESSOR}" IN_LIST X86_CPUS) message(STATUS "Building optimised x86/x86_64 binaries") - target_compile_options(hardnested_nosimd BEFORE PRIVATE + target_compile_options(pm3rrg_rdv4_hardnested_nosimd BEFORE PRIVATE -mno-mmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f) ## x86 / MMX - add_library(hardnested_mmx OBJECT + add_library(pm3rrg_rdv4_hardnested_mmx OBJECT hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(hardnested_mmx PRIVATE -Wall -Werror -O3) - target_compile_options(hardnested_mmx BEFORE PRIVATE + target_compile_options(pm3rrg_rdv4_hardnested_mmx PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_mmx BEFORE PRIVATE -mmmx -mno-sse2 -mno-avx -mno-avx2 -mno-avx512f) + set_property(TARGET pm3rrg_rdv4_hardnested_mmx PROPERTY POSITION_INDEPENDENT_CODE ON) - target_include_directories(hardnested_mmx PRIVATE + target_include_directories(pm3rrg_rdv4_hardnested_mmx PRIVATE ../../common ../../include) ## x86 / SSE2 - add_library(hardnested_sse2 OBJECT + add_library(pm3rrg_rdv4_hardnested_sse2 OBJECT hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(hardnested_sse2 PRIVATE -Wall -Werror -O3) - target_compile_options(hardnested_sse2 BEFORE PRIVATE + target_compile_options(pm3rrg_rdv4_hardnested_sse2 PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_sse2 BEFORE PRIVATE -mmmx -msse2 -mno-avx -mno-avx2 -mno-avx512f) + set_property(TARGET pm3rrg_rdv4_hardnested_sse2 PROPERTY POSITION_INDEPENDENT_CODE ON) - target_include_directories(hardnested_sse2 PRIVATE + target_include_directories(pm3rrg_rdv4_hardnested_sse2 PRIVATE ../../common ../../include) ## x86 / AVX - add_library(hardnested_avx OBJECT + add_library(pm3rrg_rdv4_hardnested_avx OBJECT hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(hardnested_avx PRIVATE -Wall -Werror -O3) - target_compile_options(hardnested_avx BEFORE PRIVATE + target_compile_options(pm3rrg_rdv4_hardnested_avx PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx BEFORE PRIVATE -mmmx -msse2 -mavx -mno-avx2 -mno-avx512f) + set_property(TARGET pm3rrg_rdv4_hardnested_avx PROPERTY POSITION_INDEPENDENT_CODE ON) - target_include_directories(hardnested_avx PRIVATE + target_include_directories(pm3rrg_rdv4_hardnested_avx PRIVATE ../../common ../../include) ## x86 / AVX2 - add_library(hardnested_avx2 OBJECT + add_library(pm3rrg_rdv4_hardnested_avx2 OBJECT hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(hardnested_avx2 PRIVATE -Wall -Werror -O3) - target_compile_options(hardnested_avx2 BEFORE PRIVATE + target_compile_options(pm3rrg_rdv4_hardnested_avx2 PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx2 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mno-avx512f) + set_property(TARGET pm3rrg_rdv4_hardnested_avx2 PROPERTY POSITION_INDEPENDENT_CODE ON) - target_include_directories(hardnested_avx2 PRIVATE + target_include_directories(pm3rrg_rdv4_hardnested_avx2 PRIVATE ../../common ../../include) ## x86 / AVX512 - add_library(hardnested_avx512 OBJECT + add_library(pm3rrg_rdv4_hardnested_avx512 OBJECT hardnested/hardnested_bf_core.c hardnested/hardnested_bitarray_core.c) - target_compile_options(hardnested_avx512 PRIVATE -Wall -Werror -O3) - target_compile_options(hardnested_avx512 BEFORE PRIVATE + target_compile_options(pm3rrg_rdv4_hardnested_avx512 PRIVATE -Wall -Werror -O3) + target_compile_options(pm3rrg_rdv4_hardnested_avx512 BEFORE PRIVATE -mmmx -msse2 -mavx -mavx2 -mavx512f) + set_property(TARGET pm3rrg_rdv4_hardnested_avx512 PROPERTY POSITION_INDEPENDENT_CODE ON) - target_include_directories(hardnested_avx512 PRIVATE + target_include_directories(pm3rrg_rdv4_hardnested_avx512 PRIVATE ../../common ../../include) set(SIMD_TARGETS - $ - $ - $ - $ - $) + $ + $ + $ + $ + $) else () message(STATUS "Not building optimised targets") set(SIMD_TARGETS) endif () -add_library(hardnested STATIC +add_library(pm3rrg_rdv4_hardnested STATIC hardnested/hardnested_bruteforce.c - $ + $ ${SIMD_TARGETS}) -target_include_directories(hardnested PRIVATE +target_compile_options(pm3rrg_rdv4_hardnested PRIVATE -Wall -Werror -O3) +set_property(TARGET pm3rrg_rdv4_hardnested PROPERTY POSITION_INDEPENDENT_CODE ON) +target_include_directories(pm3rrg_rdv4_hardnested PRIVATE ../../common ../../include ../src jansson) -target_include_directories(hardnested INTERFACE hardnested) +target_include_directories(pm3rrg_rdv4_hardnested INTERFACE hardnested) diff --git a/client/deps/hardnested/hardnested_bf_core.c b/client/deps/hardnested/hardnested_bf_core.c index 4e30dd894..5f4fcf991 100644 --- a/client/deps/hardnested/hardnested_bf_core.c +++ b/client/deps/hardnested/hardnested_bf_core.c @@ -468,7 +468,7 @@ uint64_t CRACK_STATES_BITSLICED(uint32_t cuid, uint8_t *best_first_bytes, statel } // remember feedback and keystream vectors for later use uint8_t bit = KEYSTREAM_SIZE - ks_idx; - if (bit <= next_common_bits) { // if needed and not yet stored + if (bit <= MIN(next_common_bits, 7)) { // if needed and not yet stored fbb[bit] = fb_bits; ksb[bit] = ks_bits; par[bit] = parity_bit_vector; @@ -556,29 +556,31 @@ void SetSIMDInstr(SIMDExecInstr instr) { bitslice_test_nonces_function_p = &bitslice_test_nonces_dispatch; } -static SIMDExecInstr GetSIMDInstr() { - SIMDExecInstr instr = SIMD_NONE; +static SIMDExecInstr GetSIMDInstr(void) { + SIMDExecInstr instr; -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) - if (__builtin_cpu_supports("avx512f")) instr = SIMD_AVX512; - else if (__builtin_cpu_supports("avx2")) instr = SIMD_AVX2; -#else - if (__builtin_cpu_supports("avx2")) instr = SIMD_AVX2; -#endif - else if (__builtin_cpu_supports("avx")) instr = SIMD_AVX; - else if (__builtin_cpu_supports("sse2")) instr = SIMD_SSE2; - else if (__builtin_cpu_supports("mmx")) instr = SIMD_MMX; +#if defined(COMPILER_HAS_SIMD_AVX512) + if (__builtin_cpu_supports("avx512f")) + instr = SIMD_AVX512; else #endif +#if defined(COMPILER_HAS_SIMD) + if (__builtin_cpu_supports("avx2")) + instr = SIMD_AVX2; + else if (__builtin_cpu_supports("avx")) + instr = SIMD_AVX; + else if (__builtin_cpu_supports("sse2")) + instr = SIMD_SSE2; + else if (__builtin_cpu_supports("mmx")) + instr = SIMD_MMX; + else #endif - instr = SIMD_NONE; + instr = SIMD_NONE; return instr; } -SIMDExecInstr GetSIMDInstrAuto() { +SIMDExecInstr GetSIMDInstrAuto(void) { SIMDExecInstr instr = intSIMDInstr; if (instr == SIMD_AUTO) return GetSIMDInstr(); @@ -589,13 +591,12 @@ SIMDExecInstr GetSIMDInstrAuto() { // determine the available instruction set at runtime and call the correct function uint64_t crack_states_bitsliced_dispatch(uint32_t cuid, uint8_t *best_first_bytes, statelist_t *p, uint32_t *keys_found, uint64_t *num_keys_tested, uint32_t nonces_to_bruteforce, uint8_t *bf_test_nonce_2nd_byte, noncelist_t *nonces) { switch (GetSIMDInstrAuto()) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) case SIMD_AVX512: crack_states_bitsliced_function_p = &crack_states_bitsliced_AVX512; break; #endif +#if defined(COMPILER_HAS_SIMD) case SIMD_AVX2: crack_states_bitsliced_function_p = &crack_states_bitsliced_AVX2; break; @@ -609,8 +610,8 @@ uint64_t crack_states_bitsliced_dispatch(uint32_t cuid, uint8_t *best_first_byte crack_states_bitsliced_function_p = &crack_states_bitsliced_MMX; break; #endif -#endif - default: + case SIMD_AUTO: + case SIMD_NONE: crack_states_bitsliced_function_p = &crack_states_bitsliced_NOSIMD; break; } @@ -621,13 +622,12 @@ uint64_t crack_states_bitsliced_dispatch(uint32_t cuid, uint8_t *best_first_byte void bitslice_test_nonces_dispatch(uint32_t nonces_to_bruteforce, uint32_t *bf_test_nonce, uint8_t *bf_test_nonce_par) { switch (GetSIMDInstrAuto()) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) case SIMD_AVX512: bitslice_test_nonces_function_p = &bitslice_test_nonces_AVX512; break; #endif +#if defined(COMPILER_HAS_SIMD) case SIMD_AVX2: bitslice_test_nonces_function_p = &bitslice_test_nonces_AVX2; break; @@ -641,8 +641,8 @@ void bitslice_test_nonces_dispatch(uint32_t nonces_to_bruteforce, uint32_t *bf_t bitslice_test_nonces_function_p = &bitslice_test_nonces_MMX; break; #endif -#endif - default: + case SIMD_AUTO: + case SIMD_NONE: bitslice_test_nonces_function_p = &bitslice_test_nonces_NOSIMD; break; } diff --git a/client/deps/hardnested/hardnested_bf_core.h b/client/deps/hardnested/hardnested_bf_core.h index 00b20b786..51eca7de5 100644 --- a/client/deps/hardnested/hardnested_bf_core.h +++ b/client/deps/hardnested/hardnested_bf_core.h @@ -52,13 +52,26 @@ THE SOFTWARE. #include "hardnested_bruteforce.h" // statelist_t +#if ( defined (__i386__) || defined (__x86_64__) ) && \ + ( !defined(__APPLE__) || \ + (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) ) +# define COMPILER_HAS_SIMD +# if defined(COMPILER_HAS_SIMD) && ((__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2)) +# define COMPILER_HAS_SIMD_AVX512 +# endif +#endif + typedef enum { SIMD_AUTO, +#if defined(COMPILER_HAS_SIMD_AVX512) SIMD_AVX512, +#endif +#if defined(COMPILER_HAS_SIMD) SIMD_AVX2, SIMD_AVX, SIMD_SSE2, SIMD_MMX, +#endif SIMD_NONE, } SIMDExecInstr; void SetSIMDInstr(SIMDExecInstr instr); diff --git a/client/deps/hardnested/hardnested_bitarray_core.c b/client/deps/hardnested/hardnested_bitarray_core.c index e9e84aa40..d62da774c 100644 --- a/client/deps/hardnested/hardnested_bitarray_core.c +++ b/client/deps/hardnested/hardnested_bitarray_core.c @@ -17,6 +17,7 @@ // #include "hardnested_bitarray_core.h" +#include "hardnested_bf_core.h" #include #include @@ -305,273 +306,234 @@ count_bitarray_AND4_t *count_bitarray_AND4_function_p = &count_bitarray_AND4_dis // determine the available instruction set at runtime and call the correct function uint32_t *malloc_bitarray_dispatch(uint32_t x) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) if (__builtin_cpu_supports("avx512f")) malloc_bitarray_function_p = &malloc_bitarray_AVX512; - else if (__builtin_cpu_supports("avx2")) malloc_bitarray_function_p = &malloc_bitarray_AVX2; -#else - if (__builtin_cpu_supports("avx2")) malloc_bitarray_function_p = &malloc_bitarray_AVX2; -#endif - else if (__builtin_cpu_supports("avx")) malloc_bitarray_function_p = &malloc_bitarray_AVX; - else if (__builtin_cpu_supports("sse2")) malloc_bitarray_function_p = &malloc_bitarray_SSE2; - else if (__builtin_cpu_supports("mmx")) malloc_bitarray_function_p = &malloc_bitarray_MMX; else #endif +#if defined(COMPILER_HAS_SIMD) + if (__builtin_cpu_supports("avx2")) malloc_bitarray_function_p = &malloc_bitarray_AVX2; + else if (__builtin_cpu_supports("avx")) malloc_bitarray_function_p = &malloc_bitarray_AVX; + else if (__builtin_cpu_supports("sse2")) malloc_bitarray_function_p = &malloc_bitarray_SSE2; + else if (__builtin_cpu_supports("mmx")) malloc_bitarray_function_p = &malloc_bitarray_MMX; + else #endif - malloc_bitarray_function_p = &malloc_bitarray_NOSIMD; + malloc_bitarray_function_p = &malloc_bitarray_NOSIMD; // call the most optimized function for this CPU return (*malloc_bitarray_function_p)(x); } void free_bitarray_dispatch(uint32_t *x) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) if (__builtin_cpu_supports("avx512f")) free_bitarray_function_p = &free_bitarray_AVX512; - else if (__builtin_cpu_supports("avx2")) free_bitarray_function_p = &free_bitarray_AVX2; -#else - if (__builtin_cpu_supports("avx2")) free_bitarray_function_p = &free_bitarray_AVX2; -#endif - else if (__builtin_cpu_supports("avx")) free_bitarray_function_p = &free_bitarray_AVX; - else if (__builtin_cpu_supports("sse2")) free_bitarray_function_p = &free_bitarray_SSE2; - else if (__builtin_cpu_supports("mmx")) free_bitarray_function_p = &free_bitarray_MMX; else #endif +#if defined(COMPILER_HAS_SIMD) + if (__builtin_cpu_supports("avx2")) free_bitarray_function_p = &free_bitarray_AVX2; + else if (__builtin_cpu_supports("avx")) free_bitarray_function_p = &free_bitarray_AVX; + else if (__builtin_cpu_supports("sse2")) free_bitarray_function_p = &free_bitarray_SSE2; + else if (__builtin_cpu_supports("mmx")) free_bitarray_function_p = &free_bitarray_MMX; + else #endif - free_bitarray_function_p = &free_bitarray_NOSIMD; + free_bitarray_function_p = &free_bitarray_NOSIMD; // call the most optimized function for this CPU (*free_bitarray_function_p)(x); } uint32_t bitcount_dispatch(uint32_t a) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) if (__builtin_cpu_supports("avx512f")) bitcount_function_p = &bitcount_AVX512; - else if (__builtin_cpu_supports("avx2")) bitcount_function_p = &bitcount_AVX2; -#else - if (__builtin_cpu_supports("avx2")) bitcount_function_p = &bitcount_AVX2; -#endif - else if (__builtin_cpu_supports("avx")) bitcount_function_p = &bitcount_AVX; - else if (__builtin_cpu_supports("sse2")) bitcount_function_p = &bitcount_SSE2; - else if (__builtin_cpu_supports("mmx")) bitcount_function_p = &bitcount_MMX; else #endif +#if defined(COMPILER_HAS_SIMD) + if (__builtin_cpu_supports("avx2")) bitcount_function_p = &bitcount_AVX2; + else if (__builtin_cpu_supports("avx")) bitcount_function_p = &bitcount_AVX; + else if (__builtin_cpu_supports("sse2")) bitcount_function_p = &bitcount_SSE2; + else if (__builtin_cpu_supports("mmx")) bitcount_function_p = &bitcount_MMX; + else #endif - bitcount_function_p = &bitcount_NOSIMD; + bitcount_function_p = &bitcount_NOSIMD; // call the most optimized function for this CPU return (*bitcount_function_p)(a); } uint32_t count_states_dispatch(uint32_t *bitarray) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) if (__builtin_cpu_supports("avx512f")) count_states_function_p = &count_states_AVX512; - else if (__builtin_cpu_supports("avx2")) count_states_function_p = &count_states_AVX2; -#else - if (__builtin_cpu_supports("avx2")) count_states_function_p = &count_states_AVX2; -#endif - else if (__builtin_cpu_supports("avx")) count_states_function_p = &count_states_AVX; - else if (__builtin_cpu_supports("sse2")) count_states_function_p = &count_states_SSE2; - else if (__builtin_cpu_supports("mmx")) count_states_function_p = &count_states_MMX; else #endif +#if defined(COMPILER_HAS_SIMD) + if (__builtin_cpu_supports("avx2")) count_states_function_p = &count_states_AVX2; + else if (__builtin_cpu_supports("avx")) count_states_function_p = &count_states_AVX; + else if (__builtin_cpu_supports("sse2")) count_states_function_p = &count_states_SSE2; + else if (__builtin_cpu_supports("mmx")) count_states_function_p = &count_states_MMX; + else #endif - count_states_function_p = &count_states_NOSIMD; + count_states_function_p = &count_states_NOSIMD; // call the most optimized function for this CPU return (*count_states_function_p)(bitarray); } void bitarray_AND_dispatch(uint32_t *A, uint32_t *B) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) if (__builtin_cpu_supports("avx512f")) bitarray_AND_function_p = &bitarray_AND_AVX512; - else if (__builtin_cpu_supports("avx2")) bitarray_AND_function_p = &bitarray_AND_AVX2; -#else - if (__builtin_cpu_supports("avx2")) bitarray_AND_function_p = &bitarray_AND_AVX2; -#endif - else if (__builtin_cpu_supports("avx")) bitarray_AND_function_p = &bitarray_AND_AVX; - else if (__builtin_cpu_supports("sse2")) bitarray_AND_function_p = &bitarray_AND_SSE2; - else if (__builtin_cpu_supports("mmx")) bitarray_AND_function_p = &bitarray_AND_MMX; else #endif +#if defined(COMPILER_HAS_SIMD) + if (__builtin_cpu_supports("avx2")) bitarray_AND_function_p = &bitarray_AND_AVX2; + else if (__builtin_cpu_supports("avx")) bitarray_AND_function_p = &bitarray_AND_AVX; + else if (__builtin_cpu_supports("sse2")) bitarray_AND_function_p = &bitarray_AND_SSE2; + else if (__builtin_cpu_supports("mmx")) bitarray_AND_function_p = &bitarray_AND_MMX; + else #endif - bitarray_AND_function_p = &bitarray_AND_NOSIMD; + bitarray_AND_function_p = &bitarray_AND_NOSIMD; // call the most optimized function for this CPU (*bitarray_AND_function_p)(A, B); } void bitarray_low20_AND_dispatch(uint32_t *A, uint32_t *B) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) if (__builtin_cpu_supports("avx512f")) bitarray_low20_AND_function_p = &bitarray_low20_AND_AVX512; - else if (__builtin_cpu_supports("avx2")) bitarray_low20_AND_function_p = &bitarray_low20_AND_AVX2; -#else - if (__builtin_cpu_supports("avx2")) bitarray_low20_AND_function_p = &bitarray_low20_AND_AVX2; -#endif - else if (__builtin_cpu_supports("avx")) bitarray_low20_AND_function_p = &bitarray_low20_AND_AVX; - else if (__builtin_cpu_supports("sse2")) bitarray_low20_AND_function_p = &bitarray_low20_AND_SSE2; - else if (__builtin_cpu_supports("mmx")) bitarray_low20_AND_function_p = &bitarray_low20_AND_MMX; else #endif +#if defined(COMPILER_HAS_SIMD) + if (__builtin_cpu_supports("avx2")) bitarray_low20_AND_function_p = &bitarray_low20_AND_AVX2; + else if (__builtin_cpu_supports("avx")) bitarray_low20_AND_function_p = &bitarray_low20_AND_AVX; + else if (__builtin_cpu_supports("sse2")) bitarray_low20_AND_function_p = &bitarray_low20_AND_SSE2; + else if (__builtin_cpu_supports("mmx")) bitarray_low20_AND_function_p = &bitarray_low20_AND_MMX; + else #endif - bitarray_low20_AND_function_p = &bitarray_low20_AND_NOSIMD; + bitarray_low20_AND_function_p = &bitarray_low20_AND_NOSIMD; // call the most optimized function for this CPU (*bitarray_low20_AND_function_p)(A, B); } uint32_t count_bitarray_AND_dispatch(uint32_t *A, uint32_t *B) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) if (__builtin_cpu_supports("avx512f")) count_bitarray_AND_function_p = &count_bitarray_AND_AVX512; - else if (__builtin_cpu_supports("avx2")) count_bitarray_AND_function_p = &count_bitarray_AND_AVX2; -#else - if (__builtin_cpu_supports("avx2")) count_bitarray_AND_function_p = &count_bitarray_AND_AVX2; -#endif - else if (__builtin_cpu_supports("avx")) count_bitarray_AND_function_p = &count_bitarray_AND_AVX; - else if (__builtin_cpu_supports("sse2")) count_bitarray_AND_function_p = &count_bitarray_AND_SSE2; - else if (__builtin_cpu_supports("mmx")) count_bitarray_AND_function_p = &count_bitarray_AND_MMX; else #endif +#if defined(COMPILER_HAS_SIMD) + if (__builtin_cpu_supports("avx2")) count_bitarray_AND_function_p = &count_bitarray_AND_AVX2; + else if (__builtin_cpu_supports("avx")) count_bitarray_AND_function_p = &count_bitarray_AND_AVX; + else if (__builtin_cpu_supports("sse2")) count_bitarray_AND_function_p = &count_bitarray_AND_SSE2; + else if (__builtin_cpu_supports("mmx")) count_bitarray_AND_function_p = &count_bitarray_AND_MMX; + else #endif - count_bitarray_AND_function_p = &count_bitarray_AND_NOSIMD; + count_bitarray_AND_function_p = &count_bitarray_AND_NOSIMD; // call the most optimized function for this CPU return (*count_bitarray_AND_function_p)(A, B); } uint32_t count_bitarray_low20_AND_dispatch(uint32_t *A, uint32_t *B) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) if (__builtin_cpu_supports("avx512f")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_AVX512; - else if (__builtin_cpu_supports("avx2")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_AVX2; -#else - if (__builtin_cpu_supports("avx2")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_AVX2; -#endif - else if (__builtin_cpu_supports("avx")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_AVX; - else if (__builtin_cpu_supports("sse2")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_SSE2; - else if (__builtin_cpu_supports("mmx")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_MMX; else #endif +#if defined(COMPILER_HAS_SIMD) + if (__builtin_cpu_supports("avx2")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_AVX2; + else if (__builtin_cpu_supports("avx")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_AVX; + else if (__builtin_cpu_supports("sse2")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_SSE2; + else if (__builtin_cpu_supports("mmx")) count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_MMX; + else #endif - count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_NOSIMD; + count_bitarray_low20_AND_function_p = &count_bitarray_low20_AND_NOSIMD; // call the most optimized function for this CPU return (*count_bitarray_low20_AND_function_p)(A, B); } void bitarray_AND4_dispatch(uint32_t *A, uint32_t *B, uint32_t *C, uint32_t *D) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) if (__builtin_cpu_supports("avx512f")) bitarray_AND4_function_p = &bitarray_AND4_AVX512; - else if (__builtin_cpu_supports("avx2")) bitarray_AND4_function_p = &bitarray_AND4_AVX2; -#else - if (__builtin_cpu_supports("avx2")) bitarray_AND4_function_p = &bitarray_AND4_AVX2; -#endif - else if (__builtin_cpu_supports("avx")) bitarray_AND4_function_p = &bitarray_AND4_AVX; - else if (__builtin_cpu_supports("sse2")) bitarray_AND4_function_p = &bitarray_AND4_SSE2; - else if (__builtin_cpu_supports("mmx")) bitarray_AND4_function_p = &bitarray_AND4_MMX; else #endif +#if defined(COMPILER_HAS_SIMD) + if (__builtin_cpu_supports("avx2")) bitarray_AND4_function_p = &bitarray_AND4_AVX2; + else if (__builtin_cpu_supports("avx")) bitarray_AND4_function_p = &bitarray_AND4_AVX; + else if (__builtin_cpu_supports("sse2")) bitarray_AND4_function_p = &bitarray_AND4_SSE2; + else if (__builtin_cpu_supports("mmx")) bitarray_AND4_function_p = &bitarray_AND4_MMX; + else #endif - bitarray_AND4_function_p = &bitarray_AND4_NOSIMD; + bitarray_AND4_function_p = &bitarray_AND4_NOSIMD; // call the most optimized function for this CPU (*bitarray_AND4_function_p)(A, B, C, D); } void bitarray_OR_dispatch(uint32_t *A, uint32_t *B) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) if (__builtin_cpu_supports("avx512f")) bitarray_OR_function_p = &bitarray_OR_AVX512; - else if (__builtin_cpu_supports("avx2")) bitarray_OR_function_p = &bitarray_OR_AVX2; -#else - if (__builtin_cpu_supports("avx2")) bitarray_OR_function_p = &bitarray_OR_AVX2; -#endif - else if (__builtin_cpu_supports("avx")) bitarray_OR_function_p = &bitarray_OR_AVX; - else if (__builtin_cpu_supports("sse2")) bitarray_OR_function_p = &bitarray_OR_SSE2; - else if (__builtin_cpu_supports("mmx")) bitarray_OR_function_p = &bitarray_OR_MMX; else #endif +#if defined(COMPILER_HAS_SIMD) + if (__builtin_cpu_supports("avx2")) bitarray_OR_function_p = &bitarray_OR_AVX2; + else if (__builtin_cpu_supports("avx")) bitarray_OR_function_p = &bitarray_OR_AVX; + else if (__builtin_cpu_supports("sse2")) bitarray_OR_function_p = &bitarray_OR_SSE2; + else if (__builtin_cpu_supports("mmx")) bitarray_OR_function_p = &bitarray_OR_MMX; + else #endif - bitarray_OR_function_p = &bitarray_OR_NOSIMD; + bitarray_OR_function_p = &bitarray_OR_NOSIMD; // call the most optimized function for this CPU (*bitarray_OR_function_p)(A, B); } uint32_t count_bitarray_AND2_dispatch(uint32_t *A, uint32_t *B) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) if (__builtin_cpu_supports("avx512f")) count_bitarray_AND2_function_p = &count_bitarray_AND2_AVX512; - else if (__builtin_cpu_supports("avx2")) count_bitarray_AND2_function_p = &count_bitarray_AND2_AVX2; -#else - if (__builtin_cpu_supports("avx2")) count_bitarray_AND2_function_p = &count_bitarray_AND2_AVX2; -#endif - else if (__builtin_cpu_supports("avx")) count_bitarray_AND2_function_p = &count_bitarray_AND2_AVX; - else if (__builtin_cpu_supports("sse2")) count_bitarray_AND2_function_p = &count_bitarray_AND2_SSE2; - else if (__builtin_cpu_supports("mmx")) count_bitarray_AND2_function_p = &count_bitarray_AND2_MMX; else #endif +#if defined(COMPILER_HAS_SIMD) + if (__builtin_cpu_supports("avx2")) count_bitarray_AND2_function_p = &count_bitarray_AND2_AVX2; + else if (__builtin_cpu_supports("avx")) count_bitarray_AND2_function_p = &count_bitarray_AND2_AVX; + else if (__builtin_cpu_supports("sse2")) count_bitarray_AND2_function_p = &count_bitarray_AND2_SSE2; + else if (__builtin_cpu_supports("mmx")) count_bitarray_AND2_function_p = &count_bitarray_AND2_MMX; + else #endif - count_bitarray_AND2_function_p = &count_bitarray_AND2_NOSIMD; + count_bitarray_AND2_function_p = &count_bitarray_AND2_NOSIMD; // call the most optimized function for this CPU return (*count_bitarray_AND2_function_p)(A, B); } uint32_t count_bitarray_AND3_dispatch(uint32_t *A, uint32_t *B, uint32_t *C) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) if (__builtin_cpu_supports("avx512f")) count_bitarray_AND3_function_p = &count_bitarray_AND3_AVX512; - else if (__builtin_cpu_supports("avx2")) count_bitarray_AND3_function_p = &count_bitarray_AND3_AVX2; -#else - if (__builtin_cpu_supports("avx2")) count_bitarray_AND3_function_p = &count_bitarray_AND3_AVX2; -#endif - else if (__builtin_cpu_supports("avx")) count_bitarray_AND3_function_p = &count_bitarray_AND3_AVX; - else if (__builtin_cpu_supports("sse2")) count_bitarray_AND3_function_p = &count_bitarray_AND3_SSE2; - else if (__builtin_cpu_supports("mmx")) count_bitarray_AND3_function_p = &count_bitarray_AND3_MMX; else #endif +#if defined(COMPILER_HAS_SIMD) + if (__builtin_cpu_supports("avx2")) count_bitarray_AND3_function_p = &count_bitarray_AND3_AVX2; + else if (__builtin_cpu_supports("avx")) count_bitarray_AND3_function_p = &count_bitarray_AND3_AVX; + else if (__builtin_cpu_supports("sse2")) count_bitarray_AND3_function_p = &count_bitarray_AND3_SSE2; + else if (__builtin_cpu_supports("mmx")) count_bitarray_AND3_function_p = &count_bitarray_AND3_MMX; + else #endif - count_bitarray_AND3_function_p = &count_bitarray_AND3_NOSIMD; + count_bitarray_AND3_function_p = &count_bitarray_AND3_NOSIMD; // call the most optimized function for this CPU return (*count_bitarray_AND3_function_p)(A, B, C); } uint32_t count_bitarray_AND4_dispatch(uint32_t *A, uint32_t *B, uint32_t *C, uint32_t *D) { -#if defined (__i386__) || defined (__x86_64__) -#if !defined(__APPLE__) || (defined(__APPLE__) && (__clang_major__ > 8 || __clang_major__ == 8 && __clang_minor__ >= 1)) -#if (__GNUC__ >= 5) && (__GNUC__ > 5 || __GNUC_MINOR__ > 2) +#if defined(COMPILER_HAS_SIMD_AVX512) if (__builtin_cpu_supports("avx512f")) count_bitarray_AND4_function_p = &count_bitarray_AND4_AVX512; - else if (__builtin_cpu_supports("avx2")) count_bitarray_AND4_function_p = &count_bitarray_AND4_AVX2; -#else - if (__builtin_cpu_supports("avx2")) count_bitarray_AND4_function_p = &count_bitarray_AND4_AVX2; -#endif - else if (__builtin_cpu_supports("avx")) count_bitarray_AND4_function_p = &count_bitarray_AND4_AVX; - else if (__builtin_cpu_supports("sse2")) count_bitarray_AND4_function_p = &count_bitarray_AND4_SSE2; - else if (__builtin_cpu_supports("mmx")) count_bitarray_AND4_function_p = &count_bitarray_AND4_MMX; else #endif +#if defined(COMPILER_HAS_SIMD) + if (__builtin_cpu_supports("avx2")) count_bitarray_AND4_function_p = &count_bitarray_AND4_AVX2; + else if (__builtin_cpu_supports("avx")) count_bitarray_AND4_function_p = &count_bitarray_AND4_AVX; + else if (__builtin_cpu_supports("sse2")) count_bitarray_AND4_function_p = &count_bitarray_AND4_SSE2; + else if (__builtin_cpu_supports("mmx")) count_bitarray_AND4_function_p = &count_bitarray_AND4_MMX; + else #endif - count_bitarray_AND4_function_p = &count_bitarray_AND4_NOSIMD; + count_bitarray_AND4_function_p = &count_bitarray_AND4_NOSIMD; // call the most optimized function for this CPU return (*count_bitarray_AND4_function_p)(A, B, C, D); diff --git a/client/deps/hardnested/hardnested_bruteforce.c b/client/deps/hardnested/hardnested_bruteforce.c index 159454110..82f8c6c04 100644 --- a/client/deps/hardnested/hardnested_bruteforce.c +++ b/client/deps/hardnested/hardnested_bruteforce.c @@ -433,7 +433,7 @@ static bool read_bench_data(statelist_t *test_candidates) { } -float brute_force_benchmark() { +float brute_force_benchmark(void) { statelist_t test_candidates[NUM_BRUTE_FORCE_THREADS]; test_candidates[0].states[ODD_STATE] = malloc((TEST_BENCH_SIZE + 1) * sizeof(uint32_t)); diff --git a/client/deps/jansson.cmake b/client/deps/jansson.cmake index 216f7a830..c91a47047 100644 --- a/client/deps/jansson.cmake +++ b/client/deps/jansson.cmake @@ -1,4 +1,4 @@ -add_library(jansson STATIC +add_library(pm3rrg_rdv4_jansson STATIC jansson/dump.c jansson/error.c jansson/hashtable.c @@ -9,10 +9,10 @@ add_library(jansson STATIC jansson/strbuffer.c jansson/strconv.c jansson/utf.c - jansson/path.c jansson/value.c ) -target_compile_definitions(jansson PRIVATE HAVE_STDINT_H) -target_include_directories(jansson INTERFACE jansson) -target_compile_options(jansson PRIVATE -Wall -Werror -Wno-unused-function -O3) +target_compile_definitions(pm3rrg_rdv4_jansson PRIVATE HAVE_STDINT_H) +target_include_directories(pm3rrg_rdv4_jansson INTERFACE jansson) +target_compile_options(pm3rrg_rdv4_jansson PRIVATE -Wall -Werror -Wno-unused-function -O3) +set_property(TARGET pm3rrg_rdv4_jansson PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/jansson/Makefile b/client/deps/jansson/Makefile index 152e8bcb9..b51c4a77c 100644 --- a/client/deps/jansson/Makefile +++ b/client/deps/jansson/Makefile @@ -1,6 +1,6 @@ MYSRCPATHS = MYINCLUDES = -I. -MYCFLAGS = -Wno-unused-function +MYCFLAGS = -Wno-unused-function -Wno-cast-align -Wno-bad-function-cast -Wno-switch-enum MYDEFS = -DHAVE_STDINT_H MYSRCS = \ dump.c \ @@ -13,7 +13,6 @@ MYSRCS = \ strbuffer.c \ strconv.c \ utf.c \ - path.c \ value.c LIB_A = libjansson.a diff --git a/client/deps/jansson/hashtable.c b/client/deps/jansson/hashtable.c index 38c10a0c7..23fbc867b 100644 --- a/client/deps/jansson/hashtable.c +++ b/client/deps/jansson/hashtable.c @@ -5,14 +5,14 @@ * it under the terms of the MIT license. See LICENSE for details. */ -#if HAVE_CONFIG_H +#ifdef HAVE_CONFIG_H #include #endif #include #include -#if HAVE_STDINT_H +#ifdef HAVE_STDINT_H #include #endif diff --git a/client/deps/jansson/hashtable_seed.c b/client/deps/jansson/hashtable_seed.c index 3856691d3..715279879 100644 --- a/client/deps/jansson/hashtable_seed.c +++ b/client/deps/jansson/hashtable_seed.c @@ -162,7 +162,7 @@ static int seed_from_timestamp_and_pid(uint32_t *seed) { return 0; } -static uint32_t generate_seed() { +static uint32_t generate_seed(void) { uint32_t seed = 0; int done = 0; diff --git a/client/deps/jansson/jansson.h b/client/deps/jansson/jansson.h index 0f868c2f2..75cbb5d51 100644 --- a/client/deps/jansson/jansson.h +++ b/client/deps/jansson/jansson.h @@ -302,14 +302,6 @@ int json_equal(const json_t *json1, const json_t *json2); json_t *json_copy(json_t *json) JANSSON_ATTRS(warn_unused_result); json_t *json_deep_copy(const json_t *json) JANSSON_ATTRS(warn_unused_result); -json_t *json_path_get(const json_t *json, const char *path); -int json_path_set_new(json_t *json, const char *path, json_t *value, size_t flags, json_error_t *error); - -static JSON_INLINE -int json_path_set(json_t *json, const char *path, json_t *value, size_t flags, json_error_t *error) { - return json_path_set_new(json, path, json_incref(value), flags, error); -} - /* decoding */ #define JSON_REJECT_DUPLICATES 0x1 diff --git a/client/deps/jansson/load.c b/client/deps/jansson/load.c index 7f3fa7458..52b9bed89 100644 --- a/client/deps/jansson/load.c +++ b/client/deps/jansson/load.c @@ -1040,8 +1040,6 @@ json_t *json_loadfd(int input, size_t flags, json_error_t *error) { json_t *json_load_file(const char *path, size_t flags, json_error_t *error) { json_t *result; - FILE *fp; - jsonp_error_init(error, path); if (path == NULL) { @@ -1049,15 +1047,13 @@ json_t *json_load_file(const char *path, size_t flags, json_error_t *error) { return NULL; } - fp = fopen(path, "rb"); + FILE *fp = fopen(path, "rb"); if (!fp) { - error_set(error, NULL, json_error_cannot_open_file, "unable to open %s: %s", - path, strerror(errno)); + error_set(error, NULL, json_error_cannot_open_file, "unable to open %s: %s", path, strerror(errno)); return NULL; } result = json_loadf(fp, flags, error); - fclose(fp); return result; } diff --git a/client/deps/liblua/Makefile b/client/deps/liblua/Makefile index 54e45185b..e2cf7baa3 100644 --- a/client/deps/liblua/Makefile +++ b/client/deps/liblua/Makefile @@ -1,7 +1,7 @@ MYSRCPATHS = MYINCLUDES = -I. # Lua lib requires GNU extensions (implicit declarations of functions): -std=gnu99 or -std=gnu11 -MYCFLAGS = +MYCFLAGS = -Wno-cast-align -Wno-bad-function-cast -Wno-switch-enum MYDEFS = -DLUA_COMPAT_ALL $(SYSCFLAGS) MYSRCS = lapi.c lcode.c lctype.c ldebug.c ldo.c ldump.c lfunc.c lgc.c llex.c \ lmem.c lobject.c lopcodes.c lparser.c lstate.c lstring.c ltable.c \ diff --git a/client/deps/liblua/llex.c b/client/deps/liblua/llex.c index 3f0a1601b..bde26fa4f 100644 --- a/client/deps/liblua/llex.c +++ b/client/deps/liblua/llex.c @@ -197,7 +197,7 @@ static void buffreplace(LexState *ls, char from, char to) { } -#if ANDROID +#if defined(ANDROID) #define getlocaldecpoint() '.' #elif !defined(getlocaledecpoint) #define getlocaledecpoint() (localeconv()->decimal_point[0]) diff --git a/client/deps/lua.cmake b/client/deps/lua.cmake index 3850863b5..12870342e 100644 --- a/client/deps/lua.cmake +++ b/client/deps/lua.cmake @@ -1,4 +1,4 @@ -add_library(lua STATIC +add_library(pm3rrg_rdv4_lua STATIC liblua/lapi.c liblua/lcode.c liblua/lctype.c @@ -33,16 +33,24 @@ add_library(lua STATIC liblua/linit.c ) -target_compile_definitions(lua PRIVATE LUA_COMPAT_ALL) +target_compile_definitions(pm3rrg_rdv4_lua PRIVATE LUA_COMPAT_ALL) if (NOT MINGW) if (APPLE) - target_compile_definitions(lua PRIVATE LUA_USE_MACOSX) + target_compile_definitions(pm3rrg_rdv4_lua PRIVATE LUA_USE_MACOSX) + elseif (ANDROID) + # Required: + add_definitions(-D"getlocaledecpoint\(\)='.'") + # Same as for LUA_USE_LINUX except LUA_USE_POSIX and client-specific LUA_USE_READLINE + target_compile_definitions(pm3rrg_rdv4_lua PRIVATE LUA_USE_DLOPEN LUA_USE_STRTODHEX LUA_USE_AFORMAT LUA_USE_LONGLONG) + # Same as for LUA_USE_POSIX except client-specific LUA_USE_ISATTY. LUA_USE_MKSTEMP is needed. + target_compile_definitions(pm3rrg_rdv4_lua PRIVATE LUA_USE_MKSTEMP LUA_USE_POPEN LUA_USE_ULONGJMP LUA_USE_GMTIME_R) else (APPLE) - target_compile_definitions(lua PRIVATE LUA_USE_LINUX) - target_link_libraries(lua INTERFACE dl) + target_compile_definitions(pm3rrg_rdv4_lua PRIVATE LUA_USE_LINUX) + target_link_libraries(pm3rrg_rdv4_lua INTERFACE dl) endif (APPLE) endif (NOT MINGW) -target_include_directories(lua INTERFACE liblua) -target_compile_options(lua PRIVATE -Wall -Werror -O3) +target_include_directories(pm3rrg_rdv4_lua INTERFACE liblua) +target_compile_options(pm3rrg_rdv4_lua PRIVATE -Wall -Werror -O3) +set_property(TARGET pm3rrg_rdv4_lua PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/mbedtls.cmake b/client/deps/mbedtls.cmake index 932c1757c..b18537c84 100644 --- a/client/deps/mbedtls.cmake +++ b/client/deps/mbedtls.cmake @@ -1,4 +1,4 @@ -add_library(mbedtls STATIC +add_library(pm3rrg_rdv4_mbedtls STATIC ../../common/mbedtls/aes.c ../../common/mbedtls/asn1parse.c ../../common/mbedtls/asn1write.c @@ -44,5 +44,7 @@ add_library(mbedtls STATIC ../../common/mbedtls/x509_crt.c ) -target_include_directories(mbedtls PRIVATE ../../common) -target_compile_options(mbedtls PRIVATE -Wall -Werror -O3) +target_include_directories(pm3rrg_rdv4_mbedtls PRIVATE ../../common) +target_include_directories(pm3rrg_rdv4_mbedtls INTERFACE ../../common/mbedtls) +target_compile_options(pm3rrg_rdv4_mbedtls PRIVATE -Wall -Werror -O3) +set_property(TARGET pm3rrg_rdv4_mbedtls PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/reveng.cmake b/client/deps/reveng.cmake index 0d24c9d49..d7e3cfd8a 100644 --- a/client/deps/reveng.cmake +++ b/client/deps/reveng.cmake @@ -1,4 +1,4 @@ -add_library(reveng STATIC +add_library(pm3rrg_rdv4_reveng STATIC reveng/bmpbit.c reveng/cli.c reveng/model.c @@ -7,7 +7,11 @@ add_library(reveng STATIC reveng/reveng.c ) -target_compile_definitions(reveng PRIVATE PRESETS) -target_include_directories(reveng PRIVATE ../cliparser) -target_include_directories(reveng INTERFACE reveng) -target_compile_options(reveng PRIVATE -Wall -Werror -O3) +target_compile_definitions(pm3rrg_rdv4_reveng PRIVATE PRESETS) +target_include_directories(pm3rrg_rdv4_reveng PRIVATE + cliparser + ../src + ../../include) +target_include_directories(pm3rrg_rdv4_reveng INTERFACE reveng) +target_compile_options(pm3rrg_rdv4_reveng PRIVATE -Wall -Werror -O3) +set_property(TARGET pm3rrg_rdv4_reveng PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/reveng/Makefile b/client/deps/reveng/Makefile index 1794b0bdb..d0382771d 100644 --- a/client/deps/reveng/Makefile +++ b/client/deps/reveng/Makefile @@ -4,7 +4,7 @@ # Add -DPRESETS to compile with preset models (edit config.h) MYSRCPATHS = -MYINCLUDES = -I../cliparser +MYINCLUDES = -I../cliparser -I../../src -I../../../include MYCFLAGS = MYDEFS = -DPRESETS MYSRCS = \ @@ -22,6 +22,7 @@ MYCLEANOLDPATH = ../../reveng include ../../../Makefile.host +ifneq ($(SKIPREVENGTEST),1) CLEAN += bmptst $(BINDIR)/$(LIB_A): $(BINDIR)/bmptst @@ -31,5 +32,6 @@ $(BINDIR)/bmptst: bmpbit.c config.h reveng.h $(Q)$(CC) $(CFLAGS) -DBMPTST -o $@ $< $(info [=] TEST $@) $(Q)( ./$@ && $(TOUCH) $@ ) || ( $(RM) $@ && $(FALSE) ) +endif .PHONY: all clean diff --git a/client/deps/reveng/bmpbit.c b/client/deps/reveng/bmpbit.c index e44ddb250..522d71ecc 100644 --- a/client/deps/reveng/bmpbit.c +++ b/client/deps/reveng/bmpbit.c @@ -30,6 +30,12 @@ #endif #include "reveng.h" +#ifdef BMPTST +# undef fprintf +# undef puts +# undef fputs +#endif + #if (defined BMPTST) || (BMP_BIT < 32) /* Size in bits of a bmp_t. Not necessarily a power of two. */ int bmpbit; diff --git a/client/deps/reveng/cli.c b/client/deps/reveng/cli.c index 9d849dfc3..88e8d3722 100644 --- a/client/deps/reveng/cli.c +++ b/client/deps/reveng/cli.c @@ -97,7 +97,10 @@ int reveng_main(int argc, char *argv[]) { SETBMP(); // pos=0; --- not in this ver of getopt + int err = 0; optind = 1; + // Remember to consume always all the option string till getopt returns -1 ! + // else next invocations will be corrupted do { c = getopt(argc, argv, "?A:BDFGLMP:SVXa:bcdefhi:k:lm:p:q:rstuvw:x:yz"); switch (c) { @@ -105,8 +108,8 @@ int reveng_main(int argc, char *argv[]) { case 'a': /* a: bits per character */ if ((obperhx = atoi(optarg)) > BMP_BIT) { fprintf(stderr, "%s: argument to -%c must be between 1 and %d\n", myname, c, BMP_BIT); - return 0; - //exit(EXIT_FAILURE); + err = 1; + break; } if (c == 'a') ibperhx = obperhx; break; @@ -130,8 +133,8 @@ int reveng_main(int argc, char *argv[]) { case 'v': /* v calculate reversed CRC */ if (mode) { fprintf(stderr, "%s: more than one mode switch specified. Use %s -h for help.\n", myname, myname); - return 0; - //exit(EXIT_FAILURE); + err = 1; + break; } mode = c; break; @@ -151,8 +154,7 @@ int reveng_main(int argc, char *argv[]) { case '?': /* ? get help / usage */ default: usage(); - return 0; - //exit(EXIT_FAILURE); + err = 1; break; case 'i': /* i: Init value */ pptr = &model.init; @@ -184,12 +186,13 @@ int reveng_main(int argc, char *argv[]) { case 'm': /* m: select preset CRC model */ if (!(c = mbynam(&model, optarg))) { fprintf(stderr, "%s: preset model '%s' not found. Use %s -D to list presets.\n", myname, optarg, myname); - return 0; - //exit(EXIT_FAILURE); + err = 1; + break; } if (c < 0) { uerror("no preset models available"); - return 0; + err = 1; + break; } /* must set width so that parameter to -ipx is not zeroed */ width = plen(model.spoly); @@ -246,6 +249,9 @@ ipqx: } } while (c != -1); + if (err) + return 0; + /* canonicalise the model, so the one we dump is the one we * calculate with (not with -s, spoly may be blank which will * normalise to zero and clear init and xorout.) diff --git a/client/deps/reveng/config.h b/client/deps/reveng/config.h index 94d3c4da5..177df030e 100644 --- a/client/deps/reveng/config.h +++ b/client/deps/reveng/config.h @@ -101,4 +101,10 @@ * * *****************************************/ +// Proxmark3 stdout/stderr hooking +#include "ui.h" +#define fprintf(stream, ...) PrintAndLogEx(INFO, __VA_ARGS__) +#define fputs(s, stream) PrintAndLogEx(INFO, "%s", s) +#define puts(s) PrintAndLogEx(SUCCESS, "%s", s) + #endif /* CONFIG_H */ diff --git a/client/deps/tinycbor.cmake b/client/deps/tinycbor.cmake index 14ebb5326..5a6abda25 100644 --- a/client/deps/tinycbor.cmake +++ b/client/deps/tinycbor.cmake @@ -1,4 +1,4 @@ -add_library(tinycbor STATIC +add_library(pm3rrg_rdv4_tinycbor STATIC tinycbor/cborencoder.c tinycbor/cborencoder_close_container_checked.c tinycbor/cborerrorstrings.c @@ -9,6 +9,7 @@ add_library(tinycbor STATIC tinycbor/cborvalidation.c ) -target_include_directories(tinycbor INTERFACE tinycbor) +target_include_directories(pm3rrg_rdv4_tinycbor INTERFACE tinycbor) # Strange errors on Mingw when compiling with -O3 -target_compile_options(tinycbor PRIVATE -Wall -Werror -O2) +target_compile_options(pm3rrg_rdv4_tinycbor PRIVATE -Wall -Werror -O2) +set_property(TARGET pm3rrg_rdv4_tinycbor PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/tinycbor/Makefile b/client/deps/tinycbor/Makefile index 99039ac98..b50c1584f 100644 --- a/client/deps/tinycbor/Makefile +++ b/client/deps/tinycbor/Makefile @@ -1,7 +1,7 @@ MYSRCPATHS = MYINCLUDES = # Strange errors on Mingw when compiling with C99 -MYCFLAGS = +MYCFLAGS = -Wno-bad-function-cast -Wno-redundant-decls -Wno-incompatible-pointer-types-discards-qualifiers -Wno-discarded-qualifiers -Wno-unknown-warning-option -Wno-maybe-uninitialized -Wno-conversion MYDEFS = MYSRCS = \ cborencoder.c \ @@ -18,7 +18,4 @@ LIB_A = tinycbor.a # Transition: remove old directories and objects MYCLEANOLDPATH = ../../tinycbor -# Strange errors on Mingw when compiling with -O3 -CFLAGS ?= -Wall -Werror -O2 - include ../../../Makefile.host diff --git a/client/deps/tinycbor/cbor.h b/client/deps/tinycbor/cbor.h index 238a2717f..e595caeb1 100644 --- a/client/deps/tinycbor/cbor.h +++ b/client/deps/tinycbor/cbor.h @@ -555,8 +555,11 @@ enum CborPrettyFlags { CborPrettyDefaultFlags = CborPrettyIndicateIndeterminateLength }; +/* cf https://sourceforge.net/p/mingw-w64/wiki2/gnu%20printf/ */ typedef CborError(*CborStreamFunction)(void *token, const char *fmt, ...) -#ifdef __GNUC__ +#if defined(__MINGW32__) || defined(__MINGW64__) +__attribute__((format(__MINGW_PRINTF_FORMAT, 2, 3))); +#elif defined(__GNUC__) __attribute__((__format__(printf, 2, 3))) #endif ; diff --git a/client/deps/tinycbor/open_memstream.c b/client/deps/tinycbor/open_memstream.c index 098bf90fe..7a134286f 100644 --- a/client/deps/tinycbor/open_memstream.c +++ b/client/deps/tinycbor/open_memstream.c @@ -36,7 +36,7 @@ # include #endif -#ifdef __APPLE__ || defined(__ANDROID__) || defined(ANDROID) +#if defined(__APPLE__) || defined(__ANDROID__) || defined(ANDROID) typedef int RetType; typedef int LenType; #elif __GLIBC__ @@ -102,7 +102,7 @@ FILE *open_memstream(char **bufptr, size_t *lenptr) { *bufptr = NULL; *lenptr = 0; -#ifdef __APPLE__ || defined(__ANDROID__) || defined(ANDROID) +#if defined(__APPLE__) || defined(__ANDROID__) || defined(ANDROID) return funopen(b, NULL, write_to_buffer, NULL, close_buffer); #elif __GLIBC__ static const cookie_io_functions_t vtable = { diff --git a/client/deps/whereami.cmake b/client/deps/whereami.cmake new file mode 100644 index 000000000..d2d6a5b2a --- /dev/null +++ b/client/deps/whereami.cmake @@ -0,0 +1,6 @@ +add_library(pm3rrg_rdv4_whereami STATIC whereami/whereami.c) + +target_compile_definitions(pm3rrg_rdv4_whereami PRIVATE WAI_PM3_TUNED) +target_include_directories(pm3rrg_rdv4_whereami INTERFACE whereami) +target_compile_options(pm3rrg_rdv4_whereami PRIVATE -Wall -Werror -O3) +set_property(TARGET pm3rrg_rdv4_whereami PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/client/deps/whereami/Makefile b/client/deps/whereami/Makefile new file mode 100644 index 000000000..c25e4b056 --- /dev/null +++ b/client/deps/whereami/Makefile @@ -0,0 +1,9 @@ +MYSRCPATHS = +MYINCLUDES = +MYCFLAGS = +MYDEFS = -DWAI_PM3_TUNED +MYSRCS = whereami.c + +LIB_A = libwhereami.a + +include ../../../Makefile.host diff --git a/client/src/whereami.c b/client/deps/whereami/whereami.c similarity index 90% rename from client/src/whereami.c rename to client/deps/whereami/whereami.c index 30d70c4d9..ca2220953 100644 --- a/client/src/whereami.c +++ b/client/deps/whereami/whereami.c @@ -3,9 +3,7 @@ // by Gregory Pakosz (@gpakosz) // https://github.com/gpakosz/whereami -#ifdef __cplusplus -extern "C" { -#endif +#ifdef WAI_PM3_TUNED #include "whereami.h" @@ -14,6 +12,19 @@ extern "C" { #define _DEFAULT_SOURCE #endif +#else // WAI_PM3_TUNED + +// in case you want to #include "whereami.c" in a larger compilation unit +#if !defined(WHEREAMI_H) +#include +#endif + +#endif // WAI_PM3_TUNED + +#ifdef __cplusplus +extern "C" { +#endif + #if !defined(WAI_MALLOC) || !defined(WAI_FREE) || !defined(WAI_REALLOC) #include #endif @@ -50,11 +61,14 @@ extern "C" { #if defined(_WIN32) +#ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN +#endif #if defined(_MSC_VER) #pragma warning(push, 3) #endif #include +#include #if defined(_MSC_VER) #pragma warning(pop) #endif @@ -123,36 +137,36 @@ static int WAI_PREFIX(getModulePath_)(HMODULE module, char *out, int capacity, i return length; } -WAI_NOINLINE -WAI_FUNCSPEC +WAI_NOINLINE WAI_FUNCSPEC int WAI_PREFIX(getExecutablePath)(char *out, int capacity, int *dirname_length) { return WAI_PREFIX(getModulePath_)(NULL, out, capacity, dirname_length); } // GetModuleHandleEx() is not available on old mingw environments. We don't need getModulePath() yet. // Sacrifice it for the time being to improve backwards compatibility -/* WAI_NOINLINE -WAI_FUNCSPEC -int WAI_PREFIX(getModulePath)(char* out, int capacity, int* dirname_length) -{ - HMODULE module; - int length = -1; +#ifndef WAI_PM3_TUNED + +WAI_NOINLINE WAI_FUNCSPEC +int WAI_PREFIX(getModulePath)(char *out, int capacity, int *dirname_length) { + HMODULE module; + int length = -1; #if defined(_MSC_VER) #pragma warning(push) #pragma warning(disable: 4054) #endif - if (GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, (LPCTSTR)WAI_RETURN_ADDRESS(), &module)) + if (GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, (LPCTSTR)WAI_RETURN_ADDRESS(), &module)) #if defined(_MSC_VER) #pragma warning(pop) #endif - { - length = WAI_PREFIX(getModulePath_)(module, out, capacity, dirname_length); - } + { + length = WAI_PREFIX(getModulePath_)(module, out, capacity, dirname_length); + } - return length; + return length; } -*/ + +#endif // WAI_PM3_TUNED #elif defined(__linux__) || defined(__CYGWIN__) || defined(__sun) || defined(WAI_USE_PROC_SELF_EXE) @@ -228,14 +242,14 @@ int WAI_PREFIX(getExecutablePath)(char *out, int capacity, int *dirname_length) #include #endif -WAI_NOINLINE -WAI_FUNCSPEC +#ifndef WAI_PM3_TUNED + +WAI_NOINLINE WAI_FUNCSPEC int WAI_PREFIX(getModulePath)(char *out, int capacity, int *dirname_length) { int length = -1; FILE *maps = NULL; - int i; - for (i = 0; i < WAI_PROC_SELF_MAPS_RETRY; ++i) { + for (int r = 0; r < WAI_PROC_SELF_MAPS_RETRY; ++r) { maps = fopen(WAI_PROC_SELF_MAPS, "r"); if (!maps) break; @@ -252,8 +266,8 @@ int WAI_PREFIX(getModulePath)(char *out, int capacity, int *dirname_length) { if (!fgets(buffer, sizeof(buffer), maps)) break; - if (sscanf(buffer, "%" SCNx64 "-%" SCNx64 " %s %" SCNx64 " %x:%x %u %s\n", &low, &high, perms, &offset, &major, &minor, &inode, path) == 8) { - uint64_t addr = (uint64_t)(uintptr_t)WAI_RETURN_ADDRESS(); + if (sscanf(buffer, "%" PRIx64 "-%" PRIx64 " %s %" PRIx64 " %x:%x %u %s\n", &low, &high, perms, &offset, &major, &minor, &inode, path) == 8) { + uint64_t addr = (uintptr_t)WAI_RETURN_ADDRESS(); if (low <= addr && addr <= high) { char *resolved; @@ -299,9 +313,11 @@ int WAI_PREFIX(getModulePath)(char *out, int capacity, int *dirname_length) { memcpy(out, resolved, length); if (dirname_length) { - for (int j = length - 1; j >= 0; --j) { - if (out[j] == '/') { - *dirname_length = j; + int i; + + for (i = length - 1; i >= 0; --i) { + if (out[i] == '/') { + *dirname_length = i; break; } } @@ -325,6 +341,7 @@ int WAI_PREFIX(getModulePath)(char *out, int capacity, int *dirname_length) { return length; } +#endif // WAI_PM3_TUNED #elif defined(__APPLE__) @@ -380,8 +397,9 @@ int WAI_PREFIX(getExecutablePath)(char *out, int capacity, int *dirname_length) return length; } -WAI_NOINLINE -WAI_FUNCSPEC +#ifndef WAI_PM3_TUNED + +WAI_NOINLINE WAI_FUNCSPEC int WAI_PREFIX(getModulePath)(char *out, int capacity, int *dirname_length) { char buffer[PATH_MAX]; char *resolved = NULL; @@ -418,6 +436,8 @@ int WAI_PREFIX(getModulePath)(char *out, int capacity, int *dirname_length) { return length; } +#endif // WAI_PM3_TUNED + #elif defined(__QNXNTO__) #include @@ -474,6 +494,8 @@ int WAI_PREFIX(getExecutablePath)(char *out, int capacity, int *dirname_length) return length; } +#ifndef WAI_PM3_TUNED + WAI_FUNCSPEC int WAI_PREFIX(getModulePath)(char *out, int capacity, int *dirname_length) { char buffer[PATH_MAX]; @@ -511,11 +533,12 @@ int WAI_PREFIX(getModulePath)(char *out, int capacity, int *dirname_length) { return length; } +#endif // WAI_PM3_TUNED + #elif defined(__DragonFly__) || defined(__FreeBSD__) || \ defined(__FreeBSD_kernel__) || defined(__NetBSD__) #include -#include #include #include #include @@ -531,8 +554,8 @@ int WAI_PREFIX(getExecutablePath)(char *out, int capacity, int *dirname_length) int length = -1; for (;;) { -#ifdef KERN_PROC_ARGV - int mib[4] = { CTL_KERN, KERN_PROC_ARGS, getpid(), KERN_PROC_ARGV }; +#if defined(__NetBSD__) + int mib[4] = { CTL_KERN, KERN_PROC_ARGS, -1, KERN_PROC_PATHNAME }; #else int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 }; #endif @@ -570,8 +593,9 @@ int WAI_PREFIX(getExecutablePath)(char *out, int capacity, int *dirname_length) return length; } -WAI_NOINLINE -WAI_FUNCSPEC +#ifndef WAI_PM3_TUNED + +WAI_NOINLINE WAI_FUNCSPEC int WAI_PREFIX(getModulePath)(char *out, int capacity, int *dirname_length) { char buffer[PATH_MAX]; char *resolved = NULL; @@ -608,6 +632,8 @@ int WAI_PREFIX(getModulePath)(char *out, int capacity, int *dirname_length) { return length; } +#endif // WAI_PM3_TUNED + #else #error unsupported platform diff --git a/client/src/whereami.h b/client/deps/whereami/whereami.h similarity index 100% rename from client/src/whereami.h rename to client/deps/whereami/whereami.h diff --git a/client/deps/zlib.cmake b/client/deps/zlib.cmake deleted file mode 100644 index dc6044f80..000000000 --- a/client/deps/zlib.cmake +++ /dev/null @@ -1,12 +0,0 @@ -add_library(z STATIC - ../../common/zlib/deflate.c - ../../common/zlib/adler32.c - ../../common/zlib/trees.c - ../../common/zlib/zutil.c - ../../common/zlib/inflate.c - ../../common/zlib/inffast.c - ../../common/zlib/inftrees.c -) - -target_compile_definitions(z PRIVATE Z_SOLO NO_GZIP ZLIB_PM3_TUNED) -target_compile_options(z PRIVATE -Wall -Werror -O3) diff --git a/client/dictionaries/mfc_default_keys.dic b/client/dictionaries/mfc_default_keys.dic index 6e2a2f4da..cc68b0d88 100644 --- a/client/dictionaries/mfc_default_keys.dic +++ b/client/dictionaries/mfc_default_keys.dic @@ -605,6 +605,7 @@ d58023ba2bdc # charlie 62ced42a6d87 # charlie 2548a443df28 # charlie 2ed3b15e7c0f # charlie +f66224ee1e89 # charlie # 60012e9ba3fa # @@ -741,7 +742,6 @@ D3A297DC2698 9EA3387A63C1 A3FAA6DAFF67 A7141147D430 -AAFB06045877 ACFFFFFFFFFF AFCEF64C9913 B27ADDFB64B0 @@ -763,7 +763,6 @@ FD8705E721B0 00ada2cd516d # # -D3F7D3F7D3F7 ## 237a4d0d9119 0ed7846c2bc9 @@ -1068,7 +1067,6 @@ a2a3cca2a3cc 385efa542907 3864fcba5937 3f3865fccb69 -5c8ff9990da2 6291b3860fc8 63fca9492f38 863fcb959373 @@ -1114,7 +1112,6 @@ fe04ecfe5577 5a7a52d5e20d # Bosch Solution 6000 # # Found in TagInfo app -8A19D40CF2B5 # Hotel key card key C1E51C63B8F5 # RATB key 1DB710648A65 18F34C92A56E # E-GO card key diff --git a/client/dictionaries/t55xx_default_pwds.dic b/client/dictionaries/t55xx_default_pwds.dic index 511be26d1..c35014d79 100644 --- a/client/dictionaries/t55xx_default_pwds.dic +++ b/client/dictionaries/t55xx_default_pwds.dic @@ -24,6 +24,8 @@ A5B4C3D2 575F4F4B # 50520901 +# default PROX +50524F58 # Default pwd, simple: 00000000 11111111 diff --git a/client/gen_pm3mfsim_script.sh b/client/gen_pm3mfsim_script.sh index 73c7a4dd4..c3726d69c 100644 --- a/client/gen_pm3mfsim_script.sh +++ b/client/gen_pm3mfsim_script.sh @@ -11,7 +11,7 @@ show_usage() { echo echo "Usage:" - echo "${0##/} input_eml_without_extension output.pm3scr" + echo "${0##/} input_eml_without_extension output.cmd" exit } @@ -32,4 +32,4 @@ rm $2 echo "hf mf eclr" >> $2 echo "hf mf eload" $1 >> $2 echo "hf mf ekeyprn" >> $2 -echo "hf mf sim" `cat $1.eml | (read -n 8 uid; echo $uid)` >> $2 \ No newline at end of file +echo "hf mf sim u" `cat $1.eml | (read -n 8 uid; echo $uid)` >> $2 \ No newline at end of file diff --git a/client/luascripts/test_t55x7.lua b/client/luascripts/test_t55x7.lua index b92375520..4be0ed4b6 100644 --- a/client/luascripts/test_t55x7.lua +++ b/client/luascripts/test_t55x7.lua @@ -9,7 +9,7 @@ local floor = math.floor copyright = '' author = "Iceman" -version = 'v1.0.2' +version = 'v1.0.3' desc =[[ This script will program a T55x7 TAG with a configuration and four blocks of data. It will then try to detect and read back those block data and compare if read data matches the expected data. @@ -31,12 +31,17 @@ testsuit for T55XX commands demodulation ]] example = [[ 1. script run test_t55x7 + 2. script run test_t55x7 -t FSK2A + 3. script run test_t55x7 -t PSK1 ]] usage = [[ -script run test_t55x7 [-h] +script run test_t55x7 [-h] [-t ]] arguments = [[ -h this help + -t (optional, defaults to ASK) 'PSK1', 'PSK2', 'PSK3', + 'FSK1', 'FSK2', 'FSK1A', 'FSK2A', + 'ASK', 'BI' ]] local DEBUG = true -- the debug flag @@ -303,9 +308,11 @@ local function main(args) print( string.rep('--',20) ) print( string.rep('--',20) ) + local modulation_type = 'ASK' -- Arguments for the script - for o, arg in getopt.getopt(args, 'h') do + for o, arg in getopt.getopt(args, 'ht:') do if o == 'h' then return help() end + if o == 't' then modulation_type = arg end end core.clearCommandBuffer() @@ -313,7 +320,8 @@ local function main(args) -- Adjust this table to set which configurations should be tested -- local test_modes = { 'PSK1', 'PSK2', 'PSK3', 'FSK1', 'FSK2', 'FSK1A', 'FSK2A', 'ASK', 'BI' } - local test_modes = { 'ASK' } + --local test_modes = { 'PSK1' } + local test_modes = { modulation_type } for _ = 1, #test_modes do res = WipeCard() diff --git a/client/luascripts/test_t55x7_psk.lua b/client/luascripts/test_t55x7_psk.lua index 0c991dcb0..361b231c4 100644 --- a/client/luascripts/test_t55x7_psk.lua +++ b/client/luascripts/test_t55x7_psk.lua @@ -6,7 +6,7 @@ local ansicolors = require('ansicolors') copyright = '' author = 'Iceman' -version = 'v1.0.2' +version = 'v1.0.3' desc = [[ This script will program a T55x7 TAG with the configuration: block 0x00 data 0x00088040 The outlined procedure is as following: @@ -31,7 +31,6 @@ In all 12 individual test for the PSK demod ]] example = [[ 1. script run test_t55x7_psk - 2. script run test_t55x7_psk -o ]] usage = [[ script run test_t55x7_psk [-h] diff --git a/client/luascripts/tracetest.lua b/client/luascripts/tracetest.lua index c1917b401..b7e931b99 100644 --- a/client/luascripts/tracetest.lua +++ b/client/luascripts/tracetest.lua @@ -7,15 +7,15 @@ local ansicolors = require('ansicolors') copyright = '' author = 'Iceman' -version = 'v1.0.2' +version = 'v1.0.3' desc = [[ -This script will load several traces files in ../traces/ folder and do +This script will load several traces files in current working directory/traces/ folder and do "data load" "lf search 1 u" The following tracefiles will be loaded: em*.pm3 - m*.pm3 + modulation*.pm3 ]] example = [[ 1. script run tracetest @@ -78,8 +78,10 @@ local function main(args) print( string.rep('--',20) ) local cmdDataLoad = 'data load %s'; - local tracesEM = "find '../traces/' -iname 'em*.pm3' -type f" - local tracesMOD = "find '../traces/' -iname 'm*.pm3' -type f" + local cwd = core.cwd(); + + local tracesEM = "find '"..cwd.."/traces/ ' -iname 'em*.pm3' -type f" + local tracesMOD = "find '"..cwd.."/traces/' -iname 'modulation*.pm3' -type f" local write2File = false local outputTemplate = os.date('testtest_%Y-%m-%d_%H%M%S') @@ -100,7 +102,7 @@ local function main(args) end p.close(); - -- Find a set of traces staring with MOD + -- Find a set of traces staring with MODULATION p = assert( io.popen(tracesMOD) ) for file in p:lines() do table.insert(files, file) diff --git a/client/pyscripts/findbits.py b/client/pyscripts/findbits.py new file mode 100755 index 000000000..809465a2e --- /dev/null +++ b/client/pyscripts/findbits.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python3 + +# findbits.py - find Binary, Octal, Decimal or Hex number in bitstream +# +# Adam Laurie +# http://rfidiot.org/ +# +# This code is copyright (c) Adam Laurie, 2009, All rights reserved. +# For non-commercial use only, the following terms apply - for all other +# uses, please contact the author: +# +# This code 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 code 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 sys +import os + +# invert binary string +def invert(data): + return ''.join('0' if c == '1' else '1' for c in data) + +# do the actual search +def search(target,data): + location = data.find(target) + if location >= 0: + print('*** Match at bit {:d}: {}<{}>{}'.format(location, data[:location],target,data[location+len(target):])) + else: + print('Not found') + +# convert integer to binary string +def binstring(number): + return bin(number)[2:] if number > 0 else '' + +# reverse string order +def stringreverse(data): + return data[::-1] + +# match forward, backward and inverted +def domatch(binary,number): + reversed= stringreverse(number) + inverted= invert(binary) + + print(' Forward: (%s) ' % number, end = '') + search(binary,number) + print(' Reverse: (%s) ' % reversed, end = '') + search(binary,reversed) + print(' Inverse: (%s) ' % inverted) + print(' Forward: (%s) ' % number, end = '') + search(inverted,number) + print(' Reverse: (%s) ' % reversed, end = '') + search(inverted,reversed) + +def main(): + if(len(sys.argv) < 3): + print(""" +\t{0} - Search bitstream for a known number + +Usage: {0} + +\tNUMBER will be converted to it\'s BINARY equivalent for all valid +\tinstances of BINARY, OCTAL, DECIMAL and HEX, and the bitstream +\tand it\'s inverse will be searched for a pattern match. Note that +\tNUMBER must be specified in BINARY to match leading zeros. + +Example: + +\t{0} 73 0110010101110011 +""".format(sys.argv[0])) + os._exit(True) + + bases= { + 2:'BINARY', + 8:'OCTAL', + 10:'DECIMAL', + 16:'HEX', + } + + for base, base_name in sorted(bases.items()): + try: + number= int(sys.argv[1],base) + print('\nTrying ' + base_name) + # do BINARY as specified to preserve leading zeros + if base == 2: + domatch(sys.argv[1],sys.argv[2]) + else: + domatch(binstring(number),sys.argv[2]) + except: + continue + +if __name__ == '__main__': + main() diff --git a/client/pyscripts/ice.py b/client/pyscripts/ice.py new file mode 100644 index 000000000..9a223a059 --- /dev/null +++ b/client/pyscripts/ice.py @@ -0,0 +1,4 @@ +import os +import sys + +print("SP %s" % sys.path) diff --git a/client/pyscripts/parity.py b/client/pyscripts/parity.py new file mode 100644 index 000000000..6be9d979d --- /dev/null +++ b/client/pyscripts/parity.py @@ -0,0 +1,78 @@ +# This code is contributed by +# Shubham Singh(SHUBHAMSINGH10) +# 2020, modified (@iceman1001) + +import sys + +# Python3 program to illustrate Compute the +# parity of a number using XOR +# Generating the look-up table while pre-processing +def P2(n, table): + table.extend([n, n ^ 1, n ^ 1, n]) +def P4(n, table): + return (P2(n, table), P2(n ^ 1, table), + P2(n ^ 1, table), P2(n, table)) +def P6(n, table): + return (P4(n, table), P4(n ^ 1, table), + P4(n ^ 1, table), P4(n, table)) +def LOOK_UP(table): + return (P6(0, table), P6(1, table), + P6(1, table), P6(0, table)) + +# LOOK_UP is the macro expansion to generate the table +table = [0] * 256 +LOOK_UP(table) + +# Function to find the parity +def Parity(num) : + # Number is considered to be of 32 bits + max = 16 + + # Dividing the number o 8-bit + # chunks while performing X-OR + while (max >= 8): + num = num ^ (num >> max) + max = max // 2 + + # Masking the number with 0xff (11111111) + # to produce valid 8-bit result + return table[num & 0xff] + +def main(): + if(len(sys.argv) < 2): + print(""" + \t{0} - Calculate parity of a given number + + Usage: {0} <2,10,16> + + \t Specify type as in 2 Bin, 10 Decimal, 16 Hex, and number in that particular format + \t number can only be 32bit long. + + Example: + + \t{0} 10 1234 + + Should produce the output: + + \tOdd parity\n""".format(sys.argv[0])) + return 0 + + + numtype= int(sys.argv[1], 10) + print("numtype: {0}".format(numtype)) + input= int(sys.argv[2], numtype) + print("num: {0} 0x{0:X}".format(input)) + + #num = "001111100010100011101010111101011110" + # Result is 1 for odd parity + # 0 for even parity +# result = Parity( int(input, numtype) ) + result = Parity(input) + print("Odd parity") if result else print("Even parity") + + +if __name__ == "__main__": + main() + + + diff --git a/client/pyscripts/pm3_eml2mfd.py b/client/pyscripts/pm3_eml2mfd.py new file mode 100755 index 000000000..90803cf5e --- /dev/null +++ b/client/pyscripts/pm3_eml2mfd.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 + +''' +# Andrei Costin , 2011 +# pm3_eml2mfd.py +# Converts PM3 Mifare Classic emulator EML text file to MFD binary dump file +''' + +import sys +import binascii + +def main(argv): + argc = len(argv) + if argc < 3: + print('Usage:', argv[0], 'input.eml output.mfd') + return 1 + + with open(argv[1], "r") as file_inp, open(argv[2], "wb") as file_out: + for line in file_inp: + line = line.rstrip('\n').rstrip('\r') + print(line) + data = binascii.unhexlify(line) + file_out.write(data) + +if __name__ == '__main__': + main(sys.argv) diff --git a/client/pyscripts/pm3_eml_mfd_test.py b/client/pyscripts/pm3_eml_mfd_test.py new file mode 100755 index 000000000..8fae5965e --- /dev/null +++ b/client/pyscripts/pm3_eml_mfd_test.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python3 + +from tempfile import mkdtemp +from shutil import rmtree +from string import hexdigits +import unittest, os +import pm3_eml2mfd, pm3_mfd2eml + +class TestEmlMfd(unittest.TestCase): + def setUp(self): + self.tmpdir = mkdtemp() + + def tearDown(self): + rmtree(self.tmpdir) + + EML2MFD_TESTCASES = [ + ('', ''), + ("41424344\r\n45464748\n494A4B4C\n", "ABCDEFGHIJKL") + ] + def test_eml2mfd(self): + self.three_argument_test(pm3_eml2mfd.main, self.EML2MFD_TESTCASES) + + def test_mfd2eml(self): + self.three_argument_test(pm3_mfd2eml.main, + map(reversed, self.EML2MFD_TESTCASES), c14n=hex_c14n) + + def three_argument_test(self, operation, cases, c14n=str): + for case_input, case_output in cases: + try: + inp_name = os.path.join(self.tmpdir, 'input') + out_name = os.path.join(self.tmpdir, 'output') + with open(inp_name, 'w') as in_file: + in_file.write(case_input) + operation(['', inp_name, out_name]) + with open(out_name, 'r') as out_file: + self.assertEqual(c14n(case_output), c14n(out_file.read())) + finally: + for file_name in inp_name, out_name: + if os.path.exists(file_name): + os.remove(file_name) + + +def hex_c14n(inp): + """ + Canonicalizes the input string by removing non-hexadecimal + characters and making everything uppercase + """ + return ''.join(c.upper() for c in inp if c in hexdigits) + +if __name__ == '__main__': + unittest.main() diff --git a/client/pyscripts/pm3_mfd2eml.py b/client/pyscripts/pm3_mfd2eml.py new file mode 100755 index 000000000..ae7a79825 --- /dev/null +++ b/client/pyscripts/pm3_mfd2eml.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python3 + +''' +# Andrei Costin , 2011 +# pm3_eml2mfd.py +# Converts PM3 Mifare Classic MFD binary dump file to emulator EML text file +''' +import sys + +READ_BLOCKSIZE = 16 + +def main(argv): + argc = len(argv) + if argc < 3: + print('Usage:', argv[0], 'input.mfd output.eml') + return 1 + + with open(argv[1], "rb") as file_inp, open(argv[2], "w") as file_out: + while True: + byte_s = file_inp.read(READ_BLOCKSIZE) + if not byte_s: + break + hex_char_repr = byte_s.hex() + file_out.write(hex_char_repr) + file_out.write("\n") + +if __name__ == '__main__': + main(sys.argv) diff --git a/client/pyscripts/theremin.py b/client/pyscripts/theremin.py new file mode 100755 index 000000000..a286d6193 --- /dev/null +++ b/client/pyscripts/theremin.py @@ -0,0 +1,82 @@ +#!/usr/bin/python3 + +### Parameters +# Sound output parameters +volume = 1.0 +sample_buf_size = 44 +sampling_freq = 44100 #Hz + +# Frequency generator parameters +min_freq = 200 #Hz +max_freq = 2000 #Hz + +# Proxmark3 parameters +pm3_client="/usr/local/bin/proxmark3" +pm3_reader_dev_file="/dev/ttyACM0" +pm3_tune_cmd="hf tune" + + +### Modules +import numpy +import pyaudio +from select import select +from subprocess import Popen, DEVNULL, PIPE + + +### Main program +p = pyaudio.PyAudio() + +# For paFloat32 sample values must be in range [-1.0, 1.0] +stream = p.open(format=pyaudio.paFloat32, + channels=1, + rate=sampling_freq, + output=True) + +# Initial voltage to frequency values +min_v = 100.0 +max_v = 0.0 +v = 0 +out_freq = min_freq + +# Spawn the Proxmark3 client +pm3_proc = Popen([pm3_client, pm3_reader_dev_file, "-c", pm3_tune_cmd], + bufsize=0, env={}, stdin=DEVNULL, stdout=PIPE, stderr=DEVNULL) +mv_recbuf = "" + +# Read voltages from the Proxmark3, generate the sine wave, output to soundcard +sample_buf = [0.0 for x in range(0, sample_buf_size)] +i = 0 +sinev = 0 +while True: + + # Read Proxmark3 client's stdout and extract voltage values + if(select([pm3_proc.stdout], [], [], 0)[0]): + + b = pm3_proc.stdout.read(256).decode("ascii") + if "Done" in b: + break; + for c in b: + if c in "0123456789 mV": + mv_recbuf += c + else: + mv_recbuf = "" + if mv_recbuf[-3:] == " mV": + v = int(mv_recbuf[:-3]) / 1000 + if v < min_v: + min_v = v - 0.001 + if v > max_v: + max_v = v + + # Recalculate the audio frequency to generate + out_freq = (max_freq - min_freq) * (max_v - v) / (max_v - min_v) \ + + min_freq + + # Generate the samples and write them to the soundcard + sinevs = out_freq / sampling_freq * numpy.pi * 2 + sample_buf[i] = sinev + sinev += sinevs + sinev = sinev if sinev < numpy.pi * 2 else sinev - numpy.pi * 2 + i = (i + 1) % sample_buf_size + if not i: + stream.write((numpy.sin(sample_buf) * volume). + astype(numpy.float32).tobytes()) diff --git a/client/pyscripts/xorcheck.py b/client/pyscripts/xorcheck.py new file mode 100755 index 000000000..a10c3bba6 --- /dev/null +++ b/client/pyscripts/xorcheck.py @@ -0,0 +1,51 @@ +# xorcheck.py - find xor values for 8-bit LRC +# +# Adam Laurie +# http://rfidiot.org/ +# +# This code is copyright (c) Adam Laurie, 2009, All rights reserved. +# For non-commercial use only, the following terms apply - for all other +# uses, please contact the author: +# +# This code 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 code 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. +# +# 2020, Modified (@iceman1001) + +import sys + +def main(): + if(len(sys.argv) < 3): + print(""" + \t{0} - Generate final byte for XOR LRC + + Usage: {0} ... + + \tSpecifying the bytes of a UID with a known LRC will find the last byte value + \tneeded to generate that LRC with a rolling XOR. All bytes should be specified in HEX. + + Example: + + \t{0} 04 00 80 64 ba + + Should produce the output: + + \tTarget (BA) requires final LRC XOR byte value: 5A\n""".format(sys.argv[0])) + return 0 + + target= int(sys.argv[len(sys.argv) - 1],16) + + lrc= 0x00 + for i in range(len(sys.argv) - 1): + lrc ^= int(sys.argv[i + 1],16) + print('\nTarget (%02X) requires final LRC XOR byte value: %02X\n' % (target,lrc)) + +if __name__ == "__main__": + main() diff --git a/client/resources/aid_desfire.json b/client/resources/aid_desfire.json index 206e003a0..4dddc2a52 100644 --- a/client/resources/aid_desfire.json +++ b/client/resources/aid_desfire.json @@ -10,9 +10,25 @@ { "AID": "D3494F", "Vendor": "HID", - "Country": "United States", + "Country": "US", "Name": "SIO DESFire Ev1", - "Description": "", + "Description": "Field Encoder", + "Type": "pacs" + }, + { + "AID": "D9494F", + "Vendor": "HID", + "Country": "US", + "Name": "Access control", + "Description": "Field Encoder", + "Type": "pacs" + }, + { + "AID": "53494F", + "Vendor": "HID", + "Country": "US", + "Name": "Access control", + "Description": "HID Factory", "Type": "pacs" }, { @@ -46,7 +62,7 @@ "Name": "Legic", "Description": "(FID 02: EF-CONF)", "Type": "" - }, + }, { "AID": "578000", "Vendor": "NORTIC", diff --git a/client/resources/hardnested_tables/bitflip_0_001_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_001_states.bin.bz2 new file mode 100644 index 000000000..e65f22471 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_001_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_001_states.bin.z b/client/resources/hardnested_tables/bitflip_0_001_states.bin.z deleted file mode 100644 index d697d83ce..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_001_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_003_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_003_states.bin.bz2 new file mode 100644 index 000000000..5ae156039 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_003_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_003_states.bin.z b/client/resources/hardnested_tables/bitflip_0_003_states.bin.z deleted file mode 100644 index 2973d69cb..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_003_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_005_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_005_states.bin.bz2 new file mode 100644 index 000000000..473c32fca Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_005_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_005_states.bin.z b/client/resources/hardnested_tables/bitflip_0_005_states.bin.z deleted file mode 100644 index 01b274abe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_005_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_007_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_007_states.bin.bz2 new file mode 100644 index 000000000..0cfda87cb Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_007_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_007_states.bin.z b/client/resources/hardnested_tables/bitflip_0_007_states.bin.z deleted file mode 100644 index 8a2ee5530..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_007_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_009_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_009_states.bin.bz2 new file mode 100644 index 000000000..1103e29bc Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_009_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_009_states.bin.z b/client/resources/hardnested_tables/bitflip_0_009_states.bin.z deleted file mode 100644 index f1de49a74..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_009_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_00b_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_00b_states.bin.bz2 new file mode 100644 index 000000000..2e1c29d87 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_00b_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_00b_states.bin.z b/client/resources/hardnested_tables/bitflip_0_00b_states.bin.z deleted file mode 100644 index 8c919a282..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_00b_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_00d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_00d_states.bin.bz2 new file mode 100644 index 000000000..c76301638 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_00d_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_00d_states.bin.z b/client/resources/hardnested_tables/bitflip_0_00d_states.bin.z deleted file mode 100644 index 214457920..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_00d_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_00f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_00f_states.bin.bz2 new file mode 100644 index 000000000..39e7afc47 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_00f_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_00f_states.bin.z b/client/resources/hardnested_tables/bitflip_0_00f_states.bin.z deleted file mode 100644 index 07f00ab05..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_00f_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_010_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_010_states.bin.bz2 new file mode 100644 index 000000000..74890f1ff Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_010_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_010_states.bin.z b/client/resources/hardnested_tables/bitflip_0_010_states.bin.z deleted file mode 100644 index 3b5f8c3d1..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_010_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_014_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_014_states.bin.bz2 new file mode 100644 index 000000000..b7fb646d1 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_014_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_014_states.bin.z b/client/resources/hardnested_tables/bitflip_0_014_states.bin.z deleted file mode 100644 index ec220c704..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_014_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_01c_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_01c_states.bin.bz2 new file mode 100644 index 000000000..c865be04e Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_01c_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_01c_states.bin.z b/client/resources/hardnested_tables/bitflip_0_01c_states.bin.z deleted file mode 100644 index 3d38583d3..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_01c_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_021_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_021_states.bin.bz2 new file mode 100644 index 000000000..b2fef5781 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_021_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_021_states.bin.z b/client/resources/hardnested_tables/bitflip_0_021_states.bin.z deleted file mode 100644 index 39fc37c15..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_021_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_023_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_023_states.bin.bz2 new file mode 100644 index 000000000..32c7adfd5 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_023_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_023_states.bin.z b/client/resources/hardnested_tables/bitflip_0_023_states.bin.z deleted file mode 100644 index db4897a35..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_023_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_025_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_025_states.bin.bz2 new file mode 100644 index 000000000..e21a5ee93 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_025_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_025_states.bin.z b/client/resources/hardnested_tables/bitflip_0_025_states.bin.z deleted file mode 100644 index 339b9222f..000000000 --- a/client/resources/hardnested_tables/bitflip_0_025_states.bin.z +++ /dev/null @@ -1,49 +0,0 @@ -xÚíëë°Ž€§€¦¥-n › äï–1ðîÙÀWëM9”Ã/ÀœœÄ‘iŠâC$Eþ×ÿü÷×ó±ïÇß¶=ÿÞ¿¾Žï~¿·ÿ{¹ëÇÿßýý<ÿ¾Û¶pü¿÷ßïóø¿üúzýÿßï¾¾üû̓ß¶þ¿o¿þÿþàþ!þÛv|·m%ø¯ßÏÇ¿~ÿóxÿãßðÞsá»y9ãü67ŸÐúëÐÿ¸¯ûûGCŽBøÏGß}ïèŽ?¾÷ïÿ9øK×ÿ¼ùÇû×ïú”ðß¶2ü¹üß¿†ÿ¶¯ûßÁÿð?üþØÿéñ?©ë!üÔó?åñû^/…>Êã¡Zÿ=¥ùÏ}–Òû¿ŒþùÓò,Æ??:ëÿ,?s×cúÆß§éŸ¿ÿªú¿éúŸ7ÿû>‡>è俦ü•¿i~É??û?ô?úúCüÿÈÿ:|Ÿ·­}|ŽþÀ¿|âÿŸˆ{üÅÿý¶µïsþÿ^ù[^ÿùñ9ù;ÿš+ÿïÿKÓ_*úá‡ô¯×ë¶­´þÖ“ÿ­öû§ŽÇÿÓ¶™;ÿÚü׊ÿøþùÚù»~ü»âÄ?‰bÿ¯—ÿÒjÙÿZömøÒù'ÿü?øŸü?«òϺÿÿþ?üvýRûoVþ¿VüþÇþ'þÿüÁŸøù_äÿBÛþ?íó?Ú矬ûÿrŸÓïóÏ?iÛÿœÿãüçÿ8ÿÇþ‡üw;ð±ÿ±ÿ‰ÿcÿÿGþ—à;9§ÿúüoüÐßÞùì?øúÛ£ÿ¿ûýý„þÿŸóõã{ç¿úû Çÿý”Çï{y¼~<þï§<>‡ÿï·?Gÿþïì误ó÷áø¿Ÿãó×—¿þÿ~æÂÇ»ëÇ篯;Ðß:þï]ÿãþçÚ{î~uÿþïôÿçð“úÿ{ç«w¾[?â˜!ÿJþÔ~ýïç]þÿ±õ×kÿ ÿÐÿúô?K鿆üOáß¶þæÈÿõÖ?öòÏòþÇþóìÏ1{Vÿó÷ÓoΣ¿~~¼Ýÿî÷{æþOªÿ׳ÿméÿõøÿ^òOªÿõ÷ÿ¶åú5ÿߨü™ÿß®¤þô?úÿ?þüÿøÿñ€?øƒ¿nü§%ÿhžü_/þcKþCÛôŸ·ÿŒ÷™þýó÷»;þŸçÿÇþ‡ÿá;üÿŸýO‹ÿ1öß~êøÜüûã¿ÛÇçè¿|òÿˆÿk~Ö^ÿÄÿ[õoÚž›?ÿ}ðëãsö'òFÿ0©þm—¿íã¥ýÿlûÿ´éß²þ¯íùÎõ§mÿbÿÙ¶ÿðÿÿÇÿþàOþïHügÜÿ¿jþŸõü_âœÿçü+çÿÙÿqþŸóÿÈ?ì[çÿÉÿ!ÿûŸü?øŸü?òÿðÿáÿÃÿ‡þÿ\ýÿÃÿð¿5þÿúzù£|üç{qÊñݶùóóï~ÇõÚøãú‹ïBü7øÏGÛÂñœVøÏÇ\øñøm á‡òß:þÛvîrô'y½Â~%þïg¬¿üÚúoy~ÿyKø´ÁçÛÎý_ì:|è7úÏ…¯-ÿ¯ËŸoŸzþw^—ä¿Îÿëöÿjë_?{þßÝ/Å¿=øÕÆKﯷþ[ó?dùÚúOŠÿùùŸ¾ù>æÎÿXýS«òýû_ËðûíÿpŸ#]ÿaßÌû¯øùÃþŸçïmïÿ´û¯»ÿ±iÿ÷Ð_gþ?kýÝOþãÿÃÿ‡ÿïSüØð?ô·KmÿãŠ×­ûÊó3×ÿy¿õ=þ2øµû—ý¿½ñiüOÛþêÇ?œ¿³þz>zâ?«ùÿ[ão³ìÿã–ìô?ù_šñë÷ÿ–âÿضí?âß¶ñ'ÿÏvüktÿã¯÷™ùOuû¿ÿ<ý¾wnL?ÏÝÿ­¶ÿ_ÿ×ζžÿGüÿ“ü¿+úÿÞ¹ÿê÷?ÍÿÿOþÿJöo¯ý'Íÿ׎ÿâÿ“³âÿï·ÿ‰ÿô9êüý„õŽú ¯—ûþîUO ôý1>ü>¿9ðãñ__éçð·¿Ôÿ)Å¿&ÿjø_íÿƒß®ÿ ?ôצ¿fýûã?cý¯[ÿ¿î˜ƒ¿ný7øþ‡ÿmâÏþç„ÃçÞ÷ÞûIáKÏþ¯5þ,¥ÿªöÿóѶž¤ñ_íõ¯Ýÿfmý_ÇÆú¿sÿô?òÿ -ù/“¿óò_­úÿÐÿvô?ô‡þøÿ‘ÿœ>ç8ÿÓsþ{Fþõºçÿ­çÿrþŸóÿœÿçü?çÿ9ÿÏùÎÿcÿÛ:ÿOýoÛçÿ9ÿCýøŸúÿœÿ·yþÿþ?üÖúöØ3úŸ¯{þþÇþ·Yÿÿøƒ¿Ýøý_èÿý­ûÿôú¯QÿÔ¦ÿú¿ÔÿÕæÿ;É?{õ?Kþ±ÿ!ÿþÏØÿØÿÄÿ±ÿ‰ÿ#ÿéÿŽÿú[‰ÿcÿÁÿПúÿÔÿ£þã*ô§þåûëÿûŸÇëÿ­Pÿ¥„Ký=¹ÿúÔÿ¶WÿýOýGê¿Ù­ÿ†ý‡ücÿc[þ¯Xÿ{úçÖûÿÔ÷s꟯gÿSÿŸúÿÔÿ§þ¿%ý¿’ÿïõÿKþ¯Úú›“ÿƒþGÿãÿÇÿÿÿÿ»õÿï·?¿¼ÜüŸõÇ¡Üwþ÷éñ>ýSã¥ðSú/þàþ/IåË÷C>åäÿY~Jñ?äóïw -~ÿòøm;_Ÿ¿Œÿü×çüüùö?ô‡þkÈ?/YþÜû×v¿»ã/•ÿóæ¿ç÷þ™šm;O]wë{&ÿ§á×ð©O]÷Ÿþ‡ÿ-ó?øÛ¶ÿGâ?¾ÿî÷»}üáŽý?šðGèÿIãeþ¿tüÁ}_Ÿmû_ÿ™Qÿv•øOìïOËÓø÷¿ßíããßÿ~¯´þÛñ÷ýîÒõßo~~¼}†þ¿†~³ŸçÝÏoGþûñ«yú¿]þúú_ZÿÁúþO›þ#óß>¾>ÿÚëoûûÏ¢ý‡ÿŸø„þRü[è× ýÁü­àïë²òçÔ_=¾RŽÏœë¥¤ê?çñ/j>Ÿþ߇ -¿sÅÿ»ðùãþS-ñ«øòø—”þ²õ¿mÒùï{Þóïç­¿1úëð¿ÔþŸaÿjÖ¿´.ÿµû¿iËYÿ·tÿ7/-ýïWÿu&ÿ#ÿØÿëØÿ3ìÏûÿþøKéýýÿÃÿºüoô?þ?üèÛúþ‡ÿá;üo=ÿ‘ñœÿçüÿxþ¤týiç’ÿý5áßñüËÌó?ëœÿ³yþÕ§WØŸ=½?ÈÓ_šÿß~þ¿¶?ê¹Nþÿ¬óoéï[Îÿ­qþ…óœÿgÿÃþ×ÖxÎÿPÿ‡ó×è?Îÿ#ÿñÿàÿƒþ¶üØð?ô§þ õÿ¬×šW¤ÇÿyÇõ?ÿ•êÿÉâ?cñ¿uê?¥ñ¯ùßçÕÿÑñÿKãgóìOøñô?õŸ©ÿGüûÏ¢ýGüùOþŸÝø×ÈþïøÝÜú¯:ý¨ÿOýòÿˆÿãÿÕñÿ­Sÿ_ª¤ñòÿÉÿ×Íÿ—ÙcùÿëÔÿÇÿOÿOkñÿ×½èáã<_úºãŸ×ÿÜ·éëµûÇã¥ðk÷ï}>ðÿÏÅÿU‹$¬Rþ¾¤øŸ_!¼þµñõWß~ø½÷‡þÐ_‡þÚõtý¯WÿºVÿê\ëjþ:õßàøþ·‹¿uûÿðÅüý„þË|çßzùû‡ãŸÿãú™þ¯ßÏ…Æ?„ý}úoÛ¹ÿMN_Å}n¤ô×¶ÿ[𯭿ܼÄöˆû>œOÍõ¯Ýÿf…õ/Á†ü»sÿô?ò_ºþþi3äïYþ§å2û?ô?úúÛ¥?þâ?Uû‡ë\'þÿ¡öÿHü'î_2~þrLþö/Û3²þ/RùÏø_}êûÿÞù—Œ??¿æúÓ–ïcþ—OÛ÷¹ñeÿ¿|äÿÈþ/ÜÏHç_WþìÿÂõ×2åýßÝøožÿ›ø'ñOìÿ»å¿´×OmËÿÑ´tŸ_{þÉÿ#ÿþ'ÿϪü³îßÅÿ‡ÿÿŸeÿŸÌþ›‘ÿ¯ÿ‡ÿ±ÿ±ÿµÎÿÜýü øƒÿgáÿ^ý¯-ÿ¥ú? ?ü®¾‚þÐ_‹þÒú_ÛvþþùH×—z>Òõ¬Ö8ÿ2Vÿjžü——ֿ=Ó?ä4¥õÏ|HÁkÅ¿4¾ôw>ÿUâÿ–õ÷zOñÿóqæíõ¯ÍÿŸ#ÿÆëÿ=sç?5¿þü§ëßÙ”ØÿêñgÆß6þýÿ9û?iÿ´+ú¯½sý[×Úô³¾þî#ÿçÅÿµã¿Èè¿|ì?ì?üÿÐÿýþ/ú_ÚîÿHÿW‹ëŸþ?ôÿ¡ÿÕþ?È?ô¿¬þë¼þ¿Úòßzÿ_ì?äŸ=ù‡üŸÕÿzÌþ_gýKûïJéŸþ¿éýŸTÿëØÿè]þÿù'Õÿ:ûëòý¯ëÿ+ç?Éß™ùÿíúGêÿAÿ£ÿñÿãÿÇÿÿÿøƒ?ø_¿ôüÓ<ù¯£ÿ­ËèþŸãÿiß®äÿ³îÿÂþ‡ÿáüßàOþw«ÿqßCÿcëø\üKþý?i<ùøÿ{ãß9~m|.þ¿Æú'þ/û,¥ßìçy÷óÛ‘ÿn=ÏÔÿíò××ÿÛÖþü¹úsœÿУÿÈü·¯Ï¿öú[ÇþÆþ³hÿáÿÇÿGüüÁßzü_ÿó/¯#ÿmæÿÿcÿÇùWâ?ìÿ8ÿÏùäö¿UüÉÿ!ÿûŸü?øŸü?òÿðÿáÿÃÿ‡þ·sþ þ‡ÿá[üÿz¢=|üçã:×Ï×ü|ýÏ}›¾^»<^ -¿vÿÞçûlü_½HÂþ'=Ÿ¥ëKzéó÷Ãç¯öªÝúß‹þsákÊwyþ·<ÿùëë•ÏìÏ=¿ÿðëµñÇõ3þ²üW©ü_©ÿ“ë_Ÿïÿ~þü¿»ÿžÃ×Ç?ÇŸ©õWï_ù_ýKó?dùÚúOŠÿqÿpþynÿçcîüÕ?µ(ÿ°ÿÙßZ¿Þo¿†/éúªí—ú÷_åçíߟ}îþO»ÿ°þþǺý¯K?ëëïžòÿþ?üŸàÿÃþƒÿ¡¿eû_ßÿ¨ ߺý76ÿóüŸ÷\ÿsý¿ÿþ ÿŒ^üGÿÓ¶¿ÆðçßÅ‘œ?–ÿ¥øÏZþÿ¾øÙüýÿ{ãÄÿÑÿ–ã?-ñïX^ÅòL:ÿÚòßzüûÏ®ýGüùOþŸÝø—dÿãô¿Dþû“mk·ÿSñÏÒøàzôÿý?wÿ·ÚþÿüÏügëùÄÿ?Éÿ«éÿÓßøŸæÅÈÿ'ÿµüÿûoFþ¿füÿÿÿÌ‹ÿëØÿÄÿñGÉøý+óÊý®6¾ö=ðü÷ÃOûžœ|‰ýWïáß¶ÿ.û?4áCè¯Mÿsýé¸~µûÿXýë|ýé»ã÷ùOï?âý›óÄû9øçá×ñoÙ–ö?ð?üoÿíâÏþ# ßú»õýŸó/–¯KçyUû¿?íù›1ÿiùëäl|ýù˜7~]ý/{þ»Ì?úù¿¢ü—üeÿ‡þ·®ÿ¡?ôÇÿoYþÛ>ÿ þãü5ÿÿzøšùqÞÜœóçü¿t^^:ÿÎÇ«ÿjËÿëƒß›ÿÒ=ÿ“šÿöüËþéü?÷¼œÿ©ë¿Ð~ÝwÙþºvÿçc.ü}Ÿµÿ· ÿOë¿úù,¯$ô×–ÿ5|kë/7/­ó¹âú×¾®ÍwŸ?äð¯;ÿ;¯ÿÇ=Ï?ÒùßÖýOz¿2gýï¿Òöj|Éþ?ÃÏo³ÿËöü¯Íÿãûï+Ö¿öþßšü£þ'þ?üøÿìÖÿ·ÿf¬?mû þÇþ·mÿ«¯?àø7”ÿïƒü_ >ô‡þô?¿ÿý¼ózŸÊ]ñŸ7>|?Ε¸ùwµ²üû_5ÿýðËãýï·Í?7“¥OçûÜù÷k#Žà¯}Þäð«­¿Öñ¹Ïk¬mþ¿Ÿü»ûü[—víÝøŸ~üÛ:þØÿ¶íÿ}å§[?~}Øqùëßÿ÷;¼ÿ:ëß®þ›C©ü›·þâñmø£ÿtâÿÚñ_ä¿uú×o£ÿû`ÿaÿáÿ‡þzô_±þÔ=ê_i×ß¼¾õù·´þ¥þcé»nýg9~Rÿ¿ö»Äÿ0¯þx~ü?ÿµþÿ÷¬?äúgµúÿýòKª´å -ÿñççüÁÈ?äðeðµßµ×øÞj^5ÿýðËãKßÏÙÿÍÝjÛÿöôÿZü?ùw÷ù·+ÿØÿ­çÿ{§ü£¤þô?úÿ?þüÿøÿé|àŸþïôþПþßôÿ~oü¿-ÿtþºö7üÿÛæúÿÚÞì{8¾ö¹÷½÷~RøÒßÇË}›wÿÚýæÀÇÓÿ—þ¯¥þó®_б~ÂøÁ¾Ëâñø:ÿ¿sýKâ'sæ_;þ“£ÿ¡?ë£ú?/ÿÒÏß?­ÿãñ5ýo]þ÷ÿ“êÿZÿ²š>¿ºÿŸÕþÏÚôß¶¶õuÿ˱õ×ÞÿPÛþÅþÃþÃÿOü‡þ‹À¾ÕþŸôÿ¡ÿý¬öÿ¡ÿµmù_ï__~—ο6ÿIñÓž?øù‡üþ]ûÿÝÿO쿈ýOÿOøß.ÿ[ÃýÿÿúýÿÃÿð¿%þ·žÿþœáüÿ¾—ó'ïFó¿ÊùßúùŸäÿÚ¦ÿ¾Ï…ÓßCøîþkœYïüÏ;óŸ9ÿ›ëžJÕ/›‘ÿ_êW?ÿ#ïg=ÿ_óüÙºçÿ-ÿãü?çÿÙÿsþŸó?6ëÿŒŸÿn“¿îþ¾ÍµÎþûŸóÿœÿÇÿ‡ÿÿŸ=ÿöç¿¡¿MúSÿÿÇ -uHVó¿Yy—Ƥñ¿ì?iÿ'éù»UêÿåãgÇõÑúßµýÿzñ?+ö?úŸü/êÿÙÿcÿÙ¶ÿˆ#ÿÉÿ³ÿ’ö/³ÿ\¯ÿõÿ©ÿOýâÿâÿ+úÿÞYÿ_¢æœ%ÿŸüMûwNÿúQý£ÿÅÿOÿO»ù!}çËÑÿ<Œg<ãï?>®K’®ÿr®Ÿò.øW?¿6|èýuåÇùý÷û×ïŽÿ½ç_ú'çÿÚý¯}~øþ·ÌÿàoÓþ¿wýi9|è¯[ÿU[ÿê×]…ÿÂ÷œüôÂ/÷¿_IþÎÃÿîóþGþkÔÿÖ•¿Ö÷èô?ô·KüÿøÿÜùÎã|bîüçüx¼;Ÿ•/…ŸÊÿâߌ/­ÿp¯XúÜŸñÇ¿rQõ™–Ÿî÷íë¿4¾MþKãORù¯·ÿC™üÛ¶6ø-ñ¿–ç=ÿ~ÞúKÙÌîþþyýÿNù/«ÿÐfºûŸé_Îÿƒß“ÿÿ'¦iýíÿJô×–ÿãø·ïÿ|ücþ×^ÿÖãoÄ?±±ÿËöy‹ý%µÿõ÷ÿRü¥ûÿyóŸž_òÿÈÿƒÿÉÿë§Ï§Ë?üßøÿðÿáÿ³èÿ›gÿIÏŸhÇíò?ö?çÏxÆsþŸü/ÎÿC‹ùß:çOÖ‰Ùôÿåè_Ú+§~'Ï?Ö±ÿÉÿçüçÿ8ÿGüŸüËùÿØÿÄÿ‰ÿÿ'þo[ÿÕâŸ#ò«-þ«ÿçü§UúÿÇþÃÿý­úÿµûÏhÂ?Æ»ïb˜ñõÏo}þ­¯©ÿÙ#ùýh]Âëñ÷eùU§ßÕþÿ3ýÿ?õù«Í³|þÇüRþk¿úïZÿÍõëù‡þצ¿$þ,ÿuä¿Vÿ1øù‡üc¼öú×±?×YÿÒ?)ýtþæíÿ¤ú_ÇþGÿëòÿçÈ¿»Ï¿Mù‡þ×õÿiËßyúGêÿAÿ£ÿñÿãÿÇÿÿÿðüwêøÏ -ööôÇÿgÓÿoÝÿ§½ÿŸ·ÿº¢þüÿ>ÿƒ¿mûßÃñÇw¯Ïñõ~îùKã÷½<^ -?ÿ÷SŸÃÿ˜¿ãúèü»ûŸÿÁÈÓ_ -??bûü^íÿú׿Eû_úüïœ?éxÇ/mŸ{ßÛî§·þGñšK?½÷}~¿ÏçéGô›ü“Âϯéëò?×ÿ/œÏqùUÓÿ¹þg­ú??¾MþZßÿ­Jÿ–õ?£ÿݾÏ]ÏGyþÜýÖ°±ÿlÛøÿñÿøÀçü¿µü_ëùÄÿÐÿÚöçŠã­ç±ÿ³³ÿƒÿ˜ìoëðÉÿ!ÿûŸü?øŸü?òÿðÿáÿÃÿ‡þçü?üÿÃÿŸËÿ__¯|,?ÿéèÏòzÒã»móý›ÿî÷º¾máøžþøãúÑŸÄõyý~.üx¼»~ÔgðçüŸòó»QcøeøG¿#׿Øõ':ú!¹~EaŸãë?ì›|†_[ÿç犟?쿜ú>…—ƒ_žÿܼ´Â‡þÚôß÷¹ðc8îþ©ùÔ–ÿòüoYþs -ÿðz¬ŸŸ¾ñgþz>æä¿Îà?ýþïçõÚÓiúûðÊô9ÛW¥ù/õßkÁ?ÝÿÏñßóQçÿ˜Jø¥ôGé~çû¯¸þ¥çgÚÇkë¿+žÿNóo]þ±ÿ`ÿoÿÚþ§´_š³ÿÐÝYßÿåíÿsÿá1ùëïâþÏ+ì°ÿGé?Cþ•ÎÿŽ­¿¾ó¿ÈüøÿðÿYõÿaÿYçèo™þ5ÿl¿ÿ±Ïÿ«íÿÄÿ!ó_^q]Ûÿ¦ÿ;¯Kã?ÒøŸ¶ýwŽ?¥òÑòþózü§ü®ïÿß÷‘øÛ,ûÅøŸ%ûýOþWO¼zÛæÆÿWÜÿ[ŠÿcÿÙ¶ÿˆÛ†OþŸíø×èþ§]ÿ÷å?½Þ¶î¦Ç—ìÿçCbßH÷«íÿWàýø¿¥ü?âÿ–ý¿+úÿdû¯}—øßzôÏŒøùÿäÿ¯”ÿßkÿIõvüÿ‹üKÏ×ù×ÛÿÄÿëG½€øý+óÊý®6¾ö=ðü÷×ʟ«á×ð¿Úÿz5|èýµé¯Yèîøß}þ¥þ‡9øëÖß‚ÿáÛüoöiøÖß­ïÿZýÇÒy^ÕþoÅO{þfÌ¿fÿ™uõ¿ìùï2ÿèäÿŠòÿ]ò—ýúߺþ‡þÐÿ¿eùOý?Îÿsþ†ó?ýç¿gÔÿ[óü?ù¿œÿçü?çÿ9ÿÏùÎÿsþŸóÿØßÖÎÿ[©ÿÍùÎÿPÿŸúÿÔÿçü?çÿñÿáÿÃÿg©ÿç¸ý7cý­yþßÿcÿÛ®ÿ|àßnü‡þ/ôÿþvýëõÿ~oýSëþ?êÿÚ®ÿ»ÿßIþÝ¿þ¯mùÇþƒüÛýŸ±ÿ‰ÿÿ'þOüߦü·ÞÿݺÿÏ:ýmÇÿ±ÿðÿCêÿóNýGæßÖûÿ±¬þœvý—þ£Ïßçÿ×®ÿGýo«õÐ÷Ô¤þ›ÝúoðóÍþǶü_±þ·~ýsëýÚö×í?uíêÿSÿŸúÿÔÿ·¡ÿ×óÿ½³þ¿DÿÌñ?¢ÿÑÿøÿñÿãÿÇÿÿnýè§â9¯Çÿg<ã×ñ¡|?äSNþŸåçµð¯~møÐú¯!?´ÿîŽÿ=çß­Ïó{Ëõyü_»ÿ5ÏÿÃÿ–ùümÛÿîü§ó¸ó“þoÆýÏîþþ™Ë¼ÿ[ -?_òÿ~û÷½òðÇæ?ïãŸ/…ŸÂ¿DÉùciüA[ÿêûõã?ûúûÝúñùÃýß÷;ÿ~—¿÷ÇßÇ÷×^ÿ?åçqIã?>ÿsà—Ç—î[¢wž^íú³MþIáKoWþKêÌÐÿùúuý/­ÿ`}ÿ§MÿÔüõ¬ÿòø6ý¿ïs×__ý]ûû϶ý‡ÿŸøxþÏxÆßz¼ôO‰ë¢¤ë?—ž¿<>¼ÿNŽŸ¾<~%)ý¯]W?¿öúÓâÿõêÏ¿¾uù¯ÝÿM›ÿôûÀÈ?äãµÇëÚŸ÷ÇÿÞóýoÓþ‡ÿáðGÿãÿÃÿ‡þ·«ÿáøþ·ÇÿÖóÁŸóóÖÏÿ»üÎtþdx½?©´þµó?Éÿ‚þyüÇàÇôçÏÏÿ]'ÿ_çüÏ -çÿ,Ÿõéý|œéïÖ¯û¿_n^þ¿{ï9ÿS_Û?ÿ¯þLûü‹õóœÿ·½`ÿoÎÿPÿgÎùïöóØ+ÿGÿqþߺüÇÿ‡ÿÿŸMÿöüý©ÿBý?»õŸ4ë¬ãÿÕ«¿·Jý?Yüg,þ·Bý§çãüÞêŸWÿGÇÿÓ7EŸøzoýï6û_'þGüýOýgêÿÿÇþ³hÿÿFþ[Ïÿ³ÿªíbûy$ÿ¯­þ¨NÿêÿSÿŸúÿÄÿ©ÿ¯ãÿ[§þ¿TÿHã?äÿ“ÿ¯Yÿ_jÿûŸ×¨ÿo×ÿOÿO«ñÿד¼d†ï?=äSúº{þ×ÿÜ·éëµûÇã¥ðk÷ï}>ðÿÏÅÿßo_ÛÖö9|Iñ?¿Bx5ükãë¯2¾ýð{ïý¡¿ýåùß²ü‡»ã/]ÿmñëÞù—ä¿¿Öç±ß?Ã?׺šƒÿ¶µÁo©¿Ï×ß‚ÿáøß.þÖíÿÃßù÷ú?sðëåO<îŽ>büëgú¿~?þÿ>ô÷éèK׿&¯¯â>7RúkÛÿ-ø×Ö_n^b{Ä}Χæú—çÊâ+¬ þ3ä_)þ96ÿ½ñOô?ò_GþŸû¦Í¿gùŸ–ËìÿÐÿèèo—þøÿ‰ÿTí®søÿ‡Úÿ#ñ_ìcùß+ûÆ—í™^üÏûG‰ü¿gü¯>õýïüKÆŸŸ_sýiË÷1ÿ¿ËçŽíûÜø²ÿ_>òdÿîg¤ó¯+ÿGöáúk™¿òþïnü7ÏÿMü“ø'öÿÝò_JöW¿ý¯kÿè>¿öü“ÿGþüOþŸUùgÝ¿‹ÿÿþ?Ëþ?™ý7#ÿ_7þÿcÿcÿkÿ¹ûùðÿÏÂÿ½ú_[þKõ~ø]}ÿý¡¿ý¥õßü9ÌÕóïßWÿïç_Æú_Ì“ÿRøÒúwgú‡ü‘¦³´þÏ)x­ø—Æ—þÎç¿Jüß²þ^ï)þ>Îü¯½þµùÿsäßxýÇçcîü§æ×Ÿÿtÿ›òû_=þÌøÛÆÿ±ÿ?gÿW•¿_×^ÿÖõŸ6ý¬¯¿ûÈÿyñíø/òú¯ûûÿ?ô¿ÿËnÿ_ú?éÑŸþ×úý4û­Óÿ9­ÿá¼þOóú/¦úe•úÿHüRù§Ýÿ«l?­¿ûù‡þ_ƒþcñçyýÿ´å¿ÝþØÈ?«òù¯Ûÿ{õo³ÿ5ýÑÿšüÿ9òOªÿuöÿÖåú_×ÿWΓ¿3óÿÛõÔÿƒþGÿãÿÇÿÿÿ?þ/+þOðÿ5ð׉ÿhÛÿØÐúÛõÿ[÷ÿiïÿkçŸÛ÷_cçŸáøþìÿóø×çøú¿ÿ;øŸ<>7ÿþøßïöñ9ú¯ÿ¬ÿþ~R×Cû?µ~ÿ~úæUû?÷ü?åç>ÊóçîWæÿVøµñ?åñ9ùÿÞÏÚë¿ýyÓïãëÿïgüy¿¯éß´=7þûà×ÇçìOäŸüå×ýÛ.ÛÇ÷ÿŸ{ÁÿØÿØÿãö¯”ÿïiÿ‚?ø*þïÕÿÚò_ªÿÓðÃïêû'èýµèïοÄõ®^4ôkd…õ—^çVü9ôëKý~ŸÇßû÷×®ã?_êº[ß3å¿~~||Ý_¢Èi:§æßÑ¿^Óç¼VüKãK²úéúcn^Zê®RÿQ‡ÿ?Gþ­ÿxÞfÌj~ýùùDzüÃþW?3þ¶ñìÿÏÙÿUåïÅ׵׿uý§M?ëëï>ò^ü_;þ‹ü‡þkÁÇþÃþÃÿýßïÿÒ¨ÿu÷úWÒú§úõ?µéoíõ/õûq¤¿Ÿó÷þ~ëï§×ÿuýç:þ©xåßÏ\ÿ¿¿^ø©ùÇÿ~§é2Ãÿ/•5ÿEêóï÷»üÿcë¯ÇþAþ¡ÿ× ÿXüYJÿuä -ÿúú›'ÿµõ?öòÏžüCþ‡öù û³Çþ_gýçíÍ’ý9þRøc¿Ÿ·ÿ“êûý¯ËÿŸ#ÿ¤ú_gÿo]þ¡ÿuýåüç1ù;3ÿ¿]ÿHý?èô?þüÿøÿñÿÓÿˆþïàþô§ÿ ô‡þôÿ¦ÿ÷5þÙùW9þºû?øþ·Íÿôÿµlÿþ¾þ“ç~žµñ¹þŸÚð­¦ÿ+ýûóß=CýQŽÿ¬°þ%ù3úŸß/ÿoæüËàk?¿Mùò³DÿŽÉ_w¿«ûÿ}þþO—þcóß>^Úÿòêõ§mÿbÿÙ¶ÿðÿÿ¡ÿ#øƒ?ý?éÿCÿúÿXëÿCÿkÛòß[ú×ûõêý:÷3ú¿ëÊÿ:þµõ—›—X¹ïÃùÔ\ÿÚüüCþaÿÛíÿwwü?¯ÿ7ö?ý?á»üo ô?þ?üèô?üÿÃÿÖøŸ|x>sþŸóÿ£ù“Òõ¤ÿIþôׄÏó/óÎÿèç?[?ÿ;Rÿæù‘ú[íãëõ·Èÿ׬¿ÂùÎÿqþŸýû[‹Ÿ9ÿCýË篱ÿ9ÿüÇÿƒÿú[ôÿaÿÁÿÐß.ý©ÿgûóØüÏóÞsýÏÃ¥ú#ñiüo…úO’þO3Îÿéúÿeñ3ùþ_7þgÝþGÿÛŽÿPÿÏvüû϶ýGüùOþŸÝø×Øþo^ý×ú¿RÿŸúÿäÿÿ·Zÿ_Óÿ§½ÿ’ö–Ÿ%ÿŸüÿ5òÿGì?iþÿ -õÿñÿÓÿÓrÿ—ƒŸýõÖïpówæWC£<Þ­ÿxÿ|àø¯wW'%üüûwÁoÇ?=ÞÕ_kÁ¬úC ú‡ï‡]éà;[ñø]¿<ÞÿÞÕû$üï>ÿáû¶¥ÿr¿› ·ÿÜsçñÿáøß.þØÿþxç—Š¯‡ð?u¼õýß™/·­í³tþ×°ÿëø—Ÿ_oþFÇŸßß{}-ý/}þûÍ?úù¿Žüד¿øÿÐÿõ?ô‡þøÿ-ÊIþO |¿ÿé9ÿꌿ~*ÿü‰¿´þ¾rýSüü°Zü'¿ÿòïïò…sû¯Rÿ—6ù›êÿR—¿Òø“TþëíçÐ_*ÿúáçðÇ×âû>wýÅôû»ãÛ¶¶þûûI]ï·?ãñþùþ£ðãñøÿ{è¿miy0¾é£ÿûåÿþíû¿4þùù[aý[¿ÿÄþ¶nÿÇöû¨ýÙgÿkÙ?RüçÛ¿£ó'ÿü?øŸü¿Þý¿ù‡ÿÿþ?üVýsì¿YùWZö—]þÇþ'ÿ øÀ>ðÉÿ"ÿúsþWûüöù'ëçûßçο¶ýÏù?Îÿqþóöò¿Èÿ·ÿýOüŸø?ñâÿ6õ_kü³]þ÷á¯ÿçü§UúÿÇþÃÿ ý­Ò?î?qø…^Ÿãëaÿ‰OÿûêŸÓÖ#5>×cUøÖçßÒú—ú¥ïyùW§ÿ;üÿ#Ïßãÿ×~—øfð_ ~ü?ÿµþÿ÷¬?äúGþù%Õ?Úò?…ÿøó¿sþà?äòø2øÚïÚë?|oµ?¯šÿ~øåñ¥ïçìÿæî?µí{ú-þ¿Ÿü»ûüÛ•ìÿÖóÿ½SþÎÑ?Rÿúýÿÿ?þüÿø?€|àëÅZó®…¯ÿ±$ÿ¡?úÿ þìøþ·êÿÆÿoÕþß÷pü¾‡þÃ}—ùãñû^/…¿ï}þÏþÇü×GçßÝÿøüFžþRøñxòÿÈÿ«¯ÿç£õsï{ÛýôÖ¿õøŽ>ñùQýß&ÿ¤ðóãkúߺü—öÿ“êÿ|ÿ²6ý]ÿ?û¿Uéß²þ¯í9¶þzûjÛ¿Øäàÿ'þ|àŸüß±ø4þ´VþŸõü_âœÿçü+çÿÙÿqþŸóÿÌ?ö·­óÿäÿÿ‡ýOþüOþùøÿðÿáÿCÿòù/øþ‡ÿíñÿ××+ËÏ:ú³¼žôønÛ|ÿæ¿û½®o[8þ…§?þ¸þú>ìÿòïß¹ðãñÛÂçüŸòó»QcøeøÛvîtô'z½Â~E~Ÿ“ë?î›ï­ÿósÅÏö_I}ŸÂËÁ/Ïn^ZáCmúïû\ø1œ°ÿW<ŸÚò_žÿ-ËNá^õóóÑ7þÌ_ÏÇœü×ü·nÿ¿^¥~õeúœí«Òü¿»ÿ_Šÿc~(á—Ò¥ûï¿âú—žŸi¯­ÿ®xþ;Í¿uùÇþƒý¿eükûŸÒ~iÎþCwÿe}ÿ§Ýÿ\ÿƒý?JÿòO»ÿ5òÿþ?üVýØÖùú[¦Í?Ûïìóÿjû?ñÈü—W\×ö¿iãÿÎëÒø4þ§mÿãOé~@9ÿy=þS~×÷ÿïûHüm–ý¿büÏ’ýþ'ÿ«'^½msãÿ+îÿ-Åÿ±ÿlÛÄ¿mÃ'ÿÏvüktÿÓ®ÿûòŸ^ïN[÷Æ?ÓãKöÿó!±o¤û¿Õöÿ+ð¿~üßRþñËþßý²ý×¾Küo=úgFü‡üòÿWÊÿïµÿ¤úG;þŠÿ¿Eþ¥çëŠüÇëíâÿÇõ£_ÈßOØ?äèOôz¹Ïáï^õJßãÃïó÷›?ÿõ•~.ðÛøK÷?RükûŸþWŸÿƒß¾ÿƒþÐ_›þšýïŽÿŒõ¿nÿǺÿmþºýÿàøþ·‰?ûŸþ Ÿ{ß{ï'…/ý=û¿Vÿ³”þ«ÚÿÏGÛz’Æ?´×Yþönïÿ¼¶þ¯ã?cýë÷Fÿ#ÿ×’ÿ2ù;ïüŸUÿúߎþ‡þÐÿ?ò¿þnýÆøåÆ—ó/øÔ´‘ÿ›Ë¿ô¿míñ£tý¿þó×áúo©_U:=zþ}Öùoýó?ãôŸ!Fá;ü[Çùq=3Ýõ·¢üï;¿ÿy×­×ìË_—Í¿6ÿIñÓž¿÷_¿¾þõO¨†ý¯Ýÿç÷{Äþêµÿµí þÚðgÌ?õ¿èÿÿ[®ÿa[þY÷ÿâÿÃÿ‡ÿÏ®ÿObÿÍèÿ£_ÿþÇþ§þ/þðâ?ô²Öÿ úãÿ£þ/þ?êÿÙ¬ÿg½þ¯ ÿÙë_>ÿñxêÿRÿwæþ‡üûO‚ýýOüûŸø?ò¿MþÏÿ®˜ÿÿú[‰ÿcÿÁÿÐß&ý©ÿGýÇéOýË÷×ÿ÷?×ÿ[¡þK ÿ–ú{rÿÿõÿ¨ÿm¯þúŸúÔ³[ÿ ûùÇþǶü_±þ÷õÏ­÷ÿ©ïÿæÔ?_Ïþ§þ?õÿ©ÿOýKú%ÿß;ëÿ—ü_µõ7'ÿýþÇÿÿÿ?þÿwëÿßo~x¹ù?ëCÿ¸ïüïÓã}ú§ÆKá§ô_8üÁü_’Ê—ï‡|ÊÉÿ³ü”âÈçßïü:þåñÛv¾>ÿ1ø¯Ïùùóíèý×þ^²ü¹÷¯í~wÇ_*ÿçÍÏïý35ÛvŸºîÖ÷LþOïáSŸºî??üÿ[æð·mÿÄ|ÿÝïwûøÃÿû4áÐÿ“ÆËüéøƒû¾>ÿÚö¿,þ3£þí*ñŸØßŸ–§ñï¿ÛÇÇ¿ÿý^iý·ãïûÝ¥ë?¾ß8üüxÿú ý ýf?Ï»ŸßŽü÷ãWóô»üõõ¿´þƒõýŸ6ýGæ¿}|}þµ×ß:ö7öŸEûÿ?ñ ý¥ø·Ð¯þ<úƒ?ø[Áß×eåÏ©¿z|¥Ÿ9×KIÕÎã_Ô|>ý¿ÿ~çŠ/þwáóÇý§ZâW-ðåñ/)ýeëÛ¤óß÷¼çßÏ[cô×á©ý?ÃþÕ¬i]þk÷Ó–ÿ²þoéþn^ZúÞ¯þëLþGþ!ÿ°ÿ×±ÿgØŸ#öÿýñ—Òûûþ‡ÿuùß.þèüøÿÐÿ¶õ?üÿÃÿvøßzþ#ã9ÿÏùÿñüIéúÓÎÿ$ÿ úk¿ãù—™çÖ9ÿgóü«O¯°?{z§¿4ÿ¿ýümÔsüÿYçßÒß·œÿ[ãü çÿ8ÿÏþ‡ý¯­ñœÿ¡þç¯ÑœÿGþãÿÁÿýmùÿ°ÿàèOýêÿY¯ÿ4¯þHÿóŽë&þ+Õÿ“ÅÆâëÔJã_ó¿Ï«ÿ£ãÿ—ÆÏæÙŸ:ñ?âÿèê?Sÿø?öŸEûø7òŸü?»ñ¯‘ýßñ»¹õ_uúÿPÿŸúÿäÿÿÇÿ«ãÿ[§þ¿TÿHã?äÿ“ÿ¯›ÿ/³ÿÆòÿשÿÿŸþŸÖâÿ¯'zÑÃÇÿx¾ôuÇ?¯ÿ¹oÓ×k÷ÇKá×îßû|àþŸ‹ÿ«IXÿ¤ü9|Iñ?¿Bx5ükãë¯2¾ýð{ïý¡¿ýµëÞéú_¯þu­þÕ¹ÖÕüuê¿Áÿð?üoëöÿá‹ùû ý—9øÎ¿õò'÷Ç?1þÇõ3ý_¿Ÿ ÿŒúûôß¶sÿ›œ¾ŠûÜHé¯mÿ·à_[¹y‰í÷}8Ÿšë_»ÿÍ -ë_‚ÿ ùwçþ?èä¿tý‡}ÓfÈß³üOËeöèô?ô·KüÿĪö×¹NüÿCíÿ‘øOÜ¿düüå˜üí_¶gdý_¤òÿžñ¿>úÔ÷ÿ½ó/~~Íõ§-ßÇüÿ.Ÿ8¶ïsãËþ=øÈÿ‘ý_¸Ÿ‘ο®üÙÿ…ë¯eþÊû¿»ñß<ÿ7ñOâŸØÿwËi¯ŸÚ–ÿ£iÿè>¿öü“ÿGþüOþŸUùgÝ¿‹ÿÿþ?Ëþ?™ý7#ÿ_7þÿcÿcÿkÿ¹ûùðÿÏÂÿ½ú_[þKõ~ø]}ÿý¡¿ý¥õ¿¶íüýó‘®/õ|¤ëY­qþe¬þÕ<ù/…/­{¦Èi:KëŸù<‚׊i|éï|þ«Äÿ-ëïõžâÿçãÌÿÚë_›ÿ?Gþ×ÿ{>æÎj~ýùO׿³)ÿ°ÿÕãÏŒ¿müûÿsöÒþiWô_{çú·®ÿ´ég}ýÝGþÏ‹ÿkÇ‘ÿÐ-øØØøÿ¡ÿûý_ô¿´Ýÿ‘þ¯×?ýèÿCÿ«ýèYý×yýµå¿õþ¿ØÈ?{òù?«ÿõ˜ý¿Îú—öß•Òÿ>ýÓû?©þ×±ÿÑÿºüÿ9òOªÿuöÿÖåú_×ÿWΓ¿3óÿÛõÔÿƒþGÿãÿÇÿÿÿ?þðð¿éù§yò_Gÿ[—ÿÐý?ÇÿÓ¾]ÉÿgÝÿ…ýÿÃÿø¿ÁŸüïVÿ㾇þÇÖñ¹ø—&üúÒxòÿðÿ÷Æ¿sþüÚø\üõOü_öYJ¿ÙÏóîç·#ÿÝzž©ÿÛ寯ÿ·­ýùsõç8ÿ¡Gÿ‘ùo_Ÿíõ·ŽýýgÑþÃÿÿø/øƒ¿õø¿4þ3æ_^GþÛÌÿ%þÇþó¯ÄØÿqþŸóÿÈ?ì«ø“ÿCþö?ùð?ùäÿáÿÃÿ‡ÿýoçüüÿÃÿ¶øÿõD/zøøÏÇu®Ÿ¯;ùùúŸû6}½vÿx¼~íþ½Ï÷Ùø¿z‘„ýOz>K×—ôþÒçï‡Ï_íU»?ô¿ýçÂ×”ïòüoyþó××+ŸÙŸ{~ÿþÿà×kãëgüeù¯Rù¿Rÿ'׿>ßÿ*þýüùwÿ=‡¯Ž?Së¯6Þ¿ó¿þú—æÈò´õŸÿãþáüóÜ:ÿÏÇÜù«jQþaÿ³¿µ~½ß~ _ÒõUÛ/õï¿ÊÏÛ¿?ûÜýŸvÿaýýuû_—~Ö×ß=å?þ?üøÿ>Áÿ‡ýÿCËö¿¾ÿQ¾uûolþçù?ï¹þçúÿý;þÿþ¼ø4þ§máο‹#9?~,ÿKñŸµüÿ}ñ³ùûÿ÷Æÿˆÿ£ÿ-ÇZâß±¼Šå™tþµå¿õø?öŸ]ûø7òŸü?»ñ/ÉþÇé‰ü;ö'ÛÖnÿ§âŸ¥ñÁõèÿ#úîþoµýÿ;ùÿžùÏÖóÿˆÿ’ÿWÓÿ§¿ÿñ?Í‹ÿÿOþÿjùÿ=öߌüÍø/þÿþ™ÿ×±ÿ‰ÿã:’ñûWæ•û]m|í{àøï‡Ÿö?<9ùû®†_ÿmÿ]öh‡þÐ_›þçúÓqýj÷ÿ±ú×ùúÓwÇÿîóŸÞÄû7ç?ˆ÷sðÏïãß²ÿ,íàøß:ÿÛÅŸýG¾õwëû?ç_,_—Îóªö+~Úó7cþÓò×ÉÙøúó1oüºú_öüw™ô?òEùÿ.ùËþýo]ÿCèÿß²ü·}þüÇùÿjþþõð5óÿâ¼¹9ç/Îùé¼¼tþW-þÕ–ÿ׿'þ6#þ¥{þ'5ÿíù—)üÓùîy9ÿSסýºï²ýuíþÏÇ\øû>kÿoAþŸÖõóY^Iè¯-ÿkøÖÖ_n^ZçsÅõ¯}]›ÿî>È?à_wþw^ÿ{žþ¤ó¿­ûŸô~eÎúߥíÿÔø’ý†Ÿ;ß4fÿ—íø_›ÿÇ÷ßW¬íý¿5ùGýOüøÿðÿÙ­ÿ3nÿÍXÚöüýoÛþW_À>ðo(ÿßÿ:ù¿|èý5è~ÿûyçõ8>•»â?o|ø~œ+qóïjeù÷¿jþûá—Çûßo›n&KŸÎ÷¹óï×FÁ?_ûþ¼ÈáW[­ãsŸ×XÿÚü?ùw÷ù·.ÿìÚÿºñ?ýø·uü±ÿmÛÿûÊO·~üú°ãò׿ÿïwxÿuÖ¿]ý7‡þRù7oýÅãÛðGÿéÄÿµã¿Èëô¯ÿÞFÿ0þ÷ÀþÃþÃÿýõè¿bý©{Ô¿Ò®¿y|ëóoiýKýÇÒwÝúÏrü¤þíw‰ÿa^ýñ4üø/~þkýÿïYÈ?ôÏjõÿûå—TÿhËÿþãÏÿÎùƒÿÈ?àËàk¿k¯ÿð½Õþ¼jþûá—Ç—¾Ÿ³ÿ›»ÿÔ¶ÿíéÿµøÿ~òïîóoWþ±ÿ[Ïÿ÷Nù;GÿHý?èô?þüÿøÿñÿÓÿøÀ>ýßéÿý¡?ý¿éÿýÞø[þéüuíoøþ·Íÿôÿµ½ÿØ÷p|ísï{ïý¤ð¥¿?þŽ—û<6ÿîþµûͧÿ/ý_Kýç]¿ cý„ñƒ}—Åâñuþçú—ÄOæÌ¿vü'GÿC×Gõ^þ¥Ÿ¿~ZÿÇãkúߺüïÿ'Õÿµþe5}~uÿ?«ýŸµé¿mmëÿêþ—c믽ÿ¡¶ý‹ý‡ý‡ÿŸøý|«ý?éÿCÿúÿXíÿCÿkÛò¿Þ¿¾ü.mþ“â§=ðòùü»öÿ»3þŸØûŸþŸð¿]þ·†?úÿþ?ô?úþ‡ÿáKüo=ÿü9ÿÂùÿ}/çOßæ•ó¿õó?ÉÿµMÿ}Ÿ ?¦ÿ¾‡ðÝý×8ÿ²ÞùŸwæ?sþ7×ÿ2<”ª_6#ÿ¿Ôÿ®~þGÞÿÎzþ¿æù³uÏÿ[:ÿÇùÎÿ³ÿçü?çlÖÿ?ÿÝ&Ýý}›kýö?çÿ9ÿÿÿþ?{þ?ì?ÎC›ô§þþê¬æ³ò.ÿHã+ØÒþOÒów«ÔÿËÇÏŽë£õ¿kûÿõâVìô?ù_Ôÿ³ÿÇþ³mÿÿFþ“ÿg7þ%í_:gÿ¹^ÿêÿSÿŸúÿÄÿ-ÄÿWôÿ½³þ¿DÿÌ9ÿJþ?ùÿšöïœþõ£úG;þ‹ÿŸþŸvó?BúÏ—£ÿyþÏxÆß|\—$]ÿå\?å]ð¯~~møÐúëÊóûï÷;¯ßÿ{Ï¿ôOÎÿµû_ûüð?üo™ÿÁߦýïúÓrøÐ_·þ«¶þÕ¯?º -ÿ…ï9ùéÿ.„_ï¿’ü‡ÿÝçýüרÿ­+­ïÿÐÿèèo—þøÿñÿ¹óÇùÄÜùÏ1øñxw>+=^ -?•ÿþÄ¿_Zÿá^±ô¹7>ãå¢ë3-?ÝïÛ×i|›ü—ÆŸ¤ò_oÿ;‡þ2ù·mmð[â-Ï{þý¼õ—²™Ýýüóúÿò_Vÿ¡Íþt÷?Ó¿œÿ=¿'ÿÿOLÿÒúÛÿ•è¯-ÿÇñoßÿùøÇü¯½þ­Ç߈bÿbÿ—íóûKjÿëïÿ¥øK÷ÿóæ?=¿äÿ‘ÿÿ“ÿ×OŸO—ø¿ñÿáÿÃÿgÑÿ7Ïþ“ž?ÑŽÿÚåìÎÿ0žñŒçü?ù_œÿ‡þó¿uΟ¬ÿ²éÿËÑ¿´WNýNž¬cÿ“ÿÏù?Îÿqþø?ùÿ–óÿ±ÿ‰ÿÿ'þOüß¶þ«Å?GäW[üW;þÏùO«ô'þý‡ÿú[õÿk÷ŸÑ„ŒwßÅ0ãëŸ5Þúü[_ÿRÿ³GòûÑ8º„×ãïËò«N¿«ýÿ9‡ÿ1ÇõÑùw÷?>ÿƒ‘§¿~<~Äþöù)¼Úÿ-ô¯ÍÿŠö¿ôùß9ÒñŽ_Ú>÷¾·ÝOoýâ5—~zï9úü~ŸÏÓèÿ6ù'…Ÿ_ÓÿÖå®ÿ_8Ÿãò«¦ÿsýÏZõ~|›üµ¾ÿ[•þ-ëFÿ»}Ÿ»þžòü¹û­aÿbÿÙ¶ÿðÿãÿ>ðÏùkù¿Öóÿˆÿ¡ÿµíÏÇ[Ïÿbÿggÿÿ1ÿØßÖá“ÿCþö?ùð?ùäÿáÿÃÿ‡ÿýÏùøþ‡ÿ?—ÿ¿¾^ùX~þÓÑŸåõ¤ÇwÛæû7ÿÝïu}ÛÂñ/<ýñÇõ£?‰ëÿòúý\øñxwý¨ÏàÏ?ø?åçw£ÆðþÊð~G®±ëOtôCrýŠÂ>Ç3ÖØ7ù ¿¶þÏÏ?Ø9õ} -/¿<ÿ¹yi…ýµé¿ïsáÇpÜýSó©-ÿåùß²üçþáõX??}ãÏüõ|ÌÉÁúýßÏë?´§Óô÷á•és¶¯Jó_ê¿×‚ºÿŸã¿ç£Îÿ1?”ðKéÒýÎ÷_qýKÏÏ´×ÖW<ÿæßºücÿÁþß2þµýOi¿4gÿ¡»ÿ²¾ÿËÛÿçþÃcò×ßÿÄýŸWØÿ`ÿÒ†ü+ÿ[}ç‘ÿøÿðÿáÿ³êÿÃþ³ÎÿÐß2ýkþÙ~ÿcŸÿWÛÿ‰ÿC濼⺶ÿMÿw^—Ƥñ?mûïJå£åýçõøOù]ßÿ¿ï#ñ·YöÿŠñ?Kö?úŸü¯žxõ¶Íÿ¯¸ÿ·ÿÇþ³mÿÿ¶ Ÿü?Ûñ¯ÑýO»þïËz½;mÝÿL/Ùÿχľ‘îÿVÛÿ¯ÀÿúñKùÄÿ-ûWôÿÉö_û.ñ¿õèŸñòÿÉÿ_)ÿ¿×þ“êíø+þÿù—ž¯+ò¯·ÿ‰ÿ×~!?aÿ£?Ñëå>‡¿{Õ(}Œ¿Ïßoüxü×Wú¹Àümã/ÝÿHñ¯íjø_}þg ~ûþúCmúkö?¼;þ3Öÿºýëþ·9øëöÿƒÿáøß&þìNø7|î}⦅¾ô÷ìÿZýÏRú¯jÿ?mëIÿÐ^ÿeù?Ú¸½ÿóÚú¿ŽÿŒõ¯ßÿýü_KþËäï¼óVýè;úúCüÿÈÿvú»õã—_Îþ½àSÿÑFþo.ÿÒÿý¶µÇÒõÿúÏ_‡ë¿¥~Uéüõèù÷Yç¿õÏÿŒÓ†ü…ïðoäÿÅõÌt×ߊò¿ïüþç]·^ÿ±/]6ÿÚü'ÅO{þÞýúúÔ?¡þö¿vÿŸßïû«×þ×¶$økß1ÿÔÿ¢ÿüo¹þ‡mùgÝÿ‹ÿÿþ?»þ?‰ý7£ÿ~ý_øûŸú¿øÀü‰ÿÐÿÉZÿ'èÿú¿øÿ¨ÿg³þŸõú¿2üg¯ùüÇã©ÿKýß™ûòï? >ö?ö?ñìâÿÈÿ6ù?7þ»bþ7þ?èo%þýÿC›ô§þõW¤?õ/ß_ÿoÜÿ<^ÿo…ú/%ü[êïÉýÿkÔÿ£þ·½ú?èê?RÿÍný7ì?äûÛòÅúßkÔ?·Þÿ§¾ÿ›Sÿ|=ûŸúÿÔÿ§þ?õÿ-éÿ•üï¬ÿ_òÕÖßœüô?úÿ?þüÿøÿß­ÿ¿ýù=àåæÿ¬?ýã¾ó¿O÷éŸ/…ŸÒáððI*_¾ò)'ÿÏòSŠÿ!Ÿ¿Sðëø—ÇoÛùzøüeüÇà¿>ççÏ·ÿ¡?ô_Cþù{ÉòçÞ¿¶ûÝ©üŸ7ÿ=¿÷ÏÔlÛy|êº[ß3ù? ¿†Om|êºÿüð?üo™ÿÁß¶ý?ÿñýw¿ßíãÿsìÿÑ„?BÿO/óÿ¥ãîûúükÛÿ²øÏŒú·«ÄbZžÆ¿ÿýnÿþ÷{¥õߎ¿ïw—®ÿø~ãðóãýë3ôÿ5ô›ý<ï~~;òß_ÍÓÿíò××ÿÒúÖ÷Úô™ÿöñõù×^ëØßØí?üÿÄ$ô—âßB¿^øóèþào_—•?§þêñ•r|æ\/%Uÿ9i|Póùôÿ>üSø+¾øß…Ï÷Ÿj‰_µÀ—Ç¿¤ô—­ÿm“Îßóž?oýÑ_‡ÿ¥öÿ ûW³þ¥uù¯ÝÿM[þËú¿¥û¸yié?x¿ú¯3ùù‡üÃþ_ÇþŸaŽØÿ÷Ç_Jììøþ×廸£ÿñÿáÿCÿÛÖÿð?üÿÛáëùŒçü?çÿÇó'¥ëO;ÿ“ü/è¯ ÿŽç_fžÿYçüŸÍó¯>½ÂþìéýAžþÒüÿöóÿµýQÏuòÿgKßrþoó/œÿãü?ûö¿¶Æsþ‡ú?œ¿Fÿqþùÿÿô·åÿÃþƒÿ¡?õ_¨ÿg½þÓ¼ú#=þÏ;®ÿ™ø¯TÿOÿ‹ÿ­Sÿ)Íÿ>¯þŽÿ_?›gêÄÿˆÿ£ÿ©ÿLý?âÿØí?âßÈòÿìÆ¿FöÇïæÖÕéÿCýêÿ“ÿGüÿ¯ŽÿoúÿRý#ÿÿOþ¿nþ¿ÌþËÿ_§þ?þúZ‹ÿ¿žèxj÷üpë\ÿìëÒ×Õð¯~~møÐúkÑ¿Í~©åOŽ¿;þwŸÿ¶úUùúióð¯Á¿îùáøþ·‰¿uûÿðWýý„þ«ÜxçßzùëµñÇõÕàCÿ¸o;—4dêwÒù×Ô¿-ø×Ö_n^RpRßkóß¹ÿÌó‘“ŸcýoòýgVXÿüï>ÿè俦ü×–¿ìÿÐÿÖõ?ô·KüÿÄ^¹aþÑŸ¾>ûþñx)üÚýÁû—ëéó“µþ'©þ9ãùOi‰èú£´¬ÿÚø²þ—ÅŸäöÇ -þÿqúKåŸvÿ§ôz‘®¿ÞûëÉÿ#3´óðÇìOwÿ3ýSö¯þüÿ¥ý˜¿^Z¯cû¿<ýõåÿÚú«ïÿüüïó|j®ëñ7âŸØÇØÿzýõíþóì_Íþ¯äÿÙÎÿ³ÎÿÖóÿìÊ?ëþ_üøÿðÿYöÿÉì§úS7þÿcÿsþç®çOÏxÆëÉÿ÷Á¿úùµáCè¯AÿÿÔ½ŠÞsõ•âú_î|Iy¼ÿ}\uó/ùúPm×¥ô“»ž£Èy:ÏšÿÚ_ ¿Ñ¿óú{½§ù¿eý¥Ç»øÈÿÚë_›ÿ?GþÝ}þmÊ?ìÍøßñoëøcÿÛÞÿIê¿¶×W­ÕgÕ]ÿ–õßúKåß¼õ7¯þ¯=ý÷Þø¿vüùýûð¡<~þ?ööþè¯éÿúû)÷¯rÿëYë?¦ ¿¥E­äÇ[Ÿëë_ênéÿSë?“—_uú]íÿÏá1Óÿ÷ÿÉõékíÿ36ÿcþ)ÿµß¿½ÿÏ<ÿÍõëù‡þצ¿$þ,ÿuä -ÿúú›'ÿá?äòñZë_Çþ\gýKÿ¤ôÓù›·ÿ“êûý¯ËÿŸ#ÿî>ÿ6åú_×ÿ§-çé©ÿýþÇÿÿÿ?þü_À>ðß©ÿuâ?+Ø_ØÐÿŸMÿ¿uÿŸöþÞþëŠúð?üÿùüþ¶íÿ}Çß½>Ç×Cø¹ç/ß÷òx)üxüßOy|ÿcþŽë£óïîï÷\ÊÓ_ -??bûü^íÿú׿Eû_úüïœ?éxÇ/mŸ{ßÛî§·þGñšK?½÷}~¿ÏçéGô›ü“Âϯéëò?ìæëÏÔõ~ùUÓÿ±üìÕÿùñmò×úþoUú·¬ÿÔü§Î¿—æß箿ç£<î~kؿضí?üÿøÿ€|àsþßZþ¯õü?âèmûsÅñÖó¿ØÿÙÙÿÁÌ?ö·uøäÿÿ‡ýOþüOþùøÿðÿáÿCÿsþþ‡ÿáÿÏåÿ¯¯W>–Ÿÿtôgy=éñݶùþÍ÷{]ß¶pü OüqýèOâú¿¼~?~<Þ]?ê3øóþÏGùùݨ1ü¿2ü£ß‘ë_ìúý\¿¢°ÏñŒõöM>ï­ÿósÅÏö_N}ŸÂËÁ/Ïn^ZáCmúïû\ø1wÿÔ|jËyþ·,ÿ9…x=ÖÏÏGßø3=sò_gðŸ~ÿ÷óúíé4ý}xeúœí«Òü—úïµàŸîÿçøïù¨óÌ%üRú£t¿óýW\ÿÒó3íãµõßϧù·.ÿذÿ·ŒmÿSÚ/ÍÙèïÿòöÿ¹ÿð˜üõ÷?qÿçö?Øÿ£ôŸ!ÿJçÇÖ_ßù_ä?þ?üøÿ¬úÿ°ÿ¬ó?ô·Lÿš¶ßÿØçÿÕöâÿù/¯¸®íÓÆÿ×¥ñiüOÛþ;ÇŸRùhyÿy=þS~×÷ÿïûHüm–ý¿büÏ’ýþ'ÿ«'^½msãÿ+îÿ-Åÿ±ÿlÛÄ¿mÃ'ÿÏvüktÿÓ®ÿûòŸ^ïN[÷Æ?ÓãKöÿó!±o¤û¿Õöÿ+ð¿~üßRþñËþßý²ý×¾Küo=úgFü‡üòÿWÊÿïµÿ¤úG;þŠÿ¿Eþ¥çëŠüÇëíâÿÇu^¼xÙ}Åò%–µëWÿúùµáCè¯ùòk+¥¾ÿ®$wüï>ÿ~}/}æü±ÿ@ŽþÕÏÿÃÿ¶ùß6þÖ_G½Àø½õ÷µïãë«Á·þ’úŸ¤ó¯­kø×ÖŸÔÿ¦½þµë®°þ%øß}þÑÿÈMù¯-Ùÿ¡ÿ­ëèo—þøÿ‰ÿøù…q~búzïüÖî—¯ݿ÷ù>®[½îz£„õžrù—çü©–ø‹?>¬ÿ—®2“?ÿ™Â¯6¾ôrÏŸþ¾%~$yIãWsÆÓ_*ÿÒó_‚ŸÃ¿4þ¼fËëEºþzï¯'ÿ­Ÿ@þëÖÿÓ—ÿÔÿÐÌ?^aý[>ÿ}ŒýÛW¥ó—cögÙþ×µdøÏ³¿çÍêükmÿPÛÿäígùúßÍxþÚ«†Ÿôÿkóÿuù£Wß¿ÿ·%ÿ¬ûñÿáÿÃÿgÙÿ'³ŸfèOMû þÇþÇþW_Œg<ão(ÿßÿêç׆ý¡¿ýÏu®^ïǹ -7ÞíýúR®¾Ry¼ÿ½{>ýúw1~ñóµ_—ÒO -ìzŽþ!oäéÿ6åú_×ÿ§-çé©ÿýþÇÿÿÿ?þúñâÅ‹þïôþПþßôÿ¾Æÿ#³_åøëÚßð?üo›ÿéÿkùõ÷ãúÿ8ÿáñw¼Üç±þ“îþµûÍÏ÷¿Œïßö¹÷Õ{?)üößÓÿ•þ¿ÇŸÏ?ÇùAÿ7ãñw¿çØ*ë_™3ÿÚùO޾Çüåè?¦?óôLëïvømãkúߺüïÿ'Õÿµþg5ýuÿ¿ÏßÿéÒ¿V¿¾¶ž¯î9¶þÚûjۿضí?üÿÄèÈu®[îÿIÿúÿÐÿÇfÿú_Û–ÿqÝúTÿúm+õ¹—ο®ü¯ã_[¹yIÁI}ÿ!ÿ\·ØÿïîøNÿEìúÂÿvùß&þèüøÿÐÿèøþ‡ÿ­ñ¿õüGðçÅù—ߙΟŒ¯÷æ/å׳vþ'ù_п„ÿüÞûkŸÑ;ÿ£Ÿÿlýü¯£¿Ÿÿžë?×ÿ—Ÿÿ(÷¯«Ÿÿ‘ö¿#ÿ_óüÙ -ç_8ÿÇùÛ/öÿVñçüõ$ç¿Ûäo<~¥óÏÔÿáü¿uùÿÿþ?‹þ?ì?øúÛ¥?õÿlÛÚõGÖXÿzø¯Tÿo$þ#ÿ­PÿIÒÿiÆù?]ÿHßtü,¼Þ_ÿ»´ÿ×ÿY·ÿÑÿ¶_Ôÿ³ÿÇþ³mÿñBþ“ÿg7þUÛÿÄöóXþ_iþõû¿RÿŸúÿÔÿ'þoÑÿ«íÿÓ®ÿ/Õ?òó¯äÿ“ÿ¯ÿ?nÿIõÏ -õÿñÿÓÿÓnþ¯Tÿó[’îþ¯ùwò/ÍRø)ùïÃùüÁü]ýâã»m+Áý~>þ­ðsøŸÇ‡õ—ÃZ0ãøçá»y9ãü67ŸÐúëÐÿ¸¯ûûGCŽBøÏGß}ïèŽ?¾÷ïÿ9øK×ÿ¼ùÇû×ïܾ!ÿ¶•áÏåÿ~ø5üýújñóÆ÷†ÿáøß2þØÿñø¿ŸÔõ~ÎVïâeüGáÇãŸòxèŸÖÏGiþsŸ¥ô_Çþ/ãŸþ´<‹ñÏÏŸÎú?ËÏÜõ˜¾ñ÷iúç↑þïÃ_ºþçÍÿ¾Ï¡úù¯)ÿGåoš_òÏÏþýþ‡þÐÿ?ò¿ßçßmkŸ£?ðïŸøÿ'âßñ¿míûÇœÿ¿Wþ–×~|NþŽÆ¿æÊÿûÄÿÒô—ÊŸ~ø!ýëããõºm+­¿õä«ýþ©ãñÿ´í_æÎ¿6ÿµâ?¾¾vþ®ÿ®øñOâŸØÿëå¿´Ú_cö¿–ý#Å_¾tþÉÿ#ÿþ'ÿϪü³îÿÅÿ‡ÿÿŸ]ÿŸÔþ›•ÿ¯ÿ…ÿ±ÿ‰ÿãÿð'þCþù¿Ðß¶ÿOûüöù'ëþ¿ÜçôûüóOÚö?çÿ8ÿÇù?Îÿ±ÿ!ÿÝ|ììâÿØÿÄÿ‘ÿ%øNÎéÀ¿>ÿÿô·wþûþ‡þöèîÿõú_ûOäúW”Æï{y¼~<þï§<^¯ÿYùùGá§ú_åú¬Lëø¿wýûŸkï¹ûÕýÿuú¿ÓÿŸÃOêÿï¯Þùnýýˆÿa†ü+ù?Rûõ¿ŸwùÿÇÖ_¯ýƒüCÿëÓ<þ,¥ÿò?…Ûú›#ÿ×[ÿØÈ?Ëû[øÏ³?ÇìYýýÏßO¿ý9þRøùñþuÿ»ßï™û?©þ_Ïþ·¥ÿ×ãÿ{É?©þ×ßÿÛ–èÿÕü£òwfþ»þ‘úÐÿèüÿøÿñÿãÿÇÿþàþºñŸ–ü£yò½ø-ùýmÓÞþ3Þgú÷Ïßïîøžÿûþ‡ÿíð?þö?-þÇØû©ãsóïÿýnŸ£ÿðÉÿ#þ¯ùY{ýÿoÕ¿i{nþü÷Á¯ÏÙŸÈÿýäú·]þ¶—öÿ³íÿÓ¦Ëú¿¶ÿå;ן¶ý‹ýgÛþÃÿOüÿøƒ?ù¿#ñŸqÿÿªùÖó‰ÿqþŸó¯œÿgÿÇùÎÿ#ÿ°ÿmÿ'ÿ‡ü?ìòÿàòÿÈÿÃÿ‡ÿÿúÿsõ?üÿÃÿÖøÿëëåòñ?žïÅ)ÇwÛæÏÏ¿û×kãë/¾ ñþÝà?!üm ÇpZá?sáÇã·-„ÊëøoÛ¹ÿÉÑŸäõ -û•ø¿Ÿ±þjðkë¿åùýç-áÓ?œÿm;÷q°ëð¡ÿÝè?¾¶ü¿.¾m|êùßy]’ÿ:Cþ¯Ûÿ«­ýìùwÿ½ÿöàW/½¿ÞúoÍÿå?hë?)þçç>úæÿù˜;ÿcõO­Ê?ö?ì-Ãï·ÿÃ}Žtý‡}3gì¿âçûž¿·½ÿÓî?¼îþǦýßCùÿ¬õw?ùÿÿþ¿OñÿaÿÁÿÐß.ýµý+^·î(ÏÏ\ÿçýÖÿõøËà×î_öÿöƤñ?mû«ÿpþÎúëùè‰ÿ¬æÿo¿Í²ÿWŒÿY²ÿÑÿäiƯWÜÿ[ŠÿcÿÙ¶ÿˆÛÆŸü?Ûñ¯Ñý¿Þgæ?Õíÿrüó<>ôÿùÞ¹1ýuÝ­ï™üŸ†_ç6>uÝ~øþ·ÌÿàoÛþ‰ÿøþ»ßïöñ‡ÿ9öÿh¡ÿ'—ùÿÒñ÷}}þµíYügFýÛUâ?±¿?-Oãßÿ~·ÿû½ÒúoÇß÷»K×|¿qøùñþõúÿúÍ~žw?¿ùïǯæéÿvùëëiýëû?múÌûøúük¯¿uìoì?‹öþâ?úKño¡_/üyôð·‚¿¯ËÊŸSõøJ9>s®—’ªÿœÇ¿4>¨ù|úþ)üÎ_üïÂçûOµÄ¯ZàËã_RúËÖÿ¶Iç¿ïyÏ¿Ÿ·þÆè¯ÃÿRû†ý«YÿÒºü×îÿ¦-ÿeýßÒýܼ´ô¼_ý×™üüCþaÿ¯cÿϰ?Gìÿûã/¥?ö?ö?üÿëò¿]üÑÿøÿðÿ¡ÿmëøþ‡ÿíð¿õüGÆsþŸóÿãù“Òõ§ÿIþôׄÇó/3Ïÿ¬sþÏæùWŸ^aöôþ OiþûùÿÚþ¨ç:ùÿ³Î¿¥¿o9ÿ·ÆùÎÿqþŸýû_[ã9ÿCýÎ_£ÿ8ÿüÇÿƒÿúÛòÿaÿÁÿПú/Ôÿ³^ÿi^ý‘ÿç×ÿLüWªÿ'‹ÿŒÅÿÖ©ÿ”Æ¿æŸWÿGÇÿ/ŸÍ³?uâÄÿÑÿÔ¦þñì?‹öñoä?ùvã_#û¿ãwsë¿êôÿ¡þ?õÿÉÿ#þÿWÇÿ·Ný©þ‘ÆÈÿ'ÿ_7ÿ_fÿåÿ¯Sÿÿ?ý?­Åÿ_Oô¢‡ÿñ|éëŽ^ÿsߦ¯×î—¯ݿ÷ùÀü?ÿW-’°þIùsø’â~…ðjø×Æ×_e|ûá÷ÞúCúk×?¼;þÒõ¿^ýëZý«s­«9øëÔƒÿáøß.þÖíÿÃó÷ú/sðëåO<îŽ>büëgú¿~?þÿ>ô÷é¿mçþ79}÷¹‘Ò_ÛþoÁ¿¶þróÛ#îûp>5׿vÿ›Ö¿ÿòïÎýÐÿÈéúû¦Í¿gùŸ–ËìÿÐÿèèo—þøÿ‰ÿTí®søÿ‡Úÿ#ñŸ¸ÉøùË1ùÛ7¾lÏÈú¿Håÿ=ã}ô©ïÿ{ç_2þüüšëO[¾ùÿ]>qlßçÆ—ýÿzð‘ÿ#û¿p?#]ù?²ÿ ×_Ëü•÷wã¿yþoâŸÄ?±ÿï–ÿÒ^?µ-ÿGÓþÑ}~íù'ÿü?øŸü?«òϺÿþ?ü–ý2ûoFþ¿nüþÇþÇþ×:ÿs÷ó/àþŸ…ÿ{õ¿¶ü—êÿ4üð»úþ úC-úKëmÛùûç#]_êùH׳ZãüËXý«yò_ -_ZÿöLÿ?Òt–Ö?óy ¯ÿÒøÒßùüW‰ÿ[Ößë=ÅÿÏÇ™ÿµ×¿6ÿŽü¯ÿ÷|ÌÿÔüúóŸ®gSþaÿ«ÇŸÛø?öÿçìÿ¤ýÓ®è¿öÎõo]ÿiÓÏúú»üŸÿ׎ÿ"ÿ¡ÿZð±ÿ°ÿðÿCÿ÷û¿èi»ÿ#ý_-®úÿÐÿ‡þ?Vûÿ ÿÐÿ²ú¯óúÿjËëý±ÿöäòVÿë1ûõ/í¿+¥ÿ}úÿ¦÷Rý¯cÿ£ÿuùÿsäŸTÿëìÿ­Ë?ô¿®ÿ¯œÿ<&gæÿ·ë©ÿýþÇÿÿÿ?þüàþà=þÒóOó俎þ·.ÿ¡?úŽÿ§}?º’ÿϺÿ ûþ‡ÿñƒ?ùß­þÇ}ý­ãsñ/Mø#ôÿ¤ñäÿáÿïçüùµñ¹øÿëŸø¿ì³”~³ŸçÝÏoGþ»õ¾>ÿÚëoûûÏ¢ý‡ÿÿñ_ðëñiügÌ¿¼Žü·™ÿKüýç_‰ÿ°ÿãü?çÿ‘ØÿVñ'ÿ‡ü?ìòÿàòÿÈÿÃÿ‡ÿÿúßÎù/øþ‡ÿmñÿë‰^ôðñ?žë\?_wòóõ?÷múzíþñx)üÚý{Ÿï³ñõ" ûŸô|–®/éý¥Ïß?ž¿Ú«vè/úÏ…¯)ßåùßòü篯W>³?>÷üþýÿÁ?®×Æ×ÏøËò_¥ò¥þO®}¾ÿUüûùóÿîþ{_ÿ¦Ö_m¼=æýõ/Íÿå?hë?)þÇýÃù?æ¹uþŸ¹ó?VÿÔ¢üÃþgkýz¿ý¾¤ë«¶_êß•Ÿ·ö¹û?íþÃúûëö¿.ý¬¯¿{Êüøÿðÿ}‚ÿûþ‡þ–í}ÿ£&|ëöߨüÏóÞsýÏõÿþûw.ü3þ!üyñiüOÛþÃ?œGr~üXþ—â?kùÿûâgó÷ÿïÿÿGÿ[Žÿ´Ä¿cyË3éükËëñì?»öñoä?ùvã_’ýÓÿùwìO¶­ÝþOÅ?KãƒëÑÿGôÿÜýßjûÿwòÿ=óŸ­çÿÿÿ$ÿ¯¦ÿOÿ5âšÿ!ÿŸüÿÕòÿ{ì¿ùÿšñ_üÿ#ü3/þ¯cÿÿ?Æu$ã÷¯Ì+÷»ÚøÚ÷À>ðß?íx>rò%ö?\ ¿†Ûþ»ìÿЄý¡¿6ýÏõ§ãúÕîÿcõ¯óõ§ïŽÿÝç?½ÿˆ÷oÎï?æàŸ‡_Ç¿eÿYÚÿÀÿð¿uþ·‹?û4|ëïÖ÷οX¾.çUíÿVü´çoÆü§å¯“³ñõçcÞøuõ¿ìùï2ÿèäÿŠòÿ]ò—ýúߺþ‡þÐÿ¿eùoûü3øóÿÕüüëákæÿÅyssÎ_œóÿÒyyéü;¯Zü«-ÿ¯~OümFüK÷üOjþÛó/Sø§óÿÜórþ§®ÿBûußeûëÚýŸ¹ð÷}Öþß‚ü?­ÿêç³¼’Ð_[þ×𭭿ܼ´ÎçŠë_ûº6ÿÝ}þÀ¿îüï¼þ÷<ÿüIç[÷?éýÊœõ7¾ÿJÛÿ©ñ%ûÿ ?w¾iÌþ/Ûð¿6ÿ￯XÿÚûkòúŸøÿðÿáÿ³[ÿgÜþ›±þ´í/øûß¶ý¯¾þ€|àßPþ¿þuò5øÐúkÐÿüþ÷óÎëq|*w=ÄÞøðý8WâæßÕÊòïÕü÷Ã/÷¿ß6ÿÜL–>ïsç߯8‚<¾öýyï¶þZÇç>¯±þµùÿ~òïîóo]þÙµÿuãúñoëøcÿÛ¶ÿ÷=”ŸnýøõaÇå¯ÿßïðþ묻úoý¥òoÞú‹Ç·áþÓ‰ÿkÇ‘ÿÖé?^ÿ½þaü?î?€ý‡ý‡ÿúëÑÅúS÷¨¥]ó:øÖçßÒú—ú¥ïºõŸåøIýÿÚïÿüúãiøñ_üü×úÿß³þèŸÕêÿ÷Ë/©þÑ–ÿ)üÇŸÿóÿ!ÿÀ—Á×~×^ÿá{«ýyÕü÷Ã//}?gÿ7wÿ©mÿÛÓÿkñÿýäßÝçß®ücÿ·žÿïòwŽþ‘úÐÿèüÿøÿñÿãÿ§ÿð|ú¿ÓÿúCúÓÿû½ñÿ¶üÓ9øëÚßð?üo›ÿéÿk{ÿ±ïáøÚçÞ÷ÞûIáKü/÷ylþÝýk÷›?Oÿ_ú¿–úÏ»~AÇú ãû.‹?ÄãëüÿÎõ/‰ŸÌ™íøOŽþ‡þ<®êÿ¼üK?;ü´þÇ×ô¿uù?ÞÿOªÿkýËjúüêþVû?kÓÛÚÖÿÕý/ÇÖ_{ÿCmûûûÿ?ñú/øVûÒÿ‡þ?ôÿ±Úÿ‡þ×¶å½}ù]:ÿÚü'ÅO{þà?äòøwíÿwgü?±ÿ"ö?ý?á»üo ô?þ?üèô?üÿÃÿ–øßzþ#øsþ…óÿû^Ο<¾Íÿ*çëç’ÿk›þû>~Lÿ}á»û¯qþe½ó?ïÌæüo®ÿex>(U¿lFþ©ÿ]ýü¼ÿõüÍógëžÿ·tþóÿœÿgÿÏùÎÿجÿ3~þ»Mþºûû6×:ûìÎÿsþÿþ?üöüØœÿ†þ6éOý?ü+Ô!YÍÿfå]ÿ‘ÆÿV°ÿ¤ýŸ¤çïV©ÿ—Ÿ×Gë×öÿëÅÿ¬Øÿèò¿¨ÿg7þýgÛþ#þü'ÿÏnüKÚ¿tÎþs½þ?Ôÿ§þ?õÿ‰ÿ[ˆÿ¯èÿ{gý‰þ™sþ•üòÿ5íß9ýëGõvüÿ?ý?íæ„ô=ž/Gÿóü1žñŒ¿ÿø¸.Iºþ˹~Ê»à_ýüÚð¡?ôוç÷ßïw^¿;þ÷ž韜ÿk÷¿öùáøß2ÿƒ¿MûÿÞõ§åð¡¿nýWmý«_tþ ßsòÓÿ]¿<Þÿ~%ù;ÿ»Ï?úù¯Qÿ[WþZßÿ¡ÿÑÿÐß.ýñÿãÿsç;ó‰¹óŸcðãñî|Vz¼~*ÿ ü‰3¾´þýbéso|ÆÿÊE=ÖgZ~ºß·¯ÿÒø6ù/?Iå¿ÞþwýeòoÛÚà·ÄÿZž÷üûyë/e3»ûøçõÿ;忬þC›ýéî¦9ÿ{ ~Oþ7þŸ˜þ¥õ?¶ÿ+Ñ_[þãß¾ÿóñù_{ý[¿ÿÄþÅþ/Ûç-ö—Ôþ×ßÿKñ—îÿçÍz~Éÿ#ÿþ'ÿ¯Ÿ>Ÿ.ÿðãÿÃÿ‡ÿÏ¢ÿožý'=¢ÿµËÿØÿœÿa<ãÏùò¿8ÿý-æëœ?Y'þeÓÿ—£i¯œú<ÿXÇþ'ÿŸóœÿãüñòÿ-çÿcÿÿ'þOüŸø¿mýW‹ŽÈ¯¶ø¯vüŸóŸVéOüûÿ?ô·êÿ×î?£ ÿヒaÆ×?k¼õù·¾þ¥þg?Žä÷£qt ¯Çß—åW~WûÿsxÌôÿÿýÔç¯6ÏòùóHù¯ýþé¿ký7ׯ?äú_›þ’ø³tþבÿZýÇà?äòñÚë_Çþ\gýKÿ¤ôÓù›·ÿ“êûý¯ËÿŸ#ÿî>ÿ6åú_×ÿ§-çé©ÿýþÇÿÿÿ?þü_À>ðß©ÿuâ?+Ø_ØÐÿŸMÿ¿uÿŸöþÞþëŠúð?üÿùüþ¶íÿ}Çß½>Ç×Cø¹ç/ß÷òx)üxüßOy|ÿcþŽë£óïî|þ#O)üxüˆýíóSx=´ÿ[è_›ÿíéó¿sþ¤ã¿´}î}o»ŸÞúÅk.ýôÞsôùý>Ÿ§ÑÿmòO -??¾¦ÿ­Ëÿ\ÿ¿p>ÇåWMÿçúŸµêÿüø6ùk}ÿ·*ý[ÖÿŒþwû>wý=åùs÷[ÃþÅþ³mÿáÿÇÿ|àŸóÿÖò­çÿÿCÿkÛŸ+Ž·žÿÅþÏÎþþcþ±¿­Ã'ÿ‡ü?ìòÿàòÿÈÿÃÿ‡ÿÿúŸóÿð?üÿ.ÿ}½ò±üü§£?ËëIï¶Í÷oþ»ßëú¶…ã_xúãëG×ÿåõû¹ðãñîúQŸÁŸð>ÊÏïFáü•áýŽ\ÿbןèè‡äú…}Žg¬ÿ°oò~mýŸŸ+~þ°ÿrêû^~yþsóÒ -úkÓßçÂá¸û§æS[þËó¿eùÏ)üÃë±~~>úÆŸùëù˜“ÿ:ƒÿôû¿Ÿ×hO§éïÃ+Óçl_•æ¿Ô¯ÿtÿ?ÇÏGÿc~(á—Ò¥ûï¿âú—žŸi¯­ÿ®xþ;Í¿uùÇþƒý¿eükûŸÒ~iÎþCwÿe}ÿ—·ÿÏý‡Ç䯿ÿ‰û?¯°ÿÁþ¥ÿ ùW:ÿ;¶þúÎÿ"ÿñÿáÿÃÿgÕÿ‡ýgÿ¡¿eú×ü³ýþÇ>ÿ¯¶ÿÿ‡ÌyÅumÿ›6þï¼.ÿHãÚöß9þ”ÊGËûÏëñŸò»¾ÿßGâo³ìÿã–ìô?ù_=ñêm›ÿ_qÿo)þýgÛþ#þm>ù¶ã_£ûŸvýß—ÿôzwÚº7þ™_²ÿŸ‰}#Ýÿ­¶ÿ_ÿõãÿ–òÿˆÿ[öÿ®èÿ“í¿ö]âëÑ?3â?äÿ“ÿ¿Rþ¯ý'Õ?ÚñWüÿ-ò/=_Wä?^oÿÿ?®õâ÷¯Ì+÷»ÚøÚ÷À>ðß_*®†_ÃÿjÿëÕð¡?ôצ¿fý¡»ã÷ù—úæà¯[ þ‡ÿmó¿]üÙ¤á[·¾ÿkõKçyUû¿?íù›1ÿšýgÖÕÿ²ç¿Ëü£ÿ‘ÿ+ÊÿwÉ_öèëúúCüÿ–å?õÿ8ÿÏùÎÿôŸÿžQÿoÍóÿäÿrþŸóÿœÿçü?çÿ9ÿÏùÎÿc[;ÿo¥þ7çÿ9ÿCýêÿSÿŸóÿœÿÇÿ‡ÿÿŸ¥þŸãöߌõ·æùKüýo»þ?ð|»ñú¿ÐÿúÛõÿ­×ÿû½õO­ûÿ¨ÿk»þïzü'ùwÿú¿¶åûòÿm÷Æþ'þOüŸø?ñ›òßzÿwëþ?ëô·ÿÇþÃÿý©ÿÏ;õ™[ïsüDzúsÚõ_Jø>Ÿÿ_»þõ¿­ÖÿAßSÿ‘úovë¿ÁÌ7ûÛòÅúßúõÏ­÷ÿiÛÿ]·ÿÔµÿ©ÿOýêÿSÿ߆þ_Ïÿ÷Îúÿý3ÇÿˆþGÿãÿÇÿÿÿÿ»õÿ¡?œNˆç<¾ÿŸñŒgü]LJòýO9ù–Ÿ×¿þùµáC迆üÐþ»;þ÷œ·>Ïï-×çñíþ×_ þ‡ÿá»ø[·ÿçßOèÿÌÁwþ­—?ñ¸8þùˆñ?®Ÿéÿúý\øgüCøÐß§ÿ¡/]ÿš¼¾ŠûÜHé¯mÿ·à_[¹y‰í÷}8Ÿšë_žÿ)‹¬°þ%øÏ¥øçØü÷Æ?ÑÿÈùî›6CþžåZ.³ÿCÿ£ÿ¡¿]úãÿ'þSµ¸ÎuâÿjÿÄ|ý5²Œå¯üí_¶gzñ?ï%òÿžñ¿>úÔ÷ÿ½ó/~~Íõ§-ßÇüÿ.Ÿ;¶ïsãËþ=øÈÿ‘ý_¸Ÿ‘ο®üÙÿ…ë¯eþÊû¿»ñß<ÿ7ñOâŸØÿwË)Ù_ýö¿®ý£ûüÚóOþùð?ùVåŸuÿ.þ?üøÿ,ûÿdöߌüÝø?üýý¯uþçîç_Àü? ÿ÷êmù/Õÿiøáwõýô‡þZô—Öóç0W?Ì¿_ý¿wžë1OþKáKëßéòGšÎÒúw>¤àµâ__ú;Ÿÿ*ñËú{½§øÿù8ó¿öú׿ÿÏ‘ãõŸ¹óŸš_þÓýolÊ?ìõø3ãoÿÇþÿœý_Uþ^|]{ý[×Úô³¾þî#ÿçÅÿµã¿Èè¿|ì?ì?üÿÐÿýþ/»ýéÿ¤Gú_ë÷ÿÑìÿµNÿç4þµþ‡óú?Í뿘ê—Uêÿ#ñHåŸvÿ¯²ý<¶þzìäú úÅŸçõÿÓ–ÿvûÿaÿ!ÿ¬Ê?ä¿nÿïuÖ¿Íþ×ôÿEÿkòÿçÈ?©þ×Ùÿ[—è]ÿ_9ÿyLþÎÌÿo×?Rÿúýÿÿ?þüÿø¿¬ø?Áü×À_'þ£mÿcÿAèo×ÿoÝÿ§½ÿ¯n߆ÿáøü±ÿÏã_ŸãëÿþïàòøÜüûã¿ÛÇçè¿ü³þûûI]íÿÔúýûé›ÿUíÿÜóÿý”Ÿÿù(ÏŸ»_™ÿ[áׯÿý”Ççäÿ{?k¯ÿöçM¿¯ÿ¿Ÿðçý¾¦ÓöÜüùïƒ_Ÿ³?‘ÿ}ò?–_sôo»ümßóüøÿV£Ëúß¶vÿenþ×XÚö/öŸmûÿ?çð€?øsþßNþ¯õü?âèÿ}ŸkŽù¿´í_ò¿ØÿYÞÿ­ÇÿÈ?äö?ù?äÿ`ÿcÿÃÿð?ùäÿáÿÃÿ‡þGÿÃÿð?üÿKùÿëëåòñ?žïÅ)ÇwÛæÏÏ¿û×kãëG}àß þóÂß¶pü§þó1~<Þ]?êsøòß:þÛvî¼ma?¿_±ÿû믿¶þ[žßÞ>mðÃùß¶sÿç°L>ô¿ýçÂ×–ÿ×åÏ·O=ÿ;¯Kò_gÈÿUú¿ûë7eOÇôóáÍœÿRÿ­óúÙ¶öñÏǹÿVšÿ{ð«—Þ_oý·æÈò´õŸÿóó?}óÿ|ÌÿxüóQo[þ±ÿaÿk~¿ýîs¤ë߿ߜýWüü>ÿÇ}:ÙÿõËÿ²ýÕ{þrÝýMû¿‡þ:óÿYëï~òÿþ?üŸâÿÃþƒÿ¡¿]úkûW¼nÝÿPžŸ¹þÏû­ÿëñ—Á¯Ý¿ìÿíÿHãÚöW?þáüõ×óÑÿYÍÿß›eÿ¯ÿ³dÿ£ÿÉÿÒŒ_¯¸ÿ·ÿÇþ³mÿÿ¶?ù¶ã_£û½Ï̪Ûÿåøçy|èÿó½scúyîþoµýÿ -ü¿vþ³õü?âÿŸäÿ]Ñÿ÷ÎýW¿ÿinü‡üòÿW²{í?iþ¿vüÿÿ˜ü›ÿ¿ýOüÿ Ïëåê1´}î}õÞO -_ú{ðøÇò%–Ïéë±üÇÿOÇÿcø5|jãÓ×Ýó×ðƒß{èýuèötãsõ‡Îõƒ\-©ó}sãבRü¥ë?=ÒùOÕúýNíëc}æü±ÿ@ŽÿaŸÿ~§à×ñ/ß¶óuÿùáøß6ÿ󮧼ýÔ üû ëæà‡¿{Õ,}Œ¿Ïßoü3þéç‚þÒü)ýµíÿþµõ'õj¯íúç+¬ þÒõ¯_ÿýüדÿµøÇ˜üm°ÿCÿ[×ÿÐß.ýñÿÿ©ÒŸë\Ïð¿tý·ño/üyüÿéøŸã?ÛVÊ¿:çOŽÄÂç+Õ›i™¿Úør=›^üÏñ£ú«¿¿Ê×ƿ¤ô—Ê—±ù—Œ??¿æúÓ–ïÖÏ? ÿuëÿéËêhž^aý[>ÿýý/±ßgØÿºöîókÏÿ˜ýîn$ëßí_¶mdÿÕ6>>óÓ¾?ká?Éþþ¿#ÿÏ“ÿëíÿmÉ?ëþ]üøÿðÿYöÿÉì¿ôúsýÕÛø¿Ì/ýö×ùüîÿcÿcÿÛ¿Rþ¿§ý þàÿ©ø¿WÿkË©þOÿ«ïŸ ?ô×¢¿;ÿ×»zÑЯ‘Ö_z[ñçЯ/õû}|ïß_»þ]Œ_ü|©ën}Ï”ÿRøùññu|‰þ!¤éœšGÿzýMŸRðZñ//ýÉê?¦ë¹yi©?¸JýGþÿù7¶þãy›1ÿ©ùõç?æËòû_=þÌøÛÆÿ±ÿ?gÿW•¿_×^ÿÖõŸ6ý¬¯¿ûÈÿyñíø/òú¯ûûÿ?ô¿ÿK£þ×Ýë_IëŸê×ÿÔ¦¿uüµ×¿ÔÿíÇ‘þ~Îßûû­¿Ÿ^ÿÿÕõŸëø§â•?sýÿþýzá§æ?ÿû¦Ë ÿ¿TþÕü©Ï¿ßïòÿ­¿ûù‡þ_ƒþcñg)ýבÿ)üëëožü×ÖÿØÈ?{òùÚç3ìÏûõŸ·7Köç<úKáý~ÞþOªÿuìô¿.ÿŽü“êý¿uù‡þ×õÿ•óŸÇäïÌüÿvý#õÿ ÿÑÿøÿñÿãÿÇÿOÿ#ú¿ƒ?øÓÿþ/ÐúÓÿ›þß×ødç_åøëîÿàøß6ÿÓÿײýø ûúOžûyÖÆçúj÷þ™þ¯ôÿíÏsô õGmü9þ³Âú—äÿÍè~¿ü¿™ó/ƒ¯ýü6åÈÏý;&Ýý®îÿ÷ùû?]úÍûxiÿ˫ן¶ý‹ýgÛþÃÿOü‡þàþôÿ¤ÿýèÿc­ÿý¯mËÿ}oé_ï׫÷ëÜÏèÿ®+ÿëø×Ö_n^byä¾çSsýkó?òù‡ýo·ÿßÝñÿ¼þߨÿôÿ„ÿíò¿-üÑÿøÿðÿ¡ÿÑÿð?üÿ[ãòáùÌùÎÿæOJדvþ'ù_Ð_þ=Ï¿Ì;ÿ£ŸÿlýüïHýÿ™ç?Fêoµ¯×ß"ÿ_³þý -ç_8ÿÇùö?ìo-~æüõ,Ÿ¿Æþçü?òÿþ?èoÑÿ‡ýÿC»ô§þŸíÏcó?ÏÿyÏõ?ÿ•êÿĤñ¿ê?Iú?Í8ÿ§ëÿ—ÅÏäûÝøŸuûýo;þCý?Ûñì?Ûöñoä?ùvã_cû¿yõ_WèÿJýêÿ“ÿGüßjýMÿŸöþKÚÿY~þ•üòÿ×Èÿ±ÿ¤ùÿ+ÔÿÇÿOÿOËý_~ö×oX¿ÃÍß™ÿ] òx·þãýðüuà¿Þ]”ðÿñïß¿ÿôxW9¬³|èý5è¾v¥ƒïlÅãw!üòxÿ{Wì“ð¿ûü‡ïÛ–þËýn6þ1Ü^üsÏÇþ‡ÿá»øcÿûã_*¾ÂÿÔñÖ÷g¾Ü¶¶ÏÒù_Ãþ¯ã_~~½ù~ïõµô¿ôùï7ÿèäÿ:ò_OþâÿCÿ[ÔÿÐúãÿ·(ÿ%ù?-ðýþ§çü«3þRø©üð'þ üÒúwúÊõOñóÃjñŸüþË¿¿ËÎí¿Jý_ÚäoªÿK]þJãORù¯·ÿC©ü뇟Ã?_‹ÿíûÜõÓ?ìÿízŒoÛÚúïï'u½ßþŒÇûçJøÂÇãÿï¡ÿ¶¥åÁøþ¥þï—ÿcø·ïÿÒøçço…õo=þFüûÛºýÛï£ögŸý¯eÿHñŸoÿŽÎ<žü?òÿàòÿz÷ÿVäþoüøÿðÿYõÿͱÿfå_iÙ_vùûŸü/àøÀ'ÿ‹ü_èÏù_íó?Ú矬ŸÿíŸ;ÿÚö?çÿ8ÿÇù?ÎÿÙËÿ"ÿßvþ?ö?ñâÿÄÿ‰ÿÛÔ­ñÏvù߇¿VüŸóŸVéOüûÿ/ô·Jÿ¸ÿÄáz}ޝ‡ý'>uüïwªN[ÿÔø\ÿUá[ŸKë_ê?–¾çå_þïðÿ<ÿ_û]â˜Á%øñ_üü×úÿß³þèMøsä—TÿhËÿþãÏÿÎùƒÿÈ?àËàk¿k¯ÿð½Õþ¼jþûá—Ç—¾Ÿ³ÿ›»ÿÔ¶ÿíéÿµøÿ~òïîóoWþ±ÿ[Ïÿ÷Nù;GÿHý?èô?þüÿøÿñÿãÿ>ð¯ÿiÍ?º¾^üÇ’ü‡þèü/øÿ±ÿáøßªÿÿ¿UûßÃñûú÷]æŒÇï{y¼þ¾÷ù?søów\wÿãó?yúKáÇãÉÿ#ÿ¯¾þŸÖϽïm÷Ó[ÿÖãÿ9úÄgäGõ›ü“Âϯéëò_ÚÿOªÿóýËÚôÿuýÿlìÿV¥Ëú¿¶ÿåØúëí¨mÿbÿ‘ÿÿŸø?ð|òÇâ?ÒøÓZùÖó‰ÿqþŸó¯œÿgÿÇùÎÿ3ÿØß¶Îÿ“ÿCþö?ùð?ùäÿáÿÃÿ‡ÿýÿÉç¿àøþ·Çÿ__¯|,?ÿéèÏòzÒã»móý›ÿî÷º¾máøžþøãúëû°ÿË¿çÂÇo[?œð>ÊÏïFáü•áoÛ¹ÿÑÑŸèõ -ûù}Nf¬ÿ¸or ¿¶þÏÏ?Ø%õ} -/¿<ÿ¹yi…ýµé¿ïsáÇpÂþ_ñ|jËyþ·,ÿ9…x=ÖÏÏGßø3=sò_gðߺýÿBz•úÕ—és¶¯Jóÿîþ)þù¡„_J”îw¾ÿŠë_z~¦}¼¶þ»âùï4ÿÖåûöÿ–ñ¯íJû¥9ûÝý—õýŸvÿsýýöÿ(ýgÈ?íþ×ÈüøÿðÿYõÿaÿYçèo™þ5ÿl¿ÿ±Ïÿ«íÿÄÿ!ó_^q]Ûÿ¦ÿ;¯Kã?ÒøŸ¶ýwŽ?¥ûåüçõøOù]ßÿ¿ï#ñ·YöÿŠñ?Kö?úŸü¯žxõ¶Íÿ¯¸ÿ·ÿÇþ³mÿÿ¶ Ÿü?Ûñ¯ÑýO»þïËz½;mÝÿL/Ùÿχľ‘îÿVÛÿ¯ÀÿúñKùÄÿ-ûWôÿÉö_û.ñ¿õèŸñòÿÉÿ_)ÿ¿×þ“êíø+þÿù—ž¯+ò¯·ÿ‰ÿ×~!?aÿ£?Ñëå>‡¿{Õ(}Œ¿Ïßoüxü×Wú¹Àümã/ÝÿHñ¯íjø_}þg ~ûþúCmúkö?¼;þ3Öÿºýëþ·9øëöÿƒÿáøß&þìNø7|î}⦅¾ô÷ìÿZýÏRú¯jÿ?mëIÿÐ^ÿeù?Ú¸½ÿóÚú¿ŽÿŒõ¯ßÿýü_KþËäï¼óVýè;úúCüÿÈÿvú»õã—_Îþ½àSÿÑFþo.ÿÒÿý¶µÇÒõÿúÏ_‡ë¿¥~Uéüõèù÷Yç¿õÏÿŒÓ†ü…ïðoäÿÅõÌt×ߊò¿ïüþç]·^ÿ±/]6ÿÚü'ÅO{þÞýúúÔ?¡þö¿vÿŸßïû«×þ×¶$økß1ÿÔÿ¢ÿüo¹þ‡mùgÝÿ‹ÿÿþ?»þ?‰ý7£ÿ~ý_øûŸú¿øÀü‰ÿÐÿÉZÿ'èÿú¿øÿ¨ÿg³þŸõú¿2üg¯ùüÇã©ÿKýß™ûòï? >ö?ö?ñìâÿÈÿ6ù?7þ»bþ7þ?èo%þýÿC›ô§þõW¤?õ/ß_ÿoÜÿ<^ÿo…ú/%ü[êïÉýÿkÔÿ£þ·½ú?èê?RÿÍný7ì?äûÛòÅúßkÔ?·Þÿ§¾ÿ›Sÿ|=ûŸúÿÔÿ§þ?õÿ-éÿ•üï¬ÿ_òÕÖßœüô?úÿ?þüÿøÿß­ÿ¿ýù=àåæÿ¬?ýã¾ó¿O÷éŸ/…ŸÒáððI*_¾ò)'ÿÏòSŠÿ!Ÿ¿Sðëø—ÇoÛùzøüeüÇà¿>ççÏ·ÿ¡?ô_Cþù{ÉòçÞ¿¶ûÝ©üŸ7ÿ=¿÷ÏÔlÛy|êº[ß3ù? ¿†Om|êºÿüð?üo™ÿÁß¶ý?ÿñýw¿ßíãÿsìÿÑ„?BÿO/óÿ¥ãîûúükÛÿ²øÏŒú·«ÄbZžÆ¿ÿýnÿþ÷{¥õߎ¿ïw—®ÿø~ãðóãýë3ôÿ5ô›ý<ï~~;òß_ÍÓÿíò××ÿÒúÖ÷Úô™ÿöñõù×^ëØßØí?üÿÄ$ô—âßB¿^øóèþào_—•?§þêñ•r|æ\/%Uÿ9i|Póùôÿ>üSø+¾øß…Ï÷Ÿj‰_µÀ—Ç¿¤ô—­ÿm“Îßóž?oýÑ_‡ÿ¥öÿ ûW³þ¥uù¯ÝÿM[þËú¿¥û¸yié?x¿ú¯3ùù‡üÃþ_ÇþŸaŽØÿ÷Ç_Jììøþ×廸£ÿñÿáÿCÿÛÖÿð?üÿÛáëùŒçü?çÿÇó'¥ëO;ÿ“ü/è¯ ÿŽç_fžÿYçüŸÍó¯>½ÂþìéýAžþÒüÿöóÿµýQÏuòÿgKßrþoó/œÿãü?ûö¿¶Æsþ‡ú?œ¿Fÿqþùÿÿô·åÿÃþƒÿ¡?õ_¨ÿg½þÓ¼ú#=þÏ;®ÿ™ø¯TÿOÿ‹ÿ­Sÿ)Íÿ>¯þŽÿ_?›gêÄÿˆÿ£ÿ©ÿLý?âÿØí?âßÈòÿìÆ¿FöÇïæÖÕéÿCýêÿ“ÿGüÿ¯ŽÿoúÿRý#ÿÿOþ¿nþ¿ÌþËÿ_§þ?þúZ‹ÿ¿žèEÿãùÒ×ÿ¼þç¾M_¯Ý?/…_»ïó?ø.þ¯Z$aý“òçð%Åÿü -áÕð¯¯¿ÊøöÃï½?ô‡þ:ô×®xwü¥ë½ú×µúWçZWsðשÿÿÃÿð¿]ü­Ûÿ‡/æï'ô_æà;ÿÖËŸxÜ?ÿ|Äø×Ïôý~.ü3þ!|èïÓÛÎýorú*îs#¥¿¶ýß‚mýåæ%¶GÜ÷á|j®íþ7+¬ þ3äßûÿ ÿ‘ÿÒõöM›!Ïò?-—Ùÿ¡ÿÑÿÐß.ýñÿÿ©Ú?\ç:ñÿµÿGâ?qÿ’ñó—cò·o|Ùž‘õ‘Êÿ{ÆÿúèSßÿ÷οdüùù5ן¶|óÿ»|âØ¾Ï/ûÿõà#ÿGöá~F:ÿºòdÿ®¿–ù+ïÿîÆóüßÄ?‰bÿß-ÿ¥½~j[þ¦ý£ûüÚóOþùð?ùVåŸuÿ.þ?üøÿ,ûÿdöߌüÝø?üýý¯uþçîç_Àü? ÿ÷êmù/Õÿiøáwõýô‡þZô—ÖÿÚ¶ó÷ÏGº¾Ôó‘®gµÆù—±úWó俾´þí™þ!¤é,­æó@ -^+þ¥ñ¥¿óù¯ÿ·¬¿×{ŠÿŸ3ÿk¯mþÿù7^ÿïù˜;ÿ©ùõç?]ÿΦüÃþW?3þ¶ñìÿÏÙÿIû§]ÑíëߺþÓ¦Ÿõõwù?/þ¯ÿEþCÿµàcÿaÿáÿ‡þï÷ÑÿÒvÿGú¿Z\ÿôÿ¡ÿý¬öÿAþ¡ÿeõ_çõÿÕ–ÿÖûÿbÿ!ÿìÉ?äÿ¬þ×cöÿ:ë_ÚWJÿûôÿMïÿ¤ú_ÇþGÿëòÿçÈ?©þ×Ùÿ[—è]ÿ_9ÿyLþÎÌÿo×?Rÿúýÿÿ?þüÿø?ÀüÁÿzü¥çŸæÉýo]þCôÿÿOû~t%ÿŸuÿö?üÿãÿò¿[ýûú[Ççâ_šðGèÿIãÉÿÃÿßÿÎùókãsñÿ5Ö?ñÙg)ýf?Ï»ŸßŽüwëy¦þo—¿¾þß¶öçÏÕŸãü‡ýGæ¿}|}þµ×ß:ö7öŸEûÿ?þ?â¿àþÖãÿÒøÏ˜yùo3ÿ—øû?οÿaÿÇùÎÿ#ÿ°ÿ­âOþùØÿäÿÁÿäÿ‘ÿ‡ÿÿþ?ô¿ó_ð?üÿÛâÿ×½èáã<×¹~¾îäçëîÛôõÚýãñRøµû÷>ßgãÿêEö?éù,]_ÒûKŸ¿~<µWíþÐÿ^ôŸ _S¾Ëó¿åùÏ__¯|f|îùýûÿƒ\¯?®Ÿñ—å¿JåÿJýŸ\ÿú|ÿ«ø÷óçÿÝý÷¾>þ9þL­¿ÚxÿzÌÿúë_šÿ!ËÐÖRüû‡óÌsëü?sç¬þ©Eù‡ýÏþÖúõ~û5|I×Wm¿Ô¿ÿ*?oÿþìs÷Úý‡õ÷?Öí]úY_÷”ÿøÿðÿáÿûÿöüý-ÛÿúþGMøÖí¿±ùŸçÿ¼çúŸëÿý÷ï\øgüCøóâ?ÒøŸ¶ý5†8ÿ.Žäüø±ü/ÅÖòÿ÷ÅÏæïÿßÿ#þþ·ÿi‰Çò*–gÒù×–ÿÖãÿØví?âßÈòÿìÆ¿$û§ÿ%òïØŸl[»ýŸŠ–Æ×£ÿèÿ¹û¿Õöÿïäÿ{æ?[Ïÿ#þÿIþ_MÿŸþþkÄÿ4/þCþ?ùÿ«åÿ÷Ø3òÿ5ã¿øÿGøg^ü_Çþ'þŒ?êHÆï_™Wîwµñµï|à¿~Úÿð|ääKì¸~ ÿ¶ýwÙÿ¡ úCmúŸëOÇõ«ÝÿÇê_çëOßÿ»Ïzÿïßœÿ ÞÌÁ?¿ŽËþ³´ÿÿáëüoöiøÖß­ïÿœ±|]:Ï«Úÿ­øiÏߌùOË_'gãëÏǼñëêÙóßeþÑÿÈÿåÿ»ä/û?ô¿uýý¡?þËòßöùgðçÿ«ùø×Ã×Ìÿ‹óææœ¿8çÿ¥óòÒùw>^µøW[þ_üžøÛŒø—îùŸÔü·ç_¦ðOçÿ¹çåüO]ÿ…öë¾Ëö×µû?sáïû¬ý¿ùZÿÕÏgy%¡¿¶ü¯á[[¹yiÏ׿öumþ»ûü!ÿ€Ýùßyý?îyþù“Îÿ¶îÒû•9ëo|ÿ•¶ÿSãKöÿ~î|Ó˜ý_¶?àmþß_±þµ÷ÿÖäõ?ñÿáÿÃÿg·þϸý7cýiÛ_ð?ö¿mû_}ýøÀ¿¡üüëäÿjð¡?ô× ÿùýïç×ãøTîzˆÿ¼ñáûq®ÄÍ¿«•åßÿªùï‡_ï¿mþ¹™,}:ßçο_qÿx|íûó> ‡_mýµŽÏ}^cýkóÿýäßÝçߺü³kÿëÆÿôãßÖñÇþ·mÿï{(?ÝúñëÃŽË_ÿþ¿ßáý×YÿvõßúKåß¼õoÃý§ÿ׎ÿ"ÿ­Ó¼þ{ýÃøÜûûÿ?ô×£ÿŠõ§îQÿJ»þæuð­Ï¿¥õ/õKßuë?Ëñ“úÿµß%þ‡yõÇÓðã¿øù¯õÿ¿gý!ÿÐ?«Õÿï—_Rý£-ÿSø?ÿ;çþCþ!ÿ€/ƒ¯ý®½þÃ÷Vûóªùï‡__ú~ÎþoîþSÛþ·§ÿ×âÿûÉ¿»Ï¿]ùÇþo=ÿß;åïý#õÿ ÿÑÿøÿñÿãÿÇÿOÿ#àøô§ÿ ô‡þôÿ¦ÿ÷{ãÿmù§sð×µ¿áøß6ÿÓÿ×öþcßÃñµÏ½ï½÷“—þþø;^îóØü»û×î7~<žþ¿ô-õŸwý‚ŽõÆö]ˆÇ×ùÿë_?™3ÿÚñŸýýy\Õÿyù—~þvøiý¯éëò¼ÿŸTÿ×ú—ÕôùÕýÿ¬öÖ¦ÿ¶µ­ÿ«û_Ž­¿öþ‡Úö/ööþâ?ô_>ð­öÿ¤ÿýèÿcµÿý¯mËÿzÿúò»tþµùOŠŸöüÁÈ?äðïÚÿïÎøbÿEìúÂÿvùßþèüøÿÐÿèøþ‡ÿ-ñ¿õüGðçü çÿ÷½œ?y|7šÿUÎÿÖÏÿ$ÿ×6ý÷}.ü˜þûÂw÷_ãüËzçÞ™ÿÌùß\ÿËð|Pª~ÙŒüÿRÿ»úùyÿ;ëùÿšçÏÖ=ÿoéüçÿ9ÿÏþŸóÿœÿ±Yÿgüüw›üu÷÷m®uö?Øÿœÿçü?þ?üøÿìùÿ°ÿ8ÿ ýmÒŸúø?V¨C²šÿÍÊ»4þ#ÿ­`ÿIû?IÏß­Rÿ/?;®Öÿ®íÿ׋ÿY±ÿÑÿäQÿÏnüû϶ýGüùOþŸÝø—´éœýçzý¨ÿOýêÿÿ·ÿ_Ñÿ÷Îúÿý3çü+ùÿäÿkÚ¿sú×êíø/þúÚÍÿé{<_Žþçùc<ãÿñq]’tý—sý”wÁ¿úùµáCè¯+?Îï¿ßï¼~wüï=ÿÒ?9ÿ×îíóÃÿð¿eþ›öÿ½ëOËáCÝú¯ÚúW¿þè*ü¾çä§ÿ»~y¼ÿýJòwþwŸô?ò_£þ·®üµ¾ÿCÿ£ÿ¡¿]úãÿÇÿçÎwçsç?ÇàÇãÝù¬ôx)üTþøÿf|iý‡{ÅÒçÞøŒ?þ•‹z¬Ï´üt¿o_ÿ¥ñmò_’ʽýïúËäß¶µÁo‰ÿµ<ïù÷óÖ_Êfv÷?ðÏëÿwÊYý‡6ûÓÝÿLÿrþ÷üžüoü?1ýKëlÿW¢¿¶üÇ¿}ÿçãó¿öú·#þ‰ý‹ý_¶Ï[ì/©ý¯¿ÿ—â/ÝÿÏ›ÿôü’ÿGþüOþ_?}>]þáÿÆÿ‡ÿÿŸEÿß<ûOzþD;þk—ÿ±ÿ9ÿÃxÆ3žóÿäqþú[ÌÿÖ9²Nü˦ÿ/GÿÒ^9õ;yþ±ŽýOþ?çÿ8ÿÇù?âÿäÿ[ÎÿÇþ'þOüŸø?ñÛú¯ÿ‘_mñ_íø?ç?­ÒŸø?öþèoÕÿ¯ÝFþ1Þ}ÃŒ¯Öxëóo}ýKýÏ~ÉïGãè^¿/˯:ý®öÿçð˜éÿÿû©Ï_mžåó?æ?ò_ûýÓ×úo®_È?ô¿6ý%ñgéü¯#ÿµúÁÈ?äãµ×¿Žý¹Îú—þIé§ó7oÿ'Õÿ:ö?ú_—ÿ?GþÝ}þmÊ?ô¿®ÿO[þÎÓ?Rÿúýÿÿ?þüÿø¿€|à¿SÿëÄV°¿°ÿ ?þ?›þëþ?íýÿ¼ý×õ'àøÿóùümÛÿûŽ?¾{}ޝ‡ðsÏ_¿ïåñRøñø¿ŸòøþÇü×GçßÝÿøüFžþRøñøûÛç§ðzhÿ·Ð¿6ÿ+ÚÿÒççüIÇ;~iûÜûÞv?½õ?Š×\úé½çèóû}>O?¢ÿÛäŸ~~|Mÿ[—ÿ¹þá|ŽË¯šþÏõ?kÕÿùñmò×úþoUú·¬ÿýïö}îú{>Êóçî·†ý‹ýgÛþÃÿÿøÀ>çÿ­åÿZÏÿ#þ‡þ×¶?Wo=ÿ‹ýŸýüÇüc[‡OþùØÿäÿÁÿäÿ‘ÿ‡ÿÿþ?ô?çÿáøþÿ\þÿúzåcùùOG–דßm›ïßüw¿×õm Ç¿ðôÇ×þ$®ÿËë÷sáÇãÝõ£>ƒ?ÿàÿ|”ŸßÃø+Ã?ú¹þÅ®?ÑÑÉõ+ -ûÏXÿaßä3üÚú??WüüaÿåÔ÷)¼üòüçæ¥>ôצÿ¾Ï…Ãq÷Oͧ¶ü—çËòŸSø‡×cýü|ô?ó×ó1'ÿuÿé÷?¯ÿОNÓ߇W¦ÏÙ¾*Í©ÿ^ þéþŽÿž:ÿÇüPÂ/¥?J÷;ßÅõ/=?Ó>^[ÿ]ñüwšëòýûËø×ö?¥ýÒœý‡îþËúþ/oÿŸûÉ_ÿ÷^aÿƒý?Jÿò¯tþwlýõÿEþãÿÃÿ‡ÿϪÿûÏ:ÿCËô¯ùgûý}þ_mÿ'þ™ÿòŠëÚþ7müßy]ÿ‘Æÿ´í¿sü)•–÷Ÿ×ã?åw}ÿÿ¾ÄßfÙÿ+Æÿ,Ùÿèò¿zâÕÛ67þ¿âþßRüû϶ýGüÛ6|òÿlÇ¿F÷?íú¿/ÿéõî´uoü3=¾dÿ?ûFºÿ[mÿ¿ÿëÇÿ-åÿÿ·ìÿ]Ñÿ'Ûí»ÄÿÖ£fÄÈÿ'ÿ¥üÿ^ûOª´ã¯øÿ[ä_z¾®È¼Þþ'þ\?ú…üý„ýCŽþD¯—ûþîUO ôý1>ü>¿9ðãñ__éçð·¿tÿ#Å¿¶ÿ©áõùŸ1øíû?èýµé¯ÙÿðîøÏXÿëö¬ûßæà¯Ûÿþ‡ÿá›ø³ÿ9áßð¹÷½÷~RøÒß³ÿkõ?K鿪ýÿ|´­'iüC{ý—åÿhÿáöþÏkëÿ:þ3Ö¿~ÿgô?ò-ù/“¿óÎÿYõÿ¡ÿíèèýñÿ#ÿÛéïÖoŒ_n|9ÿø÷‚OýGù¿¹üKÿ÷ÛÖ?J×ÿë?®ÿ–úU¥ó×£çßgÿÖ?ÿ3Nÿòg¾Ã¿uü‘ÿ×3Ó]+Êÿ¾óûŸwÝzýǾüuÙükóŸ?íù{ÿõëëPÿ„úgØÿÚý~¿Gì¯^û_Ûþ‘௠ÆüSÿ‹þ_ð¿åú¶åŸuÿ/þ?üøÿìúÿ$öߌþ?úõáìêÿâÿð'þCÿ'kýŸ ?þ?êÿâÿ£þŸÍúÖëÿÊðŸ½þåó§þ/õgîÈ¿ÿ$øØÿØÿÄÿ±ÿ‰ÿ#ÿÛäÿÜøïŠùßøÿ ¿•ø?öüýmÒŸúÔ\‘þÔ¿|ý¿qÿóxý¿ê¿”ðo©¿'÷ÿ¯Qÿúßöêÿ ÿ©ÿHý7»õß°ÿìlËÿë¯QÿÜzÿŸúþoNýóõìêÿSÿŸúÿÔÿ·¤ÿWòÿ½³þÉÿU[sòÐÿèüÿøÿñÿãÿ·þÿýöç÷€—›ÿ³þ8ôûÎÿ>=Þ§j¼~Jÿ…cÀüÁÿ%©|ù~ȧœü?ËO)þ‡|þýNÁ¯ã_¿mçëáó—ñƒÿúœŸ?ßþ‡þÐ ùçï%ËŸ{ÿÚîwwü¥òÞü÷üÞ?S³mçñ©ën}Ïäÿ4ü>µñ©ëþóÃÿð¿eþÛöÿHüÇ÷ßý~·?üϱÿGþý?i¼Ìÿ—Ž?¸ïëó¯mÿËâ?3êß®ÿ‰ýýiyÿþ÷»}|üûßï•Ö;þ¾ß]ºþãûÃÏ÷¯ÏÐÿ×Ðoöó¼ûùíÈ?~5Oÿ·Ë__ÿKë?XßÿiÓdþÛÇ×ç_{ý­ccÿY´ÿðÿÿ‘Ð_Š ýzáÏ£?øƒ¿ü}]Vþœú«ÇWÊñ™s½”Týç<þ¥ñAÍçÓÿûðOáw®øâ>ܪ%~Õ_ÿ’Ò_¶þ·M:ÿ}Ï{þý¼õ7Fþ—Úÿ3ì_Íú—Öå¿vÿ7mù/ëÿ–î?àæ¥¥ÿàýê¿Îääòûû†ý9bÿß)ý±ÿ±ÿáø_—ÿíâþÇÿ‡ÿýo[ÿÃÿð?üo‡ÿ­ç?2žóÿœÿÏŸ”®?íüOò¿ ¿&ü;ž™yþgó6Ï¿úô -û³§÷yúKóÿÛÏÿ×öG=×ÉÿŸuþ-ý}Ëù¿5οpþóÿìØÿÚÏùêÿpþýÇùä?þüÐß–ÿûþ‡þÔ¡þŸõúOóêôø?ï¸þgâ¿Rý?Yüg,þ·Ný§4þ5ÿû¼ú?:þiülžý©ÿ#þþ§þ3õÿˆÿcÿY´ÿˆ#ÿÉÿ³ÿÙÿ¿›[ÿU§ÿõÿ©ÿOþñü¿:þ¿uêÿKõ4þCþ?ùÿºùÿ2ûo,ÿúÿøÿéÿi-þÿz¢ã©ÝóüÁu®sý³¯K_WÿúùµáCè¯Eÿ6û¥–?9>þîøß}þÛêWåë§Íÿÿºç‡ÿáøß&þÖíÿÃ_õ÷ú¯rãëåO<®×Æ×Wƒýã¾5û^Ò©ßIç_Sÿ¶à_[¹yIÁI}¯Íçþ3ÏGN~Žõ¿É÷ŸYaýKð¿ûü£ÿ‘ÿšò_[þ²ÿCÿ[×ÿÐß.ýñÿÿyåb„ùG~BúúìûÇã¥ðk÷ì_®§ÏOÖúŸ¤úçŒç?¥%¢ëÒ²þkãËú_’Û+øÿÇé/•ÚýŸÒëEºþzï¯'ÿ\ÌÐ~Ìó?ÝýÏôOÙ¿Røgüñÿ—öÿaþzi½Žíÿòô×—ÿuük믾ÿóó¿Ïó©¹þ­Ç߈bcÿëõ?Ö·døÏ³5û¿’ÿg;ÿÏ:ÿ[Ïÿ³+ÿ¬ûñÿáÿÃÿgÙÿ'³ŸfèOÝø?üýÏùŸ»ž?a<ã¯'ÿßÿêç׆ý¡¿ýÿS÷*zÏÕWŠë¹ó%åñþ÷qýÕ5οäëCµ]—ÒO -ìzŽþ!oä韧ÑÿmòO -??¾¦ÿ­Ëÿ°ÿ™¯?S×ûåWMÿÇò³WÿçÇ·É_ëû¿Uéß²þSóŸ:ÿ^šÿ}Ÿ»þžòü¹û­aÿbÿÙ¶ÿðÿãÿ>ðÏùkù¿Öóÿˆÿ¡ÿµíÏÇ[Ïÿbÿggÿÿ1ÿØßÖá“ÿCþö?ùð?ùäÿáÿÃÿ‡ÿýÏùøþ‡ÿ?—ÿ¿¾^ùX~þÓÑŸåõ¤ÇwÛæû7ÿÝïu}ÛÂñ/<ýñÇõ£?‰ëÿòúý\øñxwý¨ÏàÏ?ø?åçw£ÆðþÊð~G®±ëOtôCrýŠÂ>Ç3ÖØ7ù ¿¶þÏÏ?Ø9õ} -/¿<ÿ¹yi…ýµé¿ïsáÇpÜýSó©-ÿåùß²üçþáõX??}ãÏüõ|ÌÉÁúýßÏë?´§Óô÷á•és¶¯Jó_ê¿×‚ºÿŸã¿ç£Îÿ1?”ðKéÒýÎ÷_qýKÏÏ´×ÖW<ÿæßºücÿÁþß2þµýOi¿4gÿ¡»ÿ²¾ÿËÛÿçþÃcò×ßÿÄýŸWØÿ`ÿÒ†ü+ÿ[}ç‘ÿøÿðÿáÿ³êÿÃþ³ÎÿÐß2ýkþÙ~ÿcŸÿWÛÿ‰ÿC濼⺶ÿMÿw^—Ƥñ?mûïJå£åýçõøOù]ßÿ¿ï#ñ·YöÿŠñ?Kö?úŸü¯žxõ¶Íÿ¯¸ÿ·ÿÇþ³mÿÿ¶ Ÿü?Ûñ¯ÑýO»þïËz½;mÝÿL/Ùÿχľ‘îÿVÛÿ¯ÀÿúñKùÄÿ-ûWôÿÉö_û.ñ¿õèŸñòÿÉÿ_)ÿ¿×þ“êíø+þÿù—ž¯+ò¯·ÿ‰ÿ×yñâe÷Ë—X>Ô®_ ÿêç׆ý¡¿æË¯­”ú>þÿ¹~lüÝñ¿ûüûõ½üõ™ó?Äþ9þeøW??üÿÛæÛø[õã÷Öß×¾¯¯ßúKê’ο¶þ­á_[Rÿ›öú×®?ºÂú—à÷ùGÿ#ÿ5å¿¶üeÿ‡þ·®ÿ¡¿]úãÿ'þãçÆù‰éë½ó[»<^ -¿vÿÞçûtü¹nõºëÖ{Êå_žó§Zâ/þø°þ_ºÊLþüg -¿ÚøÒË=úû–ø‘ä%_Í?N©üKÏ ~ÿÒøóš-¯éú뽿žü·~þù¯[ÿO_þSÿC3ÿx…õoùü7ö1öl_•Î_ŽÙŸeû_×þ‘á?Ïþýýž7ÿ©ó¯µýCmÿ“·Ÿåëo|ÿ5ãùk¯~Òü¯Íÿ×å^ þþß–ü³îÿÅÿ‡ÿÿŸeÿŸÌ~š¡?5í/øûû_}ý1žñŒ¿¡üü«Ÿ_>ô‡þô?×¹z½ç*Üx·WôëK¹úJåñþ÷îùôëßÅøÅÏ×~]J?)ü±ë9ú‡¼‘§ó¬ù¯ýÕðýÓ¯?¦_ÿQ“ÿ?GþÝ}þmÊ?ìÍøßñoëøcÿÛÞÿ¹x‰³ _ë'}½W¾Öî¿Âú·¬ÿæÐ_*ÿæ­¿ôúªáþ{ü_;þ‹ü‡þ}øÐ?ž??ÿûûÿ?ô×ôiÖŸºwý«û·>ÿÖ׿ÔÿìÇ‘þ~ÎßÇ×ãïuë?×ñÏá1Óÿÿ÷SŸ¿Ú<ËçÌ0¯þxíþé¿ký7ׯ?äú_›þ’ø³tþבÿ)üëëožü‡ÿÈ?Æk­ûsõ/ý“ÒOçoÞþOªÿuìô¿.ÿŽü»ûüÛ”è]ÿŸ¶ü§¤þô?úÿ?þüÿøÿéÄ‹/ú¿ÓÿúCúÓÿûÿÌ~•ã¯kÃÿð¿mþ§ÿ¯å×ßëÿãü‡ÇßñrŸÇúOºû×î7~<>ßÿ2¾ÛçÞWïý¤ðÛOÿWúÿ>ÿçýߌÇÜýýžc«¬IüeÎükç?9úó—£ÿ˜þÌÓ3­¿Ûá·¯éëò¼ÿŸTÿ×úŸÕôÿÕýÿ>ÿ§KÿZýúÚz¾ºÿåØúkï¨mÿbÿÙ¶ÿðÿÿ¡?"×¹n¹ÿ'ýèÿCÿ›ýèm[þÇuëSýë·­Ôç^:ÿºò¿Žmýåæ%'õ=ü‡üCþqÝbÿ¿»ãÿ9ý±ÿéÿ ÿÛ囸£ÿñÿáÿCÿ£ÿáøþ·ÆÿÖóÁŸçÿ]~g:2¾Þ›¿”_ÏÚùŸäAÿþcð{ï¯}þEïü~þ³õó¿Žþ~þ{®ÿ\\ÿ_~þ£Ü¿®~þGÚÿŽüÍóg+œáüçÿm¿Øÿ[ÅŸó?Ôÿ‘œÿn“¿ñø•Î?Sÿ‡óÿÖå?þ?üøÿ,úÿ°ÿàèo—þÔÿ³mÿi×Ycýëá¿Rý¿‘ø4þ·Bý'Iÿ§çÿtýÿ!}Óñ³ðzýïÒþ_7þgÝþGÿÛ~QÿÏvüû϶ýÇ ùOþŸÝøWmÿÛÏcù¥ù×ïÿJýêÿSÿŸø¿Eÿ¯¶ÿO»þ¿TÿÈÏ¿’ÿOþ¿vþÿ¸ý'Õ?+ÔÿÇÿOÿO«ñÿÿ=Hj— \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_0_027_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_027_states.bin.bz2 new file mode 100644 index 000000000..7b51fd6b1 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_027_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_027_states.bin.z b/client/resources/hardnested_tables/bitflip_0_027_states.bin.z deleted file mode 100644 index 365da6804..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_027_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_029_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_029_states.bin.bz2 new file mode 100644 index 000000000..b55556692 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_029_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_029_states.bin.z b/client/resources/hardnested_tables/bitflip_0_029_states.bin.z deleted file mode 100644 index 32da12571..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_029_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_02b_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_02b_states.bin.bz2 new file mode 100644 index 000000000..f22242565 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_02b_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_02b_states.bin.z b/client/resources/hardnested_tables/bitflip_0_02b_states.bin.z deleted file mode 100644 index 3cb26a7ee..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_02b_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_02d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_02d_states.bin.bz2 new file mode 100644 index 000000000..54170b83b Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_02d_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_02d_states.bin.z b/client/resources/hardnested_tables/bitflip_0_02d_states.bin.z deleted file mode 100644 index 84db51d15..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_02d_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_02f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_02f_states.bin.bz2 new file mode 100644 index 000000000..e20b10f3d Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_02f_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_02f_states.bin.z b/client/resources/hardnested_tables/bitflip_0_02f_states.bin.z deleted file mode 100644 index 8858e63b4..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_02f_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_030_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_030_states.bin.bz2 new file mode 100644 index 000000000..8042c6366 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_030_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_030_states.bin.z b/client/resources/hardnested_tables/bitflip_0_030_states.bin.z deleted file mode 100644 index a9643322a..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_030_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_034_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_034_states.bin.bz2 new file mode 100644 index 000000000..06fc562c4 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_034_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_034_states.bin.z b/client/resources/hardnested_tables/bitflip_0_034_states.bin.z deleted file mode 100644 index 959af96a9..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_034_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_03c_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_03c_states.bin.bz2 new file mode 100644 index 000000000..1a354ec8a Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_03c_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_03c_states.bin.z b/client/resources/hardnested_tables/bitflip_0_03c_states.bin.z deleted file mode 100644 index 7ee384996..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_03c_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_040_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_040_states.bin.bz2 new file mode 100644 index 000000000..54b71e2ce Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_040_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_040_states.bin.z b/client/resources/hardnested_tables/bitflip_0_040_states.bin.z deleted file mode 100644 index 372d2d4ad..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_040_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_044_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_044_states.bin.bz2 new file mode 100644 index 000000000..b268ec935 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_044_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_044_states.bin.z b/client/resources/hardnested_tables/bitflip_0_044_states.bin.z deleted file mode 100644 index ea9324375..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_044_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_04c_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_04c_states.bin.bz2 new file mode 100644 index 000000000..26977703d Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_04c_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_04c_states.bin.z b/client/resources/hardnested_tables/bitflip_0_04c_states.bin.z deleted file mode 100644 index 2bf23856d..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_04c_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_051_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_051_states.bin.bz2 new file mode 100644 index 000000000..3c889d07c Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_051_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_051_states.bin.z b/client/resources/hardnested_tables/bitflip_0_051_states.bin.z deleted file mode 100644 index 0b78915aa..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_051_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_053_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_053_states.bin.bz2 new file mode 100644 index 000000000..751724d3d Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_053_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_053_states.bin.z b/client/resources/hardnested_tables/bitflip_0_053_states.bin.z deleted file mode 100644 index 700af31b9..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_053_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_055_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_055_states.bin.bz2 new file mode 100644 index 000000000..1cf3f2ad9 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_055_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_055_states.bin.z b/client/resources/hardnested_tables/bitflip_0_055_states.bin.z deleted file mode 100644 index 307828e64..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_055_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_057_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_057_states.bin.bz2 new file mode 100644 index 000000000..099cc0e38 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_057_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_057_states.bin.z b/client/resources/hardnested_tables/bitflip_0_057_states.bin.z deleted file mode 100644 index 3e8d1b279..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_057_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_059_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_059_states.bin.bz2 new file mode 100644 index 000000000..fea5cf3e8 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_059_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_059_states.bin.z b/client/resources/hardnested_tables/bitflip_0_059_states.bin.z deleted file mode 100644 index 1356800e0..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_059_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_05b_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_05b_states.bin.bz2 new file mode 100644 index 000000000..4dd885ec3 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_05b_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_05b_states.bin.z b/client/resources/hardnested_tables/bitflip_0_05b_states.bin.z deleted file mode 100644 index efe41d503..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_05b_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_05d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_05d_states.bin.bz2 new file mode 100644 index 000000000..7ea71a9c6 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_05d_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_05d_states.bin.z b/client/resources/hardnested_tables/bitflip_0_05d_states.bin.z deleted file mode 100644 index 2830ce686..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_05d_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_05f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_05f_states.bin.bz2 new file mode 100644 index 000000000..bda71a64e Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_05f_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_05f_states.bin.z b/client/resources/hardnested_tables/bitflip_0_05f_states.bin.z deleted file mode 100644 index 890893050..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_05f_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_064_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_064_states.bin.bz2 new file mode 100644 index 000000000..3bec7c36b Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_064_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_064_states.bin.z b/client/resources/hardnested_tables/bitflip_0_064_states.bin.z deleted file mode 100644 index 05cd17e54..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_064_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_06c_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_06c_states.bin.bz2 new file mode 100644 index 000000000..ff80c2233 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_06c_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_06c_states.bin.z b/client/resources/hardnested_tables/bitflip_0_06c_states.bin.z deleted file mode 100644 index d787bcc99..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_06c_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_071_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_071_states.bin.bz2 new file mode 100644 index 000000000..6073d4e52 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_071_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_071_states.bin.z b/client/resources/hardnested_tables/bitflip_0_071_states.bin.z deleted file mode 100644 index 2d2f4a1c2..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_071_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_073_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_073_states.bin.bz2 new file mode 100644 index 000000000..d1ae56fec Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_073_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_073_states.bin.z b/client/resources/hardnested_tables/bitflip_0_073_states.bin.z deleted file mode 100644 index 552cff66c..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_073_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_075_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_075_states.bin.bz2 new file mode 100644 index 000000000..6c8258ae3 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_075_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_075_states.bin.z b/client/resources/hardnested_tables/bitflip_0_075_states.bin.z deleted file mode 100644 index e37d90e2a..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_075_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_077_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_077_states.bin.bz2 new file mode 100644 index 000000000..acaf1e210 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_077_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_077_states.bin.z b/client/resources/hardnested_tables/bitflip_0_077_states.bin.z deleted file mode 100644 index f03f0bba6..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_077_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_079_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_079_states.bin.bz2 new file mode 100644 index 000000000..427506dd8 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_079_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_079_states.bin.z b/client/resources/hardnested_tables/bitflip_0_079_states.bin.z deleted file mode 100644 index b05646ac5..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_079_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_07b_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_07b_states.bin.bz2 new file mode 100644 index 000000000..bcc281932 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_07b_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_07b_states.bin.z b/client/resources/hardnested_tables/bitflip_0_07b_states.bin.z deleted file mode 100644 index 184354a44..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_07b_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_07f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_07f_states.bin.bz2 new file mode 100644 index 000000000..b56e0f7a0 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_07f_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_07f_states.bin.z b/client/resources/hardnested_tables/bitflip_0_07f_states.bin.z deleted file mode 100644 index 87ac36ab2..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_07f_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_081_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_081_states.bin.bz2 new file mode 100644 index 000000000..c5426ace6 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_081_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_081_states.bin.z b/client/resources/hardnested_tables/bitflip_0_081_states.bin.z deleted file mode 100644 index b8f66386b..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_081_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_083_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_083_states.bin.bz2 new file mode 100644 index 000000000..3421417ed Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_083_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_083_states.bin.z b/client/resources/hardnested_tables/bitflip_0_083_states.bin.z deleted file mode 100644 index 81c4c59f9..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_083_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_085_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_085_states.bin.bz2 new file mode 100644 index 000000000..17f1aaeed Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_085_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_085_states.bin.z b/client/resources/hardnested_tables/bitflip_0_085_states.bin.z deleted file mode 100644 index e642accdf..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_085_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_087_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_087_states.bin.bz2 new file mode 100644 index 000000000..5b9302627 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_087_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_087_states.bin.z b/client/resources/hardnested_tables/bitflip_0_087_states.bin.z deleted file mode 100644 index 1a844e453..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_087_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_089_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_089_states.bin.bz2 new file mode 100644 index 000000000..9f37987c7 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_089_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_089_states.bin.z b/client/resources/hardnested_tables/bitflip_0_089_states.bin.z deleted file mode 100644 index d02b3c777..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_089_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_08b_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_08b_states.bin.bz2 new file mode 100644 index 000000000..0f42f9246 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_08b_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_08b_states.bin.z b/client/resources/hardnested_tables/bitflip_0_08b_states.bin.z deleted file mode 100644 index 9c546f94f..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_08b_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_08d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_08d_states.bin.bz2 new file mode 100644 index 000000000..f7e2d1674 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_08d_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_08d_states.bin.z b/client/resources/hardnested_tables/bitflip_0_08d_states.bin.z deleted file mode 100644 index e0e985fcf..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_08d_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_08f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_08f_states.bin.bz2 new file mode 100644 index 000000000..f66b803eb Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_08f_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_08f_states.bin.z b/client/resources/hardnested_tables/bitflip_0_08f_states.bin.z deleted file mode 100644 index f5b38b584..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_08f_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_090_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_090_states.bin.bz2 new file mode 100644 index 000000000..7f559b40c Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_090_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_090_states.bin.z b/client/resources/hardnested_tables/bitflip_0_090_states.bin.z deleted file mode 100644 index f901235a3..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_090_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_094_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_094_states.bin.bz2 new file mode 100644 index 000000000..bcdcbd26f Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_094_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_094_states.bin.z b/client/resources/hardnested_tables/bitflip_0_094_states.bin.z deleted file mode 100644 index f97d41f4e..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_094_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_09c_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_09c_states.bin.bz2 new file mode 100644 index 000000000..4b0316dc3 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_09c_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_09c_states.bin.z b/client/resources/hardnested_tables/bitflip_0_09c_states.bin.z deleted file mode 100644 index 7946dcf31..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_09c_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0a1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0a1_states.bin.bz2 new file mode 100644 index 000000000..daa61d3b7 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0a1_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0a1_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0a1_states.bin.z deleted file mode 100644 index 23198e8ae..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0a1_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0a3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0a3_states.bin.bz2 new file mode 100644 index 000000000..d7171c287 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0a3_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0a3_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0a3_states.bin.z deleted file mode 100644 index 3d2cbe6d7..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0a3_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0a5_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0a5_states.bin.bz2 new file mode 100644 index 000000000..958b8ed3d Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0a5_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0a5_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0a5_states.bin.z deleted file mode 100644 index 9e6803572..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0a5_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0a7_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0a7_states.bin.bz2 new file mode 100644 index 000000000..9992d1259 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0a7_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0a7_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0a7_states.bin.z deleted file mode 100644 index e7ad43a84..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0a7_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0a9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0a9_states.bin.bz2 new file mode 100644 index 000000000..5893a4938 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0a9_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0a9_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0a9_states.bin.z deleted file mode 100644 index cd17efb23..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0a9_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0ab_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0ab_states.bin.bz2 new file mode 100644 index 000000000..7deaece19 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0ab_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0ab_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0ab_states.bin.z deleted file mode 100644 index 8469638d5..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0ab_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0ad_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0ad_states.bin.bz2 new file mode 100644 index 000000000..19c36b526 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0ad_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0ad_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0ad_states.bin.z deleted file mode 100644 index 591851878..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0ad_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0af_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0af_states.bin.bz2 new file mode 100644 index 000000000..3e99de95c Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0af_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0af_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0af_states.bin.z deleted file mode 100644 index 51e59ea2e..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0af_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0b0_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0b0_states.bin.bz2 new file mode 100644 index 000000000..cb2ac918b Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0b0_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0b0_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0b0_states.bin.z deleted file mode 100644 index 09370ddf3..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0b0_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0b4_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0b4_states.bin.bz2 new file mode 100644 index 000000000..f9c8c8183 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0b4_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0b4_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0b4_states.bin.z deleted file mode 100644 index 4048a702c..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0b4_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0bc_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0bc_states.bin.bz2 new file mode 100644 index 000000000..19e1fe89a Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0bc_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0bc_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0bc_states.bin.z deleted file mode 100644 index ab0b3755d..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0bc_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0c0_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0c0_states.bin.bz2 new file mode 100644 index 000000000..87d8693df Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0c0_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0c0_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0c0_states.bin.z deleted file mode 100644 index d3f655b04..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0c0_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0c4_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0c4_states.bin.bz2 new file mode 100644 index 000000000..57823403b Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0c4_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0c4_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0c4_states.bin.z deleted file mode 100644 index d5c5f5edf..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0c4_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0cc_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0cc_states.bin.bz2 new file mode 100644 index 000000000..38fc1e0ae Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0cc_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0cc_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0cc_states.bin.z deleted file mode 100644 index 868afc9f9..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0cc_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0d1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0d1_states.bin.bz2 new file mode 100644 index 000000000..4d1b27593 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0d1_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0d1_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0d1_states.bin.z deleted file mode 100644 index f7dd752f4..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0d1_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0d3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0d3_states.bin.bz2 new file mode 100644 index 000000000..cb9afb002 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0d3_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0d3_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0d3_states.bin.z deleted file mode 100644 index 68ef2a6d5..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0d3_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0d5_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0d5_states.bin.bz2 new file mode 100644 index 000000000..ae6e859a8 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0d5_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0d5_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0d5_states.bin.z deleted file mode 100644 index 7720f54a3..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0d5_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0d7_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0d7_states.bin.bz2 new file mode 100644 index 000000000..90c562613 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0d7_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0d7_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0d7_states.bin.z deleted file mode 100644 index 5f05c9cd3..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0d7_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0d9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0d9_states.bin.bz2 new file mode 100644 index 000000000..ad2df6b55 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0d9_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0d9_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0d9_states.bin.z deleted file mode 100644 index f9ead3d9f..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0d9_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0db_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0db_states.bin.bz2 new file mode 100644 index 000000000..353c48c88 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0db_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0db_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0db_states.bin.z deleted file mode 100644 index c272e158b..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0db_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0dd_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0dd_states.bin.bz2 new file mode 100644 index 000000000..2d2e19707 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0dd_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0dd_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0dd_states.bin.z deleted file mode 100644 index 6247d26df..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0dd_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0df_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0df_states.bin.bz2 new file mode 100644 index 000000000..14ca3fcda Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0df_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0df_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0df_states.bin.z deleted file mode 100644 index 63e00d2cd..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0df_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0e4_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0e4_states.bin.bz2 new file mode 100644 index 000000000..19e2e6109 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0e4_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0e4_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0e4_states.bin.z deleted file mode 100644 index 5b4d867fd..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0e4_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0ec_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0ec_states.bin.bz2 new file mode 100644 index 000000000..f376b1cd1 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0ec_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0ec_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0ec_states.bin.z deleted file mode 100644 index 764188911..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0ec_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0f1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0f1_states.bin.bz2 new file mode 100644 index 000000000..b263afc60 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0f1_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0f1_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0f1_states.bin.z deleted file mode 100644 index 9740a1a39..000000000 --- a/client/resources/hardnested_tables/bitflip_0_0f1_states.bin.z +++ /dev/null @@ -1,28 +0,0 @@ -xÚíѱë,¬¨W)$.!Æçá6r*p )Å%øÌž\~ Æ#áèÛ™=Y ÁB ! éÿýïÿüMó²<^ïÿÏû8ŒÃ²üý-ËûûÇëyÞ}û¿_üû{šß¿»Ý¦yšÿ}ûÿo¶ýÇáyÿû{ÿýïwÿþ4·…÷Ÿæþ4ÿ{÷ðÁüíâïþ»þÏ»ûîßïžwßþ†ÿïû÷ïÆ¡þÿžq?‡®ÿºÝ}þ÷¾Æ­-ü÷¼lçÏÁÃpCè߃üsx<^¾ÿûùqû4‡íÓ¼m¼Òý¯ðù¿ƒ¿Tþ·›ÿeÙo÷ߺù÷ÿ§yûyš·íë÷vü¿?‡®<Þí÷ð?üo—ÿÁŸóÏ^ÿqض‡ð—%ÿQÿe9î/…÷Ÿæãþœÿöö¿qض‡ú¿œþ=ëÿ%ë/½ÿÍ߲ϟÎúOËÏe9–¿)ù·çžßóþ_Ž¿Tþµ›ÿeiGö俞ü¯“¿ñø§ùhüØÿØÿ-ïÿÐúcÿÇþWÍ¿Ó\ÞOÿþµàãÿÿEý¿Üÿ“óÏß¶öÿóò7\ÿåûWZþžÇ/í’ÊÿëøÿÒóS+¤ëëÜø÷¯µþz–ÿeö«ßíý§äü"›ÿ^äùù¯|üߘ¿ï÷ÿžÿÿ'þOôÿÞâ_$í©øŸ>ô)~Úð¥ç/âÿˆÿƒÿ‰ÿ³&ÿ¬Û±ÿaÿÃþg×þ×Jÿ«ÿïÅÿ ÿ£ÿãÿÇþþàÿ‡ø/â¡?ö?Ýû?ú÷Ÿ¬ßÿO}ß[Å÷¨ÿsÿûÜÿãþçâßÝÿƒþþÿÿ?þäÿ±ü_Ÿ_>_3þûô·âÿGÿƒÿ¡¿-ú?^^þü{ÞíöîÿþîñºÝ¶íîûŸÝïÂþ·Ûqÿe9î/…÷¼Žûï㿞£oû?^iü¯mÿÛÍ}þ÷=^máÇý}»ûü÷w ú[ÇÿÓë_jÿ~¼JÞ—eïsNþåèÿiûGzüþ]jÿ?;_uó½ÿ.µHå_Îþâ”ÿgíÿuë¯\ÿAþ±ÿkÒ_zÿYJÿžäªnýµ”ÿ=®ô?äŸåó%üÛéŸuú¬öúOïXÿlI)üýþ©ß—úÿÊÏÒý¿GýßÒþß#ÿ_IþI÷ó¿uùÇù¯oû_ümÿ|fÿ‘ÚØÿÙÿ±ÿcÿÇþýûøƒ?økûrñG-åþŸ_—ÿПý¿•ýgÿœYö¼«ãÿ›öôøþ·`ÿÆþÏù§Ìþû¯~·zþ×ý¯òþ{ô׃OüþÿÓþï}Öæ?üÿ¥ûoºý3óÿxµmßÿ=òÿ|ý0éþ['ËûKëŸY·ÿiÓ?·þ?ãÓëO[ÿEÿ#þû?ö?ìàþÄÿJü?5öÿþãÿ¬Çÿâÿãþ?÷_¹ÿÏùûÿÜÿGþ¡ÿÛºÿOüñèÿÄÿÁÿÄÿÿ‡ýûö?öÿ_Œÿ€ÿáøßÿ;|o·7¾ãÓÊÇüýyû¥kÏõwío¾óíÀ¿"üqá?ïa§þ8´…÷ÞCøïoÁÿïÏÕ;‡°þ‰«Oò~ùÏñï[¬¿üÜú/ÿz¼Gø”Áçß?Ç×ñ°óð¡ÿÕèß¾¦üÿtü|®ÿþßj—Æ¿Jåïõ¿rõë[Ì¿fý½=þ?ƒ_®¿ôùšë?ÿ!ÐÞÿ¤ø§Ç?çæšÛÎ]þS‹òýŸó¯uøçõÿðœ#]ÿëçµ9ÅãÞÓç2ÎÚõ‡{?ÿXÐÿ%ô×™ÿßY×”ÿØÿ°ÿaÿûûúüýmÓ_ÓþØk»uûÃñüŒC+ûç5×ÿçñ—Á_–ÒñIý?-üšúW þ9ûÿvÿ‡RÿOöÿrÿÙóÓ¿Åù¿GÿŸ%ýŸýŸø/Mÿuç+þô?ÛúòÏ6þÄÿÙöÕÿÞ߯׻$þÉéðåúèÿÌõ_·»Ï9ûßñþ<­Î=œÿ{äÿ¾ãŸ­Çÿáÿÿûo¯ö¿o¿êìOÓÜÊÿCü?ñÿÚú¯Dÿkÿ¯éÿÅþ_cÿ÷ôoÿ8ÍÓ<ÍËò¼Ã8,Ëó¾,Ó¼,Ó<ÍÏûóþx-Ëãµ,Ïûó>ËòxMó8,Ëßßí6ÍÓ<ÍÓ<ÍËò¼Ã8,Ëó¾,Ó¼,Ó<ÍÏûó>ÍÓ<ÍËò¼Ãóþ¼Os^ÿ·âÿwùn·0€ËÏðþç?‡¿{ç8úÞõ¿ß^øqÿ¿¿ô¸Àümã/µJñÏÉ¿þŸ¶ÿÖÁ/ßÿ ?ôפ¿vþëã/]ÿ½çÿÏéßRüµó¿Áÿð¿eþ·Ž?çŸ þŸÏ¾Ÿ}ž¾ô÷œÿJýÏRú÷ªÿCÙz’úµ×¿vý›Þ÷ÿþÒõõú?ìÿÈÿOÈ™ümÿjÕþÇþocÿ‡þÐû?òŸûïÀçþÍû?’ûß-â¯{¾ÿo=þ—ûÿÜÿçþ?÷ÿ¹ÿÏýîÿsÿýßÖýòÛ¾ÿÏýòÿÃÿäÿçþ¿ÍûÿØÿ°ÿaÿûíúŸýOZÿ¼÷ûÿð?ú¿ÅüÿØÀüíú¨ÿBýèýO«þw/ùO-ØÿÈÿKþßÞøÿ*òÏfþßß‘èÿÄ¿Sÿýýÿ?þüÿÈê¿cÿƒþ–îÿ ÿÁÿПüÿäÿ#ÿc/ô'ÿåwÖ¿Ôþ-Íÿ§ÿ%‡.ÿžÔþ¯ÿüß¶óÿ°ÿ“ÿ‘üovó¿¡ÿ!ÿ8ÿØÅ¿×üß½ä?·^ÿ'wþ“Ê¿^õòÿ“ÿŸüÿäÿÿõý¿Wûß·òÿçðÏ­?©ý‡ýŸýû?öìÿØÿuôßÇk=¿ÞÞþ³­é_Ûçîõ_ë©þRø©ý/ìþàþaü´Û÷å,?¥ø{ùýx¥àçðÏõ÷òß·‡ñïÇø×ÁÞÓùüµþý¡òo}–<þ|öUö¼«ã/•ÿíæ¿ü÷ëõÿ¾'ÿîïֺݽ?^-ù??‡O®ºÝþ‡ÿ-ó?ø[?ÿÔøÖþ«Ç«¼¿³?ÇþMø5ôÿþRû_Úÿà¿ÏÍ¿¾þ/óÿHóßjûÖüÊÎ=ù+mßÿ¬Ã?5ø¯ßeë?ýÜ:øûýS¿—ìÿŸ¡_ëñ\cý]Qþ¯ýW²ý·Nþ®ýÇÒú7ÖíÚô¯™ÿòþ¹ù×^Úú/úŸmýû?þ ý¥ø—Ñï,üvôðÿuü}èi.û¾Jý+{þ÷ZçKÙËÿœÿqÿ¸=þ;‡ï‘ÿ+ ?„¹®Ÿן*ó_×ú¿ZÑ¿výo_uó_:޽߷[uô×á™þ/Õõó_Z—ÿºõßô忬þ[ºþÀ{^Jê^3ÿkKþGþ!ÿÐÿ{À¿þyNÿÿü¥ôGÿGÿ‡ÿáÿoó?øcÿÃþ‡ýýßæþÿÃÿð¿Mþ·ÿHîÿsÿ¿>~R¬ÿIüô׃Íû/-ïÿôsÿÏæý?ÿN>>„í-ãÿËïÿûÏuöËu»íøÿ–÷ßöï™õ|ÿŸûÜÿçüÃù×êýOîÿÿ‡û×ìÜÿGþcÿÁþý-ÙÿÐÿàèoYÿ'ÿŸmû¬þ—ÜþyÅõßÿ~ê?Iý?5þ¿žò?•ãçß[æÿѰÿKýg-õOÿþöËñ_äÿÃÿþgUÿÃÿMþâÿìú¿êÎî]ÿ¤_ÿ‡üÿäÿ'þÿ?ùÿuìýäÿ—î?RÿñÿÄÿkæÿ—ê5ñÿ=åÿÇþOýOkþÿ÷ˆÞôXãïÆ—nwïî/ÿmº=÷ü¸¿~îùgÇþàÿ»ø¿s‘„ùOŽ?‡/)þÛW/‡®þuŒïyøgŸý¡¿ýµó^éúï)ÿÛ~þ´8U˜ëJŠ¿fþ7øþ·Îÿ–ñ·®ÿ;{åíÚ/÷à;û–‹ÿrÏûCŒ¿kÇç~ßþÿ>ç¿5ýÿývÂú7{ûUø»qÒ_[ÿ/Á?·þöæe=žðûp>5׿výýý_†¿tý_½þû?ò_ºÿ¯Ÿ×FþnåZ.sþcÿ·½ÿCÛôÇþÿ'«ÿÐN;þÿŸÄ¿Îÿ×/©¿Y'Ïõ?ú,­ÿ"•ÿ×ôÿ£OÞÿwvþÏõÏ_sýiË÷:û¿¿ÿë÷{ýíÿzð±ÿÔœÿÂóŒtþ5ù¯îü®¿’ù;>ÿ]ÿÚùÿðâÿDÿ¿ZüKyþÔ²ø=ýG{üÚóOüñð?ñVåŸuû.ö?ìØÿìÚÿ¤ú_‹øMÿ/üþþ¯wÿçê÷_Àü¯Ž¿æþ¯-ÿ¥û~3~‚þÐ_‹þ²ü_ëû'a{i~©~î¿Ôä¿j)ÿ¥ðkóßúÿÓ¼ý<ÍÛöõ»ìþךÒðòøçú¿<¾kÿýÿ§ÖŸ{Î:þ;Íÿã°åíõ¯Íÿ¿#ÿêÖ¿§»ùOÍï‘ü°,ÿÐÿµýÏô¿®ÿýÿúç¿VõÓ>Qí›üc}ÿÓ¦ŸõõwùßÎÿ¯íÿEþCmøèèØÿ¡¿ý©IýGê¿Ú]ÿÔÿ¡þõìÖÿaÿ·½ÿK󟶬ÿ«-ÿ­×ÿEÿCþÙ;ÿpþkUÿºFÿïiýKëïJéú¿éóŸtÿ×ÑÿÙÿuùÿwäŸtÿ×8ÿ[—œÿ´íÇñÏuò·]üÿ™ýGjÿaÿgÿÇþýû?öìàþàÿyý_vÿ©¥ü×ÙÿmËèÏþßÊþSo_ú ü¯iÿGÿ‡ÿáìßàOüw©ýqYBûciÿ=ÿ—&üúÿNâÿðÿgýßMÛ÷?ëðþÿZzµ¦_ëñ\cý]QþûúcÒý·Nþúý?<¿åÆŸÎ?gÛþ§Mÿšù/¬»þ´õ_ô?ëñØÿ±ÿáÿð·îÿ—újΗ=É›ñ¿øÿ¸ÿÏýWîpþãþ?÷ÿ‘èÿVñ'þ‡ø?ôâÿàâÿˆÿÃþ‡ýûû¿û_ð?üÿÛâÿ÷ˆÞôXãïÆG;íÛv÷îþòߦÛsÏûKáçžv|¿ÿ»IXÿäÌgéú’>_:þóðãù˽rχþ×¢[øšò]ÿ-v¿¿ÝÂþ{ãwí¾kÏõwí[üeñ¯RùßCýóu}úwýúýú_ãðþÛÕ¹o1ÿšõ÷¾ãâ¿ÇŸ©õ—ë¿nù_ýËâ?¤ñÚûŸ÷üpþÝ<—Îÿ4·ÿºü§åú?ç[ëíçõ×ð%]_¹óÒùó×ñxÏŸÏ~÷ü§]Xÿüc]ÿ×¥ŸõõwMùýûö¿_°ÿ¡ÿÁÿÐß.ýµíÚð­ëuó?­ìŸ×\ÿíðw¿o ‹ÿyoåÿ‘úÿ´õ¯üsöïG‡ÐÏ“÷ÿô`ÿ—øÏZœÿ5ýÖõöÛþŸÿw쯎å™tþ5ùϺÿý϶þ‡ÿÛ6þÄÿÙöÕÿ¦9Üÿ%ñOþU®ÿÇç—ãþqûúïºýZÿz8ÿkòÿ5㟭Çÿáÿÿ•vmûŸöù«Îþ4Í­ü?Äÿÿ¯ÿ/ÑÿZÄÿkú±ÿ×ðÏZ×–Ç?~_ÿÇoÙÿïòHÆï;ÿö~—ëŸûøÀþ÷á§íã°'_bûçáçð/;ïÛ?´áCè¯Iÿtþé8µÿ».ÿõ~þé«ãõùOŸ?âó›·Äç)þ9ø9üËΟûçøþ·ÌÿÖñçü‘†oýÝúùÏíï¹vé<÷ªÿ—â§=Ò÷}ùëålÜÊ_Yÿ~÷Ùø¯2ÿìÿÈÿåÿ·ä/ö?öËû?ô‡þØÿ­Ë»÷_À_ÆÿŸæ?à¾vü_7׿þÅ6þ/—çp{ÇÀ­Ç±Ž;ò•Åÿ׸ߤþ/ýû?©ù/¿ôÑGã÷íÜÿ)ÛÿBýuYdçëÜóÇ¡-üeiuþ·°ÿlÖösø.¥¿¦ü/Á7·þöæ¥t>{\ÿÚíÚüwõùCþÿs÷ÛÕÿ¸æýç_ºÿ›?ÿ¬ÿ®ÓÿsçÏúóWZÿOÿHÿßîÛ{÷›êôÿcýþ׿ÿúów›ù×=ÿ[–äÿÄþ‡ýûŸåü?ý¯Åý Mý þGÿGÿ×Ö?|à_Qþþ'åð¡?ôïAþ¸qþûìì'ßlÇÿn‡m{ˆ»þáøÞó·Î¯—ÿ§æÿ<üãþ®Ýëæÿ¿`•ïÒùO?׿røçú—}ó¯—s¥ãßë·‡ò³×õ¯ÍÿדWŸ«òó‡žÿ¯ÿ·uüÑÿ­ëÿËÊO¿~Öù½ëåïºÿû.öñþùmþ·¾ÿµ¡¿Tþµ[qÿ2üíÊ=ÿ¿¶ÿùý%ùßËèïŸ×@ÿCÿÃþýµèßoþ©kä¿Òοù9øÖç߯ú—Ú/Ù»vþg)~Rû¿tþZÎý¡eþñüí+ÿgíÿŸ^È?öŸ>óÿŸ—_ÒýG[þ§ð¯ÿwæþCþ!ÿ€ß¾ö»öúßËôÏÏÍÿyøÇýÓß·<ÿµ=jëÿööÿ¾øÿzòïêóoQþqþëÕþ÷ùÛrÿ‘ÚØÿÙÿ±ÿcÿÇþýŸúGÀ>ð©ÿNýèý©ÿMýïïúÿËâO¥økëßð?üo™ÿ©ÿËùÃågõýsŸÏ¾Ÿ}ž¾ô÷î¿ûç?×Í¿~îymàÇý©ÿKý×£úóïÿëõú–Eæˆûçùÿ[ë_ê?i3ÿÚñûô÷s´,õûÿ¾üK¿~zÿûçöëò¿¾þŸtÿÏÕ/Ëí矮ÿgµþ³6ýŸ÷²õÿéú—u민þ¡¶þ‹þg[ÿÃþü§þ"ðo·þ'õ¨ÿCý›õ¨Íþ“¯_ü.mþ“â§=ðòùü+Öÿ»:þ¿PýŸúŸð¿]þ·Œ?û?ö?ììÿ–÷øþ‡ÿmò¿õøGðçþ ÷ÿ—å8~Ò}Wÿµ¿þûˆÿ$þ×6ý—¥-ü˜þËÂ÷ÏïãþK÷¾ÿÌýÿãú—ã°m_ëßÒøÿ\ý»Üýiý;ëñÿÚ÷Ïú½ÿoéþ÷ÿ¹ÿÏùŸûÿÜÿ±™ÿ§þþw™üõÏwŸ{Yÿäÿáþ?òûö?ìíèð?ô·Kòÿaÿè!Ioö7+ïRÿÔÿ§­ÿIë?IïßõQÿiYŽýg®½6ÿ÷¾üëÕÿgEÿgÿ'þ‹üvýÿè¶õ?üß¶áÿgÛÿ%­_ÚæüÙ_ýòÿ“ÿŸüÿøÿÝþÛ«ýï[ùÿ¥ûÔÿCü?ñÿšúoËúõ5û¶ÿû?õ?-ûÿýü½çÊoþÛüô§?ý¯Ü+Åç¥Iç‰ó§|þ§Ç¯ úCÿäÇ{”î¯wÿo¶_ÿ«Î¿ôÕŠÿsÏÿÔøáøß2ÿƒ¿eýÿÚù§åð¡¿fþWýýW7ÿhOüçÆy,?]ûÛ»†ÜYú”¿íð¿úü³ÿ#ÿ¿/ÿµå¯õóû¿õýú[¦?öìþ~§»Ÿ¸wÿ³~ÜßßÏJ÷—ÂOÅ?þoú§å×{½¬÷²ãÏçü3nýúv¿>ÓòÓÃ+Yÿ¹þ¥ò_ê’Ê=ÿ_ú×Ê¿í+„·]?9ÿßñx÷~ßnýÅôŸÿþûýY_þËò?”éŸþù[úÇ×Á/ÿFþ»µ¾>¿ÄòӯߺóßýµåÿÜúËŸÿüó·ü¯½þ­ûßð¢?[ײַçô/©þßËù_Š¿ôüßnþÓóKüñð?ñçéóÛòϺýûö?ìVííô?éýmÿ¯]þGÿçþýéOîÿÿÅýèo)þ[÷þI?þ/›ö¿ÿ轕ÃßµŠ?ÖÑÿ‰ÿçþ÷ÿ¸ÿ‡ÿŸø«þôüÿøÿñÿãÿ·ìÿß÷ŸÇþ˳ò«Ìÿ«íÿ·kÿ³NüÿèØÿ¡¿=úkןчï_a]°4üßëo}þm¯©ýy ?|_éïsò+G¿OÛÿ÷ñhcÿßÎÛÞüåæY>ÿ5ö)ÿyþ'Ư½þìÿšý¥þgùþÓüר?ÿ!ÿôïaýkèŸ=­éKJ?WËóŸtÿ×ÑÿÙÿuùÿwäßÕçߢüãü§mÿÓ•¿-÷©ý‡ýŸýû?öìÿØÿ±øÀÿæþ¯ãÿÑÖÿÑÿ ?ö?»öÛö?ýó»ó×'òOÀÿðÿoÛÿÁŸóDz„ýÝwo8q{oüGý—帿~Üÿñ:î¿ÿzŽêçß?ß}þcŸþRøqÿýûݶí¡þ_BÿýùïWÿ—Žÿ;óצ¿_/eŸÏ¾—=OcýËðz¼ZÒOïýˆ>ëïj÷ÿ2ù'…¿ß?·ÿ[—ÿûõÿÆaÛ~^~íïÿ¹úg¹ý?×?'±ÿõMÿÜúoSÿnYÚ®¿q8ž¿e‡>ô_ô?ÛúöìÀ>ðñÿÛŒÿµÿ‡ÿý_ÛþØcëñ_œÿìØÿá?æýÛ:|âˆÿCÿ'þþ'þø?ìØÿ°ÿ±ÿsÿþ‡ÿáÿßäït»…ñO®>Ë;cûîywø9ûå»ýyû¿ñ\÷wí®>‰{¾û}[øqßîò3¸ñ -~<~ß«à÷ ÿßZqu‹Ýçç=¬‡ä>‡¿‡ëý¼üÜúߎ+¿o_—Â'õ»ÜüïÍK)|è¯Mÿei ?†ãŸŸšOMù/ÿ–Æ?ïá¶Çûó8œë¿å¯qhÿ*å¿ê¿ûút~ý»úwã°mw߯áÓg«_­çßéí)øqý»þ¹þëö¸þÖÿ‡ø¯¿Ôþqô¼íó{\ÿÒû3eýµ÷¿Oÿ*óo]þ¡ÿsþµŽîüst^jsþÐ=Y>ÿåôÿý+/ýóãúÏ}œlëÿúKå_îþoÝú+¿ÿ‹üÇþƒýûŸUûúüýmÓÿÈ>[g,·ÿjÛ?ÑÿdöËOµkÛß´ñÿV»ÔÿÓÂÿ§©ÿ¥ýOã°Æ?gÿÏûöß{°ÿÑßÏ‘Ÿÿ5ý[œÿ{ôÿYÒÿÙÿ‰ÿ:㯎ߥôïñüoÅÿþg[ÿCþÙ†OüŸmÿWÉù'n?ÿ—;¦à¿_%þÏ\ÿ¼þ?ýFrþëáüß#ÿëûÿ-Åÿáÿ·jÿíÕþ';ŸWSû\íþ#õÿÿOü¿¶þ+ÑÿZ쟚þWìÿyù·þ»ÎþŸÛ¦yš—åy‡qX–ç}¦yš§yšŸ÷çýñšæÇëñzÞŸ÷qX–ÇkšÇaYþþn·ižæižæi^–ç}ÆaYž÷q˜æižæi~ÞŸ÷ižæi^–ç}ž÷ç}šóú¿ÿ¿Ë¿ÿíüÛû]®î{àøß‡/•?Ÿ†ŸÃÿÓö×OÇþÐ_“þÚù‡®ŽÿÕç_j⯠þ‡ÿ-ó¿uü9¤á[·~þ+µKç¹Wý¿?íù“¾kןéwÿ—ÿ*óÏþüïQþKþbÿcÿ·¼ÿCèýߺü'ÿ÷ÿ¹cõþäþw‹ü}Þÿ'þ—ûÿÜÿçþ?÷ÿ¹ÿÏýîÿsÿýÛÞýù¿¹ÿÏýòÿ“ÿŸüÿÜÿçþ?ö?ìØÿìÔÿ”è-î_ôyÿßÿ£ÿÛÎÿ|àß®ÿ‡ú/ÔÿþvíýÕÿþnþSÛö?òÿZÏÿÛÿ_EþýFþ_»òýŸøwê?£ÿãÿÇÿÿÿ¿Mùo½þ»uûŸuúÛ¾ÿƒþ‡ýú“ÿŸwò?2ÿ¶Þ¥öciþ9íü+9ükÇ_jÿ×ÎÿGþoÛùØïÉÿHþ7»ùßà?æ›ó]ø½æÿÖÏn½þOÙùïsçO]ýŸüÿäÿ'ÿ?ùÿ}ÿïÕþ÷-ù+ݤçOööìÿØÿ±ÿcÿ×Ñý+õ}ü÷¶~$ýéOÿ«ö÷òó-+|Ú“ÿ±üü4üO_>ô‡þ½Èí×Õñ¿âü¯×ïûž¼ÿ¶¤½%ÿçžÿ‰ñÃÿð¿eþëçÿÓÛÜw®¿k¯µ?ûç»Ïï;M{öo)ü¸ÿ¾ýÛµ¹ç¿ÿíï›ÿ¸ÿÿT)üþ{û—Ìþ'÷?hëÿºöGmÿÏšÿ×¼à??^Ûöõûãuü}Ü?õYoýçñJá’Æ¿~þÛÀ?îôÜ}Òô*ß?Ë䟾ô÷vå}þéþŸËÿÛÿåõo¬Ûÿ´éŸš¿}ú—ÍŠþGûÿ²´]åùo´õ_ô?Ûúöü?âù£?ýéÙþÒ—Ôÿ²ÎÕìëâ¤ó?¯Üÿ-ÅO -¿•ÿJ:ÿRújý}züÚëO—ÿ{È?© ߺü×­ÿ¦Ïºõà?äòþ=ô×Ò?ÿ«Î?ú¿eýþ·Îÿàýûö?ö›û?üÿÃÿ6ùßzü#øsžûÿ>¾3?¶Ÿ_Ú_ÿúñŸÄAÿ}üëàÇôçoÿÛÃýÍû?=Üÿ³|ÿßÓÛù©/¿þ×üáÛÝûãÕ2þßë÷~î>O®þü`;þ¿ûgÚ÷Ÿ­ßÿãþ¿íóç»÷?¹ÿCþŸ6÷¿ëï—÷aÿ²»ÿqÿß¶üÇþ‡ýûŸEûúüý-ëÿäÿ³mÿÐÎ?×ýW/ÿžvý§6þŸÿ_ùŸ¦y‹_™ý½eþ ûÿ–¾)ÿYÜ~6ÿw™þ¯ãÿÃÿÏþo9þ‹üøÿÑÿ¬êø¿ÉÿOüŸ]ÿWîü³ÕŸkâÿÊòêÔÿ!ÿ?ùÿÉÿÿŸüÿ:ö¿~òÿK÷©ÿ‡øâÿ5óÿKõ¿zûsùÿíÚÿ©ÿiÕÿÿÑ[f¬í§N>¥ÛÝ»ûË›nÏ=?î/…Ÿ{þÙñ?øÿ.þÿ~ûþÿ¼—}_Rü·¯^ÿ\ÿüëßóðÏ>úCúKã¿¥ñWÇ_ºþËü×gçÿ\üû;~¸>]^|Ÿ#߷ǹ®¤øoóg…ðsøçúåß‚ÿáëüoëú¿³wÞn¡ýs¾³o¹ø/÷ü°ÿ8Äø»öx|î÷máoñásþ[Óÿßo]Ý÷yo¿ -7Rúkëÿ%øçÖßÞ¼¬Ç~Χæú—ÆJýúû¿ éúÏù?ëæÿ¬ÿ“ýù¯#ÿã絑¿[ùŸ–ËœÿØÿmïÿÐß6ý±ÿãÿÉê?´ÓŽÿÿ'ñ¯óÿxùUw~ŒåÿYù{®ÿÑçüsç_‰ü¿¦ÿï}òþ¿³ó®nüšëO[¾×Ùÿ—%Ô?óýíÿzð±ÿÔœÿÂóŒtþ5ù¯îü®¿’ù;>ÿ]ÿÚùÿðâÿDÿ¿ZüKì¿‘éÿšúöøµçŸø?âÿàâÿ¬Ê?ëö]ìØÿ°ÿÙµÿIõ¿ñÿšþ_øýý_ïþÏÕï¿€?ø_Íý_[þK÷ÿ4üfþüý¡¿ýeùßÖ÷Oöó‡Õ—èçþKMý‹–ò_ -¿6ÿÿ?ÍÛÏÓ¼m_¿Ëî­ù' /®ÿñËã»ößïñjý¹ç¬ã¿Óü?[þ×^ÿÚüÿ;ò¯ný§òJç?5¿GòòüCÿ×ö?ÓÿºþôÿëŸÿ²òÿKíÚüc}ÿÓ¦ŸõõwùßÎÿ¯íÿEþCmøèèØÿ¡¿ý©ÿk»þ“>ý©­_ÿG³þW?õŸSøç궬ÿÔ®þbª^ÖQýŸzû‡Tþé×ÿ:ÖŸëÖ_¹þƒücÿï¥þcÿ¹eý?mùo±þúòÏöù‡óŸnýï~Ö¿Åú×Ôÿeÿ×åÿß‘Òý_ãüo]þqþÓ¶ÿÇ?×Éßvñÿgö©ý‡ýŸýû?öìÿØÿ±Y±‚?ø÷±ÿëø´õô?èýÏ®ýß¶ýOÿü|ÿùÌù«îþ3üÿ[¶ÿƒ?çŸ}üo·mû¿¿=üßÿuÿÇ«¼ÿýõàçö¿qض‡újýÞn¥óß»þŸÿãu<þq8ž?_¿'Çÿ9øeý¯ãþGòÿ{Ÿµù¯|¼é÷šõŸßÿÊá·û}nÿM·fþ¯¶íû¿Gþ—ÊÿX~Õï¿uò·¼nüØÿú¦ný‡þ»œýr/ÿšÞúÓÖÑÿlëØÿ±ÿaÿðÇÿo3þ×züþ?öÿei«ÖÙ¿´íŸÄqþ³lÿï‘ÿ‘È?ôâˆÿAÿGÿ‡ÿáâÿˆÿÃþ‡ýýŸýþ‡ÿáø¿žÿ¾·[ˆ¿ß;cûîywíÎ~éÚsý]»Ë¯àÚEøãÂÞÃþN)üqh ?îïÛ]~7>ðÿvÂúÇÏ{XÅ}ŽßbýåàçÖÉø×ã=§ ~8ÿþ9¾þóºL>ô¿ýÛÂ×”ÿŸŽŸÏõßÃÿ[íÒøW©üï¡þûº>½[¿®þÕ8lÛ§9\ïÒù?‚ŸÆÝšsý×íqý­=þ?ƒ_®¿ôùšë?ÿ!ÐÞÿ¤ø§Ç?çæšÛÎÜšûÛ•èÿœ­Ã?¯ÿ‡çéú_?¯Íù+ÿóž>—qþ«“ÿ¡þ%¹ÙûùÇ‚þ/¡¿ÎüÿÎú»¦üÇþ‡ýûß/ØÿÐÿàèo›þšöÇ^Û­ÛŽçgZÙ?¯¹þ?¿ þ²”ŽOêÿiáÿÓÔ¿JðÏÙÿ·û×8”úz°ÿ—ûÏž÷˜þ-Îÿ=úÿ,éÿìÿÄiú¯{<ÿ[ñÿ£ÿÙÖÿ¶ñ'þ϶ÿ«îü÷þ~½Þ%ñON‡/×ÿCÿg®ÿºÝ}ÎÙÿŽ÷çqhuþëáüß#ÿ÷ÿl=þÿÿ¯Ø{µÿ}ëüUgšæVþâÿ‰ÿ×Ö%ú_‹øMÿ/öÿû¿§‹øÇižæi^–ç}ÆaYž÷e™æe™æi~ÞŸ÷ÇkY¯eyÞŸ÷qX–ÇkšÇaYþþn·ižæižæi^–ç}ÆaYž÷e™æe™æi~ÞŸ÷ižæi^–ç}ž÷ç}šóú¿ÿÿûŸÏÇPöù쿳ϓ—þüÁßþ±|‰åsº=–õø;ùäþŽáçðÉõO·ûñçð¯ƒöùÐúëÐ?¬èûïåÚæÏô¯ís÷ú÷#ÿ¤øK×zþ¤óŸÊÿöñùßÖö3¿>÷ì±ý@Š¿·_<^)ø9üsý½ýãñJþ‡ÿ-ó¿uü­ëÿ._àíæ܃þîOðè{×?ü~ÿymàoñO úKã_¤ô×ÖÿsøçÖŸÔþ©½þµóŸëïÿ2ü¥ë_¿þû?ò_Oþçüuò·ÜÿaýüÇþo{ÿ‡þ¶éýÿO–þ´Ó¾ÃÿÒõ_Æ¿gá·ãÿ_Ç?ŒŸôñJ{ñ_qüdÿ(ßQ¾™’ùËõ?ú\‚ÿ‘ÿëy/yÃÏû¯öáKý_RúKåKÝüŸëŸ¿æúÓ–ïÖï?X—ÿÚùÿ´ùüº÷Ÿ{Xÿ–ï£ÿ£ÿKô÷ú¿¦þ£=~íù¯ÓŸýýéú÷÷w¦¹æüUÒ?nÇ^ÿxÞ[ÿàÿ+ò?*[ÿÚçËòϺ}ûö?ìvíRý/½þž÷týó=þ?æ—óú×öþÿÞ þGÿGÿ¯×¥üMýüÁÿwð×Üÿµå¿tÿOÃaæÏOÐúkÑßßqsñxùþkùèÛ§9lŸæmûã•îÿx…Ï×Η_ª=Ưü—Âßï·¯ûûü_k^ðŸ§yÛ¾~Ÿætþ·Ç«,ÿpêÂÏáŸëü’åLç‡4ÿoóöTÿU‡ÿGþÕ­OÿvóŸšß#ùaYþ¡ÿkûŸé]ÿ?úÿõÏYùÿ¥vmþ±¾ÿiÓÏúú»Žüoçÿ×öÿ"ÿ¡¿6|ô?ô?ìÿÐ_ƒþÚù¿®žÿJšÿT?ÿ§6ý­ã¯»þ¥öï5üð=n[–ÔgíüÏ9ü·ãߥöÿôs÷çkžúïÑEnÿ—Ê¿œý"½~âñÎþ_·þÊõäû¿nþÿšú›Þÿ,¥Oò?…nýµ”ÿ:ëýùgùüÃùo«_JõÏrý¿§õ_6Þý—”þRø5¿oyþ“îÿ:ú?û¿.ÿÿŽü“îÿçëòóŸ¶ýï8þ¹Nþ¶‹ÿ?³ÿHí?ìÿìÿØÿ±ÿcÿÇþOý#꿃?øSÿú/ÐúSÿ›úߟ±ÿÈî¿Jñ×>ÿÁÿð¿eþ§þ¯mýßÙ ÏÕŸÜÖóÌõß«ÿ© ßúgê¿Ú®ÿZÿæéî¹þ[ÿöú—ÆÿI×ÿ5ãÿZο ¾öømÊ_LºÿÖÉ_ÿ¼O×ÿûõóŸ6ýëæ¿¼¿´þå§×Ÿ¶þ‹þg[ÿÃþÿ‡úàþvëRÿ‡ú?Ôÿ±Yÿ‡ú×¶å¿ËwŸ«_¿®W¿Îsߢþ»¦ü/Á?·þöæe=žðûp>5׿6ÿ#ÿèÿvëÿ]ÿ_¨ÿþOýOøß.ÿ[ÆŸýûö?öËû?üÿÃÿ6ùŸxx>sÿŸûÿµñ“Òõ¤ÿIüôׄÍû/íîÿhÇ?sÿ¿&ÿ»øÿºü[åýsçOëñÿÚùïõïÿsÿûÿœ8ßÚüÌýòÿX¾Mþîÿ#ÿ±ÿ`ÿƒþíèð?ô·KòÿÙþ\7ÿ·[+ûç5×;üµó¿Hý?RÿŸ¶þ%­ÿ$½ÿ§_ÿIæ?“ÊmÿŸuýŸýß¶ÿ‡ü¶ýÿè¶õ?üß¶ñ'þ϶ÿ«îü7Í­ò¿j×ÿ!ÿ?ùÿ‰ÿÃÿoõ³¶ýOûü%­ÿ,õÿÿOü¿¦þ+Õÿ¤ñÿÚþ_ìÿÔÿ´ìÿÏÓ{ ¬×o˜¿ÃÏ_Ìÿ~þsýýúó7øÀׄïrÀ¬ó¯s¦¬ÿ‡÷ï׿û4üþeã÷ù—Ã\0úð¡?ôïAþ¸qþûìú¯õ«°ý­_­á÷wíWØþ;ø_uþÿ˼カ¿kÅÿ{ðsø—?÷=üÿÛäðçü±íÿžßqض‡ðµ¿õóŸ×óãöPÿ—ÏŸú¿Ç³nüß›¿VýÓòõ{í}íÿÒñ_oþÙÿ‘ÿýÈÿïÉ_ììÿ–÷èý±ÿ[¶ÿÕÇÿ”Á÷Ïã¯ÒøKá§â?Àÿ7ðÓò××KÙ~^wìÿÙ?-Kxþòë3-÷ë¿”ÉßTý—¼ü—úŸ¤ò_Ïÿ׆þµòoûÜ~¸~Jüñøsþ¿ei»þbúûç»Ï¾þSßûŸ‹÷–éŸq?žÃ¿~Üû‰üO­ÿqضŸ?¿Ó__þãŸ[ùó_<Ër<=¬ëþ7üŸèßVàÇúÕZ?Ïë_Rý¿ýGŠ¿ôüßnþãþÄÿÿÿÿ·çÿ¶-ÿ¬Û±ÿaÿÃþg×þ×Jÿ“Þ?ÑöÿÚåôîÿøÀ'þ—ø/â¡?÷µïÿhß²~ÿ¿ü½Uüq_ú?÷ÿ¸ÿÇý?îÿÙñÿÿoÕÿƒþÿÿ?þüÿ–ýÿûþs×^+ÿËü¿Úþ»ö?ëôÇÿþ‡ýúÛ£ºþÄ¿º¾ÎDÜÖŸøÕþWª~NYýTÿ½ú[½Â·>ÿ6Ö¿Ô~üxÉÞsò/GÿOÛÿëÇ_fÿ—Î_Ëù¯±?Hù/ûŠÇÿYûÿ§×òýG~Kù%Ý´å -ÿúñgþà?äòø-àk¿k¯ÿð½LÿüÜüŸ‡Ü?ý}Ëó_Ûó§¶þooÿï‹ÿ¯'ÿ®>ÿåç¿^íß‘¿-÷©ý‡ýŸýû?öìÿØÿ±øÀ×óÿ”Å}¾žÿdžü‡þìÿØ_°ÿ£ÿÃÿð¿mû7ö«çe û/Kh?\™ý1î¿,Çý¥ð—åœýtÿõÕÏ¿¾ûüÆ>ý¥ðãþÄÿÿ—_ÿ^æ>Ÿ}/{žÆúÇÿŸ£Ïú»Úý¿LþIáï÷ÏíÿÖå}ý?éþŸ»ÿœÛÿ?]ÿφý¯_úçÖÿ§ó?Õ­¿òú‡Úú/úñØÿ±ÿøÀ'þWâÿ‘úŸúŠÿ³ÿ‹ÿûÿÜåþ?ç?îÿsÿŸùGÿ¶uÿŸøâÿÐÿ‰ÿƒÿ‰ÿ#þûö?ììÿ¿|ÿ þ‡ÿá[üïân·0þÉÕgù7þw¬¢¯?ò¯—³_¾ÛŸ÷°ÿÏu×þþÞ?ßý¾-ü¸ÿó þ{ðãñû^uø¿gøÿÖÊ8„õ\}¢÷Ë7-Öÿúy)ø¹õ¿W<~ß¾þ.…Oêw¹ùß›—RøÐ_›þËÒ~ Ç??5Ÿšò_ÿ-ÞÃ?l÷çq8×Ë_ãÐ&þUʽ×ÿ‡mûºþWn~÷ô«õükÖÿÛãÿ¿ãõ—Ú?Žž·}~ë_z¦¬¿öþ÷©ñ_eþ­Ë?ôοÖñÏŽÎKmκç/Ëç?íúç}œlëÿúKåŸvýkä?öìØÿ¬ÚÿÐÿàèo›þGöÙ:ûc¹ýWÛþ‰þ'³_~ª]Ûþ¦ÿ·Ú¥þŸþ?Mý/í‡5þ9ûÞÿ³ÿÞƒýÿˆþ~Žüü¯éßâüߣÿÏ’þÏþOü×uü.¥ç+þô?ÛúòÏ6|âÿlû¿JÎ?qûùø¿Üù3ÿý*ñæúçõÿqè7’ó_çÿù_ßÿo)þÿ¿Uûo¯ö?Ùùëø¼šÚçj÷©ÿ‡øâÿµõ_‰þ×bÿÔô¿bÿÏË¿õßuöÿÜþ3ÍÓ¼,Ïû8ŒÃ²<ïã0ÍÓ<ÍÓü¼?ï×4?^×óþ¼Ã²<^Ó<Ëò÷w»Mó4Oó4Oó²<ïã0Ëò¼Ã4Oó4Oóóþ¼Oó4Oó²<ïãð¼?ïÓœ×ÿ­øÿ]½Û-¬âê½ÿùÏáïÞù޾wýÃï÷Ÿ×~Üÿï/=.ðÛøKÏ?RüsçŸþŸ¾ÿS¿üüý¡¿&ýµë^éúï½þcîü-Å_»þüÿ[æëøsþÙà_ðùìûÙçIáKÏù¯Ôþ,¥¯úÿ8”­'©ÿC{ýçä]ýáòúϽïÿ9ü¥ë_»þ3û?ò¿Gù/“¿íîÿYµÿ±ÿÛØÿ¡?ôÇþü?G¿~cüöúÇ?ÿZðÉÿh%þ7}ÿÛÇ/¾ý/¥þ£tþ¿ó÷¯Ãõ_’¿jïþu þ¹øwÉýï>îÿÔÓ_*êæ?<Íåãwñq>3½õ׫ü?wÿ÷Ú­ç<¿.›mþ“â§=ßoÿ|þòŸÿ ý_¿þO‰þ%Õÿ5õ)þÚð¥óOþ/êÁÿ¶óX–Öí¿Øÿ°ÿaÿ³kÿ“ê-êÿèçÿ…ÿÑÿÉÿ‹ýüÁÿõŸ¬Õ‚þØÿÈÿk7ÿ/ùÿ,çÿ#ÿo=þ-ÖÿÿÖÍÜŸü¿äÿmyþ!þþ—à£ÿ£ÿãÿÇÿÿù_&ÿÛù{ÿÆþý­ÜÿAÿƒÿ¡¿Mú“ÿü=ÒŸü—ßYÿRû·4ÿŸvþ—þ¹ü{Rû¿vþ?òÛÎÿÃþOþGò¿ÙÍÿ†þ‡üãücÿ^ó÷’ÿÜzýŸÜùO*ÿzÕÿÉÿOþòÿ“ÿÿ×÷ÿ^íßÊÿŸÃ?·þ¤öööìÿØÿ±ÿcÿ×ѯõü:x{û϶~¤mŸ»×­ÿ¥úKá§ö¿°øƒ?øÿý…ñÓn_Ü—ÿ±ü”âïå÷ã•‚ŸÃ?×ßË߯¿ã_ÿyOç?rð×ú?ô‡þ}È¿õYòøóÙWÙ󮎿Tþ·›ÿò߯×ÿûžü»¿[ÿév÷þxµäÿü>¹þév?~øþ·ÌÿàoýüSãÿYû¯¯òþÎþû4á×ÐÿwúKíiÿƒÿ>7ÿúú¿Ìÿ#Í«íÿYó_(;÷䯴}ÿ³ÿÔà¿~—­ÿôsëàï÷Oý^²ÿ†~­ÇsõwEù¿ö_Éöß:ù»öKëßX·ÿiÓ¿fþËûçæ_{ýië¿è¶õ?ìÿø$ô—â_F¿³ðÛÑüÁÿ×ñ÷9 §¹ìsø*õ¯ìùgÜk/e/ÿszüÇýãöøï¾Gþ¯4üæº~N\ªÌu _êÿjEÿÚõ¿}ÕÍéx÷~ßnýÕÑ_‡ÿeú¿TÿÕÏi]þëÖÓ—ÿ²úoéúïy)©?xÍü¯-ùù‡üCÿïÿvúç9ýÿWð—Òýýþ‡ÿ¿Íÿàýûö?ö›û?üÿÃÿ6ùßzü#ý¹ÿÏýÿúøIyü±vü'ñ_Ð_þ5ï¿´¼ÿÓÏý?›÷ÿýü;]øøü¶·Œÿ/¿ÿï?×Ù/×í¶ãÿ[ÞÛ¿gÖóýîÿqÿŸóç_«÷?¹ÿCþî_³ÿqÿùýûô·dÿCÿƒÿ¡¿eýŸü¶í²ú_rûç×Küû©ÿ$õÿÔøÿzÊÿTŽŸo™ÿGÃþ/õŸµÔ?uüøÿÙÿ-Ç‘ÿÿ?úŸUýÿ7ùÿ‰ÿ³ëÿª;ÿ¹wyü“~ýòÿ“ÿŸø?üÿäÿ×±ÿõ“ÿ_ºÿHý?Äÿÿ¯™ÿ_ªÿÕÄÿ÷”ÿû?õ?­ùÿß#zÓc¿_ºÝ½»¿ü·éöÜóãþRø¹çŸøƒÿïâÿÎEæ?9þ¾¤øo_!¼þ¹þù×1¾çáŸ}>ô‡þ:ô×Îxuü¥ë¿§üoûùÓâüUa®+)þšùßàøß:ÿ[Æßºþïì•·[h¿Üƒïì[.þË=?ì?1þ®=Ÿû}[ø[üCøœÿÖôÿ÷ÛqëßìíWáïÆAJmý¿ÿÜúÛ›—õxÂïÃùÔ\ÿÚõoô÷þÒõõú?ìÿÈéþ¿~^ù»•ÿi¹ÌùýßöþýmÓû?þŸ¬þC;íøÿÿ:ÿO\¿¤þþeü=×ÿè³´þ‹Tþ_ÓÿwŽ>yÿßÙù?×?7~Íõ§-ßëìÿþþw¬ßïõ?¶ÿëÁÇþSsþ Ï3Òù×俺ó_¸þJæïøüw5þkçÿÃÿ‰ÿýÿjñ/åùSËâôôíñkÏ?ñÄÿÁÿÄÿY•Öí»Øÿ°ÿaÿ³kÿ“ê-âÿ5ý¿ð?ú?ú¿ÞýŸ«ßð¿:þšû¿¶ü—îÿiø!Ìüù úC-úËò­ïŸ„í¥ù¥ú¹ÿR“ÿª¥ü—¯ÍëÿOóöó4oÛ×ï²û_kþIÃËãŸëüòø®ý÷{üŸZî9ëøï4ÿÖÿµ×¿6ÿÿŽü«[ÿžþíæ?5¿GòòüCÿ×ö?ÓÿºþôÿëŸÿZÕOûDýµoòõýO›~Ö×ßuä;ÿ¿¶ÿùýµá£ÿ¡ÿaÿ‡þô§þ%õ©ÿjwýSÿ‡ú?Ôÿ±[ÿ‡ýßöþ/ÍÚ²þ¯¶ü·^ÿýùgïüÃù¯Uýëý¿§õ/­¿+¥ÿuêÿ¦ÏÒý_Gÿgÿ×åÿß‘Òý_ãüo]þqþÓ¶ÿÇ?×Éßvñÿgö©ý‡ýŸýû?öìÿØÿ±€?øƒÿçõÙý§–ò_gÿ·-ÿ¡?û+ûO½}é7ð¿¦ýýþ‡ÿ±ƒ?ñߥöÇe í¥ý÷ü_šðkèÿ;ý‰ÿÃÿŸõ7mßÿ¬Ã?øÿkéÕš~­ÇsõwEùïëI÷ß:ùë÷ÿðü–:ÿœmûŸ6ýk濼þþ±îúÓÖÑÿ¬Ç`ÿÇþ‡ÿüÁߺÿ_êÿ©9_ö$ÿmÆÿâÿãþ?÷_¹ÿÁùûÿÜÿGþ¡ÿ[ÅŸøâÿÐÿ‰ÿƒÿ‰ÿ#þûö?ììÿvîÁÿð?üo‹ÿß#zÓc¿í´oÛÝ»ûË›nÏ=?î/…Ÿ{þÙñý6þïZ$aý“3Ÿ¥ëKú|éøÏÃç/÷Ê=ú_‹þmákÊwiü·4þÙýþv ûïßµ;ø®=×ßµoñ—Å¿JåõÏ×õéßõë÷ëÃûoWç¾ÅükÖßsøŽCˆÿ¦Ö_®ÿº=æýõ/‹ÿÆ?hïRüÝóÃùwó\:ÿÓÜvþëòŸZ”èÿœo­·Ÿ×_×t}åÎKçÏ_Çã=>ûÝóŸvýaýóuý_—~Ö×ß5å?ö?ìØÿ~Áþ‡þÿC»ô×¶?j÷®ÿÕÍÿ8´²^sý·Ãßý¾-ü-þ!ü罕ÿGêÿÓÖ¿JðÏÙÿ½iB?OÞÿÓƒý_â?kqþ×ôÿY×ÿÙÿmûJüß±¿:–gÒù×ä?ëþô?ÛúþoÛøÿgÛÿUwþ›æpÿ—Ä?ùW¹þŸ_ŽûÇíë¿ëöÿqhuþëáü¯Éÿ׌¶ÿ‡ÿÿWÚµíÚç¯:ûÓ4·òÿÿOü¿vü¿Dÿkÿ¯éÿÅþ_Ã?k][ÿø}ý?¿eÿ¿Ë#¿ÿíüÛû]®î{àøß‡Ÿ¶?ŒÃž|‰íŸ†ŸÃ¿ìü½oÿІý¡¿&ýÓù§ãüÕþïºü×ûù§¯ŽÿÕç?}þˆÏoÞ~Ÿ?¤øçàçð/;îŸàøß2ÿ[ÇŸóG¾õwëç?·¿çÚ¥óÜ«þ_ŠŸöüIß÷寗³q{(eýûÝÿeã¿Êü³ÿ#ÿ{”ÿß’¿ØÿØÿ-ïÿÐúcÿ·.ÿíÞÿšÿ€ÿYøÚñqÜ\›ûÛø¿t\žÃí·Ç:fìÈÿUÿw _â“ú¿ôïÿ¤æ¿<þÒGÿß·sÿ§lÿ õ×e‘¯sχ¶ð—¥ÕùßÂþ³YÿÙÏá»”þšò¿ßÜúÛ›—Òùìqýk·kóßÕçùüÏÝÿmWÿãš÷Ÿéþoþü³þ»NÿÏ?ëÏ_iý?5þ#ý»oïÝoªÓÿõø_›ÿëÏßmæ_÷üoYþ‘ÿûö?ì–óÿHô¿÷/4õ/øýý_[ÿ>ðEùÿ øŸ”ÿ=À‡þпùãÆùï³³Ÿ|³=ÿ»}¶í!þíú‡ã{Ïß:¿^züŸšÿóðû»vÿ­›ÿÿr€U¾Kç?ý\ÿÊáŸë_ö}Ì¿^ΕŽ¯ÜÊÏ^׿6ÿ_Oþ]}þ­Ê?Îzþ¿üßÖñGÿ·®ÿ/K(?ýúYç÷®—¿ëþï»ØÇûç·ùßúþ׆þRù×nýÅýËð·+ÿõüÿÚþ_ä?ô—ä/£¿~\ýýû?ô×¢¿ù§®‘ÿJ;ÿæçà[Ÿë_j?~¼dïÚùŸ¥øIíÿÒùk9ÿ5ö‡–ùÇSð·¯xüŸµÿzý!ÿØúÌÿ^~I÷mùŸÂ¿~üß™?øù‡ü~ øÚïÚë?|/Ó??7ÿçá÷Oßòü×öü©­ÿÛÛÿûâÿëÉ¿«Ï¿EùÇù¯WûßwäoËýGjÿaÿgÿÇþýû?öêøÀ§þ;õ_ ?ô§þ7õ¿¿ëÿ/‹?•⯭Ãÿð¿eþ§þ/ç—ŸÕ÷Ï}>û~öyRøÒß»ÿîŸÿ\7ÿþù¹çµ÷§þ/õ_êÏ¿ÿ¯×Oè?X™ÿ!îŸçÿo­©ÿ¤ÍükÇìÓßÏѲÔïÿûò/=þrøéý?îŸÛÿ­ËÿúúÒý?W¿,·ŸºþŸÕúÏÚôÞËÖÿ§ë_Ö­¿òú‡Úú/úŸmýû?òŸú‹À¾ÝúŸÔÿ¡þõlÖÿ¡þ5ûO¾~ýñ»tþµùOŠŸöüÁÈ?äð¯XÿïêøÿBýEôêÂÿvùß2þìÿØÿ°ÿ±ÿ[Þÿáøþ·ÉÿÖãÁŸû/Üÿ_–ãøI÷]mü×þúï#þ“ø_Ûô_–¶ðcú/Kß?¿û/ýÝÿùVü3÷ÿë_ŽÃ¶}­Kãÿsõïr÷¤õï¬Çÿkß?ë÷þ¿¥ûÜÿçþ?çîÿsÿÇfþŸúûßeò×?ß}îeý“ÿ‡ûÿÈìØÿ°ÿY´ÿ¡ÿÁÿÐß.ýÉÿ‡ý£‡<$½Ù߬¼Ký?RÿŸ¶þ'­ÿ$½×Gý§e9öŸ¹öÚüßûò¯WÿŸýŸýŸø/òÿÙõÿ£ÿÙÖÿðÛ†OüŸmÿ—´~i›ógõÈÿOþòÿãÿÿuûo¯ö¿oåÿ—î?RÿñÿÄÿkê¿-ë××ì?ÚþWìÿÔÿ´ìÿ÷ó÷ž+7¾=úoóGПþô¿rÿu®Ÿ—&ÿ%Οò øŸ¿6|èý{ïQº¿Þý¿Ù~uü¯:ÿÒW+þÏ=ÿSã‡ÿáËüþ–õÿk矖Çþšù_õ÷_Ýü£=ñŸç±ütío;ìþqÿeéSþ¶ÃÿêóÏþüÿ¾ü×–¿ÖÏìÿÖ÷èo™þØÿ±ÿùûî~âÞýÏ:øq?+Ý_ -?ÿþø¿éŸ–_ïõ²ÞËŽ?ŸóϸõëÛýúLËO¯dýçú—Ê©ÿI*ÿõümè_+ÿ¶¯ÞvýäüÇãÝû}»õÓ?|þûï÷g}ù/ËÿP¦úçoéÿ]¿<þùïÖúúüËO¿~ëÎGô×–ÿyüsë/þóÏßò¿öú·îÃÿ‰þl½ÿ±~žÓ¿¤ú/ç)þÒó»ùOÏ/ñÄÿÁÿÄÿ§ÏoË?ëö_ìØÿ°ÿYµÿµÓÿ¤÷O´ý¿vùýŸû?ô§?ý¹ÿOü÷ÿ¡¿¥øoÝû'ýø¿lÚÿþ£[ô~tV×*þXGÿ'þŸûÜÿãþþâÿ­úÐÿñÿãÿÇÿÿß²ÿßû/Ïʯ2ÿ¯¶ÿß®ýÏ:ýñÿ£ÿaÿ‡þöè¯]F¾…uÁÒð¯¿õù·½þ¥öç5üð=~¥¿Ïɯý>mÿßÇ£ý;o{ó—›gùüר¤üwæùŸ¿öúCþ±ÿkö—úŸåûO?ò_£þü‡üCþÑ¿‡õ¯¡ö´þ¥/)ý4^-ÏÒý_Gÿgÿ×åÿß‘WŸ‹òóŸ¶ýOWþ¶Ü¤öööìÿØÿ±ÿcÿÇþ|àÿ›û¿ŽÿG[ÿGÿƒþØÿìÚÿmÛÿôÏÿíÎ_ŸÈ?ÿÃÿ¿mÿÎËöwß½áÄí!ü½ñõ_–ãþRøqÿÇë¸ÿ>þë9ªŸÿ|÷ùŒ}úKáÇýkôïwÿqض‡ú ý÷ç¿_ý_:þïÌ_›þ~½”}>û^ö<õ/ÃëñjI?½÷#ú¬¿«ÝÿËäŸþ~ÿÜþo]þï×ÿ‡mûyùµ¿ÿçêŸåöÿ\ÿœüÅþ×7ýsë¿Mý»ei»þÆáxþ–eúÐÑÿlëØÿ±ÿøÀÇÿo3þ×züþ?ömûcý­Çqþ³cÿ‡ÿ˜ôoëð‰ÿ!þýŸø?øŸø?âÿ°ÿaÿÃþÇþÏýøþ‡ÿ“ÿ]¼ÓíÆ?¹ú,ïŒî»çÝáçì—ïöç=ìÿÆsÝßµ»ú$îùî÷máÇý}»ËÏàÆþ)øñø}¯:üß3ükÅÕ-vŸŸ÷°’ûþnZ¬ÿõóRðsë;®xü¾}ý] -ŸÔïró¿7/¥ð¡¿6ý—¥-üŽ~j>5å¿4þ[ÿ¼‡ØïÏãp®ÿ–¿Æ¡Mü«”ÿz¨ÿîëÓùõïêßöÝ}¿†wLŸ­~µž§·§àÇõïRøçú¯Ûãú[{üâw¼þRûÇÑó¶ÏïqýKïÏ”õ×Þÿ>5þ«Ì¿uù‡þÏù×:þ¹óÏÑy©ÍùC÷üeùü—ÓÿKô¯¼üõÏë?÷qþ±­ÿKè/•¹û¿uë¯üþ/òûö?ìVíèð?ô·Mÿ#ûlý±Üþ«mÿDÿ“Ù/?Õ®mÓÆÿ[íRÿO ÿŸ¦þ—ö?Ãÿœý?ïÿÙïÁþD?G~þ×ôoqþïÑÿgIÿgÿ'þ댿:~—Ò¿Çó¿ÿ?úŸmýùg>ñ¶ý_%矸ý|ü_îü™‚ÿ~•ø?sýóúÿ8HôÉù¯‡óü¯ïÿ·ÿ‡ÿߪý·WûŸìüu|^MísµûÔÿCü?ñÿÚú¯Dÿk±jú_±ÿçåßúï:ûnÿ™æi^–ç}ÆaYž÷q˜æižæi~ÞŸ÷Çkš¯ÇëyÞÇaY¯i‡eùû»Ý¦yš§yš§yYž÷q‡eyÞÇaš§yš§ùyÞ§yš§yYž÷qxÞŸ÷iÎëÿVüÿ®^ÈíÖqõ‰Þÿüçðwï|Gß»þá÷ûÏk?îÿ÷—øƒ¿mü¥ç)þ¹óOÿOßÿ©ƒ_~þƒþÐ_“þÚõ¯Ž¿tý÷^ÿ1wþ–â¯]ÿþ‡ÿ-ó¿uü9ÿlð/ø|öýìó¤ð¥¿çüWj–Ò¿WýÊÖ“Ôÿ¡½þsò¿®þpyýçÞ÷ÿþÒõ¯]ÿ™ýùߣü—Éßv÷ÿ¬ÚÿØÿmìÿÐúcÿGþŸ£¿_¿1~{ýã-øä´ÿ›¾ÿíãßþ—RÿQ:ÿßùû×áú/É_µwÿºÿ\ü»äþw÷êé/•?uó¿Žžæòñ»ø¿8Ÿ™ÞúëUþŸ»¿ÿ{íÖó?ž‹_—Í¿6ÿIñÓž¿ï·>ÿùOȆþ¯_ÿ§Dÿ’êÿšúmøÒù'ÿõ¿àÛù?,Ë?ëö_ìØÿ°ÿÙµÿIõ¿õôóÿÂÿèÿäÿÅþþàÿ‡úOÖê?Aìäÿµ›ÿ—ü–óÿ‘ÿ·ÿëÿˆëæ?îOþ_òÿ¶<ÿÿKðÑÿÑÿñÿãÿÇÿü/“ÿíü¿½ÆcÿƒþVîÿ ÿÁÿÐß&ýÉÿGþÇéOþË﬩ý[šÿO;ÿKÿ\þ=©ý_;ÿù¿mçÿaÿ'ÿ#ùßìæCÿCþqþ±‹¯ù¿{Én½þOîü'•½êÿäÿ'ÿ?ùÿÉÿÿëû¯ö¿oåÿÏáŸ[Rûû?û?öìÿØÿ±ÿëè¿×z~¼½ýg[?Ò¿¶ÏÝë¿ÖÿRý¥ðSû_ØüÁüÿþÂøi·/îËÿX~Jñ÷òûñJÁÏáŸëïå¿oãßñ¯ƒÿ¼§ó9økýúCÿ>äßú,yüùì«ìyWÇ_*ÿÛÍùï×ëÿ}OþÝß­ÿt»{¼Zò -~Ÿ\ÿt»?üÿ[æð·~þ©ñÿ¬ýWWygŽý?šðkèÿ;ý¥ö¿´ÿÁŸ›}ý_æÿ‘æ¿Õöÿ¬ù/”{òWÚ¾ÿY‡jð_¿ËÖú¹uð÷û§~/Ùÿ?C¿Öã¹Æú»¢ü_û¯dûoü]û¥õo¬Ûÿ´é_3ÿåýsó¯½þ´õ_ô?Ûúöü?úKñ/£ßYøíèþàÿëøûÐÓ\ö9|•úWöü3îµÎ—²—ÿ9=þãþq{üwß#ÿW~s]?'®?Uæ¿:†/õµ¢íúß¾êæ¿t¼{¿o·þêè¯Ãÿ2ý_ªÿêç¿´.ÿuë¿éËYý·tý÷¼”Ô¼fþ×–üüCþ¡ÿ÷€;ýóœþÿ+øKéþþÿÃÿßæðÇþ‡ýûû¿Íýþ‡ÿá›üo=þ‘þÜÿçþ}ü¤<þX;þ“ø/è¯ÿš÷_ZÞÿéçþŸÍûÿ~þ.||þÛ[Æÿ—ßÿ÷Ÿëì—ëvÛñÿ-ï¿íß3ëùþ?÷ÿ¸ÿÏù‡ó¯ÕûŸÜÿ!ÿ÷¯Ùÿ¸ÿüÇþƒýú[²ÿ¡ÿÁÿÐß²þOþ?ÛöYý/¹ýóŠë¿%þýÔ’újü=å*ÇÏ¿·Ìÿ£aÿ—úÏZêŸ:þ?üÿìÿ–ã¿Èÿ‡ÿýϪþ‡ÿ›üÿÄÿÙõÕÿÜ»<þI¿þùÿÉÿOüþòÿëØÿúÉÿ/ݤþâÿ‰ÿ×Ìÿ/Õÿjâÿ{ÊÿýŸúŸÖüÿï¹Qûñ;þ vÚ»]úú4üO_>ô‡þZô/Ó_rñ“õý¯ŽÿÕç¿,Õ~þ´øçàzüð?üo™ÿ-ão]ÿwöªÛ-´_íõwí.þ˵çú»öÞàCÿ°n{ßÛ«R¿“οæþ[‚nýíÍK -Nê{ÍõŸ®?3{ò³®þÍ~ýýý_†ÿÕçŸýù¯)ÿµå¯õóû¿íýúÛ¦?öü?ïXŒ0þÁÅ'¤Û[??î/…Ÿ{>ø£ÿÒ×ÿÙ¯Ÿ×/ })’ø§´DôõQJÖ®ÿÑKê’Êþ>üõô—Ê?íúOéõ"]Ïû¹çëɯêûðëôOÿüx|iýW -‹?öÿ£óÿ²„ç—ýõZwþÛ§¿¶ü/Á?·þòç?ÿüÔ|j®ëþ7üŸèÇÖõÍúÇÚúÿú¯~ýWâÿlÇÿYçëñvåŸuû/ö?ìØÿìÚÿ¤úS‹ýSSÿ‚ÿÑÿÑÿ¯{ÿ„þô§¿žüÿüO_>ô‡þzô÷÷OÂü^{ù•Âü_ëû'ÇýÓù£zºÿ²Ÿª¬]J?)üºöÿè½ï½¶¿“Îî•ÃOöòø¬ý÷{üŸZ¹þëö-ÿk¯mþÿùwõù·)ÿÐÿ5ý=ø¿­ãþoûü'Éÿz&¿j.?«ÿ[ßÿÚÐ_*ÿÚ­¿vùmÈ=ÿ¿¶ÿùýsøŸ‡Ó?ž?ïÿGÿCÿÃþýµèŸ®?ׯò×Õ¿ÌÕÓ„_R¿"W?òÊý­Ï¿íõ/µ?—Õÿy¼jëgåëWÖþ¿Gû¾®Ï1ü–ó_c?òß™çbüÚëùÇþ¯Ù_ê–ï?ýÈÿþ¹õ×RþÃÈ?äýµÖ¿†þÙÓú—¾¤ôÓxµ<ÿI÷ýŸý_—ÿGþ]}þ-Ê?ÎÚö?]ùÛrÿ‘ÚØÿÙÿ±ÿcÿÇþýûðüoîÿ:þmýýúcÿ³kÿ·mÿÓ?ÿ·;}"ÿüÿÿ¶ýü9,KØß}÷†·‡ð÷ÆÔYŽûKáÇý¯ãþûø¯ç¨~þýóÝçwN×=úKáÇýkôïwÿqض‡ú ý÷ç¿_ý_:þïÌ_›þ~½”}>û^ö<õ/ÃëñjI?½÷#ú¬¿«ÝÿËäŸþ~ÿÜþo]þ»ûž~X(¿–E&¿ö÷ÿ´üôðsû®Nþbÿë›þ¹õŸžÿÔý÷£ýYÚ®¿q8ž¿w=Àô_ô?ÛúöìÀ>ðñÿÛŒÿµÿ‡ÿý_ÛþØcëñ_œÿìØÿá?æýÛ:|âˆÿCÿ'þþ'þø?ìØÿ°ÿ±ÿsÿþ‡ÿáÿßäït»…ñO®>Ë;cûîywø9ûå»ýyû¿ñ\÷wí®>‰{¾û}[øqßîò3¸ñ -~<~ß«à÷ ÿßZqu‹Ýçç=¬‡ä>‡¿‡ëý¼üÜúߎ+¿o_—Â'õ»ÜüïÍK)|è¯Mÿei ?†ãŸŸšOMù/ÿ–Æ?ïá¶Çûó8œë¿å¯qhÿ*å¿ê¿ûút~ý»úwã°mw߯áÓg«_­çßéí)øqý»þ¹þëö¸þÖÿ‡ø¯¿Ôþqô¼íó{\ÿÒû3eýµ÷¿Oÿ*óo]þ¡ÿsþµŽîüst^jsþÐ=Y>ÿåôÿý+/ýóãúÏ}œlëÿúKå_îþoÝú+¿ÿ‹üÇþƒýûŸUûúüýmÓÿÈ>[g,·ÿjÛ?ÑÿdöËOµkÛß´ñÿV»ÔÿÓÂÿ§©ÿ¥ýOã°Æ?gÿÏûöß{°ÿÑßÏ‘Ÿÿ5ý[œÿ{ôÿYÒÿÙÿ‰ÿ:㯎ߥôïñüoÅÿþg[ÿCþÙ†OüŸmÿWÉù'n?ÿ—;¦à¿_%þÏ\ÿ¼þ?ýFrþëáüß#ÿëûÿ-Åÿáÿ·jÿíÕþ';ŸWSû\íþ#õÿÿOü¿¶þ+ÑÿZ쟚þWìÿyù·þ»ÎþŸÛ¦yš—åy‡qX–ç}¦yš§yšŸ÷çýñšæÇëñzÞŸ÷qX–ÇkšÇaYþþn·ižæižæi^–ç}ÆaYž÷q˜æižæi~ÞŸ÷ižæi^–ç}ž÷ç}šóú¿ÿ?ÿøÇ?»ÿbùˇ\û§ázüÚð¡?ô×ü·Î¬”ú>þ{›¿PÖÿêø_}þ×ù½ÖësÏþÛ¤ÿrð?=~øþ·ÌÿÖñ·þÏå ŒßKŸû>nï ¾õRû“tþµ÷ßþ¹õ'µ¿i¯íü£úû¿ ÿ«Ï?û?ò_SþkË_ëç?öÛû?ô·MìÿøÖñ…q|bºýìüæž÷—ÂÏ=ÿìø~Ú­¶»Ø¨ió=íÝÿŽã§Êü/>~3Îÿ—Î2³ÿ3…_®ÿÑËÇyœâ˜·œÿHò’ú¯Zô—Ð_*ÿÒó¿ÿ›ÿqÿ¸=ÿQ¾³ºõ÷¼Ÿ{¾žü·~ÿÁºü×Îÿ§-ÿÉÿ¡ÜÃú·|ÿýý?Ö¯Žî_ÖéŸÇú¿¦þ#Å¿…þ»?éü§î¿éÿÇ矜þ,?ÖŸ¿ZŒ?÷Êá'}ÁÿÚüÿ¹øÑOÃoÓß®ü³nÿÅþ‡ýûŸ]ûŸTj±jê_ð?ú?ú¿¶þIúÓÿŠòÿð?=~møÐúëÑßç‡rgÁŸ]ÿõóÃö·}ek¼Âvíüw1~ñøÊÛ¥ô“¯kÿnÑûÞkû;éüç^9üd/Ýüc}ÔÕäÿß‘WŸ›òý_Óÿ׃ÿÛ:þèÿ¶Ïn}yùè×Oºý¬|Í=_›ÿ­ïmè/•íÖ_z}åð·+ÿõüÿÚþ_ä?ôÏá~Lÿxþ¼ÿýýû?ô×¢¿~þ©k翺~ëóo{ýKíÏkøá{üJ¯ÿ9‡ÿ>mìÿÛyÛ›¿Ü<Ëç¿Æ~Ð2ÿxîùŸ¿öúCþ±ÿëæÿ—ùŸåûO?ò?…nýµ”ÿðòùG­õ¯¡ö´þ¥/)ý4^-ÏÒý_Gÿgÿ×åÿß‘WŸ‹òóŸ¶ýOWþ¶Ü¤öööìÿØÿ±ÿcÿ§þÿøÇ?ê¿SÿúCêSÿû3ö™þ*ý§­Ãÿð¿eþ§þ¯í·›¯ÿãí‡î¿ûç?×ÕŸôÏÏ=¯ ü¸ÿ~ýËøùeŸÏþ;û<)üòßSÿÕvýWw·0ô¸ïœütíµþÿ|÷¹—õ/õ¿´™íø'O_7{ô¯Û?÷é™Þ¿Ëá—õÏíÿÖå}ý?éþŸ«–Ûÿ?]ÿï×ÏÚôÏå¯Ï­çO׿¬[åõµõ_ô?Ûúöü?ÔG¤v»õ?©ÿCýêÿجÿCýkÛò?®[Ÿ®_ÿ¼Õ¹—ο&ÿ•àŸ[{ó’‚“úþCþ!ÿh·XÿïêøÿBýEôêÂÿvùß2þìÿØÿ°ÿ±ÿ[Þÿáøþ·ÉÿÖãÁŸÜÿ÷ñéøÉ¸ýlüÒþzÖŽÿ$þ úá_ÿìóµï¿èÝÿÑŽæþ¿§ÿ:þ}¯þ\œÿ_ÿŸ«_—»ÿ#­g=þ_ûþ™þýîÿqÿßú?ÎÿVñçþù$÷¿ËäoÜ¿§ûÿäÿáþ¿uùýûö?‹ö?ô?øúÛ¥?ùÿlëÚùGúXÿzøk×ú¤þ?mýOZÿIzÿN¿þÓ4¯é›öŸ…íçóïË3mÿŸuýŸýßö?òÿÙöÿ£ÿÙÖÿøgûñ¶ý_¹óO¬?×Åÿ?uëÿÿŸüÿÄÿáÿ·jÿÕ¶ÿiçÿ—î?RÿñÿÄÿkê¿RýOºÿhû_±ÿSÿÓ²ÿ_*ÿýüÉÿü÷ü{ù—æ?)ü”ü_Ã_çð·¿ûïó»ï\þ×þ†ÿï{—ϸþïì,ûðsøçú¯Û·ù‹òøŸ‡ÿž—íü9øoîoèý{ÇË÷_LJøöiÛ§yÛþx¥û?^áó©üo7ÿ˲ßî¿uóïÿOóöó4oÛ×ïíø~ÿ\ÿx¼Ûïáøß.ÿƒ?矽þã°máïÙÏŽú/Ëq)ü¸ÿ4÷çü··ÿö=ÔÿåôïYÿ/Yéýÿhþ–åxþtÖZ~.˱üMÉï¸=÷üž÷ÿrü¥ò¯Ýü/K;ú°ÿ#ÿõäüÇ?ÍGãÇþÇþoyÿ‡þÐû?ö¿røkþæòþ{úð¯ÿÿ/êÿåþŸœæèü¶µÿŸ—¿áú/ß¿Òò÷<~iÿ“Tþ_Çÿ—žŸZù#]_çÆ¿ÿ{­õ׳ü/³_ýnì?%çÙü÷"ÿËÏåãÿÆü}¿ÿ÷üø?ñ¢ÿ÷ÿ"iOÅÿô¡ÿHñÓ†/=ÿGüüOüŸ5ùgÝþ‹ýûö?»ö¿Vú_mü/þ_øýÿ?öðü?Äÿ ý±ÿéÞÿÑ¿ÿdýþêsøÞ*þ»GýŸûÜÿãþ÷ÿ8ÿÿþëþôôüÿøÿñÿ#ÿåÿúüòyøšñߨÿ ¿ÿ?úüýmÑ?WÿëvÛ¶‡õ'öêWõ_–ãþRøqÿÇ븿^ý³Üøëà§ê_íÕÿê›þÖñÿôú—Ú¿¯’÷eÙûœ“9úÚþ‘¿—ÚÿÏÎWÝ|ï¿KíRù—³„8¥ÆÿYûÝú+×ìÿšô—Þ–Ò¿'ùŸêŸ[-åëýùgùüc ÿvúg>«½þÓã;Ö?[Ò_ -¿ê÷¥þ¿òóŸtÿïQÿ·´ÿ÷ÈÿW’Òý_ãüo]þqþëÛþW'ÛÅ?ŸÙ¤öööìÿØÿ±ÿcÿÇþþàþÚþŸ\üQKùߣÿç×å?ôgÿoeÿÙ?g–=ïêøÿ¦ýýþ‡ÿ-Ø¿±ÿsþ)³?Æþ«ßퟞÿuÿÇ«¼ÿýõàÿ‡ÿÿ´ÿûCŸµùÿéþ›nÿÌü?^mÛ÷ü?_?LºÿÖÉßòþÒúgÖíÚôÏ­ÿOçßøôúÓÖÑÿˆÿÀþýûøƒ?ñ¿ÿOý¿ÿø?ëñ¿øÿ¸ÿÏýWîÿsþãþ?÷ÿ‘èÿ¶îÿÿCüú?ñð?ñÄÿaÿÃþ‡ýýÿã?àøþ·ÅÿßÛ-Äßïßøß´òñÞ~éÚsý]û›ï|;ð¯BøÏ{ØßÁ)…?máÇýŸ÷þû[ðÿûsõNÆ!¬âꓼ_þsüûë/?·þKÆ¿ï>eðÃù÷Ïñõ_<ì<|è5ú·…¯)ÿ??Ÿë¿‡ÿ·Ú¥ñ¯Rùß{ý¯\ýúó¯YoÿÏà—ë/}¾æúÏÅHã´÷?)þéñùùŸæ¶ó_—ÿÔ¢üCÿçükþyý?<çH×ÿúymÎ_ñøŸ÷ô¹ŒóŸvýáÞÏ?ô ýuæÿwÖß5å?ö?ìØÿ~Áþ‡þÿCÛô×´?öÚnÝþp‡¯RÿÊžƽÖùRöò?§ÇÜ?nÿÎá{äÿJÃa®ëçÄõ§ÊüWÇð¥þ¯Vô¯]ÿÛWÝü—Žwï÷íÖ_ýuø_¦ÿKõ_ýü—Öå¿ný7}ù/«ÿ–®?ðž—’úƒ×ÌÿÚ’ÿ‘È?ôÿðo§žÓÿ)ýÑÿÑÿáøÿÛüþØÿ°ÿaÿcÿ·¹ÿÃÿð?üo“ÿ­Ç?ÒŸûÿÜÿ¯Ÿ”ÇkÇÿýõà_óþKËû?ýÜÿ³yÿßϿӅÏa{ËøÿòûÿþsýrÝn;þ¿åý·ý{f=ßÿçþ÷ÿ9ÿpþµzÿ“û?äÿáþ5û÷ÿ‘ÿذÿAKö?ô?øú[ÖÿÉÿgÛ~ «ÿ%·^qý·Ä¿ŸúORÿOÿ¯§üOåøù÷–ù4ìÿRÿYKýSÇÿ‡ÿŸýßrüùÿðÿ£ÿYÕÿð“ÿŸø?»þ¯ºóŸ{—Ç?é×ÿ!ÿ?ùÿ‰ÿÃÿOþû_?ùÿ¥ûÔÿCü?ñÿšùÿ¥ú_MüOùÿ±ÿSÿÓšÿÿ=¢7=Öø»ñ¥ÛÝ»ûË›nÏ=?î/…Ÿ{þÙñ?øÿ.þï\$aþ“ãÏáKŠÿöÂËáŸëŸã{þÙçCè¯Cíü‡WÇ_ºþ{Êÿ¶Ÿ?-Î_溒⯙ÿ þ‡ÿ­ó¿eü­ëÿÎ^y»…öË=øÎ¾åâ¿ÜóÃþããïÚãñ¹ß·…¿Å?„ÏùoMÿ¿‡°þÍÞ~þn¤ô×ÖÿKðÏ­¿½yY'ü>œOÍõ¯]ÿFÿ—á/]ÿW¯ÿÃþü—îÿë絑¿[ùŸ–ËœÿØÿmïÿÐß6ý±ÿãÿÉê?´ÓŽÿÿ'ñ¯óÿÄõKêï_ÖÉßsý>Kë¿Håÿ5ýçè“÷ÿÿsýsã×\Úò½ÎþïïÇúý^ÿcû¿|ì?5ç¿ð<#Mþ«;ÿ…ë¯dþŽÏWã¿vþ?üŸø?Ñÿ¯ÿRž?µ,þGOÿÑ¿öüÿGüüOüŸUùgݾ‹ýûö?»ö?©þ×"þ_Óÿ ÿ£ÿ£ÿëÝÿ¹úýðÿ«ã¯¹ÿkËéþŸ†ÂÌŸŸ ?ô×¢¿,ÿ×úþIØ^š_ªŸû/5ù¯ZÊ)üÚü·þÿ4o?Oó¶}ý.»ÿµæŸ4¼<þ¹þÇ/ïÚ¿Çÿ©õçž³ŽÿNóÿ8lù_{ýkóÿïÈ¿ºõïéßnþSó{$?,Ë?ômÿ3ý¯ëÿGÿ¿þù¯Uý´OÔ_û&ÿXßÿ´ég}ý]Gþ·óÿkû‘ÿÐ_>úúöè¯Aê_Rÿ‘ú¯v×?õ¨ÿCý»õØÿmïÿÒü§-ëÿjËëõÑÿöÎ?œÿZÕ¿®Ñÿ{ZÿÒú»Rú_§þoúü'Ýÿuôö]þÿù'Ýÿ5ÎÿÖåç?mûßqüsümÿfÿ‘ÚØÿÙÿ±ÿcÿÇþýûøƒ?ø^ÿ—Ýj)ÿuöÛòú³ÿ·²ÿÔÛ—~ÿkÚÿÑÿáøû7øÿ]j\–ÐþXÚÏÿ¥ ¿†þ¿ÓŸø?üÿYÿwÓöýÏ:üƒÿ¿–^­é×z<×XW”ÿ¾þ˜tÿ­“¿~ÿÏo¹ñ§óÏÙ¶ÿiÓ¿fþËûçïë®?mýýÏzüöìøÁü­ûÿ¥þŸšóeOòßfü/þ?îÿsÿ•ûœÿ¸ÿÏýäú¿Uü‰ÿ!þýŸø?øŸø?âÿ°ÿaÿÃþÇþoçþüÿÃÿ¶øÿ=¢7=Öø»ñÑNû¶Ý½»¿ü·éöÜóãþRø¹çŸßoãÿ®EÖ?9óYº¾¤Ï—Žÿ<üxþr¯Üó¡ÿµèß¾¦|—ÆKãŸÝïo·°ÿÞø]»ƒïÚsý]ûYü«Tþ÷Pÿ|]Ÿþ]¿~¿þ×8¼ÿvuî[Ì¿fý=‡ï8„øïñgjýåú¯Ûcþ×_ÿ²øiüƒöþ'Åß=?œ7Ï¥ó?Ímç¿.ÿ©Eù‡þÏùÖzûyý5|I×Wî¼tþüu<Þóç³ß=ÿi×Ö?ÿX×ÿuég}ý]SþcÿÃþ‡ýïìèð?ô·Kmû£6|ëú_ÝüC+ûç5×;üÝïÛÂßâÂÞ[ù¤þ?mý«ÿœýßû‘Æ!ôóäý?=Øÿ%þ³çMÿŸuýŸýß¶ÿ§Äÿû«cy&Mþ³îÿGÿ³­ÿáÿ¶?ñ¶ý_uç¿i÷Iü“•ëÿñùå¸ܾþ»nÿ‡Vç¿ÎÿšüÍøgëñøÿ¥]Ûþ§}þª³?Ms+ÿñÿÄÿkÇÿKô¿ñÿšþ_ìÿ5ü³Öµåñß×ÿÃñ[öÿ»<’ñûßο½ßåúç¾>ðÿ}øiûÃ8ìÉ—Øþðiø9üËÎßûömøÐúkÒ?:Î_íÿ®Ë½Ÿúêø_}þÓçøüæíñùCŠ~ÿ²óçþùþ‡ÿ-ó¿uü9¤á[·~þsû{®]:Ͻêÿ¥øiÏŸô}_þz9·‡òWÖ¿ßý_6þ«Ì?û?ò¿Gùÿ-ù‹ýýßòþý¡?öëòßîýð—ñÿ§ùøŸ…¯ÿÇ͵¹±ÿKÇå9ÜÞ1pëq¬cÆŽü_eñÇð%þ7©ÿKÿþOjþËã/}ôßÑø};÷Êö¿P]Ùù:÷üqh YZÿ-ì?›õŸý¾Ké¯)ÿKðÍ­¿½y)Ï׿v»6ÿ]}þÀÿÜýßvõ?®yÿù—îÿæÏ?ë¿ëôÿÜù³þü•ÖÿSã?Òÿ·ûöÞý¦:ýÿXÿ€ÿµù¿þüÝfþuÏÿ–åù?±ÿaÿÃþg9ÿDÿkqÿBSÿ‚ÿÑÿÑÿµõOàøW”ÿ߀ÿIùß|èý{?nœÿ>;ûÉ7ÛÃñ¿ÛÇaÛâß®8¾÷ü­óë¥Çÿ©ù?ÿ¸¿k÷ߺùÿ/Xå»tþÓÏõ¯þ¹þeßÇüëå\éø÷úÇí¡üìuýkóÿõäßÕçߪüãü¡çÿëÁÿmôëúÿ²„òÓ¯Ÿu~ïzù»îÿ¾‹}¼~›ÿ­ïmè/•íÖ_Ü¿ »ò_Ïÿ¯íÿEþCIþ÷2úûçÇõÐÿÐÿ°ÿC-ú÷›êù¯´óo~¾õù·±þ¥öãÇKö®ÿYŠŸÔþ/¿–ó_ch™<ûŠÇÿYûÿ§×òý§Ïüÿçå—tÿÑ–ÿ)üëÇÿùƒÿÈ?à·€¯ý®½þÃ÷2ýósóþqÿô÷-ÏmÏŸÚú¿½ý¿/þ¿žü»úü[”œÿzµÿ}Gþ¶Ü¤öööìÿØÿ±ÿcÿ§þð|ê¿SÿúCêSÿû»þÿ²øS)þÚú7üÿ[æêÿrþpùY}ÿÜç³ïgŸ'…/ý½ûïþùÏuó{^øqêÿRÿõ¨þüûÿzý„þƒe‘ùâþyþÿÖú—úOÚÌ¿vüÇ>ýý-Kýþ¿/ÿÒã/‡ŸÞÿãþ¹ýߺü¯¯ÿ'ÝÿsõËrûù§ëÿY­ÿ¬Mÿç½lýºþeÝú+¯¨­ÿ¢ÿÙÖÿ°ÿ#ÿ©¿|àÛ­ÿIýêÿPÿÇfýê_³ÿäë׿Kç_›ÿ¤øiÏü‡üCþÿŠõÿ®Žÿ/Ô_Dÿ§þ'üo—ÿ-ãÏþýûû¿åýþ‡ÿá›üo=þü¹ÿÂýÿe9ŽŸtßÕÆí¯ÿ>â?‰ÿµMÿei ?¦ÿ²„ðýóû¸ÿÒßýŸoÅ?sÿÿ¸þå8lÛ×ú·4þ?Wÿ.wÿGZÿÎzü¿öý³~ïÿ[ºÿÇýîÿsþçþ?÷læÿ©¿ÿ]&ýóÝç^Ö?ù¸ÿüÇþ‡ýûŸEûúüýíÒŸüØ?zÈCÒ›ýÍÊ»Ôÿ#õÿiëÒúOÒûw}ÔZ–cÿ™k¯Íÿ½/ÿzõÿYÑÿÙÿ‰ÿ"ÿŸ]ÿ?úŸmýÿ·møÄÿÙöIë—¶9öWÿ‡üÿäÿ'ÿ?þÿ_·ÿöjÿûVþéþ#õÿÿOü¿¦þÛ²~}Íþ£íÅþOýOËþ?ï¹rãÛ£ÿ6ýéOÿ+÷_çJñyiÒù_âü)߀ÿéñkÇþпùñ¥ûëÝÿ›íWÇÿªó/}µâÿÜó?5~øþ·ÌÿàoYÿ¿vþi9|诙ÿUÿÕÍ?Úÿ¹qËO×þ¶Ã®á÷_–>åo;ü¯>ÿìÿÈÿïËmùkýüÇþo}ÿ‡þ–éýûŸ¿ßéî'îÝÿ¬ƒ÷÷÷³Òý¥ðSñ_àÿ›þiùõ^/ë½ìøó9ÿŒ[¿¾Ý¯Ï´üôðJÖ®©ü—úŸ¤ò_Ïÿ׆þµòoû -ám×OÎÿw<޽߷[1ýÃç¿ÿ~Ö—ÿ²üeú§þ–þÇñßuðËã¿‘ÿn­¯Ï/±üôë·îüwDmùŸÇ?·þòç?ÿü-ÿk¯ëþ7üŸèÏÖûëç9ýKªÿ÷rþ—â/=ÿ·›ÿôüÿGüüOüßyúü¶ü³nÿÅþ‡ýûŸUû_;ýOzÿDÛÿk—ÿÑÿ¹ÿCúÓŸûÿÄqÿú[ŠÿÖ½Òÿ˦ýï?ºEïGgåðw­âuôâÿ¹ÿÇý?îÿáÿ'þߪÿýÿ?þüÿøÿ-ûÿ÷ýç±ÿò¬ü*óÿjûÿíÚÿ¬Óÿ?úöèoþÚõgôáûWX, ÿ÷ú[ŸÛë_j^ÃßãWúûœüÊÑïÓöÿ}<ÚØÿ·ó¶7¹y–Ïý@Êgžÿ‰ñk¯?äû¿f©ÿY¾ÿô#ÿ5êÁÈ?äý{XÿúgOë_ú’ÒOãÕòü'Ýÿuôö]þÿùwõù·(ÿ8ÿiÛÿtåoËýGjÿaÿgÿÇþýû?öì_À>ð¿¹ÿëø´õô?èýÏ®ýß¶ýOÿüßîüõ‰üð?üÿÛöðçü±,a÷ÝNÜÂßÿQÿe9î/…÷¼Žûï㿞£úù÷ÏwŸÿÁا¿~Ü¿Fÿ~÷‡m{¨ÿ—ÐþûÕÿ¥ãÿÎüµéï×KÙç³ïeÏÓXÿ2¼¯–ôÓ{?¢Ïú»Úý¿LþIáï÷ÏíÿÖåÿ~ý¿qضŸ—_ûû®þYnÿÏõÏÉ_ì}Ó?·þÛÔ¿[–¶ëoŽçoYÆ¡ýý϶þ‡ýûð|üÿ6ã­Çÿáÿcÿ×¶?öØßzüç?;öøùGÿ¶ŸøâÿÐÿ‰ÿƒÿ‰ÿ#þûö?ììÿÜÿ‡ÿáøÿ7ùßÅ;Ýnaü“«ÏòÎXà¾{Þ~Î~ùnÞÃþo<×ý]»«Oâžï~ß~Üß·»ü n|àŸ‚ß÷ªÃø=Ãÿ·V\Ýb÷ùyë!¹ÏáïÆ¡Åú_?/?·þ·ãŠÇïÛ×ߥðIý.7ÿ{óR -úkÓYÚÂáøç§æSSþKã¿¥ñÏ{ø‡íñþ<çúoùkÚÄ¿Jù¯‡úï¾>_ÿ®þÝ8lÛÝ÷kxÇôÙêWëùwz{ -~\ÿ.…®ÿº=®¿µÇÿ!~Çë/µ=oûü׿ôþLYíýïSã¿Êü[—èÿœ­ãŸ;ÿ—Úœ?tÏ_–Ï9ý¿DÿÊË_ÿü¸þsçÛú¿„þRù—»ÿ[·þÊïÿ"ÿ±ÿ`ÿÃþgÕþ‡þÿCÛô?²ÏÖÙËí¿ÚöOô?™ýòSíÚö7mü¿Õ.õÿ´ðÿiêiÿÓ8¬ñÏÙÿóþŸý÷ìÿGô÷säçMÿçÿý–ôöâ¿Îø«ãw)ý{<ÿ[ñÿ£ÿÙÖÿ¶áÿgÛÿUrþ‰ÛÏÇÿåΟ)øïW‰ÿ3×?¯ÿƒD¿‘œÿz8ÿ÷ÈÿúþKñøÿ­Ú{µÿÉÎ_ÇçÕÔ>W»ÿHý?Äÿÿ¯­ÿJô¿û§¦ÿû^þ­ÿ®³ÿçöŸižæeyÞÇa–åy‡ižæižæçýy¼¦ùñz¼ž÷ç}–åñšæqX–¿¿Ûmš§yš§yš—åy‡qX–ç}¦yš§yšŸ÷ç}š§yš—åy‡çýyŸæ¼þoÅÿïòÄï;ÿö~—ëŸûøÀþ÷áKåϧáçðÿ´ýõÓð¡?ôפ¿vþ¡«ãõù—Ú¤økçß‚ÿáËüoÎiøÖß­ŸÿJíÇÒyîUÿ/ÅO{þ¤ïÚõgúÝÿeã¿Êü³ÿ#ÿ{”ÿß’¿ØÿØÿ-ïÿÐúcÿ·.ÿÉÿÇýîßX½ÿ#¹ÿÝ"ÿ_Ÿ÷ÿ‰ÿåþ?÷ÿ¹ÿÏýîÿsÿŸûÿÜÿGÿ¶wÿßFþoîÿsÿ‡üÿäÿ'ÿ?÷ÿ¹ÿýûö?;õ?%ú_‹û}Þÿ·Äÿèÿ¶óÿøÀ·ëÿ¡þ õ ¿]û_õ¿¿›ÿÔ¶ýü¿ÖóÿöÇÿW‘¿‘ÿ×®üCÿ'þúÏèÿøÿñÿãÿÇÿoSþ[¯ÿnÝþgþ¶ïÿ ÿaÿ‡þäÿçüÌ¿­w©ýXšN;ÿJÿÚñ—Úÿµóÿ‘ÿÛvþö{ò?’ÿÍnþ7øùæüc~¯ù¿õóŸ[¯ÿSvþûÜùSWÿ'ÿ?ùÿÉÿOþÿ_ßÿ{µÿ}KþJ÷éù“ýŸýû?öìÿØÿuô_ÿJ}ÿ½­IúÓÿªý½ü|ËJ'Ÿöä,?? ÿÓã׆ý¡/òCûuuü¯8ÿëõû¾'ï¿-ioÉÿ¹çbüð?üo™ÿÁßúùÁßÿôö÷ëïÚkíÏþùîóûNÓžý[ -?î¿oÿvmîùïûðëæ?î¿Æ?Õ_ -?…ÿÞþ%³ÿÉýÚú¿®ýQÛÿ³æÿ5/øÏ×¶}ýþx÷O}Ö[ÿy¼R¸¤ñ¯Ÿÿ6ðû=7GŸ4½Ê÷Ï2ù'…/ý½]ù_ŸÿAºÿçò?äöyýëö?mú§æoŸþeóŸ¢ÿÑþ¿,m×_yþmýý϶þ‡ýÿxþèOú_¶¿ô%õ¿¬s5ûº8éüÏGãßë·ÇKñ“Âo忒ο”þŸZŸ¿öúÓåÿòOj·.ÿuë¿éóŸnýøù‡ü£ýµôÏ_ÁÿªóþoYÿ‡ÿ­ó?øcÿÃþ‡ýýßæþÿÃÿð¿Mþ·ÿþÜŸçþ¿ïLÇO†íçã—ö׿~ü'ñ_Ðÿ:ø1ýãù[ÇÿöpÿEóþO÷ÿ,ßÿ÷ôv~êÇ˯ÿ5øv÷þxµŒÿ÷ú½‡Ÿ»Ï“ëŸ??ØŽÿïãþ™öýgë÷ÿ¸ÿoûüÀùßîýOîÿÿ§Íýïúûå}Ø¿ìîÜÿ·-ÿ±ÿaÿÃþgÑþ‡þÿCËú?ùÿlÛ?´óÏõcÿÕË¿§]ÿ©ÿ§Æÿ×Gþ§iÞâWfo™ÿGÃþ¿¥oÊ·ŸÍÿ]¦ÿëøÿðÿ³ÿ[Žÿ"ÿþô?«úþoòÿÿg×ÿ•;ÿlõçšø¿²ü£:õÈÿOþòÿãÿ'ÿ¿Žý¯ŸüÿÒýGêÿ!þŸøÍüÿRý¯ÞþÜGþ»öêZõÿ¿Gô–kû©“Oév÷îþòߦÛsÏûKáçžv|àþ¿‹ÿ¿ß¾ÿ?ïeŸÃ—ÿí+„—Ã?×?ÿ:Æ÷<ü³Ï‡þÐ_‡þÒøoiüÃÕñ—®ÿ2ÿõÙù?ÿþήO—ßçÈ÷íq®+)þÛüY!üþ¹þGù·àøß:ÿ[Æßºþïì·[hÿ܃ïì[.þË=?ì?1þ®=Ÿû}[ø[üCøœÿÖôÿ÷[W·Æ}ÞÛ¯Â߃”þÚú þ¹õ·7/ëñ„߇ó©¹þ¥ñŸRÿ‡þþ/Ã_ºþsþϺù?ëÿdÿGþëÈÿøymäïVþ§å2ç?öÛû?ô·Mìÿø²úí´ãÿÿIüëü?^~ÕcùVþžëô¹ÿÜùW"ÿ¯éÿ;GŸ¼ÿïìüŸëŸ¿æúÓ–ïuöÿe õÏ|ÿcû¿|ì?5ç¿ð<#Mþ«;ÿ…ë¯dþŽÏWã¿vþ?üŸø?Ñÿ¯ÿûodú¿¦þ£=~íù'þø?øŸø?«òϺ}ûö?ìvíRý¯Eü¿¦ÿþGÿGÿ×»ÿsõû/àþWÇ_sÿ×–ÿÒý? ?„™??Aè¯EYþ·õý“ýüaGõ%ú¹ÿRSÿ¢¥ü—¯ÍçÿOóöó4oÛ×ï²û_kþIÃËãŸëüòø®ý÷{üŸZî9ëøï4ÿÖÿµ×¿6ÿÿŽü«[ÿ©üƒÒùOÍï‘ü°,ÿÐÿµýÏô¿®ÿýÿú翬üÿR»6ÿXßÿ´ég}ý]Gþ·óÿkû‘ÿÐ_>úúöè¯AêÿÚ®ÿ¤Oê_ë×ÿѬÿÕOýçþ¹ú‡-ë?µ«¿˜ª—uTÿ§Þþ!•úõ¿ŽõçºõW®ÿ ÿØÿ{©ÿXãnYÿO[þ[¬ÿ‡þ‡ü³}þáü§[ÿ»Ÿõo±þ5õÙÿuùÿwäŸtÿ×8ÿ[—œÿ´íÇñÏuò·]üÿ™ýGjÿaÿgÿÇþýû?öì_VìŸàþ}ìÿ:þmýýúcÿ³kÿ·mÿÓ?ÿß>sþª»ÿ ÿÃÿ–íÿàÏùgÿÛmÛþïoÿ·û§çÝÿñ*ï¿G=ø¹ýo¶í¡þŸZ¿·[éü÷®ÿ§ÇÿxŽçÏ×ïÉñ~YÿÇë¸ÿ‘üÿÞgmþ+oú½fýç÷¿røí~ŸÛÓퟙÿÇ«mûþï‘ÿ¥ò?–_õûoü-ïŸ?ö¿¾éŸ[ÿ¡ÿ.g¿ÜË¿¦·þ´õ_ô?ÛúöìØ?ÀüñÿÛŒÿµÿ‡ÿýYÚêŸuö/mû'ñ_œÿ,Ûÿ{ääòýŸøâÐÿÑÿáøŸø?âÿ°ÿaÿcÿgÿ‡ÿáøþ¯ç‡ïíâïÆ÷ÎXà¾{Þ]»³_ºö\×îò+¸và_þ8„ðŸ÷°¿ƒS -ÚÂûûv—ŸÃüß¿‡°þñóÖCqŸãß·X9ø¹õ_2þõxð)ƒοޝÿ¼®“ƒý¯Fÿ¶ð5åÿ§ãçsý÷ðÿV»4þU*ÿ{¨ÿ¾®OïÖ¯«5Ûöi×»tþà§ñ_÷Ÿæ\ÿu{\kÿÏà—ë/}¾æúÏÅHã´÷?)þéñùùŸæ¶ó÷Ÿæãþvåú?ç_ëðÏëÿá9Gºþ×ÏksþŠÇÿ¼§Ïeœÿêä¨Iî_ö~þ± ÿKè¯3ÿ¿³þ®)ÿ±ÿaÿÃþ÷ ö?ô?øúÛ¦¿¦ý±×vëö‡ãù‡VöÏk®ÿÏã/ƒ¿,¥ã“úZøÿ4õ¯üsöÿíþ5¥þŸìÿåþ³ç=¦‹óþ?Kú?û?ñ_šþëÏÿVüÿè¶õ?äŸmü‰ÿ³íÿª;ÿ½¿_¯wIü“ÓáËõÿÐÿ™ë¿nwŸsö¿ãýyZÿz8ÿ÷Èÿ}Ç?[ÿÃÿÿ+öß^íß:ÕÙŸ¦¹•ÿ‡øâÿµõ_‰þ×"þ_Óÿ‹ý¿Æþïéß"þqš§yš—åy‡qX–ç}Y¦yY¦yšŸ÷çýñZ–ÇkYž÷ç}–åñšæqX–¿¿Ûmš§yš§yš—åy‡qX–ç}Y¦yY¦yšŸ÷ç}š§yš—åy‡çýyŸæ¼þoÅÿÿþçó1”}>ûïìó¤ð¥¿ð·,_bùœnåG=þN>¹¿cø9|rýÓí~ü9üëàŸ}>ô‡þ:ôëúþ{ù‡¶ù3ýkûܽþýÈ?)þÒõŸž?éü§ò?…}|þ·µý̯Ï=ûCl?âïíW -~ÿ\oÿx¼Rã‡ÿáËüoëú¿Ëx»…ù÷à‡¿{ç<úÞõ¿ß^ø[üÓã‚þÒø)ýµõÿþ¹õ'µj¯íüçúû¿ éúׯÀþüדÿ9ÿGü-÷X?ÿ±ÿÛÞÿ¡¿múcÿÇÿ“¥?í´ïð¿tý—ñïYøíøÿ×ñã'}¼Ò^üW?Yç? -Çw”o¦dþrý>—àäÿzÞK^Çðóþ«}øRÿ—”þRùR7ÿçúçÆ¯¹þ´å»õûÖå¿vþ?mþ#ÿ‡îýçÖ¿åûßèÿèÿý½…þ¯©ÿh_{þëôgFºþýýi®9•ôÛãñŸ×?ž÷Vç?øÿŠüÇÊÖ¿öùß²ü³nßÅþ‡ýûŸ]ûŸTÿK¯¿ç=]ÿ|ÿùå¼þµ½ÿ¿÷‚ÿÑÿÑÿëõ_)ÿ_Sÿðÿü5÷mù/ÝÿÓðC˜ùóô‡þZô÷÷_Ü\<^¾ÿZ>úöiÛ§yÛþx¥û?^áóµóß寗jñk#ÿ¥ð÷ûÇíëþ>ÿךüçiÞ¶¯ß§9ÿíñ*Ë?œz…ðsøçú¿dùÓùÇÆ!ÍÿÛüƒ=ÕÕáÿß‘uëßÓ¿Ýü§æ÷H~X–èÿÚþgú_×ÿþýó_Vþ©]›¬ïÚô³¾þ®#ÿÛùÿµý¿Èè¯ ýýû?ô× ¿vþ¯«ç¿’æ?ÕÏÿ©Mëøë®©ý{ ?|Û–%õY;ÿsÿíøÃw©ý?ýÜýùÚŸç£þ{t‘Ûÿ¥ò/g¿H¯ŸxüŸ³ÿ×­¿rýùÇþ¯›ÿ¿¦þ¦÷?Kéß“üOáŸ[-å¿ÎúGÿCþY>ÿpþÛê—Rý³\ÿïiý—wÿ%¥¿~Íï[žÿ¤û¿ŽþÏþ¯Ëÿ¿#ÿ¤û¿Æùߺüãü§mÿ;Ž®“¿íâÿÏì?Rûû?û?öìÿØÿ±ÿSÿˆúïàþÔ§þ ô‡þÔÿ¦þ÷gì?²û¯RüµÏð?üo™ÿ©ÿk[ÿwöÂsõ'·õœOÍõ¯ÍÿÈ?äú¿ÝúWÇÿê£ÿSÿþ·Ëÿ–ñgÿÇþ‡ýýßòþÿÃÿð¿Mþ'žÏÜÿçþmü¤t=iÇÿý5á_óþK»û?ÚñÏÜÿ¯Éÿß.þ¿.ÿVyÿÜùÓzü¿vþ{ýûÿÜÿãþ?çη6?sÿ‡ü?–ï_“ÿ‡ûÿÈì?Øÿ ¿EûúüýíÒŸü¶?×ÍÿíÖÊþyÍõßíü/RÿÔÿ§­Ië?Iïÿé×’ùϤòGÛÿg]ÿgÿ·íÿ!ÿŸmÿ?úŸmýÿ·mü‰ÿ³íÿª;ÿMs«ü¯ÚõÈÿOþâÿðÿ[ý¬mÿÓ>Ië?Ký?Äÿÿ¯©ÿJõ?iü¿¶ÿû?õ?-ûÿßóô^ëõæïðóó¿Ÿÿ\¿þÃü À>ð5á»0ëüÅëœ)ë¿Çáýûõï> ?‡Ùø}þå0Œ>|èý{?nœÿ>»þký*lëWkøÇý]ûã¶ÿþWÿÿr€ï{¯íïZñÿüþeãÏ}ÿÃÿ6ùü9lû¿çw¶í!ü_íoýüçõü¸=Ôÿåóß§þïñ¬ÿ÷æ¯Uÿ´|ý^{_û¿tü×›öä?òÿ{òûû¿åýúCìÿ–íõñ?eðýóãø«4þRø©øðÇÿ ü´üõõR¶Ÿ×ßûöÏ_Ëž¿üúLËßýú/eò7Uÿ%/ÿ¥þ'©ü×óÿµ¡­üÛ>7„®Ÿÿ_<þœÿoYÚ®¿˜þþùÿÔ÷þçâ½eúgÜßÇçð¯ƒ÷Çþ_"ÿSë¶íçÏ/Çô×—ÿÇøçÖ_þüÏß²Ï_ëߺÿ ÿ'ú·ø±~µÖÏóú—TÿïEÿ‘â/=ÿ·›ÿ¸?ñÄÿÁÿÄÿíù¿mË?ëö_ìØÿ°ÿÙµÿµÒÿ¤÷O´ý¿vùýŸû?À>ð‰ÿ%þ‹ø_èÏý_íû?Ú÷Ÿ¬ßÿ/oÜ—þÏý?îÿqÿûvüÿÄÿ[õÿ ÿãÿÇÿÿÿ¿eÿÿ¾ÿܵ×Êÿ2ÿ¯¶ÿß®ýÏ:ýñÿ£ÿaÿ‡þö蟮?ñ¯®„¯3·‡õ'~µÿ㕪ŸSV#Õ¯þV¯ð­Ï¿õ/µ?^²÷œüËÑÿÓöÿúñ—Ùÿ¥ó×rþkìRþËÁß¾âñÖþÿéõ‡ücÿÑ„ßR~I÷mùŸÂ¿~üß™?øù‡ü~ øÚïÚë?|/Ó??7ÿçá÷Oßòü×öü©­ÿÛÛÿûâÿëÉ¿«Ï¿EùÇù¯WûßwäoËýGjÿaÿgÿÇþýû?öìÀ>ðõü?eñGŸ†¯çÿ±!ÿ¡?û?öìÿèÿð?üoÛþýßêùcYÂþËÚ—EfŒû/Ëq)üe9g?ÝÇ=GõóïŸï>ÿƒ±O)ü¸?ñÄÿå׿—‡¹ÏgßËž§±þñÿçè³þ®vÿ/“Røûýsû¿uù__ÿOºÿçî?çöÿO×ÿ³aÿë—þ¹õÿéüOu민þ¡¶þ‹þGüöìÀ>ð‰ÿ•ø¤þ§¾âÿ¬Çÿâÿãþ?÷_¹ÿÏùûÿÜÿgþÑ¿mÝÿ'þ‡ø?ôâÿàâÿˆÿÃþ‡ýûûÿ/ßÿ‚ÿáøßÿ»x§Û-ŒrõYþÿ«èëüëåì—ïöç=ìÿÆsÝßµ¿¿÷Ïw¿o ?îÿ¼‡ðßß‚ÿüxü¾WþÀïþ¿µ2aý#WŸèýòŸÃßC‹õ¿~^ -~nýoÇß·¯¿Ká“ú]nþ÷æ¥>ôצÿ²´…ÃñÏOͧ¦ü—ÆKãŸ÷ðÛãýyÎõßò×8´‰•ò_ïõÿÆaÛ¾®ÿ•›ß=ýj=ÿšõÿöø?Äïxý¥ö£çmŸßãú—ÞŸ)믽ÿ}jüW™ëòýŸó¯uüs矣óR›ó‡îùËòùO»þyçÛú¿„þRù§]ÿùýûö?«ö?ô?øúÛ¦ÿ‘}¶ÎþXnÿÕ¶¢ÿÉì—Ÿj×¶¿iãÿ­v©ÿ§…ÿOSÿKûŸÆaÎþŸ÷ÿì¿÷`ÿ?¢¿Ÿ#?ÿkú·8ÿ÷èÿ³¤ÿ³ÿÿuÆ_¿Kéßãùߊÿý϶þ‡ü³ Ÿø?Ûþ¯’óOÜ~>þ/wþLÁ¿JüŸ¹þyý$úäü×Ãù¿Gþ×÷ÿ[ŠÿÃÿoÕþÛ«ýOvþ:>¯¦ö¹ÚýGêÿ!þŸømýW¢ÿµØ?5ý¯Øÿóòoýwý?·ÿLó4/Ëó>ã°,Ïû8Ló4Oó4?ïÏûã5Í×ãõ¼?ïã°,×4òüýÝnÓ<ÍÓ<ÍÓ¼,Ïû8ŒÃ²<ïã0ÍÓ<ÍÓü¼?ïÓ<ÍÓ¼,Ïû8<ïÏû4çõ+þW/äv 뇸úDïþsø»w>£ï]ÿðûýçµ÷ÿûK üÁß6þÒóÿÜù'‡ÿ§ïÿÔÁ/?ÿAè¯Iíú‡WÇ_ºþ{¯ÿ˜;Kñ×®ÿÿÃÿ–ùß:þœ6ø|>û~öyRøÒßsþ+µ?Kéß«þ?eëIêÿÐ^ÿ9ù_W¸¼þsïûéú×®ÿÌþüïQþËäo»ûVíìÿ6öèý±ÿ#ÿÏÑ߯ß¿½þÇñÀ¿|ò?Z‰ÿMßÿöñ‹oÿK©ÿ(ÿïüýëpý—ä¯Ú»]‚.þ]rÿ»û?õô—ÊŸºù_ÇOsùø]ü_œÏLoýõ*ÿÏÝßÿ½vëùÏÅ¯Ëæ_›ÿ¤øiÏß÷Û?Ÿÿƒü'ä?CÿׯÿS¢IõMýGŠ¿6|éü“ÿ‹ú_ð¿íü–åŸuû/ö?ìØÿìÚÿ¤ú_‹ú?úùáôòÿbÿðÇÿCý'kõŸ ?ö?òÿÚÍÿKþ?ËùÿÈÿ[‹õÄ¿uó÷'ÿ/ù[žˆ¿ÿ%øèÿèÿøÿñÿãÿGþ—Éÿvþß^㿱ÿA+÷Ðÿàèo“þäÿ#ÿcô'ÿåwÖ¿Ôþ-Íÿ§ÿ%‡.ÿžÔþ¯ÿüß¶óÿ°ÿ“ÿ‘üovó¿¡ÿ!ÿ8ÿØÅ¿×üß½ä?·^ÿ'wþ“Ê¿^õòÿ“ÿŸüÿäÿÿõý¿Wûß·òÿçðÏ­?©ý‡ýŸýû?öìÿØÿuôßÇk=¿ÞÞþ³­é_Ûçîõ_ë©þRø©ý/ìþàþaü´Û÷å,?¥ø{ùýx¥àçðÏõ÷òß·‡ñïÇø×ÁÞÓùüµþý¡òo}–<þ|öUö¼«ã/•ÿíæ¿ü÷ëõÿ¾'ÿîïֺݽ?^-ù??‡O®ºÝþ‡ÿ-ó?ø[?ÿÔøÖþ«Ç«¼¿³?ÇþMø5ôÿþRû_Úÿà¿ÏÍ¿¾þ/óÿHóßjûÖüÊÎ=ù+mßÿ¬Ã?5ø¯ßeë?ýÜ:øûýS¿—ìÿŸ¡_ëñ\cý]Qþ¯ýW²ý·Nþ®ýÇÒú7ÖíÚô¯™ÿòþ¹ù×^Úú/úŸmýû?þ ý¥ø—Ñï,üvôðÿuü}èi.û¾Jý+{þ÷ZçKÙËÿœÿqÿ¸=þ;‡ï‘ÿ+ ?„¹®Ÿן*ó_×ú¿ZÑ¿výo_uó_:޽߷[uô×á™þ/Õõó_Z—ÿºõßô忬þ[ºþÀ{^Jê^3ÿkKþGþ!ÿÐÿ{À¿þyNÿÿü¥ôGÿGÿ‡ÿáÿoó?øcÿÃþ‡ýýßæþÿÃÿð¿Mþ·ÿHîÿsÿ¿>~R¬ÿIüô׃Íû/-ïÿôsÿÏæý?ÿN>>„í-ãÿËïÿûÏuöËu»íøÿ–÷ßöï™õ|ÿŸûÜÿçüÃù×êýOîÿÿ‡û×ìÜÿGþcÿÁþý-ÙÿÐÿàèoYÿ'ÿŸmû¬þ—ÜþyÅõßÿ~ê?Iý?5þ¿žò?•ãçß[æÿѰÿKýg-õOÿþöËñ_äÿÃÿþgUÿÃÿMþâÿìú¿êÎî]ÿ¤_ÿ‡üÿäÿ'þÿ?ùÿuìýäÿ—î?RÿñÿÄÿkæÿ—ê5ñÿ=åÿÇþOýOkþÿ÷ˆÞôXãïÆ—nwïî/ÿmº=÷ü¸¿~îùgÇþàÿ»ø¿s‘„ùOŽ?‡/)þÛW/‡®þuŒïyøgŸý¡¿ýµó^éúï)ÿÛ~þ´8U˜ëJŠ¿fþ7øþ·Îÿ–ñ·®ÿ;{åíÚ/÷à;û–‹ÿrÏûCŒ¿kÇç~ßþÿ>ç¿5ýÿývÂú7{ûUø»qÒ_[ÿ/Á?·þöæe=žðûp>5׿výýý_†¿tý_½þû?ò_ºÿ¯Ÿ×FþnåZ.sþcÿ·½ÿCÛôÇþÿ'«ÿÐN;þÿŸÄ¿Îÿ×/©¿Y'Ïõ?ú,­ÿ"•ÿ×ôÿ£OÞÿwvþÏõÏ_sýiË÷:û¿¿ÿë÷{ýíÿzð±ÿÔœÿÂóŒtþ5ù¯îü®¿’ù;>ÿ]ÿÚùÿðâÿDÿ¿ZüKyþÔ²ø=ýG{üÚóOüñð?ñVåŸuû.ö?ìØÿìÚÿ¤ú_‹øMÿ/üþþ¯wÿçê÷_Àü¯Ž¿æþ¯-ÿ¥û~3~‚þÐ_‹þ²ü_ëû'a{i~©~î¿Ôä¿j)ÿ¥ðkóßúÿÓ¼ý<ÍÛöõ»ìþךÒðòøçú¿<¾kÿýÿ§ÖŸ{Î:þ;Íÿã°åíõ¯Íÿ¿#ÿêÖ¿§»ùOÍï‘ü°,ÿÐÿµýÏô¿®ÿýÿúç¿VõÓ>Qí›üc}ÿÓ¦ŸõõwùßÎÿ¯íÿEþCmøèèØÿ¡¿ý©IýGê¿Ú]ÿÔÿ¡þõìÖÿaÿ·½ÿK󟶬ÿ«-ÿ­×ÿEÿCþÙ;ÿpþkUÿºFÿïiýKëïJéú¿éóŸtÿ×ÑÿÙÿuùÿwäŸtÿ×8ÿ[—œÿ´íÇñÏuò·]üÿ™ýGjÿaÿgÿÇþýû?öìàþàÿyý_vÿ©¥ü×ÙÿmËèÏþßÊþSo_ú ü¯iÿGÿ‡ÿáìßàOüw©ýqYBûciÿ=ÿ—&üúÿNâÿðÿgýßMÛ÷?ëðþÿZzµ¦_ëñ\cý]QþûúcÒý·Nþúý?<¿åÆŸÎ?gÛþ§Mÿšù/¬»þ´õ_ô?ëñØÿ±ÿáÿð·îÿ—újΗ=É›ñ¿øÿ¸ÿÏýWîpþãþ?÷ÿ‘èÿVñ'þ‡ø?ôâÿàâÿˆÿÃþ‡ýûû¿û_ð?üÿÛâÿ÷ˆÞôXãïÆG;íÛv÷îþòߦÛsÏûKáçžv|¿ÿ»IXÿäÌgéú’>_:þóðãù˽rχþ×¢[øšò]ÿ-v¿¿ÝÂþ{ãwí¾kÏõwí[üeñ¯RùßCýóu}úwýúýú_ãðþÛÕ¹o1ÿšõ÷¾ãâ¿ÇŸ©õ—ë¿nù_ýËâ?¤ñÚûŸ÷üpþÝ<—Îÿ4·ÿºü§åú?ç[ëíçõ×ð%]_¹óÒùó×ñxÏŸÏ~÷ü§]Xÿüc]ÿ×¥ŸõõwMùýûö¿_°ÿ¡ÿÁÿÐß.ýµíÚð­ëuó?­ìŸ×\ÿíðw¿o ‹ÿyoåÿ‘úÿ´õ¯üsöïG‡ÐÏ“÷ÿô`ÿ—øÏZœÿ5ýÖõöÛþŸÿw쯎å™tþ5ùϺÿý϶þ‡ÿÛ6þÄÿÙöÕÿ¦9Üÿ%ñOþU®ÿÇç—ãþqûúïºýZÿz8ÿkòÿ5㟭Çÿáÿÿ•vmûŸöù«Îþ4Í­ü?Äÿÿ¯ÿ/ÑÿZÄÿkú±ÿ×ðÏZ×–Ç?~_ÿÇoÙÿïòHÆï;ÿö~—ëŸûøÀþ÷á§íã°'_bûçáçð/;ïÛ?´áCè¯Iÿtþé8µÿ».ÿõ~þé«ãõùOŸ?âó›·Äç)þ9ø9üËΟûçøþ·ÌÿÖñçü‘†oýÝúùÏíï¹vé<÷ªÿ—â§=Ò÷}ùëålÜÊ_Yÿ~÷Ùø¯2ÿìÿÈÿåÿ·ä/ö?öËû?ô‡þØÿ­Ë»÷_À_ÆÿŸæ?à¾vü_7׿þÅ6þ/—çp{ÇÀ­Ç±Ž;ò•Åÿ׸ߤþ/ýû?©ù/¿ôÑGã÷íÜÿ)ÛÿBýuYdçëÜóÇ¡-üeiuþ·°ÿlÖösø.¥¿¦ü/Á7·þöæ¥t>{\ÿÚíÚüwõùCþÿs÷ÛÕÿ¸æýç_ºÿ›?ÿ¬ÿ®ÓÿsçÏúóWZÿOÿHÿßîÛ{÷›êôÿcýþ׿ÿúów›ù×=ÿ[–äÿÄþ‡ýûŸåü?ý¯Åý Mý þGÿGÿ×Ö?|à_Qþþ'åð¡?ôïAþ¸qþûìì'ßlÇÿn‡m{ˆ»þáøÞó·Î¯—ÿ§æÿ<üãþ®Ýëæÿ¿`•ïÒùO?׿røçú—}ó¯—s¥ãßë·‡ò³×õ¯ÍÿדWŸ«òó‡žÿ¯ÿ·uüÑÿ­ëÿËÊO¿~Öù½ëåïºÿû.öñþùmþ·¾ÿµ¡¿Tþµ[qÿ2üíÊ=ÿ¿¶ÿùý%ùßËèïŸ×@ÿCÿÃþýµèßoþ©kä¿Òοù9øÖç߯ú—Ú/Ù»vþg)~Rû¿tþZÎý¡eþñüí+ÿgíÿŸ^È?öŸ>óÿŸ—_ÒýG[þ§ð¯ÿwæþCþ!ÿ€ß¾ö»öúßËôÏÏÍÿyøÇýÓß·<ÿµ=jëÿööÿ¾øÿzòïêóoQþqþëÕþ÷ùÛrÿ‘ÚØÿÙÿ±ÿcÿÇþýŸúGÀ>ð©ÿNýèý©ÿMýïïúÿËâO¥økëßð?üo™ÿ©ÿËùÃågõýsŸÏ¾Ÿ}ž¾ô÷î¿ûç?×Í¿~îymàÇý©ÿKý×£úóïÿëõú–Eæˆûçùÿ[ë_ê?i3ÿÚñûô÷s´,õûÿ¾üK¿~zÿûçöëò¿¾þŸtÿÏÕ/Ëí矮ÿgµþ³6ýŸ÷²õÿéú—u민þ¡¶þ‹þg[ÿÃþü§þ"ðo·þ'õ¨ÿCý›õ¨Íþ“¯_ü.mþ“â§=ðòùü+Öÿ»:þ¿PýŸúŸð¿]þ·Œ?û?ö?ììÿ–÷øþ‡ÿmò¿õøGðçþ ÷ÿ—å8~Ò}Wÿµ¿þûˆÿ$þ×6ý—¥-ü˜þËÂ÷ÏïãþK÷¾ÿÌýÿãú—ã°m_ëßÒøÿ\ý»Üýiý;ëñÿÚ÷Ïú½ÿoéþ÷ÿ¹ÿÏùŸûÿÜÿ±™ÿ§þþw™üõÏwŸ{Yÿäÿáþ?òûö?ìíèð?ô·Kòÿaÿè!Ioö7+ïRÿÔÿ§­ÿIë?IïßõQÿiYŽýg®½6ÿ÷¾üëÕÿgEÿgÿ'þ‹üvýÿè¶õ?üß¶áÿgÛÿ%­_ÚæüÙ_ýòÿ“ÿŸüÿøÿÝþÛ«ýï[ùÿ¥ûÔÿCü?ñÿšúoËúõ5û¶ÿû?õ?-ûÿýü½çÊoþÛüô§?ý¯Ü+Åç¥Iç‰ó§|þ§Ç¯ úCÿäÇ{”î¯wÿo¶_ÿ«Î¿ôÕŠÿsÏÿÔøáøß2ÿƒ¿eýÿÚù§åð¡¿fþWýýW7ÿhOüçÆy,?]ûÛ»†ÜYú”¿íð¿úü³ÿ#ÿ¿/ÿµå¯õóû¿õýú[¦?öìþ~§»Ÿ¸wÿ³~ÜßßÏJ÷—ÂOÅ?þoú§å×{½¬÷²ãÏçü3nýúv¿>ÓòÓÃ+Yÿ¹þ¥ò_ê’Ê=ÿ_ú×Ê¿í+„·]?9ÿßñx÷~ßnýÅôŸÿþûýY_þËò?”éŸþù[úÇ×Á/ÿFþ»µ¾>¿ÄòӯߺóßýµåÿÜúËŸÿüó·ü¯½þ­ûßð¢?[ײַçô/©þßËù_Š¿ôüßnþÓóKüñð?ñçéóÛòϺýûö?ìVííô?éýmÿ¯]þGÿçþýéOîÿÿÅýèo)þ[÷þI?þ/›ö¿ÿ轕ÃßµŠ?ÖÑÿ‰ÿçþ÷ÿ¸ÿ‡ÿŸø«þôüÿøÿñÿãÿ·ìÿß÷ŸÇþ˳ò«Ìÿ«íÿ·kÿ³NüÿèØÿ¡¿=úkןчï_a]°4üßëo}þm¯©ýy ?|_éïsò+G¿OÛÿ÷ñhcÿßÎÛÞüåæY>ÿ5ö)ÿyþ'Ư½þìÿšý¥þgùþÓüר?ÿ!ÿôïaýkèŸ=­éKJ?WËóŸtÿ×ÑÿÙÿuùÿwäßÕçߢüãü§mÿÓ•¿-÷©ý‡ýŸýû?öìÿØÿ±øÀÿæþ¯ãÿÑÖÿÑÿ ?ö?»öÛö?ýó»ó×'òOÀÿðÿoÛÿÁŸóDz„ýÝwo8q{oüGý—帿~Üÿñ:î¿ÿzŽêçß?ß}þcŸþRøqÿýûݶí¡þ_BÿýùïWÿ—Žÿ;óצ¿_/eŸÏ¾—=OcýËðz¼ZÒOïýˆ>ëïj÷ÿ2ù'…¿ß?·ÿ[—ÿûõÿÆaÛ~^~íïÿ¹úg¹ý?×?'±ÿõMÿÜúoSÿnYÚ®¿q8ž¿e‡>ô_ô?ÛúöìÀ>ðñÿÛŒÿµÿ‡ÿý_ÛþØcëñ_œÿìØÿá?æýÛ:|âˆÿCÿ'þþ'þø?ìØÿ°ÿ±ÿsÿþ‡ÿáÿßäït»…ñO®>Ë;cûîywø9ûå»ýyû¿ñ\÷wí®>‰{¾û}[øqßîò3¸ñ -~<~ß«à÷ ÿßZqu‹Ýçç=¬‡ä>‡¿‡ëý¼üÜúߎ+¿o_—Â'õ»ÜüïÍK)|è¯Mÿei ?†ãŸŸšOMù/ÿ–Æ?ïá¶Çûó8œë¿å¯qhÿ*å¿ê¿ûút~ý»úwã°mw߯áÓg«_­çßéí)øqý»þ¹þëö¸þÖÿ‡ø¯¿Ôþqô¼íó{\ÿÒû3eýµ÷¿Oÿ*óo]þ¡ÿsþµŽîüst^jsþÐ=Y>ÿåôÿý+/ýóãúÏ}œlëÿúKå_îþoÝú+¿ÿ‹üÇþƒýûŸUûúüýmÓÿÈ>[g,·ÿjÛ?ÑÿdöËOµkÛß´ñÿV»ÔÿÓÂÿ§©ÿ¥ýOã°Æ?gÿÏûöß{°ÿÑßÏ‘Ÿÿ5ý[œÿ{ôÿYÒÿÙÿ‰ÿ:㯎ߥôïñüoÅÿþg[ÿCþÙ†OüŸmÿWÉù'n?ÿ—;¦à¿_%þÏ\ÿ¼þ?ýFrþëáüß#ÿëûÿ-Åÿáÿ·jÿíÕþ';ŸWSû\íþ#õÿÿOü¿¶þ+ÑÿZ쟚þWìÿyù·þ»ÎþŸÛ¦yš—åy‡qX–ç}¦yš§yšŸ÷çýñšæÇëñzÞŸ÷qX–ÇkšÇaYþþn·ižæižæi^–ç}ÆaYž÷q˜æižæi~ÞŸ÷ižæi^–ç}ž÷ç}šóú¿ÿ¿«r»…õC\}¢÷?ÿ9üÝ;ŸÀÑ÷®øýþóÚÀûÿý¥ÇþàoéùGŠîü“ÃÿÓ÷êà—Ÿÿ ?ôפ¿výëã/]ÿ½×Ì¿¥øk×ÿƒÿáËüoÎ?ü >Ÿ}?û<)|éï9ÿ•ÚŸ¥ôïUÿ‡²õ$õh¯ÿœü¯«?\^ÿ¹÷ý?‡¿týk×fÿGþ÷(ÿeò·Ýý?«ö?öû?ô‡þØÿ‘ÿçèï×oŒß^ÿãøGà_ >ù­Äÿ¦ïûøÅ·ÿ¥Ô”Îÿwþþu¸þKòWíÝ¿.Á?ÿ.¹ÿÝÇýŸzúKåOÝü¯ã‡§¹|ü.þ/Îg¦·þz•ÿçîïÿ^»õüçâ×eó¯ÍRü´çïûíŸÏÿAþòŸ¡ÿë×ÿ)Ñ¿¤ú¿¦þ#Å_¾tþÉÿEý/øßvþËòϺýûö?ìvíRý¯Eýýü¿ð?ú?ù±ÿ€?øãÿ¡þ“µúOÐûùíæÿ%ÿŸåüäÿ­Ç¿Åú?âߺùû“ÿ—ü¿-Ï?Äßÿ|ôôüÿøÿñÿ#ÿËä;ÿo¯ñߨÿ ¿•û?èð?ô·Iòÿ‘ÿ±Gú“ÿò;ë_jÿ–æÿÓÎÿ’Ã?—Ojÿ×ÎÿGþoÛùØÿÉÿHþ7»ùßÐÿœìâßkþï^òŸ[¯ÿ“;ÿIå_¯ú?ùÿÉÿOþòÿÿúþß«ýï[ùÿsøçÖŸÔþÃþÏþýû?öìÿ:úï㵞_ooÿÙÖô¯ís÷ú¯õ¿T)üÔþöðÿ¿¿0~Úí‹ûò?–ŸRü½ü~¼Rðsøçú{ùïÛÃø÷cüëà?ïéüGþZÿ‡þпù·>K>û*{ÞÕñ—Êÿvó_þûõúß“÷wë?ÝîÞ¯–üŸ‚ŸÃ'×?ÝîÇÿÃÿ–ùü­Ÿjü?kÿÕãUÞßÙŸcÿ&üúÿN©ý/íðßçæ__ÿ—ù¤ùoµý?kþ eçžü•¶ïÖáŸü×ï²õŸ~nüýþ©ßKöÿÏЯõx®±þ®(ÿ×þ+Ùþ['×þciýëö?mú×ÌyÿÜük¯?mýý϶þ‡ýÿ„þRüËèw~;úƒ?øÿ:þ>ô4—}_¥þ•=ÿŒ{­ó¥ìåNÿ¸ÜÿÃ÷Èÿ•†Â\×ωëO•ù¯ŽáKý_­è_»þ·¯ºù/ïÞïÛ­¿:úëð¿Lÿ—ê¿úù/­ËÝúoúò_Vÿ-]à=/%õ¯™ÿµ%ÿ#ÿèÿ=àßNÿ<§ÿÿ -þRú£ÿ£ÿÃÿðÿ·ùü±ÿaÿÃþÇþosÿ‡ÿáøß&ÿ[¤?÷ÿ¹ÿ_?)?ÖŽÿ$þ úëÁ¿æý—–÷ú¹ÿgóþ¿Ÿ§ Ÿ?Âö–ñÿå÷ÿýç:ûåºÝvüËûoû÷Ìz¾ÿÏý?îÿsþáükõþ'÷ÈÿÃýkö?îÿ#ÿ±ÿ`ÿƒþ–ìèð?ô·¬ÿ“ÿ϶ý@VÿKnÿ¼âúo‰?õŸ¤þŸÿ_OùŸÊñóï-óÿhØÿ¥þ³–ú§Žÿÿ?û¿åø/òÿáÿGÿ³ªÿáÿ&ÿ?ñvý_uç?÷.Ò¯ÿCþòÿÿ‡ÿŸüÿ:ö¿~òÿK÷©ÿ‡øâÿ5óÿKõ¿šøÿžòÿcÿ§þ§5ÿÿ{DnÔ~üŽ?h§ößn—¾> ÿÓã׆ý¡¿ýËô—\üd}ÿ«ãõù/Ë_µŸ?­þ9øŸ?üÿ[æËø[×ÿ½êv íW{ý]»‹ÿrí¹þ®½7øÐ?¬[ãÞ÷öªÔï¤ó¯¹ÿ–àŸ[{ó’‚“ú^sý§ëόÞü¬«³_Fÿ—áõùgÿGþkÊmùkýüÇþo{ÿ‡þ¶éýÿÏ;#Œpñ éöÖÏûKáçžþè¿´ÇõöëçÄõKB_Š$þ)-}}”’õŸëô’úŸ¤²¿ÿ_=ý¥òO»þSz½H×ßó~îùzòßÅ+‡úã>ü:ýÓ??_Zÿ•Âßâýÿèü¿,áùe½Öÿöé¯-ÿKðÏ­¿üùÏ??5Ÿšëߺÿ ÿ'ú±uý_³þ±¶þ#Å¿…þ«_ÿ•ø?ÛñÖùßzüŸ]ùgÝþ‹ýûö?»ö?©þÔbÿÔÔ¿àôôÿëÞ?¡?ýé¯'ÿ¿ÿÓã׆ý¡¿ýýý“0¿×^~¥0ÿ×úþÉqÿtþ¨žî¿ìç‡*k—ÒO -¿®ý?ºEï{¯íï¤óŸ{åð“½<>kÿýÿ§Ö_®ÿº}ËÿÚë_›ÿGþ]}þmÊ?ôMÿ_þoëø£ÿÛ>ÿIò¿žÉ¯šËϪÇÿÖ÷¿6ô—Ê¿vë¯]þ_ò_Ïÿ¯íÿEþCÿþçáÇôçÏûÿÑÿÐÿ°ÿC-ú§ëÅõ«üßuõ/sõÇ4á—Ô¯ÈÕ¼rëóo{ýKíÏeõ¯ÚúYùúÕŸµÿïãÑÆþŸ¯ës ¿åüר¤üwæùŸ¿öúCþ±ÿkö—úŸåûO?ò?…nýµ”ÿðòùG­õ¯¡ö´þ¥/)ý4^-ÏÒý_Gÿgÿ×åÿß‘WŸ‹òóŸ¶ýOWþ¶Ü¤öööìÿØÿ±ÿcÿÇþ|àÿ›û¿ŽÿG[ÿGÿƒþØÿìÚÿmÛÿôÏÿíÎ_ŸÈ?ÿÃÿ¿mÿÎËöwß½áÄí!ü½ñõ_–ãþRøqÿÇë¸ÿ>þë9ªŸÿ|÷ùÓuþRøqÿýûݶí¡þ_BÿýùïWÿ—Žÿ;óצ¿_/eŸÏ¾—=OcýËðz¼ZÒOïýˆ>ëïj÷ÿ2ù'…¿ß?·ÿ[—ÿî~±¯ʯe‘ɯýý?-?=üÜþŸëŸ“¿Øÿú¦ný§ç?uÿýhÿ_–¶ëoŽçï]°ýý϶þ‡ýûð|üÿ6ã­Çÿáÿcÿ×¶?öØßzüç?;öøùGÿ¶ŸøâÿÐÿ‰ÿƒÿ‰ÿ#þûö?ììÿÜÿ‡ÿáøÿ7ùßÅ;Ýnaü“«ÏòÎXà¾{Þ~Î~ùnÞÃþo<×ý]»«Oâžï~ß~Üß·»ü n|àŸ‚ß÷ªÃø=Ãÿ·V\Ýb÷ùyë!¹ÏáïÆ¡Åú_?/?·þ·ãŠÇïÛ×ߥðIý.7ÿ{óR -úkÓYÚÂáøç§æSSþKã¿¥ñÏ{ø‡íñþ<çúoùkÚÄ¿Jù¯‡úï¾>_ÿ®þÝ8lÛÝ÷kxÇôÙêWëùwz{ -~\ÿ.…®ÿº=®¿µÇÿ!~Çë/µ=oûü׿ôþLYíýïSã¿Êü[—èÿœ­ãŸ;ÿ—Úœ?tÏ_–Ï9ý¿DÿÊË_ÿü¸þsçÛú¿„þRù—»ÿ[·þÊïÿ"ÿ±ÿ`ÿÃþgÕþ‡þÿCÛô?²ÏÖÙËí¿ÚöOô?™ýòSíÚö7mü¿Õ.õÿ´ðÿiêiÿÓ8¬ñÏÙÿóþŸý÷ìÿGô÷säçMÿçÿý–ôöâ¿Îø«ãw)ý{<ÿ[ñÿ£ÿÙÖÿ¶áÿgÛÿUrþ‰ÛÏÇÿåΟ)øïW‰ÿ3×?¯ÿƒD¿‘œÿz8ÿ÷ÈÿúþKñøÿ­Ú{µÿÉÎ_ÇçÕÔ>W»ÿHý?Äÿÿ¯­ÿJô¿û§¦ÿû^þ­ÿ®³ÿçöŸižæeyÞÇa–åy‡ižæižæçýy¼¦ùñz¼ž÷ç}–åñšæqX–¿¿Ûmš§yš§yš—åy‡qX–ç}¦yš§yšŸ÷ç}š§yš—åy‡çýyŸæ¼þoÅÿÏ?þñÏî¿X¾Äò!×þiøŸ¿6|èý5ÿ­3+¥¾ÿÞæ/”õ¿:þWŸÿu~¯õúܳ?Äöé¿üOþ‡ÿ-ó¿uü­ÿsùã÷Òßç¾Û{ƒoýŸÔþ$íý7‡nýIíoÚë_;ÿ¨þþ/ÃÿêóÏþü×”ÿÚò×úùýßöþýmÓû?þŸu|aŸ˜n?;¿¹çÇý¥ðsÏ?;¾_ÇŸv«í.6jšÃ|O{÷¿ãø©2ÿ‹ßŒóÿ¥³ÌìßÿLá—ëôòñc§8æ-ç?’¼¤þ«ý%ô—Ê¿ôüïÇÿ¦ÇÜ?nÇ”ï¬ný=ï瞯'ÿ­ß°.ÿµóÿiËòèÆ÷°þ-ßÿF?Fÿõ«£û—uúç±þ¯©ÿHño¡ÿnçO:ÿ©û¯Gúÿñù'§?ËÏŸõç¯ãϽrøI_ð¿6ÿ.~ôÓðÛô·+ÿ¬Û±ÿaÿÃþg×þ'ÕŸZ쟚úüþþ¯­ÒŸþô¿¢üÿüO_>ô‡þzô÷ù¡ÜYðßg×ýü°ým_YçŸ;îïÚ¯°];ÿ]Œ_<¾òv)ý¤ðëÚÿ£[ô¾÷ÚþN:ÿ¹W?ÙK7ÿXõ_5ùÿwäßÕçߦüCÿ×ôÿõàÿ¶Ž?ú¿íóŸ[_^>úõ“n?+_sÏ׿ëû_úKå_»õ—^_9üíÊ=ÿ¿¶ÿùýsøŸ‡Ó?ž?ïÿGÿCÿÃþýµè¯ŸêÚù¯®ßßúüÛ^ÿRûó~ø¿ÒßkçÎá¿GûÿvÞöæ/7Ïòù¯±´Ì?ž{þ'Ư½þìÿºùÿeþgùþÓüOáŸ[-å?ü‡üCþÑ_kýkèŸ=­éKJ?WËóŸtÿ×ÑÿÙÿuùÿwäßÕçߢüãü§mÿÓ•¿-÷©ý‡ýŸýû?öìÿØÿ©Ä?þñúïÔþПúßÔÿþŒýG¦¿Jÿiëßð?üo™ÿ©ÿkûßíæëÿxû¡ûïþùÏuõ'ýósÏk?î¿_ÿ2~~Ùç³ÿÎ>O -¿ü÷Ôµ]ÿÕÝ- ýî;'?]{­ÿÁ?ß}îeýKý/mæ_;þÉÓ×ÍßýëöÏ}z¦÷ïrøeýsû¿uù__ÿOºÿçêŸåöÿO×ÿûõóŸ6ýsùësëùÓõ/ëÖ_yýCmýý϶þ‡ýÿõi§ÝnýOêÿPÿ‡ú?6ëÿPÿÚ¶üëÖ§ë×?ïGuî¥ó¯É%øçÖßÞ¼¤à¤¾‡ÿÈ?Ú-Öÿ»:þ¿PýŸúŸð¿]þ·Œ?û?ö?ììÿ–÷øþ‡ÿmò¿õøGðç÷ÿ}|g:~2n?¿´¿žµã?‰ÿ‚þGø×Á?û|íû/z÷´ãŸ¹ÿï鿎ß«?çÿ—Æÿçê×åîÿHëßYÿ×¾¦ÿŸûÜÿ·þó¿Uü¹ÿCþÉýï2ù÷ïéþ?ù¸ÿo]þcÿÃþ‡ýÏ¢ýýþ‡þvéOþ?ÛúŸvþ‘>Ö¿þÚð¥þ©ÿO[ÿ“Ö’Þ¿Ó¯ÿ4Íkú¦ýgaûùüßûòLÛÿg]ÿgÿ·ýü¶ýÿè¶õ?þÙþGüŸmÿWîüëÏuñGçOÝú?äÿ'ÿ?ñøÿ­ÚµíÚùÿ¥ûÔÿCü?ñÿšú¯Tÿ“î?ÚþWìÿÔÿ´ìÿÿ?›Ê \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_0_0f3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0f3_states.bin.bz2 new file mode 100644 index 000000000..d18971ec8 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0f3_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0f3_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0f3_states.bin.z deleted file mode 100644 index 8f783f784..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0f3_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0f5_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0f5_states.bin.bz2 new file mode 100644 index 000000000..7102292c4 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0f5_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0f5_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0f5_states.bin.z deleted file mode 100644 index aa13d9a1d..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0f5_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0f7_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0f7_states.bin.bz2 new file mode 100644 index 000000000..4da9f8558 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0f7_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0f7_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0f7_states.bin.z deleted file mode 100644 index 6d19ae6ae..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0f7_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0f9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0f9_states.bin.bz2 new file mode 100644 index 000000000..476895cd1 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0f9_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0f9_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0f9_states.bin.z deleted file mode 100644 index 2606b9409..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0f9_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0fb_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0fb_states.bin.bz2 new file mode 100644 index 000000000..39a913d64 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0fb_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0fb_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0fb_states.bin.z deleted file mode 100644 index b263f23ae..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0fb_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0fd_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0fd_states.bin.bz2 new file mode 100644 index 000000000..ffc3cf539 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0fd_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0fd_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0fd_states.bin.z deleted file mode 100644 index 68b581ee2..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0fd_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_0ff_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_0ff_states.bin.bz2 new file mode 100644 index 000000000..0c96f7625 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_0ff_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_0ff_states.bin.z b/client/resources/hardnested_tables/bitflip_0_0ff_states.bin.z deleted file mode 100644 index f73f50d8e..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_0ff_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_104_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_104_states.bin.bz2 new file mode 100644 index 000000000..a5c2ad9bf Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_104_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_104_states.bin.z b/client/resources/hardnested_tables/bitflip_0_104_states.bin.z deleted file mode 100644 index a65adef0e..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_104_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_10c_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_10c_states.bin.bz2 new file mode 100644 index 000000000..e3aa0c2b5 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_10c_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_10c_states.bin.z b/client/resources/hardnested_tables/bitflip_0_10c_states.bin.z deleted file mode 100644 index f9cb945ef..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_10c_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_111_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_111_states.bin.bz2 new file mode 100644 index 000000000..8cd2e0ba0 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_111_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_111_states.bin.z b/client/resources/hardnested_tables/bitflip_0_111_states.bin.z deleted file mode 100644 index 10cbb8de5..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_111_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_113_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_113_states.bin.bz2 new file mode 100644 index 000000000..c1b73e1cf Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_113_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_113_states.bin.z b/client/resources/hardnested_tables/bitflip_0_113_states.bin.z deleted file mode 100644 index b350136d5..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_113_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_115_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_115_states.bin.bz2 new file mode 100644 index 000000000..464b2e5d6 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_115_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_115_states.bin.z b/client/resources/hardnested_tables/bitflip_0_115_states.bin.z deleted file mode 100644 index c6661ae8c..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_115_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_117_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_117_states.bin.bz2 new file mode 100644 index 000000000..87f7542d3 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_117_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_117_states.bin.z b/client/resources/hardnested_tables/bitflip_0_117_states.bin.z deleted file mode 100644 index 647feb09f..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_117_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_119_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_119_states.bin.bz2 new file mode 100644 index 000000000..05620bba0 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_119_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_119_states.bin.z b/client/resources/hardnested_tables/bitflip_0_119_states.bin.z deleted file mode 100644 index 289598b1a..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_119_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_11b_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_11b_states.bin.bz2 new file mode 100644 index 000000000..cce41a523 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_11b_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_11b_states.bin.z b/client/resources/hardnested_tables/bitflip_0_11b_states.bin.z deleted file mode 100644 index 099dab124..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_11b_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_11d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_11d_states.bin.bz2 new file mode 100644 index 000000000..6aa3f4638 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_11d_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_11d_states.bin.z b/client/resources/hardnested_tables/bitflip_0_11d_states.bin.z deleted file mode 100644 index 3d9511d85..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_11d_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_11f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_11f_states.bin.bz2 new file mode 100644 index 000000000..5892009d2 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_11f_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_11f_states.bin.z b/client/resources/hardnested_tables/bitflip_0_11f_states.bin.z deleted file mode 100644 index bb92ebe2a..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_11f_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_124_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_124_states.bin.bz2 new file mode 100644 index 000000000..d3601defe Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_124_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_124_states.bin.z b/client/resources/hardnested_tables/bitflip_0_124_states.bin.z deleted file mode 100644 index 0a37cc5ce..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_124_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_12c_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_12c_states.bin.bz2 new file mode 100644 index 000000000..38dbdf227 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_12c_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_12c_states.bin.z b/client/resources/hardnested_tables/bitflip_0_12c_states.bin.z deleted file mode 100644 index ce9a966fa..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_12c_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_131_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_131_states.bin.bz2 new file mode 100644 index 000000000..0afa8f655 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_131_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_131_states.bin.z b/client/resources/hardnested_tables/bitflip_0_131_states.bin.z deleted file mode 100644 index 6928656f3..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_131_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_133_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_133_states.bin.bz2 new file mode 100644 index 000000000..400272bcc Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_133_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_133_states.bin.z b/client/resources/hardnested_tables/bitflip_0_133_states.bin.z deleted file mode 100644 index acdb9d972..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_133_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_135_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_135_states.bin.bz2 new file mode 100644 index 000000000..242ba30a6 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_135_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_135_states.bin.z b/client/resources/hardnested_tables/bitflip_0_135_states.bin.z deleted file mode 100644 index 8ae5ed323..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_135_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_137_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_137_states.bin.bz2 new file mode 100644 index 000000000..293c1f93f Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_137_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_137_states.bin.z b/client/resources/hardnested_tables/bitflip_0_137_states.bin.z deleted file mode 100644 index 73202f119..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_137_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_139_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_139_states.bin.bz2 new file mode 100644 index 000000000..97761432b Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_139_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_139_states.bin.z b/client/resources/hardnested_tables/bitflip_0_139_states.bin.z deleted file mode 100644 index e43946366..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_139_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_13b_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_13b_states.bin.bz2 new file mode 100644 index 000000000..fb869e7cb Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_13b_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_13b_states.bin.z b/client/resources/hardnested_tables/bitflip_0_13b_states.bin.z deleted file mode 100644 index 742c3309b..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_13b_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_13d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_13d_states.bin.bz2 new file mode 100644 index 000000000..46b67bf83 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_13d_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_13d_states.bin.z b/client/resources/hardnested_tables/bitflip_0_13d_states.bin.z deleted file mode 100644 index 4b95e1ca9..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_13d_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_13f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_13f_states.bin.bz2 new file mode 100644 index 000000000..33b2abfc2 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_13f_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_13f_states.bin.z b/client/resources/hardnested_tables/bitflip_0_13f_states.bin.z deleted file mode 100644 index 469361ed5..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_13f_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_141_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_141_states.bin.bz2 new file mode 100644 index 000000000..3be41189c Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_141_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_141_states.bin.z b/client/resources/hardnested_tables/bitflip_0_141_states.bin.z deleted file mode 100644 index 61746bf77..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_141_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_143_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_143_states.bin.bz2 new file mode 100644 index 000000000..99328786c Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_143_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_143_states.bin.z b/client/resources/hardnested_tables/bitflip_0_143_states.bin.z deleted file mode 100644 index 685cf9d00..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_143_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_145_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_145_states.bin.bz2 new file mode 100644 index 000000000..b31bd720a Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_145_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_145_states.bin.z b/client/resources/hardnested_tables/bitflip_0_145_states.bin.z deleted file mode 100644 index eab4935d1..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_145_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_147_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_147_states.bin.bz2 new file mode 100644 index 000000000..fab2780c7 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_147_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_147_states.bin.z b/client/resources/hardnested_tables/bitflip_0_147_states.bin.z deleted file mode 100644 index 4d6674400..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_147_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_149_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_149_states.bin.bz2 new file mode 100644 index 000000000..eda7650e5 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_149_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_149_states.bin.z b/client/resources/hardnested_tables/bitflip_0_149_states.bin.z deleted file mode 100644 index b9da604a0..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_149_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_14b_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_14b_states.bin.bz2 new file mode 100644 index 000000000..c3c3dfaf3 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_14b_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_14b_states.bin.z b/client/resources/hardnested_tables/bitflip_0_14b_states.bin.z deleted file mode 100644 index 608337840..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_14b_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_14d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_14d_states.bin.bz2 new file mode 100644 index 000000000..adf20a10f Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_14d_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_14d_states.bin.z b/client/resources/hardnested_tables/bitflip_0_14d_states.bin.z deleted file mode 100644 index fd8e92850..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_14d_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_14f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_14f_states.bin.bz2 new file mode 100644 index 000000000..f61babefa Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_14f_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_14f_states.bin.z b/client/resources/hardnested_tables/bitflip_0_14f_states.bin.z deleted file mode 100644 index f8af0a6f0..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_14f_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_150_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_150_states.bin.bz2 new file mode 100644 index 000000000..612d6295e Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_150_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_150_states.bin.z b/client/resources/hardnested_tables/bitflip_0_150_states.bin.z deleted file mode 100644 index 587807efd..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_150_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_154_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_154_states.bin.bz2 new file mode 100644 index 000000000..9efc40fd9 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_154_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_154_states.bin.z b/client/resources/hardnested_tables/bitflip_0_154_states.bin.z deleted file mode 100644 index 56cb4f168..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_154_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_15c_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_15c_states.bin.bz2 new file mode 100644 index 000000000..0180aa901 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_15c_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_15c_states.bin.z b/client/resources/hardnested_tables/bitflip_0_15c_states.bin.z deleted file mode 100644 index 4eb487853..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_15c_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_161_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_161_states.bin.bz2 new file mode 100644 index 000000000..5c12567e4 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_161_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_161_states.bin.z b/client/resources/hardnested_tables/bitflip_0_161_states.bin.z deleted file mode 100644 index ef9f67c09..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_161_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_163_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_163_states.bin.bz2 new file mode 100644 index 000000000..b68ad5995 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_163_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_163_states.bin.z b/client/resources/hardnested_tables/bitflip_0_163_states.bin.z deleted file mode 100644 index f08b3e0fe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_163_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_165_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_165_states.bin.bz2 new file mode 100644 index 000000000..69e051fbf Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_165_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_165_states.bin.z b/client/resources/hardnested_tables/bitflip_0_165_states.bin.z deleted file mode 100644 index 9e846f209..000000000 --- a/client/resources/hardnested_tables/bitflip_0_165_states.bin.z +++ /dev/null @@ -1,31 +0,0 @@ -xÚíì ®€·€HÛÉ+ðUtËH‘he @ÊÕÑ(—„ ˜“ñ·G{fg2Ä1Æ?ØÆþÏÿýÿwëºýN³wÿ^~¶Ïæiš§9\ßþÞ¾÷÷ëݲ¼~÷ãÿ½ÎÓy¼wÓüóóúûß÷~~ö÷ë?¿,GøËòï5Àðÿmü4oŸ-Kþëûýñ¯……ÿyüÿiÞ>ßß»/ü0/gü§yƒ‘žOèýuè¿Ý7üÎÓ6v›ã÷ŽðÃçþÇñÛçûûþÒõßoþãñûëÛg}rø/K~_þ¿¿„ÿ²œ¯ï?Ûßþ‡ÿáËøcÿÇãÿ~S×ðSÏï]~üºæÇKáÇã½Ë‡þiýç]nþ¯ÞKé?ŽýŸÇÿúùÓò,ÆÿzþtÖÿY~^]鞦ÿõýGÕÿ÷ð—®ÿ~ó¿®}èƒþGþkÊÿVù›æ—ëçgÿ‡þGÿCèÿù_†¿çße©Eà? >ñÿoÄ¿>þ²ÿþ²Ôï¯üÿwåo~ý_¿’¿­ñ¯¾òÿ9ñ¿4ý¥òç>ü#ýËããõº,#­¿ñä­ýþ­ãñÿÔí_úο6ÿÕâß¾~ïü½ü§âÄ?‰bÿ—ÿRkµÙÿZömøÒù'ÿü?øŸü?«òϺÿÿþ?üvýRû¯Wþ¿VüþÇþ'þÿüÁŸøù_äÿBÛþ?íó?Ú矬ûÿ®Þ§_ûŸÒ¶ÿ9ÿÇù?ÎÿqþýùïvàcÿcÿÿÇþ'þüÏÁrNþûó¿ñÿA{ç°ÿàèoþÿî÷÷{ôþýž¯oŸÿÕßïqüßo~üºæÇKáÇãÿ~óã¯ðŸ§ýýûû<>ØÑ??çÏãÿ~·÷??ûõÿ÷Û~<>\ßÞÿü<þÖñÿìúo÷?—^¯îWöÿ—éÿIÿÿ~RÿÿÝùº;ßµßoñ?ô9ÿGj¿þ÷û)ÿÛú»kÿ ÿÐÿúôo?Ké?†üOá_·þúÈÿñÖ?öòÏòþÇþýìÏ6{Vÿó÷{ßþìG)üëñûëûÏæ©çþOªÿdzÿméÿñøÿYòOªÿõ÷ÿ¶åú4ÿ_«üí™ÿ_¯¤þô?úÿ?þüÿøÿñ€?øƒ¿nü§&ÿ¨Ÿü/þcKþCÛôï·ÿŒ÷™ûû_ßïéøŸÿûþ‡ÿíð?þö?5þÇØû­ã¯æ?~žêÇ_Ñ øäÿÿ×|¯½þ‰ÿ×êß´=×þïÁ/¿²?‘ÿ=ú‡Iõo½ü­/íÿgÛÿ§MÿšõÿÞþ—Ÿ\Úö/öŸmûÿ?ñüàþäÿ¶ÄÚýÿ£æÿYÏÿ%þÇùοrþŸýçÿ9ÿüÃþ·uþŸüòÿ°ÿÉÿƒÿÉÿ#ÿÿþ?üèÿïÕÿð?üÿ[ãÿŸŸ—?jÿö|ÿžÿE«ÿñóè¹]/ß®¿øîˆ?ðŸß»#üi>ŽßàÔÂ÷®/üxü4á¿>ÿ ‹âþ'[’׿c¿’ý÷{¬¿üÒú¯yþýóæð©ƒœÿpŸ`ÇØeøÐÿiôï _[þ¿/¾n|êù?y]’ÿÚCþÛÿ«®}ïùÿtÿ½ÿÞÁ¯4^z½õ_›ÿ!ËÐÖRüÏÏïݽù÷®ïü·Õ?µ*ÿØÿ°ÿµ ÿ¾ýÜçH×ÿ±ofýWüüӜޗ±ÿ¡ÿð¸û›öÿúëÌÿw­¿çÉüøÿðÿ}‹ÿûþ‡þvé¯íñºuÿC~~úú?Ÿ·þß¿ ~éþyÿïÝø4þ§mÝÇÿ8gýåÝøÏhþÿÚø[/ûÄøŸ%ûýOþ—füzÄý¿¥ø?öŸmûø·müÉÿ³ÿjÝÿì×{Ïü§²ýŸžÇï㟯÷%ÿ_^?÷Ýÿ¶ÿÿÇζžÿGüÿ›ü¿#úÿ>¹ÿºïêÿ!ÿŸüÿ‘ìß»öŸ4ÿ_;þ‹ÿ¿MþõŠÿ{çwë:ÍÞy·®Ó¼®Þ­«wË2ÍÓìݺz·®Ó<ÍÞ­«wÞy·®??¿Þ-‹wËâݺN³wÞ­ë4¯«wëêݲLó4{·,Þ­ë4{7ÍÓì]Ùþ·ÿßêüýëlõ^?áýñ{¯z¹Ï·ñÇϯï×~<þç'ý\àþ¶ñ—ú?¥ø—ä_ ÿwûÛà×ë?èýµé¯Yÿðéø÷XÿãÖÿ/ûúà¯[ÿ þ‡ÿá›ø³ÿ9á_ñþîëÝûIáK¿Ïþ¯6þ,¥ÿ¨ö¿wuëIÿÕ^ÿÚýoÆÖÿeü{¬ÿ'÷ÿAÿ#ÿß!ÿeò·_þ«Uÿúߎþ‡þÐÿ?òŸóïÀçüçîœÿî‘=îùëù¿œÿçü?çÿ9ÿÏùÎÿsþŸóÿØÿ¶ÎÿSÿÛöùÎÿPÿþ§þ?çÿmžÿÇÿ‡ÿÿŸµþŸwì¿ýÏÇ=ÿÿcÿÛ¬ÿÿüÁßnü‡þ/ôÿþÖýzý¿Ç¨jÓÿGý_êÿjóÿ“䟽ú¿ß%ÿØÿÿNÿgììâÿØÿÄÿ‘ÿôÇÿý­Äÿ±ÿàèOýêÿQÿqúSÿòóõÿÚýÏíõÿF¨ÿ’ÿ¦þžÜÿ?Fý?êÛ«ÿƒþ§þ#õßìÖÃþCþ±ÿ±-ÿG¬ÿ=FýsëýÊû¿>õÏdzÿ©ÿOýêÿSÿß’þÉÿ÷Éúÿ9ÿWiýõÉÿAÿ£ÿñÿãÿÇÿÿÿÓúžöó»Á»šÿ³þØôOølÿyzüžþ©ñRø)ýwþàþ/Y¸—ï›|º’ÿgù)Å“ßó”‚_Æ??>ÈÿyJ?ÿ6øÓœ®4ÍçüsèýÇû½dþýÝߺû=©üï7ÿw¾Öÿ¶ŽãS×—¥þÒðKø”Ƨ®ïŸþ‡ÿ-ó?øÛ¶ÿ[â?{ÿÝ<ÕßüϱÿG~ ý¿i¼Ìÿ—Ž?„ÏËó¯mÿËâ?=êߎÿ‰ýýiyžêÇÇߟ§‘Ö=þ{¿»týÇ÷k‡=~½‡þýz?ϧŸßŽüßǯúéÿzù»×ÿÒúÖ÷Úôo™ÿúñåù×^ãØßØí?üÿÄ$ô—â_C¿»ðûÑüÁß -þ{]–Ÿú-ÇWòñ™P“9WÿùÿÜøãõøï{ø§ð‹áaŸ?î?U¿ª/Ié/[ÿË"ÿ{Ï{þ~¿õ×Fþ—Úÿ=ì_Íú—Öå¿vÿ7mù/ëÿ–î?楦ÿàóê¿öääòûû¿‡ýÙbÿ?)ý±ÿ±ÿáø_—ÿíâþÇÿ‡ÿýo[ÿÃÿð?üo‡ÿ­ç?2žóÿœÿoÏŸ”®?íüOò¿ ¿&ü'žéyþgœó6Ï¿îéuìÏžÞ\Ó_šÿ_þ¿´?ºsüÿ^çßҟלÿãü çÿ8ÿÏþ‡ý¯­ñœÿ¡þç¯ÑœÿGþãÿÁÿýmùÿ°ÿàèOýêÿY¯ÿÔ¯þÈÿç×OüGªÿ'‹ÿ´ÅÿÆ©ÿ”Æ¿äïWÿGÇÿ/Ÿõ³?uâÄÿÑÿÔ¦þñì?‹öñoä?ùvã_-û¿í{}ë¿êôÿ¡þ?õÿÉÿ#þÿWÇÿ7Ný©þ‘ÆÈÿ'ÿ_7ÿ_fÿµåÿSÿÿ?ý?­Åÿ_Oô¢ÇÿíùÒ×·×í¯ðiúzéþñx)üÒýï>øƒÿ÷âÿªEr¬’ü'Åÿü﯄i|ù_ßûðïÞúCúk×?|:þÒõ?^ýëRý«cý´~øëÔƒÿáøß.þÖíÿÍó÷{ô_^Áþ­—?q»ÿq¼w1þÛõ3ý_ßï ÿŒÿ>û¿=ý§ùÜÿæJ_Å}n¤ô×¶ÿkð/­¿«y‰í‘ðùq>5׿vÿ›Ö¿ÿòïÉýÐÿÈéú?öMë!Ïò?-—Ùÿ¡ÿÑÿÐß.ýñÿÿ)Ú?\ç:ñÿ/µÿ[â?qÿ’öó—mò÷Þø¼=#ëÿ"•ÿÏŒÿÝ£Oyÿwþ%ãÏϯ¹þ´å{›ÿ?äÇöýÕø¼ÿ_>ò¿eÿwÜÏHç_Wþ·ìÿŽë¯fþòû¿§ñ_?ÿ7ñOâŸØÿOË©¯ŸZ—ÿ£iÿè>¿öü“ÿGþüOþŸUùgÝ¿‹ÿÿþ?Ëþ?™ý×#ÿ_7þÿcÿcÿkÿyúùðÿïÂÿ³ú_[þKõþfyÿý¡¿ý¥õ¿–åü¹wéúRÞ¥ëYqþ¥­þU?ù/…/­{¦ÿ²äéï¼þYàŸ4¼Züsãs¿çó_9þ¯Y¯×ÿ{wæíõ¯Íÿß#ÿÚëÿy×wþSó»Ÿÿtý;›òû_=þÌøÇÆÿ±ÿ¿gÿ'íŸöŽþkŸ\ÿÖõŸ6ý¬¯¿çÈÿ~ñíø/òúûûÿ?ôÿ¼ÿ‹þ—¶û?ÒÿÕâú§ÿýèÿcµÿòý/«ÿÚ¯ÿ¯¶ü·ÞÿûùgOþ!ÿ{õ¿n³ÿÇYÿÒþ»Rú?§ÿozÿ'Õÿ:ö?ú_—ÿ¿GþIõ¿ÎþߺüCÿëúÿòùÏmò·gþ½þ‘úÐÿèüÿøÿñÿãÿÇÿþàþïÇ_zþ©Ÿü×ÑÿÖå?ôGÿ÷ñÿÔïGGòÿY÷aÿÃÿð?þoð'ÿ»Öÿ¸®Gÿcíø«ø—&üúÓxòÿðÿß_ùóKã¯âÿc¬âÿ²÷Rúõ~žO?¿ùÖsOý_/÷úYêŸÿªþç?ôèß2ÿõãËó¯½þƱ¿±ÿ,Úøÿñÿÿð·ÿ—ÆÚüËãÈ›ù¿ÄÿØÿqþ•øû?Îÿsþù‡ýoòÈÿÃþ'ÿþ'ÿü?üøÿðÿ¡ÿíœÿ‚ÿáøßÿ¿žèE=þÛóqëçëÛëöWø4}½tÿx¼~éþwŸï»ñõ"9ö?¹ó^º¾¤÷—>ÿ}øñü•þ•îýŸEÿ¾ð5å»<ÿ[žÿüóóÊgÞ¿zþýýÿÁß®—Æo×ÏøËò_¥ò¤þO¡ýuÿ«øûýçÿÓý÷¾{ü¯ø3µþJã÷×cþ×_ÿÒüYþƒ¶þ“â¿Ýÿ8ÿÛ<×οw}ç¿­þ©Eù‡ýÏþÖúõûöëñŸt}•öK÷÷_ù罿?ûÞýŸvÿaýýuû_—~Ö×ß3å?þ?üøÿ¾Áÿ‡ýÿCËö¿¾ÿQ¾uû¯mþûù?Ÿ¹þûúÿýßþÿ#üiîÿ‘Æÿ´í¯6üóâHÁËÿ\üg,ÿÿ½øYÿýÿgãÄÿÑÿ–ã?5ñïX^ÅòL:ÿÚòßzüûÏ®ýGüùOþŸÝø—dÿô¿Dþmû—e©·ÿSñÏÜøãõãß-ú¿ïþo´ýÿ'ùÿ™ùÏÖóÿˆÿ“ÿWÓÿ§¿ÿjñ?-K¯øùÿäÿ–ÿÇþë‘ÿ¯ÿÅÿßÂ?{[»Wþã'íÿãó[Žÿou$ãן‹Ÿ«ï•Æ—>>ðÿyøiÿƒwWò%ö?¼~ ÿºýwÞÿ¡ úCmúŸëOÇõ«Ãßmõ¯¯ëO?ÿ§Ïzÿïß‚ÿ ÞôÁÿ~ÿšýgnÿÿÃÿÖùß.þì?Òð­¿ZßÿÿbþºtžGµÿkñÓž¿óŸ–¿AÎÆ×½ë7~\ý/{þ§Ì?úù?¢üÿ”üeÿ‡þ·®ÿ¡?ôÇÿoYþÛ>ÿ þíüÿnþþûákæÿÅys}Î_œóÿÒyyéü»=^¥øW]þß=øwâo=â_ºçRó_Ÿ™Â?ÿž—ó?eýw´_×U¶¿.Ýß»¾ð×µ×þß‚ü?­ÿâû³¼’Ð_[þ—ð-­¿«y©Ï׿öumþ{úü!ÿ€ÿ¾ó¿ýú<óüó7ÿ­Ýÿ,K»ý_šÿöýWÚþOÏÙÿgøWç›Úìÿ¼ýÿkóûþûë_{ÿoMþQÿÿþ?üvëÿ´Û=ÖŸ¶ýÿcÿÛ¶ÿÕ×ðüÊÿÏÁŸü >ô‡þô?¿þý~òzŸºº~Ä¿ßøãëv®$Ô× µ²ö÷×ü߇Ÿ¿ÿ|Yöçf.ésóµïü‡º^møÇãKŸŸ÷Wø•Ö_íø«÷c¬mþžü{úü[—víÝøŸ~üÛ:þØÿ¶íÿu=Êϰ~öõaÛåïþþót¼ÿ8ëß®þëC©üë·þâñuø£ÿtâÿÚñ_ä¿uú·×¯£ÿ1þ÷ÀþÃþÃÿýõè?bý©gÔ¿Ò®¿ù>øÖçßÒú—ú¥¯ºõŸåøIýÿÚ¯ÿC¿úãiøñoüüïõÿfý!ÿÐ?£Õÿ¿/¿¤úG[þ§ðoþOÎü‡üCþ__ûU{ý_kíÏwÍÿ}øùñ¹Ïûìÿúî?µí{ú,þžü{úüÛ•ìÿÆóÿ}RþöÑ?Rÿúýÿÿ?þüÿô?>ðOÿwú¿@èOÿoú6þ_—Ú]ûþ‡ÿmó?ýmï?Öõ8¾ôþîëÝûIáK¿¿ýn?á}Ûü‡û—î×~<žþ¿ôÍõŸý‚¶õsŒ¬«,þ/óÿ'׿$~Ògþµã?Wôßôçv½Uÿ_Ë¿ôó×ÃOëÿx|Iÿ[—ÿíýÿ¤ú¿Ô¿¬¤ÏßÝÿÏjÿgmúOsÝúwÿ˶õWßÿPÛþÅþÃþÃÿOü‡þ‹À¾ÕþŸôÿ¡ÿý¬öÿ¡ÿµmù_î_Ÿ•ο6ÿIñÓž?øù‡üþSûÿ=ÿo쿈ýOÿOøß.ÿ[ÃýÿÿúýÿÃÿð¿%þ·žÿþœáüÿºæó'·ÏZó¿òùßúùŸäÿÚ¦ÿºö…Ó]ðÃýÇ8ÿ2ÞùŸOæ?sþ÷ªÿåñ|Pª~Yüÿ\ÿ»òùyÿ;ëùÿšçÏÆ=ÿoéüçÿ9ÿÏþŸóÿœÿ±Yÿ§ýüwü ÷ßÛ\ãì°ÿ9ÿÏùüøÿðÿÙóÿaÿqþúÛ¤?õÿðŒP‡d4ÿ›•WiüGÿÁþ“ö’ž¿¥þßuül»ÞZÿ»´ÿ/þgÅþGÿ“ÿEý?»ñì?Ûöñoä?ùvã_Òþ¥}öŸãõÿ¡þ?õÿ©ÿOüßBüDÿß'ëÿKôOŸó¯äÿ“ÿ¯iÿöé_ߪ´ã¿øÿéÿi7ÿcYöôÝžïŠþçùc<ãÿüñ¡&ʹæËñzü÷gà¿ûùµáCè¯+?ίóôÉëOÇÿÙó/ý•óéþï}~øþ·ÌÿàoÓþvýi9|è¯[ÿU[ÿê×…ÿޝWòsÿ½#üüøýç#Éß~ø?}þÑÿÈúߺò×úþýþ‡þvéÿÿ_8ß¹O¼:ÿÙ?Îg¥ÇKá§ò¿ÀŸø7ãsëÿ¸W̽¿ŸÙå¢në3-?Ã÷ë×n|ü—ÆŸ¤ò_oÿÛ‡þ2ù·,uðkâ5Ï{þ~¿õ—²™Ãý7ü¯õÿ'忬þCýî¦>ÿ» þüoü?1ýsë¿mÿ—£¿¶üoÇ¿~ÿ·Ç?æíõo=þFüûû?oŸ×Ø_Rû_ÿ/Å_ºÿï7ÿéù%ÿü?øŸü¿ûôùvù‡ÿÿþ?üýýì?éùíø¯]þÇþçüãÏxÎÿ“ÿÅùèo1ÿ[çüÉ8ñ/›þ¿+úçöÊ©ïÉóuìòÿ9ÿÇù?Îÿÿ'ÿßrþ?ö?ñâÿÄÿ‰ÿÛÖ¥øg‹üª‹ÿjÇÿ9ÿi•þÄÿ±ÿðÿC«þíþ3šð·ñá³f|ý»Æ[Ÿëë_êÞÇ‘öýh]Ž×ãÏóò«L¿wûÿ¯ðèéÿÿû-Ï_ižåóßæ?ò_ýýÓ¿ïõß¼ý!ÿÐÿÚô—ÄŸ¥ó?Žü×ê?ÿ!ÿŒ×^ÿ:öç8ë_ú+¥ŸÎo¿ýŸTÿëØÿè]þÿù÷ôù·)ÿÐÿºþ?mùÛOÿHý?èô?þüÿøÿñÿãÿ>ðÿIý¯ÿÁþÂþƒþøÿlúÿ­ûÿ´÷ÿýö_ï¨?ÿÃÿßÏÿàoÛþ_×ãøí³×ûøúþÕóçÆ¯k~¼~<þï7?þ -ÿmþ¶ë­óÿãšþRøñøû{ÏOÇëGû¿†þ¥ùÑþ—>ÿ'çO:>ðKÝû»¯u÷Ó[ÿ­xõ¥ŸÞë}æé|ž¾Eÿ×É?)üëñ%ýo]þ_õÿ;Îg»ü*éÿ«þgµúÿz|üµ¾ÿ•þ5ë¿Gÿ»uí»þ¼ËÏ_¸ßö/öŸmûÿ?þ?àøœÿ·–ÿk=ÿøú_Ûþq¼õü/övöðóým>ù?äÿaÿ“ÿÿ“ÿGþþ?üøÿÐÿœÿ‡ÿáøÿ{ùÿç畵ÏÚú³¼*lŸMóÞ¿ùï~¯ëÓ|ÿÂs?~»¾õ' ý_^ßï ?®oõöóþÞåŸ?ŒjÃø#Ãßú…þÅ¡?ÑÖ)ô+:ö9î±þ}“ÏðKëÿü\ñó‡ëûÏRø¤¾Wšÿ«y©…ýµé¿®}áÇpÂýSó©-ÿåùß²üçþÇë±~öîÞø3y×'ÿµÿé÷?¯ÿ£=¦ÿ^ž>gû*7ÿ¹þ{5ø§ûÿþ;ößJóÌ9üRú#w¿óýG\ÿÒó3õãµõß;žÿIóo]þ±ÿ`ÿoÿÒþ'·_ê³ÿÐÝYßÿ]ÛÿçþÃmòw¿ÿ‰û?°ÿÁþo¥ù—;ÿÛ¶þîÿEþãÿÃÿ‡ÿϪÿûÏ:ÿCËô/ùgïûïùµýŸø?dþËw\×ö¿iãÿÉëÒø4þ§mÿãO©|´kÿy9þ“Õ÷ÿ¯kKü­—ý?büÏ’ýþ'ÿëN¼zšûÆÿGÜÿ[ŠÿcÿÙ¶ÿˆÛ†OþŸíøWëþ§^ÿßËz½¾ðj‰¦Ççìï$ötÿ7Úþþ×ÿ[Êÿ#þoÙÿ;¢ÿO¶ÿZW‰ÿíŽþéÿ!ÿŸüÿ‘òÿïÚRý£Åÿ_#ÿö¼Ø7þïwÞ­ë4{çݺN³wÞ-‹wË2ÍÓìݲx7OÓ<ÍÞ­«wÞy·®??¿Þ-‹wËâݺN³wÞ­ë4{çݲx·,Ó<ÍÞ-‹wë:ÍÞMó4{W¶ÿ­Äÿ·zñëÏÅÏÕ÷JãKŸøÀÿ<|©üy7üþïö¿¾>ô‡þÚô׬?ôtüŸ>ÿRÿCüuëoÁÿð¿mþ·‹?û4|ë¯Ö÷µþcéÿgÎX¿çךëýø¿tÿ÷ÿº§·wgúþïëÃõËÿ¯wÎÿ”Æ—öäÿëŸ?Ó>ÿbýüçÿmïØÿÛÅŸó?Ôÿésþ»þ<öHçÿÑœÿ·.ÿñÿáÿÃÿgÓÿ‡ýÿCê¿PÿÏný'Íú#ãøõêïRÿOÿi‹ÿPÿÉ»ók­ÿ½_ýÿLß}âëwë×Ùÿ:ñ?âÿèê?Sÿø?öŸEûø7òßzþŸåøWiÿÛÏ-ùuõGuúÿPÿŸúÿÔÿ'þOýÿß8õÿ¥úGÿ!ÿŸüÍúÿRû¯Ýÿ¥¯o¯Û_áÓôõÒýãñRø¥ûß}>ðÿïÅÿßw_¿Ó\÷þøOŠÿùß^ ÿÒøò¿<¾÷áß½?ô‡þ:ô—çËòžŽ¿tý×ůïο$ÿýµ>·ýþþ±~U?ü—¥~Mý­xüuý-øþ‡ÿíâoÝþßü¿Gÿçüàßzù·ûÇ{ã¿]?Óÿõý¾ðÏøá³ÿÛÓÓ—¡͵¾ŠûÜHé¯mÿ×à_ZWóÛ#áóã|j®yþ§,þ1Âú—àßCþåâŸmó7þ‰þGþëÈÿsß´ò÷,ÿÓr™ýúýýíÒÿ?ñŸ¢ýÃu®ÿÿRû¿%þ³×_-ûÇXþß•¿÷Æçí™»øŸ÷ùÿÌøß=ú”÷ÿwç_2þüüšëO[¾·ùÿC>wlß_Ïûÿõà#ÿ[öÇýŒtþuåËþï¸þjæ/¿ÿ{ÿõóÿ$þ‰ýÿ´ü—œýußþ×µtŸ_{þÉÿ#ÿþ'ÿϪü³îßÅÿ‡ÿÿŸeÿŸÌþë‘ÿ¯ÿ‡ÿ±ÿ±ÿµÎÿ<ýü øƒÿwáÿYý¯-ÿ¥ú? ÿ³¼‚þÐ_‹þÒúoáüÉuý°ýýïÕÿûäù—¶þý俾´þÝ™þË’§¿wòúwÒðjñÏÏýžÏåø¿fý½^SüïÝ™ÿµ×¿6ÿük¯ÿè]ßùOÍï~þÓýolÊ?ìõø3ãÿÇþÿžý_Qþ¾ùºöú·®ÿ´ég}ý=Gþ÷‹ÿkÇ‘ÿÐ,øØØøÿ¡ÿçý_vûÿÒÿIþô¿Öïÿ£ÙÿkœþÏiüKýûõê×1Õ/+×ÿGâÿÊ?íþ_yû¹mýݱèÿ1èßî×ÿO[þÛíÿ‡ý‡ü³*ÿÿºý¿ÇYÿ6û_Óÿý¯Éÿß#ÿ¤ú_gÿo]þ¡ÿuýùüç6ùÛ3ÿ¿^ÿHý?èô?þüÿøÿñÿãÿ²âÿðø¶ýýý¡¿]ÿ¿uÿŸöþ¿tþ¹~ÿÕvþþ‡ÿáðÇþ?½¯ÿû;ÀÿæñWó¿?Oõã¯è?ü³þûûM]?Úÿ©õû÷{oþGµÿ¯žÿï7ÿüÞåç/Ü/ÏÿµðKãÿ~óã¯äÿgßk¯ÿúçM¿¶¯ÿ¿ßðû}¿¤Óö\ÿù¿¿<þÊþDþß“ÿ±üê£ëåoýø;Ïÿo4ú׬ÿe©÷_^ÍÿëOÛþÅþ³mÿáÿçüþðÎÿÛÉÿµžÿGüý¿®}íÏ6ÿ—¶ýKþû?Ëû¿ñøù‡üÃþ'ÿ‡üììøþ'ÿü?üøÿÐÿèøþ‡ÿá)ÿÿü¼üQ{ü·ç{U,Ø>›æýüü»ßv½4~»¾ÕWØãü§Á÷îšã78µð½ë ?®oõ9öòß:þÓ|î<ÍÇ~(û~Åûï÷X%ø¥õ_óüûçÍáSÿ8ÿá>ÁŽÙ÷‚)Á‡þO£_øÚòÿ}ùóuãSÏÿÉë’ü×ò”þïûõ›²§cúíáõœÿ\ÿ­óúY–úñÞûo¥ùÿ~¥ñÒûë­ÿÚüYþƒ¶þ“â~~ïîÍ¿w}ç?ï]~¼mùÇþ‡ý¯eø÷íÿã>Gºþ÷÷ë³ÿŠŸšÓû2ömò?oÝ=9îþǦý‡þ:óÿ]ëïyòÿþ?üßâÿÃþƒÿ¡¿]úkûG¼nÝÿŸŸ¾þÏç­ÿ÷ã/ƒ_ºÞÿ{7þ#ÿiÛ_÷ñ?ÎßYyw'þ3šÿ¿6þÖËþ1þgÉþGÿ“ÿ¥¿qÿo)þýgÛþ#þmòÿlÇ¿Z÷?ûõÞ3ÿ©lÿçãŸçñûøçë}Éÿ—×Ï}÷£íÿGàÿ±óŸ­çÿÿÿ&ÿïˆþ¿Oî¿îûŸúÆÈÿ'ÿ$û÷®ý'Íÿ׎ÿâÿo“½âÿÞyçݺN³wÞ­ë4¯«wëêݲLó4{·®Þ­ë4O³wëêwÞ­ëÏÏ߯wËâݲx·®Óìwë:Íëêݺz·,Ó<ÍÞ-‹wë:ÍÞMó4{W¶ÿ­Äÿ_?¡CÝû»?wï'…/ý>øƒ¿ ücùËçôõX~´ã¿É§íï~ ŸÒøôõðü%üÛàß½?ô‡þ:ô?ö ã¯êë…ZRçû^GþIñ—®ÿôüIç?UÿižÒã÷ûç°>¯ü±ÿ@Žÿf¿ÏS -~ÿüø`ÿÏSêùáøß6ÿ󮧼ý¿Õ üû=Ö¼‚üÞ«ž`îómüñóëûõÆ?ý\Ð_šÿ"¥¿¶ý_¿´þ¤þOíõ¯]ÿ|„õ/Á_ºþõë¿¢ÿ‘ÿzò¿ÿh“¿õñöèëúúÛ¥?þâ?Eúsëü/]ÿuü{~?þÿvüÏñŸiÎå_ó'[âGÇçËÕ›©™¿Òø|=›»øŸãGå%ø¥øÕ5|iüKJ©|i›Éøóók®?mùnýüò_·þŸ¾ü§þ‡æùçÖ¿åóߨÿØÿû½‡ý¯kÿè>¿öü·ÙÏáüŒtý‡ý˲´ì¿êƯÇÏßþ˜æ^û?øÿ‰üçöXÿ£ìÿmÉ?ëþ]üøÿðÿYöÿÉì¿ôú›ætÿó+þÏóË}ûë|þÿêüýýßnÿJùÿ™ö/øƒÿ·âÿYý¯-ÿ¥ú? ÿ³¼‚þÐ_‹þáüK\ïêEÃ0?áï}}¯e9î]8—±¿}¾¿¿vý»¿øùR×—åˆ_ù/…=>¾¾Ÿ£ÿ²äéï]zþýËõ7ÿ¤áÕ⟟û•ÕL× óRSp”ú:üÿ=ò¯mýÇóÖcþSó»Ÿÿ˜,Ë?ìõø3ãÿÇþÿžý_Qþ¾ùºöú·®ÿ´ég}ý=Gþ÷‹ÿkÇ‘ÿÐ,øØØøÿ¡ÿçý_õ¿ž^ÿJZÿT¿þ§6ý­ã¯½þ¥þï}éï÷üù~¿õ÷{×ÿÿîúÏeüSñʿ߾þÿýýîÂOÍ<~žÒtéáÿ—Ê¿’ÿ"õ~ž>åÿo[wìäú ú·ÅŸ¥ôGþ§ð/¯¿~ò_[ÿcÿ!ÿìÉ?äÿÑ>ïaÞ±ÿÇYÿ×öfÎþìG)ü¶ï÷ÛÿIõ¿Žýþ×åÿï‘Rý¯³ÿ·.ÿÐÿºþ¿|þs›üí™ÿ_¯¤þô?úÿ?þüÿøÿéDÿwðú¿ÓÿúCúÓÿû=þÙùW9þºû?øþ·ÍÿôÿµlÿoþÂ{ý'Ïý?Χæú׿äòûßnÿ¿§ãÿ}ý¿±ÿéÿ ÿÛå[ø£ÿñÿáÿCÿ£ÿáøþ·ÆÿäÃóžóÿœÿoÍŸ”®'íüOò¿ ¿&ügžéwþG?ÿÙúùß–úÿ=Ï´Ôߪ_®¿Eþ¿fýûοpþóÿìØßZ|ÏùêÿX>ýÏùä?þüÐߢÿûþ‡þvéOý?ÛïÛæ¿Ÿÿó™ë¿þ#Õÿk‰ÿHã#Ô’ôêqþO×ÿ/‹ŸÉ÷ÿºñ?ëö?úßvü‡ú¶ãÿضí?âßÈòÿìÆ¿Úöý꿎Ðÿ•úÿÔÿ'ÿø¿Õúÿšþ?íý—´ÿ³üü+ùÿäÿ‘ÿßbÿIóÿG¨ÿÿŸþŸ–û¿lü¼_¿ÇúaþÎü¿Íi|Xÿñþ øÀþ8ð_¯¡fÊñïøûŸ‚_z|¨¿|¬3|èý5è|ÝìÊ`_[qûÞ~~üþóí~óôMø?}þ¯Ë’þ½ú^oüc¸wñ¿zîk|àøþ·‹?öÿ~|ðKÅ×ð¿u¼õýß™/§¹î½tþǰÿËøçŸ_oþZÇŸ_?{},ý/}þçÍ?úù?Žüד¿øÿÐÿõ?ô‡þøÿ-ÊIþO ü}ÿÓsþÕ)üTþøÿ~ný}ú§ìóÃJñŸëý×þþ!_øjÿ•ëÿR'Sý_ÊòW’ʽýoúKåß}øWøÇãKñ¿uí»þbúû‡ãÓ<¶þûûM]¿oÆã÷çrø·ÂÇãÿ¿CÿiN˃öýË=ú^þ·á_¿ÿKã=#¬ëñ7âŸØßÖíÿØ~oµ?ïÙÿZöÿþöoëüÇãÉÿ#ÿþ'ÿïîþߊüÃÿÿÿþ?«þ¿>ö_¯ü+-ûË.ÿcÿ“ÿ|àøä‘ÿ ý9ÿ«}þGûü“õó¿÷_ûο¶ýÏù?Îÿqþóöò¿Èÿ·ÿýOüŸø?ñâÿ6õ_mü³^þßÃ_+þÏùO«ô'þý‡ÿú[¥Übó ½ÞÇ×ý'¾uü<¥úçÔõßH¿ê¿1*|ëóoiýKýÇÒ×kùW¦ÿ'üÿ-ÏÇÿ¯ý*ñ?ôà¿üø7~þ÷úÿ?³þèMø}ä—TÿhËÿþíÏÿÉùƒÿÈ?àËàk¿j¯ÿãk­ýù®ù¿??>÷yŸý_ßý§¶ýoOÿÅÿÏ“OŸ»òýßxþ¿OÊß>úGêÿAÿ£ÿñÿãÿÇÿÿÿð|½øOmþÑ{áëÅ,ÉèþÇÿ‚ÿûþ‡ÿ­ú¿ñÿ[µÿ×õ8~]þÃu•ùãñëš/…¿®÷üŸWøoó·]oÿpÿíý?×ô—ÂÇ“ÿGþ_yý{WûþîkÝýôÖ¿õøÿ}â3ò­ú¿NþIá_/éëò_ÚÿOªÿ¯û—Õéÿ÷õÿ³±ÿ•þ5ëÿ½ý/ÛÖßÝþ‡Úö/öùøÿ‰ÿøÀ'ÿ·-þ#?•ÿg=ÿ—øçÿ9ÿÊùöœÿçü?óýmëü?ù?äÿaÿ“ÿÿ“ÿGþþ?üøÿÐÿß|þ þ‡ÿá{üÿóóÊÇÚç?mýYþ=ÿ+W1ôùù þË×õi>Žá¹¿]}~ìÿòïÿ¾ðãñÓ|„ÿúü¯àÇÏFµáü‘áOó¹ÿÑÖŸèõïØ¯hßç¤Çúû&ÇðKëÿü\ñó‡ëûÏRø¤¾Wšÿ«y©…ýµé¿®}áÇpŽý¿âùÔ–ÿòüoYþs -ÿãõX?{woü™¿¼ë“ÿÚƒÿÆíÿw¤W®_}ž>gû*7ÿŸîÿ—âÿ˜rø¥ôGî~çû¸þ¥çgêÇkë¿w<ÿ“æßºücÿÁþß2þ¥ýOn¿Ôgÿ¡»ÿ²¾ÿÓÿÁþo¥ù§Ýÿùÿÿþ?«þ?ì?ëüý-ӿ䟽ï¼çÿÕöâÿù/ßq]Ûÿ¦ÿ'¯Kã?ÒøŸ¶ýwŽ?¥û]ùÏËñŸü«¾ÿ][âo½ìÿã–ìô?ù_wâÕÓÜ7þ?âþßRüû϶ýGüÛ6|òÿlÇ¿Z÷?õúÿ^þÓëõ…WKü3=>gÿ{'±o¤û¿Ñöÿ#ð¿~üßRþñËþßý²ý׺JüowôOøùÿäÿ”ÿ×þ“êíø+þÿù·çžñï¼ón]§Ù;ïÖuš½ónY¼[–ižfï–Å»yšæiön]½óλuýùùûõnY¼[ïÖuš½ón]§Ù;ï–Å»e™æiönY¼[×iönš§Ù»²ýo%þ¿õ ùû=öÙú½~Âûã÷^õrŸoãŸ_߯üxüÏOú¹Àümã/ÝÿHñ/íJø¿ûüOüúýô‡þÚô×ìøtü{¬ÿqû?–ýo}ð×íÿÿÃÿð¿MüÙÿœð¯x÷õîý¤ð¥ßgÿWë–ÒTûß»ºõ$h¯ÿ¼üoí?\ßÿylý_Æ¿Çú×ïÿŒþGþ%ÿeò·ßù?«þ?ô¿ýý¡?þä=ýÃúñ»ŸÏþ³àSÿÑFþïUþåþûËR?J×ÿ»þú¸þkêWåÎ_·žïuþ[ÿüO;ý{ÈŸVøÿÚñ[þ_\ÏLwý(ÿïßÿ¾ëÖë?ÞË_—Í¿6ÿIñÓž¿Ï_ýêŸPÿ û_»ÿÏ<µØ_wímûG‚¿6üóOý/úÁÿ–ëØ–Öý¿øÿðÿáÿ³ëÿ“Ø=úÿè×ÿ…ÿ±ÿ©ÿ‹ÿüÁŸøýŸ¬õ‚þøÿ¨ÿ‹ÿú6ëÿY¯ÿ+ÿ÷ú—Ï<žú¿Ôÿí¹ÿ!ÿþ›àcÿcÿÿÇþ'þü¯“ÿ}ã¿#æãÿƒþVâÿØð?ô·IêÿQÿqDúSÿòóõÿÚýÏíõÿF¨ÿ’ÿ¦þžÜÿ?Fý?êÛ«ÿƒþ§þ#õßìÖÃþCþ±ÿ±-ÿG¬ÿ=FýsëýÊû¿>õÏdzÿ©ÿOýêÿSÿß’þÉÿ÷Éúÿ9ÿWiýõÉÿAÿ£ÿñÿãÿÇÿÿÿÓúžöó»Á»šÿ³þØôOølÿyzüžþ©ñRø)ýwþàþ/Y¸—ï›|º’ÿgù)Å“ßó”‚_Æ??>ÈÿyJ?ÿ6øÓœ®4ÍçüsèýÇû½dþýÝߺû=©üï7ÿw¾Öÿ¶ŽãS×—¥þÒðKø”Ƨ®ïŸþ‡ÿ-ó?øÛ¶ÿ[â?{ÿÝ<ÕßüϱÿG~ ý¿i¼Ìÿ—Ž?„ÏËó¯mÿËâ?=êߎÿ‰ýýiyžêÇÇߟ§‘Ö=þ{¿»týÇ÷k‡=~½‡þýz?ϧŸßŽüßǯúéÿzù»×ÿÒúÖ÷Úôo™ÿúñåù×^ãØßØí?üÿÄ$ô—â_C¿»ðûÑüÁß -þ{]–Ÿú-ÇWòñ™P“9WÿùÿÜøãõøï{ø§ð‹áaŸ?î?U¿ª/Ié/[ÿË"ÿ{Ï{þ~¿õ×Fþ—Úÿ=ì_Íú—Öå¿vÿ7mù/ëÿ–î?楦ÿàóê¿öääòûû¿‡ýÙbÿ?)ý±ÿ±ÿáø_—ÿíâþÇÿ‡ÿýo[ÿÃÿð?üo‡ÿ­ç?2žóÿœÿoÏŸ”®?íüOò¿ ¿&ü'žéyþgœó6Ï¿îéuìÏžÞ\Ó_šÿ_þ¿´?ºsüÿ^çßҟלÿãü çÿ8ÿÏþ‡ý¯­ñœÿ¡þç¯ÑœÿGþãÿÁÿýmùÿ°ÿàèOýêÿY¯ÿÔ¯þÈÿç×OüGªÿ'‹ÿ´ÅÿÆ©ÿ”Æ¿äïWÿGÇÿ/Ÿõ³?uâÄÿÑÿÔ¦þñì?‹öñoä?ùvã_-û¿í{}ë¿êôÿ¡þ?õÿÉÿ#þÿWÇÿ7Ný©þ‘ÆÈÿ'ÿ_7ÿ_fÿµåÿSÿÿ?ý?­Åÿ_Oô¢ÇÿíùÒ×·×í¯ðiúzéþñx)üÒýï>øƒÿ÷âÿªEr¬’ü'Åÿü﯄i|ù_ßûðïÞúCúk×?|:þÒõ?^ýëRý«cý´~øëÔƒÿáøß.þÖíÿÍó÷{ô_^Áþ­—?q»ÿq¼w1þÛõ3ý_ßï ÿŒÿ>û¿=ý§ùÜÿæJ_Å}n¤ô×¶ÿkð/­¿«y‰í‘ðùq>5׿vÿ›Ö¿ÿòïÉýÐÿÈéú?öMë!Ïò?-—Ùÿ¡ÿÑÿÐß.ýñÿÿ)Ú?\ç:ñÿ/µÿ[â?qÿ’öó—mò÷Þø¼=#ëÿ"•ÿÏŒÿÝ£Oyÿwþ%ãÏϯ¹þ´å{›ÿ?äÇöýÕø¼ÿ_>ò¿eÿwÜÏHç_Wþ·ìÿŽë¯fþòû¿§ñ_?ÿ7ñOâŸØÿOË©¯ŸZ—ÿ£iÿè>¿öü“ÿGþüOþŸUùgÝ¿‹ÿÿþ?Ëþ?™ý×#ÿ_7þÿcÿcÿkÿyúùðÿïÂÿ³ú_[þKõþfyÿý¡¿ý¥õ¿–åü¹wéúRÞ¥ëYqþ¥­þU?ù/…/­{¦ÿ²äéï¼þYàŸ4¼Züsãs¿çó_9þ¯Y¯×ÿ{wæíõ¯Íÿß#ÿÚëÿy×wþSó»Ÿÿtý;›òû_=þÌøÇÆÿ±ÿ¿gÿ'íŸöŽþkŸ\ÿÖõŸ6ý¬¯¿çÈÿ~ñíø/òúûûÿ?ôÿ¼ÿ‹þ—¶û?ÒÿÕâú§ÿýèÿcµÿòý/«ÿÚ¯ÿ¯¶ü·ÞÿûùgOþ!ÿ{õ¿n³ÿÇYÿÒþ»Rú?§ÿozÿ'Õÿ:ö?ú_—ÿ¿GþIõ¿ÎþߺüCÿëúÿòùÏmò·gþ½þ‘úÐÿèüÿøÿñÿãÿÇÿþàþïÇ_zþ©Ÿü×ÑÿÖå?ôGÿ÷ñÿÔïGGòÿY÷aÿÃÿð?þoð'ÿ»Öÿ¸®Gÿcíø«ø—&üúÓxòÿðÿß_ùóKã¯âÿc¬âÿ²÷Rúõ~žO?¿ùÖsOý_/÷úYêŸÿªþç?ôèß2ÿõãËó¯½þƱ¿±ÿ,Úøÿñÿÿð·ÿ—ÆÚüËãÈ›ù¿ÄÿØÿqþ•øû?Îÿsþù‡ýoòÈÿÃþ'ÿþ'ÿü?üøÿðÿ¡ÿíœÿ‚ÿáøßÿ¿žèE=þÛóqëçëÛëöWø4}½tÿx¼~éþwŸï»ñõ"9ö?¹ó^º¾¤÷—>ÿ}øñü•þ•îýŸEÿ¾ð5å»<ÿ[žÿüóóÊgÞ¿zþýýÿÁß®—Æo×ÏøËò_¥ò¤þO¡ýuÿ«øûýçÿÓý÷¾{ü¯ø3µþJã÷×cþ×_ÿÒüYþƒ¶þ“â¿Ýÿ8ÿÛ<×οw}ç¿­þ©Eù‡ýÏþÖúõûöëñŸt}•öK÷÷_ù罿?ûÞýŸvÿaýýuû_—~Ö×ß3å?þ?üøÿ¾Áÿ‡ýÿCËö¿¾ÿQ¾uû¯mþûù?Ÿ¹þûúÿýßþÿ#üiîÿ‘Æÿ´í¯6üóâHÁËÿ\üg,ÿÿ½øYÿýÿgãÄÿÑÿ–ã?5ñïX^ÅòL:ÿÚòßzüûÏ®ýGüùOþŸÝø—dÿô¿Dþmû—e©·ÿSñÏÜøãõãß-ú¿ïþo´ýÿ'ùÿ™ùÏÖóÿˆÿ“ÿWÓÿ§¿ÿjñ?-K¯øùÿäÿ–ÿÇþë‘ÿ¯ÿÅÿßÂ?{[»Wþã'íÿãó[Žÿou$ãן‹Ÿ«ï•Æ—>>ðÿyøiÿƒwWò%ö?¼~ ÿºýwÞÿ¡ úCmúŸëOÇõ«Ãßmõ¯¯ëO?ÿ§Ïzÿïß‚ÿ ÞôÁÿ~ÿšýgnÿÿÃÿÖùß.þì?Òð­¿ZßÿÿbþºtžGµÿkñÓž¿óŸ–¿AÎÆ×½ë7~\ý/{þ§Ì?úù?¢üÿ”üeÿ‡þ·®ÿ¡?ôÇÿoYþÛ>ÿ þíüÿnþþûákæÿÅys}Î_œóÿÒyyéü»=^¥øW]þß=øwâo=â_ºçRó_Ÿ™Â?ÿž—ó?eýw´_×U¶¿.Ýß»¾ð×µ×þß‚ü?­ÿâû³¼’Ð_[þ—ð-­¿«y©Ï׿öumþ{úü!ÿ€ÿ¾ó¿ýú<óüó7ÿ­Ýÿ,K»ý_šÿöýWÚþOÏÙÿgøWç›Úìÿ¼ýÿkóûþûë_{ÿoMþQÿÿþ?üvëÿ´Û=ÖŸ¶ýÿcÿÛ¶ÿÕ×ðüÊÿÏÁŸü >ô‡þô?¿þý~òzŸºº~Ä¿ßøãëv®$Ô× µ²ö÷×ü߇Ÿ¿ÿ|Yöçf.ésóµïü‡º^møÇãKŸŸ÷Wø•Ö_íø«÷c¬mþžü{úü[—víÝøŸ~üÛ:þØÿ¶íÿu=Êϰ~öõaÛåïþþót¼ÿ8ëß®þëC©üë·þâñuø£ÿtâÿÚñ_ä¿uú·×¯£ÿ1þ÷ÀþÃþÃÿýõè?bý©gÔ¿Ò®¿ù>øÖçßÒú—ú¥¯ºõŸåøIýÿÚ¯ÿC¿úãiøñoüüïõÿfý!ÿÐ?£Õÿ¿/¿¤úG[þ§ðoþOÎü‡üCþ__ûU{ý_kíÏwÍÿ}øùñ¹Ïûìÿúî?µí{ú,þžü{úüÛ•ìÿÆóÿ}RþöÑ?Rÿúýÿÿ?þüÿô?>ðOÿwú¿@èOÿoú6þ_—Ú]ûþ‡ÿmó?ýmï?Öõ8¾ôþîëÝûIáK¿¿ýn?á}Ûü‡û—î×~<žþ¿ôÍõŸý‚¶õsŒ¬«,þ/óÿ'׿$~Ògþµã?Wôßôçv½Uÿ_Ë¿ôó×ÃOëÿx|Iÿ[—ÿíýÿ¤ú¿Ô¿¬¤ÏßÝÿÏjÿgmúOsÝúwÿ˶õWßÿPÛþÅþÃþÃÿOü‡þ‹À¾ÕþŸôÿ¡ÿý¬öÿ¡ÿµmù_î_Ÿ•ο6ÿIñÓž?øù‡üþSûÿ=ÿo쿈ýOÿOøß.ÿ[ÃýÿÿúýÿÃÿð¿%þ·žÿþœáüÿºæó'·ÏZó¿òùßúùŸäÿÚ¦ÿºö…Ó]ðÃýÇ8ÿ2ÞùŸOæ?sþ÷ªÿåñ|Pª~Yüÿ\ÿ»òùyÿ;ëùÿšçÏÆ=ÿoéüçÿ9ÿÏþŸóÿœÿ±Yÿ§ýüwü ÷ßÛ\ãì°ÿ9ÿÏùüøÿðÿÙóÿaÿqþúÛ¤?õÿðŒP‡d4ÿ›•WiüGÿÁþ“ö’ž¿¥þßuül»ÞZÿ»´ÿ/þgÅþGÿ“ÿEý?»ñì?Ûöñoä?ùvã_Òþ¥}öŸãõÿ¡þ?õÿ©ÿOüßBüDÿß'ëÿKôOŸó¯äÿ“ÿ¯iÿöé_ߪ´ã¿øÿéÿi7ÿcYöôÝžïŠþçùc<ãÿüñ¡&ʹæËñzü÷gà¿ûùµáCè¯+?ίóôÉëOÇÿÙó/ý•óéþï}~øþ·ÌÿàoÓþvýi9|è¯[ÿU[ÿê×…ÿޝWòsÿ½#üüøýç#Éß~ø?}þÑÿÈúߺò×úþýþ‡þvéÿÿ_8ß¹O¼:ÿÙ?Îg¥ÇKá§ò¿ÀŸø7ãsëÿ¸W̽¿ŸÙå¢në3-?Ã÷ë×n|ü—ÆŸ¤ò_oÿÛ‡þ2ù·,uðkâ5Ï{þ~¿õ—²™Ãý7ü¯õÿ'忬þCýî¦>ÿ» þüoü?1ýsë¿mÿ—£¿¶üoÇ¿~ÿ·Ç?æíõo=þFüûû?oŸ×Ø_Rû_ÿ/Å_ºÿï7ÿéù%ÿü?øŸü¿ûôùvù‡ÿÿþ?üýýì?éùíø¯]þÇþçüãÏxÎÿ“ÿÅùèo1ÿ[çüÉ8ñ/›þ¿+úçöÊ©ïÉóuìòÿ9ÿÇù?Îÿÿ'ÿßrþ?ö?ñâÿÄÿ‰ÿÛÖ¥øg‹üª‹ÿjÇÿ9ÿi•þÄÿ±ÿðÿC«þíþ3šð·ñá³f|ý»Æ[Ÿëë_êÞÇ‘öýh]Ž×ãÏóò«L¿wûÿ¯ðèéÿÿû-Ï_ižåóßæ?ò_ýýÓ¿ïõß¼ý!ÿÐÿÚô—ÄŸ¥ó?Žü×ê?ÿ!ÿŒ×^ÿ:öç8ë_ú+¥ŸÎo¿ýŸTÿëØÿè]þÿù÷ôù·)ÿÐÿºþ?mùÛOÿHý?èô?þüÿøÿñÿãÿ>ðÿIý¯ÿÁþÂþƒþøÿlúÿ­ûÿ´÷ÿýö_ï¨?ÿÃÿßÏÿàoÛþ_×ãøí³×ûøúþÕóçÆ¯k~¼~<þï7?þ -ÿmþ¶ë­óÿãšþRøñøû{ÏOÇëGû¿†þ¥ùÑþ—>ÿ'çO:>ðKÝû»¯u÷Ó[ÿ­xõ¥ŸÞë}æé|ž¾Eÿ×É?)üëñ%ýo]þ_õÿ;Îg»ü*éÿ«þgµúÿz|üµ¾ÿ•þ5ë¿Gÿ»uí»þ¼ËÏ_¸ßö/öŸmûÿ?þ?àøœÿ·–ÿk=ÿøú_Ûþq¼õü/övöðóým>ù?äÿaÿ“ÿÿ“ÿGþþ?üøÿÐÿœÿ‡ÿáøÿ{ùÿç畵ÏÚú³¼*lŸMóÞ¿ùï~¯ëÓ|ÿÂs?~»¾õ' ý_^ßï ?®oõöóþÞåŸ?ŒjÃø#Ãßú…þÅ¡?ÑÖ)ô+:ö9î±þ}“ÏðKëÿü\ñó‡ëûÏRø¤¾Wšÿ«y©…ýµé¿®}áÇpÂýSó©-ÿåùß²üçþÇë±~öîÞø3y×'ÿµÿé÷?¯ÿ£=¦ÿ^ž>gû*7ÿ¹þ{5ø§ûÿþ;ößJóÌ9üRú#w¿óýG\ÿÒó3õãµõß;žÿIóo]þ±ÿ`ÿoÿÒþ'·_ê³ÿÐÝYßÿ]ÛÿçþÃmòw¿ÿ‰û?°ÿÁþo¥ù—;ÿÛ¶þîÿEþãÿÃÿ‡ÿϪÿûÏ:ÿCËô/ùgïûïùµýŸø?dþËw\×ö¿iãÿÉëÒø4þ§mÿãO©|´kÿy9þ“Õ÷ÿ¯kKü­—ý?büÏ’ýþ'ÿëN¼zšûÆÿGÜÿ[ŠÿcÿÙ¶ÿˆÛ†OþŸíøWëþ§^ÿßËz½¾ðj‰¦Ççìï$ötÿ7Úþþ×ÿ[Êÿ#þoÙÿ;¢ÿO¶ÿZW‰ÿíŽþéÿ!ÿŸüÿ‘òÿïÚRý£Åÿ_#ÿö¼Ø7þïwÞ­ë4{çݺN³wÞ-‹wË2ÍÓìݲx7OÓ<ÍÞ­«wÞy·®??¿Þ-‹wËâݺN³wÞ­ë4{çݲx·,Ó<ÍÞ-‹wë:ÍÞMó4{W¶ÿ­Äÿ·~!¿Çþ![¢×OxüÞ«ž@îómüñóëûõÿùI?øƒ¿mü¥û)þ¥ýO ÿwŸÿiƒ_¿ÿƒþÐ_›þšýŸŽõ?nÿDzÿ­þºýÿàøþ·‰?ûŸþïï¾Þ½Ÿ¾ôûìÿjýÏRújÿ{W·ž¤ñíõŸ—ÿ­ý‡ëû?­ÿËø÷XÿúýŸÑÿÈÿ±ä¿Lþö;ÿgÕÿ‡þ·£ÿ¡?ôÇÿü¯§X¿1~WãóùÀ|ê?ÚÈÿ½Ê¿ÜYêãGéú÷Ï_×MýªÜùëÖóï½ÎëŸÿi§ùÓ -?à_;~Ëÿ‹ë™é®¿åÿ½óûßwÝzýÇ{ùë²ù׿?)~Úó÷ùëï¯ÿAýêŸaÿk÷ÿ™§ûë®ý¯mÿHð׆ßcþ©ÿEÿ/øßrýÛòϺÿÿþ?üvýû¯Gÿýú¿ð?ö?õñÿ€?øÿ¡ÿ“µþOÐÿõñÿQÿÏfý?ëõeø÷^ÿòùÇSÿ—ú¿=÷?äß|ììâÿØÿÄÿ‘ÿuò¿oüwÄüoüÐßJüûþ‡þ6éOý?ê?ŽHê_~¾þ_»ÿ¹½þßõ_rø×Ôß“ûÿǨÿGýo{õÐÿÔ¤þ›ÝúoØÈ?ö?¶åÿˆõ¿Ç¨n½ÿOyÿ×§þùxö?õÿ©ÿOýêÿ[Òÿ#ùÿ>Yÿ?çÿ*­¿>ù?èô?þüÿøÿñÿZÿÏÓ~~7xWóÖ›þ Ÿí?OßÓ?5^ -?¥ÿŽcÀüÁÿ% ÷ò}“OWòÿ,?¥øoò{žRðËøçÇù?OéçÏãßšÓõ¦ùœý¡ÿòo¿—Ì¿¿û[w¿§ã/•ÿýæÿÎ÷ÃúßÖñq|êú²ôÃ?ðO~ ŸÒøÔõýóÃÿð¿eþÛöKügï¿›§úñ›ÿ9öÿhÂo¡ÿ7—ùÿÒñ‡ðyyþµíYü§GýÛQâ?±¿?-OãïÏSýøøûó4Òú¯Çïw—®ÿø~íð¯Çï¯÷Ðÿï¡_ïçùôóÛ‘ÿûøU?ý_/÷ú_ZÿÁúþO›þ-ó_?¾<ÿÚëoûûÏ¢ý‡ÿŸø„þRükèw~?úƒ?ø[Á¯ËòïS¿åøJ>>j2çê?_㟼ÿ}ÿ~1ü#ÌãóÇý§jâW5ðåñ/)ýeëY¤óïyÏßï·þÚè¯ÃÿRû¿‡ý«YÿÒºü×îÿ¦-ÿeýßÒý¼Ôô|^ýמüüCþaÿcÿ÷°?[ìÿçã/¥?ö?ö?üÿëò¿]üÑÿøÿðÿ¡ÿmëøþ‡ÿíð¿õüGÆsþŸóÿíù“Òõ§ÿIþôׄÿÄó/=ÏÿŒsþÏæù×=½ŽýÙÓûƒkúKóÿëÏÿ—öGw®“ÿßëü[úóšócœáüçÿÙÿ°ÿµ5žó?Ôÿáü5úóÿÈü?øÿ ¿-ÿöüý©ÿBý?ëõŸúÕ¹ãÿ|âúï‰ÿHõÿdñŸ¶øß8õŸÒø—üïýêÿèøÿ¥ñ³~ö§Nüø?úŸúÏÔÿ#þýgÑþ#þü'ÿÏnü«eÿ·}¯oýWþ?Ôÿ§þ?ùÄÿñÿêøÿÆ©ÿ/Õ?ÒøùÿäÿëæÿËì¿¶üÿqêÿãÿ§ÿ§µøÿ뉶§Ï¿ñ×¹Îõï¾.ý÷nøï~~møÐúkÑ¿Î~)åO¶:þOŸÿºúU×õÓúá_‚ÿ¾ç‡ÿáøß&þÖíÿÍ_õ÷{ô_]þ­—?q»^¿] >ôûÖ„>5©©ïIç_SÿÖà_ZWó’‚“ú\›ÿÎýg¼»’Ÿmýo®ûÏŒ°þ%ø?}þÑÿÈMù¯-Ùÿ¡ÿ­ëèo—þøÿ‰ÿ¼r1Žù[~BúzïûÇã¥ðK÷ì_®§ÏO–úŸ¤úç´ç?¥%bèR³þKãóú_’Û#øÿÛé/•ÚýŸÒëEºþ¦ùÞýõäÿ–‹y´¯á·ÙŸáþgú§ì_)ü3þøÿsûÿcþzn½¶íÿ®é¯/ÿËø—Ö_yÿ·Ïÿ>ϧæú·#þ‰}Œý¯×ÿXßþ‘áßÏþÕìÿJþŸíü?ëüo=ÿÏ®ü³îÿÅÿ‡ÿÿŸeÿŸÌ~ê¡?uãÿð?ö?çžzþ„ñŒg¼žüÿüw?¿6|èý5èÿ¿ºWÑëU}¥¸þW8’¿ÿ<®¿:Æù—ëúPu×¥ô“Âo»~EÿeIÿ^}O:ÿ¥ß~­¿çõ÷zMóÍúKñÿ#ÿk¯mþÿù÷ôù·)ÿ°ÿ5ãcÄ¿­ãýo{ÿ'©ÿZ__µTŸUwý[Ö}è/•ýÖ_¿ú¿öôßgãÿÚñ_ä?ô¿‡ ýãùÛçÿcÿaÿáÿ‡þšþ¯¿ß|ÿªðw[ÿËRÿ1Mø5ý+Jý#Ÿ<Þúü[_ÿRÿsMÿŸRÿ™kùU¦ß»ýÿWxôôÿÇý®úôÕöÿi›ÿ6ÿ”ÿêï_ßÿ§Ÿÿæýëù‡þצ¿$þ,ÿqä -ÿòúë'ÿá?äòñZë_ÇþgýK¥ôÓùí·ÿ“êûý¯Ëÿß#ÿž>ÿ6åú_×ÿ§-ûé©ÿýþÇÿÿÿ?þü_À>ð?©ÿuâ?#Ø_ØÐÿŸMÿ¿uÿŸöþ¿ßþëõ'àøÿûùümÛÿëz¿}öz_?¿zþÜøuÍ—ÂÇÿýæÇ_á¿Íßv½uþÃý÷=—®é/…o±¿÷üt¼~´ÿkè_šÿíéórþ¤ã¿Ô½¿ûZw?½õߊW_úé½^ÑgžÎçé[ôü“¿_ÒÿÖåÿ±ÿÙ^¦®ß—_%ýËÏ»úÿz|üµ¾ÿ•þ5ë?5ÿ©óï¹ù_×¾ëÏ»üü…ûaÿbÿÙ¶ÿðÿãÿ>ðÏùkù¿Öóÿˆÿ¡ÿµíÏÇ[Ïÿbÿggÿÿ1ÿØßÖá“ÿCþö?ùð?ùäÿáÿÃÿ‡ÿýÏùøþ‡ÿ¿—ÿ~^ùXûü§­?Ë«bÁöÙ4ïý›ÿî÷º>ÍÇñ/<÷ã·ë[’Ðÿåõý¾ðãñáúVŸa?ÿàï]þùè6ü?2ü­ßQè_úmýB¿¢cŸãëÿØ7ù ¿´þÏÏ?¸¾ÿ,…Oê{¥ù¿š—ZøÐ_›þëÚ~ 'Ü?5ŸÚò_žÿ-ËNá¼ëgïî?ó—w}ò_{ðŸ~ÿ÷óú?ÚÓiúïáåés¶¯róŸë¿Wƒºÿ_à¿cÿ­4ÿÇüÃ/¥?r÷;ßÄõ/=?S?^[ÿ½ãùŸ4ÿÖåûöÿ–ñ/írû¥>ûÝý—õýßµýî?Ü&÷ûŸ¸ÿóûìÿVú÷¹ó¿mëïÞù_ä?þ?üøÿ¬úÿ°ÿ¬ó?ô·Lÿ’ö¾ÿñžÿWÛÿ‰ÿCæ¿|Çumÿ›6þŸ¼.ÿHãÚöß9þ”ÊG»öŸ—ã?ùW}ÿÿº¶ÄßzÙÿ#Æÿ,Ùÿèò¿îÄ«§¹oüÄý¿¥ø?öŸmûø·møäÿÙŽµîêõÿ½ü§×ë ¯–øgz|Îþ÷NbßH÷£íÿGàýø¿¥ü?âÿ–ý¿#úÿdû¯u•øßîèŸñòÿÉÿ)ÿÿ®ý'Õ?ÚñWüÿ5òoÏ‹}ãÿÞyçݺN³wÞ­ë4{çݲx·,Ó<ÍÞ-‹wó4ÍÓìݺzçwëúóó÷ëݲx·,Þ­ë4{çݺN³wÞ-‹wË2ÍÓìݲx·®ÓìÝ4O³weûßJüŸ~ø±ûË—X>”®¿þ»Ÿ_>ô‡þš?ûÚJ©Ïã¿Ïõƒd㟎ÿÓç_ßk¿>¯ü±ÿ@Žþ»Ÿþ‡ÿmó¿mü­ÿlõã×Úï—>¯ßúÔÿ$mý[¿´þ¤þ7íõ¯]t„õ/ÁÿéóþGþkÊmùËþýo]ÿC»ôÇÿOügŸ_ç'¦¯ßßÒýãñRø¥ûß}¾oÇŸëV¯‡Þ(ÇzOWù—çü©šøË~ü±þ_ºÊÌõùÏ~¥ñ¹áùN眷|üHòO¿ê3¾þRù—žÿü+üsã×ãçÏÕ;k[Ó|ïþzòßúùä¿ný?}ùOýÍüãÖ¿åóßØÇØÿ±}•;Ùfæí]ûG†?ûwžúÍêükiÿPÚÿ\ÛÏòõ×¾ÿêñü¥%ü¤ÿàmþ_þè»á÷ßÿÛ’Öý¿øÿðÿáÿ³ìÿ“ÙO=ô§¦ýÿcÿcÿ«¯?Æ3žñ”ÿŸƒÿîç׆ý¡¿ýÏu®^¯Û¹Špÿ°WÜ×— -õ—òã÷Ÿ/ËþÜŠný»¿øùê¯Ké'…ßvýŠþË’þ½úžtþK¿%üZõëé×Ôäÿï‘OŸ›òû_3þ7FüÛ:þØÿ¶÷!^lÂ×úI_¿+_K÷aý[Ö}è/•ýÖ_z}•ðGÿ}>þ¯ÿEþCÿ{ø·Ð?ž¿}þ?ööþè¯éÿÒ¬?õìúWÏo}þ­¯©ÿyGúû=_?×­ÿ\Æÿ -žþÿ¿ßòü•æY>ÿmþƒ~õÇK÷Oÿ¾×óþõ‡üCÿkÓ_–Îÿ8ò?…yýõ“ÿðòùÇx­õ¯c޳þ¥¿RúéüöÛÿIõ¿Žýþ×åÿï‘OŸ›òý¯ëÿÓ–¿ýôÔÿƒþGÿãÿÇÿÿÿ?ýøá‡ŸÏôÿ ÿ‹íþ/Пþßôÿ¶Ùÿ[f¿Êñ×µ¿áøß6ÿÓÿ×òÏßoèÿü‡ÛïöÞ·õŸ ÷/ݯüxüuÿËøþuïïþܽŸ~ý÷éÿJÿßíwÏ?ÛùÁýwÚãáþûžc£¬Iü¥Ïükç?únówEÿ6ýyMÏ´þ®‡_7¾¤ÿ­ËÿöþRý_êVÒÿïîÿ÷ýû?]ú—ê×—Öó»û_¶­¿úþ‡Úö/öŸmûÿ?ñú#rë–ûÒÿ‡þ?ôÿ±Ùÿ‡þ×¶å\·>Õ¿~šs}î¥ó¯+ÿËø—ÖßÕ¼¤à¤>‡ÿÈ?®[ìÿ÷tü¿§ÿ"ö?ý?á»üoô?þ?üèô?üÿÃÿÖøßzþ#øóÃùÿߙΟŒ¯ßÍ_º^ÏÚùŸäAÿþmðïÞ_ûü‹Þùýügëçý÷ùïWýçâúÿòóùþuåó?Òþwäÿkž?áü çÿ8ÿoû‡ý¿Uü9ÿCýÉùï:ùéü3õ8ÿo]þãÿÃÿ‡ÿÏ¢ÿûþ‡þvéOý?ÛöŸvý‘1Ö¿þ#Õÿk‰ÿHã#Ô’ôêqþO×ÿ¿õt:Ú§Wôo«ÿÛÿëÆÿ¬ÛÿèÛ?Ôÿ³ÿÇþ³mÿñƒü'ÿÏnü«´ÿ‰íç¶ü¿Üüë÷¥þ?õÿ©ÿOüߢÿWÛÿ§]ÿ_ªäç_Éÿ'ÿ_;ÿ¿Ýþ“êŸêÿãÿ§ÿ§Ýü_©þßæ?'?Âý_óä_šÿ¤ðSòÿ(ÿÁüÁ_¿xûlYrð_ßï-ü+üÏã÷øÇõ‹Úñ¿†æåŒÿV új>¡?ôסÿvßð;Oûüð÷ö½#üðy ÿqüöùþþ߃¿tý÷›ÿxüþúöYØ7\ã¿,yø}ùÿ>üþ¡6Øùyã{Ãÿð?üoìÿxüßoêúþ•ÿ,7>Äòø·ÂÇ{—ýÓúÏ»Üü_½—Òû?ÿõó§åYŒÿõüé¬ÿ³ü¼ºÓ7þõüŸ¼.Éí!ÿÇíÿU׿¾÷üºÿ^ŠïàW/½¿Þú¯Íÿå?hë?)þçç÷îÞü{×wþÛêŸZ•ìØÿZ†ßþ?îs¤ëÿØ7³Çþ+~þiNïËØÿÐxÜýMûÿýuæÿ»Ößóä?þ?üøÿ¾Åÿ‡ýÿC»ô×ö?Žxݺÿ!??}ýŸÏ[ÿïÇ_¿tÿ¼ÿ÷nüGÿÓ¶¿î㜿³þòîNüg4ÿmü­—ý?büÏ’ýþ'ÿK3~=âþßRüû϶ýGüÛ6þäÿÙŽµîöë½gþSÙþÏÇ?Ïã÷ñÏ×û’ÿ/¯ŸûîÿFÛÿÀÿcç?[Ïÿ#þÿMþßýŸÜÝ÷?õÿÿOþÿHöï]ûOšÿ¯ÿÅÿß&ÿzÅÿ½óλufï¼[×i^WïÖÕ»e™æiön]½[×ižfïÖÕ;ï¼[ןŸ¿_ï–Å»eñn]§Ù;ïÖuš×Õ»uõnY¦yš½[ïÖu𽛿iö®lÿ[‰ÿoõþ~õ¶ú ¯Ÿðþø½W=ÜçÛøãç×÷ë?ÿó“~.ðÛøKýŸRüKò¯„ÿ»ý¿mðëõô‡þÚô׬øtü{¬ÿqëÿ—ý}ð×­ÿÿÃÿð¿MüÙÿœð¯x÷õîý¤ð¥ßgÿW–ÒTûß»ºõ$ÿj¯íþ7cëÿ2þ=Öÿ“ûÿ ÿ‘ÿïÿ2ùÛ/ÿÕªÿýoGÿCèÿùÏùwàsþ‡ó?wÎ÷È¿÷ü¿õü_ÎÿsþŸóÿœÿçü?çÿ9ÿÏùì[çÿ©ÿmûü?ç¨ÿÿSÿŸóÿ6ÏÿãÿÃÿ‡ÿÏZÿÏ;ö_þçãžÿ‡ÿ±ÿmÖÿÇÿþào7þCÿúÿ@ëþ?½þßcÔ?µéÿ£þ/õµùÿIòÏ^ýßï’ìȧÿ3ö?ö?ñìâÿÈú¿ãÿƒþVâÿØð?ô§þ?õÿ¨ÿ8 -ý©ùùúíþçöú#ÔÉá_SOîÿ£þõ¿íÕÿAÿSÿ‘úovë¿aÿ!ÿØÿØ–ÿ#Öÿ£þ¹õþ?åý_ŸúçãÙÿÔÿ§þ?õÿ©ÿoIÿäÿûdýÿœÿ«´þúäÿ ÿÑÿøÿñÿãÿÇÿÿiý?OûùÝà]ÍÿYlú'|¶ÿ<=~OÿÔx)ü”þ;Žðÿ—,ÜË÷M>]Éÿ³ü”â¿ÉïyJÁ/ãŸäÿ<¥Ÿ?üiN×?šæsþ9ô‡þcÈ¿ý^2ÿþîoÝýžŽ¿Tþ÷›ÿ;ßë[ÇÇñ©ëËÒÿÀ?iø%|JãS×÷ÏÿÃÿ–ùümÛÿ-ñŸ½ÿnžêÇoþçØÿ£ ¿…þß4^æÿKÇÂçåù×¶ÿeñŸõoG‰ÿÄþþ´<¿?OõããïÏÓHë¿ÿ½ß]ºþãûµÃ¿¿¿ÞCÿ¿‡~½ŸçÓÏoGþïãWýô½üÝëiýëû?mú·Ìýøòük¯¿qìoì?‹öþâ?úKñ¯¡ß]øýèþàoÿ½.Ë¿Oý–ã+ùøL¨Éœ«ÿ|nüñzü÷=üSøÅð0Ï÷Ÿª‰_ÕÀ—Ç¿¤ô—­ÿe‘Îÿ½ç=¿ßúk£¿ÿKíÿö¯fýKëò_»ÿ›¶ü—õK÷óRÓðyõ_{ò?òù‡ý?ŽýßÃþl±ÿŸ¿”þØÿØÿð?ü¯ËÿvñGÿãÿÃÿ‡þ·­ÿáøþ·ÃÿÖóÏùÎÿ·çOJןvþ'ù_Ð_þÏ¿ô<ÿ3Îù?›ç_÷ô:ögOï®é/Íÿ¯?ÿ_ÚݹNþ¯óoéÏkÎÿqþ…óœÿgÿÃþ×ÖxÎÿPÿ‡ó×è?Îÿ#ÿñÿàÿƒþ¶üØð?ô§þ õÿ¬×êWäŽÿó‰ë¿'þ#Õÿ“ÅÚâãÔJã_ò¿÷«ÿ£ãÿ—ÆÏúÙŸ:ñ?âÿèê?Sÿø?öŸEûø7òŸü?»ñ¯–ýßö½¾õ_uúÿPÿŸúÿäÿÿÇÿ«ãÿ§þ¿TÿHã?äÿ“ÿ¯›ÿ/³ÿÚòÿÇ©ÿÿŸþŸÖâÿ¯'zÑcÿö|éëÛëöWø4}½tÿx¼~éþwŸüÁÿ{ñÕ"9Ö?É¿?þ“âþw„W¿4¾ü/ï}øwïý¡¿ýµë>éú¯þu©þÕ±~Z?üuê¿Áÿð?üoëöÿæ‹ùû=ú/¯àÿÖËŸ¸Ýÿ8Þ»ÿíú™þ¯ï÷…ÆÿŸýßžþÓ|îs¥¯â>7RúkÛÿ5ø—ÖßÕ¼ÄöHøü8Ÿšë_»ÿÍë_‚ù÷äþ?èä¿týû¦õ¿gùŸ–ËìÿÐÿèèo—þøÿ‰ÿí®søÿ—Úÿ-ñŸ¸IûùË6ù{o|Þž‘õ‘ÊÿgÆÿîѧ¼ÿ¿;ÿ’ñçç×\Úò½Íÿò‰cûþj|Þÿ¯ùß²ÿ;îg¤ó¯+ÿ[öÇõW3ùýßÓø¯Ÿÿ›ø'ñOìÿ§å¿Ô×O­ËÿÑ´tŸ_{þÉÿ#ÿþ'ÿϪü³îßÅÿ‡ÿÿŸeÿŸÌþë‘ÿ¯ÿ‡ÿ±ÿ±ÿµÎÿ<ýü øƒÿwáÿYý¯-ÿ¥ú? ÿ³¼‚þÐ_‹þÒú_ËrþÜ»t})ïÒõ¬Æ8ÿÒVÿªŸü——ֿ=ÓYòô÷N^ÿ,ðO^-þ¹ñ¹ßóù¯ÿ׬¿×kŠÿ½;ó¿öú׿ÿï‘íõÿ¼ë;ÿ©ùÝϺþMù‡ý¯fücãÿØÿß³ÿ“öO{GÿµO®ëúO›~Ö×ßsä¿ø¿vüùýÇ‚ý‡ý‡ÿúÞÿEÿKÛýéÿjqýÓÿ‡þ?ôÿ±Úÿù‡þ—Õí×ÿW[þ[ïÿ‹ý‡ü³'ÿÿ½ú_·Ùÿã¬iÿ])ýŸÓÿ7½ÿ“êûý¯Ëÿß#ÿ¤ú_gÿo]þ¡ÿuýùüç6ùÛ3ÿ¿^ÿHý?èô?þüÿøÿñÿãÿðÿ÷ã/=ÿÔOþëèëòú£ÿûøê÷£#ùÿ¬û¿°ÿáøÿ7ø“ÿ]ë\×£ÿ±vüUüK~ ý¿i<ùøÿïÆ¿¯üù¥ñWñÿ1Ö?ñÙ{)ýz?ϧŸßŽüë¹§þ¯—¿{ý¿,õÏUŽózôo™ÿúñåù×^ãØßØí?üÿøÿˆÿ‚?ø[ÿKã?mþåqä¿Íü_âìÿ8ÿJü‡ýçÿ9ÿüÃþ·Š?ù?äÿaÿ“ÿÿ“ÿGþþ?üøÿÐÿvÎÁÿð?üo‹ÿ_Oô¢Çÿíù¸Îõóõíuû+|š¾^º<^ -¿tÿ»Ï÷Ýø¿z‘ûŸÜy/]_ÒûKŸÿ>üxþJÿJ÷‡þÏ¢_øšò]žÿ-Ïþùyå3ïÇ_=ÿþþÿào×Kã·ëgüeù¯Rù?Rÿ§Ð¿þºÿUüýþóÿéþ{ß=þWü™Z¥ñûë1ÿë¯iþ‡,ÿA[ÿIñßîœÿmžkçß»¾óßVÿÔ¢üÃþgkýú}ûõøOº¾Jû¥ûû¯üóÞߟ}ïþO»ÿ°þþǺý¯K?ëëï™òÿþ?üßàÿÃþƒÿ¡¿eû_ßÿ¨ ߺý×6ÿýüŸÏ\ÿ}ý¿ÿþï ÿŒÿþ4÷ŠÿHãÚöWþÇùq¤àÇå.þ3–ÿÿ^ü¬ÿþÿ³ñ?âÿèËñŸšøw,¯by&mùo=þýg×þ#þü'ÿÏnüK²ÿ ú_"ÿ¶ý˲ÔÛÿ©øgnüñúñïýßwÿ7Úþÿ“üÿÌügëùÄÿ¿Éÿ«éÿÓßµøŸ–¥Wü‡üòÿGËÿ¿cÿõÈÿ׌ÿâÿo៽­Ý+ÿñ“öÿñù-Çÿ·:’ñëÏÅÏÕ÷JãKŸøÀÿ<ü´ÿÁ»+ùûÞ ¿„Ýþ;ïÿЄý¡¿6ýÏõ§ãúÕáï¶ú××õ§ŸŽÿÓç?½ÿˆ÷oÁï?úà ¿ŒÍþ3·ÿÿáëüoöiøÖ_­ïÿ‚1]:Ï£ÚÿµøiÏ_ùOËß gãëÞõ?®þ—=ÿSæýüQþJþ²ÿCÿ[×ÿÐúãÿ·,ÿmŸÿvþ7ÿÿýð5óÿâ¼¹>ç/Îùé¼¼tþݯRü«.ÿïü;ñ·ñ/Ýó?©ù¯Ï¿LáŸÎÿ ÏËùŸ²þ;Ú¯ë*Û_—îï]_øëÚkÿoAþŸÖñýY^Iè¯-ÿKø–ÖßÕ¼ÔÎçˆë_ûº6ÿ=}þÀßùß~ý?žyþù›ÎÿÖî–¥Ýþ/Íûþ+mÿ§Æçìÿ3ü«óMmöÞþ€ÿµù¿}ÿýŽõ¯½ÿ·&ÿ¨ÿ‰ÿÿþ?»õÚí¿ëOÛþ‚ÿ±ÿmÛÿêëøÀþåÿçà¿OþúC úŸ_ÿ~?y=ŽO]]?âßoüñu;Wêë…ZYûû¿kþïÃÏß¾,ûs3—ô¹ùÚwþC]¯6üãñ¥ÏÏû€+üJë¯vüÕû1Ö¿6ÿ?Oþ=}þ­Ë?»ö¿nüO?þmìÛöÿºågX?ûú°íòwÿy:ÞœõoWÿõ¡¿Tþõ[ñø:üÑ:ñíø/òß:ýÛë¿×Ñÿÿû`ÿaÿáÿ‡þzô±þÔ3ê_i×ß||ëóoiýKýÇÒWÝúÏrü¤þíW‰ÿ¡_ýñ4üø7~þ÷úÿ?³þèŸÑêÿß—_Rý£-ÿSø·?ÿ'çþCþ!ÿ€/ƒ¯ýª½þ¯µöç»æÿ>üüøÜç}ö}÷ŸÚö¿=ý?ÿ?Oþ=}þíÊ?öãùÿ>)ûè©ÿýþÇÿÿÿ?þúøÀ§ÿ;ý_ ?ô§ÿ7ý¿?ÿ¯Ë?탿®ý ÿÃÿ¶ùŸþ¿¶÷ëz_z÷õîý¤ð¥ßß~·Ÿð¾mþÃýK÷ë?Oÿ_ú¿æúχ~AÛú9ÆÖUˆÇ—ùÿ“ë_?é3ÿÚñŸ+úoús»Þªÿ¯å_úùëá§õ<¾¤ÿ­ËÿöþRý_ê_VÒçïîÿgµÿ³6ý§¹ný¿»ÿeÛú«ï¨mÿbÿaÿáÿ'þCÿEàßjÿOúÿÐÿ‡þ?VûÿÐÿÚ¶ü/÷¯Ï¿Jç_›ÿ¤øiÏü‡üCþÿ©ýÿžŒÿ7ö_Äþ§ÿ'üo—ÿ­áþÇÿ‡ÿýþ‡ÿáøßÿ[Ïοpþ]óù“Ûg­ù_ùüoýüOòmÓ]ûÂé¿®GøáþcœïüÏ'óŸ9ÿ{Õÿòx>(U¿¬Gþ®ÿ]ùü¼ÿõüÍógãžÿ·tþóÿœÿgÿÏùÎÿجÿÓ~þ»Nþ†ûïm®qö?Øÿœÿçü?þ?üøÿìùÿ°ÿ8ÿ ýmÒŸúø?F¨C2šÿÍÊ«4þ#ÿ`ÿIû?IÏßRÿï:~¶]o­ÿ]Úÿÿ³bÿ£ÿÉÿ¢þŸÝø?öŸmûø7òŸü?»ñ/iÿÒ>ûÏñúÿPÿŸúÿÔÿ'þo!þ?¢ÿï“õÿ%ú§ÏùWòÿÉÿ×´ûô¯oÕ?Úñ_üÿôÿ´›ÿ±,{únÏwEÿóü1žñŒþøPå\óåx=þû3ðßýüÚð¡?ôוç×yúäõ§ãÿìù—þÊù¿tÿ÷>?üÿ[æð·iÿ?»þ´>ô×­ÿª­õëŽÂÇ×+ù¹ÿÞ~~üþó‘äo?üŸ>ÿèä¿Fýo]ùk}ÿ‡þGÿC»ôÇÿÿ/œïÜÎ'^ÿlƒç³Òã¥ðSù_àOü›ñ¹õÜ+æÞßÏìÇ¿rQ·õ™–Ÿáûõë?7¾NþKãORù¯·ÿíC™ü[–:ø5ñ¿šç=¿ßúKÙÌáþþ×úÿ“ò_Vÿ¡Îþ ÷?Ó?ŸÿÝÿNþ7þŸ˜þ¹õß¶ÿËÑ_[þ·ã_¿ÿÛãó¿öú·#þ‰ý‹ýŸ·Ïkì/©ý¯¿ÿ—â/Ýÿ÷›ÿôü’ÿGþüOþß}ú|»üÃÿÿÿþ?‹þ¿~öŸôü‰vü×.ÿcÿsþ‡ñŒg<çÿÉÿâü?ô·˜ÿ­sþdœø—Mÿßýs{åÔ÷äùÇ:ö?ùÿœÿãüçÿˆÿ“ÿo9ÿûŸø?ñâÿÄÿmë¿Rü³E~Õŵãÿœÿ´JâÿØøÿ¡¿Uÿ¿vÿMøÛøðY 3¾þ]ã­Ï¿õõ/õ?ïãHû~4.ÇëñçyùU¦ß»ýÿWxôôÿÿý–ç¯4ÏòùoóHù¯þþéß÷úoÞ¿þèmúKâÏÒùGþkõƒÿÈ?Æk¯ûsœõ/ý•ÒOç·ßþOªÿuìô¿.ÿü{úüÛ”è]ÿŸ¶üí§¤þô?úÿ?þüÿøÿñøÀÿ¤þ׉ÿŒ`aÿAü6ýÿÖýÚûÿ~û¯wÔŸ€ÿáÿïçð·mÿ¯ëqüöÙë}|ýÿêùsã×5?^ -?ÿ÷›…ÿ6ÛõÖù÷ßÞÿƒqM)üx|‹ý½ç§ãõ£ý_CÿÒühÿKŸÿ“ó'ø¥îýÝ׺ûé­ÿV¼úÒOïõŠ>ót>OߢÿëäŸþõø’þ·.ÿ¯úÿç³]~•ôÿUÿ³Zý=¾NþZßÿJÿšõߣÿݺö]Þåç/Üo ûû϶ý‡ÿÿð|Îÿ[ËÿµžÿGüý¯mŽ8Þzþû?;û?øùÇþ¶Ÿüòÿ°ÿÉÿƒÿÉÿ#ÿÿþ?üèÎÿÃÿð?üÿ½üÿóóÊÇÚç?mýY^ ¶Ï¦yïßüw¿×õi>Žá¹¿]ßú“„þ/¯ï÷…×·ú ûùïòÏFµáü‘áoýŽBÿâПhë‡úû÷XÿǾÉgø¥õ~®øùÃõýg)|Rß+ÍÿÕ¼Ô‡þÚô_×¾ðc8áþ©ùÔ–ÿòüoYþs -ÿãõX?{woü™¿¼ë“ÿÚƒÿôû¿Ÿ×ÿÑžNÓ/OŸ³}•›ÿ\ÿ½üÓýÿÿûo¥ù?æ‡~)ý‘»ßùþ#®éù™úñÚúïÏÿ¤ù·.ÿذÿ·Œiÿ“Û/õÙèïÿ®íÿsÿá6ù»ßÿÄýŸGØÿ`ÿ·Ò¿‡üËÿm[÷Îÿ"ÿñÿáÿÃÿgÕÿ‡ýgÿ¡¿eú—ü³÷ý÷ü¿ÚþOü2ÿå;®kûß´ñÿäuiüGÿÓ¶ÿÎñ§T>Úµÿ¼ÿÉ¿êûÿ×µ%þÖËþ1þgÉþGÿ“ÿu'^=Í}ãÿ#îÿ-Åÿ±ÿlÛÄ¿mÃ'ÿÏvü«uÿS¯ÿïå?½^_xµÄ?Óãsö¿wûFºÿmÿ?ÿëÇÿ-åÿÿ·ìÿÑÿ'Û­«ÄÿvGÿôˆÿÿOþÿHùÿwí?©þÑŽ¿âÿ¯‘{^ìÿ÷Î;ïÖuš½ón]§Ù;ï–Å»e™æiönY¼›§ižfïÖÕ;ï¼[ןŸ¿_ï–Å»eñn]§Ù;ïÖuš½ónY¼[–ižfï–Å»ufï¦yš½+ÛÿVâÿ[½€øõçâçê{¥ñ¥Ï|à¾Tþ¼~ ÿwû_ß úCmúkÖz:þOŸ©ÿ¡þºõ·àøß6ÿÛÅŸýG¾õWëû¿Zÿ±tžGµÿkñÓž¿ó¯Ùf\ý/{þ§Ì?úù?¢üÿ”üeÿ‡þ·®ÿ¡?ôÇÿoYþSÿóÿœ¿áüÏýóß=êÿyþŸü_ÎÿsþŸóÿœÿçü?çÿ9ÿÏùìokçÿ­Ôÿæü?ç¨ÿOýêÿsþŸóÿøÿðÿáÿ³Ôÿ³Ýþë±þÆ<ÿo‰ÿ±ÿm×ÿ>ðo7þCÿúÿ@»þ¿ñú¶þ©uÿõm×ÿÿŸ$ÿž_ÿ×¶ücÿAþ¿íþÏØÿÄÿ‰ÿÿ'þoSþ[ïÿnÝÿgþ¶ãÿØøÿ¡?õÿy¥þ#óoëµÿXVN»þKÿÖç¿çÿ×®ÿGýo«õÐ÷Ô¤þ›ÝúoðóÍþǶü±þ·~ýsëýêöïÛêÚÿÔÿ§þ?õÿ©ÿoCÿçÿûdý‰þéãDÿ£ÿñÿãÿÇÿÿÿÓúÓA'Äs_ÿf<ãÿÔñ˲—ï›|º’ÿgùù^øï~møÐú!?´ŸŽÿ3ç?¬ßókÍõ~ü_ºÿ{žþ‡ÿ-ó?øÛ¶ÿÃùÏà?ç'÷ßi÷?‡ûïÏ\^û¿¥ðãñ9ÿ÷<íïÿú¹†ß6ÿñø=þ©ñRø)üsô—œ?–Æ´õ¯¾ÿQ?þ³®GX?{þïýÎó”ÿ|?~û<¾¿öúÿûÍ?ŒKÿöùï??>wß½¯éU¯?ë䟾ôûv忤þGý]ÿ¡¬ÿ¥õ¬ïÿ´éŸš¿;ë??¾Nÿ¯kßõw¯þ®ý‹ýgÛþÃÿOüG<Œg<ã=^ú+¿„šÌçž3uÏŸ¿¯ù|ü»~Røòø•tþ¥ôïú{÷ók¯?-þ¯þügá[—ÿÚýß´ùO¿ÿü‡üCþ1^{¼®ýù|üŸ=ÿØÿ6íøþô?þ?üè»úþ‡ÿá{üo=ÿü9?oýüÈïLçO¯ßÏ_Ê­íüOò¿ ÿ5þmðcúÇó·Ïÿ'ÿ_çüÏçÿ,ŸÝÓÛ»3ý„¿÷õáúåÿ‡×;çJãKûòÿõÏŸiŸ±~þóÿ¶÷ìÿíâÏùêÿô9ÿ]{¤óÿè?Îÿ[—ÿøÿðÿáÿ³éÿÃþƒÿ¡?õ_¨ÿg·þ“fý‘qü¿zõ÷F©ÿ'‹ÿ´ÅÿF¨ÿäÝùµÖÿÞ¯þŽÿ?¦oŠ>ñõ»õ¿ëìøñô?õŸ©ÿGüûÏ¢ýGüùo=ÿÏrü«´ÿ‰íç–ü¿ºú£:ý¨ÿOýêÿÿ§þ¿ŽÿoœúÿRý#ÿÿOþ¿fý©ý×î£þ¿]ÿ?ý?­Æÿ_Oô’{ÿé&ŸÒ×·×í¯ðiúzéþñx)üÒýï>øƒÿ÷âÿﻯßi®{ü'Åÿü﯄i|ù_ßûðïÞúCúËó¿eùOÇ_ºþëâ×wç_’ÿþZŸÛ~ÿ ÿX¿ªþËR¿¦þV<þºþüÿÃÿvñ·nÿoþοߣÿó -~ðo½ü‰Ûý㽋ñß®Ÿéÿú~_øgüðÙÿíé¿éËпæZ_Å}n¤ô×¶ÿkð/­¿«y‰í‘ðùq>5׿<ÿSÿaýKðï!ÿrñ϶ù¿ÿDÿ#ÿuäÿ¹oZù{–ÿi¹Ìþýþ‡þvéÿŸøOÑþá:׉ÿ©ýßÿÙ믖ýc,ÿïÊß{ãóöÌ]üÏûG‰üfüï}Êûÿ»ó/~~Íõ§-ßÛüÿ!Ÿ;¶ï¯Æçýÿzð‘ÿ-û¿ã~F:ÿºò¿eÿw\5ó—ßÿ=ÿúù¿‰ÿÄþZþKÎþºoÿëÚ?ºÏ¯=ÿäÿ‘ÿÿ“ÿgUþY÷ïâÿÃÿ‡ÿϲÿOfÿõÈÿ×ÿÃÿØÿØÿZçž~þüÁÿ»ðÿ¬þ×–ÿRýŸ†„YÞ?Aè¯Eiý·pþäº~Øþþ÷êÿ}òüK[ÿ‹~ò_ -_ZÿîLÿeÉÓß;yý»À?ixµøçÆç~Ïç¿rü_³þ^¯)þ÷îÌÿÚë_›ÿ¿Gþµ×ô®ïü§æw?ÿéþ76åö¿zü™ñÿcÿÏþ¯(ß|]{ý[×Úô³¾þž#ÿûÅÿµã¿Èè?|ì?ì?üÿÐÿóþ/»ýéÿ¤Gú_ë÷ÿÑìÿ5Nÿç4þ¥þ‡ýú?õ뿘ꗕëÿ#ñHåŸvÿ¯¼ýܶþîØ?È?ôÿôo‹?÷ëÿ§-ÿíöÿÃþCþY•ÈÝþß㬛ý¯éÿ‹þ×äÿï‘Rý¯³ÿ·.ÿÐÿºþ¿|þs›üí™ÿ_¯¤þô?úÿ?þüÿøÿñYñ‚?ø¿NüGÛþÇþƒþÐß®ÿߺÿO{ÿ_:ÿ\¿ÿj;ÿ ÿÃÿð?øcÿŸÇ¿ÞÇ×ÿýàóø«ùߟ§úñWôþYÿýý¦®íÿÔúýû½7ÿ£ÚÿWÏÿ÷›~ïòóî—çÿZø¥ñ¿ùñWòÿ³ïµ×ýó¦_Û×ÿßoøý¾_Ò¿i{®ÿü߃_e"ÿïÉÿX~õÑ¿õò·~üçÇÿ7ýkÖÿ²Ôû/¯æŒõ§mÿbÿÙ¶ÿðÿsþÿøƒ?çÿíäÿZÏÿ#þ‡þ_×¾ög›ÿKÛþ%ÿ‹ýŸåýßxüüCþaÿ“ÿCþö?ö?üÿ“ÿGþþ?üèô?üÿÃÿð¿”ÿ~^þ¨=þÛó½*lŸMó~~þÝo»^¿]ßê+ìñþÓà{w„?ÍÇñœZøÞõ…×·ú{ùoÿi>÷?žæc?”}¿âý÷{¬¿üÒú¯yþýóæð©ƒœÿpŸ`Çì{Á”àCÿ§Ñ¿/|mùÿ¾üùºñ©çÿäuIþkù?Jÿ÷ýúMÙÓ1ýöðzήÿÖyý,KýxïÎý·Òü¿ÒxéýõÖmþ‡,ÿA[ÿIñ??¿w÷æß»¾ó÷.?Þ¶ücÿÃþ×2üûöÿqŸ#]ÿûûõÙÅÏ?Íé}û¿6ùŸ·¿îž¿wÿcÓþ¿Cùÿ®õ÷<ùÿÿþ¿oñÿaÿÁÿÐß.ýµý#^·îÈÏO_ÿçóÖÿûñ—Á/Ý?ïÿ½ÿ‘Æÿ´í¯ûøç﬿¼»ÿÍÿ_ëeÿÿ³dÿ£ÿÉÿÒŒ_¸ÿ·ÿÇþ³mÿÿ¶?ù¶ã_­ûŸýzï™ÿT¶ÿóñÏóø}üóõ¾äÿËëç¾û¿Ñöÿ#ðÿØùÏÖóÿˆÿ“ÿwDÿß'÷_÷ýO}ã?äÿ“ÿ?’ý{×þ“æÿkÇñÿ·É¿^ñï¼ón]§Ù;ïÖuš×Õ»uõnY¦yš½[WïÖuš§Ù»uõÎ;ïÖõççï×»eñnY¼[×iöλuæuõn]½[–ižfï–Å»ufï¦yš½+ÛÿVâÿ¯ŸP¡îýÝŸ»÷“—~üÁßþ±|‰åsúz,?ÚñßäÓöw ¿„Oi|úzxþþmðïÞúCúû†ñWõ‡ÎõƒB-©ó}¯Æ#ÿ¤øK×zþ¤óŸªÿ4OéñûýsXŸWþ‡Ø dzßç)¿Œ~|°ÿç)õüð?üo›ÿmãoÝþßêþýë^Á?~ïUO0÷ù6þøùõýúÀ?ãŸ~.è/Í‘Ò_Ûþ/á_ZRÿ§öú×®>Âú—à/]ÿúõ_ÑÿÈ=ù_Š´Éßúøû?ô¿uýýíÒÿ?ñŸ"ý¹Îõ þ—®ÿ:þ½ ¿ÿ;þçøÏ4çò¯Îù“-ñ£ãóåêÍÔÌ_i|¾žÍ]üÏñ£ò¿üRüê¾4þ%¥¿T¾´Í¿düùù5ן¶|·~þù¯[ÿO_þSÿCóüóëßòùoìì‰ýÞÃþ×µtŸ_{þÛìçp~FºþÃþeYZö_uã×ãç¿oLs¯ýüÿDþóG{¬ÿQöÿ¶äŸuÿ.þ?üøÿ,ûÿdö_zýMsºÿùÿçùå¾ýu>ÿõþÇþÇþo·¥üÿLûüÁÿ[ñÿ¬þ×–ÿRýŸ†„YÞ?Aè¯Eÿpþ%®wõ¢a˜Ÿð÷¾¾×²œ?÷.œËØß>ßß_»þ]Œ_ü|©ëËrįü—¿_ßÏÑYòô÷.=ÿþåú›ÒðjñÏÏýÊê?¦ë…y©©?8JýGþÿù×¶þãyë1ÿ©ùÝÏÌ?–åö¿zü™ñÿcÿÏþ¯(ß|]{ý[×Úô³¾þž#ÿûÅÿµã¿Èè?|ì?ì?üÿÐÿóþ/ú_O¯%­ª_ÿS›þÖñ×^ÿRÿ÷>Žô÷{þ|¿ßúû½ëÿwýç2þ©xåßo_ÿÿþ~wá§æ??OiºôðÿKå_É‘z?OŸòÿ·­¿;öòý?ýÛâÏRú#ÿSø—×_?ù¯­ÿ±ÿöäòÿhŸ÷°?ïØÿã¬ÿk{3gö£¿~Û÷ûíÿ¤ú_ÇþGÿëòÿ÷È?©þ×Ùÿ[—è]ÿ_>ÿ¹MþöÌÿ¯×?Rÿúýÿÿ?þüÿô?¢ÿ;øƒ?ýßéÿý¡?ý¿éÿýÿìü«ÝýüÿÛæúÿZ¶ÿ7á½þ“ç~ž¥ñWý?µá[OÿWúÿÞÏ ô<êÒøsüg„õ/ÉÿëÑÿüyù=ç__ûùmÊÿ#?Kôo›ü ÷{wÿ¿ïßÿéÒ¿mþëÇKû_¾{ýiۿضí?üÿÄèÿþàOÿOúÿÐÿ‡þ?ÖúÿÐÿÚ¶ü_ךþõûzõû:÷=ú¿ëÊÿ2þ¥õw5/±< -ŸçSsýkó?òù‡ýo·ÿßÓñÿ¾þߨÿôÿ„ÿíò¿-üÑÿøÿðÿ¡ÿÑÿð?üÿ[ãòáyÏùÎÿ·æOJדvþ'ù_Ð_þ3Ï¿ô;ÿ£ŸÿlýüoKýÿžç?ZêoÕ/×ß"ÿ_³þýç_8ÿÇùö?ìo-¾çüõ,Ÿ¿Æþçü?òÿþ?èoÑÿ‡ýÿC»ô§þŸí÷móßÏÿùÌõßÿ‘êÿµÄ¤ñ¿ê?Iú?õ8ÿ§ëÿ—ÅÏäûÝøŸuûýo;þCý?Ûñì?Ûöñoä?ùvã_mû¿~õ_GèÿJýêÿ“ÿGüßjýMÿŸöþKÚÿY~þ•üòÿÇÈÿo±ÿ¤ùÿ#ÔÿÇÿOÿOËý_6~Þ¯ßcýŽ0gþßæ¿4>¬ÿxÿ|àø¯×P3åøwüýOÁ¯Ç?=>Ô_>Ö‚>ô‡þô?¾nve°¯‚­¸}ï??~ÿùv¿yú&üŸ>ÿÇ×eIÿ^}¯7þ1Ü»ø_=÷5>ð?üÿÛÅû?>ø¥âëGøß:ÞúþïÌ—Ó\÷^:ÿcØÿeüóϯ7­ãϯŸ½>–þ—>ÿóæýüGþëÉ_üè‹úúCüÿå¿$ÿ§þ¾ÿé9ÿꌿ~*ÿü‰?·þƒ¾ -ýSöùa¥øÏõþkÿ/|µÿÊõ©“¿©þ/eù+?Iå¿Þþ·ý¥òï>ü+üãñ¥øßºö]1ýý¿Cñi[ÿýý¦®ß·?ãñûó9ü[áÇãñÿß¡ÿ4§åAûþåý?/ÿÛð¯ßÿ¥ñ¿ž¿Ö¿õøñOìoëöl¿·ÚŸ÷ì-ûGŠû·uþãñäÿ‘ÿÿ“ÿwwÿoEþáÿÆÿ‡ÿÿŸUÿ_û¯Wþ•–ýe—ÿ±ÿÉÿ>ð|ò¿Èÿ…þœÿÕ>ÿ£}þÉúùßû¯}ç_Ûþçüçÿ8ÿÇù?{ù_äÿÛÎÿÇþ'þOüŸø?ñ›ú¯6þY/ÿïá¯ÿçü§UúÿÇþÃÿ ý­Ò?î?±ù…^ïãëÇþß:~žRýsêúo¤Æ_õß¾õù·´þ¥þcéëµü+Óÿþÿ–ç¿ãÿ×~•øzð_~ü?ÿ{ýÿŸYÈ?ô&ü>òKª´å -ÿöçÿäüÁÈ?äðeðµ_µ×ÿñµÖþ|×ü߇ŸŸû¼Ïþ¯ïþSÛþ·§ÿÇâÿçÉ¿§Ï¿]ùÇþo<ÿß'åoý#õÿ ÿÑÿøÿñÿãÿÇÿÿøÀ¾^ü§6ÿè½ðõâ?–ä?ôGÿãÁÿýÿÃÿVýßøÿ­Úÿëz¿®GÿáºÊüñøuÍ—Â_×{þÏ+ü·ùÛ®·Î¸ÿöþŒkúKáÇãÉÿ#ÿ¯¼þ½«}÷µî~zëßzüÿŠ>ñùVý_'ÿ¤ð¯Ç—ô¿uù/íÿ'Õÿ×ýËêôÿûúÿÙØÿJÿšõÿÞþ—mëïnÿCmûûüüÿÄÿ|à“ÿÛÿ‘ÆŸÆÊÿ³žÿKüóÿœåü?û?ÎÿsþŸùÇþ¶uþŸüòÿ°ÿÉÿƒÿÉÿ#ÿÿþ?üèÿo>ÿÿÃÿð¿=þÿùyåcíóŸ¶þ,ÿžÿ•«úüüÿåëú4Ç¿ðÜß®¿>?öù÷_øñøi>Â} -þWðãç£ÚðþÈð§ùÜÿhëOôúwìW´ïsÒcýÇ}“cø¥õ~®øùÃõýg)|Rß+ÍÿÕ¼Ô‡þÚô_×¾ðc8Çþ_ñ|jËyþ·,ÿ9…ÿñz¬Ÿ½»7þÌ_ÞõÉíÁãöÿ;Ò+ׯ>OŸ³}•›ÿO÷ÿKñÌ9üRú#w¿óýG\ÿÒó3õãµõß;žÿIóo]þ±ÿ`ÿoÿÒþ'·_ê³ÿÐÝYßÿi÷?×ßÿ`ÿ·Ò¿‡üÓîüÇÿ‡ÿÿŸUÿöŸuþ‡þ–é_òÏÞ÷?Þóÿjû?ñÈü—︮íÓÆÿ“×¥ñiüOÛþ;ÇŸÒý€®üçåøOþUßÿ¿®-ñ·^öÿˆñ?Kö?úŸü¯;ñêiîÿqÿo)þýgÛþ#þm>ù¶ã_­ûŸzý/ÿéõú«%þ™Ÿ³ÿ½“Ø7Òýßhûÿø_?þo)ÿø¿eÿïˆþ?Ùþk]%þ·;ú§Gü‡üòÿGÊÿ¿kÿIõvüÿüÛóbßø¿wÞy·®Óìwë:ÍÞy·,Þ-Ë4O³wËâÝøëöÿƒÿáøß&þìNøW¼¿ûz÷~RøÒï³ÿ«õ?Ké?ªýï]Ýz’Æ?´×^þ·ö®ïÿ<¶þ/ãßcýë÷Fÿ#ÿÇ’ÿ2ùÛïüŸUÿúߎþ‡þÐÿ?ò¿žþaýÆø]Ïç?ÿYð©ÿh#ÿ÷*ÿrÿýe©¥ëÿÝ?}\ÿ5õ«rç¯[Ï¿÷:ÿ­þ§þ=äO+ü€íø-ÿ/®g¦»þF”ÿ÷Îïßuëõïå¯Ëæ_›ÿ¤øiÏß篿¿þõO¨†ý¯ÝÿgžZ쯻ö¿¶ý#Á_~ù§þý¿àËõ?lË?ëþ_üøÿðÿÙõÿIì¿ýôëÿÂÿØÿÔÿÅÿþàOü‡þOÖú?AüÔÿÅÿGý?›õÿ¬×ÿ•áß{ýËç?Oý_êÿöÜÿÿMð±ÿ±ÿ‰ÿcÿÿGþ×Éÿ¾ñßó¿ñÿA+ñì?øúÛ¤?õÿ¨ÿ8"ý©ùùúíþçöú#ÔÉá_SOîÿ£þõ¿íÕÿAÿSÿ‘úovë¿aÿ!ÿØÿØ–ÿ#Öÿ£þ¹õþ?åý_ŸúçãÙÿÔÿ§þ?õÿ©ÿoIÿäÿûdýÿœÿ«´þúäÿ ÿÑÿøÿñÿãÿÇÿÿiý?OûùÝà]ÍÿYlú'|¶ÿ<=~OÿÔx)ü”þ;Žðÿ—,ÜË÷M>]Éÿ³ü”â¿ÉïyJÁ/ãŸäÿ<¥Ÿ?üiN×?šæsþ9ô‡þcÈ¿ý^2ÿþîoÝýžŽ¿Tþ÷›ÿ;ßë[ÇÇñ©ëËÒÿÀ?iø%|JãS×÷ÏÿÃÿ–ùümÛÿ-ñŸ½ÿnžêÇoþçØÿ£ ¿…þß4^æÿKÇÂçåù×¶ÿeñŸõoG‰ÿÄþþ´<¿?OõããïÏÓHë¿ÿ½ß]ºþãûµÃ¿¿¿ÞCÿ¿‡~½ŸçÓÏoGþïãWýô½üÝëiýëû?mú·Ìýøòük¯¿qìoì?‹öþâ?úKñ¯¡ß]øýèþàoÿ½.Ë¿Oý–ã+ùøL¨Éœ«ÿ|nüñzü÷=üSøÅð0Ï÷Ÿª‰_ÕÀ—Ç¿¤ô—­ÿe‘Îÿ½ç=¿ßúk£¿ÿKíÿö¯fýKëò_»ÿ›¶ü—õK÷óRÓðyõ_{ò?òù‡ý?ŽýßÃþl±ÿŸ¿”þØÿØÿð?ü¯ËÿvñGÿãÿÃÿ‡þ·­ÿáøþ·ÃÿÖóÏùÎÿ·çOJןvþ'ù_Ð_þÏ¿ô<ÿ3Îù?›ç_÷ô:ögOï®é/Íÿ¯?ÿ_ÚݹNþ¯óoéÏkÎÿqþ…óœÿgÿÃþ×ÖxÎÿPÿ‡ó×è?Îÿ#ÿñÿàÿƒþ¶üØð?ô§þ õÿ¬×êWäŽÿó‰ë¿'þ#Õÿ“ÅÚâãÔJã_ò¿÷«ÿ£ãÿ—ÆÏúÙŸ:ñ?âÿèê?Sÿø?öŸEûø7òŸü?»ñ¯–ýßö½¾õ_uúÿPÿŸúÿäÿÿÇÿ«ãÿ§þ¿TÿHã?äÿ“ÿ¯›ÿ/³ÿÚòÿÇ©ÿÿŸþŸÖâÿ¯'zÑcÿö|éëÛëöWø4}½tÿx¼~éþwŸüÁÿ{ñÕ"9Ö?É¿?þ“âþw„W¿4¾ü/ï}øwïý¡¿ýµë>éú¯þu©þÕ±~Z?üuê¿Áÿð?üoëöÿæ‹ùû=ú/¯àÿÖËŸ¸Ýÿ8Þ»ÿíú™þ¯ï÷…ÆÿŸýßžþÓ|îs¥¯â>7RúkÛÿ5ø—ÖßÕ¼ÄöHøü8Ÿšë_»ÿÍë_‚ù÷äþ?èä¿týû¦õ¿gùŸ–ËìÿÐÿèèo—þøÿ‰ÿí®søÿ—Úÿ-ñŸ¸IûùË6ù{o|Þž‘õ‘ÊÿgÆÿîѧ¼ÿ¿;ÿ’ñçç×\Úò½Íÿò‰cûþj|Þÿ¯ùß²ÿ;îg¤ó¯+ÿ[öÇõW3ùýßÓø¯Ÿÿ›ø'ñOìÿ§å¿Ô×O­ËÿÑ´tŸ_{þÉÿ#ÿþ'ÿϪü³îßÅÿ‡ÿÿŸeÿŸÌþë‘ÿ¯ÿ‡ÿ±ÿ±ÿµÎÿ<ýü øƒÿwáÿYý¯-ÿ¥ú? ÿ³¼‚þÐ_‹þÒú_ËrþÜ»t})ïÒõ¬Æ8ÿÒVÿªŸü——ֿ=ÓYòô÷N^ÿ,ðO^-þ¹ñ¹ßóù¯ÿ׬¿×kŠÿ½;ó¿öú׿ÿï‘íõÿ¼ë;ÿ©ùÝϺþMù‡ý¯fücãÿØÿß³ÿ“öO{GÿµO®ëúO›~Ö×ßsä¿ø¿vüùýÇ‚ý‡ý‡ÿúÞÿEÿKÛýéÿjqýÓÿ‡þ?ôÿ±Úÿù‡þ—Õí×ÿW[þ[ïÿ‹ý‡ü³'ÿÿ½ú_·Ùÿã¬iÿ])ýŸÓÿ7½ÿ“êûý¯Ëÿß#ÿ¤ú_gÿo]þ¡ÿuýùüç6ùÛ3ÿ¿^ÿHý?èô?þüÿøÿñÿãÿðÿ÷ã/=ÿÔOþëèëòú£ÿûøê÷£#ùÿ¬û¿°ÿáøÿ7ø“ÿ]ë\×£ÿ±vüUüK~ ý¿i<ùøÿïÆ¿¯üù¥ñWñÿ1Ö?ñÙ{)ýz?ϧŸßŽüë¹§þ¯—¿{ý¿,õÏUŽózôo™ÿúñåù×^ãØßØí?üÿøÿˆÿ‚?ø[ÿKã?mþåqä¿Íü_âìÿ8ÿJü‡ýçÿ9ÿüÃþ·Š?ù?äÿaÿ“ÿÿ“ÿGþþ?üøÿÐÿvÎÁÿð?üo‹ÿ_Oô¢Çÿíù¸Îõóõíuû+|š¾^º<^ -¿tÿ»Ï÷Ýø¿z‘ûŸÜy/]_ÒûKŸÿ>üxþJÿJ÷‡þÏ¢_øšò]žÿ-Ïþùyå3ïÇ_=ÿþþÿào×Kã·ëgüeù¯Rù?Rÿ§Ð¿þºÿUüýþóÿéþ{ß=þWü™Z¥ñûë1ÿë¯iþ‡,ÿA[ÿIñßîœÿmžkçß»¾óßVÿÔ¢üÃþgkýú}ûõøOº¾Jû¥ûû¯üóÞߟ}ïþO»ÿ°þþǺý¯K?ëëï™òÿþ?üßàÿÃþƒÿ¡¿eû_ßÿ¨ ߺý×6ÿýüŸÏ\ÿ}ý¿ÿþï ÿŒÿþ4÷ŠÿHãÚöWþÇùq¤àÇå.þ3–ÿÿ^ü¬ÿþÿ³ñ?âÿèËñŸšøw,¯by&mùo=þýg×þ#þü'ÿÏnüK²ÿ ú_"ÿ¶ý˲ÔÛÿ©øgnüñúñïýßwÿ7Úþÿ“üÿÌügëùÄÿ¿Éÿ«éÿÓßµøŸ–¥Wü‡üòÿGËÿ¿cÿõÈÿ׌ÿâÿo៽­Ý+ÿñ“öÿñù-Çÿ·:’ñëÏÅÏÕ÷JãKŸøÀÿ<ü´ÿÁ»+ùûÞ ¿„Ýþ;ïÿЄý¡¿6ýÏõ§ãúÕáï¶ú××õ§ŸŽÿÓç?½ÿˆ÷oÁï?úà ¿ŒÍþ3·ÿÿáëüoöiøÖ_­ïÿ‚1]:Ï£ÚÿµøiÏ_ùOËß gãëÞõ?®þ—=ÿSæýüQþJþ²ÿCÿ[×ÿÐúãÿ·,ÿmŸÿvþ7ÿÿýð5óÿâ¼¹>ç/Îùé¼¼tþݯRü«.ÿïü;ñ·ñ/Ýó?©ù¯Ï¿LáŸÎÿ ÏËùŸ²þ;Ú¯ë*Û_—îï]_øëÚkÿoAþŸÖñýY^Iè¯-ÿKø–ÖßÕ¼ÔÎçˆë_ûº6ÿ=}þÀßùß~ý?žyþù›ÎÿÖî–¥Ýþ/Íûþ+mÿ§Æçìÿ3ü«óMmöÞþ€ÿµù¿}ÿýŽõ¯½ÿ·&ÿ¨ÿ‰ÿÿþ?»õÚí¿ëOÛþ‚ÿ±ÿmÛÿêëøÀþåÿçà¿OþúC úŸ_ÿ~?y=ŽO]]?âßoüñu;Wêë…ZYûû¿kþïÃÏß¾,ûs3—ô¹ùÚwþC]¯6üãñ¥ÏÏû€+üJë¯vüÕû1Ö¿6ÿ?Oþ=}þ­Ë?»ö¿nüO?þmìÛöÿºågX?ûú°íòwÿy:ÞœõoWÿõ¡¿Tþõ[ñø:üÑ:ñíø/òß:ýÛë¿×Ñÿÿû`ÿaÿáÿ‡þzô±þÔ3ê_i×ß||ëóoiýKýÇÒWÝúÏrü¤þíW‰ÿ¡_ýñ4üø7~þ÷úÿ?³þèŸÑêÿß—_Rý£-ÿSø·?ÿ'çþCþ!ÿ€/ƒ¯ýª½þ¯µöç»æÿ>üüøÜç}ö}÷ŸÚö¿=ý?ÿ?Oþ=}þíÊ?öãùÿ>)ûè©ÿýþÇÿÿÿ?þúøÀ§ÿ;ý_ ?ô§ÿ7ý¿?ÿ¯Ë?탿®ý ÿÃÿ¶ùŸþ¿¶÷ëz_z÷õîý¤ð¥ßß~·Ÿð¾mþÃýK÷ë?Oÿ_ú¿æúχ~AÛú9ÆÖUˆÇ—ùÿ“ë_?é3ÿÚñŸ+úoús»Þªÿ¯å_úùëá§õ<¾¤ÿ­ËÿöþRý_ê_VÒçïîÿgµÿ³6ý§¹ný¿»ÿeÛú«ï¨mÿbÿaÿáÿ'þCÿEàßjÿOúÿÐÿ‡þ?VûÿÐÿÚ¶ü/÷¯Ï¿Jç_›ÿ¤øiÏü‡üCþÿ©ýÿžŒÿ7ö_Äþ§ÿ'üo—ÿ­áþÇÿ‡ÿýþ‡ÿáøßÿ[Ïοpþ]óù“Ûg­ù_ùüoýüOòmÓ]ûÂé¿®GøáþcœïüÏ'óŸ9ÿ{Õÿòx>(U¿¬Gþ®ÿ]ùü¼ÿõüÍógãžÿ·tþóÿœÿgÿÏùÎÿجÿÓ~þ»Nþ†ûïm®qö?Øÿœÿçü?þ?üøÿìùÿ°ÿ8ÿ ýmÒŸúø?F¨C2šÿÍÊ«4þ#ÿ`ÿIû?IÏßRÿï:~¶]o­ÿ]Úÿÿ³bÿ£ÿÉÿ¢þŸÝø?öŸmûø7òŸü?»ñ/iÿÒ>ûÏñúÿPÿŸúÿÔÿ'þo!þ?¢ÿï“õÿ%ú§ÏùWòÿÉÿ×´ûô¯oÕ?Úñ_üÿôÿ´›ÿ±,{únÏwEÿóü1žñŒþøPå\óåx=þû3ðßýüÚð¡?ôוç×yúäõ§ãÿìù—þÊù¿tÿ÷>?üÿ[æð·iÿ?»þ´>ô×­ÿª­õëŽÂÇ×+ù¹ÿÞ~~üþó‘äo?üŸ>ÿèä¿Fýo]ùk}ÿ‡þGÿC»ôÇÿÿ/œïÜÎ'^ÿlƒç³Òã¥ðSù_àOü›ñ¹õÜ+æÞßÏìÇ¿rQ·õ™–Ÿáûõë?7¾NþKãORù¯·ÿíC™ü[–:ø5ñ¿šç=¿ßúKÙÌáþþ×úÿ“ò_Vÿ¡Îþ ÷?Ó?ŸÿÝÿNþ7þŸ˜þ¹õß¶ÿËÑ_[þ·ã_¿ÿÛãó¿öú·#þ‰ý‹ýŸ·Ïkì/©ý¯¿ÿ—â/Ýÿ÷›ÿôü’ÿGþüOþß}ú|»üÃÿÿÿþ?‹þ¿~öŸôü‰vü×.ÿcÿsþ‡ñŒg<çÿÉÿâü?ô·˜ÿ­sþdœø—Mÿßýs{åÔ÷äùÇ:ö?ùÿœÿãüçÿˆÿ“ÿo9ÿûŸø?ñâÿÄÿmë¿Rü³E~Õŵãÿœÿ´JâÿØøÿ¡¿Uÿ¿vÿMøÛøðY 3¾þ]ã­Ï¿õõ/õ?ïãHû~4.ÇëñçyùU¦ß»ýÿWxôôÿÿý–ç¯4ÏòùoóHù¯þþéß÷úoÞ¿þèmúKâÏÒùGþkõƒÿÈ?Æk¯ûsœõ/ý•ÒOç·ßþOªÿuìô¿.ÿü{úüÛ”è]ÿŸ¶üí§¤þô?úÿ?þüÿøÿñøÀÿ¤þ׉ÿŒ`aÿAü6ýÿÖýÚûÿ~û¯wÔŸ€ÿáÿïçð·mÿ¯ëqüöÙë}|ýÿêùsã×5?^ -?ÿ÷›…ÿ6ÛõÖù÷ßÞÿƒqM)üx|‹ý½ç§ãõ£ý_CÿÒühÿKŸÿ“ó'ø¥îýÝ׺ûé­ÿV¼úÒOïõŠ>ót>OߢÿëäŸþõø’þ·.ÿ¯úÿç³]~•ôÿUÿ³Zý=¾NþZßÿJÿšõߣÿݺö]Þåç/Üo ûû϶ý‡ÿÿð|Îÿ[ËÿµžÿGüý¯mŽ8Þzþû?;û?øùÇþ¶Ÿüòÿ°ÿÉÿƒÿÉÿ#ÿÿþ?üèÎÿÃÿð?üÿ½üÿóóÊÇÚç?mýY^ ¶Ï¦yïßüw¿×õi>Žá¹¿]ßú“„þ/¯ï÷…×·ú ûùïòÏFµáü‘áoýŽBÿâПhë‡úû÷XÿǾÉgø¥õ~®øùÃõýg)|Rß+ÍÿÕ¼Ô‡þÚô_×¾ðc8áþ©ùÔ–ÿòüoYþs -ÿãõX?{woü™¿¼ë“ÿÚƒÿôû¿Ÿ×ÿÑžNÓ/OŸ³}•›ÿ\ÿ½üÓýÿÿûo¥ù?æ‡~)ý‘»ßùþ#®éù™úñÚúïÏÿ¤ù·.ÿذÿ·Œiÿ“Û/õÙèïÿ®íÿsÿá6ù»ßÿÄýŸGØÿ`ÿ·Ò¿‡üËÿm[÷Îÿ"ÿñÿáÿÃÿgÕÿ‡ýgÿ¡¿eú—ü³÷ý÷ü¿ÚþOü2ÿå;®kûß´ñÿäuiüGÿÓ¶ÿÎñ§T>Úµÿ¼ÿÉ¿êûÿ×µ%þÖËþ1þgÉþGÿ“ÿu'^=Í}ãÿ#îÿ-Åÿ±ÿlÛÄ¿mÃ'ÿÏvü«uÿS¯ÿïå?½^_xµÄ?Óãsö¿wûFºÿmÿ?ÿëÇÿ-åÿÿ·ìÿÑÿ'Û­«ÄÿvGÿôˆÿÿOþÿHùÿwí?©þÑŽ¿âÿ¯‘{^ìÿ÷Î;ïÖuš½ón]§Ù;ï–Å»e™æiönY¼›§ižfïÖÕ;ï¼[ןŸ¿_ï–Å»eñn]§Ù;ïÖuš½ónY¼[–ižfï–Å»ufï¦yš½+ÛÿVâÿ[¿¿ßcÿ­?Ñë'¼?~ïUO ÷ù6þøùõýúÀÇÿü¤Ÿ üÁß6þÒýÿÒþ§„ÿ»Ïÿ´Á¯ßÿAè¯MÍþ‡OÇ¿Çú·ÿcÙÿÖÝþð?üÿÛÄŸýÏ ÿŠ÷w_ïÞO -_ú}öµþg)ýGµÿ½«[OÒø‡öúÏËÿÖþÃõýŸÇÖÿeü{¬ýþÏèäÿXò_&ûÿ³êÿCÿÛÑÿÐúãÿGþ×Ó?¬ß¿«ñùüGà? >õmäÿ^å_î¿¿,õñ£tý¿ûç¯ë¿¦~Uîüuëù÷^ç¿õÏÿ´Ó¿‡üi…ð¯¿åÿÅõÌt×߈òÿÞùýï»n½þã½üuÙükóŸ?íùûüõ÷×ÿ þ õϰÿµûÿÌS‹ýu×þ×¶$økÃï1ÿÔÿ¢ÿüo¹þ‡mùgÝÿ‹ÿÿþ?»þ?‰ý×£ÿ~ý_øûŸú¿øÀü‰ÿÐÿÉZÿ'èÿú¿øÿ¨ÿg³þŸõú¿2ü{¯ùüÇã©ÿKýßžûòï¿ >ö?ö?ñìâÿÈÿ:ùß7þ;bþ7þ?èo%þýÿC›ô§þõG¤?õ/?_ÿ¯ÝÿÜ^ÿo„ú/9ükêïÉýÿcÔÿ£þ·½ú?èê?RÿÍný7ì?äûÛòÄúßcÔ?·Þÿ§¼ÿëSÿ|<ûŸúÿÔÿ§þ?õÿ-éÿ‘üŸ¬ÿŸó•Ö_Ÿüô?úÿ?þüÿøÿ?­ÿçi?¿¼«ù?ëMÿ„ÏöŸ§ÇïéŸ/…ŸÒÇ1àþàÿ’…{ù¾É§+ù–ŸRü7ù=O)øeüóãƒüŸ§ôóçñoƒ?ÍéúGÓ|Î?‡þÐ ù·ßKæßßý­»ßÓñ—Êÿ~óçûaýoëø8>u}Yúáø' ¿„Oi|êúþùáøß2ÿƒ¿mû¿%þ³÷ßÍSýøÍÿû4á·Ðÿ›ÆËüéøCø¼<ÿÚö¿,þÓ£þí(ñŸØßŸ–§ñ÷ç©~|üýyiý×ã¿÷»K×|¿vø×ã÷×{èÿ÷Я÷ó|úùíÈÿ}üªŸþ¯—¿{ý/­ÿ`}ÿ§Mÿ–ù¯_žíõ7ŽýýgÑþÃÿOüGB)þ5ô» ¿ýÁü­à¿×eù÷©ßr|%Ÿ 5™sõŸ¯ñÏ?^ÿ¾‡ -¿þæñùãþS5ñ«øòø—”þ²õ¿,Òù¿÷¼çï÷[mô×á©ýßÃþÕ¬i]þk÷Ó–ÿ²þoéþa^jú>¯þkOþGþ!ÿ°ÿDZÿ{ØŸ-öÿóñ—Òûûþ‡ÿuùß.þèüøÿÐÿ¶õ?üÿÃÿvøßzþ#ã9ÿÏùÿöüIéúÓÎÿ$ÿ úkÂâù—žçÆ9ÿgóüëž^ÇþìéýÁ5ý¥ùÿõçÿKû£;×Éÿïuþ-ýyÍù¿1οpþóÿìØÿÚÏùêÿpþýÇùä?þüÐß–ÿûþ‡þÔ¡þŸõúOýêÜñ>qý÷Ĥú²øO[üoœúOiüKþ÷~õtüÿÒøY?ûS'þGüýOýgêÿÿÇþ³hÿÿFþ“ÿg7þÕ²ÿÛ¾×·þ«NÿêÿSÿŸü?âÿøuüãÔÿ—êiü‡üòÿuóÿeö_[þÿ8õÿñÿÓÿÓZüÿõDÛS‡çßøƒë\çúw_—þ{7üw?¿6|èýµè_g¿”ò'ÛÇ?ÿ§Ï]ýªëúiýð/ÁßóÃÿð?üoëöÿæ¯úû=ú¯®ÆÿÖËŸ¸]/ß®úÇ}kBŸšÔ¿Ô÷¤ó¯©kð/­¿«yIÁI}®Íçþ3Þ]É϶þ7×ýgFXÿüŸ>ÿè俦ü×–¿ìÿÐÿÖõ?ô·KüÿÄ^¹Çü‡-?!}½÷ýãñRø¥ûƒ?ö/×Óç'KýORýsÚóŸÒ1ôG©Yÿ¥ñyý/‹?Éíüÿíô—Ê?íþOéõ"]Ó|ïþzòËÅ<Ú×ðÛìÏpÿ3ýSö¯þüÿ¹ýÿ1=·^Ûö×ô×—ÿeüK민ÿÛçŸçSsý[¿ÿÄ>Æþ×ë¬oÿÈðïgÿjö%ÿÏvþŸuþ·žÿgWþY÷ÿâÿÃÿ‡ÿϲÿOf?õПºñøûŸó?O=ÂxÆ3^Oþþ»Ÿ_>ô‡þôÿ_Ý«èõª¾R\ÿ+œ?Éß×_ãüËu}¨ºëRúIá·]¿¢ÿ²¤¯¾'ÿÒo ¿Ößóú{½¦ù¿fý¥Ç‡øÿ‘ÿµ×¿6ÿü{úüÛ”Øÿšñ¿1âßÖñÇþ·½ÿ“Ô­¯¯ZªÏª»þ-ë¿>ô—Ê¿~ë¯_ý_{úï³ñíø/òúßÿ…þñüíóÿ±ÿ°ÿðÿCMÿ×ßo¾Uø»­ÿe©ÿ˜&üšþ¥þ‘Oo}þ­¯©ÿ¹¦ÿO©ÿ̵ü*ÓïÝþÿ+{½¯á_=nüºæÇKáÇãÿ~óã¯ðßæo»Þ:ÿáþûžK×ô—ÂÇ·Øß{~:^?Úÿ5ô/Íÿˆö¿ôù?9Òñ_êÞß}­»ŸÞúoÅ«/ýô^¯è3Oçóô-ú¿NþIá_/éëòÿØÿl¯?S×ï˯’þåç]ý=¾NþZßÿJÿšõŸšÿÔù÷Üü¯kßõç]~þÂýư±ÿlÛøÿñÿøÀçü¿µü_ëùÄÿÐÿÚöçˆã­ç±ÿ³³ÿƒÿ˜ìoëðÉÿ!ÿûŸü?øŸü?òÿðÿáÿÃÿ‡þçü?üÿÃÿßËÿ??¯|¬}þÓÖŸåU±`ûlš÷þÍ÷{]ŸæãøžûñÛõ­?Ièÿòú~_øñøp}«Ï°Ÿð÷.ÿüaTþÀþÖï(ô/ý‰¶~H¡_ѱÏqõì›|†_Zÿç犟?\ß–Â'õ½Òü_ÍK-|è¯Mÿuí ?†Omù/Ïÿ–å?§ð?^õ³w÷ÆŸùË»>ù¯=øO¿ÿûyýíé4ý÷ðòô9ÛW¹ùÏõß«Á?Ýÿ/ðß±ÿVšÿc~Èá—Ò¹ûï?âú—žŸ©¯­ÿÞñüOšëòýûËø—ö?¹ýRŸý‡îþËúþïÚþ?÷n“¿ûýOÜÿy„ýö+ý{È¿Üùß¶õwïü/òÿþ?üVýØÖùú[¦É?{ßÿxÏÿ«íÿÄÿ!ó_¾ãº¶ÿMÿO^—Ƥñ?mûïJå£]ûÏËñŸü«¾ÿ][âo½ìÿã–ìô?ù_wâÕÓÜ7þ?âþßRüû϶ýGüÛ6|òÿlÇ¿Z÷?õúÿ^þÓëõ…WKü3=>gÿ{'±o¤û¿Ñöÿ#ð¿~üßRþñËþßý²ý׺JüowôOøùÿäÿ”ÿ×þ“êíø+þÿù·çžñï¼ón]§Ù;ïÖuš½ónY¼[–ižfï–Å»yšæiön]½óλuýùùûõnY¼[ïÖuš½ón]§Ù;ï–Å»e™æiönY¼[×iönš§Ù»²ýo%þÏ?üØý‰åK,J×ß ÿÝϯ úCÍŸ}m¥ÔçñßçúA²ñOÇÿéó¿¯ïµ_ŸWþ‡Ø Ç?ÿÝÏÿÃÿ¶ùß6þÖ¶zñkí÷KŸÇ×GƒoýGê’ο¶þ-á_ZRÿ›öú×®?:Âú—àÿôùGÿ#ÿ5å¿¶üeÿ‡þ·®ÿ¡¿]úãÿ'þ³Ï/ŒóÓ×ïÎoéþñx)üÒýï>ß·ãÏu«×Co”c½§«üËsþTMüe?þXÿ/]eæúüg -¿ÒøÜ¿ðü§sÎ[>~$ù'_õßN©üKÏþþ¹ñÇëñóçêµ­¿i¾w=ùoýüò_·þŸ¾ü§þ‡fþñëßòùoìcìÿؾʿl³?óö¿®ý#ÿŸý;Oýæ?uþµ´(í®ígùúkßõxþÒ¿~Òð¿6ÿ¿/ôÝðûïÿmÉ?ëþ_üøÿðÿYöÿÉì§úSÓþ‚ÿ±ÿ±ÿÕ×ãÏøÊÿÏÁ÷ókÇþÐ_ƒþç:W¯×í\E¸Ø+îëK…úKùñûÏ—enE·þ]Œ_ü|õ×¥ô“Âo»~EÿeIÿ^}O:ÿ¥ß~­¿úõÇôë?jòÿ÷È¿§Ï¿Mù‡ý¯ÿ#þmìÛû¿/ 6áký¤¯ß•¯¥û°þ-ë¿>ô—Ê¿~ë/½¾Jø£ÿ>ÿ׎ÿ"ÿ¡ÿ=ü[èÏß>ÿûûÿ?ô×ôiÖŸzvý«ç·>ÿÖ׿Ôÿ¼#ýýž?¯ÇŸëÖ.ã…GOÿÿßoyþJó,Ÿÿ6ÿA¿úã¥û§ßë¿yÿúCþ¡ÿµé/‰?KçùŸÂ¿¼þúÉøù‡üc¼Öú×±?ÇYÿÒ_)ýt~ûíÿ¤ú_ÇþGÿëòÿ÷È¿§Ï¿Mù‡þ×õÿiËß~úGêÿAÿ£ÿñÿãÿÇÿÿŸþGüðÃÏgúÐÿÅvÿèOÿoúÛìÿ-³_åøëÚßð?üo›ÿéÿkùçï7ôÿ þÃíwû ïÛúO†û—î×~<þºÿe|ÿº÷wîÞO -¿þûô¥ÿïö»çŸíüàþ;íñ‡pÿ}ϱQÖ¿$þÒgþµóŸ}·ù»¢›þ¼¦gZ×ï_ÒÿÖå{ÿ?©þ/õ?+éÿw÷ÿûþýŸ.ýKõëKëùÝý/ÛÖ_}ÿCmûû϶ý‡ÿŸøý¹ÎuËý?éÿCÿúÿØìÿCÿkÛò?®[Ÿê_?͹>÷ÒùוÿeüKëïj^RpRŸÃÈ?ä×-öÿ{:þßÓûŸþŸð¿]þ·‰?úÿþ?ô?úþ‡ÿáküo=ÿüùáüÈïLçOÆ×ïæ/]¯gíüOò¿ ÿ6øwï¯}þEïü~þ³õó¿þûü÷«þsqýùù|ÿºòùiÿ;òÿ5ÏŸpþ…óœÿ·ýÃþß*þœÿ¡þäüwüÇtþ™ú?œÿ·.ÿñÿáÿÃÿgÑÿ‡ýÿC»ô§þŸmûO»þÈë_ÿ‘êÿµÄ¤ñ¿ê?Iú?õ8ÿ§ëÿßz:íÓ+ú·ÕÿÎíÿuãÖíô¿íêÿÙŽÿcÿÙ¶ÿøAþ“ÿg7þUÚÿÄös[þ_nþõû¿RÿŸúÿÔÿ'þoÑÿ«íÿÓ®ÿ/Õ?òó¯äÿ“ÿ¯ÿßnÿIõÏõÿñÿÓÿÓjüÿ¿ñ£# \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_0_167_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_167_states.bin.bz2 new file mode 100644 index 000000000..bb2c8cc48 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_167_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_167_states.bin.z b/client/resources/hardnested_tables/bitflip_0_167_states.bin.z deleted file mode 100644 index 8aae9133c..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_167_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_169_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_169_states.bin.bz2 new file mode 100644 index 000000000..bbec52e26 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_169_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_169_states.bin.z b/client/resources/hardnested_tables/bitflip_0_169_states.bin.z deleted file mode 100644 index a42857b5a..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_169_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_16b_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_16b_states.bin.bz2 new file mode 100644 index 000000000..0a34da2f6 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_16b_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_16b_states.bin.z b/client/resources/hardnested_tables/bitflip_0_16b_states.bin.z deleted file mode 100644 index 426210add..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_16b_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_16d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_16d_states.bin.bz2 new file mode 100644 index 000000000..c6758b6a2 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_16d_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_16d_states.bin.z b/client/resources/hardnested_tables/bitflip_0_16d_states.bin.z deleted file mode 100644 index 5640076fd..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_16d_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_16f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_16f_states.bin.bz2 new file mode 100644 index 000000000..fe936f3bf Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_16f_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_16f_states.bin.z b/client/resources/hardnested_tables/bitflip_0_16f_states.bin.z deleted file mode 100644 index 39d0d0801..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_16f_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_170_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_170_states.bin.bz2 new file mode 100644 index 000000000..5180aae93 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_170_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_170_states.bin.z b/client/resources/hardnested_tables/bitflip_0_170_states.bin.z deleted file mode 100644 index f49f4d249..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_170_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_174_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_174_states.bin.bz2 new file mode 100644 index 000000000..00e4f95b4 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_174_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_174_states.bin.z b/client/resources/hardnested_tables/bitflip_0_174_states.bin.z deleted file mode 100644 index 66acfea97..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_174_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_17c_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_17c_states.bin.bz2 new file mode 100644 index 000000000..01c02bb2b Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_17c_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_17c_states.bin.z b/client/resources/hardnested_tables/bitflip_0_17c_states.bin.z deleted file mode 100644 index c8f72c15f..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_17c_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_184_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_184_states.bin.bz2 new file mode 100644 index 000000000..5da967674 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_184_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_184_states.bin.z b/client/resources/hardnested_tables/bitflip_0_184_states.bin.z deleted file mode 100644 index caa5e8bd4..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_184_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_18c_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_18c_states.bin.bz2 new file mode 100644 index 000000000..88f05ef65 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_18c_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_18c_states.bin.z b/client/resources/hardnested_tables/bitflip_0_18c_states.bin.z deleted file mode 100644 index da5c55a2d..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_18c_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_191_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_191_states.bin.bz2 new file mode 100644 index 000000000..7303065d9 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_191_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_191_states.bin.z b/client/resources/hardnested_tables/bitflip_0_191_states.bin.z deleted file mode 100644 index 5a4b9aef1..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_191_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_193_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_193_states.bin.bz2 new file mode 100644 index 000000000..b9e3297c5 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_193_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_193_states.bin.z b/client/resources/hardnested_tables/bitflip_0_193_states.bin.z deleted file mode 100644 index 5f7e0b484..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_193_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_195_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_195_states.bin.bz2 new file mode 100644 index 000000000..fa5060af8 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_195_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_195_states.bin.z b/client/resources/hardnested_tables/bitflip_0_195_states.bin.z deleted file mode 100644 index e15df41f5..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_195_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_197_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_197_states.bin.bz2 new file mode 100644 index 000000000..5de558643 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_197_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_197_states.bin.z b/client/resources/hardnested_tables/bitflip_0_197_states.bin.z deleted file mode 100644 index d4b5fd31c..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_197_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_199_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_199_states.bin.bz2 new file mode 100644 index 000000000..c4f58b53d Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_199_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_199_states.bin.z b/client/resources/hardnested_tables/bitflip_0_199_states.bin.z deleted file mode 100644 index 9117c86da..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_199_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_19b_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_19b_states.bin.bz2 new file mode 100644 index 000000000..9ad820f8c Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_19b_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_19b_states.bin.z b/client/resources/hardnested_tables/bitflip_0_19b_states.bin.z deleted file mode 100644 index ae144de8c..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_19b_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_19d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_19d_states.bin.bz2 new file mode 100644 index 000000000..54371d652 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_19d_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_19d_states.bin.z b/client/resources/hardnested_tables/bitflip_0_19d_states.bin.z deleted file mode 100644 index 1b7f08b3d..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_19d_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_19f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_19f_states.bin.bz2 new file mode 100644 index 000000000..b4a434889 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_19f_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_19f_states.bin.z b/client/resources/hardnested_tables/bitflip_0_19f_states.bin.z deleted file mode 100644 index 81ef023c3..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_19f_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1a4_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1a4_states.bin.bz2 new file mode 100644 index 000000000..ca79aa9b0 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1a4_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1a4_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1a4_states.bin.z deleted file mode 100644 index af0f72086..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1a4_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1ac_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1ac_states.bin.bz2 new file mode 100644 index 000000000..944d52e07 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1ac_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1ac_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1ac_states.bin.z deleted file mode 100644 index 5b2ddbf57..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1ac_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1b1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1b1_states.bin.bz2 new file mode 100644 index 000000000..860f486bf Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1b1_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1b1_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1b1_states.bin.z deleted file mode 100644 index 61ce91072..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1b1_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1b3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1b3_states.bin.bz2 new file mode 100644 index 000000000..8afe0ffb9 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1b3_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1b3_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1b3_states.bin.z deleted file mode 100644 index 3825cf8b8..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1b3_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1b5_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1b5_states.bin.bz2 new file mode 100644 index 000000000..804b581f8 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1b5_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1b5_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1b5_states.bin.z deleted file mode 100644 index 7750ad78f..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1b5_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1b7_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1b7_states.bin.bz2 new file mode 100644 index 000000000..8d541ff7d Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1b7_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1b7_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1b7_states.bin.z deleted file mode 100644 index 1663d7a5e..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1b7_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1b9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1b9_states.bin.bz2 new file mode 100644 index 000000000..42269c116 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1b9_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1b9_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1b9_states.bin.z deleted file mode 100644 index f6b102d9a..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1b9_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1bb_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1bb_states.bin.bz2 new file mode 100644 index 000000000..f1f353e41 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1bb_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1bb_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1bb_states.bin.z deleted file mode 100644 index 0e6675818..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1bb_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1bd_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1bd_states.bin.bz2 new file mode 100644 index 000000000..ce30db7be Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1bd_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1bd_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1bd_states.bin.z deleted file mode 100644 index 8e991fcba..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1bd_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1bf_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1bf_states.bin.bz2 new file mode 100644 index 000000000..43164354d Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1bf_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1bf_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1bf_states.bin.z deleted file mode 100644 index 9fe373bd8..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1bf_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1c1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1c1_states.bin.bz2 new file mode 100644 index 000000000..a805bf22a Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1c1_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1c1_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1c1_states.bin.z deleted file mode 100644 index 1d6e2df38..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1c1_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1c3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1c3_states.bin.bz2 new file mode 100644 index 000000000..5ef2b8efa Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1c3_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1c3_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1c3_states.bin.z deleted file mode 100644 index c47845644..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1c3_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1c5_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1c5_states.bin.bz2 new file mode 100644 index 000000000..abc9ef501 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1c5_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1c5_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1c5_states.bin.z deleted file mode 100644 index fd67e955c..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1c5_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1c9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1c9_states.bin.bz2 new file mode 100644 index 000000000..6d8d002e6 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1c9_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1c9_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1c9_states.bin.z deleted file mode 100644 index 88ab2a968..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1c9_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1cb_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1cb_states.bin.bz2 new file mode 100644 index 000000000..e9caa94a6 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1cb_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1cb_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1cb_states.bin.z deleted file mode 100644 index 31bd47cc6..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1cb_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1d0_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1d0_states.bin.bz2 new file mode 100644 index 000000000..26a43e303 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1d0_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1d0_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1d0_states.bin.z deleted file mode 100644 index 8ac5e4099..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1d0_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1d4_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1d4_states.bin.bz2 new file mode 100644 index 000000000..15911b954 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1d4_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1d4_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1d4_states.bin.z deleted file mode 100644 index ad91ddea9..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1d4_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1dc_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1dc_states.bin.bz2 new file mode 100644 index 000000000..ab5149491 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1dc_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1dc_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1dc_states.bin.z deleted file mode 100644 index f5b1dbb10..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1dc_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1e1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1e1_states.bin.bz2 new file mode 100644 index 000000000..7e4c4e5a8 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1e1_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1e1_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1e1_states.bin.z deleted file mode 100644 index d475d9778..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1e1_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1e3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1e3_states.bin.bz2 new file mode 100644 index 000000000..887da78ed Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1e3_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1e3_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1e3_states.bin.z deleted file mode 100644 index 64884ba56..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1e3_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1e5_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1e5_states.bin.bz2 new file mode 100644 index 000000000..43b2cee21 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1e5_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1e5_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1e5_states.bin.z deleted file mode 100644 index cd80ef830..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1e5_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1e7_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1e7_states.bin.bz2 new file mode 100644 index 000000000..89ebe72a9 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1e7_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1e7_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1e7_states.bin.z deleted file mode 100644 index 42483bdd5..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1e7_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1e9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1e9_states.bin.bz2 new file mode 100644 index 000000000..64ab8f4ce Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1e9_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1e9_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1e9_states.bin.z deleted file mode 100644 index d133b27a2..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1e9_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1eb_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1eb_states.bin.bz2 new file mode 100644 index 000000000..d76993719 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1eb_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1eb_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1eb_states.bin.z deleted file mode 100644 index 7a3b347bb..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1eb_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1ed_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1ed_states.bin.bz2 new file mode 100644 index 000000000..8574c08f7 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1ed_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1ed_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1ed_states.bin.z deleted file mode 100644 index db5d216aa..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1ed_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1ef_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1ef_states.bin.bz2 new file mode 100644 index 000000000..7a9012f47 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1ef_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1ef_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1ef_states.bin.z deleted file mode 100644 index 15eeba048..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1ef_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1f0_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1f0_states.bin.bz2 new file mode 100644 index 000000000..058cbfd82 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1f0_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1f0_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1f0_states.bin.z deleted file mode 100644 index fb3df75b7..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1f0_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1f4_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1f4_states.bin.bz2 new file mode 100644 index 000000000..69262a53f Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1f4_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1f4_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1f4_states.bin.z deleted file mode 100644 index fe2d56c90..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1f4_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_1fc_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_1fc_states.bin.bz2 new file mode 100644 index 000000000..c3d550787 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_1fc_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_1fc_states.bin.z b/client/resources/hardnested_tables/bitflip_0_1fc_states.bin.z deleted file mode 100644 index 791352bfd..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_1fc_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_210_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_210_states.bin.bz2 new file mode 100644 index 000000000..fe85775bf Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_210_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_210_states.bin.z b/client/resources/hardnested_tables/bitflip_0_210_states.bin.z deleted file mode 100644 index 479bacb03..000000000 --- a/client/resources/hardnested_tables/bitflip_0_210_states.bin.z +++ /dev/null @@ -1 +0,0 @@ -xÚíÛMnãF„aÝÀWÑtï½Ñ‰|5o}4¢Á–L‰”«êg‚ ™ÌObOj¾ªz»ߟ‡óð1$Ž_¦¿Ÿ¾ÌÝþíKß¿þrùýÒßþãKþý->É··øõ¯Þ¥/÷~ýÒÏ»ÿþ}þÿK?ÏþüÓÿkëÿxzûIþ,×ñtûã_ú~[þùû–׿¿ûïÿüõúŸ¯ý÷?þãÛ~þžýùO}Ö¾}ïÏúñ¥ÿþôó—~;ý÷­ÿ÷¯ìñçœÿnæ¿nûör‡ê¯×ÿ¼|ßóð¿ýõÖ_úïO?é··øõŸ>®ÛþãÞ¯_úùOÿØûÿ¿ôó—þøCøeþ9ÊÏwùó®}{ù}¨þzýÏÇaúúôñ<ú㯿ÞúãKÿýéç¯Å·Ó¿úwÿû¾ÿéïÿÅK–ßIÆß§§¿nûý;ýý7ý²÷ýI?é—ÿûÎÿúÿ¾ûú×ÿéÿôü¿þOþï/ÿãÿø¿ûÿóÿü?ýóÿü?ÿÏÿãÿø?þOÿò¿ü/ÿóÿ¯ëÿÝ÷ßýçÿé¿Oý{ÿ×÷û?þßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñüÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿOÿöÿî¿ý¿þßþ_þ·ÿ×ÿÛÿÓ¿þOÿ§ÿãÿõò¿÷ÿø?þïþãÿü?ÿOÿü?ÿÏÿóÿø?þÿÓ¿ü/ÿËÿü¿ý¿ûïþ»ÿü?ýÛÿ{ÿgÿÏÿÛÿ{ÿgÿOÿò¿üÿãÿø?ýãÿø?þ¯ÿÓÿéÿôÿôoÿïþÛÿëÿíÿåûý¿ý?ýëÿôú?þ_ÿ'ÿ{ÿÿãÿî?þÏÿóÿôÏÿóÿü?ÿÿãÿø?ýËÿò¿üÏÿÛÿ»ÿî¿ûÏÿÓ¿ý¿÷öÿü¿ý¿÷öÿô/ÿËÿø?þÿÓ?þÿãÿú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ý?ýÛÿ»ÿöÿúûùßþ_ÿoÿOÿú?ýŸþÿ×ÿÉÿÞÿãÿø¿ûÿóÿü?ýóÿü?ÿÏÿãÿø?þOÿò¿ü/ÿóÿöÿî¿ûïþóÿôoÿïýŸý?ÿoÿïýŸý?ýËÿò?þÿãÿôÿãÿø¿þOÿ§ÿÓÿÓ¿ý¿ûoÿ¯ÿ·ÿ—ÿíÿõÿöÿô¯ÿÓÿéÿøýŸüïý?þÿ»ÿø?ÿÏÿÓ?ÿÏÿóÿü?þÿãÿô/ÿËÿò?ÿoÿïþ»ÿî?ÿOÿöÿÞÿÙÿóÿöÿÞÿÙÿÓ¿ü/ÿãÿø?þOÿø?þÿëÿôú?ú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúû÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§ûûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûûùßþ_ÿoÿOÿú?ýŸþÿ×ÿÉÿÞÿãÿø¿ûÿóÿü?ýóÿü?ÿÏÿãÿø?þOÿò¿ü/ÿóÿöÿî¿ûïþóÿôoÿïýŸý?ÿoÿïýŸý?ýËÿò?þÿãÿôÿãÿø¿þOÿ§ÿÓÿÓ¿ý¿ûoÿ¯ÿ·ÿ—ÿíÿõÿöÿô¯ÿÓÿéÿøýŸüïý?þÿ»ÿø?ÿÏÿÓ?ÿÏÿóÿü?þÿãÿô/ÿËÿò?ÿoÿïþ»ÿî?ÿOÿöÿÞÿÙÿóÿöÿÞÿÙÿÓ¿ü/ÿãÿø?þOÿø?þÿëÿôú?ý?ýÛÿ»ÿöÿúùßþ_ÿoÿOÿú?ýŸþÿ×ÿÉÿÞÿãÿø¿ûÿóÿü?ýóÿü?ÿÏÿãÿø?þOÿò¿ü/ÿóÿöÿî¿ûïþóÿôoÿïýŸý?ÿoÿïýŸý?ýËÿò?þÿãÿôÿãÿø¿þOÿ§ÿÓÿÓ¿ý¿ûoÿ¯ÿ·ÿ—ÿíÿõÿöÿô¯ÿÓÿéÿøýŸüïý?þÿ»ÿø?ÿÏÿÓ?ÿÏÿóÿü?þÿãÿô/ÿËÿò?ÿoÿïþ»ÿî?ÿOÿöÿÞÿÙÿóÿöÿÞÿÙÿÓ¿ü/ÿãÿø?þOÿø?þÿëÿôú?ý?ýÛÿ»ÿöÿúûûý¿ý?ýëÿôú?þ_ÿ'ÿ{ÿÿãÿî?þÏÿóÿôÏÿóÿü?ÿÿãÿø?ýËÿò¿üÏÿÛÿ»ÿî¿ûÏÿÓ¿ý¿÷öÿü¿ý¿÷öÿô/ÿËÿø?þÿÓ?þÿãÿú?ýŸþOÿOÿöÿî¿ý¿þßþ_þ·ÿ×ÿÛÿÓ¿þOÿ§ÿãÿõò¿÷ÿø?þïþãÿü?ÿOÿü?ÿÏÿóÿø?þÿÓ¿ü/ÿËÿü¿ý¿ûïþ»ÿü?ýÛÿ{ÿgÿÏÿÛÿ{ÿgÿOÿò¿üÿãÿø?ýãÿø?þ¯ÿÓÿéÿôÿôoÿïþÛÿëÿíÿåý¿ý?ýëÿôú?þ_ÿ'ÿ{ÿÿãÿî?þÏÿóÿôÏÿóÿü?ÿÿãÿø?ýËÿò¿üÏÿÛÿ»ÿî¿ûÏÿÓ¿ý¿÷öÿü¿ý¿÷öÿô/ÿËÿø?þÿÓ?þÿãÿú?ýŸþOÿOÿöÿî¿ý¿þßþ_þ·ÿ×ÿÛÿÓ¿þOÿ§ÿãÿõò¿÷ÿø?þïþãÿü?ÿOÿü?ÿÏÿóÿø?þÿÓ¿ü/ÿËÿü¿ý¿ûïþ»ÿü?ýÛÿ{ÿgÿÏÿÛÿ{ÿgÿOÿò¿üÿãÿø?ýãÿø?þ¯ÿÓÿéÿôÿôoÿïþÛÿëÿíÿåûûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþÿ×ÿÉÿÞÿãÿø¿ûÿóÿü?ýóÿü?ÿÏÿãÿø?þOÿò¿ü/ÿóÿöÿî¿ûïþóÿôoÿïýŸý?ÿoÿïýŸý?ýËÿò?þÿãÿôÿãÿø¿þOÿ§ÿÓÿÓ¿ý¿ûoÿ¯ÿ·ÿ—ÿíÿõÿöÿô¯ÿÓÿéÿøýŸüïý?þÿ»ÿø?ÿÏÿÓ?ÿÏÿóÿü?þÿãÿô/ÿËÿò?ÿoÿïþ»ÿî?ÿOÿöÿÞÿÙÿóÿöÿÞÿÙÿÓ¿ü/ÿãÿø?þOÿø?þÿëÿôú?ý?ýÛÿ»ÿöÿúûùßþ_ÿoÿOÿú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?þ_ÿ'ÿ{ÿÿãÿî?þÏÿóÿôÏÿóÿü?ÿÿãÿø?ýËÿò¿üÏÿÛÿ»ÿî¿ûÏÿÓ¿ý¿÷öÿü¿ý¿÷öÿô/ÿËÿø?þÿÓ?þÿãÿú?ýŸþOÿOÿöÿî¿ý¿þßþ_þ·ÿ×ÿÛÿÓ¿þOÿ§ÿãÿõò¿÷ÿø?þïþãÿü?ÿOÿü?ÿÏÿóÿø?þÿÓ¿ü/ÿËÿü¿ý¿ûïþ»ÿü?ýÛÿ{ÿgÿÏÿÛÿ{ÿgÿOÿò¿üÿãÿø?ýãÿø?þ¯ÿÓÿéÿôÿôoÿïþÛÿëÿíÿåûý¿ý?ýëÿôú?ýŸüïý?þÿ»ÿø?ÿÏÿÓ?ÿÏÿóÿü?þÿãÿô/ÿËÿò?ÿoÿïþ»ÿî?ÿOÿöÿÞÿÙÿóÿöÿÞÿÙÿÓ¿ü/ÿãÿø?þOÿø?þÿëÿôú?ý?ýÛÿ»ÿöÿúûùßþ_ÿoÿOÿú?ýŸþÿ×ÿÉÿÞÿãÿø¿ûÿóÿü?ýóÿü?ÿÏÿãÿø?þOÿò¿ü/ÿóÿöÿî¿ûïþóÿôoÿïýŸý?ÿoÿïýŸý?ýËÿò?þÿãÿôÿãÿø¿þOÿ§ÿÓÿÓ¿ý¿ûoÿ¯ÿ·ÿ—ÿíÿõÿöÿô¯ÿÓÿéÿøùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùþŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿù÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûÿÞßÿý[‘Ôß \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_0_225_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_225_states.bin.bz2 new file mode 100644 index 000000000..15195d213 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_225_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_225_states.bin.z b/client/resources/hardnested_tables/bitflip_0_225_states.bin.z deleted file mode 100644 index a4cc5d58c..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_225_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_227_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_227_states.bin.bz2 new file mode 100644 index 000000000..18a6d4987 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_227_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_227_states.bin.z b/client/resources/hardnested_tables/bitflip_0_227_states.bin.z deleted file mode 100644 index f7bb63eb7..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_227_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_22d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_22d_states.bin.bz2 new file mode 100644 index 000000000..fa1be58fd Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_22d_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_22d_states.bin.z b/client/resources/hardnested_tables/bitflip_0_22d_states.bin.z deleted file mode 100644 index 4e5b2ff27..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_22d_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_22f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_22f_states.bin.bz2 new file mode 100644 index 000000000..b6c1eb54c Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_22f_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_22f_states.bin.z b/client/resources/hardnested_tables/bitflip_0_22f_states.bin.z deleted file mode 100644 index f8686dba6..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_22f_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_240_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_240_states.bin.bz2 new file mode 100644 index 000000000..6d1908e79 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_240_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_240_states.bin.z b/client/resources/hardnested_tables/bitflip_0_240_states.bin.z deleted file mode 100644 index e4f4b6ac6..000000000 --- a/client/resources/hardnested_tables/bitflip_0_240_states.bin.z +++ /dev/null @@ -1,2 +0,0 @@ -xÚí×AŠ­P á,Õ;w!щG -! ‡¯{ð4܆.Rˆ-ö£÷×Wý/³þýöóîçOOÿþîßoúï?þø¯Ë?š_õ÷ç=?÷íçÝÏŸþšþýÝ¿ßôßüñ_—¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí?þúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõŸþãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡?ÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó?þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷Ÿýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó?þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿ý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸþÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì?þøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí?þúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõŸþãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡?ÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó?þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷Ÿýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó?þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿ý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸþÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì?þøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùÿ¿ò?š;Õm \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_0_275_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_275_states.bin.bz2 new file mode 100644 index 000000000..15195d213 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_275_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_275_states.bin.z b/client/resources/hardnested_tables/bitflip_0_275_states.bin.z deleted file mode 100644 index a4cc5d58c..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_275_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_277_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_277_states.bin.bz2 new file mode 100644 index 000000000..18a6d4987 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_277_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_277_states.bin.z b/client/resources/hardnested_tables/bitflip_0_277_states.bin.z deleted file mode 100644 index f7bb63eb7..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_277_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_27f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_27f_states.bin.bz2 new file mode 100644 index 000000000..b6c1eb54c Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_27f_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_27f_states.bin.z b/client/resources/hardnested_tables/bitflip_0_27f_states.bin.z deleted file mode 100644 index f8686dba6..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_27f_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_294_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_294_states.bin.bz2 new file mode 100644 index 000000000..b01f02208 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_294_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_294_states.bin.z b/client/resources/hardnested_tables/bitflip_0_294_states.bin.z deleted file mode 100644 index c8a8cf4a0..000000000 --- a/client/resources/hardnested_tables/bitflip_0_294_states.bin.z +++ /dev/null @@ -1 +0,0 @@ -xÚíÝO’ÄÊuåé3ªio%Vk©LSMd9¬Eõ¤§½ ´‰¶b‹Jù!àÒHÿHK{|á ü¹øu÷s~~ÿßÿçÿÎןþåOÿúÿè?ÿüŸïÿþÏßþy¾}ïÿÿÇÿüýÿ¯ýþ½íßöþ¾Þ\ÿ×›óý7Îtü³çµÅÿŠßÿÇÝûÏÑïׯï{GÇ{ýsž¿6~WÄÿ.ïÿ×›øýý{víûwÅýµ¿¿¦ýëÿËÿù»¿Ïù?ÿóÿÜ~¾ùÿÿõ¾>ßÇÿãþ×ÿß»ãý—ó¿®ñó¯×û§¯£ëoóÏ¿^×î矿Úþð¿ÿîü¸¯¿ïŸïÜÿ»ó¿þÏÿ‹ûÏÿ8Ö_þýuÜ¿?þ }/~Ûø]ÿ?ðýýçû|þÚßÿÇúÓ×›ø>ÿ'ÚŸòŸ{Ïß¿>ñýŸôüµñk¿ÿÏÿöOÿþçÿþ£ÿüó1¿ÿýûøûç¹öWÿçÿþïŸÿ÷ëó×}|þ—ïýûëŸûÿÿç÷ÿp¼?~¾=ÞÕ÷·=îö|£ó·ñkÛÿyûßm¶ŸoþûÊ7ÿüoïÇgß÷ÿÿ¯¿õ¿íÿþ£ëý¾³Ÿ¿¿ÆïßßߎÎ_Ç?ÿëŸó?þ×ÿø‡ÿùÇùþ÷×ñ6Ç´ÿµúÿÿñó?ßÃ_þý;~ÿÝïoþý¿\ÿö?Ûö?Gù??ÿËyÿù/‘ÿË^yæ¯çÿóÿþÃçÃóÿíXßÇÝÆopþaû‰ß§íÿ¿Ÿë÷ÏïÝßÿ£þ{týWôÿMüêøËÿkçÿQÿ·ý|óŸ×XüÕ¯|ýï¿Äÿó£þ»íG×7Ê_í¿_÷³“þòù÷õ_Üÿÿ5~9î×ç_ž—³ç/ãÿñùýÍߟùý¿¿ÿ·žkÿëåÿþÇÏ·ÿÞÿï¯;û/í™? Ö/þîüÛùßÑù7óóíýÎ?j?óû4[ã<·þüúÿýë›õÖ½ãÿïãõë³Ç{ýçÖo·×ÿßÿþµñk¿—÷ÿïÖO¶ïï‰õôýkï¯íÚøµíÃþoóù»õ«£õ§ƒþ»íG×7ú}g?W­ÿý£ñÿ§ëþûŸãË¿þ¯?ýéoÿ<×þê‡þøïüüõÿý×?ýcßßþûöú·ãñÝûûÏÏÇÿ¯ÿÿv¼?:ÿv|¾¿ƒóŸj?ˆÿ¿ÿ÷}½ÏOG¿_ÿí÷FÇÛþwöóׯ¯ýþã¿?ŽÏöÎ?j¿ÂñŽ¿®¸¿vüׯ¯i—ÿ×ÎÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü¿]ßýçç?3þnïïŠñ_¿¶}4^¯·ãÏ]ýéÆãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöíñùÿÖöÿÑÿéÿôÿuõü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿyúÊÿüyñ·ÿõOÿö·žkCþøïüüÏ1øþ÷ïxüw¿¿ý÷íõoõ˜ÿÒþýüuÞwþƒ×ÿ«÷ Ï¿Ñç·÷7:ÿ¨ýÌïcþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷ë‹Ú¾//ÿÒëý¿úýkï¯íÚøµíÃþoóùží;þÑ?7þµQÿÝö¿£ëý¾³Ÿ¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿÿ±¡} \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_0_2a1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_2a1_states.bin.bz2 new file mode 100644 index 000000000..15195d213 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_2a1_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_2a1_states.bin.z b/client/resources/hardnested_tables/bitflip_0_2a1_states.bin.z deleted file mode 100644 index a4cc5d58c..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_2a1_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_2a3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_2a3_states.bin.bz2 new file mode 100644 index 000000000..18a6d4987 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_2a3_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_2a3_states.bin.z b/client/resources/hardnested_tables/bitflip_0_2a3_states.bin.z deleted file mode 100644 index f7bb63eb7..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_2a3_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_2a9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_2a9_states.bin.bz2 new file mode 100644 index 000000000..fa1be58fd Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_2a9_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_2a9_states.bin.z b/client/resources/hardnested_tables/bitflip_0_2a9_states.bin.z deleted file mode 100644 index 4e5b2ff27..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_2a9_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_2ab_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_2ab_states.bin.bz2 new file mode 100644 index 000000000..b6c1eb54c Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_2ab_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_2ab_states.bin.z b/client/resources/hardnested_tables/bitflip_0_2ab_states.bin.z deleted file mode 100644 index f8686dba6..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_2ab_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_2c4_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_2c4_states.bin.bz2 new file mode 100644 index 000000000..b01f02208 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_2c4_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_2c4_states.bin.z b/client/resources/hardnested_tables/bitflip_0_2c4_states.bin.z deleted file mode 100644 index c8a8cf4a0..000000000 --- a/client/resources/hardnested_tables/bitflip_0_2c4_states.bin.z +++ /dev/null @@ -1 +0,0 @@ -xÚíÝO’ÄÊuåé3ªio%Vk©LSMd9¬Eõ¤§½ ´‰¶b‹Jù!àÒHÿHK{|á ü¹øu÷s~~ÿßÿçÿÎןþåOÿúÿè?ÿüŸïÿþÏßþy¾}ïÿÿÇÿüýÿ¯ýþ½íßöþ¾Þ\ÿ×›óý7Îtü³çµÅÿŠßÿÇÝûÏÑïׯï{GÇ{ýsž¿6~WÄÿ.ïÿ×›øýý{víûwÅýµ¿¿¦ýëÿËÿù»¿Ïù?ÿóÿÜ~¾ùÿÿõ¾>ßÇÿãþ×ÿß»ãý—ó¿®ñó¯×û§¯£ëoóÏ¿^×î矿Úþð¿ÿîü¸¯¿ïŸïÜÿ»ó¿þÏÿ‹ûÏÿ8Ö_þýuÜ¿?þ }/~Ûø]ÿ?ðýýçû|þÚßÿÇúÓ×›ø>ÿ'ÚŸòŸ{Ïß¿>ñýŸôüµñk¿ÿÏÿöOÿþçÿþ£ÿüó1¿ÿýûøûç¹öWÿçÿþïŸÿ÷ëó×}|þ—ïýûëŸûÿÿç÷ÿp¼?~¾=ÞÕ÷·=îö|£ó·ñkÛÿyûßm¶ŸoþûÊ7ÿüoïÇgß÷ÿÿ¯¿õ¿íÿþ£ëý¾³Ÿ¿¿ÆïßßߎÎ_Ç?ÿëŸó?þ×ÿø‡ÿùÇùþ÷×ñ6Ç´ÿµúÿÿñó?ßÃ_þý;~ÿÝïoþý¿\ÿö?Ûö?Gù??ÿËyÿù/‘ÿË^yæ¯çÿóÿþÃçÃóÿíXßÇÝÆopþaû‰ß§íÿ¿Ÿë÷ÏïÝßÿ£þ{týWôÿMüêøËÿkçÿQÿ·ý|óŸ×XüÕ¯|ýï¿Äÿó£þ»íG×7Ê_í¿_÷³“þòù÷õ_Üÿÿ5~9î×ç_ž—³ç/ãÿñùýÍߟùý¿¿ÿ·žkÿëåÿþÇÏ·ÿÞÿï¯;û/í™? Ö/þîüÛùßÑù7óóíýÎ?j?óû4[ã<·þüúÿýë›õÖ½ãÿïãõë³Ç{ýçÖo·×ÿßÿþµñk¿—÷ÿïÖO¶ïï‰õôýkï¯íÚøµíÃþoóù»õ«£õ§ƒþ»íG×7ú}g?W­ÿý£ñÿ§ëþûŸãË¿þ¯?ýéoÿ<×þê‡þøïüüõÿý×?ýcßßþûöú·ãñÝûûÏÏÇÿ¯ÿÿv¼?:ÿv|¾¿ƒóŸj?ˆÿ¿ÿ÷}½ÏOG¿_ÿí÷FÇÛþwöóׯ¯ýþã¿?ŽÏöÎ?j¿ÂñŽ¿®¸¿vüׯ¯i—ÿ×ÎÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü¿]ßýçç?3þnïïŠñ_¿¶}4^¯·ãÏ]ýéÆãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöíñùÿÖöÿÑÿéÿôÿuõü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿyúÊÿüyñ·ÿõOÿö·žkCþøïüüÏ1øþ÷ïxüw¿¿ý÷íõoõ˜ÿÒþýüuÞwþƒ×ÿ«÷ Ï¿Ñç·÷7:ÿ¨ýÌïcþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷ë‹Ú¾//ÿÒëý¿úýkï¯íÚøµíÃþoóùží;þÑ?7þµQÿÝö¿£ëý¾³Ÿ¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿÿ±¡} \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_0_2f1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_2f1_states.bin.bz2 new file mode 100644 index 000000000..15195d213 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_2f1_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_2f1_states.bin.z b/client/resources/hardnested_tables/bitflip_0_2f1_states.bin.z deleted file mode 100644 index a4cc5d58c..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_2f1_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_2f3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_2f3_states.bin.bz2 new file mode 100644 index 000000000..18a6d4987 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_2f3_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_2f3_states.bin.z b/client/resources/hardnested_tables/bitflip_0_2f3_states.bin.z deleted file mode 100644 index f7bb63eb7..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_2f3_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_2f9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_2f9_states.bin.bz2 new file mode 100644 index 000000000..fa1be58fd Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_2f9_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_2f9_states.bin.z b/client/resources/hardnested_tables/bitflip_0_2f9_states.bin.z deleted file mode 100644 index 4e5b2ff27..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_2f9_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_2fb_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_2fb_states.bin.bz2 new file mode 100644 index 000000000..b6c1eb54c Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_2fb_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_2fb_states.bin.z b/client/resources/hardnested_tables/bitflip_0_2fb_states.bin.z deleted file mode 100644 index f8686dba6..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_2fb_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_335_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_335_states.bin.bz2 new file mode 100644 index 000000000..15195d213 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_335_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_335_states.bin.z b/client/resources/hardnested_tables/bitflip_0_335_states.bin.z deleted file mode 100644 index a4cc5d58c..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_335_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_337_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_337_states.bin.bz2 new file mode 100644 index 000000000..18a6d4987 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_337_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_337_states.bin.z b/client/resources/hardnested_tables/bitflip_0_337_states.bin.z deleted file mode 100644 index f7bb63eb7..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_337_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_33d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_33d_states.bin.bz2 new file mode 100644 index 000000000..fa1be58fd Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_33d_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_33d_states.bin.z b/client/resources/hardnested_tables/bitflip_0_33d_states.bin.z deleted file mode 100644 index 4e5b2ff27..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_33d_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_33f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_33f_states.bin.bz2 new file mode 100644 index 000000000..b6c1eb54c Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_33f_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_33f_states.bin.z b/client/resources/hardnested_tables/bitflip_0_33f_states.bin.z deleted file mode 100644 index f8686dba6..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_33f_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_350_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_350_states.bin.bz2 new file mode 100644 index 000000000..fe85775bf Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_350_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_350_states.bin.z b/client/resources/hardnested_tables/bitflip_0_350_states.bin.z deleted file mode 100644 index 479bacb03..000000000 --- a/client/resources/hardnested_tables/bitflip_0_350_states.bin.z +++ /dev/null @@ -1 +0,0 @@ -xÚíÛMnãF„aÝÀWÑtï½Ñ‰|5o}4¢Á–L‰”«êg‚ ™ÌObOj¾ªz»ߟ‡óð1$Ž_¦¿Ÿ¾ÌÝþíKß¿þrùýÒßþãKþý->É··øõ¯Þ¥/÷~ýÒÏ»ÿþ}þÿK?ÏþüÓÿkëÿxzûIþ,×ñtûã_ú~[þùû–׿¿ûïÿüõúŸ¯ý÷?þãÛ~þžýùO}Ö¾}ïÏúñ¥ÿþôó—~;ý÷­ÿ÷¯ìñçœÿnæ¿nûör‡ê¯×ÿ¼|ßóð¿ýõÖ_úïO?é··øõŸ>®ÛþãÞ¯_úùOÿØûÿ¿ôó—þøCøeþ9ÊÏwùó®}{ù}¨þzýÏÇaúúôñ<ú㯿ÞúãKÿýéç¯Å·Ó¿úwÿû¾ÿéïÿÅK–ßIÆß§§¿nûý;ýý7ý²÷ýI?é—ÿûÎÿúÿ¾ûú×ÿéÿôü¿þOþï/ÿãÿø¿ûÿóÿü?ýóÿü?ÿÏÿãÿø?þOÿò¿ü/ÿóÿ¯ëÿÝ÷ßýçÿé¿Oý{ÿ×÷û?þßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñüÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿOÿöÿî¿ý¿þßþ_þ·ÿ×ÿÛÿÓ¿þOÿ§ÿãÿõò¿÷ÿø?þïþãÿü?ÿOÿü?ÿÏÿóÿø?þÿÓ¿ü/ÿËÿü¿ý¿ûïþ»ÿü?ýÛÿ{ÿgÿÏÿÛÿ{ÿgÿOÿò¿üÿãÿø?ýãÿø?þ¯ÿÓÿéÿôÿôoÿïþÛÿëÿíÿåûý¿ý?ýëÿôú?þ_ÿ'ÿ{ÿÿãÿî?þÏÿóÿôÏÿóÿü?ÿÿãÿø?ýËÿò¿üÏÿÛÿ»ÿî¿ûÏÿÓ¿ý¿÷öÿü¿ý¿÷öÿô/ÿËÿø?þÿÓ?þÿãÿú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ý?ýÛÿ»ÿöÿúûùßþ_ÿoÿOÿú?ýŸþÿ×ÿÉÿÞÿãÿø¿ûÿóÿü?ýóÿü?ÿÏÿãÿø?þOÿò¿ü/ÿóÿöÿî¿ûïþóÿôoÿïýŸý?ÿoÿïýŸý?ýËÿò?þÿãÿôÿãÿø¿þOÿ§ÿÓÿÓ¿ý¿ûoÿ¯ÿ·ÿ—ÿíÿõÿöÿô¯ÿÓÿéÿøýŸüïý?þÿ»ÿø?ÿÏÿÓ?ÿÏÿóÿü?þÿãÿô/ÿËÿò?ÿoÿïþ»ÿî?ÿOÿöÿÞÿÙÿóÿöÿÞÿÙÿÓ¿ü/ÿãÿø?þOÿø?þÿëÿôú?ú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúû÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§ûûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûûùßþ_ÿoÿOÿú?ýŸþÿ×ÿÉÿÞÿãÿø¿ûÿóÿü?ýóÿü?ÿÏÿãÿø?þOÿò¿ü/ÿóÿöÿî¿ûïþóÿôoÿïýŸý?ÿoÿïýŸý?ýËÿò?þÿãÿôÿãÿø¿þOÿ§ÿÓÿÓ¿ý¿ûoÿ¯ÿ·ÿ—ÿíÿõÿöÿô¯ÿÓÿéÿøýŸüïý?þÿ»ÿø?ÿÏÿÓ?ÿÏÿóÿü?þÿãÿô/ÿËÿò?ÿoÿïþ»ÿî?ÿOÿöÿÞÿÙÿóÿöÿÞÿÙÿÓ¿ü/ÿãÿø?þOÿø?þÿëÿôú?ý?ýÛÿ»ÿöÿúùßþ_ÿoÿOÿú?ýŸþÿ×ÿÉÿÞÿãÿø¿ûÿóÿü?ýóÿü?ÿÏÿãÿø?þOÿò¿ü/ÿóÿöÿî¿ûïþóÿôoÿïýŸý?ÿoÿïýŸý?ýËÿò?þÿãÿôÿãÿø¿þOÿ§ÿÓÿÓ¿ý¿ûoÿ¯ÿ·ÿ—ÿíÿõÿöÿô¯ÿÓÿéÿøýŸüïý?þÿ»ÿø?ÿÏÿÓ?ÿÏÿóÿü?þÿãÿô/ÿËÿò?ÿoÿïþ»ÿî?ÿOÿöÿÞÿÙÿóÿöÿÞÿÙÿÓ¿ü/ÿãÿø?þOÿø?þÿëÿôú?ý?ýÛÿ»ÿöÿúûûý¿ý?ýëÿôú?þ_ÿ'ÿ{ÿÿãÿî?þÏÿóÿôÏÿóÿü?ÿÿãÿø?ýËÿò¿üÏÿÛÿ»ÿî¿ûÏÿÓ¿ý¿÷öÿü¿ý¿÷öÿô/ÿËÿø?þÿÓ?þÿãÿú?ýŸþOÿOÿöÿî¿ý¿þßþ_þ·ÿ×ÿÛÿÓ¿þOÿ§ÿãÿõò¿÷ÿø?þïþãÿü?ÿOÿü?ÿÏÿóÿø?þÿÓ¿ü/ÿËÿü¿ý¿ûïþ»ÿü?ýÛÿ{ÿgÿÏÿÛÿ{ÿgÿOÿò¿üÿãÿø?ýãÿø?þ¯ÿÓÿéÿôÿôoÿïþÛÿëÿíÿåý¿ý?ýëÿôú?þ_ÿ'ÿ{ÿÿãÿî?þÏÿóÿôÏÿóÿü?ÿÿãÿø?ýËÿò¿üÏÿÛÿ»ÿî¿ûÏÿÓ¿ý¿÷öÿü¿ý¿÷öÿô/ÿËÿø?þÿÓ?þÿãÿú?ýŸþOÿOÿöÿî¿ý¿þßþ_þ·ÿ×ÿÛÿÓ¿þOÿ§ÿãÿõò¿÷ÿø?þïþãÿü?ÿOÿü?ÿÏÿóÿø?þÿÓ¿ü/ÿËÿü¿ý¿ûïþ»ÿü?ýÛÿ{ÿgÿÏÿÛÿ{ÿgÿOÿò¿üÿãÿø?ýãÿø?þ¯ÿÓÿéÿôÿôoÿïþÛÿëÿíÿåûûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþÿ×ÿÉÿÞÿãÿø¿ûÿóÿü?ýóÿü?ÿÏÿãÿø?þOÿò¿ü/ÿóÿöÿî¿ûïþóÿôoÿïýŸý?ÿoÿïýŸý?ýËÿò?þÿãÿôÿãÿø¿þOÿ§ÿÓÿÓ¿ý¿ûoÿ¯ÿ·ÿ—ÿíÿõÿöÿô¯ÿÓÿéÿøýŸüïý?þÿ»ÿø?ÿÏÿÓ?ÿÏÿóÿü?þÿãÿô/ÿËÿò?ÿoÿïþ»ÿî?ÿOÿöÿÞÿÙÿóÿöÿÞÿÙÿÓ¿ü/ÿãÿø?þOÿø?þÿëÿôú?ý?ýÛÿ»ÿöÿúûùßþ_ÿoÿOÿú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?þ_ÿ'ÿ{ÿÿãÿî?þÏÿóÿôÏÿóÿü?ÿÿãÿø?ýËÿò¿üÏÿÛÿ»ÿî¿ûÏÿÓ¿ý¿÷öÿü¿ý¿÷öÿô/ÿËÿø?þÿÓ?þÿãÿú?ýŸþOÿOÿöÿî¿ý¿þßþ_þ·ÿ×ÿÛÿÓ¿þOÿ§ÿãÿõò¿÷ÿø?þïþãÿü?ÿOÿü?ÿÏÿóÿø?þÿÓ¿ü/ÿËÿü¿ý¿ûïþ»ÿü?ýÛÿ{ÿgÿÏÿÛÿ{ÿgÿOÿò¿üÿãÿø?ýãÿø?þ¯ÿÓÿéÿôÿôoÿïþÛÿëÿíÿåûý¿ý?ýëÿôú?ýŸüïý?þÿ»ÿø?ÿÏÿÓ?ÿÏÿóÿü?þÿãÿô/ÿËÿò?ÿoÿïþ»ÿî?ÿOÿöÿÞÿÙÿóÿöÿÞÿÙÿÓ¿ü/ÿãÿø?þOÿø?þÿëÿôú?ý?ýÛÿ»ÿöÿúûùßþ_ÿoÿOÿú?ýŸþÿ×ÿÉÿÞÿãÿø¿ûÿóÿü?ýóÿü?ÿÏÿãÿø?þOÿò¿ü/ÿóÿöÿî¿ûïþóÿôoÿïýŸý?ÿoÿïýŸý?ýËÿò?þÿãÿôÿãÿø¿þOÿ§ÿÓÿÓ¿ý¿ûoÿ¯ÿ·ÿ—ÿíÿõÿöÿô¯ÿÓÿéÿøùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùþŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿù÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûÿÞßÿý[‘Ôß \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_0_365_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_365_states.bin.bz2 new file mode 100644 index 000000000..15195d213 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_365_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_365_states.bin.z b/client/resources/hardnested_tables/bitflip_0_365_states.bin.z deleted file mode 100644 index a4cc5d58c..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_365_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_367_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_367_states.bin.bz2 new file mode 100644 index 000000000..18a6d4987 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_367_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_367_states.bin.z b/client/resources/hardnested_tables/bitflip_0_367_states.bin.z deleted file mode 100644 index f7bb63eb7..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_367_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_36d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_36d_states.bin.bz2 new file mode 100644 index 000000000..fa1be58fd Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_36d_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_36d_states.bin.z b/client/resources/hardnested_tables/bitflip_0_36d_states.bin.z deleted file mode 100644 index 4e5b2ff27..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_36d_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_36f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_36f_states.bin.bz2 new file mode 100644 index 000000000..b6c1eb54c Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_36f_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_36f_states.bin.z b/client/resources/hardnested_tables/bitflip_0_36f_states.bin.z deleted file mode 100644 index f8686dba6..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_36f_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_384_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_384_states.bin.bz2 new file mode 100644 index 000000000..b01f02208 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_384_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_384_states.bin.z b/client/resources/hardnested_tables/bitflip_0_384_states.bin.z deleted file mode 100644 index c8a8cf4a0..000000000 --- a/client/resources/hardnested_tables/bitflip_0_384_states.bin.z +++ /dev/null @@ -1 +0,0 @@ -xÚíÝO’ÄÊuåé3ªio%Vk©LSMd9¬Eõ¤§½ ´‰¶b‹Jù!àÒHÿHK{|á ü¹øu÷s~~ÿßÿçÿÎןþåOÿúÿè?ÿüŸïÿþÏßþy¾}ïÿÿÇÿüýÿ¯ýþ½íßöþ¾Þ\ÿ×›óý7Îtü³çµÅÿŠßÿÇÝûÏÑïׯï{GÇ{ýsž¿6~WÄÿ.ïÿ×›øýý{víûwÅýµ¿¿¦ýëÿËÿù»¿Ïù?ÿóÿÜ~¾ùÿÿõ¾>ßÇÿãþ×ÿß»ãý—ó¿®ñó¯×û§¯£ëoóÏ¿^×î矿Úþð¿ÿîü¸¯¿ïŸïÜÿ»ó¿þÏÿ‹ûÏÿ8Ö_þýuÜ¿?þ }/~Ûø]ÿ?ðýýçû|þÚßÿÇúÓ×›ø>ÿ'ÚŸòŸ{Ïß¿>ñýŸôüµñk¿ÿÏÿöOÿþçÿþ£ÿüó1¿ÿýûøûç¹öWÿçÿþïŸÿ÷ëó×}|þ—ïýûëŸûÿÿç÷ÿp¼?~¾=ÞÕ÷·=îö|£ó·ñkÛÿyûßm¶ŸoþûÊ7ÿüoïÇgß÷ÿÿ¯¿õ¿íÿþ£ëý¾³Ÿ¿¿ÆïßßߎÎ_Ç?ÿëŸó?þ×ÿø‡ÿùÇùþ÷×ñ6Ç´ÿµúÿÿñó?ßÃ_þý;~ÿÝïoþý¿\ÿö?Ûö?Gù??ÿËyÿù/‘ÿË^yæ¯çÿóÿþÃçÃóÿíXßÇÝÆopþaû‰ß§íÿ¿Ÿë÷ÏïÝßÿ£þ{týWôÿMüêøËÿkçÿQÿ·ý|óŸ×XüÕ¯|ýï¿Äÿó£þ»íG×7Ê_í¿_÷³“þòù÷õ_Üÿÿ5~9î×ç_ž—³ç/ãÿñùýÍߟùý¿¿ÿ·žkÿëåÿþÇÏ·ÿÞÿï¯;û/í™? Ö/þîüÛùßÑù7óóíýÎ?j?óû4[ã<·þüúÿýë›õÖ½ãÿïãõë³Ç{ýçÖo·×ÿßÿþµñk¿—÷ÿïÖO¶ïï‰õôýkï¯íÚøµíÃþoóù»õ«£õ§ƒþ»íG×7ú}g?W­ÿý£ñÿ§ëþûŸãË¿þ¯?ýéoÿ<×þê‡þøïüüõÿý×?ýcßßþûöú·ãñÝûûÏÏÇÿ¯ÿÿv¼?:ÿv|¾¿ƒóŸj?ˆÿ¿ÿ÷}½ÏOG¿_ÿí÷FÇÛþwöóׯ¯ýþã¿?ŽÏöÎ?j¿ÂñŽ¿®¸¿vüׯ¯i—ÿ×ÎÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü¿]ßýçç?3þnïïŠñ_¿¶}4^¯·ãÏ]ýéÆãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöíñùÿÖöÿÑÿéÿôÿuõü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿyúÊÿüyñ·ÿõOÿö·žkCþøïüüÏ1øþ÷ïxüw¿¿ý÷íõoõ˜ÿÒþýüuÞwþƒ×ÿ«÷ Ï¿Ñç·÷7:ÿ¨ýÌïcþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷ë‹Ú¾//ÿÒëý¿úýkï¯íÚøµíÃþoóùží;þÑ?7þµQÿÝö¿£ëý¾³Ÿ¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿÿ±¡} \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_0_3b1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_3b1_states.bin.bz2 new file mode 100644 index 000000000..15195d213 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_3b1_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_3b1_states.bin.z b/client/resources/hardnested_tables/bitflip_0_3b1_states.bin.z deleted file mode 100644 index a4cc5d58c..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_3b1_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_3b3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_3b3_states.bin.bz2 new file mode 100644 index 000000000..18a6d4987 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_3b3_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_3b3_states.bin.z b/client/resources/hardnested_tables/bitflip_0_3b3_states.bin.z deleted file mode 100644 index f7bb63eb7..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_3b3_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_3b9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_3b9_states.bin.bz2 new file mode 100644 index 000000000..fa1be58fd Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_3b9_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_3b9_states.bin.z b/client/resources/hardnested_tables/bitflip_0_3b9_states.bin.z deleted file mode 100644 index 4e5b2ff27..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_3b9_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_3bb_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_3bb_states.bin.bz2 new file mode 100644 index 000000000..b6c1eb54c Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_3bb_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_3bb_states.bin.z b/client/resources/hardnested_tables/bitflip_0_3bb_states.bin.z deleted file mode 100644 index f8686dba6..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_3bb_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_3d4_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_3d4_states.bin.bz2 new file mode 100644 index 000000000..b01f02208 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_3d4_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_3d4_states.bin.z b/client/resources/hardnested_tables/bitflip_0_3d4_states.bin.z deleted file mode 100644 index c8a8cf4a0..000000000 --- a/client/resources/hardnested_tables/bitflip_0_3d4_states.bin.z +++ /dev/null @@ -1 +0,0 @@ -xÚíÝO’ÄÊuåé3ªio%Vk©LSMd9¬Eõ¤§½ ´‰¶b‹Jù!àÒHÿHK{|á ü¹øu÷s~~ÿßÿçÿÎןþåOÿúÿè?ÿüŸïÿþÏßþy¾}ïÿÿÇÿüýÿ¯ýþ½íßöþ¾Þ\ÿ×›óý7Îtü³çµÅÿŠßÿÇÝûÏÑïׯï{GÇ{ýsž¿6~WÄÿ.ïÿ×›øýý{víûwÅýµ¿¿¦ýëÿËÿù»¿Ïù?ÿóÿÜ~¾ùÿÿõ¾>ßÇÿãþ×ÿß»ãý—ó¿®ñó¯×û§¯£ëoóÏ¿^×î矿Úþð¿ÿîü¸¯¿ïŸïÜÿ»ó¿þÏÿ‹ûÏÿ8Ö_þýuÜ¿?þ }/~Ûø]ÿ?ðýýçû|þÚßÿÇúÓ×›ø>ÿ'ÚŸòŸ{Ïß¿>ñýŸôüµñk¿ÿÏÿöOÿþçÿþ£ÿüó1¿ÿýûøûç¹öWÿçÿþïŸÿ÷ëó×}|þ—ïýûëŸûÿÿç÷ÿp¼?~¾=ÞÕ÷·=îö|£ó·ñkÛÿyûßm¶ŸoþûÊ7ÿüoïÇgß÷ÿÿ¯¿õ¿íÿþ£ëý¾³Ÿ¿¿ÆïßßߎÎ_Ç?ÿëŸó?þ×ÿø‡ÿùÇùþ÷×ñ6Ç´ÿµúÿÿñó?ßÃ_þý;~ÿÝïoþý¿\ÿö?Ûö?Gù??ÿËyÿù/‘ÿË^yæ¯çÿóÿþÃçÃóÿíXßÇÝÆopþaû‰ß§íÿ¿Ÿë÷ÏïÝßÿ£þ{týWôÿMüêøËÿkçÿQÿ·ý|óŸ×XüÕ¯|ýï¿Äÿó£þ»íG×7Ê_í¿_÷³“þòù÷õ_Üÿÿ5~9î×ç_ž—³ç/ãÿñùýÍߟùý¿¿ÿ·žkÿëåÿþÇÏ·ÿÞÿï¯;û/í™? Ö/þîüÛùßÑù7óóíýÎ?j?óû4[ã<·þüúÿýë›õÖ½ãÿïãõë³Ç{ýçÖo·×ÿßÿþµñk¿—÷ÿïÖO¶ïï‰õôýkï¯íÚøµíÃþoóù»õ«£õ§ƒþ»íG×7ú}g?W­ÿý£ñÿ§ëþûŸãË¿þ¯?ýéoÿ<×þê‡þøïüüõÿý×?ýcßßþûöú·ãñÝûûÏÏÇÿ¯ÿÿv¼?:ÿv|¾¿ƒóŸj?ˆÿ¿ÿ÷}½ÏOG¿_ÿí÷FÇÛþwöóׯ¯ýþã¿?ŽÏöÎ?j¿ÂñŽ¿®¸¿vüׯ¯i—ÿ×ÎÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü¿]ßýçç?3þnïïŠñ_¿¶}4^¯·ãÏ]ýéÆãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöíñùÿÖöÿÑÿéÿôÿuõü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿyúÊÿüyñ·ÿõOÿö·žkCþøïüüÏ1øþ÷ïxüw¿¿ý÷íõoõ˜ÿÒþýüuÞwþƒ×ÿ«÷ Ï¿Ñç·÷7:ÿ¨ýÌïcþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷ë‹Ú¾//ÿÒëý¿úýkï¯íÚøµíÃþoóùží;þÑ?7þµQÿÝö¿£ëý¾³Ÿ¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿÿ±¡} \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_0_3e1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_3e1_states.bin.bz2 new file mode 100644 index 000000000..15195d213 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_3e1_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_3e1_states.bin.z b/client/resources/hardnested_tables/bitflip_0_3e1_states.bin.z deleted file mode 100644 index a4cc5d58c..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_3e1_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_3e3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_3e3_states.bin.bz2 new file mode 100644 index 000000000..18a6d4987 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_3e3_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_3e3_states.bin.z b/client/resources/hardnested_tables/bitflip_0_3e3_states.bin.z deleted file mode 100644 index f7bb63eb7..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_3e3_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_3e9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_3e9_states.bin.bz2 new file mode 100644 index 000000000..fa1be58fd Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_3e9_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_3e9_states.bin.z b/client/resources/hardnested_tables/bitflip_0_3e9_states.bin.z deleted file mode 100644 index 4e5b2ff27..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_3e9_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_0_3eb_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_0_3eb_states.bin.bz2 new file mode 100644 index 000000000..b6c1eb54c Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_0_3eb_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_0_3eb_states.bin.z b/client/resources/hardnested_tables/bitflip_0_3eb_states.bin.z deleted file mode 100644 index f8686dba6..000000000 Binary files a/client/resources/hardnested_tables/bitflip_0_3eb_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_002_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_002_states.bin.bz2 new file mode 100644 index 000000000..4c9093b38 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_002_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_002_states.bin.z b/client/resources/hardnested_tables/bitflip_1_002_states.bin.z deleted file mode 100644 index 226c37a2f..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_002_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_008_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_008_states.bin.bz2 new file mode 100644 index 000000000..89d88b572 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_008_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_008_states.bin.z b/client/resources/hardnested_tables/bitflip_1_008_states.bin.z deleted file mode 100644 index 209bf5e9e..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_008_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_00a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_00a_states.bin.bz2 new file mode 100644 index 000000000..38af88dff Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_00a_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_00a_states.bin.z b/client/resources/hardnested_tables/bitflip_1_00a_states.bin.z deleted file mode 100644 index 63f0a7a5e..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_00a_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_012_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_012_states.bin.bz2 new file mode 100644 index 000000000..492261923 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_012_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_012_states.bin.z b/client/resources/hardnested_tables/bitflip_1_012_states.bin.z deleted file mode 100644 index 659e697f2..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_012_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_018_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_018_states.bin.bz2 new file mode 100644 index 000000000..c0a592378 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_018_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_018_states.bin.z b/client/resources/hardnested_tables/bitflip_1_018_states.bin.z deleted file mode 100644 index b825cfd6c..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_018_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_01a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_01a_states.bin.bz2 new file mode 100644 index 000000000..98093a999 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_01a_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_01a_states.bin.z b/client/resources/hardnested_tables/bitflip_1_01a_states.bin.z deleted file mode 100644 index 61d252b20..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_01a_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_020_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_020_states.bin.bz2 new file mode 100644 index 000000000..333dab4c5 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_020_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_020_states.bin.z b/client/resources/hardnested_tables/bitflip_1_020_states.bin.z deleted file mode 100644 index cc78af68f..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_020_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_028_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_028_states.bin.bz2 new file mode 100644 index 000000000..7f2e66c32 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_028_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_028_states.bin.z b/client/resources/hardnested_tables/bitflip_1_028_states.bin.z deleted file mode 100644 index 1137886b1..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_028_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_02a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_02a_states.bin.bz2 new file mode 100644 index 000000000..18c04fa47 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_02a_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_02a_states.bin.z b/client/resources/hardnested_tables/bitflip_1_02a_states.bin.z deleted file mode 100644 index 12829c1bf..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_02a_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_02e_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_02e_states.bin.bz2 new file mode 100644 index 000000000..2ecb621b3 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_02e_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_02e_states.bin.z b/client/resources/hardnested_tables/bitflip_1_02e_states.bin.z deleted file mode 100644 index 44fb65c0d..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_02e_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_032_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_032_states.bin.bz2 new file mode 100644 index 000000000..083f1f0a5 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_032_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_032_states.bin.z b/client/resources/hardnested_tables/bitflip_1_032_states.bin.z deleted file mode 100644 index a8350cc17..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_032_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_036_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_036_states.bin.bz2 new file mode 100644 index 000000000..7fa414bd8 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_036_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_036_states.bin.z b/client/resources/hardnested_tables/bitflip_1_036_states.bin.z deleted file mode 100644 index c14426d0b..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_036_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_038_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_038_states.bin.bz2 new file mode 100644 index 000000000..15f739f1b Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_038_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_038_states.bin.z b/client/resources/hardnested_tables/bitflip_1_038_states.bin.z deleted file mode 100644 index ec0b39af2..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_038_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_03a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_03a_states.bin.bz2 new file mode 100644 index 000000000..61ef02268 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_03a_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_03a_states.bin.z b/client/resources/hardnested_tables/bitflip_1_03a_states.bin.z deleted file mode 100644 index e301254b9..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_03a_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_03e_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_03e_states.bin.bz2 new file mode 100644 index 000000000..7dd251575 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_03e_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_03e_states.bin.z b/client/resources/hardnested_tables/bitflip_1_03e_states.bin.z deleted file mode 100644 index 9e5c059f5..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_03e_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_040_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_040_states.bin.bz2 new file mode 100644 index 000000000..87d8693df Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_040_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_040_states.bin.z b/client/resources/hardnested_tables/bitflip_1_040_states.bin.z deleted file mode 100644 index d3f655b04..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_040_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_042_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_042_states.bin.bz2 new file mode 100644 index 000000000..b757bce02 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_042_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_042_states.bin.z b/client/resources/hardnested_tables/bitflip_1_042_states.bin.z deleted file mode 100644 index d324368a6..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_042_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_046_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_046_states.bin.bz2 new file mode 100644 index 000000000..b1454b4e8 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_046_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_046_states.bin.z b/client/resources/hardnested_tables/bitflip_1_046_states.bin.z deleted file mode 100644 index ff59e7409..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_046_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_048_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_048_states.bin.bz2 new file mode 100644 index 000000000..99563f5db Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_048_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_048_states.bin.z b/client/resources/hardnested_tables/bitflip_1_048_states.bin.z deleted file mode 100644 index e21985aa3..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_048_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_04a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_04a_states.bin.bz2 new file mode 100644 index 000000000..b31851187 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_04a_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_04a_states.bin.z b/client/resources/hardnested_tables/bitflip_1_04a_states.bin.z deleted file mode 100644 index 45c58fce2..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_04a_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_04e_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_04e_states.bin.bz2 new file mode 100644 index 000000000..d0a946c4e Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_04e_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_04e_states.bin.z b/client/resources/hardnested_tables/bitflip_1_04e_states.bin.z deleted file mode 100644 index 3966d1b10..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_04e_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_052_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_052_states.bin.bz2 new file mode 100644 index 000000000..95d0d7af7 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_052_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_052_states.bin.z b/client/resources/hardnested_tables/bitflip_1_052_states.bin.z deleted file mode 100644 index f0be53efc..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_052_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_056_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_056_states.bin.bz2 new file mode 100644 index 000000000..92dee0efa Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_056_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_056_states.bin.z b/client/resources/hardnested_tables/bitflip_1_056_states.bin.z deleted file mode 100644 index e92d411b7..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_056_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_058_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_058_states.bin.bz2 new file mode 100644 index 000000000..ca2fe1a7a Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_058_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_058_states.bin.z b/client/resources/hardnested_tables/bitflip_1_058_states.bin.z deleted file mode 100644 index 005459173..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_058_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_05a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_05a_states.bin.bz2 new file mode 100644 index 000000000..2771dced1 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_05a_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_05a_states.bin.z b/client/resources/hardnested_tables/bitflip_1_05a_states.bin.z deleted file mode 100644 index 1dfa63c70..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_05a_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_05e_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_05e_states.bin.bz2 new file mode 100644 index 000000000..94c8612fd Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_05e_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_05e_states.bin.z b/client/resources/hardnested_tables/bitflip_1_05e_states.bin.z deleted file mode 100644 index dc0789685..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_05e_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_060_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_060_states.bin.bz2 new file mode 100644 index 000000000..edc274c4b Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_060_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_060_states.bin.z b/client/resources/hardnested_tables/bitflip_1_060_states.bin.z deleted file mode 100644 index 72477c138..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_060_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_062_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_062_states.bin.bz2 new file mode 100644 index 000000000..5b50711b3 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_062_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_062_states.bin.z b/client/resources/hardnested_tables/bitflip_1_062_states.bin.z deleted file mode 100644 index 53e85964a..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_062_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_066_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_066_states.bin.bz2 new file mode 100644 index 000000000..e599d5318 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_066_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_066_states.bin.z b/client/resources/hardnested_tables/bitflip_1_066_states.bin.z deleted file mode 100644 index de23de8b3..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_066_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_068_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_068_states.bin.bz2 new file mode 100644 index 000000000..d52f1573d Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_068_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_068_states.bin.z b/client/resources/hardnested_tables/bitflip_1_068_states.bin.z deleted file mode 100644 index 08b3e5439..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_068_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_06a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_06a_states.bin.bz2 new file mode 100644 index 000000000..05cdc3556 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_06a_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_06a_states.bin.z b/client/resources/hardnested_tables/bitflip_1_06a_states.bin.z deleted file mode 100644 index 052898c7f..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_06a_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_06e_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_06e_states.bin.bz2 new file mode 100644 index 000000000..f1087952d Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_06e_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_06e_states.bin.z b/client/resources/hardnested_tables/bitflip_1_06e_states.bin.z deleted file mode 100644 index 5e678bd47..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_06e_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_072_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_072_states.bin.bz2 new file mode 100644 index 000000000..138c17c0f Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_072_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_072_states.bin.z b/client/resources/hardnested_tables/bitflip_1_072_states.bin.z deleted file mode 100644 index 404b482d8..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_072_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_076_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_076_states.bin.bz2 new file mode 100644 index 000000000..db0df90a6 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_076_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_076_states.bin.z b/client/resources/hardnested_tables/bitflip_1_076_states.bin.z deleted file mode 100644 index ac58f16e5..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_076_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_078_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_078_states.bin.bz2 new file mode 100644 index 000000000..2c6f9cd4d Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_078_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_078_states.bin.z b/client/resources/hardnested_tables/bitflip_1_078_states.bin.z deleted file mode 100644 index 47474d218..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_078_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_07a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_07a_states.bin.bz2 new file mode 100644 index 000000000..ea2f8386b Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_07a_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_07a_states.bin.z b/client/resources/hardnested_tables/bitflip_1_07a_states.bin.z deleted file mode 100644 index 8b4d446d6..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_07a_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_07e_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_07e_states.bin.bz2 new file mode 100644 index 000000000..00d59bf75 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_07e_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_07e_states.bin.z b/client/resources/hardnested_tables/bitflip_1_07e_states.bin.z deleted file mode 100644 index dff5034c5..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_07e_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_080_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_080_states.bin.bz2 new file mode 100644 index 000000000..54b71e2ce Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_080_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_080_states.bin.z b/client/resources/hardnested_tables/bitflip_1_080_states.bin.z deleted file mode 100644 index 372d2d4ad..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_080_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_082_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_082_states.bin.bz2 new file mode 100644 index 000000000..9937ecd2a Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_082_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_082_states.bin.z b/client/resources/hardnested_tables/bitflip_1_082_states.bin.z deleted file mode 100644 index 5d688299c..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_082_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_086_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_086_states.bin.bz2 new file mode 100644 index 000000000..30d232f69 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_086_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_086_states.bin.z b/client/resources/hardnested_tables/bitflip_1_086_states.bin.z deleted file mode 100644 index e640e39c6..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_086_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_088_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_088_states.bin.bz2 new file mode 100644 index 000000000..cf826e416 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_088_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_088_states.bin.z b/client/resources/hardnested_tables/bitflip_1_088_states.bin.z deleted file mode 100644 index 07dae4760..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_088_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_08a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_08a_states.bin.bz2 new file mode 100644 index 000000000..b708bd851 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_08a_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_08a_states.bin.z b/client/resources/hardnested_tables/bitflip_1_08a_states.bin.z deleted file mode 100644 index 449c46f3c..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_08a_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_08e_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_08e_states.bin.bz2 new file mode 100644 index 000000000..79c5eec83 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_08e_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_08e_states.bin.z b/client/resources/hardnested_tables/bitflip_1_08e_states.bin.z deleted file mode 100644 index bdea7a0f1..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_08e_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_092_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_092_states.bin.bz2 new file mode 100644 index 000000000..917b8cc2f Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_092_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_092_states.bin.z b/client/resources/hardnested_tables/bitflip_1_092_states.bin.z deleted file mode 100644 index 6147f3fdd..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_092_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_096_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_096_states.bin.bz2 new file mode 100644 index 000000000..f5b0d1e39 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_096_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_096_states.bin.z b/client/resources/hardnested_tables/bitflip_1_096_states.bin.z deleted file mode 100644 index 575a38314..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_096_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_098_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_098_states.bin.bz2 new file mode 100644 index 000000000..648c9f2b9 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_098_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_098_states.bin.z b/client/resources/hardnested_tables/bitflip_1_098_states.bin.z deleted file mode 100644 index dee21c52a..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_098_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_09a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_09a_states.bin.bz2 new file mode 100644 index 000000000..261c672de Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_09a_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_09a_states.bin.z b/client/resources/hardnested_tables/bitflip_1_09a_states.bin.z deleted file mode 100644 index c4d76b453..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_09a_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_09e_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_09e_states.bin.bz2 new file mode 100644 index 000000000..bddf5c91f Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_09e_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_09e_states.bin.z b/client/resources/hardnested_tables/bitflip_1_09e_states.bin.z deleted file mode 100644 index dd57c590e..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_09e_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_0a0_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0a0_states.bin.bz2 new file mode 100644 index 000000000..fe09d19cb Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_0a0_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_0a0_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0a0_states.bin.z deleted file mode 100644 index 32880a5cd..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_0a0_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_0a2_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0a2_states.bin.bz2 new file mode 100644 index 000000000..8aa9c2542 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_0a2_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_0a2_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0a2_states.bin.z deleted file mode 100644 index 25d53d5f6..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_0a2_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_0a6_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0a6_states.bin.bz2 new file mode 100644 index 000000000..aa6ec2408 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_0a6_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_0a6_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0a6_states.bin.z deleted file mode 100644 index ca1f5f93e..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_0a6_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_0a8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0a8_states.bin.bz2 new file mode 100644 index 000000000..6d8970c2e Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_0a8_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_0a8_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0a8_states.bin.z deleted file mode 100644 index c7d501ca4..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_0a8_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_0aa_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0aa_states.bin.bz2 new file mode 100644 index 000000000..e23808553 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_0aa_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_0aa_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0aa_states.bin.z deleted file mode 100644 index 5c194d179..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_0aa_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_0ae_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0ae_states.bin.bz2 new file mode 100644 index 000000000..bfc6848dd Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_0ae_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_0ae_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0ae_states.bin.z deleted file mode 100644 index 2ce45b017..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_0ae_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_0b2_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0b2_states.bin.bz2 new file mode 100644 index 000000000..05a4d0fd5 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_0b2_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_0b2_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0b2_states.bin.z deleted file mode 100644 index d81106d05..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_0b2_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_0b6_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0b6_states.bin.bz2 new file mode 100644 index 000000000..34fd067ec Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_0b6_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_0b6_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0b6_states.bin.z deleted file mode 100644 index e8c99c170..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_0b6_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_0b8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0b8_states.bin.bz2 new file mode 100644 index 000000000..f638e4e1b Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_0b8_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_0b8_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0b8_states.bin.z deleted file mode 100644 index 25e777872..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_0b8_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_0ba_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0ba_states.bin.bz2 new file mode 100644 index 000000000..7be7169f4 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_0ba_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_0ba_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0ba_states.bin.z deleted file mode 100644 index 240130a6c..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_0ba_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_0be_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0be_states.bin.bz2 new file mode 100644 index 000000000..91e544e4c Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_0be_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_0be_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0be_states.bin.z deleted file mode 100644 index 05aca3b6c..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_0be_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_0c0_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0c0_states.bin.bz2 new file mode 100644 index 000000000..87d8693df Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_0c0_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_0c0_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0c0_states.bin.z deleted file mode 100644 index d3f655b04..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_0c0_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_0c2_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0c2_states.bin.bz2 new file mode 100644 index 000000000..05f424f30 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_0c2_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_0c2_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0c2_states.bin.z deleted file mode 100644 index cbbb63701..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_0c2_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_0c6_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0c6_states.bin.bz2 new file mode 100644 index 000000000..c104fb1de Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_0c6_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_0c6_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0c6_states.bin.z deleted file mode 100644 index 95d162000..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_0c6_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_0c8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0c8_states.bin.bz2 new file mode 100644 index 000000000..6548e5270 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_0c8_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_0c8_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0c8_states.bin.z deleted file mode 100644 index 5eca50e2e..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_0c8_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_0ca_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0ca_states.bin.bz2 new file mode 100644 index 000000000..8ceab191a Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_0ca_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_0ca_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0ca_states.bin.z deleted file mode 100644 index 500be7d66..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_0ca_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_0ce_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0ce_states.bin.bz2 new file mode 100644 index 000000000..26fc3dcd4 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_0ce_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_0ce_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0ce_states.bin.z deleted file mode 100644 index 583dc35e1..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_0ce_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_0d2_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0d2_states.bin.bz2 new file mode 100644 index 000000000..9d6eaefdd Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_0d2_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_0d2_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0d2_states.bin.z deleted file mode 100644 index a2395d9d7..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_0d2_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_0d6_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0d6_states.bin.bz2 new file mode 100644 index 000000000..d6b205973 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_0d6_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_0d6_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0d6_states.bin.z deleted file mode 100644 index b2cc698ad..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_0d6_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_0d8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0d8_states.bin.bz2 new file mode 100644 index 000000000..3a4e9b14c Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_0d8_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_0d8_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0d8_states.bin.z deleted file mode 100644 index 4188dbd10..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_0d8_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_0da_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0da_states.bin.bz2 new file mode 100644 index 000000000..f59ffec93 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_0da_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_0da_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0da_states.bin.z deleted file mode 100644 index f4115044a..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_0da_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_0de_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0de_states.bin.bz2 new file mode 100644 index 000000000..62759b5d1 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_0de_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_0de_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0de_states.bin.z deleted file mode 100644 index 42dfcc794..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_0de_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_0e0_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0e0_states.bin.bz2 new file mode 100644 index 000000000..904ba404c Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_0e0_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_0e0_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0e0_states.bin.z deleted file mode 100644 index 4af74d9a0..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_0e0_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_0e8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0e8_states.bin.bz2 new file mode 100644 index 000000000..e969ed97c Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_0e8_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_0e8_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0e8_states.bin.z deleted file mode 100644 index 4ff8482ff..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_0e8_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_0f8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_0f8_states.bin.bz2 new file mode 100644 index 000000000..ebb53232e Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_0f8_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_0f8_states.bin.z b/client/resources/hardnested_tables/bitflip_1_0f8_states.bin.z deleted file mode 100644 index 11466136f..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_0f8_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_108_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_108_states.bin.bz2 new file mode 100644 index 000000000..2b87ca8f2 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_108_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_108_states.bin.z b/client/resources/hardnested_tables/bitflip_1_108_states.bin.z deleted file mode 100644 index 31234583d..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_108_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_111_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_111_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_111_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_111_states.bin.z b/client/resources/hardnested_tables/bitflip_1_111_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_111_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_113_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_113_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_113_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_113_states.bin.z b/client/resources/hardnested_tables/bitflip_1_113_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_113_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_115_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_115_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_115_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_115_states.bin.z b/client/resources/hardnested_tables/bitflip_1_115_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_115_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_117_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_117_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_117_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_117_states.bin.z b/client/resources/hardnested_tables/bitflip_1_117_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_117_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_118_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_118_states.bin.bz2 new file mode 100644 index 000000000..2b2bf5915 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_118_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_118_states.bin.z b/client/resources/hardnested_tables/bitflip_1_118_states.bin.z deleted file mode 100644 index 10afd75a4..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_118_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_11a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_11a_states.bin.bz2 new file mode 100644 index 000000000..f7e2d1674 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_11a_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_11a_states.bin.z b/client/resources/hardnested_tables/bitflip_1_11a_states.bin.z deleted file mode 100644 index e0e985fcf..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_11a_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_11b_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_11b_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_11b_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_11b_states.bin.z b/client/resources/hardnested_tables/bitflip_1_11b_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_11b_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_120_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_120_states.bin.bz2 new file mode 100644 index 000000000..fed958a7f Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_120_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_120_states.bin.z b/client/resources/hardnested_tables/bitflip_1_120_states.bin.z deleted file mode 100644 index 750af05d7..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_120_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_122_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_122_states.bin.bz2 new file mode 100644 index 000000000..0e406a019 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_122_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_122_states.bin.z b/client/resources/hardnested_tables/bitflip_1_122_states.bin.z deleted file mode 100644 index 6d04a3c05..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_122_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_128_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_128_states.bin.bz2 new file mode 100644 index 000000000..e02d0729a Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_128_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_128_states.bin.z b/client/resources/hardnested_tables/bitflip_1_128_states.bin.z deleted file mode 100644 index 18d333145..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_128_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_131_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_131_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_131_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_131_states.bin.z b/client/resources/hardnested_tables/bitflip_1_131_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_131_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_135_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_135_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_135_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_135_states.bin.z b/client/resources/hardnested_tables/bitflip_1_135_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_135_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_138_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_138_states.bin.bz2 new file mode 100644 index 000000000..c12c2219a Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_138_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_138_states.bin.z b/client/resources/hardnested_tables/bitflip_1_138_states.bin.z deleted file mode 100644 index bc154b4f7..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_138_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_145_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_145_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_145_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_145_states.bin.z b/client/resources/hardnested_tables/bitflip_1_145_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_145_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_147_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_147_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_147_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_147_states.bin.z b/client/resources/hardnested_tables/bitflip_1_147_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_147_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_148_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_148_states.bin.bz2 new file mode 100644 index 000000000..f9760f6b2 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_148_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_148_states.bin.z b/client/resources/hardnested_tables/bitflip_1_148_states.bin.z deleted file mode 100644 index ec5b774c7..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_148_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_158_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_158_states.bin.bz2 new file mode 100644 index 000000000..ceb8298d8 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_158_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_158_states.bin.z b/client/resources/hardnested_tables/bitflip_1_158_states.bin.z deleted file mode 100644 index 631b39af0..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_158_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_160_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_160_states.bin.bz2 new file mode 100644 index 000000000..6264a1abb Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_160_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_160_states.bin.z b/client/resources/hardnested_tables/bitflip_1_160_states.bin.z deleted file mode 100644 index 32fb4f59a..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_160_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_161_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_161_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_161_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_161_states.bin.z b/client/resources/hardnested_tables/bitflip_1_161_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_161_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_163_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_163_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_163_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_163_states.bin.z b/client/resources/hardnested_tables/bitflip_1_163_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_163_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_165_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_165_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_165_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_165_states.bin.z b/client/resources/hardnested_tables/bitflip_1_165_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_165_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_168_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_168_states.bin.bz2 new file mode 100644 index 000000000..e4ee8cdbb Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_168_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_168_states.bin.z b/client/resources/hardnested_tables/bitflip_1_168_states.bin.z deleted file mode 100644 index af6bf431e..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_168_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_178_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_178_states.bin.bz2 new file mode 100644 index 000000000..ce03d40d3 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_178_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_178_states.bin.z b/client/resources/hardnested_tables/bitflip_1_178_states.bin.z deleted file mode 100644 index 17eec3aa5..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_178_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_180_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_180_states.bin.bz2 new file mode 100644 index 000000000..87d8693df Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_180_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_180_states.bin.z b/client/resources/hardnested_tables/bitflip_1_180_states.bin.z deleted file mode 100644 index d3f655b04..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_180_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_188_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_188_states.bin.bz2 new file mode 100644 index 000000000..e6392a033 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_188_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_188_states.bin.z b/client/resources/hardnested_tables/bitflip_1_188_states.bin.z deleted file mode 100644 index d5012b1d5..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_188_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_191_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_191_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_191_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_191_states.bin.z b/client/resources/hardnested_tables/bitflip_1_191_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_191_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_198_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_198_states.bin.bz2 new file mode 100644 index 000000000..f8e066f82 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_198_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_198_states.bin.z b/client/resources/hardnested_tables/bitflip_1_198_states.bin.z deleted file mode 100644 index ca490c4fc..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_198_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_199_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_199_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_199_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_199_states.bin.z b/client/resources/hardnested_tables/bitflip_1_199_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_199_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_19d_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_19d_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_19d_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_19d_states.bin.z b/client/resources/hardnested_tables/bitflip_1_19d_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_19d_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_19f_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_19f_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_19f_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_19f_states.bin.z b/client/resources/hardnested_tables/bitflip_1_19f_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_19f_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_1a0_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1a0_states.bin.bz2 new file mode 100644 index 000000000..da20250ec Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_1a0_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_1a0_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1a0_states.bin.z deleted file mode 100644 index d6041407c..000000000 --- a/client/resources/hardnested_tables/bitflip_1_1a0_states.bin.z +++ /dev/null @@ -1 +0,0 @@ -xÚíÝMr,Inྚn¢£ê<‚ŽÀÕ¬%ÊHÕ¼™Eå‰ò/hiÖh03ÒÓ?ÿý_ÿñ×þãã}~]Ÿÿûû×Ï_ýõ¿}þõóßþMþùñýÿ}ýŸôéÓ߬ÿ¸þùçŸÿÛòûýôýO?úþð‡ÿ=ìÇÇ·ÞÏ¿Ÿ/–oïÿÎ÷?½®ãÿ³¿æùñÿ›ù¯ÿÆôÿÄÿü?ÿÏÿóÿì?û/ÿøÃþðo‰ÿéÓ§ßÿOë?ÓúSÚþOëOSû¯þ§þÇ~Ñÿ‹ÿ}¿ôéÓWÿSÿÿ‹ÿñÿÕÿÕÿåÿäÿøþÿñÿñŸ>}úôÕÔàùù?ñ¿øÿñ_þ_þŸ>}ñ¿øŸýåÿùþŸýgÿáøÃþíøý÷ÿ¿þ¹ýóûWù¿þNŸ>ý•úÓñÓôzf¿~÷ü×?§Ïÿ+û¸.ÅÿÀ÷wúùÓßûEÿ>öÿõßï½ì?þÓ§O¿T?}mïÿÂ÷/þçÿñ¿—ÿúoü'ÿ'ÿÇÿwúüÇüÿÓ§O_ýGý§9þƒ¿üŸüŸü¿øÿñ_þ_þßø¾ñŸøŸÿçÿùþŸýgÿåÿàøÃþêÿôéÓ7ÿ×ü?óÿÔÿøúò?âü§OŸ¾õÿêæÿ‰ÿÕÿñ_ýß÷'ÿ'ÿ'ÿÇÿ[ÿÿøÿyþ=Éã©¿‘““7ȧ?§ïúùÓ÷‡?üsø§ÏŸÚÞÿíïz~Õ¼ÿÙó·ðÿ»ùßÝñ?¹ñŸøŸÿçÿùþŸýgÿåÿàøÃþï?99y«|Z?™¿²öwZšß_ýOý}"ÿ‹ÿ}Ÿäääêêâñ?þã¿ú¿ú¿üŸüÿÏÿã?þã?þ_%×4­·¥íÇôï§íãvû ÿnüãûnïÿò÷?Þ¿jÌÿôþoøÿ½ü¯ï¿¦ÿ‰ÿùþŸÿçÿÙö_þþð‡?üárrróÍÿ3ÿÏü?ëÉ­ÿ·þÿÉÉÉ­ÿ·þ×úñ¿õÿøoý¿ïOþOþOþÿ·þÿñÿåÿÈÉÉÕÔœÿù?ù?ùñ?þã¿ü¿ïœ\ü/þçÿùþŸÿgÿÙøÃþð‡?üíÿ¯iÚ±ý?†û?÷ŸNïÿ2ÝzhíÿmÿoM³ÿ—ý¿4MÓ6ímÿïÕï_üoÿüïå¿ýÿåÿäÿäÿøÿÖý¿ñÿñ_ü¿4þ¤OŸ~Îþ¾ÿyûŸ½?üáû‘¾¶÷áûÿóûýøþnþ}.¿–ÿOþþçÇüoæ¿þ?Ð7þÿóÿü?ÿÏÿ³ÿì¿üüáøÃþ÷ÞŠ>}ú×ìÿü÷®iý%»ÿó¼ן4­_Mßÿÿ3ßßéçOìý½ûÿŸ¿ÿëì?þÓ§O¿U?¾Oÿw¾ñ?ÿÿ½ü×ã?ù?ù?þ¿Óÿã?þã'ÿÍŸ§Oßü_ó¿Ìÿ‚¿õ?ÖÿXÿoý?þã¿õÖÿ?Ð7þÿóÿü?ÿÏÿ³ÿì¿üüáøÃ_ý>}úïÿë?ãúSÚþOëOCû¯þ§þÇ~Ñÿ‹ÿ}¿ôéÓWÿSÿÿ‹ÿñÿÕÿÕÿåÿäÿøþÿñÿñüþ¿žäñÔßÈÉÉäÓŸÓ÷?ýüéûÃþ9üÓûmïÿö÷?Ý¿jÞÿìþ[øÿÝüïî¿øŸÜøOüÏÿóÿü?ÿÏþ³ÿòð‡?üáÿ÷ÇŸœœ¼Už>¿$m§õ§ùýÕÿÔÿØ'rñ¿øß÷INN®þ§þ'þÿã?þ«ÿ«ÿËÿÉÿñÿü?þã?þã¿ø“>}úyûþþ§Ÿ?}øÃÿöcºÒõû/íêÿÎ÷?½®ãÿ³¿æùñÿ›ù¯ÿÆôÿÄÿü?ÿÏÿóÿì?û/ÿøÃþð_üHŸ¾ó¿œÿãüçÿ8ÿ›~³ýý÷{/ûÿôéÓ/ÕwþwÝù×âþÿ{ù¯ÿÆòòüëùßøÿø/þ§OŸ¾úúOoüù?ù?ùñ?þã¿ü¿ü¿ñ}ã?ñ?ÿÏÿóÿü?ûÏþËÿÁþð‡?üÕÿéÓ§oþ¯ùæÿ©ÿñÿôåÄÿøOŸ>}ëÿÕÿÌÿÿ«ÿã¿ú¿ïOþOþOþÿ·þÿñÿóüÿz’ÇS?~#''oONßÿôó§ïøçðOŸ?µ½ÿÛßÿôüªyÿ³çoá?þwó¿»ÿârã?ñ?ÿÏÿóÿü?ûÏþËÿÁþð‡?üßrròVù´~2eíï´þ4¿¿úŸúûD.þÿû>ÉÉÉÕÿÔÿÄÿâüÇõõù?ù?þŸÿÇüÇü¿J®iZoKÛéßOÛÇíöþÝøÇ÷/ÜÞÿåï¼Õ˜ÿéýßðÿ{ù_ßM3þÿóÿü?ÿÏÿ³ÿì¿üüáøÃþäääæÿšÿgþŸùÖÿ’[ÿoý?þ“““[ÿoý¯õÿâëÿñßúߟüŸüŸüÿoý?þã?þ‹ÿéÓ§cý¬ÿOÛÿüýáÿ{Øo½Ÿ?_,ßÞÿïz]ÇÿgÿÌóã?þ7ó_ÿèÿ‰ÿùþŸÿçÿÙö_þþð‡?üáÿ¾ø¯ßŠ>}úíÿüûñÓôÊïÿ<ëߥö7p]Šÿïïôó§¿?ö‹þêýÿßÿµöÿéÓ§_ªŸ¾¶÷áûÿóÿøßËý7þ“ÿ“ÿãÿ;ý?þã?þÇÿš¦9ÿËù/οó?Ûâòó/Çñë˜ÿéñþã/ÿÿ«iÆâþŸÿçÿùöŸý—ÿƒ?üáøÃŸœœÜù_Îÿqþó®þþØ'ò¬<ýý¦ù‡ÿäää­ñ¿ó¿»Ïÿÿ;ÿÿ{ùßÝþ_þOþÿïõÿøÿøßÉMÓÌÿ5ÿËü/ø[ÿcýõÿÖÿã?þ[ÿgýŸ¦ÿ‰ÿùþŸÿçÿÙö_þþð‡?üá¯þ®iÚæø?}þsÚþOëOCû¯þ§þ§iâñ¿¦išúŸúŸø_üÿø¯þ¯þ/ÿ'ÿÇÿóÿøÿøÿ7â?}úôwëg÷ÿIïÿ’¿?üáûññ­÷óïç‹åÛû¿óýO¯ëøÿìïŸy~üÇÿfþë¿ñ}ã?ñ?ÿÏÿóÿü?ûÏþËÿÁþð‡?ü[âúôé÷ÆÿÓúÏ´þ”¶ÿÓúÓÔþ«ÿ©ÿ±_ôÅÿâß/}úôÕÿÔÿÄÿâüÇõõù?ù?þŸÿÇüÇü§OŸ>}õõøÃ_þEþOü/þÇü—ÿ—ÿ§O_ü/þgùþŸÿgÿÙøÃþð‡;þëÏŸ¢OŸþEç¿ü~ü4½òç¿Ìúw©ý \—âàû;ýüéïý¢¿úü¯Ã÷­ýÇúôé—ꧯíý_øþÅÿü?þ÷ò_ÿÿäÿäÿøÿNÿÿøÿâúôé«ÿ¨ÿ4Çð—ÿ“ÿ“ÿÿã?þËÿËÿ?Ð7þÿóÿü?ÿÏÿ³ÿì¿üüáøÃ_ýŸ>}úæÿšÿgþŸúÿO_þGüÿôéÓ·þ_ýÏü?ñ¿ú?þ«ÿûþäÿäÿäÿøëÿñÿñ?Ïÿ¯'y<õã7rròùôçôýO?úþð‡ÿôùSÛû¿ýýOϯš÷?{þþã7ÿ»û/þ'7þÿóÿü?ÿÏÿ³ÿì¿üüáøÃÿýñ'''o•Oë'óñWÖþNëOóû«ÿ©ÿ±Oäâñ¿ï“œœ\ýOýOü/þÇüWÿWÿ—ÿ“ÿãÿùüÇüÇÿ«äš¦õ¶´ý˜þý´}Ünáß|ÿÂíý_þþÇûWùŸÞÿ ÿñ¿—ÿõý×4ã?ñ?ÿÏÿóÿü?ûÏþËÿÁþð‡?üáONNnþ¯ùæÿ™ÿgý/¹õÿÖÿã?99¹õÿÖÿZÿ/þ·þÿ­ÿ÷ýÉÿÉÿÉÿñÿÖÿã?þã¿ü99¹úúóà/ÿ'ÿ'ÿ/þÇü—ÿ÷ý‘“‹ÿÅÿü?ÿÏÿóÿì?ûøÃþð‡¿ýÿ5M;¶ÿÇpÿçñþÓéý_¦ûOí¯ý¿íÿ­iöÿ²ÿ—¦iÚ¦ý¯íÿ½úý‹ÿíÿÿ½ü·ÿ¿üŸüŸüÿߺÿ7þã?þ‹ÿ—ÆŸôéÓÏÙÿÃ÷?oÿ³÷‡?üoc?Ò×öþ/|ÿ~¿ßßíÏ¿Ïå×òÿÉß?ðüøÿÍü×ãúÆâþŸÿçÿùöŸý—ÿƒ?üáøÃÿÞûOѧOÿšýŸÿÞ5­¿d÷ž÷ïºó“¦õ«éûŸâæû;ýüéïý¢¿wÿÿó÷ýÇúôé·êgâÏ÷éÿÎ÷/þçÿñ¿—ÿúoü'ÿ'ÿÇÿwúüÇüïä¿ùóôé›ÿkþ—ù_ð·þÇúëÿ­ÿÇü·þÏú?ãúÆâþŸÿçÿùöŸý—ÿƒ?üáø«¿Ó§Oÿ]âÿaýg\JÛÿiýihÿÕÿÔÿØ/úâñ¿ï—>}úêêâñ?þã¿ú¿ú¿üŸüÿÏÿã?þã?þßÿד<žúñ99yƒ|úsúþ§Ÿ?}øÃ?‡zÿ±íýßþþ§ûWÍûŸÝ ÿñ¿›ÿÝýÿ“ÿ‰ÿùþŸÿçÿÙö_þþð‡?üáÿþø“““·ÊÓç—¤íï´þ4¿¿úŸúûD.þÿû>ÉÉÉÕÿÔÿÄÿâüÇõõù?ù?þŸÿÇüÇüÒ§O?oÿÏßÿôó§ïøßÃ~L÷Oº~ÿ¥]ýßùþ§×uüö÷Ï}ú¥úÎÿ®;ÿZüÏÿã/ÿõßøOþOþÿo=ÿÿñÿÅÿôéÓWÿQÿéÿà/ÿ'ÿ'ÿ/þÇü—ÿ—ÿ7~ oü'þçÿùþŸÿgÿÙù?øÃþð‡¿ú?}úôÍÿ5ÿÏü?õ?þŸ¾üøÿéÓ§oý¿úŸùâõüWÿ÷ýÉÿÉÿÉÿñÿÖÿã?þãžÿ_OòxêÇoäää òéÏéûŸ~þôýáÿþéó§¶÷ûûŸž_5ïöü-üÇÿnþw÷_üOnü'þçÿùþŸÿgÿÙù?øÃþð‡ÿûãONNÞ*ŸÖOæã¯¬ýÖŸæ÷WÿSÿcŸÈÅÿâß'99¹úŸúŸø_üÿø¯þ¯þ/ÿ'ÿÇÿóÿøÿøÿWÉ5Mëmiû1ýûiû¸Ýþ¿ÿøþ…Ûû¿üý÷¯ó?½ÿþã/ÿëû¯iÆâþŸÿçÿùöŸý—ÿƒ?üáøÃŸœœÜü_óÿÌÿ3ÿÏú_rëÿ­ÿÇrrrëÿ­ÿµþ_üoý?þ[ÿïû“ÿ“ÿ“ÿãÿ­ÿÇüÇñ?}úôo¬ŸõÿiûŸ¿?üáûññ­÷óïç‹åÛû¿óýO¯ëøÿìïŸy~üÇÿfþë¿ñ}ã?ñ?ÿÏÿóÿü?ûÏþËÿÁþð‡?üßÿõûOѧOÿ¢ýŸ?~š^ùýŸgý»Ôþ®Kñ?ðý~þô÷Ç~Ñ_½ÿÿáû¿Öþã?}úôKõÓ×öþ/|ÿâþÿ{ù¯ÿÆòòü§ÿÇüÇÿâø_Ó4ç9ÿÅù/ðwþg[üQ~þå8~ó?=þÃüïå¿ó5ÍøOüÏÿóÿü?ÿÏþ³ÿòð‡?üáø“““;ÿËù?ÎÿqþÏÕßûDž•§¿ß4ÿ🜜¼5þwþw÷ùßâçâ/ÿ»ûÏÿËÿÉÿñÿ½þÿñÿ;ù¯išù¿æ™ÿë¬ÿ±þßúüÇëÿ¬ÿÓ4ã?ñ?ÿÏÿóÿü?ûÏþËÿÁþð‡?üÕß5MÛÿ§ÏNÛÿiýihÿÕÿÔÿ4Mü/þ×4MSÿSÿÿ‹ÿñÿÕÿÕÿåÿäÿøþÿñÿñÿFü§OŸþnýìþ?éý_ò÷‡?üïa?>¾õ~þý|±|{ÿw¾ÿéuÿŸýý3ÏÿøßÌý7~ oü'þçÿùþŸÿgÿÙù?øÃþð‡KüOŸ>ýÞøZÿ™ÖŸÒöZšÚõ?õ?ö‹¾ø_üïû¥OŸ¾úŸúŸø_üÿø¯þ¯þ/ÿ'ÿÇÿóÿøÿøÿôéÓ§¯þ£þøË¿Èÿ‰ÿÅÿøÿòÿòÿôé‹ÿÅÿì/ÿÏÿóÿì?ûøÃþðoÇýùSôéÓ¿èü—ߟ¦Wþü—Yÿ.µ¿ëRü|§Ÿ?ýý±_ôWŸÿuøþ¯µÿøOŸ>ýRýôµ½ÿ ß¿øŸÿÇÿ^þë¿ñŸüŸüÿßéÿñÿñ_üOŸ>}õõŸæøþòòòÿâüÇùùãúÆâþŸÿçÿùöŸý—ÿƒ?üáø«ÿÓ§Oßü_óÿÌÿSÿãÿéËÿˆÿñŸ>}úÖÿ«ÿ™ÿ'þWÿÇõߟüŸüŸüÿoý?þã?þçùÿõ$§~üFNNÞ Ÿþœ¾ÿéçOßþðÏáŸ>j{ÿ·¿ÿéùUóþgÏßÂüïæwÿÅÿäÆâþŸÿçÿùöŸý—ÿƒ?üáø¿?þäää­òiýd>þÊÚßiýi~õ?õ?ö‰\ü/þ÷}’““«ÿ©ÿ‰ÿÅÿøÿêÿêÿòòü?ÿÿøÿø•\Ó´Þ–¶Ó¿Ÿ¶Ûí/ü»ñï_¸½ÿËßÿxÿª1ÿÓû¿á?þ÷ò¿¾ÿšfü'þçÿùþŸÿgÿÙù?øÃþð‡?üÉÉÉÍÿ5ÿÏü?óÿ¬ÿ%·þßúü'''·þßú_ëÿÅÿÖÿã¿õÿ¾?ù?ù?ù?þßúüÇü—ÿ#''WÿQÿqþüåÿäÿäÿÅÿøÿòÿ¾?rrñ¿øŸÿçÿùþŸýgÿáøÃþð·ÿ¿¦iÇöÿîÿ<Þ:½ÿËtÿé¡ýµÿ·ý¿5Íþ_öÿÒ4MÛ´ÿµý¿W¿ñ¿ýÿñ¿—ÿöÿ—ÿ“ÿ“ÿãÿ[÷ÿÆüÇñÿÒø“>}ú9ûøþçíöþð‡ÿmìGúÚÞÿ…ïÿÏï÷ãû»ýù÷¹üZþ?ùûžÿñ¿™ÿúoü@ßøOüÏÿóÿü?ÿÏþ³ÿòð‡?üáøß{ÿ)úôé_³ÿóß»¦õ—ìþÏóþ]w~Ò´~5}ÿSüÏ|§Ÿ?ýý±_ô÷îÿþþ¯³ÿøOŸ>ýVýLüù>ýßùþÅÿü?þ÷ò_ÿÿäÿäÿøÿNÿÿøÿü7ž>}óÍÿ2ÿ þÖÿXÿcý¿õÿøÿÖÿYÿgü@ßøOüÏÿóÿü?ÿÏþ³ÿòð‡?üáõwúôé¿Kü?¬ÿŒëOiû?­? í¿úŸúûE_ü/þ÷ýÒ§O_ýOýOü/þÇüWÿWÿ—ÿ“ÿãÿùüÇüÇÿñûÿz’ÇS?~#''oONßÿôó§ïøçðOï?¶½ÿÛßÿtÿªyÿ³ûoá?þwó¿»ÿârã?ñ?ÿÏÿóÿü?ûÏþËÿÁþð‡?üßrròVyúü’´ýÖŸæ÷WÿSÿcŸÈÅÿâß'99¹úŸúŸø_üÿø¯þ¯þ/ÿ'ÿÇÿóÿøÿøÿâOúôéçíÿùûŸ~þôýáÿ{ØéþI×ï¿´«ÿ;ßÿôºŽÿÏþþ™çÇüoæ¿þ?Ð7þÿóÿü?ÿÏÿ³ÿì¿üüáøÃÿ}ñwþ!}úÎÿrþóœÿãüoúÍöÿõßï½ì?þÓ§O¿Tßùßuç_‹ÿùüïå¿þÿÉÿÉÿñÿ­çã?þã¿øŸ>}úê?ê?½ñüåÿäÿäÿÅÿøÿòÿòÿÆôÿÄÿü?ÿÏÿóÿì?û/ÿøÃþðWÿ§OŸ¾ù¿æÿ™ÿ§þÇÿÓ—ÿÿã?}úô­ÿWÿ3ÿOü¯þÿêÿ¾?ù?ù?ù?þßúüÇüÏóÿëIOýøœœ¼A>ý9}ÿÓÏŸ¾?üáŸÃ?}þÔöþoÿÓó«æýÏž¿…ÿøßÍÿîþ‹ÿÉÿÄÿü?ÿÏÿóÿì?û/ÿøÃþðüÉÉÉ[åÓúÉ|ü•µ¿ÓúÓüþêêì¹ø_üïû$''WÿSÿÿ‹ÿñÿÕÿÕÿåÿäÿøþÿñÿñÿ*¹¦i½-m?¦?m·Û_øwãß¿p{ÿ—¿ÿñþUcþ§÷Ãüïå}ÿ5ÍøOüÏÿóÿü?ÿÏþ³ÿòð‡?üáø“““›ÿkþŸùæÿYÿKný¿õÿøONNný¿õ¿Öÿ‹ÿ­ÿÇëÿ}òòòü¿õÿøÿø/þ§OŸþõ³þ?mÿó÷‡?üïa?>¾õ~þý|±|{ÿw¾ÿéuÿŸýý3ÏÿøßÌý7~ oü'þçÿùþŸÿgÿÙù?øÃþð‡ÿûâ¿~ÿ)úôé_´ÿóïÇOÓ+¿ÿó¬—ÚßÀu)þ¾¿ÓÏŸþþØ/ú«÷ÿ?|ÿ×Úü§OŸ~©~úÚÞÿ…ï_üÏÿã/ÿõßøOþOþÿïôÿøÿø_ÿkšæü/ç¿8ÿþÎÿl‹?ÊÏ¿ǯcþ§Çøÿ½üwþ¯¦ÿ‰ÿùþŸÿçÿÙö_þþð‡?üárrrç9ÿÇù?Îÿ¹úûcŸÈ³òô÷›æþ“““·ÆÿÎÿî>ÿ[üïüOüïåwÿùù?ù?þ¿×ÿã?þã'ÿ5M3ÿ×ü/ó¿àoýõ?Öÿ[ÿÿøoýŸõšfü'þçÿùþŸÿgÿÙù?øÃþð‡¿ú»¦i›ãÿôùÏiû?­? í¿úŸúŸ¦‰ÿÅÿš¦iêêâñ?þã¿ú¿ú¿üŸüÿÏÿã?þã?þ߈ÿôéÓß­ŸÝÿ'½ÿKþþð‡ÿ=ìÇÇ·ÞÏ¿Ÿ/–oïÿÎ÷?½®ãÿ³¿æùñÿ›ù¯ÿÆôÿÄÿü?ÿÏÿóÿì?û/ÿøÃþðo‰ÿéÓ§ßÿOë?ÓúSÚþOëOSû¯þ§þÇ~Ñÿ‹ÿ}¿ôéÓWÿSÿÿ‹ÿñÿÕÿÕÿåÿäÿøþÿñÿñŸ>}úôÕÔàùù?ñ¿øÿñ_þ_þŸ>}ñ¿øŸýåÿùþŸýgÿáøÃþíø¯?Š>}úÿòûñÓôÊŸÿ2ëߥö7p]Šÿïïôó§¿?ö‹þêó¿ßÿµöÿéÓ§_ªŸ¾¶÷áûÿóÿøßËý7þ“ÿ“ÿãÿ;ý?þã?þ‹ÿéÓ§¯þ£þÓÿÁ_þOþOþ_üÿø/ÿ/ÿoü@ßøOüÏÿóÿü?ÿÏþ³ÿòð‡?üáõúôé›ÿkþŸùêü?}ùñ?þÓ§Oßúõ?óÿÄÿêÿø¯þïû“ÿ“ÿ“ÿãÿ­ÿÇüÇÿ<ÿ¿žäñÔßÈÉÉäÓŸÓ÷?ýüéûÃþ9üÓçOmïÿö÷?=¿jÞÿìù[øÿÝüïî¿øŸÜøOüÏÿóÿü?ÿÏþ³ÿòð‡?üáÿ÷ÇŸœœ¼U>­ŸÌÇ_Yû;­?Íï¯þ§þÇ>‘‹ÿÅÿ¾Orrrõ?õ?ñ¿øÿñ_ý_ý_þOþÿçÿñÿñÿ¯’kšÖÛÒöcú÷Óöq»ý…7þñý ·÷ùûï_5æzÿ7üÇÿ^þ×÷_ÓŒÿÄÿü?ÿÏÿóÿì?û/ÿøÃþð‡?99¹ù¿æÿ™ÿgþŸõ¿äÖÿ[ÿÿäääÖÿ[ÿký¿øßúü·þß÷'ÿ'ÿ'ÿÇÿ[ÿÿøÿòäääê?ê?Îÿ¿üŸüŸü¿øÿñ_þß÷GN.þÿóÿü?ÿÏÿ³ÿì?üáøÃþöÿ×4íØþÃýŸÇûO§÷™î?=´¿öÿ¶ÿ·¦ÙÿËþ_š¦i›ö¿¶ÿ÷ê÷/þ·ÿ?þ÷òßþÿòòòüëþßøÿø/þ_Ò§O?gÿßÿ¼ýÏÞþð¿ýH_Ûû¿ðýÿùý~|·?ÿ>—_Ëÿ'ÿÀóã?þ7ó_ÿèÿ‰ÿùþŸÿçÿÙö_þþð‡?üáÿ{ï?EŸ>ýköþ{×´þ’ÝÿyÞ¿ëÎOšÖ¯¦ïŠÿ™ïïôó§¿?ö‹þÞýÿÏßÿuöÿéӧߪŸ‰?ß§ÿ;ß¿øŸÿÇÿ^þë¿ñŸüŸüÿßéÿñÿñ¿“ÿæÏÓ§oþ¯ù_æÁßúë¬ÿ·þÿñßú?ëÿŒèÿ‰ÿùþŸÿçÿÙö_þþð‡?üá¯þNŸ>ýw‰ÿ‡õŸqý)mÿ§õ§¡ýWÿSÿc¿è‹ÿÅÿ¾_úôé«ÿ©ÿ‰ÿÅÿøÿêÿêÿòòü?ÿÿøÿø?~ÿ_OòxêÇoäää òéÏéûŸ~þôýáÿþéýǶ÷ûûŸî_5ïvÿ-üÇÿnþw÷_üOnü'þçÿùþŸÿgÿÙù?øÃþð‡ÿûãONNÞ*OŸ_’¶¿ÓúÓüþêêì¹ø_üïû$''WÿSÿÿ‹ÿñÿÕÿÕÿåÿäÿøþÿñÿñ_üIŸ>ý¼ý?ÿÓÏŸ¾?üáû1Ý?éúý—võçûŸ^×ñÿÙß?óüøÿÍü×ãúÆâþŸÿçÿùöŸý—ÿƒ?üáø¿/þÎ?¤Oßù_ÎÿqþóœÿM¿Ùþ¿þû½—ýÇúôé—ê;ÿ»îükñ?ÿÿ½ü×ã?ù?ù?þ¿õüoüÇüÿÓ§O_ýGý§7þƒ¿üŸüŸü¿øÿñ_þ_þßø¾ñŸøŸÿçÿùþŸýgÿåÿàøÃþêÿôéÓ7ÿ×ü?óÿÔÿøúò?âü§OŸ¾õÿêæÿ‰ÿÕÿñ_ýß÷'ÿ'ÿ'ÿÇÿ[ÿÿøÿyþ=Éã©¿‘““7ȧ?§ïúùÓ÷‡?üsø§ÏŸÚÞÿíïz~Õ¼ÿÙó·ðÿ»ùßÝñ?¹ñŸøŸÿçÿùþŸýgÿåÿàøÃþï?99y«|Z?™¿²öwZšß_ýOý}"ÿ‹ÿ}Ÿäääêêâñ?þã¿ú¿ú¿üŸüÿÏÿã?þã?þ_%×4­·¥íÇôï§íãvû ÿnüãûnïÿò÷?Þ¿jÌÿôþoøÿ½ü¯ï¿¦ÿ‰ÿùþŸÿçÿÙö_þþð‡?üárrróÍÿ3ÿÏü?ëÉ­ÿ·þÿÉÉÉ­ÿ·þ×úñ¿õÿøoý¿ïOþOþOþÿ·þÿñÿÅÿôéÓ¿±~Öÿ§íþþð‡ÿ=ìÇÇ·ÞÏ¿Ÿ/–oïÿÎ÷?½®ãÿ³¿æùñÿ›ù¯ÿÆôÿÄÿü?ÿÏÿóÿì?û/ÿøÃþð_ü×ï?EŸ>ý‹öþýøizå÷žõïRû¸.ÅÿÀ÷wúùÓßûEõþÿ‡ïÿZûÿôéÓ/ÕO_Ûû¿ðý‹ÿùüïå¿þÿÉÿÉÿñÿþÿñÿ‹ãMÓœÿåüç¿ÀßùŸmñGùù—ãøuÌÿôøÿñ¿—ÿÎÿÕ4ã?ñ?ÿÏÿóÿü?ûÏþËÿÁþð‡?üáONNîü/çÿ8ÿÇù?WìyVžþ~ÓüÃrròÖøßùßÝç‹ÿÿ‰ÿ½üïî?ÿ/ÿ'ÿÇÿ÷úüÇüï俦iæÿšÿeþü­ÿ±þÇúëÿñÿ­ÿ³þOÓŒÿÄÿü?ÿÏÿóÿì?û/ÿøÃþðW×4msüŸ>ÿ9mÿ§õ§¡ýWÿSÿÓ4ñ¿ø_Ó4MýOýOü/þÇüWÿWÿ—ÿ“ÿãÿùüÇüÇÿñŸ>}ú»õ³ûÿ¤÷Éßþð¿‡ýøøÖûù÷óÅòíýßùþ§×uüö÷Ï}úêêâñ?þã¿ú¿ú¿üŸüÿÏÿã?þã?þÓ§OŸ¾úúüá/ÿ"ÿ'þÿã?þËÿËÿÓ§/þÿ³¿ü?ÿÏÿ³ÿì?üáøÃ¿ÿõçOѧOÿ¢ó_~?~š^ùó_fý»Ôþ®Kñ?ðý~þô÷Ç~Ñ_}þ×áû¿Öþã?}úôKõÓ×öþ/|ÿâþÿ{ù¯ÿÆòòü§ÿÇüÇñ?}úôÕÔšã?øËÿÉÿÉÿ‹ÿñÿåÿåÿèÿ‰ÿùþŸÿçÿÙö_þþð‡?üá¯þOŸ>}óÍÿ3ÿOýÿ§/ÿ#þÇúôé[ÿ¯þgþŸø_ýÿÕÿ}òòòü¿õÿøÿøŸçÿד<žúñ99yƒ|úsúþ§Ÿ?}øÃ?‡úü©íýßþþ§çWÍûŸ= ÿñ¿›ÿÝýÿ“ÿ‰ÿùþŸÿçÿÙö_þþð‡?üáÿþø“““·Ê§õ“ùø+k§õ§ùýÕÿÔÿØ'rñ¿øß÷INN®þ§þ'þÿã?þ«ÿ«ÿËÿÉÿñÿü?þã?þãÿUrMÓz[Ú~Lÿ~Ú>n·¿ðïÆ?¾áöþ/ÿãý«ÆüOïÿ†ÿøßËÿúþkšñŸøŸÿçÿùþŸýgÿåÿàøÃþð'''7ÿ×ü?óÿÌÿ³þ—ÜúëÿñŸœœÜúë­ÿÿ[ÿÿÖÿûþäÿäÿäÿøëÿñÿñ_þœœ\ýGýÇù?ð—ÿ“ÿ“ÿÿã?þËÿûþÈÉÅÿâþŸÿçÿùöŸý‡?üáøÃßþÿš¦Ûÿc¸ÿóxÿéôþ/Óý§‡ö×þßöÿÖ4ûÙÿKÓ4mÓþ×öÿ^ýþÅÿöÿÇÿ^þÛÿ_þOþOþÿoÝÿÿñÿÅÿKãOúôéçìÿáûŸ·ÿÙûÃþ·±ék{ÿ¾ÿ?¿ßïïöçßçòkùÿäïx~üÇÿfþë¿ñ}ã?ñ?ÿÏÿóÿü?ûÏþËÿÁþð‡?üáïý§èÓ§ÍþÏïšÖ_²û?ÏûwÝùIÓúÕôýOñ?óý~þô÷Ç~Ñß»ÿÿùû¿Îþã?}úô[õ3ñçûôçûÿóÿøßËý7þ“ÿ“ÿãÿ;ý?þã?þwòßüyúôÍÿ5ÿËü/ø[ÿcýõÿÖÿã?þ[ÿgýŸñ}ã?ñ?ÿÏÿóÿü?ûÏþËÿÁþð‡?üÕßéÓ§ÿ.ñÿ°þ3®?¥íÿ´þ4´ÿêêì}ñ¿øß÷KŸ>}õ?õ?ñ¿øÿñ_ý_ý_þOþÿçÿñÿñÿÇïÿëIOýøœœ¼A>ý9}ÿÓÏŸ¾?üáŸÃ?½ÿØöþoÿÓý«æýÏî¿…ÿøßÍÿîþ‹ÿÉÿÄÿü?ÿÏÿóÿì?û/ÿøÃþðüÉÉÉ[åéóKÒöwZšß_ýOý}"ÿ‹ÿ}Ÿäääêêâñ?þã¿ú¿ú¿üŸüÿÏÿã?þã?þ‹?éÓ§Ÿ·ÿçïúùÓ÷‡?üïa?¦û']¿ÿÒ®þï|ÿÓë:þ?ûûgžÿñ¿™ÿúoü@ßøOüÏÿóÿü?ÿÏþ³ÿòð‡?üáÿ÷Åßù‡ôé;ÿËù?Îÿqþó¿é7Ûÿ׿÷²ÿøOŸ>ýR}ç×-þçÿñ¿—ÿúoü'ÿ'ÿÇÿ·žÿÿøÿâúôé«ÿ¨ÿôÆð—ÿ“ÿ“ÿÿã?þËÿËÿ?Ð7þÿóÿü?ÿÏÿ³ÿì¿üüáøÃ_ýŸ>}úæÿšÿgþŸúÿO_þGüÿôéÓ·þ_ýÏü?ñ¿ú?þ«ÿûþäÿäÿäÿøëÿñÿñ?Ïÿ¯'y<õã7rròùôçôýO?úþð‡ÿôùSÛû¿ýýOϯš÷?{þþã7ÿ»û/þ'7þÿóÿü?ÿÏÿ³ÿì¿üüáøÃÿýñ'''o•Oë'óñWÖþNëOóû«ÿ©ÿ±Oäâñ¿ï“œœ\ýOýOü/þÇüWÿWÿ—ÿ“ÿãÿùüÇüÇÿ«äš¦õ¶´ý˜þý´}Ünáß|ÿÂíý_þþÇûWùŸÞÿ ÿñ¿—ÿõý×4ã?ñ?ÿÏÿóÿü?ûÏþËÿÁþð‡?üáONNnþ¯ùæÿ™ÿgý/¹õÿÖÿã?99¹õÿÖÿZÿ/þ·þÿ­ÿ÷ýÉÿÉÿÉÿñÿÖÿã?þã¿øŸ>}ú7ÖÏúÿ´ýÏßþð¿‡ýøøÖûù÷óÅòíýßùþ§×uüö÷Ï}ú¥úék{ÿ¾ñ?ÿÿ½ü×ã?ù?ù?þ¿Óÿã?þãqü¯išó¿œÿâüø;ÿ³-þ(?ÿr¿ŽùŸÿá?þ÷òßù¿šfü'þçÿùþŸÿgÿÙù?øÃþð‡?üÉÉÉÿåüçÿ8ÿçêï}"ÏÊÓßošøONNÞÿ;ÿ»ûüoñ¿ó?ñ¿—ÿÝýçÿåÿäÿøÿ^ÿÿøÿü×4Íü_ó¿Ìÿ‚¿õ?ÖÿXÿoý?þã¿õÖÿišñŸøŸÿçÿùþŸýgÿåÿàøÃþêmŽÿÓç?§íÿ´þ4´ÿêêš&þÿkš¦©ÿ©ÿ‰ÿÅÿøÿêÿêÿòòü?ÿÿøÿø#þÓ§O·~vÿŸôþ/ùûÃþ÷°ßz?ÿ~¾X¾½ÿ;ßÿôºŽÿÏþþ™çÇüoæ¿þ?Ð7þÿóÿü?ÿÏÿ³ÿì¿üüáøÃ¿%þ§OŸ~oü?­ÿLëOiû?­?Mí¿úŸúûE_ü/þ÷ýÒ§O_ýOýOü/þÇüWÿWÿ—ÿ“ÿãÿùüÇüÇúôéÓWÿQÿ?üå_äÿÄÿâüÇùùúôÅÿâö—ÿçÿùöŸý‡?üáø·ã¿þü)úôé_tþËïÇOÓ+þˬ—ÚßÀu)þ¾¿ÓÏŸþþØ/ú«Ïÿ:|ÿ×Úü§OŸ~©~úÚÞÿ…ï_üÏÿã/ÿõßøOþOþÿïôÿøÿø/þ§OŸ¾úúOsüù?ù?ùñ?þã¿ü¿ü¿ñ}ã?ñ?ÿÏÿóÿü?ûÏþËÿÁþð‡?üÕÿéÓ§oþ¯ùæÿ©ÿñÿôåÄÿøOŸ>}ëÿÕÿÌÿÿ«ÿã¿ú¿ïOþOþOþÿ·þÿñÿóüÿz’ÇS?~#''oONßÿôó§ïøçðOŸ?µ½ÿÛßÿôüªyÿ³çoá?þwó¿»ÿârã?ñ?ÿÏÿóÿü?ûÏþËÿÁþð‡?üßrròVù´~2eíï´þ4¿¿úŸúûD.þÿû>ÉÉÉÕÿÔÿÄÿâüÇõõù?ù?þŸÿÇüÇü¿J®iZoKÛéßOÛÇíöþÝøÇ÷/ÜÞÿåï¼Õ˜ÿéýßðÿ{ù_ßM3þÿóÿü?ÿÏÿ³ÿì¿üüáøÃþäääæÿšÿgþŸùÖÿ’[ÿoý?þ“““[ÿoý¯õÿâëÿñßúߟüŸüŸüÿoý?þã?þËÿ‘““«ÿ¨ÿ8ÿþòòòÿâüÇùß9¹ø_üÏÿóÿü?ÿÏþ³ÿð‡?üáøÛÿ_Ó´cû ÷ï?ÞÿeºÿôÐþÚÿÛþßšfÿ/ûiš¦mÚÿÚþ߫߿øßþÿøßËûÿËÿÉÿÉÿñÿ­ûã?þã¿øiüIŸ>ýœý?|ÿóö?{øÃÿ6ö#}mïÿÂ÷ÿç÷ûñýÝþüû\~-ÿŸüýÏÿøßÌý7~ oü'þçÿùþŸÿgÿÙù?øÃþð‡?üï½ÿ}úô¯Ùÿùï]ÓúKvÿçyÿ®;?iZ¿š¾ÿ)þg¾¿ÓÏŸþþØ/ú{÷ÿ?ÿ×Ùü§OŸ~«~&þ|Ÿþï|ÿâþÿ{ù¯ÿÆòòü§ÿÇüÇÿNþ›?OŸ¾ù¿æ™ÿë¬ÿ±þßúüÇëÿ¬ÿ3~ oü'þçÿùþŸÿgÿÙù?øÃþð‡¿ú;}úôß%þÖÆõ§´ýŸÖŸ†ö_ýOýý¢/þÿû~éÓ§¯þ§þ'þÿã?þ«ÿ«ÿËÿÉÿñÿü?þã?þãÿøý=Éã©¿‘““7ȧ?§ïúùÓ÷‡?üsø§÷ÛÞÿíïºÕ¼ÿÙý·ðÿ»ùßÝñ?¹ñŸøŸÿçÿùþŸýgÿåÿàøÃþï?99y«<}~IÚþNëOóû«ÿ©ÿ±Oäâñ¿ï“œœ\ýOýOü/þÇüWÿWÿ—ÿ“ÿãÿùüÇüÇñ'}úôóöÿüýO?úþð‡ÿ=ìÇtÿ¤ë÷_ÚÕÿïz]ÇÿgÿÌóã?þ7ó_ÿèÿ‰ÿùþŸÿçÿÙö_þþð‡?üáÿ¾ø;ÿ>}ç9ÿÇù?Îÿqþ7ýfûÿúï÷^öÿéÓ§_ªïüïºó¯Åÿü?þ÷ò_ÿÿäÿäÿøÿÖó¿ñÿñ_üOŸ>}õõŸÞøþòòòÿâüÇùùãúÆâþŸÿçÿùöŸý—ÿƒ?üáø«ÿÓ§Oßü_óÿÌÿSÿãÿéËÿˆÿñŸ>}úÖÿ«ÿ™ÿ'þWÿÇõߟüŸüŸüÿoý?þã?þçùÿõ$§~üFNNÞ Ÿþœ¾ÿéçOßþðÏáŸ>j{ÿ·¿ÿéùUóþgÏßÂüïæwÿÅÿäÆâþŸÿçÿùöŸý—ÿƒ?üáø¿?þäää­òiýd>þÊÚßiýi~õ?õ?ö‰\ü/þ÷}’““«ÿ©ÿ‰ÿÅÿøÿêÿêÿòòü?ÿÿøÿø•\Ó´Þ–¶Ó¿Ÿ¶Ûí/ü»ñï_¸½ÿËßÿxÿª1ÿÓû¿á?þ÷ò¿¾ÿšfü'þçÿùþŸÿgÿÙù?øÃþð‡?üÉÉÉÍÿ5ÿÏü?óÿ¬ÿ%·þßúü'''·þßú_ëÿÅÿÖÿã¿õÿ¾?ù?ù?ù?þßúüÇüÿÓ§OÿÆúYÿŸ¶ÿùûÃþ÷°ßz?ÿ~¾X¾½ÿ;ßÿôºŽÿÏþþ™çÇüoæ¿þ?Ð7þÿóÿü?ÿÏÿ³ÿì¿üüáøÃÿ}ñ_¿ÿ}úô/Úÿù÷ã§é•ßÿyÖ¿KíoàºÿßßéçOìýÕûÿ¾ÿkí?þÓ§O¿T?}mïÿÂ÷/þçÿñ¿—ÿúoü'ÿ'ÿÇÿwúüÇü/Žÿ5Msþ—ó_œÿç¶Ååç_Žã×1ÿÓã?üÇÿ^þ;ÿWÓŒÿÄÿü?ÿÏÿóÿì?û/ÿøÃþð‡?99¹ó¿œÿãüçÿ\ýý±OäYyúûMóÿÉÉÉ[ãçwŸÿ-þwþ'þ÷ò¿»ÿü¿üŸüÿßëÿñÿñ¿“ÿš¦™ÿkþ—ù_ð·þÇúëÿ­ÿÇü·þÏú?M3þÿóÿü?ÿÏÿ³ÿì¿üüáøÃ_ý]Ó´Íñúüç´ýŸÖŸ†ö_ýOýOÓÄÿâMÓ4õ?õ?ñ¿øÿñ_ý_ý_þOþÿçÿñÿñÿoÄúôéïÖÏîÿ“Þÿ%øÃÿöãã[ïçßÏË·÷çûŸ^×ñÿÙß?óüøÿÍü×ãúÆâþŸÿçÿùöŸý—ÿƒ?üáø·ÄÿôéÓïÿ§õŸiý)mÿ§õ§©ýWÿSÿc¿è‹ÿÅÿ¾_úôé«ÿ©ÿ‰ÿÅÿøÿêÿêÿòòü?ÿÿøÿøOŸ>}úê?ê?ð‡¿ü‹üŸø_üÿø/ÿ/ÿOŸ¾ø_üÏþòÿü?ÿÏþ³ÿð‡?üáÿvüן?EŸ>ý‹ÎùýøizåÏ™õïRû¸.ÅÿÀ÷wúùÓßûEõù_‡ïÿZûÿôéÓ/ÕO_Ûû¿ðý‹ÿùüïå¿þÿÉÿÉÿñÿþÿñÿÅÿôéÓWÿQÿiŽÿà/ÿ'ÿ'ÿ/þÇü—ÿ—ÿ7~ oü'þçÿùþŸÿgÿÙù?øÃþð‡¿ú?}úôÍÿ5ÿÏü?õ?þŸ¾üøÿéÓ§oý¿úŸùâõüWÿ÷ýÉÿÉÿÉÿñÿÖÿã?þãžÿ_OòxêÇoäää òéÏéûŸ~þôýáÿþéó§¶÷ûûŸž_5ïöü-üÇÿnþw÷_üOnü'þçÿùþŸÿgÿÙù?øÃþð‡ÿûãONNÞ*ŸÖOæã¯¬ýÖŸæ÷WÿSÿcŸÈÅÿâß'99¹úŸúŸø_üÿø¯þ¯þ/ÿ'ÿÇÿóÿøÿøÿWÉ5Mëmiû1ýûiû¸Ýþ¿ÿøþ…Ûû¿üý÷¯ó?½ÿþã/ÿëû¯iÆâþŸÿçÿùöŸý—ÿƒ?üáøÃŸœœÜü_óÿÌÿ3ÿÏú_rëÿ­ÿÇrrrëÿ­ÿµþ_üoý?þ[ÿïû“ÿ“ÿ“ÿãÿ­ÿÇüÇù?rrrõõçÿÀ_þOþOþ_üÿø/ÿïû#'ÿ‹ÿùþŸÿçÿÙöþð‡?üáûÿkšvlÿáþÏãý§Óû¿L÷ŸÚ_ûÛÿ[Óìÿeÿ/MÓ´Mû_Ûÿ{õûÿÛÿÿ{ùoÿù?ù?ù?þ¿uÿoüÇüÿ/?éÓ§Ÿ³ÿ‡ïÞþgïøßÆ~¤¯íý_øþÿü~?¾¿ÛŸŸË¯åÿ“¿àùñÿ›ù¯ÿÆôÿÄÿü?ÿÏÿóÿì?û/ÿøÃþð‡ÿ½÷Ÿ¢OŸþ5û?ÿ½kZÉîÿ<ïßuç'MëWÓ÷?ÅÿÌ÷wúùÓßûEïþÿçïÿ:ûÿôéÓoÕÏÄŸïÓÿï_üÏÿã/ÿõßøOþOþÿïôÿøÿøßÉóçéÓ7ÿ×ü/ó¿àoýõ?Öÿ[ÿÿøoýŸõÆôÿÄÿü?ÿÏÿóÿì?û/ÿøÃþðW§OŸþ»ÄÿÃúϸþ”¶ÿÓúÓÐþ«ÿ©ÿ±_ôÅÿâß/}úôÕÿÔÿÄÿâüÇõõù?ù?þŸÿÇüÇü¿ÿ¯'y<õã7rròùôçôýO?úþð‡ÿôþcÛû¿ýýO÷¯š÷?»ÿþã7ÿ»û/þ'7þÿóÿü?ÿÏÿ³ÿì¿üüáøÃÿýñ'''o•§Ï/IÛßiýi~õ?õ?ö‰\ü/þ÷}’““«ÿ©ÿ‰ÿÅÿøÿêÿêÿòòü?ÿÿøÿø/þ¤OŸ~ÞþŸ¿ÿéçOßþð¿‡ý˜îŸtýþK»ú¿óýO¯ëøÿìïŸy~üÇÿfþë¿ñ}ã?ñ?ÿÏÿóÿü?ûÏþËÿÁþð‡?üßçÒ§ïü/çÿ8ÿÇù?Îÿ¦ßlÿ_ÿýÞËþã?}úôKõÿ]wþµøŸÿÇÿ^þë¿ñŸüŸüÿßzþ7þã?þ‹ÿéÓ§¯þ£þÓÿÁ_þOþOþ_üÿø/ÿ/ÿoü@ßøOüÏÿóÿü?ÿÏþ³ÿòð‡?üáõúôé›ÿkþŸùêü?}ùñ?þÓ§Oßúõ?óÿÄÿêÿø¯þïû“ÿ“ÿ“ÿãÿ­ÿÇüÇÿ<ÿ¿žäñÔßÈÉÉäÓŸÓ÷?ýüéûÃþ9üÓçOmïÿö÷?=¿jÞÿìù[øÿÝüïî¿øŸÜøOüÏÿóÿü?ÿÏþ³ÿòð‡?üáÿ÷ÇŸœœ¼U>­ŸÌÇ_Yû;­?Íï¯þ§þÇ>‘‹ÿÅÿ¾Orrrõ?õ?ñ¿øÿñ_ý_ý_þOþÿçÿñÿñÿ¯’kšÖÛÒöcú÷Óöq»ý…7þñý ·÷ùûï_5æzÿ7üÇÿ^þ×÷_ÓŒÿÄÿü?ÿÏÿóÿì?û/ÿøÃþð‡?99¹ù¿æÿ™ÿgþŸõ¿äÖÿ[ÿÿäääÖÿ[ÿký¿øßúü·þß÷'ÿ'ÿ'ÿÇÿ[ÿÿøÿâúôéßX?ëÿÓö?øÃÿöãã[ïçßÏË·÷çûŸ^×ñÿÙß?óüøÿÍü×ãúÆâþŸÿçÿùöŸý—ÿƒ?üáø¿/þë÷Ÿ¢OŸþEû?ÿ~ü4½òû?Ïúw©ý \—âàû;ýüéïý¢¿zÿÿÃ÷­ýÇúôé—ꧯíý_øþÅÿü?þ÷ò_ÿÿäÿäÿøÿNÿÿøÿÅñ¿¦iÎÿrþ‹ó_àïü϶ø£üüËqü:æzü‡ÿøßËçÿjšñŸøŸÿçÿùþŸýgÿåÿàøÃþð'''wþ—óœÿãüŸ«¿?ö‰<+O¿iþá?99yküïüïîó¿ÅÿÎÿÄÿ^þw÷Ÿÿ—ÿ“ÿãÿ{ý?þã?þwò_Ó4óÍÿ2ÿ þÖÿXÿcý¿õÿøÿÖÿYÿ§iÆâþŸÿçÿùöŸý—ÿƒ?üáø«¿kš¶9þOŸÿœ¶ÿÓúÓÐþ«ÿ©ÿišø_ü¯iš¦þ§þ'þÿã?þ«ÿ«ÿËÿÉÿñÿü?þã?þãÿøOŸ>ýÝúÙýÒû¿äïøßÃ~||ëýüûùbùöþï|ÿÓë:þ?ûûgžÿñ¿™ÿúoü@ßøOüÏÿóÿü?ÿÏþ³ÿòð‡?üáÿ–øŸ>}ú½ñÿ´þ3­?¥íÿ´þ4µÿêêì}ñ¿øß÷KŸ>}õ?õ?ñ¿øÿñ_ý_ý_þOþÿçÿñÿñÿéÓ§O_ýGýþð—‘ÿÿ‹ÿñÿåÿåÿéÓÿ‹ÿÙ_þŸÿçÿÙöþð‡?üáߎÿúó§èÓ§Ñù/¿?M¯üù/³þ]j×¥øøþN?úûc¿è¯>ÿëðý_kÿñŸ>}ú¥úék{ÿ¾ñ?ÿÿ½ü×ã?ù?ù?þ¿Óÿã?þã¿øŸ>}úê?ê?ÍñüåÿäÿäÿÅÿøÿòÿòÿÆôÿÄÿü?ÿÏÿóÿì?û/ÿøÃþðWÿ§OŸ¾ù¿æÿ™ÿ§þÇÿÓ—ÿÿã?}úô­ÿWÿ3ÿOü¯þÿêÿ¾?ù?ù?ù?þßúüÇüÏóÿëIOýøœœ¼A>ý9}ÿÓÏŸ¾?üáŸÃ?}þÔöþoÿÓó«æýÏž¿…ÿøßÍÿîþ‹ÿÉÿÄÿü?ÿÏÿóÿì?û/ÿøÃþðüÉÉÉ[åÓúÉ|ü•µ¿ÓúÓüþêêì¹ø_üïû$''WÿSÿÿ‹ÿñÿÕÿÕÿåÿäÿøþÿñÿñÿ*¹¦i½-m?¦?m·Û_øwãß¿p{ÿ—¿ÿñþUcþ§÷Ãüïå}ÿ5ÍøOüÏÿóÿü?ÿÏþ³ÿòð‡?üáø“““›ÿkþŸùæÿYÿKný¿õÿøONNný¿õ¿Öÿ‹ÿ­ÿÇëÿ}òòòü¿õÿøÿø/ÿGNN®þ£þãüøËÿÉÿÉÿ‹ÿñÿåÿ}ääâñ?ÿÏÿóÿü?ûÏþÃþð‡?üáoÿMÓŽíÿ1Üÿy¼ÿtzÿ—éþÓCûkÿoûkšý¿ìÿ¥iš¶iÿkû¯~ÿâûÿã/ÿíÿ/ÿ'ÿ'ÿÇÿ·îÿÿøÿâÿ¥ñ'}úôsöÿðýÏÛÿìýáÿÛØôµ½ÿ ßÿŸßïÇ÷wûóïsùµüò÷}ú­ú™øó}ú¿óý‹ÿùüïå¿þÿÉÿÉÿñÿþÿñÿ;ùoþ<}úæÿšÿeþü­ÿ±þÇúëÿñÿ­ÿ³þÏø¾ñŸøŸÿçÿùþŸýgÿåÿàøÃþêïôéÓ—øXÿןÒöZÚõ?õ?ö‹¾ø_üïû¥OŸ¾úŸúŸø_üÿø¯þ¯þ/ÿ'ÿÇÿóÿøÿøÿã÷ÿõ$§~üFNNÞ Ÿþœ¾ÿéçOßþðÏáŸÞl{ÿ·¿ÿéþUóþg÷ßÂüïæwÿÅÿäÆâþŸÿçÿùöŸý—ÿƒ?üáø¿?þäää­òôù%iû;­?Íï¯þ§þÇ>‘‹ÿÅÿ¾Orrrõ?õ?ñ¿øÿñ_ý_ý_þOþÿçÿñÿñÿÅŸôéÓÏÛÿó÷?ýüéûÃþ÷°Óý“®ßiWÿw¾ÿéuÿŸýý3ÏÿøßÌý7~ oü'þçÿùþŸÿgÿÙù?øÃþð‡ÿûâïüCúôÿåüçÿ8ÿÇùßô›íÿë¿ß{Ùü§OŸ~©¾ó¿ëοÿóÿøßËý7þ“ÿ“ÿãÿ[ÏÿÆüÇñ?}úôÕÔzã?øËÿÉÿÉÿ‹ÿñÿåÿåÿèÿ‰ÿùþŸÿçÿÙö_þþð‡?üá¯þOŸ>}óÍÿ3ÿOýÿ§/ÿ#þÇúôé[ÿ¯þgþŸø_ýÿÕÿ}òòòü¿õÿøÿøŸçÿד<žúñ99yƒ|úsúþ§Ÿ?}øÃ?‡úü©íýßþþ§çWÍûŸ= ÿñ¿›ÿÝýÿ“ÿ‰ÿùþŸÿçÿÙö_þþð‡?üáÿþø“““·Ê§õ“ùø+k§õ§ùýÕÿÔÿØ'rñ¿øß÷INN®þ§þ'þÿã?þ«ÿ«ÿËÿÉÿñÿü?þã?þãÿUrMÓz[Ú~Lÿ~Ú>n·¿ðïÆ?¾áöþ/ÿãý«ÆüOïÿ†ÿøßËÿúþkšñŸøŸÿçÿùþŸýgÿåÿàøÃþð'''7ÿ×ü?óÿÌÿ³þ—ÜúëÿñŸœœÜúë­ÿÿ[ÿÿÖÿûþäÿäÿäÿøëÿñÿñ_üOŸ>ýëgýÚþçïøßÃ~||ëýüûùbùöþï|ÿÓë:þ?ûûgžÿñ¿™ÿúoü@ßøOüÏÿóÿü?ÿÏþ³ÿòð‡?üáÿ÷ÅýþSôéÓ¿hÿçߟ¦W~ÿçYÿ.µ¿ëRü|§Ÿ?ýý±_ôWïÿøþ¯µÿøOŸ>ýRýôµ½ÿ ß¿øŸÿÇÿ^þë¿ñŸüŸüÿßéÿñÿñ¿8þ×4Íù_Îqþ üÿÙ”Ÿ9Ž_ÇüOÿðÿ{ùïü_M3þÿóÿü?ÿÏÿ³ÿì¿üüáøÃþäääÎÿrþóœÿsõ÷Ç>‘gåéï7Í?ü'''oÿÿÝ}þ·øßùŸøßËÿîþóÿòòü¯ÿÇüÇÿNþkšfþ¯ù_æÁßúë¬ÿ·þÿñßú?ëÿ4ÍøOüÏÿóÿü?ÿÏþ³ÿòð‡?üáõwMÓ6ÇÿéóŸÓöZÚõ?õ?Mÿ‹ÿ5MÓÔÿÔÿÄÿâüÇõõù?ù?þŸÿÇüÇü¿°ý˜!¯ \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_1_1a8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1a8_states.bin.bz2 new file mode 100644 index 000000000..034c96abd Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_1a8_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_1a8_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1a8_states.bin.z deleted file mode 100644 index 10dd5e6b1..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_1a8_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_1b3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1b3_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_1b3_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_1b3_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1b3_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_1b3_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_1b5_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1b5_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_1b5_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_1b5_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1b5_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_1b5_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_1b7_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1b7_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_1b7_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_1b7_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1b7_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_1b7_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_1b8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1b8_states.bin.bz2 new file mode 100644 index 000000000..c57b7929b Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_1b8_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_1b8_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1b8_states.bin.z deleted file mode 100644 index add474d02..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_1b8_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_1b9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1b9_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_1b9_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_1b9_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1b9_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_1b9_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_1bd_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1bd_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_1bd_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_1bd_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1bd_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_1bd_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_1c1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1c1_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_1c1_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_1c1_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1c1_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_1c1_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_1c3_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1c3_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_1c3_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_1c3_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1c3_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_1c3_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_1c8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1c8_states.bin.bz2 new file mode 100644 index 000000000..6ced4a199 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_1c8_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_1c8_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1c8_states.bin.z deleted file mode 100644 index 3a748e8d0..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_1c8_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_1c9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1c9_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_1c9_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_1c9_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1c9_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_1c9_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_1cd_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1cd_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_1cd_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_1cd_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1cd_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_1cd_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_1cf_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1cf_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_1cf_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_1cf_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1cf_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_1cf_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_1d8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1d8_states.bin.bz2 new file mode 100644 index 000000000..bbc7f1d82 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_1d8_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_1d8_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1d8_states.bin.z deleted file mode 100644 index 806157d21..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_1d8_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_1e0_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1e0_states.bin.bz2 new file mode 100644 index 000000000..d701fc285 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_1e0_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_1e0_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1e0_states.bin.z deleted file mode 100644 index b7f699728..000000000 --- a/client/resources/hardnested_tables/bitflip_1_1e0_states.bin.z +++ /dev/null @@ -1 +0,0 @@ -xÚíÝmn4In`ß@WðM|$Ù€ï±C†äÞw÷GCÃÊŽbÇ“Bá†CUeEÉ$óã?ÿëþã¿ÿñù¿>¾®¿þû_?ýõ×ÿýöñ×Ïû7ùÇç÷ÿ÷õÒ§O³þãúçŸþoÈÿí÷Ó÷?ýüéûÃþ÷°Ÿßz?ÿ~¼X¾½ÿ;ßÿôºŽÿÏþþ™çÇüoæ¿þ?Ð7þÿóÿü?ÿÏÿ³ÿì¿üüáøÃ¿%þ§OŸ~oü?­ÿLëOiû?­?Mí¿úŸúûE_ü/þ÷ýÒ§O_ýOýOü/þÇüWÿWÿ—ÿ“ÿãÿùüÇüÇúôéÓWÿQÿ?üå_äÿÄÿâüÇùùúôÅÿâö—ÿçÿùöŸý‡?üáø·ãÿõßÿÿúçöÏÿí_åÿú;}úôWêOÇOÓë™ýúÝó_?þœ>ÿ¯ìoàºÿßßéçOìýûØÿ׿÷²ÿøOŸ>ýRýôµ½ÿ ß¿øŸÿÇÿ^þë¿ñŸüŸüÿßéÿñÿñ_üOŸ>}õõŸæøþòòòÿâüÇùùãúÆâþŸÿçÿùöŸý—ÿƒ?üáø«ÿÓ§Oßü_óÿÌÿSÿãÿéËÿˆÿñŸ>}úÖÿ«ÿ™ÿ'þWÿÇõߟüŸüŸüÿoý?þã?þçùÿõ$§~üFNNÞ Ÿþœ¾ÿéçOßþðÏáŸ>j{ÿ·¿ÿéùUóþgÏßÂüïæwÿÅÿäÆâþŸÿçÿùöŸý—ÿƒ?üáø¿?þäää­òiýd>þÊÚßiýi~õ?õ?ö‰\ü/þ÷}’““«ÿ©ÿ‰ÿÅÿøÿêÿêÿòòü?ÿÿøÿø•\Ó´Þ–¶Ó¿Ÿ¶Ûí/ü»ñï_¸½ÿËßÿxÿª1ÿÓû¿á?þ÷ò¿¾ÿšfü'þçÿùþŸÿgÿÙù?øÃþð‡?üÉÉÉÍÿ5ÿÏü?óÿ¬ÿ%·þßúü'''·þßú_ëÿÅÿÖÿã¿õÿ¾?ù?ù?ù?þßúüÇü—ÿ#''WÿQÿqþüåÿäÿäÿÅÿøÿòÿ¾?rrñ¿øŸÿçÿùþŸýgÿáøÃþð·ÿ¿¦iÇöÿîÿ<Þ:½ÿËtÿé¡ýµÿ·ý¿5Íþ_öÿÒ4MÛ´ÿµý¿W¿ñ¿ýÿñ¿—ÿöÿ—ÿ“ÿ“ÿãÿ[÷ÿÆüÇñÿÒø“>}ú9ûøþçíöþð‡ÿmìGúÚÞÿ…ïÿÏï÷óû»ýù÷¹üZþ?ùûžÿñ¿™ÿúoü@ßøOüÏÿóÿü?ÿÏþ³ÿòð‡?üáøß{ÿ)úôé_³ÿóß»¦õ—ìþÏóþ]w~Ò´~5}ÿSüÏ|§Ÿ?ýý±_ô÷îÿþþ¯³ÿøOŸ>ýVýLüù>ýßùþÅÿü?þ÷ò_ÿÿäÿäÿøÿNÿÿøÿü7ž>}óÍÿ2ÿ þÖÿXÿcý¿õÿøÿÖÿYÿgü@ßøOüÏÿóÿü?ÿÏþ³ÿòð‡?üáõwúôé¿Kü?¬ÿŒëOiû?­? í¿úŸúûE_ü/þ÷ýÒ§O_ýOýOü/þÇüWÿWÿ—ÿ“ÿãÿùüÇüÇÿñûÿz’ÇS?~#''oONßÿôó§ïøçðOï?¶½ÿÛßÿtÿªyÿ³ûoá?þwó¿»ÿârã?ñ?ÿÏÿóÿü?ûÏþËÿÁþð‡?üßrròVyúü’´ýÖŸæ÷WÿSÿcŸÈÅÿâß'99¹úŸúŸø_üÿø¯þ¯þ/ÿ'ÿÇÿóÿøÿøÿâOúôéçíÿùûŸ~þôýáÿ{ØéþI×ï¿´«ÿ;ßÿôºŽÿÏþþ™çÇüoæ¿þ?Ð7þÿóÿü?ÿÏÿ³ÿì¿üüáøÃÿ}ñwþ!}úÎÿrþóœÿãüoúÍöÿõßï½ì?þÓ§O¿Tßùßuç_‹ÿùüïå¿þÿÉÿÉÿñÿ­çã?þã¿øŸ>}úê?ê?½ñüåÿäÿäÿÅÿøÿòÿòÿÆôÿÄÿü?ÿÏÿóÿì?û/ÿøÃþðWÿ§OŸ¾ù¿æÿ™ÿ§þÇÿÓ—ÿÿã?}úô­ÿWÿ3ÿOü¯þÿêÿ¾?ù?ù?ù?þßúüÇüÏóÿëIOýøœœ¼A>ý9}ÿÓÏŸ¾?üáŸÃ?}þÔöþoÿÓó«æýÏž¿…ÿøßÍÿîþ‹ÿÉÿÄÿü?ÿÏÿóÿì?û/ÿøÃþðüÉÉÉ[åÓúÉ|ü•µ¿ÓúÓüþêêì¹ø_üïû$''WÿSÿÿ‹ÿñÿÕÿÕÿåÿäÿøþÿñÿñÿ*¹¦i½-m?¦?m·Û_øwãß¿p{ÿ—¿ÿñþUcþ§÷Ãüïå}ÿ5ÍøOüÏÿóÿü?ÿÏþ³ÿòð‡?üáø“““›ÿkþŸùæÿYÿKný¿õÿøONNný¿õ¿Öÿ‹ÿ­ÿÇëÿ}òòòü¿õÿøÿø/þ§OŸþõ³þ?mÿó÷‡?üïa?>¿õ~þýx±|{ÿw¾ÿéuÿŸýý3ÏÿøßÌý7~ oü'þçÿùþŸÿgÿÙù?øÃþð‡ÿûâ¿~ÿ)úôé_´ÿóïÇOÓ+¿ÿó¬—ÚßÀu)þ¾¿ÓÏŸþþØ/ú«÷ÿ?|ÿ×Úü§OŸ~©~úÚÞÿ…ï_üÏÿã/ÿõßøOþOþÿïôÿøÿø_ÿkšæü/ç¿8ÿþÎÿl‹?ÊÏ¿ǯcþ§Çøÿ½üwþ¯¦ÿ‰ÿùþŸÿçÿÙö_þþð‡?üárrrç9ÿÇù?Îÿ¹úûcŸÈ³òô÷›æþ“““·ÆÿÎÿî>ÿ[üïüOüïåwÿùù?ù?þ¿×ÿã?þã'ÿ5M3ÿ×ü/ó¿àoýõ?Öÿ[ÿÿøoýŸõšfü'þçÿùþŸÿgÿÙù?øÃþð‡¿ú»¦i›ãÿôùÏiû?­? í¿úŸúŸ¦‰ÿÅÿš¦iêêâñ?þã¿ú¿ú¿üŸüÿÏÿã?þã?þ߈ÿôéÓß­ŸÝÿ'½ÿKþþð‡ÿ=ìÇç·ÞÏ¿/–oïÿÎ÷?½®ãÿ³¿æùñÿ›ù¯ÿÆôÿÄÿü?ÿÏÿóÿì?û/ÿøÃþðo‰ÿéÓ§ßÿOë?ÓúSÚþOëOSû¯þ§þÇ~Ñÿ‹ÿ}¿ôéÓWÿSÿÿ‹ÿñÿÕÿÕÿåÿäÿøþÿñÿñŸ>}úôÕÔàùù?ñ¿øÿñ_þ_þŸ>}ñ¿øŸýåÿùþŸýgÿáøÃþíø¯?Š>}úÿòûñÓôÊŸÿ2ëߥö7p]Šÿïïôó§¿?ö‹þêó¿ßÿµöÿéÓ§_ªŸ¾¶÷áûÿóÿøßËý7þ“ÿ“ÿãÿ;ý?þã?þ‹ÿéÓ§¯þ£þÓÿÁ_þOþOþ_üÿø/ÿ/ÿoü@ßøOüÏÿóÿü?ÿÏþ³ÿòð‡?üáõúôé›ÿkþŸùêü?}ùñ?þÓ§Oßúõ?óÿÄÿêÿø¯þïû“ÿ“ÿ“ÿãÿ­ÿÇüÇÿ<ÿ¿žäñÔßÈÉÉäÓŸÓ÷?ýüéûÃþ9üÓçOmïÿö÷?=¿jÞÿìù[øÿÝüïî¿øŸÜøOüÏÿóÿü?ÿÏþ³ÿòð‡?üáÿ÷ÇŸœœ¼U>­ŸÌÇ_Yû;­?Íï¯þ§þÇ>‘‹ÿÅÿ¾Orrrõ?õ?ñ¿øÿñ_ý_ý_þOþÿçÿñÿñÿ¯’kšÖÛÒöcú÷Óöq»ý…7þñý ·÷ùûï_5æzÿ7üÇÿ^þ×÷_ÓŒÿÄÿü?ÿÏÿóÿì?û/ÿøÃþð‡?99¹ù¿æÿ™ÿgþŸõ¿äÖÿ[ÿÿäääÖÿ[ÿký¿øßúü·þß÷'ÿ'ÿ'ÿÇÿ[ÿÿøÿòäääê?ê?Îÿ¿üŸüŸü¿øÿñ_þß÷GN.þÿóÿü?ÿÏÿ³ÿì?üáøÃþöÿ×4íØþÃýŸÇûO§÷™î?=´¿öÿ¶ÿ·¦ÙÿËþ_š¦i›ö¿¶ÿ÷ê÷/þ·ÿ?þ÷òßþÿòòòüëþßøÿø/þ_Ò§O?gÿßÿ¼ýÏÞþð¿ýH_Ûû¿ðýÿùý~~·?ÿ>—_Ëÿ'ÿÀóã?þ7ó_ÿèÿ‰ÿùþŸÿçÿÙö_þþð‡?üáÿ{ï?EŸ>ýköþ{×´þ’ÝÿyÞ¿ëÎOšÖ¯¦ïŠÿ™ïïôó§¿?ö‹þÞýÿÏßÿuöÿéӧߪŸ‰?ß§ÿ;ß¿øŸÿÇÿ^þë¿ñŸüŸüÿßéÿñÿñ¿“ÿæÏÓ§oþ¯ù_æÁßúë¬ÿ·þÿñßú?ëÿŒèÿ‰ÿùþŸÿçÿÙö_þþð‡?üá¯þNŸ>ýw‰ÿ‡õŸqý)mÿ§õ§¡ýWÿSÿc¿è‹ÿÅÿ¾_úôé«ÿ©ÿ‰ÿÅÿøÿêÿêÿòòü?ÿÿøÿø?~ÿ_OòxêÇoäää òéÏéûŸ~þôýáÿþéýǶ÷ûûŸî_5ïvÿ-üÇÿnþw÷_üOnü'þçÿùþŸÿgÿÙù?øÃþð‡ÿûãONNÞ*OŸ_’¶¿ÓúÓüþêêì¹ø_üïû$''WÿSÿÿ‹ÿñÿÕÿÕÿåÿäÿøþÿñÿñ_üIŸ>ý¼ý?ÿÓÏŸ¾?üáû1Ý?éúý—võçûŸ^×ñÿÙß?óüøÿÍü×ãúÆâþŸÿçÿùöŸý—ÿƒ?üáø¿/þÎ?¤Oßù_ÎÿqþóœÿM¿Ùþ¿þû½—ýÇúôé—ê;ÿ»îükñ?ÿÿ½ü×ã?ù?ù?þ¿õüoüÇüÿÓ§O_ýGý§7þƒ¿üŸüŸü¿øÿñ_þ_þßø¾ñŸøŸÿçÿùþŸýgÿåÿàøÃþêÿôéÓ7ÿ×ü?óÿÔÿøúò?âü§OŸ¾õÿêæÿ‰ÿÕÿñ_ýß÷'ÿ'ÿ'ÿÇÿ[ÿÿøÿyþ=Éã©¿‘““7ȧ?§ïúùÓ÷‡?üsø§ÏŸÚÞÿíïz~Õ¼ÿÙó·ðÿ»ùßÝñ?¹ñŸøŸÿçÿùþŸýgÿåÿàøÃþï?99y«|Z?™¿²öwZšß_ýOý}"ÿ‹ÿ}Ÿäääêêâñ?þã¿ú¿ú¿üŸüÿÏÿã?þã?þ_%×4­·¥íÇôï§íãvû ÿnüãûnïÿò÷?Þ¿jÌÿôþoøÿ½ü¯ï¿¦ÿ‰ÿùþŸÿçÿÙö_þþð‡?üárrróÍÿ3ÿÏü?ëÉ­ÿ·þÿÉÉÉ­ÿ·þ×úñ¿õÿøoý¿ïOþOþOþÿ·þÿñÿÅÿôéÓ¿±~Öÿ§íþþð‡ÿ=ìÇç·ÞÏ¿/–oïÿÎ÷?½®ãÿ³¿æùñÿ›ù¯ÿÆôÿÄÿü?ÿÏÿóÿì?û/ÿøÃþð_ü×ï?EŸ>ý‹öþýøizå÷žõïRû¸.ÅÿÀ÷wúùÓßûEõþÿ‡ïÿZûÿôéÓ/ÕO_Ûû¿ðý‹ÿùüïå¿þÿÉÿÉÿñÿþÿñÿ‹ãMÓœÿåüç¿ÀßùŸmñGùù—ãøuÌÿôøÿñ¿—ÿÎÿÕ4ã?ñ?ÿÏÿóÿü?ûÏþËÿÁþð‡?üáONNîü/çÿ8ÿÇù?WìyVžþ~ÓüÃrròÖøßùßÝç‹ÿÿ‰ÿ½üïî?ÿ/ÿ'ÿÇÿ÷úüÇüï俦iæÿšÿeþü­ÿ±þÇúëÿñÿ­ÿ³þOÓŒÿÄÿü?ÿÏÿóÿì?û/ÿøÃþðW×4msüŸ>ÿ9mÿ§õ§¡ýWÿSÿÓ4ñ¿ø_Ó4MýOýOü/þÇüWÿWÿ—ÿ“ÿãÿùüÇüÇÿñŸ>}ú»õ³ûÿ¤÷Éßþð¿‡ýøüÖûù÷ãÅòíýßùþ§×uüö÷Ï}úêêâñ?þã¿ú¿ú¿üŸüÿÏÿã?þã?þÓ§OŸ¾úúüá/ÿ"ÿ'þÿã?þËÿËÿÓ§/þÿ³¿ü?ÿÏÿ³ÿì?üáøÃ¿ÿõçOѧOÿ¢ó_~?~š^ùó_fý»Ôþ®Kñ?ðý~þô÷Ç~Ñ_}þ×áû¿Öþã?}úôKõÓ×öþ/|ÿâþÿ{ù¯ÿÆòòü§ÿÇüÇñ?}úôÕÔšã?øËÿÉÿÉÿ‹ÿñÿåÿåÿèÿ‰ÿùþŸÿçÿÙö_þþð‡?üá¯þOŸ>}óÍÿ3ÿOýÿ§/ÿ#þÇúôé[ÿ¯þgþŸø_ýÿÕÿ}òòòü¿õÿøÿøŸçÿד<žúñ99yƒ|úsúþ§Ÿ?}øÃ?‡úü©íýßþþ§çWÍûŸ= ÿñ¿›ÿÝýÿ“ÿ‰ÿùþŸÿçÿÙö_þþð‡?üáÿþø“““·Ê§õ“ùø+k§õ§ùýÕÿÔÿØ'rñ¿øß÷INN®þ§þ'þÿã?þ«ÿ«ÿËÿÉÿñÿü?þã?þãÿUrMÓz[Ú~Lÿ~Ú>n·¿ðïÆ?¾áöþ/ÿãý«ÆüOïÿ†ÿøßËÿúþkšñŸøŸÿçÿùþŸýgÿåÿàøÃþð'''7ÿ×ü?óÿÌÿ³þ—ÜúëÿñŸœœÜúë­ÿÿ[ÿÿÖÿûþäÿäÿäÿøëÿñÿñ_þœœ\ýGýÇù?ð—ÿ“ÿ“ÿÿã?þËÿûþÈÉÅÿâþŸÿçÿùöŸý‡?üáøÃßþÿš¦Ûÿc¸ÿóxÿéôþ/Óý§‡ö×þßöÿÖ4ûÙÿKÓ4mÓþ×öÿ^ýþÅÿöÿÇÿ^þÛÿ_þOþOþÿoÝÿÿñÿÅÿKãOúôéçìÿáûŸ·ÿÙûÃþ·±ék{ÿ¾ÿ?¿ßÏïïöçßçòkùÿäïx~üÇÿfþë¿ñ}ã?ñ?ÿÏÿóÿü?ûÏþËÿÁþð‡?üáïý§èÓ§ÍþÏïšÖ_²û?ÏûwÝùIÓúÕôýOñ?óý~þô÷Ç~Ñß»ÿÿùû¿Îþã?}úô[õ3ñçûôçûÿóÿøßËý7þ“ÿ“ÿãÿ;ý?þã?þwòßüyúôÍÿ5ÿËü/ø[ÿcýõÿÖÿã?þ[ÿgýŸñ}ã?ñ?ÿÏÿóÿü?ûÏþËÿÁþð‡?üÕßéÓ§ÿ.ñÿ°þ3®?¥íÿ´þ4´ÿêêì}ñ¿øß÷KŸ>}õ?õ?ñ¿øÿñ_ý_ý_þOþÿçÿñÿñÿÇïÿëIOýøœœ¼A>ý9}ÿÓÏŸ¾?üáŸÃ?½ÿØöþoÿÓý«æýÏî¿…ÿøßÍÿîþ‹ÿÉÿÄÿü?ÿÏÿóÿì?û/ÿøÃþðüÉÉÉ[åéóKÒöwZšß_ýOý}"ÿ‹ÿ}Ÿäääêêâñ?þã¿ú¿ú¿üŸüÿÏÿã?þã?þ‹?éÓ§Ÿ·ÿçïúùÓ÷‡?üïa?¦û']¿ÿÒ®þï|ÿÓë:þ?ûûgžÿñ¿™ÿúoü@ßøOüÏÿóÿü?ÿÏþ³ÿòð‡?üáÿ÷Åßù‡ôé;ÿËù?Îÿqþó¿é7Ûÿ׿÷²ÿøOŸ>ýR}ç×-þçÿñ¿—ÿúoü'ÿ'ÿÇÿ·žÿÿøÿâúôé«ÿ¨ÿôÆð—ÿ“ÿ“ÿÿã?þËÿËÿ?Ð7þÿóÿü?ÿÏÿ³ÿì¿üüáøÃ_ýŸ>}úæÿšÿgþŸúÿO_þGüÿôéÓ·þ_ýÏü?ñ¿ú?þ«ÿûþäÿäÿäÿøëÿñÿñ?Ïÿ¯'y<õã7rròùôçôýO?úþð‡ÿôùSÛû¿ýýOϯš÷?{þþã7ÿ»û/þ'7þÿóÿü?ÿÏÿ³ÿì¿üüáøÃÿýñ'''o•Oë'óñWÖþNëOóû«ÿ©ÿ±Oäâñ¿ï“œœ\ýOýOü/þÇüWÿWÿ—ÿ“ÿãÿùüÇüÇÿ«äš¦õ¶´ý˜þý´}Ünáß|ÿÂíý_þþÇûWùŸÞÿ ÿñ¿—ÿõý×4ã?ñ?ÿÏÿóÿü?ûÏþËÿÁþð‡?üáONNnþ¯ùæÿ™ÿgý/¹õÿÖÿã?99¹õÿÖÿZÿ/þ·þÿ­ÿ÷ýÉÿÉÿÉÿñÿÖÿã?þã¿øŸ>}ú7ÖÏúÿ´ýÏßþð¿‡ýøüÖûù÷ãÅòíýßùþ§×uüö÷Ï}ú¥úék{ÿ¾ñ?ÿÿ½ü×ã?ù?ù?þ¿Óÿã?þãqü¯išó¿œÿâüø;ÿ³-þ(?ÿr¿ŽùŸÿá?þ÷òßù¿šfü'þçÿùþŸÿgÿÙù?øÃþð‡?üÉÉÉÿåüçÿ8ÿçêï}"ÏÊÓßošøONNÞÿ;ÿ»ûüoñ¿ó?ñ¿—ÿÝýçÿåÿäÿøÿ^ÿÿøÿü×4Íü_ó¿Ìÿ‚¿õ?ÖÿXÿoý?þã¿õÖÿišñŸøŸÿçÿùþŸýgÿåÿàøÃþêmŽÿÓç?§íÿ´þ4´ÿêêš&þÿkš¦©ÿ©ÿ‰ÿÅÿøÿêÿêÿòòü?ÿÿøÿø#þÓ§O·~vÿŸôþ/ùûÃþ÷°Ÿßz?ÿ~¼X¾½ÿ;ßÿôºŽÿÏþþ™çÇüoæ¿þ?Ð7þÿóÿü?ÿÏÿ³ÿì¿üüáøÃ¿%þ§OŸ~oü?­ÿLëOiû?­?Mí¿úŸúûE_ü/þ÷ýÒ§O_ýOýOü/þÇüWÿWÿ—ÿ“ÿãÿùüÇüÇúôéÓWÿQÿ?üå_äÿÄÿâüÇùùúôÅÿâö—ÿçÿùöŸý‡?üáø·ã¿þü)úôé_tþËïÇOÓ+þˬ—ÚßÀu)þ¾¿ÓÏŸþþØ/ú«Ïÿ:|ÿ×Úü§OŸ~©~úÚÞÿ…ï_üÏÿã/ÿõßøOþOþÿïôÿøÿø/þ§OŸ¾úúOsüù?ù?ùñ?þã¿ü¿ü¿ñ}ã?ñ?ÿÏÿóÿü?ûÏþËÿÁþð‡?üÕÿéÓ§oþ¯ùæÿ©ÿñÿôåÄÿøOŸ>}ëÿÕÿÌÿÿ«ÿã¿ú¿ïOþOþOþÿ·þÿñÿóüÿz’ÇS?~#''oONßÿôó§ïøçðOŸ?µ½ÿÛßÿôüªyÿ³çoá?þwó¿»ÿârã?ñ?ÿÏÿóÿü?ûÏþËÿÁþð‡?üßrròVù´~2eíï´þ4¿¿úŸúûD.þÿû>ÉÉÉÕÿÔÿÄÿâüÇõõù?ù?þŸÿÇüÇü¿J®iZoKÛéßOÛÇíöþÝøÇ÷/ÜÞÿåï¼Õ˜ÿéýßðÿ{ù_ßM3þÿóÿü?ÿÏÿ³ÿì¿üüáøÃþäääæÿšÿgþŸùÖÿ’[ÿoý?þ“““[ÿoý¯õÿâëÿñßúߟüŸüŸüÿoý?þã?þËÿ‘““«ÿ¨ÿ8ÿþòòòÿâüÇùß9¹ø_üÏÿóÿü?ÿÏþ³ÿð‡?üáøÛÿ_Ó´cû ÷ï?ÞÿeºÿôÐþÚÿÛþßšfÿ/ûiš¦mÚÿÚþ߫߿øßþÿøßËûÿËÿÉÿÉÿñÿ­ûã?þã¿øiüIŸ>ýœý?|ÿóö?{øÃÿ6ö#}mïÿÂ÷ÿç÷ûùýÝþüû\~-ÿŸüýÏÿøßÌý7~ oü'þçÿùþŸÿgÿÙù?øÃþð‡?üï½ÿ}úô¯Ùÿùï]ÓúKvÿçyÿ®;?iZ¿š¾ÿ)þg¾¿ÓÏŸþþØ/ú{÷ÿ?ÿ×Ùü§OŸ~«~&þ|Ÿþï|ÿâþÿ{ù¯ÿÆòòü§ÿÇüÇÿNþ›?OŸ¾ù¿æ™ÿë¬ÿ±þßúüÇëÿ¬ÿ3~ oü'þçÿùþŸÿgÿÙù?øÃþð‡¿ú;}úôß%þÖÆõ§´ýŸÖŸ†ö_ýOýý¢/þÿû~éÓ§¯þ§þ'þÿã?þ«ÿ«ÿËÿÉÿñÿü?þã?þãÿøý=Éã©¿‘““7ȧ?§ïúùÓ÷‡?üsø§÷ÛÞÿíïºÕ¼ÿÙý·ðÿ»ùßÝñ?¹ñŸøŸÿçÿùþŸýgÿåÿàøÃþï?99y«<}~IÚþNëOóû«ÿ©ÿ±Oäâñ¿ï“œœ\ýOýOü/þÇüWÿWÿ—ÿ“ÿãÿùüÇüÇñ'}úôóöÿüýO?úþð‡ÿ=ìÇtÿ¤ë÷_ÚÕÿïz]ÇÿgÿÌóã?þ7ó_ÿèÿ‰ÿùþŸÿçÿÙö_þþð‡?üáÿ¾ø;ÿ>}ç9ÿÇù?Îÿqþ7ýfûÿúï÷^öÿéÓ§_ªïüïºó¯Åÿü?þ÷ò_ÿÿäÿäÿøÿÖó¿ñÿñ_üOŸ>}õõŸÞøþòòòÿâüÇùùãúÆâþŸÿçÿùöŸý—ÿƒ?üáø«ÿÓ§Oßü_óÿÌÿSÿãÿéËÿˆÿñŸ>}úÖÿ«ÿ™ÿ'þWÿÇõߟüŸüŸüÿoý?þã?þçùÿõ$§~üFNNÞ Ÿþœ¾ÿéçOßþðÏáŸ>j{ÿ·¿ÿéùUóþgÏßÂüïæwÿÅÿäÆâþŸÿçÿùöŸý—ÿƒ?üáø¿?þäää­òiýd>þÊÚßiýi~õ?õ?ö‰\ü/þ÷}’““«ÿ©ÿ‰ÿÅÿøÿêÿêÿòòü?ÿÿøÿø•\Ó´Þ–¶Ó¿Ÿ¶Ûí/ü»ñï_¸½ÿËßÿxÿª1ÿÓû¿á?þ÷ò¿¾ÿšfü'þçÿùþŸÿgÿÙù?øÃþð‡?üÉÉÉÍÿ5ÿÏü?óÿ¬ÿ%·þßúü'''·þßú_ëÿÅÿÖÿã¿õÿ¾?ù?ù?ù?þßúüÇüÿÓ§OÿÆúYÿŸ¶ÿùûÃþ÷°Ÿßz?ÿ~¼X¾½ÿ;ßÿôºŽÿÏþþ™çÇüoæ¿þ?Ð7þÿóÿü?ÿÏÿ³ÿì¿üüáøÃÿ}ñ_¿ÿ}úô/Úÿù÷ã§é•ßÿyÖ¿KíoàºÿßßéçOìýÕûÿ¾ÿkí?þÓ§O¿T?}mïÿÂ÷/þçÿñ¿—ÿúoü'ÿ'ÿÇÿwúüÇü/Žÿ5Msþ—ó_œÿç¶Ååç_Žã×1ÿÓã?üÇÿ^þ;ÿWÓŒÿÄÿü?ÿÏÿóÿì?û/ÿøÃþð‡?99¹ó¿œÿãüçÿ\ýý±OäYyúûMóÿÉÉÉ[ãçwŸÿ-þwþ'þ÷ò¿»ÿü¿üŸüÿßëÿñÿñ¿“ÿš¦™ÿkþ—ù_ð·þÇúëÿ­ÿÇü·þÏú?M3þÿóÿü?ÿÏÿ³ÿì¿üüáøÃ_ý]Ó´Íñúüç´ýŸÖŸ†ö_ýOýOÓÄÿâMÓ4õ?õ?ñ¿øÿñ_ý_ý_þOþÿçÿñÿñÿoÄúôéïÖÏîÿ“Þÿ%øÃÿöãó[ïçßË·÷çûŸ^×ñÿÙß?óüøÿÍü×ãúÆâþŸÿçÿùöŸý—ÿƒ?üáø·ÄÿôéÓïÿ§õŸiý)mÿ§õ§©ýWÿSÿc¿è‹ÿÅÿ¾_úôé«ÿ©ÿ‰ÿÅÿøÿêÿêÿòòü?ÿÿøÿøOŸ>}úê?ê?ð‡¿ü‹üŸø_üÿø/ÿ/ÿOŸ¾ø_üÏþòÿü?ÿÏþ³ÿð‡?üáÿvüן?EŸ>ý‹ÎùýøizåÏ™õïRû¸.ÅÿÀ÷wúùÓßûEõù_‡ïÿZûÿôéÓ/ÕO_Ûû¿ðý‹ÿùüïå¿þÿÉÿÉÿñÿþÿñÿÅÿôéÓWÿQÿiŽÿà/ÿ'ÿ'ÿ/þÇü—ÿ—ÿ7~ oü'þçÿùþŸÿgÿÙù?øÃþð‡¿ú?}úôÍÿ5ÿÏü?õ?þŸ¾üøÿéÓ§oý¿úŸùâõüWÿ÷ýÉÿÉÿÉÿñÿÖÿã?þãžÿ_OòxêÇoäää òéÏéûŸ~þôýáÿþéó§¶÷ûûŸž_5ïöü-üÇÿnþw÷_üOnü'þçÿùþŸÿgÿÙù?øÃþð‡ÿûãONNÞ*ŸÖOæã¯¬ýÖŸæ÷WÿSÿcŸÈÅÿâß'99¹úŸúŸø_üÿø¯þ¯þ/ÿ'ÿÇÿóÿøÿøÿWÉ5Mëmiû1ýûiû¸Ýþ¿ÿøþ…Ûû¿üý÷¯ó?½ÿþã/ÿëû¯iÆâþŸÿçÿùöŸý—ÿƒ?üáøÃŸœœÜü_óÿÌÿ3ÿÏú_rëÿ­ÿÇrrrëÿ­ÿµþ_üoý?þ[ÿïû“ÿ“ÿ“ÿãÿ­ÿÇüÇù?rrrõõçÿÀ_þOþOþ_üÿø/ÿïû#'ÿ‹ÿùþŸÿçÿÙöþð‡?üáûÿkšvlÿáþÏãý§Óû¿L÷ŸÚ_ûÛÿ[Óìÿeÿ/MÓ´Mû_Ûÿ{õûÿÛÿÿ{ùoÿù?ù?ù?þ¿uÿoüÇüÿ/?éÓ§Ÿ³ÿ‡ïÞþgïøßÆ~¤¯íý_øþÿü~?¿¿ÛŸŸË¯åÿ“¿àùñÿ›ù¯ÿÆôÿÄÿü?ÿÏÿóÿì?û/ÿøÃþð‡ÿ½÷Ÿ¢OŸþ5û?ÿ½kZÉîÿ<ïßuç'MëWÓ÷?ÅÿÌ÷wúùÓßûEïþÿçïÿ:ûÿôéÓoÕÏÄŸïÓÿï_üÏÿã/ÿõßøOþOþÿïôÿøÿøßÉóçéÓ7ÿ×ü/ó¿àoýõ?Öÿ[ÿÿøoýŸõÆôÿÄÿü?ÿÏÿóÿì?û/ÿøÃþðW§OŸþ»ÄÿÃúϸþ”¶ÿÓúÓÐþ«ÿ©ÿ±_ôÅÿâß/}úôÕÿÔÿÄÿâüÇõõù?ù?þŸÿÇüÇü¿ÿ¯'y<õã7rròùôçôýO?úþð‡ÿôþcÛû¿ýýO÷¯š÷?»ÿþã7ÿ»û/þ'7þÿóÿü?ÿÏÿ³ÿì¿üüáøÃÿýñ'''o•§Ï/IÛßiýi~õ?õ?ö‰\ü/þ÷}’““«ÿ©ÿ‰ÿÅÿøÿêÿêÿòòü?ÿÿøÿø/þ¤OŸ~ÞþŸ¿ÿéçOßþð¿‡ý˜îŸtýþK»ú¿óýO¯ëøÿìïŸy~üÇÿfþë¿ñ}ã?ñ?ÿÏÿóÿü?ûÏþËÿÁþð‡?üßçÒ§ïü/çÿ8ÿÇù?Îÿ¦ßlÿ_ÿýÞËþã?}úôKõÿ]wþµøŸÿÇÿ^þë¿ñŸüŸüÿßzþ7þã?þ‹ÿéÓ§¯þ£þÓÿÁ_þOþOþ_üÿø/ÿ/ÿoü@ßøOüÏÿóÿü?ÿÏþ³ÿòð‡?üáõúôé›ÿkþŸùêü?}ùñ?þÓ§Oßúõ?óÿÄÿêÿø¯þïû“ÿ“ÿ“ÿãÿ­ÿÇüÇÿ<ÿ¿žäñÔßÈÉÉäÓŸÓ÷?ýüéûÃþ9üÓçOmïÿö÷?=¿jÞÿìù[øÿÝüïî¿øŸÜøOüÏÿóÿü?ÿÏþ³ÿòð‡?üáÿ÷ÇŸœœ¼U>­ŸÌÇ_Yû;­?Íï¯þ§þÇ>‘‹ÿÅÿ¾Orrrõ?õ?ñ¿øÿñ_ý_ý_þOþÿçÿñÿñÿ¯’kšÖÛÒöcú÷Óöq»ý…7þñý ·÷ùûï_5æzÿ7üÇÿ^þ×÷_ÓŒÿÄÿü?ÿÏÿóÿì?û/ÿøÃþð‡?99¹ù¿æÿ™ÿgþŸõ¿äÖÿ[ÿÿäääÖÿ[ÿký¿øßúü·þß÷'ÿ'ÿ'ÿÇÿ[ÿÿøÿâúôéßX?ëÿÓö?øÃÿöãó[ïçßË·÷çûŸ^×ñÿÙß?óüøÿÍü×ãúÆâþŸÿçÿùöŸý—ÿƒ?üáø¿/þë÷Ÿ¢OŸþEû?ÿ~ü4½òû?Ïúw©ý \—âàû;ýüéïý¢¿zÿÿÃ÷­ýÇúôé—ꧯíý_øþÅÿü?þ÷ò_ÿÿäÿäÿøÿNÿÿøÿÅñ¿¦iÎÿrþ‹ó_àïü϶ø£üüËqü:æzü‡ÿøßËçÿjšñŸøŸÿçÿùþŸýgÿåÿàøÃþð'''wþ—óœÿãüŸ«¿?ö‰<+O¿iþá?99yküïüïîó¿ÅÿÎÿÄÿ^þw÷Ÿÿ—ÿ“ÿãÿ{ý?þã?þwò_Ó4óÍÿ2ÿ þÖÿXÿcý¿õÿøÿÖÿYÿ§iÆâþŸÿçÿùöŸý—ÿƒ?üáø«¿kš¶9þOŸÿœ¶ÿÓúÓÐþ«ÿ©ÿišø_ü¯iš¦þ§þ'þÿã?þ«ÿ«ÿËÿÉÿñÿü?þã?þãÿøOŸ>ýÝúÙýÒû¿äïøßÃ~|~ëýüûñbùöþï|ÿÓë:þ?ûûgžÿñ¿™ÿúoü@ßøOüÏÿóÿü?ÿÏþ³ÿòð‡?üáÿ–øŸ>}ú½ñÿ´þ3­?¥íÿ´þ4µÿêêì}ñ¿øß÷KŸ>}õ?õ?ñ¿øÿñ_ý_ý_þOþÿçÿñÿñÿéÓ§O_ýGýþð—‘ÿÿ‹ÿñÿåÿåÿéÓÿ‹ÿÙ_þŸÿçÿÙöþð‡?üáߎÿúó§èÓ§Ñù/¿?M¯üù/³þ]j×¥øøþN?úûc¿è¯>ÿëðý_kÿñŸ>}ú¥úék{ÿ¾ñ?ÿÿ½ü×ã?ù?ù?þ¿Óÿã?þã¿øŸ>}úê?ê?ÍñüåÿäÿäÿÅÿøÿòÿòÿÆôÿÄÿü?ÿÏÿóÿì?û/ÿøÃþðWÿ§OŸ¾ù¿æÿ™ÿ§þÇÿÓ—ÿÿã?}úô­ÿWÿ3ÿOü¯þÿêÿ¾?ù?ù?ù?þßúüÇüÏóÿëIOýøœœ¼A>ý9}ÿÓÏŸ¾?üáŸÃ?}þÔöþoÿÓó«æýÏž¿…ÿøßÍÿîþ‹ÿÉÿÄÿü?ÿÏÿóÿì?û/ÿøÃþðüÉÉÉ[åÓúÉ|ü•µ¿ÓúÓüþêêì¹ø_üïû$''WÿSÿÿ‹ÿñÿÕÿÕÿåÿäÿøþÿñÿñÿ*¹¦i½-m?¦?m·Û_øwãß¿p{ÿ—¿ÿñþUcþ§÷Ãüïå}ÿ5ÍøOüÏÿóÿü?ÿÏþ³ÿòð‡?üáø“““›ÿkþŸùæÿYÿKný¿õÿøONNný¿õ¿Öÿ‹ÿ­ÿÇëÿ}òòòü¿õÿøÿø/ÿGNN®þ£þãüøËÿÉÿÉÿ‹ÿñÿåÿ}ääâñ?ÿÏÿóÿü?ûÏþÃþð‡?üáoÿMÓŽíÿ1Üÿy¼ÿtzÿ—éþÓCûkÿoûkšý¿ìÿ¥iš¶iÿkû¯~ÿâûÿã/ÿíÿ/ÿ'ÿ'ÿÇÿ·îÿÿøÿâÿ¥ñ'}úôsöÿðýÏÛÿìýáÿÛØôµ½ÿ ßÿŸßïç÷wûóïsùµüò÷}ú­ú™øó}ú¿óý‹ÿùüïå¿þÿÉÿÉÿñÿþÿñÿ;ùoþ<}úæÿšÿeþü­ÿ±þÇúëÿñÿ­ÿ³þÏø¾ñŸøŸÿçÿùþŸýgÿåÿàøÃþêïôéÓ—øXÿןÒöZÚõ?õ?ö‹¾ø_üïû¥OŸ¾úŸúŸø_üÿø¯þ¯þ/ÿ'ÿÇÿóÿøÿøÿã÷ÿõ$§~üFNNÞ Ÿþœ¾ÿéçOßþðÏáŸÞl{ÿ·¿ÿéþUóþg÷ßÂüïæwÿÅÿäÆâþŸÿçÿùöŸý—ÿƒ?üáø¿?þäää­òôù%iû;­?Íï¯þ§þÇ>‘‹ÿÅÿ¾Orrrõ?õ?ñ¿øÿñ_ý_ý_þOþÿçÿñÿñÿÅŸôéÓÏÛÿó÷?ýüéûÃþ÷°Óý“®ßiWÿw¾ÿéuÿŸýý3ÏÿøßÌý7~ oü'þçÿùþŸÿgÿÙù?øÃþð‡ÿûâïüCúôÿåüçÿ8ÿÇùßô›íÿë¿ß{Ùü§OŸ~©¾ó¿ëοÿóÿøßËý7þ“ÿ“ÿãÿ[ÏÿÆüÇñ?}úôÕÔzã?øËÿÉÿÉÿ‹ÿñÿåÿåÿèÿ‰ÿùþŸÿçÿÙö_þþð‡?üá¯þOŸ>}óÍÿ3ÿOýÿ§/ÿ#þÇúôé[ÿ¯þgþŸø_ýÿÕÿ}òòòü¿õÿøÿøŸçÿד<žúñ99yƒ|úsúþ§Ÿ?}øÃ?‡úü©íýßþþ§çWÍûŸ= ÿñ¿›ÿÝýÿ“ÿ‰ÿùþŸÿçÿÙö_þþð‡?üáÿþø“““·Ê§õ“ùø+k§õ§ùýÕÿÔÿØ'rñ¿øß÷INN®þ§þ'þÿã?þ«ÿ«ÿËÿÉÿñÿü?þã?þãÿUrMÓz[Ú~Lÿ~Ú>n·¿ðïÆ?¾áöþ/ÿãý«ÆüOïÿ†ÿøßËÿúþkšñŸøŸÿçÿùþŸýgÿåÿàøÃþð'''7ÿ×ü?óÿÌÿ³þ—ÜúëÿñŸœœÜúë­ÿÿ[ÿÿÖÿûþäÿäÿäÿøëÿñÿñ_üOŸ>ýëgýÚþçïøßÃ~|~ëýüûñbùöþï|ÿÓë:þ?ûûgžÿñ¿™ÿúoü@ßøOüÏÿóÿü?ÿÏþ³ÿòð‡?üáÿ÷ÅýþSôéÓ¿hÿçߟ¦W~ÿçYÿ.µ¿ëRü|§Ÿ?ýý±_ôWïÿøþ¯µÿøOŸ>ýRýôµ½ÿ ß¿øŸÿÇÿ^þë¿ñŸüŸüÿßéÿñÿñ¿8þ×4Íù_Îqþ üÿÙ”Ÿ9Ž_ÇüOÿðÿ{ùïü_M3þÿóÿü?ÿÏÿ³ÿì¿üüáøÃþäääÎÿrþóœÿsõ÷Ç>‘gåéï7Í?ü'''oÿÿÝ}þ·øßùŸøßËÿîþóÿòòü¯ÿÇüÇÿNþkšfþ¯ù_æÁßúë¬ÿ·þÿñßú?ëÿ4ÍøOüÏÿóÿü?ÿÏþ³ÿòð‡?üáõwMÓ6ÇÿéóŸÓöZÚõ?õ?Mÿ‹ÿ5MÓÔÿÔÿÄÿâüÇõõù?ù?þŸÿÇüÇü¿ÿéÓ§¿[?»ÿOzÿ—üýáÿ{ØÏo½Ÿ?^,ßÞÿïz]ÇÿgÿÌóã?þ7ó_ÿèÿ‰ÿùþŸÿçÿÙö_þþð‡?üáßÿÓ§O¿7þŸÖ¦õ§´ýŸÖŸ¦ö_ýOýý¢/þÿû~éÓ§¯þ§þ'þÿã?þ«ÿ«ÿËÿÉÿñÿü?þã?þã?}úôé«ÿ¨ÿÀþò/òâñ?þã¿ü¿ü?}úâñ?ûËÿóÿü?ûÏþÃþð‡?üÛñ_þ}úô/:ÿå÷ã§é•?ÿeÖ¿KíoàºÿßßéçOìýÕç¾ÿkí?þÓ§O¿T?}mïÿÂ÷/þçÿñ¿—ÿúoü'ÿ'ÿÇÿwúüÇüÿÓ§O_ýGý§9þƒ¿üŸüŸü¿øÿñ_þ_þßø¾ñŸøŸÿçÿùþŸýgÿåÿàøÃþêÿôéÓ7ÿ×ü?óÿÔÿøúò?âü§OŸ¾õÿêæÿ‰ÿÕÿñ_ýß÷'ÿ'ÿ'ÿÇÿ[ÿÿøÿyþ=Éã©¿‘““7ȧ?§ïúùÓ÷‡?üsø§ÏŸÚÞÿíïz~Õ¼ÿÙó·ðÿ»ùßÝñ?¹ñŸøŸÿçÿùþŸýgÿåÿàøÃþï?99y«|Z?™¿²öwZšß_ýOý}"ÿ‹ÿ}Ÿäääêêâñ?þã¿ú¿ú¿üŸüÿÏÿã?þã?þ_%×4­·¥íÇôï§íãvû ÿnüãûnïÿò÷?Þ¿jÌÿôþoøÿ½ü¯ï¿¦ÿ‰ÿùþŸÿçÿÙö_þþð‡?üárrróÍÿ3ÿÏü?ëÉ­ÿ·þÿÉÉÉ­ÿ·þ×úñ¿õÿøoý¿ïOþOþOþÿ·þÿñÿåÿÈÉÉÕÔœÿù?ù?ùñ?þã¿ü¿ïœ\ü/þçÿùþŸÿgÿÙøÃþð‡?üíÿ¯iÚ±ý?†û?÷ŸNïÿ2ÝzhíÿmÿoM³ÿ—ý¿4MÓ6ímÿïÕï_üoÿüïå¿ýÿåÿäÿäÿøÿÖý¿ñÿñ_ü¿4þ¤OŸ~Îþ¾ÿyûŸ½?üáû‘¾¶÷áûÿóûýüþnþ}.¿–ÿOþþçÇüoæ¿þ?Ð7þÿóÿü?ÿÏÿ³ÿì¿üüáøÃþ÷ÞŠ>}ú×ìÿü÷®iý%»ÿó¼ן4­_Mßÿÿ3ßßéçOìý½ûÿŸ¿ÿëì?þÓ§O¿U?¾Oÿw¾ñ?ÿÿ½ü×ã?ù?ù?þ¿Óÿã?þã'ÿÍŸ§Oßü_ó¿Ìÿ‚¿õ?ÖÿXÿoý?þã¿õÖÿ?Ð7þÿóÿü?ÿÏÿ³ÿì¿üüáøÃ_ý>}úïÿë?ãúSÚþOëOCû¯þ§þÇ~Ñÿ‹ÿ}¿ôéÓWÿSÿÿ‹ÿñÿÕÿÕÿåÿäÿøþÿñÿñüþ¿žäñÔßÈÉÉäÓŸÓ÷?ýüéûÃþ9üÓûmïÿö÷?Ý¿jÞÿìþ[øÿÝüïî¿øŸÜøOüÏÿóÿü?ÿÏþ³ÿòð‡?üáÿ÷ÇŸœœ¼Už>¿$m§õ§ùýÕÿÔÿØ'rñ¿øß÷INN®þ§þ'þÿã?þ«ÿ«ÿËÿÉÿñÿü?þã?þã¿ø“>}úyûþþ§Ÿ?}øÃÿöcºÒõû/íêÿÎ÷?½®ãÿ³¿æùñÿ›ù¯ÿÆôÿÄÿü?ÿÏÿóÿì?û/ÿøÃþð_üHŸ¾ó¿œÿãüçÿ8ÿ›~³ýý÷{/ûÿôéÓ/ÕwþwÝù×âþÿ{ù¯ÿÆòòüëùßøÿø/þ§OŸ¾úúOoüù?ù?ùñ?þã¿ü¿ü¿ñ}ã?ñ?ÿÏÿóÿü?ûÏþËÿÁþð‡?üÕÿéÓ§oþ¯ùæÿ©ÿñÿôåÄÿøOŸ>}ëÿÕÿÌÿÿ«ÿã¿ú¿ïOþOþOþÿ·þÿñÿóüÿz’ÇS?~#''oONßÿôó§ïøçðOŸ?µ½ÿÛßÿôüªyÿ³çoá?þwó¿»ÿârã?ñ?ÿÏÿóÿü?ûÏþËÿÁþð‡?üßrròVù´~2eíï´þ4¿¿úŸúûD.þÿû>ÉÉÉÕÿÔÿÄÿâüÇõõù?ù?þŸÿÇüÇü¿J®iZoKÛéßOÛÇíöþÝøÇ÷/ÜÞÿåï¼Õ˜ÿéýßðÿ{ù_ßM3þÿóÿü?ÿÏÿ³ÿì¿üüáøÃþäääæÿšÿgþŸùÖÿ’[ÿoý?þ“““[ÿoý¯õÿâëÿñßúߟüŸüŸüÿoý?þã?þ‹ÿéÓ§cý¬ÿOÛÿüýáÿ{ØÏo½Ÿ?^,ßÞÿïz]ÇÿgÿÌóã?þ7ó_ÿèÿ‰ÿùþŸÿçÿÙö_þþð‡?üáÿ¾ø¯ßŠ>}úíÿüûñÓôÊïÿ<ëߥö7p]Šÿïïôó§¿?ö‹þêýÿßÿµöÿéÓ§_ªŸ¾¶÷áûÿóÿøßËý7þ“ÿ“ÿãÿ;ý?þã?þÇÿš¦9ÿËù/οó?Ûâòó/Çñë˜ÿéñþã/ÿÿ«iÆâþŸÿçÿùöŸý—ÿƒ?üáøÃŸœœÜù_Îÿqþó®þþØ'ò¬<ýý¦ù‡ÿäää­ñ¿ó¿»Ïÿÿ;ÿÿ{ùßÝþ_þOþÿïõÿøÿøßÉMÓÌÿ5ÿËü/ø[ÿcýõÿÖÿã?þ[ÿgýŸ¦ÿ‰ÿùþŸÿçÿÙö_þþð‡?üá¯þ®iÚæø?}þsÚþOëOCû¯þ§þ§iâñ¿¦išúŸúŸø_üÿø¯þ¯þ/ÿ'ÿÇÿóÿøÿøÿ7â?}úôwëg÷ÿIïÿ’¿?üáûñù­÷óïÇ‹åÛû¿óýO¯ëøÿìïŸy~üÇÿfþë¿ñ}ã?ñ?ÿÏÿóÿü?ûÏþËÿÁþð‡?ü[âúôé÷ÆÿÓúÏ´þ”¶ÿÓúÓÔþ«ÿ©ÿ±_ôÅÿâß/}úôÕÿÔÿÄÿâüÇõõù?ù?þŸÿÇüÇü§OŸ>}õõøÃ_þEþOü/þÇü—ÿ—ÿ§O_ü/þgùþŸÿgÿÙøÃþð‡;þëÏŸ¢OŸþEç¿ü~ü4½òç¿Ìúw©ý \—âàû;ýüéïý¢¿úü¯Ã÷­ýÇúôé—ꧯíý_øþÅÿü?þ÷ò_ÿÿäÿäÿøÿNÿÿøÿâúôé«ÿ¨ÿ4Çð—ÿ“ÿ“ÿÿã?þËÿËÿ?Ð7þÿóÿü?ÿÏÿ³ÿì¿üüáøÃ_ýŸ>}úæÿšÿgþŸúÿO_þGüÿôéÓ·þ_ýÏü?ñ¿ú?þ«ÿûþäÿäÿäÿøëÿñÿñ?Ïÿ¯'y<õã7rròùôçôýO?úþð‡ÿôùSÛû¿ýýOϯš÷?{þþã7ÿ»û/þ'7þÿóÿü?ÿÏÿ³ÿì¿üüáøÃÿýñ'''o•Oë'óñWÖþNëOóû«ÿ©ÿ±Oäâñ¿ï“œœ\ýOýOü/þÇüWÿWÿ—ÿ“ÿãÿùüÇüÇÿ«äš¦õ¶´ý˜þý´}Ünáß|ÿÂíý_þþÇûWùŸÞÿ ÿñ¿—ÿõý×4ã?ñ?ÿÏÿóÿü?ûÏþËÿÁþð‡?üáONNnþ¯ùæÿ™ÿgý/¹õÿÖÿã?99¹õÿÖÿZÿ/þ·þÿ­ÿ÷ýÉÿÉÿÉÿñÿÖÿã?þã¿ü99¹úúóà/ÿ'ÿ'ÿ/þÇü—ÿ÷ý‘“‹ÿÅÿü?ÿÏÿóÿì?ûøÃþð‡¿ýÿ5M;¶ÿÇpÿçñþÓéý_¦ûOí¯ý¿íÿ­iöÿ²ÿ—¦iÚ¦ý¯íÿ½úý‹ÿíÿÿ½ü·ÿ¿üŸüŸüÿߺÿ7þã?þ‹ÿ—ÆŸôéÓÏÙÿÃ÷?oÿ³÷‡?üoc?Ò×öþ/|ÿ~¿ŸßßíÏ¿Ïå×òÿÉß?ðüøÿÍü×ãúÆâþŸÿçÿùöŸý—ÿƒ?üáøÃÿÞûOѧOÿšýŸÿÞ5­¿d÷ž÷ïºó“¦õ«éûŸâæû;ýüéïý¢¿wÿÿó÷ýÇúôé·êgâÏ÷éÿÎ÷/þçÿñ¿—ÿúoü'ÿ'ÿÇÿwúüÇüïä¿ùóôé›ÿkþ—ù_ð·þÇúëÿ­ÿÇü·þÏú?ãúÆâþŸÿçÿùöŸý—ÿƒ?üáø«¿Ó§Oÿ]âÿaýg\JÛÿiýihÿÕÿÔÿØ/úâñ¿ï—>}úêêâñ?þã¿ú¿ú¿üŸüÿÏÿã?þã?þßÿד<žúñ99yƒ|úsúþ§Ÿ?}øÃ?‡zÿ±íýßþþ§ûWÍûŸÝ ÿñ¿›ÿÝýÿ“ÿ‰ÿùþŸÿçÿÙö_þþð‡?üáÿþø“““·ÊÓç—¤íï´þ4¿¿úŸúûD.þÿû>ÉÉÉÕÿÔÿÄÿâüÇõõù?ù?þŸÿÇüÇüÒ§O?oÿÏßÿôó§ïøßÃ~L÷Oº~ÿ¥]ýßùþ§×uüö÷Ï}ú¥úÎÿ®;ÿZüÏÿã/ÿõßøOþOþÿo=ÿÿñÿÅÿôéÓWÿQÿéÿà/ÿ'ÿ'ÿ/þÇü—ÿ—ÿ7~ oü'þçÿùþŸÿgÿÙù?øÃþð‡¿ú?}úôÍÿ5ÿÏü?õ?þŸ¾üøÿéÓ§oý¿úŸùâõüWÿ÷ýÉÿÉÿÉÿñÿÖÿã?þãžÿ_OòxêÇoäää òéÏéûŸ~þôýáÿþéó§¶÷ûûŸž_5ïöü-üÇÿnþw÷_üOnü'þçÿùþŸÿgÿÙù?øÃþð‡ÿûãONNÞ*ŸÖOæã¯¬ýÖŸæ÷WÿSÿcŸÈÅÿâß'99¹úŸúŸø_üÿø¯þ¯þ/ÿ'ÿÇÿóÿøÿøÿWÉ5Mëmiû1ýûiû¸Ýþ¿ÿøþ…Ûû¿üý÷¯ó?½ÿþã/ÿëû¯iÆâþŸÿçÿùöŸý—ÿƒ?üáøÃŸœœÜü_óÿÌÿ3ÿÏú_rëÿ­ÿÇrrrëÿ­ÿµþ_üoý?þ[ÿïû“ÿ“ÿ“ÿãÿ­ÿÇüÇñ?}úôo¬ŸõÿiûŸ¿?üáûñù­÷óïÇ‹åÛû¿óýO¯ëøÿìïŸy~üÇÿfþë¿ñ}ã?ñ?ÿÏÿóÿü?ûÏþËÿÁþð‡?üßÿõûOѧOÿ¢ýŸ?~š^ùýŸgý»Ôþ®Kñ?ðý~þô÷Ç~Ñ_½ÿÿáû¿Öþã?}úôKõÓ×öþ/|ÿâþÿ{ù¯ÿÆòòü§ÿÇüÇÿâø_Ó4ç9ÿÅù/ðwþg[üQ~þå8~ó?=þÃüïå¿ó5ÍøOüÏÿóÿü?ÿÏþ³ÿòð‡?üáø“““;ÿËù?ÎÿqþÏÕßûDž•§¿ß4ÿ🜜¼5þwþw÷ùßâçâ/ÿ»ûÏÿËÿÉÿñÿ½þÿñÿ;ù¯išù¿æ™ÿë¬ÿ±þßúüÇëÿ¬ÿÓ4ã?ñ?ÿÏÿóÿü?ûÏþËÿÁþð‡?üÕß5MÛÿ§ÏNÛÿiýihÿÕÿÔÿ4Mü/þ×4MSÿSÿÿ‹ÿñÿÕÿÕÿåÿäÿøþÿñÿñÿÂö¿à{+û \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_1_1e1_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1e1_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_1e1_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_1e1_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1e1_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_1e1_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_1e5_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1e5_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_1e5_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_1e5_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1e5_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_1e5_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_1e7_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1e7_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_1e7_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_1e7_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1e7_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_1e7_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_1e8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1e8_states.bin.bz2 new file mode 100644 index 000000000..19bb1cdac Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_1e8_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_1e8_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1e8_states.bin.z deleted file mode 100644 index a68398e45..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_1e8_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_1e9_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1e9_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_1e9_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_1e9_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1e9_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_1e9_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_1eb_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1eb_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_1eb_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_1eb_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1eb_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_1eb_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_1ed_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1ed_states.bin.bz2 new file mode 100644 index 000000000..646198900 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_1ed_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_1ed_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1ed_states.bin.z deleted file mode 100644 index 9840a5ebe..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_1ed_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_1f8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_1f8_states.bin.bz2 new file mode 100644 index 000000000..b3ff47017 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_1f8_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_1f8_states.bin.z b/client/resources/hardnested_tables/bitflip_1_1f8_states.bin.z deleted file mode 100644 index dc0f16fc4..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_1f8_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_208_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_208_states.bin.bz2 new file mode 100644 index 000000000..b01f02208 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_208_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_208_states.bin.z b/client/resources/hardnested_tables/bitflip_1_208_states.bin.z deleted file mode 100644 index c8a8cf4a0..000000000 --- a/client/resources/hardnested_tables/bitflip_1_208_states.bin.z +++ /dev/null @@ -1 +0,0 @@ -xÚíÝO’ÄÊuåé3ªio%Vk©LSMd9¬Eõ¤§½ ´‰¶b‹Jù!àÒHÿHK{|á ü¹øu÷s~~ÿßÿçÿÎןþåOÿúÿè?ÿüŸïÿþÏßþy¾}ïÿÿÇÿüýÿ¯ýþ½íßöþ¾Þ\ÿ×›óý7Îtü³çµÅÿŠßÿÇÝûÏÑïׯï{GÇ{ýsž¿6~WÄÿ.ïÿ×›øýý{víûwÅýµ¿¿¦ýëÿËÿù»¿Ïù?ÿóÿÜ~¾ùÿÿõ¾>ßÇÿãþ×ÿß»ãý—ó¿®ñó¯×û§¯£ëoóÏ¿^×î矿Úþð¿ÿîü¸¯¿ïŸïÜÿ»ó¿þÏÿ‹ûÏÿ8Ö_þýuÜ¿?þ }/~Ûø]ÿ?ðýýçû|þÚßÿÇúÓ×›ø>ÿ'ÚŸòŸ{Ïß¿>ñýŸôüµñk¿ÿÏÿöOÿþçÿþ£ÿüó1¿ÿýûøûç¹öWÿçÿþïŸÿ÷ëó×}|þ—ïýûëŸûÿÿç÷ÿp¼?~¾=ÞÕ÷·=îö|£ó·ñkÛÿyûßm¶ŸoþûÊ7ÿüoïÇgß÷ÿÿ¯¿õ¿íÿþ£ëý¾³Ÿ¿¿ÆïßßߎÎ_Ç?ÿëŸó?þ×ÿø‡ÿùÇùþ÷×ñ6Ç´ÿµúÿÿñó?ßÃ_þý;~ÿÝïoþý¿\ÿö?Ûö?Gù??ÿËyÿù/‘ÿË^yæ¯çÿóÿþÃçÃóÿíXßÇÝÆopþaû‰ß§íÿ¿Ÿë÷ÏïÝßÿ£þ{týWôÿMüêøËÿkçÿQÿ·ý|óŸ×XüÕ¯|ýï¿Äÿó£þ»íG×7Ê_í¿_÷³“þòù÷õ_Üÿÿ5~9î×ç_ž—³ç/ãÿñùýÍߟùý¿¿ÿ·žkÿëåÿþÇÏ·ÿÞÿï¯;û/í™? Ö/þîüÛùßÑù7óóíýÎ?j?óû4[ã<·þüúÿýë›õÖ½ãÿïãõë³Ç{ýçÖo·×ÿßÿþµñk¿—÷ÿïÖO¶ïï‰õôýkï¯íÚøµíÃþoóù»õ«£õ§ƒþ»íG×7ú}g?W­ÿý£ñÿ§ëþûŸãË¿þ¯?ýéoÿ<×þê‡þøïüüõÿý×?ýcßßþûöú·ãñÝûûÏÏÇÿ¯ÿÿv¼?:ÿv|¾¿ƒóŸj?ˆÿ¿ÿ÷}½ÏOG¿_ÿí÷FÇÛþwöóׯ¯ýþã¿?ŽÏöÎ?j¿ÂñŽ¿®¸¿vüׯ¯i—ÿ×ÎÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü¿]ßýçç?3þnïïŠñ_¿¶}4^¯·ãÏ]ýéÆãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöíñùÿÖöÿÑÿéÿôÿuõü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿyúÊÿüyñ·ÿõOÿö·žkCþøïüüÏ1øþ÷ïxüw¿¿ý÷íõoõ˜ÿÒþýüuÞwþƒ×ÿ«÷ Ï¿Ñç·÷7:ÿ¨ýÌïcþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷ë‹Ú¾//ÿÒëý¿úýkï¯íÚøµíÃþoóùží;þÑ?7þµQÿÝö¿£ëý¾³Ÿ¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿÿ±¡} \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_1_220_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_220_states.bin.bz2 new file mode 100644 index 000000000..fe85775bf Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_220_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_220_states.bin.z b/client/resources/hardnested_tables/bitflip_1_220_states.bin.z deleted file mode 100644 index 479bacb03..000000000 --- a/client/resources/hardnested_tables/bitflip_1_220_states.bin.z +++ /dev/null @@ -1 +0,0 @@ -xÚíÛMnãF„aÝÀWÑtï½Ñ‰|5o}4¢Á–L‰”«êg‚ ™ÌObOj¾ªz»ߟ‡óð1$Ž_¦¿Ÿ¾ÌÝþíKß¿þrùýÒßþãKþý->É··øõ¯Þ¥/÷~ýÒÏ»ÿþ}þÿK?ÏþüÓÿkëÿxzûIþ,×ñtûã_ú~[þùû–׿¿ûïÿüõúŸ¯ý÷?þãÛ~þžýùO}Ö¾}ïÏúñ¥ÿþôó—~;ý÷­ÿ÷¯ìñçœÿnæ¿nûör‡ê¯×ÿ¼|ßóð¿ýõÖ_úïO?é··øõŸ>®ÛþãÞ¯_úùOÿØûÿ¿ôó—þøCøeþ9ÊÏwùó®}{ù}¨þzýÏÇaúúôñ<ú㯿ÞúãKÿýéç¯Å·Ó¿úwÿû¾ÿéïÿÅK–ßIÆß§§¿nûý;ýý7ý²÷ýI?é—ÿûÎÿúÿ¾ûú×ÿéÿôü¿þOþï/ÿãÿø¿ûÿóÿü?ýóÿü?ÿÏÿãÿø?þOÿò¿ü/ÿóÿ¯ëÿÝ÷ßýçÿé¿Oý{ÿ×÷û?þßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñüÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿOÿöÿî¿ý¿þßþ_þ·ÿ×ÿÛÿÓ¿þOÿ§ÿãÿõò¿÷ÿø?þïþãÿü?ÿOÿü?ÿÏÿóÿø?þÿÓ¿ü/ÿËÿü¿ý¿ûïþ»ÿü?ýÛÿ{ÿgÿÏÿÛÿ{ÿgÿOÿò¿üÿãÿø?ýãÿø?þ¯ÿÓÿéÿôÿôoÿïþÛÿëÿíÿåûý¿ý?ýëÿôú?þ_ÿ'ÿ{ÿÿãÿî?þÏÿóÿôÏÿóÿü?ÿÿãÿø?ýËÿò¿üÏÿÛÿ»ÿî¿ûÏÿÓ¿ý¿÷öÿü¿ý¿÷öÿô/ÿËÿø?þÿÓ?þÿãÿú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ý?ýÛÿ»ÿöÿúûùßþ_ÿoÿOÿú?ýŸþÿ×ÿÉÿÞÿãÿø¿ûÿóÿü?ýóÿü?ÿÏÿãÿø?þOÿò¿ü/ÿóÿöÿî¿ûïþóÿôoÿïýŸý?ÿoÿïýŸý?ýËÿò?þÿãÿôÿãÿø¿þOÿ§ÿÓÿÓ¿ý¿ûoÿ¯ÿ·ÿ—ÿíÿõÿöÿô¯ÿÓÿéÿøýŸüïý?þÿ»ÿø?ÿÏÿÓ?ÿÏÿóÿü?þÿãÿô/ÿËÿò?ÿoÿïþ»ÿî?ÿOÿöÿÞÿÙÿóÿöÿÞÿÙÿÓ¿ü/ÿãÿø?þOÿø?þÿëÿôú?ú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúû÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§ûûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûûùßþ_ÿoÿOÿú?ýŸþÿ×ÿÉÿÞÿãÿø¿ûÿóÿü?ýóÿü?ÿÏÿãÿø?þOÿò¿ü/ÿóÿöÿî¿ûïþóÿôoÿïýŸý?ÿoÿïýŸý?ýËÿò?þÿãÿôÿãÿø¿þOÿ§ÿÓÿÓ¿ý¿ûoÿ¯ÿ·ÿ—ÿíÿõÿöÿô¯ÿÓÿéÿøýŸüïý?þÿ»ÿø?ÿÏÿÓ?ÿÏÿóÿü?þÿãÿô/ÿËÿò?ÿoÿïþ»ÿî?ÿOÿöÿÞÿÙÿóÿöÿÞÿÙÿÓ¿ü/ÿãÿø?þOÿø?þÿëÿôú?ý?ýÛÿ»ÿöÿúùßþ_ÿoÿOÿú?ýŸþÿ×ÿÉÿÞÿãÿø¿ûÿóÿü?ýóÿü?ÿÏÿãÿø?þOÿò¿ü/ÿóÿöÿî¿ûïþóÿôoÿïýŸý?ÿoÿïýŸý?ýËÿò?þÿãÿôÿãÿø¿þOÿ§ÿÓÿÓ¿ý¿ûoÿ¯ÿ·ÿ—ÿíÿõÿöÿô¯ÿÓÿéÿøýŸüïý?þÿ»ÿø?ÿÏÿÓ?ÿÏÿóÿü?þÿãÿô/ÿËÿò?ÿoÿïþ»ÿî?ÿOÿöÿÞÿÙÿóÿöÿÞÿÙÿÓ¿ü/ÿãÿø?þOÿø?þÿëÿôú?ý?ýÛÿ»ÿöÿúûûý¿ý?ýëÿôú?þ_ÿ'ÿ{ÿÿãÿî?þÏÿóÿôÏÿóÿü?ÿÿãÿø?ýËÿò¿üÏÿÛÿ»ÿî¿ûÏÿÓ¿ý¿÷öÿü¿ý¿÷öÿô/ÿËÿø?þÿÓ?þÿãÿú?ýŸþOÿOÿöÿî¿ý¿þßþ_þ·ÿ×ÿÛÿÓ¿þOÿ§ÿãÿõò¿÷ÿø?þïþãÿü?ÿOÿü?ÿÏÿóÿø?þÿÓ¿ü/ÿËÿü¿ý¿ûïþ»ÿü?ýÛÿ{ÿgÿÏÿÛÿ{ÿgÿOÿò¿üÿãÿø?ýãÿø?þ¯ÿÓÿéÿôÿôoÿïþÛÿëÿíÿåý¿ý?ýëÿôú?þ_ÿ'ÿ{ÿÿãÿî?þÏÿóÿôÏÿóÿü?ÿÿãÿø?ýËÿò¿üÏÿÛÿ»ÿî¿ûÏÿÓ¿ý¿÷öÿü¿ý¿÷öÿô/ÿËÿø?þÿÓ?þÿãÿú?ýŸþOÿOÿöÿî¿ý¿þßþ_þ·ÿ×ÿÛÿÓ¿þOÿ§ÿãÿõò¿÷ÿø?þïþãÿü?ÿOÿü?ÿÏÿóÿø?þÿÓ¿ü/ÿËÿü¿ý¿ûïþ»ÿü?ýÛÿ{ÿgÿÏÿÛÿ{ÿgÿOÿò¿üÿãÿø?ýãÿø?þ¯ÿÓÿéÿôÿôoÿïþÛÿëÿíÿåûûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþÿ×ÿÉÿÞÿãÿø¿ûÿóÿü?ýóÿü?ÿÏÿãÿø?þOÿò¿ü/ÿóÿöÿî¿ûïþóÿôoÿïýŸý?ÿoÿïýŸý?ýËÿò?þÿãÿôÿãÿø¿þOÿ§ÿÓÿÓ¿ý¿ûoÿ¯ÿ·ÿ—ÿíÿõÿöÿô¯ÿÓÿéÿøýŸüïý?þÿ»ÿø?ÿÏÿÓ?ÿÏÿóÿü?þÿãÿô/ÿËÿò?ÿoÿïþ»ÿî?ÿOÿöÿÞÿÙÿóÿöÿÞÿÙÿÓ¿ü/ÿãÿø?þOÿø?þÿëÿôú?ý?ýÛÿ»ÿöÿúûùßþ_ÿoÿOÿú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?þ_ÿ'ÿ{ÿÿãÿî?þÏÿóÿôÏÿóÿü?ÿÿãÿø?ýËÿò¿üÏÿÛÿ»ÿî¿ûÏÿÓ¿ý¿÷öÿü¿ý¿÷öÿô/ÿËÿø?þÿÓ?þÿãÿú?ýŸþOÿOÿöÿî¿ý¿þßþ_þ·ÿ×ÿÛÿÓ¿þOÿ§ÿãÿõò¿÷ÿø?þïþãÿü?ÿOÿü?ÿÏÿóÿø?þÿÓ¿ü/ÿËÿü¿ý¿ûïþ»ÿü?ýÛÿ{ÿgÿÏÿÛÿ{ÿgÿOÿò¿üÿãÿø?ýãÿø?þ¯ÿÓÿéÿôÿôoÿïþÛÿëÿíÿåûý¿ý?ýëÿôú?ýŸüïý?þÿ»ÿø?ÿÏÿÓ?ÿÏÿóÿü?þÿãÿô/ÿËÿò?ÿoÿïþ»ÿî?ÿOÿöÿÞÿÙÿóÿöÿÞÿÙÿÓ¿ü/ÿãÿø?þOÿø?þÿëÿôú?ý?ýÛÿ»ÿöÿúûùßþ_ÿoÿOÿú?ýŸþÿ×ÿÉÿÞÿãÿø¿ûÿóÿü?ýóÿü?ÿÏÿãÿø?þOÿò¿ü/ÿóÿöÿî¿ûïþóÿôoÿïýŸý?ÿoÿïýŸý?ýËÿò?þÿãÿôÿãÿø¿þOÿ§ÿÓÿÓ¿ý¿ûoÿ¯ÿ·ÿ—ÿíÿõÿöÿô¯ÿÓÿéÿøùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùþŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿù÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûÿÞßÿý[‘Ôß \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_1_24a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_24a_states.bin.bz2 new file mode 100644 index 000000000..15195d213 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_24a_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_24a_states.bin.z b/client/resources/hardnested_tables/bitflip_1_24a_states.bin.z deleted file mode 100644 index a4cc5d58c..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_24a_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_24e_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_24e_states.bin.bz2 new file mode 100644 index 000000000..18a6d4987 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_24e_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_24e_states.bin.z b/client/resources/hardnested_tables/bitflip_1_24e_states.bin.z deleted file mode 100644 index f7bb63eb7..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_24e_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_25a_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_25a_states.bin.bz2 new file mode 100644 index 000000000..fa1be58fd Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_25a_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_25a_states.bin.z b/client/resources/hardnested_tables/bitflip_1_25a_states.bin.z deleted file mode 100644 index 4e5b2ff27..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_25a_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_25e_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_25e_states.bin.bz2 new file mode 100644 index 000000000..b6c1eb54c Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_25e_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_25e_states.bin.z b/client/resources/hardnested_tables/bitflip_1_25e_states.bin.z deleted file mode 100644 index f8686dba6..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_25e_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_262_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_262_states.bin.bz2 new file mode 100644 index 000000000..15195d213 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_262_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_262_states.bin.z b/client/resources/hardnested_tables/bitflip_1_262_states.bin.z deleted file mode 100644 index a4cc5d58c..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_262_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_266_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_266_states.bin.bz2 new file mode 100644 index 000000000..18a6d4987 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_266_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_266_states.bin.z b/client/resources/hardnested_tables/bitflip_1_266_states.bin.z deleted file mode 100644 index f7bb63eb7..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_266_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_272_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_272_states.bin.bz2 new file mode 100644 index 000000000..fa1be58fd Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_272_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_272_states.bin.z b/client/resources/hardnested_tables/bitflip_1_272_states.bin.z deleted file mode 100644 index 4e5b2ff27..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_272_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_276_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_276_states.bin.bz2 new file mode 100644 index 000000000..b6c1eb54c Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_276_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_276_states.bin.z b/client/resources/hardnested_tables/bitflip_1_276_states.bin.z deleted file mode 100644 index f8686dba6..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_276_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_280_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_280_states.bin.bz2 new file mode 100644 index 000000000..6d1908e79 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_280_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_280_states.bin.z b/client/resources/hardnested_tables/bitflip_1_280_states.bin.z deleted file mode 100644 index e4f4b6ac6..000000000 --- a/client/resources/hardnested_tables/bitflip_1_280_states.bin.z +++ /dev/null @@ -1,2 +0,0 @@ -xÚí×AŠ­P á,Õ;w!щG -! ‡¯{ð4܆.Rˆ-ö£÷×Wý/³þýöóîçOOÿþîßoúï?þø¯Ë?š_õ÷ç=?÷íçÝÏŸþšþýÝ¿ßôßüñ_—¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí?þúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõŸþãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡?ÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó?þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷Ÿýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó?þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿ý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸþÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì?þøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí?þúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõŸþãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡?ÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó?þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷Ÿýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó?þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì¿þÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿ý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸþÃüõ¿ý×øë?þç÷Ïÿøó?ÿ{ÿáoÿùŸÿÝ?ÿãÏÿüïý‡?þøë?û¯ÿðÇýoÿõþúÿùßýó?þüÏÿÞøÛþç÷Ïÿøó?ÿ{ÿá?þúÏþë?üñÇ_ÿÛý‡¿þãþwÿü?ÿó¿÷þöŸÿùßýó?þüÏÿÞøã¿þ³ÿúüñ×ÿö_ÿá¯ÿøŸÿÝ?ÿãÏÿüïý‡¿ýçþwÿü?ÿó¿÷þøã¯ÿì?þøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þúßþë?üõÿó¿ûçüùŸÿ½ÿð·ÿüÏÿîŸÿñçþ÷þÃüõŸý×øã¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùþçï?üñÇ_ÿÙý‡?þøëû¯ÿð×üÏÿîŸÿñçþ÷þÃßþó?ÿ»þÇŸÿùßûüñ×ö_ÿá¿þ·ÿúýÇÿüïþùþçï?üí?ÿó¿ûçüùŸÿ½ÿðÇýgÿõþøã¯ÿí¿þÃ_ÿñ?ÿ»þÇŸÿùßûûÏÿüïþùÿ¿ò?š;Õm \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_1_2a8_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_2a8_states.bin.bz2 new file mode 100644 index 000000000..b01f02208 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_2a8_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_2a8_states.bin.z b/client/resources/hardnested_tables/bitflip_1_2a8_states.bin.z deleted file mode 100644 index c8a8cf4a0..000000000 --- a/client/resources/hardnested_tables/bitflip_1_2a8_states.bin.z +++ /dev/null @@ -1 +0,0 @@ -xÚíÝO’ÄÊuåé3ªio%Vk©LSMd9¬Eõ¤§½ ´‰¶b‹Jù!àÒHÿHK{|á ü¹øu÷s~~ÿßÿçÿÎןþåOÿúÿè?ÿüŸïÿþÏßþy¾}ïÿÿÇÿüýÿ¯ýþ½íßöþ¾Þ\ÿ×›óý7Îtü³çµÅÿŠßÿÇÝûÏÑïׯï{GÇ{ýsž¿6~WÄÿ.ïÿ×›øýý{víûwÅýµ¿¿¦ýëÿËÿù»¿Ïù?ÿóÿÜ~¾ùÿÿõ¾>ßÇÿãþ×ÿß»ãý—ó¿®ñó¯×û§¯£ëoóÏ¿^×î矿Úþð¿ÿîü¸¯¿ïŸïÜÿ»ó¿þÏÿ‹ûÏÿ8Ö_þýuÜ¿?þ }/~Ûø]ÿ?ðýýçû|þÚßÿÇúÓ×›ø>ÿ'ÚŸòŸ{Ïß¿>ñýŸôüµñk¿ÿÏÿöOÿþçÿþ£ÿüó1¿ÿýûøûç¹öWÿçÿþïŸÿ÷ëó×}|þ—ïýûëŸûÿÿç÷ÿp¼?~¾=ÞÕ÷·=îö|£ó·ñkÛÿyûßm¶ŸoþûÊ7ÿüoïÇgß÷ÿÿ¯¿õ¿íÿþ£ëý¾³Ÿ¿¿ÆïßßߎÎ_Ç?ÿëŸó?þ×ÿø‡ÿùÇùþ÷×ñ6Ç´ÿµúÿÿñó?ßÃ_þý;~ÿÝïoþý¿\ÿö?Ûö?Gù??ÿËyÿù/‘ÿË^yæ¯çÿóÿþÃçÃóÿíXßÇÝÆopþaû‰ß§íÿ¿Ÿë÷ÏïÝßÿ£þ{týWôÿMüêøËÿkçÿQÿ·ý|óŸ×XüÕ¯|ýï¿Äÿó£þ»íG×7Ê_í¿_÷³“þòù÷õ_Üÿÿ5~9î×ç_ž—³ç/ãÿñùýÍߟùý¿¿ÿ·žkÿëåÿþÇÏ·ÿÞÿï¯;û/í™? Ö/þîüÛùßÑù7óóíýÎ?j?óû4[ã<·þüúÿýë›õÖ½ãÿïãõë³Ç{ýçÖo·×ÿßÿþµñk¿—÷ÿïÖO¶ïï‰õôýkï¯íÚøµíÃþoóù»õ«£õ§ƒþ»íG×7ú}g?W­ÿý£ñÿ§ëþûŸãË¿þ¯?ýéoÿ<×þê‡þøïüüõÿý×?ýcßßþûöú·ãñÝûûÏÏÇÿ¯ÿÿv¼?:ÿv|¾¿ƒóŸj?ˆÿ¿ÿ÷}½ÏOG¿_ÿí÷FÇÛþwöóׯ¯ýþã¿?ŽÏöÎ?j¿ÂñŽ¿®¸¿vüׯ¯i—ÿ×ÎÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü¿]ßýçç?3þnïïŠñ_¿¶}4^¯·ãÏ]ýéÆãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöíñùÿÖöÿÑÿéÿôÿuõü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿyúÊÿüyñ·ÿõOÿö·žkCþøïüüÏ1øþ÷ïxüw¿¿ý÷íõoõ˜ÿÒþýüuÞwþƒ×ÿ«÷ Ï¿Ñç·÷7:ÿ¨ýÌïcþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷ë‹Ú¾//ÿÒëý¿úýkï¯íÚøµíÃþoóùží;þÑ?7þµQÿÝö¿£ëý¾³Ÿ¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿÿ±¡} \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_1_2c2_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_2c2_states.bin.bz2 new file mode 100644 index 000000000..15195d213 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_2c2_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_2c2_states.bin.z b/client/resources/hardnested_tables/bitflip_1_2c2_states.bin.z deleted file mode 100644 index a4cc5d58c..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_2c2_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_2c6_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_2c6_states.bin.bz2 new file mode 100644 index 000000000..18a6d4987 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_2c6_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_2c6_states.bin.z b/client/resources/hardnested_tables/bitflip_1_2c6_states.bin.z deleted file mode 100644 index f7bb63eb7..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_2c6_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_2d2_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_2d2_states.bin.bz2 new file mode 100644 index 000000000..fa1be58fd Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_2d2_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_2d2_states.bin.z b/client/resources/hardnested_tables/bitflip_1_2d2_states.bin.z deleted file mode 100644 index 4e5b2ff27..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_2d2_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_2d6_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_2d6_states.bin.bz2 new file mode 100644 index 000000000..b6c1eb54c Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_2d6_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_2d6_states.bin.z b/client/resources/hardnested_tables/bitflip_1_2d6_states.bin.z deleted file mode 100644 index f8686dba6..000000000 Binary files a/client/resources/hardnested_tables/bitflip_1_2d6_states.bin.z and /dev/null differ diff --git a/client/resources/hardnested_tables/bitflip_1_328_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_328_states.bin.bz2 new file mode 100644 index 000000000..b01f02208 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_328_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_328_states.bin.z b/client/resources/hardnested_tables/bitflip_1_328_states.bin.z deleted file mode 100644 index c8a8cf4a0..000000000 --- a/client/resources/hardnested_tables/bitflip_1_328_states.bin.z +++ /dev/null @@ -1 +0,0 @@ -xÚíÝO’ÄÊuåé3ªio%Vk©LSMd9¬Eõ¤§½ ´‰¶b‹Jù!àÒHÿHK{|á ü¹øu÷s~~ÿßÿçÿÎןþåOÿúÿè?ÿüŸïÿþÏßþy¾}ïÿÿÇÿüýÿ¯ýþ½íßöþ¾Þ\ÿ×›óý7Îtü³çµÅÿŠßÿÇÝûÏÑïׯï{GÇ{ýsž¿6~WÄÿ.ïÿ×›øýý{víûwÅýµ¿¿¦ýëÿËÿù»¿Ïù?ÿóÿÜ~¾ùÿÿõ¾>ßÇÿãþ×ÿß»ãý—ó¿®ñó¯×û§¯£ëoóÏ¿^×î矿Úþð¿ÿîü¸¯¿ïŸïÜÿ»ó¿þÏÿ‹ûÏÿ8Ö_þýuÜ¿?þ }/~Ûø]ÿ?ðýýçû|þÚßÿÇúÓ×›ø>ÿ'ÚŸòŸ{Ïß¿>ñýŸôüµñk¿ÿÏÿöOÿþçÿþ£ÿüó1¿ÿýûøûç¹öWÿçÿþïŸÿ÷ëó×}|þ—ïýûëŸûÿÿç÷ÿp¼?~¾=ÞÕ÷·=îö|£ó·ñkÛÿyûßm¶ŸoþûÊ7ÿüoïÇgß÷ÿÿ¯¿õ¿íÿþ£ëý¾³Ÿ¿¿ÆïßßߎÎ_Ç?ÿëŸó?þ×ÿø‡ÿùÇùþ÷×ñ6Ç´ÿµúÿÿñó?ßÃ_þý;~ÿÝïoþý¿\ÿö?Ûö?Gù??ÿËyÿù/‘ÿË^yæ¯çÿóÿþÃçÃóÿíXßÇÝÆopþaû‰ß§íÿ¿Ÿë÷ÏïÝßÿ£þ{týWôÿMüêøËÿkçÿQÿ·ý|óŸ×XüÕ¯|ýï¿Äÿó£þ»íG×7Ê_í¿_÷³“þòù÷õ_Üÿÿ5~9î×ç_ž—³ç/ãÿñùýÍߟùý¿¿ÿ·žkÿëåÿþÇÏ·ÿÞÿï¯;û/í™? Ö/þîüÛùßÑù7óóíýÎ?j?óû4[ã<·þüúÿýë›õÖ½ãÿïãõë³Ç{ýçÖo·×ÿßÿþµñk¿—÷ÿïÖO¶ïï‰õôýkï¯íÚøµíÃþoóù»õ«£õ§ƒþ»íG×7ú}g?W­ÿý£ñÿ§ëþûŸãË¿þ¯?ýéoÿ<×þê‡þøïüüõÿý×?ýcßßþûöú·ãñÝûûÏÏÇÿ¯ÿÿv¼?:ÿv|¾¿ƒóŸj?ˆÿ¿ÿ÷}½ÏOG¿_ÿí÷FÇÛþwöóׯ¯ýþã¿?ŽÏöÎ?j¿ÂñŽ¿®¸¿vüׯ¯i—ÿ×ÎÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü¿]ßýçç?3þnïïŠñ_¿¶}4^¯·ãÏ]ýéÆãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöíñùÿÖöÿÑÿéÿôÿuõü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿyúÊÿüyñ·ÿõOÿö·žkCþøïüüÏ1øþ÷ïxüw¿¿ý÷íõoõ˜ÿÒþýüuÞwþƒ×ÿ«÷ Ï¿Ñç·÷7:ÿ¨ýÌïcþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷ë‹Ú¾//ÿÒëý¿úýkï¯íÚøµíÃþoóùží;þÑ?7þµQÿÝö¿£ëý¾³Ÿ¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿÿ±¡} \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_1_388_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_388_states.bin.bz2 new file mode 100644 index 000000000..b01f02208 Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_388_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_388_states.bin.z b/client/resources/hardnested_tables/bitflip_1_388_states.bin.z deleted file mode 100644 index c8a8cf4a0..000000000 --- a/client/resources/hardnested_tables/bitflip_1_388_states.bin.z +++ /dev/null @@ -1 +0,0 @@ -xÚíÝO’ÄÊuåé3ªio%Vk©LSMd9¬Eõ¤§½ ´‰¶b‹Jù!àÒHÿHK{|á ü¹øu÷s~~ÿßÿçÿÎןþåOÿúÿè?ÿüŸïÿþÏßþy¾}ïÿÿÇÿüýÿ¯ýþ½íßöþ¾Þ\ÿ×›óý7Îtü³çµÅÿŠßÿÇÝûÏÑïׯï{GÇ{ýsž¿6~WÄÿ.ïÿ×›øýý{víûwÅýµ¿¿¦ýëÿËÿù»¿Ïù?ÿóÿÜ~¾ùÿÿõ¾>ßÇÿãþ×ÿß»ãý—ó¿®ñó¯×û§¯£ëoóÏ¿^×î矿Úþð¿ÿîü¸¯¿ïŸïÜÿ»ó¿þÏÿ‹ûÏÿ8Ö_þýuÜ¿?þ }/~Ûø]ÿ?ðýýçû|þÚßÿÇúÓ×›ø>ÿ'ÚŸòŸ{Ïß¿>ñýŸôüµñk¿ÿÏÿöOÿþçÿþ£ÿüó1¿ÿýûøûç¹öWÿçÿþïŸÿ÷ëó×}|þ—ïýûëŸûÿÿç÷ÿp¼?~¾=ÞÕ÷·=îö|£ó·ñkÛÿyûßm¶ŸoþûÊ7ÿüoïÇgß÷ÿÿ¯¿õ¿íÿþ£ëý¾³Ÿ¿¿ÆïßßߎÎ_Ç?ÿëŸó?þ×ÿø‡ÿùÇùþ÷×ñ6Ç´ÿµúÿÿñó?ßÃ_þý;~ÿÝïoþý¿\ÿö?Ûö?Gù??ÿËyÿù/‘ÿË^yæ¯çÿóÿþÃçÃóÿíXßÇÝÆopþaû‰ß§íÿ¿Ÿë÷ÏïÝßÿ£þ{týWôÿMüêøËÿkçÿQÿ·ý|óŸ×XüÕ¯|ýï¿Äÿó£þ»íG×7Ê_í¿_÷³“þòù÷õ_Üÿÿ5~9î×ç_ž—³ç/ãÿñùýÍߟùý¿¿ÿ·žkÿëåÿþÇÏ·ÿÞÿï¯;û/í™? Ö/þîüÛùßÑù7óóíýÎ?j?óû4[ã<·þüúÿýë›õÖ½ãÿïãõë³Ç{ýçÖo·×ÿßÿþµñk¿—÷ÿïÖO¶ïï‰õôýkï¯íÚøµíÃþoóù»õ«£õ§ƒþ»íG×7ú}g?W­ÿý£ñÿ§ëþûŸãË¿þ¯?ýéoÿ<×þê‡þøïüüõÿý×?ýcßßþûöú·ãñÝûûÏÏÇÿ¯ÿÿv¼?:ÿv|¾¿ƒóŸj?ˆÿ¿ÿ÷}½ÏOG¿_ÿí÷FÇÛþwöóׯ¯ýþã¿?ŽÏöÎ?j¿ÂñŽ¿®¸¿vüׯ¯i—ÿ×ÎÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü¿]ßýçç?3þnïïŠñ_¿¶}4^¯·ãÏ]ýéÆãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöíñùÿÖöÿÑÿéÿôÿuõü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿyúÊÿüyñ·ÿõOÿö·žkCþøïüüÏ1øþ÷ïxüw¿¿ý÷íõoõ˜ÿÒþýüuÞwþƒ×ÿ«÷ Ï¿Ñç·÷7:ÿ¨ýÌïcþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷ë‹Ú¾//ÿÒëý¿úýkï¯íÚøµíÃþoóùží;þÑ?7þµQÿÝö¿£ëý¾³Ÿ¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿ;íÿ5£þz[¾ÝìèøgÏ?j?Üÿë‚ß¿­?ßÄï{GÇ{ýsž¿6~WÄßþöÿ³ÿßšûÿÑÿéÿôú?ýŸþOÿÇÿãÿñÿøü¿üÿÇÿãÿñÿøü?þÿÿçÿÃÿãÿñÿüüÿüÿüÿòÿóó¿ùÿÚóÿöï·¼ÿ³ž¿6~OÿÏ®¿ÞÞßã¿&~mûh¼<_×õç'ÿg?[ýnwü~pþ:þôú?ýYýŸÿŸÿŸÿ]ÿ¿ü/ÿËÿ ûÿf¿ÿ“ýWíýÕýO¿ºÿoiÿß]ô¿Yþ«Öv•þ÷u2~ïÆ÷gÛ¢þ;ÿßsýôú?ýßþÿøü?þÿÿÃÿãÿñÿÖÿ­ÿ[ÿÇÿËÿøëÿøþü¿õü?þÿoýÿÿÇÿãÿñÿôú¿üOÿ§ÿÓÿéÿôëÿôúÿsôõÕÿ5ÿ7ÿ7ÿ7ÿ7ÿ_oþ/ÿËÿòÿºùöû?»þz{mÿÓÆ¯mö›Ï÷ükMýù¶ÿ]_’$I’$I’$É]ž¿Wü^Çýøüî#NŸ¿ŒÿöÿšQ½­?ßî?vtü³çµîÿuÁïßÖŸoâ¿÷½£ã½¿þ9Ï_¿+âoÿ?ûÿÙÿoÍýÿèÿôú?ýŸþOÿ§ÿãÿñÿøü?þ_þÇÿãÿñÿøü?þÿÿÇÿóÿáÿñÿøþ?þþþùÿùùßüíùû÷[ÞÿYÏ_¿§ÿg×_oïïŠñ_¿¶}4^¯ëúó“Çÿ³Ÿ¿­~·;~?8ú?ýŸþ¿¬þÏÿÏÿÏÿ¿®ÿ_þ—ÿåÿ…ý³ßÿÉþ«öþêþ§Œ_ÝÎÿ·´ÿï.úß,ÿUë?»Jÿû:¿wãû³í?Qÿÿï¹þ?ú?ýŸþoÿü?þÿÿÇÿáÿñÿøëÿÖÿ­ÿãÿåü¿õü?ÿ?þßú?þÿÿ·þÿÇÿãÿñÿøú?ý_þ§ÿÓÿéÿôú¿õú?ýÿ9ú¿ú¿êÿšÿ›ÿ›ÿ›ÿ›ÿ¯7ÿ—ÿåùÝü?ûýŸ]½½¿¶ÿiã×¶û¿Íç{þµ¦þ|ÛÿŽ®/I’$I’$I’ä.Ïß+~¯ã~|~÷§Ï_ÆÿNûͨ¿ÞÖŸo÷;:þÙóÚ÷ÿºà÷oëÏ7ñßûÞÑñÞ_ÿœç¯ßñ·ÿŸýÿìÿ·æþôú?ýŸþOÿ§ÿÓÿñÿøü?þÿ/ÿãÿñÿøü?þÿÿÇÿãÿùÿðÿøü?ÿÿ?ÿ?ÿ¿üÿüüoþ¿öü¿ýû-ïÿ¬ç¯ßÓÇÿ³ë¯·÷wÅø¯‰_Û>/Æ×uýùÉãÿÙÏßV¿Û¿œ¿Ž?ýŸþOÿ_Vÿçÿçÿçÿ_×ÿ/ÿËÿòÿÂþ¿ÙïÿdÿU{uÿSƯnçÿ[Úÿwýo–ÿªõŸ]¥ÿ}Œß»ñýÙöŸ¨ÿÎÿ÷\ÿýŸþOÿ·ÿ?þÿÿÇÿãÿðÿøü¿õëÿÖÿñÿò?þßú?þŸÿÿoýÿÿÇÿ[ÿÇÿãÿñÿøü?ýŸþ/ÿÓÿéÿôú?ýßú?ýŸþÿý_ý_õÍÿÍÿÍÿÍÿÍÿ×›ÿËÿò¿ü¿nþŸýþÏ®¿ÞÞ_Ûÿ´ñkÛ‡ýßæó=ÿZS¾íG×—$I’$I’$Ir—çï¿×q?>¿ûˆÓç/ã§ý¿fÔ_oëÏ·ûÿìùGí‡û]ðû·õç›øï}ïèxï¯Îó×ÆïŠøÛÿÏþöÿ[sÿ?ú?ýŸþOÿ§ÿÓÿéÿøü?þÿÿ—ÿñÿøü?þÿÿÇÿãÿñÿüøü?þŸÿÿŸÿŸÿ_þ~þ7ÿ_{þßþý–÷ÖóׯïéãÿÙõ×Ûû»bü×įm—Gãëºþüäñÿìço«ßíŽßÎ_ÇŸþOÿ§ÿ/«ÿóÿóÿóÿ¯ëÿ—ÿåùaÿßì÷²ÿª½¿ºÿ)ãW·óÿ-íÿ»‹þ7ËÕúÏ®Òÿ¾NÆïÝøþlûOÔçÿ{®ÿþOÿ§ÿÛÿÿÿÇÿãÿñøü?þßú¿õëÿøùÿoýÿÏÿÿ·þÿÇÿãÿ­ÿãÿñÿøü?þŸþOÿ—ÿéÿôú?ýŸþoýŸþOÿŽþ¯þ¯ú¿æÿæÿæÿæÿæÿëÍÿåù_þ_7ÿÏ~ÿg×_oï¯íÚøµíÃþoóùž­©?ßö¿£ëK’$I’$I’$¹Ëó÷Šß븟ß}Äéó—ñ¿Óþ_3꯷õçÛýÇŽŽöü£öÃý¿.øýÛúóMü÷¾wt¼÷×?çùkãwEüíÿgÿ?ûÿ­¹ÿýŸþOÿ§ÿÓÿéÿôü?þÿÿÇÿËÿøü?þÿÿÇÿãÿñÿøþ?ü?þÿÏÿÇÿÏÿÏÿ/ÿ??ÿ›ÿ¯=ÿoÿ~Ëû?ëùkã÷ôñÿìúëíý]1þkâ×¶ÆË£ñu]~òøöó·ÕïvÇïç¯ãOÿ§ÿÓÿ—Õÿùÿùÿùÿ×õÿËÿò¿ü¿°ÿoöû?ÙÕÞ_Ýÿ”ñ«Ûùÿ–öÿÝEÿ›å¿jýgWé_'ã÷n|¶ý'ê¿óÿ=×ÿGÿ§ÿÓÿíÿÿÇÿãÿñÿø?ü?þÿoýßú¿õü¿üÿ·þÿçÿÇÿ[ÿÇÿãÿñÿÖÿñÿøü?þÿOÿ§ÿËÿôú?ýŸþOÿ·þOÿ§ÿ?GÿWÿWý_óóóóóÿõæÿò¿ü/ÿ¯›ÿg¿ÿ³ë¯·÷×ö?müÚöaÿ·ù|Ï¿ÖÔŸoûßÑõ%I’$I’$I’Üåù{ÅïuÜÏï>âôùËøßiÿ¯õ×ÛúóíþcGÇ?{þQûáþ_üþmýù&þ{ß;:ÞûëŸóüµñ»"þöÿ³ÿŸýÿÖÜÿþOÿ§ÿÓÿéÿôú?þÿÿÇÿãÿåü?þÿÿÇÿãÿñÿøü?ÿþÿÿçÿãÿçÿçÿ—ÿŸŸÿÍÿמÿ·¿åýŸõüµñ{úøvýõöþ®ÿ5ñkÛGãåÑøº®??yü?ûùÛêw»ã÷ƒó×ñ§ÿÓÿéÿËêÿüÿüÿüÿëúÿåù_þ_Øÿ7ûýŸì¿jï¯îÊøÕíüKûÿî¢ÿÍò_µþ³«ô¿¯“ñ{7¾?Ûþõßùÿžëÿ£ÿÓÿéÿöÿÇÿãÿñÿøüþÿÿ·þoýßú?þ_þÇÿ[ÿÇÿóÿãÿ­ÿãÿñÿøëÿøü?þÿÿ§ÿÓÿåú?ýŸþOÿ§ÿ[ÿ§ÿÓÿŸ£ÿ«ÿ«þ¯ù¿ù¿ù¿ù¿ùÿzóù_þ—ÿ×Íÿ³ßÿÙõ×ÛûkûŸ6~mû°ÿÛ|¾ç_kêÏ·ýïèú’$I’$I’$Iîòü½â÷:îÇçwqúüeüï´ÿ׌úëmýùvÿ±£ãŸ=ÿ¨ýpÿ¯ ~ÿ¶þ|ÿ½ïïýõÏyþÚø]ûÿÙÿÏþkîÿGÿ§ÿÓÿéÿôú?ýÿÿÇÿãÿñÿò?þÿÿÇÿãÿñÿøü?þŸÿÿÿÇÿóÿñÿóÿóÿËÿÏÏÿæÿkÏÿÛ¿ßòþÏzþÚø=}ü?»þz{WŒÿšøµí£ñòh|]ןŸ<þŸýümõ»ÝñûÁùëøÓÿéÿôÿeõþþþÿuýÿò¿ü/ÿ/ìÿ›ýþOö_µ÷W÷?eüêvþ¿¥ýwÑÿfù¯ZÿÙUúß×Éø½ߟmÿ‰úïüÏõÿÑÿéÿôûÿãÿñÿøü?þÿÿÇÿ[ÿ·þoýÿ/ÿãÿ­ÿãÿùÿñÿÖÿñÿøü¿õü?þÿÿÇÿÓÿéÿò?ýŸþOÿ§ÿÓÿ­ÿÓÿéÿÏÑÿÕÿUÿ×üßüßüßüßü½ù¿ü/ÿËÿëæÿÙïÿìúëíýµýO¿¶}Øÿm>ßó¯5õçÛþwt}I’$I’$I’$wyþ^ñ{÷ãó»8}þ2þwÚÿkFýõ¶þ|»ÿØÑñÏžÔ~¸ÿ׿[¾‰ÿÞ÷ŽŽ÷þúç<mü®ˆ¿ýÿìÿgÿ¿5÷ÿ£ÿÓÿéÿôú?ýŸþÿÇÿãÿñÿøùÿÿÇÿãÿñÿøü?þÿÏÿ‡ÿÇÿãÿùÿøÿùÿùÿåÿççóÿµçÿíßoyÿg=müž>þŸ]½½¿+ÆMüÚöÑxy4¾®ëÏOÿÏ~þ¶úÝîøýàüuüéÿôúÿ²ú?ÿ?ÿ?ÿÿºþù_þ—ÿöÿÍ~ÿ'û¯Úû«ûŸ2~u;ÿßÒþ¿»è³üW­ÿì*ýïëdüÞï϶ÿDýwþ¿çúÿèÿôú¿ýÿñÿøü?þÿ‡ÿÇÿãÿ­ÿ[ÿ·þÿ—ÿñÿÖÿñÿüÿøëÿøü?þßú?þÿÿÇÿãÿéÿôùŸþOÿ§ÿÓÿéÿÖÿéÿôÿçèÿêÿªÿkþoþoþoþoþ¿Þü_þ—ÿåÿuóÿì÷výõöþÚþ§_Û>ìÿ6Ÿïùךúómÿ;º¾$I’$I’$I’»<¯ø½ŽûñùÝGœ>ÿÿ±¡} \ No newline at end of file diff --git a/client/resources/hardnested_tables/bitflip_1_3a0_states.bin.bz2 b/client/resources/hardnested_tables/bitflip_1_3a0_states.bin.bz2 new file mode 100644 index 000000000..fe85775bf Binary files /dev/null and b/client/resources/hardnested_tables/bitflip_1_3a0_states.bin.bz2 differ diff --git a/client/resources/hardnested_tables/bitflip_1_3a0_states.bin.z b/client/resources/hardnested_tables/bitflip_1_3a0_states.bin.z deleted file mode 100644 index 479bacb03..000000000 --- a/client/resources/hardnested_tables/bitflip_1_3a0_states.bin.z +++ /dev/null @@ -1 +0,0 @@ -xÚíÛMnãF„aÝÀWÑtï½Ñ‰|5o}4¢Á–L‰”«êg‚ ™ÌObOj¾ªz»ߟ‡óð1$Ž_¦¿Ÿ¾ÌÝþíKß¿þrùýÒßþãKþý->É··øõ¯Þ¥/÷~ýÒÏ»ÿþ}þÿK?ÏþüÓÿkëÿxzûIþ,×ñtûã_ú~[þùû–׿¿ûïÿüõúŸ¯ý÷?þãÛ~þžýùO}Ö¾}ïÏúñ¥ÿþôó—~;ý÷­ÿ÷¯ìñçœÿnæ¿nûör‡ê¯×ÿ¼|ßóð¿ýõÖ_úïO?é··øõŸ>®ÛþãÞ¯_úùOÿØûÿ¿ôó—þøCøeþ9ÊÏwùó®}{ù}¨þzýÏÇaúúôñ<ú㯿ÞúãKÿýéç¯Å·Ó¿úwÿû¾ÿéïÿÅK–ßIÆß§§¿nûý;ýý7ý²÷ýI?é—ÿûÎÿúÿ¾ûú×ÿéÿôü¿þOþï/ÿãÿø¿ûÿóÿü?ýóÿü?ÿÏÿãÿø?þOÿò¿ü/ÿóÿ¯ëÿÝ÷ßýçÿé¿Oý{ÿ×÷û?þßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñüÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿOÿöÿî¿ý¿þßþ_þ·ÿ×ÿÛÿÓ¿þOÿ§ÿãÿõò¿÷ÿø?þïþãÿü?ÿOÿü?ÿÏÿóÿø?þÿÓ¿ü/ÿËÿü¿ý¿ûïþ»ÿü?ýÛÿ{ÿgÿÏÿÛÿ{ÿgÿOÿò¿üÿãÿø?ýãÿø?þ¯ÿÓÿéÿôÿôoÿïþÛÿëÿíÿåûý¿ý?ýëÿôú?þ_ÿ'ÿ{ÿÿãÿî?þÏÿóÿôÏÿóÿü?ÿÿãÿø?ýËÿò¿üÏÿÛÿ»ÿî¿ûÏÿÓ¿ý¿÷öÿü¿ý¿÷öÿô/ÿËÿø?þÿÓ?þÿãÿú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ý?ýÛÿ»ÿöÿúûùßþ_ÿoÿOÿú?ýŸþÿ×ÿÉÿÞÿãÿø¿ûÿóÿü?ýóÿü?ÿÏÿãÿø?þOÿò¿ü/ÿóÿöÿî¿ûïþóÿôoÿïýŸý?ÿoÿïýŸý?ýËÿò?þÿãÿôÿãÿø¿þOÿ§ÿÓÿÓ¿ý¿ûoÿ¯ÿ·ÿ—ÿíÿõÿöÿô¯ÿÓÿéÿøýŸüïý?þÿ»ÿø?ÿÏÿÓ?ÿÏÿóÿü?þÿãÿô/ÿËÿò?ÿoÿïþ»ÿî?ÿOÿöÿÞÿÙÿóÿöÿÞÿÙÿÓ¿ü/ÿãÿø?þOÿø?þÿëÿôú?ú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúû÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§ûûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûûùßþ_ÿoÿOÿú?ýŸþÿ×ÿÉÿÞÿãÿø¿ûÿóÿü?ýóÿü?ÿÏÿãÿø?þOÿò¿ü/ÿóÿöÿî¿ûïþóÿôoÿïýŸý?ÿoÿïýŸý?ýËÿò?þÿãÿôÿãÿø¿þOÿ§ÿÓÿÓ¿ý¿ûoÿ¯ÿ·ÿ—ÿíÿõÿöÿô¯ÿÓÿéÿøýŸüïý?þÿ»ÿø?ÿÏÿÓ?ÿÏÿóÿü?þÿãÿô/ÿËÿò?ÿoÿïþ»ÿî?ÿOÿöÿÞÿÙÿóÿöÿÞÿÙÿÓ¿ü/ÿãÿø?þOÿø?þÿëÿôú?ý?ýÛÿ»ÿöÿúùßþ_ÿoÿOÿú?ýŸþÿ×ÿÉÿÞÿãÿø¿ûÿóÿü?ýóÿü?ÿÏÿãÿø?þOÿò¿ü/ÿóÿöÿî¿ûïþóÿôoÿïýŸý?ÿoÿïýŸý?ýËÿò?þÿãÿôÿãÿø¿þOÿ§ÿÓÿÓ¿ý¿ûoÿ¯ÿ·ÿ—ÿíÿõÿöÿô¯ÿÓÿéÿøýŸüïý?þÿ»ÿø?ÿÏÿÓ?ÿÏÿóÿü?þÿãÿô/ÿËÿò?ÿoÿïþ»ÿî?ÿOÿöÿÞÿÙÿóÿöÿÞÿÙÿÓ¿ü/ÿãÿø?þOÿø?þÿëÿôú?ý?ýÛÿ»ÿöÿúûûý¿ý?ýëÿôú?þ_ÿ'ÿ{ÿÿãÿî?þÏÿóÿôÏÿóÿü?ÿÿãÿø?ýËÿò¿üÏÿÛÿ»ÿî¿ûÏÿÓ¿ý¿÷öÿü¿ý¿÷öÿô/ÿËÿø?þÿÓ?þÿãÿú?ýŸþOÿOÿöÿî¿ý¿þßþ_þ·ÿ×ÿÛÿÓ¿þOÿ§ÿãÿõò¿÷ÿø?þïþãÿü?ÿOÿü?ÿÏÿóÿø?þÿÓ¿ü/ÿËÿü¿ý¿ûïþ»ÿü?ýÛÿ{ÿgÿÏÿÛÿ{ÿgÿOÿò¿üÿãÿø?ýãÿø?þ¯ÿÓÿéÿôÿôoÿïþÛÿëÿíÿåý¿ý?ýëÿôú?þ_ÿ'ÿ{ÿÿãÿî?þÏÿóÿôÏÿóÿü?ÿÿãÿø?ýËÿò¿üÏÿÛÿ»ÿî¿ûÏÿÓ¿ý¿÷öÿü¿ý¿÷öÿô/ÿËÿø?þÿÓ?þÿãÿú?ýŸþOÿOÿöÿî¿ý¿þßþ_þ·ÿ×ÿÛÿÓ¿þOÿ§ÿãÿõò¿÷ÿø?þïþãÿü?ÿOÿü?ÿÏÿóÿø?þÿÓ¿ü/ÿËÿü¿ý¿ûïþ»ÿü?ýÛÿ{ÿgÿÏÿÛÿ{ÿgÿOÿò¿üÿãÿø?ýãÿø?þ¯ÿÓÿéÿôÿôoÿïþÛÿëÿíÿåûûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþÿ×ÿÉÿÞÿãÿø¿ûÿóÿü?ýóÿü?ÿÏÿãÿø?þOÿò¿ü/ÿóÿöÿî¿ûïþóÿôoÿïýŸý?ÿoÿïýŸý?ýËÿò?þÿãÿôÿãÿø¿þOÿ§ÿÓÿÓ¿ý¿ûoÿ¯ÿ·ÿ—ÿíÿõÿöÿô¯ÿÓÿéÿøýŸüïý?þÿ»ÿø?ÿÏÿÓ?ÿÏÿóÿü?þÿãÿô/ÿËÿò?ÿoÿïþ»ÿî?ÿOÿöÿÞÿÙÿóÿöÿÞÿÙÿÓ¿ü/ÿãÿø?þOÿø?þÿëÿôú?ý?ýÛÿ»ÿöÿúûùßþ_ÿoÿOÿú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?þ_ÿ'ÿ{ÿÿãÿî?þÏÿóÿôÏÿóÿü?ÿÿãÿø?ýËÿò¿üÏÿÛÿ»ÿî¿ûÏÿÓ¿ý¿÷öÿü¿ý¿÷öÿô/ÿËÿø?þÿÓ?þÿãÿú?ýŸþOÿOÿöÿî¿ý¿þßþ_þ·ÿ×ÿÛÿÓ¿þOÿ§ÿãÿõò¿÷ÿø?þïþãÿü?ÿOÿü?ÿÏÿóÿø?þÿÓ¿ü/ÿËÿü¿ý¿ûïþ»ÿü?ýÛÿ{ÿgÿÏÿÛÿ{ÿgÿOÿò¿üÿãÿø?ýãÿø?þ¯ÿÓÿéÿôÿôoÿïþÛÿëÿíÿåûý¿ý?ýëÿôú?ýŸüïý?þÿ»ÿø?ÿÏÿÓ?ÿÏÿóÿü?þÿãÿô/ÿËÿò?ÿoÿïþ»ÿî?ÿOÿöÿÞÿÙÿóÿöÿÞÿÙÿÓ¿ü/ÿãÿø?þOÿø?þÿëÿôú?ý?ýÛÿ»ÿöÿúûùßþ_ÿoÿOÿú?ýŸþÿ×ÿÉÿÞÿãÿø¿ûÿóÿü?ýóÿü?ÿÏÿãÿø?þOÿò¿ü/ÿóÿöÿî¿ûïþóÿôoÿïýŸý?ÿoÿïýŸý?ýËÿò?þÿãÿôÿãÿø¿þOÿ§ÿÓÿÓ¿ý¿ûoÿ¯ÿ·ÿ—ÿíÿõÿöÿô¯ÿÓÿéÿøùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùþŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿù÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝþŸþíÿ½ÿ³ÿçÿíÿ½ÿ³ÿ§ù_þÇÿñüŸþñüÿ×ÿéÿôúú·ÿwÿíÿõÿöÿò¿ý¿þßþŸþõú?ýÿ¯ÿ“ÿ½ÿÇÿñ÷ÿçÿùúçÿùþŸÿÇÿñüŸþåù_þçÿíÿÝ÷ßýçÿéßþßû?ûþßþßû?ûú—ÿåüÿÇÿéÿÇÿñýŸþOÿ§ÿ§û÷ßþ_ÿoÿ/ÿÛÿëÿíÿé_ÿ§ÿÓÿñÿú?ùßûüÿwÿñþŸÿ§þŸÿçÿùüÿÇÿé_þ—ÿåþßþßýwÿÝú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùûïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ïÿìÿùûïÿìÿé_þ—ÿñüÿ§üÿÇÿõú?ýŸþŸþíÿÝûý¿ý¿üoÿ¯ÿ·ÿ§ýŸþOÿÇÿëÿäïÿñüßýÇÿùþŸþùþŸÿçÿñüÿ§ù_þ—ÿùû÷ßýwÿùú·ÿ÷þÏþŸÿ·ÿ÷þÏþŸþåùÿÇÿñúÇÿñü_ÿ§ÿÓÿéÿéßþßý·ÿ×ÿÛÿËÿöÿúûú×ÿéÿôü¿þOþ÷þÿÇÿÝüŸÿçÿéŸÿçÿùþÿÇÿñú—ÿåùŸÿ·ÿwÿÝ÷Ÿÿ§ûÿÞßÿý[‘Ôß \ No newline at end of file diff --git a/client/resources/mad.json b/client/resources/mad.json new file mode 100644 index 000000000..535407ab4 --- /dev/null +++ b/client/resources/mad.json @@ -0,0 +1,13547 @@ +[ + { + "application": "Card holders personal data", + "company": "Rosan Finance", + "mad": "0x0004", + "service_provider": "", + "system_integrator": "Rosan Finance" + }, + { + "application": "Card ID: ISO No., expiry date and other identification data", + "company": "Rosan Finance", + "mad": "0x0005", + "service_provider": "Rosan Finance", + "system_integrator": "Rosan Finance" + }, + { + "application": "Private Rovalty programs, discount programs for card holders", + "company": "Rosan Finance", + "mad": "0x0006", + "service_provider": "Retail Trade and Service Org.", + "system_integrator": "Rosan Finance" + }, + { + "application": "Card Holder Data/ Card Management Data/ Access Control & Security", + "company": "House of Representatives of States General", + "mad": "0x0007", + "service_provider": "House of Representatives of States General", + "system_integrator": "Paul Sas" + }, + { + "application": "Card Holder Data/ Card Management Data/ Access Control & Security", + "company": "House of Representatives of States General", + "mad": "0x0008", + "service_provider": "House of Representatives of States General", + "system_integrator": "Paul Sas" + }, + { + "application": "Card and Reader Configuration", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x0009", + "service_provider": "PBV Kaufmann AG", + "system_integrator": "PBV Kaufmann AG" + }, + { + "application": "Card and Reader Configuration", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x000A", + "service_provider": "PBV Kaufmann AG", + "system_integrator": "PBV Kaufmann AG" + }, + { + "application": "Card and Reader Configuration", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x000B", + "service_provider": "PBV Kaufmann AG", + "system_integrator": "PBV Kaufmann AG" + }, + { + "application": "Card and Reader Configuration", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x000C", + "service_provider": "PBV Kaufmann AG", + "system_integrator": "PBV Kaufmann AG" + }, + { + "application": "Access Control, payment, ID, time registration", + "company": "Sagio A/S", + "mad": "0x000F", + "service_provider": "Sagio A/S", + "system_integrator": "Sagio A/S" + }, + { + "application": "Card administration", + "company": "Emcard a.s.", + "mad": "0x0010", + "service_provider": "EMCARD, a.s.", + "system_integrator": "EMTEST, a.s." + }, + { + "application": "Card publisher data", + "company": "Haguess s.r.o.", + "mad": "0x0011", + "service_provider": "Haguess", + "system_integrator": "Haguess" + }, + { + "application": "Card publisher data", + "company": "Haguess s.r.o.", + "mad": "0x0012", + "service_provider": "Haguess", + "system_integrator": "Haguess" + }, + { + "application": "Card publisher data", + "company": "Haguess s.r.o.", + "mad": "0x0013", + "service_provider": "Haguess", + "system_integrator": "Haguess" + }, + { + "application": "Card publisher data", + "company": "Haguess s.r.o.", + "mad": "0x0014", + "service_provider": "Haguess", + "system_integrator": "Haguess" + }, + { + "application": "Card publisher information", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x0015", + "service_provider": "MIKROELEKTRONIKA spol.s.v.o.", + "system_integrator": "MIKROELEKTRONIKA spol.s.v.o." + }, + { + "application": "Issuer information", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x0016", + "service_provider": "Mikroelektronika spol.s.r.o., Kpt. Poplera 55, Vysoke Myto 566 01, Czech Republic", + "system_integrator": "Mikroelektronika spol.s.r.o., Kpt. Poplera 55, Vysoke Myto 566 01, Czech Republic" + }, + { + "application": "Personal information", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x0017", + "service_provider": "Transmetro Guatemala", + "system_integrator": "SIEMENS Itron Business services S.A. - Cordoba, Rep. Argentina" + }, + { + "application": "Customer profile - card holder information", + "company": "CSAD SVT Praha", + "mad": "0x0018", + "service_provider": "", + "system_integrator": "Mikroelektronika, EMTEST" + }, + { + "application": "Card information - provider, status, validity", + "company": "CSAD SVT Praha", + "mad": "0x0019", + "service_provider": "", + "system_integrator": "Mikroelektronika, EMTEST" + }, + { + "application": "Access control", + "company": "Custom Micro Products Ltd.", + "mad": "0x001B", + "service_provider": "Custom Micro Products", + "system_integrator": "Custom Micro Products" + }, + { + "application": "Interoperable Contactless Card for multimode transport in the area of Arava Province and the city of Vitoria-Gasteiz", + "company": "Eusko Tren", + "mad": "0x001D", + "service_provider": "Idom Ingeniera y Consultoria, S.A.", + "system_integrator": "Idom Ingeniera y Consultoria, S.A." + }, + { + "application": "Interoperable Contactless Card for multimode transport in the area of Arava Province and the city of Vitoria-Gasteiz", + "company": "Eusko Tren", + "mad": "0x001E", + "service_provider": "Idom Ingeniera y Consultoria, S.A.", + "system_integrator": "Idom Ingeniera y Consultoria, S.A." + }, + { + "application": "Interoperable Contactless Card for multimode transport in the area of Arava Province and the city of Vitoria-Gasteiz", + "company": "Eusko Tren", + "mad": "0x001F", + "service_provider": "Idom Ingeniera y Consultoria, S.A.", + "system_integrator": "Idom Ingeniera y Consultoria, S.A." + }, + { + "application": "Interoperable Contactless Card for multimode transport in the area of Arava Province and the city of Vitoria-Gasteiz", + "company": "Eusko Tren", + "mad": "0x0020", + "service_provider": "Idom Ingeniera y Consultoria, S.A.", + "system_integrator": "Idom Ingeniera y Consultoria, S.A." + }, + { + "application": "Card certificate", + "company": "Tidomat AB", + "mad": "0x0021", + "service_provider": "Tidomat AB", + "system_integrator": "Tidomat AB" + }, + { + "application": "Card administration", + "company": "Emcard a.s.", + "mad": "0x0022", + "service_provider": "Emcard", + "system_integrator": "Emcard" + }, + { + "application": "Interoperable Contactless Card for multimode transport in the area of Bizkaia Province", + "company": "BISCAY TRANSPORT CONSORTIUM - Consorcio de transportes de Bizkaia", + "mad": "0x0023", + "service_provider": "Idom Ingenieria y Consultoria, S.A.", + "system_integrator": "Idom Ingenieria y Consultoria, S.A." + }, + { + "application": "Interoperable Contactless Card for multimode transport in the area of Bizkaia Province", + "company": "BISCAY TRANSPORT CONSORTIUM - Consorcio de transportes de Bizkaia", + "mad": "0x0024", + "service_provider": "Idom Ingenieria y Consultoria, S.A.", + "system_integrator": "Idom Ingenieria y Consultoria, S.A." + }, + { + "application": "Interoperable Contactless Card for multimode transport in the area of Bizkaia Province", + "company": "BISCAY TRANSPORT CONSORTIUM - Consorcio de transportes de Bizkaia", + "mad": "0x0025", + "service_provider": "Idom Ingenieria y Consultoria, S.A.", + "system_integrator": "Idom Ingenieria y Consultoria, S.A." + }, + { + "application": "Interoperable Contactless Card for multimode transport in the area of Bizkaia Province", + "company": "BISCAY TRANSPORT CONSORTIUM - Consorcio de transportes de Bizkaia", + "mad": "0x0026", + "service_provider": "Idom Ingenieria y Consultoria, S.A.", + "system_integrator": "Idom Ingenieria y Consultoria, S.A." + }, + { + "application": "Card publisher data, card holder profile", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x0027", + "service_provider": "KOORDINATOR ODIS s.r.o.", + "system_integrator": "KOORDINATOR ODIS s.r.o." + }, + { + "application": "Card administration for municipal chip card - card issuer (information)", + "company": "Plzeňské MÄ›stské Dopravní Podniky A.S.", + "mad": "0x0028", + "service_provider": "Plzeňské MÄ›stské Dopravní Podniky A.S.", + "system_integrator": "Plzeňské MÄ›stské Dopravní Podniky A.S." + }, + { + "application": "Card information", + "company": "BULL POLSKA Sp. z o.o.", + "mad": "0x0029", + "service_provider": "BULL POLSKA", + "system_integrator": "BULL POLSKA" + }, + { + "application": "Card administration", + "company": "Sportdata SP. Z.0.0.", + "mad": "0x002A", + "service_provider": "Sportdata SP. 2 0.0.", + "system_integrator": "Sportdata SP. 2 0.0." + }, + { + "application": "Card administration; Issuer information", + "company": "ODP-software s.r.o.", + "mad": "0x002B", + "service_provider": "ODP-software", + "system_integrator": "ODP-software" + }, + { + "application": "Card administration; Issuer information", + "company": "ODP-software s.r.o.", + "mad": "0x002C", + "service_provider": "ODP-software", + "system_integrator": "ODP-software" + }, + { + "application": "Card publisher data, card holder profile", + "company": "OREDO s.r.o", + "mad": "0x002D", + "service_provider": "OREDO s.r.o", + "system_integrator": "OREDO s.r.o" + }, + { + "application": "Card publisher data, card holder profile", + "company": "Ústecky kraj", + "mad": "0x002E", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Internal use (Tests, Demos...)", + "company": "Ascom Monétel", + "mad": "0x0101", + "service_provider": "Monétel R&D Fare Collection Systems Departement", + "system_integrator": "Monétel S.A." + }, + { + "application": "Benefit services", + "company": "Scheidt & Bachmann", + "mad": "0x0102", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Benefit services", + "company": "Scheidt & Bachmann", + "mad": "0x0103", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Benefit services", + "company": "Scheidt & Bachmann", + "mad": "0x0104", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Shipping company", + "company": "Scheidt & Bachmann", + "mad": "0x0105", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Shipping company", + "company": "Scheidt & Bachmann", + "mad": "0x0106", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Shipping company", + "company": "Scheidt & Bachmann", + "mad": "0x0107", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Shipping company", + "company": "Scheidt & Bachmann", + "mad": "0x0108", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Cure management", + "company": "Scheidt & Bachmann", + "mad": "0x0109", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Cure management", + "company": "Scheidt & Bachmann", + "mad": "0x010A", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "MIFARE Micro Module (MMM) easy test card for antenna calibration", + "company": "Philips Semiconductors Gratkorn GmbH", + "mad": "0x010B", + "service_provider": "Mikron GmbH", + "system_integrator": "Mikron GmbH" + }, + { + "application": "MIFARE Windows Application Demo", + "company": "Philips Semiconductors Gratkorn GmbH", + "mad": "0x010C", + "service_provider": "Mikron GmbH", + "system_integrator": "Mikron GmbH" + }, + { + "application": "MIFARE Windows Application Demo", + "company": "Philips Semiconductors Gratkorn GmbH", + "mad": "0x010D", + "service_provider": "Mikron GmbH", + "system_integrator": "Mikron GmbH" + }, + { + "application": "MIFARE Windows Application Demo", + "company": "Philips Semiconductors Gratkorn GmbH", + "mad": "0x010E", + "service_provider": "Mikron GmbH", + "system_integrator": "Mikron GmbH" + }, + { + "application": "MIFARE Windows Application Demo", + "company": "Philips Semiconductors Gratkorn GmbH", + "mad": "0x010F", + "service_provider": "Mikron GmbH", + "system_integrator": "Mikron GmbH" + }, + { + "application": "MIFARE Windows Application Demo", + "company": "Philips Semiconductors Gratkorn GmbH", + "mad": "0x0110", + "service_provider": "Mikron GmbH", + "system_integrator": "Mikron GmbH" + }, + { + "application": "MIFARE Windows Application Demo", + "company": "Philips Semiconductors Gratkorn GmbH", + "mad": "0x0111", + "service_provider": "Mikron GmbH", + "system_integrator": "Mikron GmbH" + }, + { + "application": "MIFARE Windows Application Demo", + "company": "Philips Semiconductors Gratkorn GmbH", + "mad": "0x0112", + "service_provider": "Mikron GmbH", + "system_integrator": "Mikron GmbH" + }, + { + "application": "Employer indentification card", + "company": "VFJ Technology Pty Ltd", + "mad": "0x0113", + "service_provider": "VFJ Electronics Pty Ltd.", + "system_integrator": "VFJ Electronics PTy Ltd." + }, + { + "application": "City Transport (Metro ticketing, bus ticket)", + "company": "VFJ Technology Pty Ltd", + "mad": "0x0114", + "service_provider": "VFJ Electronic Pty Ltd.", + "system_integrator": "Cubic - VFJ" + }, + { + "application": "Card Administratin, cardholder adminstration, access control & security, company services, miscellaneous applications", + "company": "Ministry of Defense", + "mad": "0x0115", + "service_provider": "Ministry of Defence", + "system_integrator": "" + }, + { + "application": "City transport bus, ferry, administration", + "company": "VFJ Technology Pty Ltd", + "mad": "0x0116", + "service_provider": "VFJ Technology", + "system_integrator": "Cubic - VFJ" + }, + { + "application": "Busticketing System", + "company": "VFJ Technology Pty Ltd", + "mad": "0x0117", + "service_provider": "King Man County Public Traffic", + "system_integrator": "Barouh Electronic Co." + }, + { + "application": "", + "company": "Reserved for MAD", + "mad": "0x0118", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Bus services, access control, diverse (service)", + "company": "IEM - Intenierie Electronique Mecanique S.A.", + "mad": "0x0119", + "service_provider": "IEM SA", + "system_integrator": "IEM SA" + }, + { + "application": "Bus services, access control, diverse (service)", + "company": "IEM - Intenierie Electronique Mecanique S.A.", + "mad": "0x011A", + "service_provider": "IEM SA", + "system_integrator": "IEM SA" + }, + { + "application": "Bus services, access control, diverse (service)", + "company": "IEM - Intenierie Electronique Mecanique S.A.", + "mad": "0x011B", + "service_provider": "IEM SA", + "system_integrator": "IEM SA" + }, + { + "application": "Bus services, access control, diverse (service)", + "company": "IEM - Intenierie Electronique Mecanique S.A.", + "mad": "0x011C", + "service_provider": "IEM SA", + "system_integrator": "IEM SA" + }, + { + "application": "Bus services, access control, diverse (service)", + "company": "IEM - Intenierie Electronique Mecanique S.A.", + "mad": "0x011D", + "service_provider": "IEM SA", + "system_integrator": "IEM SA" + }, + { + "application": "Bus services, access control, diverse (service)", + "company": "IEM - Intenierie Electronique Mecanique S.A.", + "mad": "0x011E", + "service_provider": "IEM SA", + "system_integrator": "IEM SA" + }, + { + "application": "Bus services, access control, diverse (service)", + "company": "IEM - Intenierie Electronique Mecanique S.A.", + "mad": "0x011F", + "service_provider": "IEM SA", + "system_integrator": "IEM SA" + }, + { + "application": "Weighbridge for trucks", + "company": "VFJ Technology Pty Ltd", + "mad": "0x0130", + "service_provider": "Hardware Systems Sales", + "system_integrator": "" + }, + { + "application": "Bus services, access control, diverse (service)", + "company": "IEM - Intenierie Electronique Mecanique S.A.", + "mad": "0x0131", + "service_provider": "IEM SA", + "system_integrator": "IEM SA" + }, + { + "application": "Miscellaneous Application", + "company": "BOSCH Telecom GmbH", + "mad": "0x0140", + "service_provider": "Bosch Telecom GmbH", + "system_integrator": "Bosch Telecom GmbH" + }, + { + "application": "Configuration Master Card for MIFARE reader/writers", + "company": "Integrated Engineering", + "mad": "0x0141", + "service_provider": "IE Holding", + "system_integrator": "IE Holding" + }, + { + "application": "Photo copier controll, access controll, time & attendance", + "company": "Beka Elektronik", + "mad": "0x014B", + "service_provider": "BEKA Elektronik", + "system_integrator": "BEKA Elektronik" + }, + { + "application": "Access control & security, city traffic, sports & entertainment", + "company": "IP Core", + "mad": "0x014C", + "service_provider": "IP Core", + "system_integrator": "IP Core" + }, + { + "application": "E-ticketing", + "company": "highQ Computerlösungen GmbH", + "mad": "0x014D", + "service_provider": "", + "system_integrator": "high Q" + }, + { + "application": "E-ticketing", + "company": "highQ Computerlösungen GmbH", + "mad": "0x014E", + "service_provider": "", + "system_integrator": "high Q" + }, + { + "application": "E-ticketing", + "company": "highQ Computerlösungen GmbH", + "mad": "0x014F", + "service_provider": "", + "system_integrator": "high Q" + }, + { + "application": "E-ticketing", + "company": "highQ Computerlösungen GmbH", + "mad": "0x0150", + "service_provider": "", + "system_integrator": "high Q" + }, + { + "application": "E-ticketing", + "company": "highQ Computerlösungen GmbH", + "mad": "0x0151", + "service_provider": "", + "system_integrator": "high Q" + }, + { + "application": "Admin profile", + "company": "KORID LK, spol. s r.o", + "mad": "0x0153", + "service_provider": "KORID LK, spol.s.r.o.", + "system_integrator": "KORID LK, spol.s.r.o." + }, + { + "application": "Details of the card issuer", + "company": "Scheidt & Bachmann", + "mad": "0x0201", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Details of the card issuer", + "company": "Scheidt & Bachmann", + "mad": "0x0202", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "MIFARE Demonstration Software, G&D - F&E Dept.", + "company": "*Giesecke & Devrient GmbH", + "mad": "0x0203", + "service_provider": "G&D", + "system_integrator": "G&D" + }, + { + "application": "MIFARE Demonstration Software, G&D - F&E Dept.", + "company": "*Giesecke & Devrient GmbH", + "mad": "0x0204", + "service_provider": "G&D", + "system_integrator": "G&D" + }, + { + "application": "MIFARE Demonstration Software, G&D - F&E Dept.", + "company": "*Giesecke & Devrient GmbH", + "mad": "0x0205", + "service_provider": "G&D", + "system_integrator": "G&D" + }, + { + "application": "MIFARE Demonstration Software, G&D - F&E Dept.", + "company": "*Giesecke & Devrient GmbH", + "mad": "0x0206", + "service_provider": "G&D", + "system_integrator": "G&D" + }, + { + "application": "Watch service, owner id, electronical service book, messaging system for news", + "company": "Junghans Uhren GmbH", + "mad": "0x0207", + "service_provider": "Junghans Uhren GmbH", + "system_integrator": "" + }, + { + "application": "Card Touch Smart Card Applications", + "company": "Touch Technology International Inc.", + "mad": "0x0208", + "service_provider": "Touch Technology International", + "system_integrator": "Touch Technology International" + }, + { + "application": "Miscellaneous application, city traffic, access controll & security entertainment, car parking, electronic trade", + "company": "KFAP S.A.", + "mad": "0x0209", + "service_provider": "KFPA", + "system_integrator": "KFPA" + }, + { + "application": "Computer, car parking, elec. purse, access control & security", + "company": "DECA Engineering", + "mad": "0x020A", + "service_provider": "Deca Engineering", + "system_integrator": "Deca Engineering" + }, + { + "application": "Social identification no. of card holder", + "company": "Rosan Finance", + "mad": "0x0301", + "service_provider": "Social Protection Org.", + "system_integrator": "Rosan Finance" + }, + { + "application": "Miscellaneous applications: customer profile, card administration", + "company": "ODP-software s.r.o.", + "mad": "0x0302", + "service_provider": "ODP-software", + "system_integrator": "ODP-software" + }, + { + "application": "Miscellaneous applications: customer profile, card administration", + "company": "ODP-software s.r.o.", + "mad": "0x0303", + "service_provider": "ODP-software", + "system_integrator": "ODP-software" + }, + { + "application": "Access Control, payment, ID, time registration", + "company": "Sagio A/S", + "mad": "0x0401", + "service_provider": "Sagio A/S", + "system_integrator": "Sagio A/S" + }, + { + "application": "Multifunctional appplications", + "company": "Braincon Technologies GmbH", + "mad": "0x054D", + "service_provider": "Braincon", + "system_integrator": "Braincon" + }, + { + "application": "Miscellaneous application", + "company": "Ústecky kraj", + "mad": "0x054E", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Miscellaneous application", + "company": "Ústecky kraj", + "mad": "0x054F", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Miscellaneous application", + "company": "Ústecky kraj", + "mad": "0x0550", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Miscellaneous application", + "company": "Ústecky kraj", + "mad": "0x0551", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Miscellaneous application", + "company": "Ústecky kraj", + "mad": "0x0552", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Miscellaneous application", + "company": "BULL POLSKA Sp. z o.o.", + "mad": "0x0601", + "service_provider": "BULL POLSKA", + "system_integrator": "BULL POLSKA" + }, + { + "application": "Miscellaneous application", + "company": "BULL POLSKA Sp. z o.o.", + "mad": "0x0602", + "service_provider": "BULL POLSKA", + "system_integrator": "BULL POLSKA" + }, + { + "application": "Card administration", + "company": "MCF RF TECH SRL", + "mad": "0x0701", + "service_provider": "MCF", + "system_integrator": "MCF" + }, + { + "application": "City traffic, electronic purse, micellaneous applications", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x0702", + "service_provider": "Koordinator", + "system_integrator": "PVT" + }, + { + "application": "Access control, electronic purse, parking, city cards", + "company": "ARD", + "mad": "0x0703", + "service_provider": "ARD", + "system_integrator": "ARD" + }, + { + "application": "Company services, access & sec control, electronic purse...", + "company": "Cominfo a.s.", + "mad": "0x0704", + "service_provider": "Cominfo", + "system_integrator": "Cominfo" + }, + { + "application": "Application containing card holder information", + "company": "DOPRAVNI PODNIK mest Mostu a Litvinova, a.s.", + "mad": "0x0705", + "service_provider": "Dopravni Podnik mest Mostu a Litvinova, a.s.", + "system_integrator": "Mikroelektronika, spol. sr. o., Kpt. Poplera 55, 565 01 Vysoké Mýto, CZ" + }, + { + "application": "Service Application containing information about driver and inspector", + "company": "DOPRAVNI PODNIK mest Mostu a Litvinova, a.s.", + "mad": "0x0706", + "service_provider": "Dopravni Podnik mest Mostu a Litvinova, a.s.", + "system_integrator": "Mikroelektronika, spol. sr. o., Kpt. Poplera 55, 565 01 Vysoké Mýto, CZ" + }, + { + "application": "Bonus counter", + "company": "DOPRAVNI PODNIK mest Mostu a Litvinova, a.s.", + "mad": "0x0707", + "service_provider": "Dopravni Podnik mest Mostu a Litvinova, a.s.", + "system_integrator": "Mikroelektronika, spol. sr.o. Kpt. Poplera 55, 565 01 Vysoké Mýto, CZ" + }, + { + "application": "Liberec City Card - loyalty check", + "company": "Liberecká IS, a.s.", + "mad": "0x0708", + "service_provider": "Liverecká IS, a.s.", + "system_integrator": "Accenture Central Europe" + }, + { + "application": "Electronic purse, city traffic, customer profile, service application, check-in/out application", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x0709", + "service_provider": "Mikroelektronika", + "system_integrator": "Mikroelektronika" + }, + { + "application": "Electronic purse, city traffic, customer profile, service application, check-in/out application", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x070A", + "service_provider": "Mikroelektronika", + "system_integrator": "Mikroelektronika" + }, + { + "application": "Bonus Counter", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x070B", + "service_provider": "Mikroelektronika spol s.r.o.", + "system_integrator": "Mikroelektronika spol s.r.o." + }, + { + "application": "Card Administration", + "company": "MCF RF TECH SRL", + "mad": "0x070C", + "service_provider": "MCF RF TECH S.R.L.", + "system_integrator": "MCF RF TECH S.R.L." + }, + { + "application": "Loyalty/Gift Card application for Cinemas, Resorts, Retails chains", + "company": "VERIFONE ITALIA SRL", + "mad": "0x070D", + "service_provider": "VeriFone Italia", + "system_integrator": "VeriFone Italia" + }, + { + "application": "Transaction log 3S", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x070E", + "service_provider": "Transmetro Guatemala", + "system_integrator": "SIEMENS Itron Business services S.A. - Cordoba, Rep. Argentina" + }, + { + "application": "Multifunctional ID card", + "company": "Micros-Fidelio GmbH", + "mad": "0x070F", + "service_provider": "Micros-Fidelio GmbH", + "system_integrator": "Micros-Fidelio GmbH" + }, + { + "application": "Multifunctional ID card", + "company": "Micros-Fidelio GmbH", + "mad": "0x0710", + "service_provider": "Micros-Fidelio GmbH", + "system_integrator": "Micros-Fidelio GmbH" + }, + { + "application": "Multifunctional ID card", + "company": "Micros-Fidelio GmbH", + "mad": "0x0711", + "service_provider": "Micros-Fidelio GmbH", + "system_integrator": "Micros-Fidelio GmbH" + }, + { + "application": "Dedicated to marina users, to improve data consistancy", + "company": "MARINAPASS", + "mad": "0x0712", + "service_provider": "MARINAPASS", + "system_integrator": "Philippe FONTENOY" + }, + { + "application": "Customer profile", + "company": "KORID LK, spol. s r.o", + "mad": "0x0713", + "service_provider": "KORID LK, spol.s.r.o.", + "system_integrator": "KORID LK, spol.s.r.o." + }, + { + "application": "Cashless Payment; access and time control", + "company": "EVIS AG", + "mad": "0x0714", + "service_provider": "EVIS AG", + "system_integrator": "EVIS AG" + }, + { + "application": "Cashless Payment; access and time control", + "company": "EVIS AG", + "mad": "0x0715", + "service_provider": "EVIS AG", + "system_integrator": "EVIS AG" + }, + { + "application": "Cashless Payment; access and time control", + "company": "EVIS AG", + "mad": "0x0716", + "service_provider": "EVIS AG", + "system_integrator": "EVIS AG" + }, + { + "application": "Cashless Payment; access and time control", + "company": "EVIS AG", + "mad": "0x0717", + "service_provider": "EVIS AG", + "system_integrator": "EVIS AG" + }, + { + "application": "Cashless Payment; access and time control", + "company": "EVIS AG", + "mad": "0x0718", + "service_provider": "EVIS AG", + "system_integrator": "EVIS AG" + }, + { + "application": "Cashless Payment; access and time control", + "company": "EVIS AG", + "mad": "0x0719", + "service_provider": "EVIS AG", + "system_integrator": "EVIS AG" + }, + { + "application": "Cashless Payment; access and time control", + "company": "EVIS AG", + "mad": "0x071A", + "service_provider": "EVIS AG", + "system_integrator": "EVIS AG" + }, + { + "application": "Cashless Payment; access and time control", + "company": "EVIS AG", + "mad": "0x071B", + "service_provider": "EVIS AG", + "system_integrator": "EVIS AG" + }, + { + "application": "Customer profile", + "company": "Mikroelektronika GmbH", + "mad": "0x071C", + "service_provider": "MIKROELEKTRONIKA spol.s.r.o., Draby 849, Vysoke Myto 56601, Czech Republic", + "system_integrator": "MIKROELEKTRONIKA spol.s.r.o., Draby 849, Vysoke Myto 56601, Czech Republic" + }, + { + "application": "Customer profile", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x071D", + "service_provider": "ZAGREBACKI Holding d.o.o.", + "system_integrator": "MIKROELEKTRONIKA spol.s.r.o." + }, + { + "application": "Bonus counter", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x071E", + "service_provider": "ZAGREBACKI Holding d.o.o.", + "system_integrator": "MIKROELEKTRONIKA spol.s.r.o." + }, + { + "application": "Authentication of Casino Staff members", + "company": "Atronic Austria GmbH", + "mad": "0x071F", + "service_provider": "ATRONIC Austria GmBH", + "system_integrator": "ATRONIC Austria GmBH" + }, + { + "application": "Authentication of Casino Staff members", + "company": "Atronic Austria GmbH", + "mad": "0x0720", + "service_provider": "ATRONIC Austria GmBH", + "system_integrator": "ATRONIC Austria GmBH" + }, + { + "application": "Operator Card for Automated-Fare Collection System", + "company": "ACS Solutions Switzerland Ltd. a Xerox Company", + "mad": "0x0721", + "service_provider": "ACS Solutions Switzerland Ltd.", + "system_integrator": "ACS Solutions Switzerland Ltd." + }, + { + "application": "Multi-application Card-Access Control, Ticketing payment", + "company": "APPLICAM", + "mad": "0x0722", + "service_provider": "APPLICAM", + "system_integrator": "APPLICAM" + }, + { + "application": "Multi-application Card-Access Control, Ticketing payment", + "company": "APPLICAM", + "mad": "0x0723", + "service_provider": "APPLICAM", + "system_integrator": "APPLICAM" + }, + { + "application": "Multi-application Card-Access Control, Ticketing payment", + "company": "APPLICAM", + "mad": "0x0724", + "service_provider": "APPLICAM", + "system_integrator": "APPLICAM" + }, + { + "application": "Multi-application Card-Access Control, Ticketing payment", + "company": "APPLICAM", + "mad": "0x0725", + "service_provider": "APPLICAM", + "system_integrator": "APPLICAM" + }, + { + "application": "Multi-application Card-Access Control, Ticketing payment", + "company": "APPLICAM", + "mad": "0x0726", + "service_provider": "APPLICAM", + "system_integrator": "APPLICAM" + }, + { + "application": "Multi-application Card-Access Control, Ticketing payment", + "company": "APPLICAM", + "mad": "0x0727", + "service_provider": "APPLICAM", + "system_integrator": "APPLICAM" + }, + { + "application": "Bonus Counter", + "company": "Mikroelektronika GmbH", + "mad": "0x0728", + "service_provider": "MIKROELEKTRONIKA spol.s.r.o.", + "system_integrator": "MIKROELEKTRONIKA spol.s.r.o." + }, + { + "application": "Info-Customer profile", + "company": "Mikroelektronika GmbH", + "mad": "0x0729", + "service_provider": "MIKROELEKTRONIKA spol.s.r.o.", + "system_integrator": "MIKROELEKTRONIKA spol.s.r.o." + }, + { + "application": "Micropayments, access control and gift control", + "company": "METAPAY LTD.", + "mad": "0x072A", + "service_provider": "METAPAY LTD.", + "system_integrator": "EPAM Systems Ltd." + }, + { + "application": "Customer profile", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x072B", + "service_provider": "Mikroelektronika spol.s r.o", + "system_integrator": "Mikroelektronika spol.s r.o" + }, + { + "application": "Biometric data", + "company": "Alphatronics", + "mad": "0x072C", + "service_provider": "", + "system_integrator": "Alphatronics" + }, + { + "application": "Hotel, Access control, entertainement, NFC, Academic, Comoany Service, Healt service", + "company": "USSEN Limited", + "mad": "0x072D", + "service_provider": "Ussen Limited", + "system_integrator": "Ussen Limited" + }, + { + "application": "Gangway Access Control for ships", + "company": "LabelCraft AS", + "mad": "0x072E", + "service_provider": "LabelCraft AS", + "system_integrator": "LabelCraft AS" + }, + { + "application": "Gangway Access Control for ships", + "company": "LabelCraft AS", + "mad": "0x072F", + "service_provider": "LabelCraft AS", + "system_integrator": "LabelCraft AS" + }, + { + "application": "E-ticketing ID card", + "company": "Monet+ a.s.", + "mad": "0x0730", + "service_provider": "Monet+ a.s.", + "system_integrator": "Monet+ a.s." + }, + { + "application": "Europe", + "company": "Monet+ a.s.", + "mad": "0x0731", + "service_provider": "Monet+ a.s.", + "system_integrator": "Monet+ a.s." + }, + { + "application": "Identification card", + "company": "Monet+ a.s.", + "mad": "0x0732", + "service_provider": "Monet+ a.s.", + "system_integrator": "Monet+ a.s." + }, + { + "application": "Access control with point store systems for facility integration purpose", + "company": "Unicard S.A.", + "mad": "0x0733", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "Configuration, control and initialization", + "company": "INID BV", + "mad": "0x0734", + "service_provider": "INID", + "system_integrator": "INID" + }, + { + "application": "Public transport sytems. Parking systems. Catering. Electronic wallet. Reservation system. Access services. Attendance services. Industrial identification. City card.", + "company": "Duha systém s.r.o.", + "mad": "0x0735", + "service_provider": "DUHA systém s.r.o.", + "system_integrator": "DUHA systém s.r.o." + }, + { + "application": "Public transport sytems. Parking systems. Catering. Electronic wallet. Reservation system. Access services. Attendance services. Industrial identification. City card.", + "company": "Duha systém s.r.o.", + "mad": "0x0736", + "service_provider": "DUHA systém s.r.o.", + "system_integrator": "DUHA systém s.r.o." + }, + { + "application": "Public transport sytems. Parking systems. Catering. Electronic wallet. Reservation system. Access services. Attendance services. Industrial identification. City card.", + "company": "Duha systém s.r.o.", + "mad": "0x0737", + "service_provider": "DUHA systém s.r.o.", + "system_integrator": "DUHA systém s.r.o." + }, + { + "application": "Public transport sytems. Parking systems. Catering. Electronic wallet. Reservation system. Access services. Attendance services. Industrial identification. City card.", + "company": "Duha systém s.r.o.", + "mad": "0x0738", + "service_provider": "DUHA systém s.r.o.", + "system_integrator": "DUHA systém s.r.o." + }, + { + "application": "Customer profile", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x0739", + "service_provider": "Jamaica Urban Transit Company Ltd", + "system_integrator": "Mikroelektronika spol.s r.o." + }, + { + "application": "Card Holder Information", + "company": "BULL POLSKA Sp. z o.o.", + "mad": "0x073A", + "service_provider": "BULL POLSKA", + "system_integrator": "BULL POLSKA" + }, + { + "application": "PAAC transit services", + "company": "Scheidt & Bachmann GmbH", + "mad": "0x073B", + "service_provider": "Scheidt & Bachmann GmbH", + "system_integrator": "Scheidt & Bachmann GmbH" + }, + { + "application": "Customer loyalty", + "company": "K-Plus Oy", + "mad": "0x073C", + "service_provider": "K-Plus Oy", + "system_integrator": "" + }, + { + "application": "Customer loyalty", + "company": "K-Plus Oy", + "mad": "0x073D", + "service_provider": "K-Plus Oy", + "system_integrator": "" + }, + { + "application": "Customer loyalty", + "company": "K-Plus Oy", + "mad": "0x073E", + "service_provider": "K-Plus Oy", + "system_integrator": "" + }, + { + "application": "Bonus counter", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x073F", + "service_provider": "Jamaica Urban Transit Company Ltd", + "system_integrator": "Mikroelektronika spol.s r.o." + }, + { + "application": "Transaction log 2S", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x0740", + "service_provider": "Mikroelektronika spol.s r.o.", + "system_integrator": "Mikroelektronika spol.s r.o." + }, + { + "application": "JIS", + "company": "eko TIP ID s.r.o", + "mad": "0x0741", + "service_provider": "University of West Bohemia in Pilsen", + "system_integrator": "eko TIP ID s.r.o" + }, + { + "application": "Mobile Ticket/Picticket", + "company": "MATRIX Solutions GmbH & Co.KG", + "mad": "0x0742", + "service_provider": "MATRIX Solutions GmbH & Co.KG", + "system_integrator": "MATRIX Solutions GmbH & Co.KG" + }, + { + "application": "Miscellaneous applications", + "company": "OREDO s.r.o", + "mad": "0x0743", + "service_provider": "OREDO s.r.o", + "system_integrator": "OREDO s.r.o" + }, + { + "application": "Miscellaneous applications", + "company": "OREDO s.r.o", + "mad": "0x0744", + "service_provider": "OREDO s.r.o", + "system_integrator": "OREDO s.r.o" + }, + { + "application": "Miscellaneous applications", + "company": "OREDO s.r.o", + "mad": "0x0745", + "service_provider": "OREDO s.r.o", + "system_integrator": "OREDO s.r.o" + }, + { + "application": "Miscellaneous applications", + "company": "OREDO s.r.o", + "mad": "0x0746", + "service_provider": "OREDO s.r.o", + "system_integrator": "OREDO s.r.o" + }, + { + "application": "Miscellaneous applications", + "company": "OREDO s.r.o", + "mad": "0x0747", + "service_provider": "OREDO s.r.o", + "system_integrator": "OREDO s.r.o" + }, + { + "application": "Public Library User Identification", + "company": "Plasticard-ZFT GmbH", + "mad": "0x0748", + "service_provider": "Plasticard-ZFT GmbH", + "system_integrator": "Bibliotheca RFID Library Systems GmbH" + }, + { + "application": "Multiapplication", + "company": "IMA s.r.o.", + "mad": "0x0749", + "service_provider": "Ima Ltd", + "system_integrator": "" + }, + { + "application": "Supplementary information for other applications - bonus counters, logs", + "company": "TELMAX s.r.o.", + "mad": "0x074A", + "service_provider": "TELMAX s.r.o.", + "system_integrator": "TELMAX s.r.o." + }, + { + "application": "Cafeteria services", + "company": "Netlock Kft.", + "mad": "0x074B", + "service_provider": "Netlock Kft.", + "system_integrator": "Netlock Kft." + }, + { + "application": "Loyalty services", + "company": "Netlock Kft.", + "mad": "0x074C", + "service_provider": "Netlock Kft.", + "system_integrator": "Netlock Kft." + }, + { + "application": "Access control, miscellaneous applications", + "company": "TAGGER SYSTEMS Co Ltd", + "mad": "0x074D", + "service_provider": "TAGGER SYSTEMS Co Ltd", + "system_integrator": "" + }, + { + "application": "Fuel card for International Diesel Sevice", + "company": "Kuwait Petroleum Belgium", + "mad": "0x074E", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Fuel card for International Diesel Sevice", + "company": "Kuwait Petroleum Belgium", + "mad": "0x074F", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Fuel card for International Diesel Sevice", + "company": "Kuwait Petroleum Belgium", + "mad": "0x0750", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Identification for airline related services", + "company": "Lufthansa German Airlines", + "mad": "0x0801", + "service_provider": "Deutsche Lufthansa AG", + "system_integrator": "Deutsche Lufthansa AG" + }, + { + "application": "Airlines", + "company": "KLM-Royal Dutch Airlines", + "mad": "0x0803", + "service_provider": "KLM", + "system_integrator": "KLM" + }, + { + "application": "Ticketing for ferry trafic", + "company": "Pay Vend Solutions", + "mad": "0x0901", + "service_provider": "Payvend Solutions", + "system_integrator": "Payvend Solutions" + }, + { + "application": "Bus services with extension to rail and taxi", + "company": "Questek Marketing", + "mad": "0x1001", + "service_provider": "Questek Marketing", + "system_integrator": "Questek Marketing" + }, + { + "application": "Railway Transit in Moscow region", + "company": "Moscow Railway Federal State Unitary Enterprize", + "mad": "0x1003", + "service_provider": "Moscow railway", + "system_integrator": "Express Card" + }, + { + "application": "Fare collection", + "company": "Tehran Urban & Suburban Railway Co.", + "mad": "0x1004", + "service_provider": "Processing World Corp", + "system_integrator": "Processing World Corp" + }, + { + "application": "Fare collection", + "company": "Ascom", + "mad": "0x1005", + "service_provider": "TUSRC", + "system_integrator": "Ascom Monetel" + }, + { + "application": "Mass Transportation Ticketing", + "company": "Omnifare", + "mad": "0x1006", + "service_provider": "MBS", + "system_integrator": "MBS" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1007", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1008", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1009", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x100A", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x100B", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x100C", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x100D", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x100E", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x100F", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1010", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1011", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1012", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1013", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1014", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1015", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1016", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1017", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1018", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1019", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x101A", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x101B", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x101C", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x101D", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway pass, univers pass, library", + "company": "Emcard a.s.", + "mad": "0x101E", + "service_provider": "Emcard", + "system_integrator": "Emtest" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x101F", + "service_provider": "Zeleznicna Spolocnost", + "system_integrator": "Prosoft SPDL" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x1020", + "service_provider": "Zeleznicna Spolocnost", + "system_integrator": "Prosoft SPDL" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x1021", + "service_provider": "Zeleznicna Spolocnost", + "system_integrator": "Prosoft SPDL" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x1022", + "service_provider": "Zeleznicna Spolocnost", + "system_integrator": "Prosoft SPDL" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x1023", + "service_provider": "Zeleznicna Spolocnost", + "system_integrator": "Prosoft SPDL" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x1024", + "service_provider": "Zeleznicna Spolocnost", + "system_integrator": "Prosoft SPDL" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x1025", + "service_provider": "Zeleznicna Spolocnost", + "system_integrator": "Prosoft SPDL" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x1026", + "service_provider": "Zeleznicna Spolocnost", + "system_integrator": "Prosoft SPDL" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x1027", + "service_provider": "Zeleznicna", + "system_integrator": "Prosoft SPOL" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x1028", + "service_provider": "Zeleznicna", + "system_integrator": "Prosoft SPOL" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x1029", + "service_provider": "Zeleznicna", + "system_integrator": "Prosoft SPOL" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x102A", + "service_provider": "Zeleznicna", + "system_integrator": "Prosoft SPOL" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x102B", + "service_provider": "Zeleznicna", + "system_integrator": "Prosoft SPOL" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x102C", + "service_provider": "Zeleznicna", + "system_integrator": "Prosoft SPOL" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x102D", + "service_provider": "Zeleznicna", + "system_integrator": "Prosoft" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x102E", + "service_provider": "Zeleznicna", + "system_integrator": "Prosoft" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x102F", + "service_provider": "Zeleznicna", + "system_integrator": "Prosoft" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x1030", + "service_provider": "Zeleznicna", + "system_integrator": "Prosoft" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x1031", + "service_provider": "Zeleznicna", + "system_integrator": "Prosoft" + }, + { + "application": "Railway services", + "company": "Prosoft Zilina", + "mad": "0x1032", + "service_provider": "Zeleznicna", + "system_integrator": "Prosoft" + }, + { + "application": "Railway services, fare collection", + "company": "ODP-software s.r.o.", + "mad": "0x1033", + "service_provider": "ODP-software", + "system_integrator": "ODP-software" + }, + { + "application": "Railway services, fare collection", + "company": "ODP-software s.r.o.", + "mad": "0x1034", + "service_provider": "ODP-software", + "system_integrator": "ODP-software" + }, + { + "application": "Ticketing and reservation for Egyptian Railways", + "company": "ENR Egyptian National Railways", + "mad": "0x1035", + "service_provider": "ENR Egyptian National Railways", + "system_integrator": "TransIT- Transportation Information Technology system, Elsag Datamat" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x1103", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x1104", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Transport ticketing", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x1105", + "service_provider": "KOORDINATOR ODIS s.r.o.", + "system_integrator": "KOORDINATOR ODIS s.r.o." + }, + { + "application": "Transport ticketing", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x1106", + "service_provider": "KOORDINATOR ODIS s.r.o.", + "system_integrator": "KOORDINATOR ODIS s.r.o." + }, + { + "application": "Transport ticketing", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x1107", + "service_provider": "KOORDINATOR ODIS s.r.o.", + "system_integrator": "KOORDINATOR ODIS s.r.o." + }, + { + "application": "Miscellaneous applications", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x1108", + "service_provider": "KOORDINATOR ODIS s.r.o.", + "system_integrator": "KOORDINATOR ODIS s.r.o." + }, + { + "application": "Miscellaneous applications", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x1109", + "service_provider": "KOORDINATOR ODIS s.r.o.", + "system_integrator": "KOORDINATOR ODIS s.r.o." + }, + { + "application": "Miscellaneous applications", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x110A", + "service_provider": "KOORDINATOR ODIS s.r.o.", + "system_integrator": "KOORDINATOR ODIS s.r.o." + }, + { + "application": "Digital registration of attendance of persons", + "company": "Simac QUADCORE", + "mad": "0x110B", + "service_provider": "Simac QUADCORE B.V.", + "system_integrator": "Simac QUADCORE B.V." + }, + { + "application": "Transport ticketing", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x1201", + "service_provider": "KOORDINATOR ODIS s.r.o.", + "system_integrator": "KOORDINATOR ODIS s.r.o." + }, + { + "application": "Transport ticketing", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x1202", + "service_provider": "KOORDINATOR ODIS s.r.o.", + "system_integrator": "KOORDINATOR ODIS s.r.o." + }, + { + "application": "Transport ticketing", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x1203", + "service_provider": "KOORDINATOR ODIS s.r.o.", + "system_integrator": "KOORDINATOR ODIS s.r.o." + }, + { + "application": "ACS - Almex Card Scheme", + "company": "Höft & Wessel AG", + "mad": "0x1204", + "service_provider": "", + "system_integrator": "Höft & Wessel AG" + }, + { + "application": "Public transport ticket", + "company": "MENNICA POLSKA s.a.", + "mad": "0x1205", + "service_provider": "MPK LODZ", + "system_integrator": "MENNICA POLSKA s.a." + }, + { + "application": "Transport ticketing", + "company": "OREDO s.r.o", + "mad": "0x1206", + "service_provider": "OREDO s.r.o", + "system_integrator": "OREDO s.r.o" + }, + { + "application": "Transport ticketing", + "company": "OREDO s.r.o", + "mad": "0x1207", + "service_provider": "OREDO s.r.o", + "system_integrator": "OREDO s.r.o" + }, + { + "application": "Transport ticketing", + "company": "OREDO s.r.o", + "mad": "0x1208", + "service_provider": "OREDO s.r.o", + "system_integrator": "OREDO s.r.o" + }, + { + "application": "Transport ticketing", + "company": "Ústecky kraj", + "mad": "0x1209", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Transport ticketing", + "company": "Ústecky kraj", + "mad": "0x120A", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Transport ticketing", + "company": "Ústecky kraj", + "mad": "0x120B", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Public Transportation System ticketing e-wallet", + "company": "Ministry of Justice of Georgia", + "mad": "0x120C", + "service_provider": "Ministry of Justice of Georgia", + "system_integrator": "" + }, + { + "application": "Electronic tickets for public transpor", + "company": "TELMAX s.r.o.", + "mad": "0x120D", + "service_provider": "TELMAX s.r.o.", + "system_integrator": "TELMAX s.r.o." + }, + { + "application": "City transportation card for Subway, Bus & Minibus", + "company": "AzRy LLC", + "mad": "0x120E", + "service_provider": "Metro service LLC", + "system_integrator": "AzRy LLC" + }, + { + "application": "Interoperable fare management system for transport in Basque Country", + "company": "IDOM INGENIERIA Y CONSULTORIA", + "mad": "0x120F", + "service_provider": "Mugitu", + "system_integrator": "Mugitu" + }, + { + "application": "City Transport (Metro ticketing, bus ticket)", + "company": "VFJ Technology Pty Ltd", + "mad": "0x1801", + "service_provider": "VFJ Electronic Pty Ltd.", + "system_integrator": "Cubic - VFJ" + }, + { + "application": "Public transport fare collection", + "company": "Buscom Oy", + "mad": "0x1802", + "service_provider": "City of Vaasa", + "system_integrator": "Buscom" + }, + { + "application": "Busticketing System", + "company": "VFJ Technology Pty Ltd", + "mad": "0x1803", + "service_provider": "King Man County Public Traffic", + "system_integrator": "Barouh Electronic Co." + }, + { + "application": "Payment for transit by metro", + "company": "Moscow Metro", + "mad": "0x1808", + "service_provider": "Moscow Metro", + "system_integrator": "Express Card" + }, + { + "application": "Transit/public transport", + "company": "Rosan Finance", + "mad": "0x1809", + "service_provider": "Moscow street public transport org.", + "system_integrator": "Rosan Finance" + }, + { + "application": "Multiapplication car for industry & trafic, parking, swimming pool", + "company": "ASEC S.A.", + "mad": "0x180A", + "service_provider": "ASEC S.A", + "system_integrator": "ASEC S.A" + }, + { + "application": "Miscellaneous application, city traffic, access control & security, entertainment, car parking, electronic trade", + "company": "KFAP S.A.", + "mad": "0x180B", + "service_provider": "KFPA", + "system_integrator": "KFPA" + }, + { + "application": "Electronic purse, city traffic", + "company": "Plzeňské MÄ›stské Dopravní Podniky A.S.", + "mad": "0x180C", + "service_provider": "Plzenske Mestske", + "system_integrator": "Plzenske Mestske" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x180D", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x180E", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x180F", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x1810", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x1811", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x1812", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x1813", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x1814", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x1815", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x1816", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x1817", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x1818", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x1819", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Subway payment system", + "company": "LOT Ltd", + "mad": "0x181A", + "service_provider": "LOT", + "system_integrator": "LOT" + }, + { + "application": "Subway payment system", + "company": "LOT Ltd", + "mad": "0x181B", + "service_provider": "LOT", + "system_integrator": "LOT" + }, + { + "application": "City traffic, electronic purse, micellaneous applications", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x181C", + "service_provider": "Koordinator", + "system_integrator": "PVT" + }, + { + "application": "City traffic, electronic purse, micellaneous applications", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x181D", + "service_provider": "Koordinator", + "system_integrator": "PVT" + }, + { + "application": "Access control & security, city traffic, sports & entertainment", + "company": "IP Core", + "mad": "0x181F", + "service_provider": "IP Core", + "system_integrator": "IP Core" + }, + { + "application": "Electronic purse, car-parking system, single use ticket, period pass", + "company": "Emcard a.s.", + "mad": "0x1820", + "service_provider": "Emcard", + "system_integrator": "Emtest" + }, + { + "application": "Electronic purse, car-parking system, single use ticket, period pass", + "company": "Emcard a.s.", + "mad": "0x1821", + "service_provider": "Emcard", + "system_integrator": "Emtest" + }, + { + "application": "Liberec City Card - Public transport application", + "company": "Liberecká IS, a.s.", + "mad": "0x1822", + "service_provider": "Liberecká IS, a.s.", + "system_integrator": "Accenture Central Europe" + }, + { + "application": "Season ticket", + "company": "DOPRAVNI PODNIK mest Mostu a Litvinova, a.s.", + "mad": "0x1823", + "service_provider": "Dopravni Pdnik mest Mostu a Litvinova, a.s.", + "system_integrator": "Mikroelectronika, spol. sr. o., Kpt. Poplera 55, 565 01 Vysoké Mýto, CZ" + }, + { + "application": "Check in/out application", + "company": "DOPRAVNI PODNIK mest Mostu a Litvinova, a.s.", + "mad": "0x1824", + "service_provider": "Dopravni Podnik mest Mostu a Litvinova, a.s.", + "system_integrator": "Mikroelektronika, spol. sr.o., Kpt. Poplera 55, 565 01 Vysoké Mýto, CZ" + }, + { + "application": "Car Parking, Electronic Purse", + "company": "Haguess s.r.o.", + "mad": "0x1825", + "service_provider": "Haguess, s.r.o.", + "system_integrator": "Haguess, s.r.o." + }, + { + "application": "EFC-single-use ticket", + "company": "Emcard a.s.", + "mad": "0x1826", + "service_provider": "EMCARD, a.s.", + "system_integrator": "EMTEST, a.s." + }, + { + "application": "EFC period pass", + "company": "Emcard a.s.", + "mad": "0x1827", + "service_provider": "EMCARD, a.s.", + "system_integrator": "EMTEST, a.s." + }, + { + "application": "Liberec City Card - Season Pass Transport Tariffs", + "company": "Liberecká IS, a.s.", + "mad": "0x1828", + "service_provider": "Liberecká IS, a.s.", + "system_integrator": "Accenture Central Europe" + }, + { + "application": "Liberec City Card - Pre-pay Transport Tariffs", + "company": "Liberecká IS, a.s.", + "mad": "0x1829", + "service_provider": "Liberecká IS, a.s.", + "system_integrator": "Accenture Central Europe" + }, + { + "application": "Electronic purse, city traffic, customer profile, service applic, check-in/out applic", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x182A", + "service_provider": "Mikroelektronika", + "system_integrator": "Mikroelektronika" + }, + { + "application": "Prepaid ticket", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x182B", + "service_provider": "S.C. TRANSPORT PUBLICS A., Bacau, Romania", + "system_integrator": "MIKROELEKTRONIKA spol. s.r.i." + }, + { + "application": "Credit 2S", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x182C", + "service_provider": "Transmetro Guatemala", + "system_integrator": "SIEMENS Itron Business Services S.A. - Cordoba, Republica Argentina" + }, + { + "application": "Prepaid coupon 1S", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x182D", + "service_provider": "Transmetro Guatemala", + "system_integrator": "SIEMENS Itron Business services S.A. - Cordoba, Rep. Argentina" + }, + { + "application": "Prepaid ticket", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x182E", + "service_provider": "Panturist d.d., Croatia", + "system_integrator": "MIKROELEKTRONIKA spol.s.r.o., Vysoke Myto, Czech Republic" + }, + { + "application": "Prepaid coupon", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x182F", + "service_provider": "Mikroelektronika spol.s r.o.", + "system_integrator": "Mikroelektronika spol.s r.o." + }, + { + "application": "City traffic", + "company": "MENNICA POLSKA S.A.", + "mad": "0x1830", + "service_provider": "MENNICA POLSKA S.A.", + "system_integrator": "MENNICA POLSKA S.A." + }, + { + "application": "City traffic", + "company": "MENNICA POLSKA S.A.", + "mad": "0x1831", + "service_provider": "MENNICA POLSKA S.A.", + "system_integrator": "MENNICA POLSKA S.A." + }, + { + "application": "Prepaid coupon", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x1832", + "service_provider": "Mikroelektronika spol.s r.o.", + "system_integrator": "Mikroelektronika spol.s r.o." + }, + { + "application": "Prepaid coupon", + "company": "KORID LK, spol. s r.o", + "mad": "0x1834", + "service_provider": "KORID LK, spol.s.r.o.", + "system_integrator": "KORID LK, spol.s.r.o." + }, + { + "application": "Eticket", + "company": "KORID LK, spol. s r.o", + "mad": "0x1835", + "service_provider": "KORID LK, spol.s.r.o.", + "system_integrator": "KORID LK, spol.s.r.o." + }, + { + "application": "Prepaid coupon 1S", + "company": "Mikroelektronika GmbH", + "mad": "0x1836", + "service_provider": "MIKROELEKTRONIKA spol.s.r.o., Draby 849, Vysoke Myto 56601, Czech Republic", + "system_integrator": "MIKROELEKTRONIKA spol.s.r.o., Draby 849, Vysoke Myto 56601, Czech Republic" + }, + { + "application": "Prepaid coupon", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x1837", + "service_provider": "ZAGREBACKI Holding d.o.o.", + "system_integrator": "MIKROELEKTRONIKA spol.s.r.o." + }, + { + "application": "Prepaid coupon", + "company": "Mikroelektronika GmbH", + "mad": "0x1838", + "service_provider": "MIKROELEKTRONIKA spol.s.r.o.", + "system_integrator": "MIKROELEKTRONIKA spol.s.r.o." + }, + { + "application": "Prepaid coupon", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x1839", + "service_provider": "Mikroelektronika spol.s r.o", + "system_integrator": "Mikroelektronika spol.s r.o" + }, + { + "application": "City traffic services - ticket control, city card for Polish municipal services", + "company": "Unicard S.A.", + "mad": "0x183B", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "City traffic services - ticket control, city card for Polish municipal services", + "company": "Unicard S.A.", + "mad": "0x183C", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "City traffic services - ticket control, city card for Polish municipal services", + "company": "Unicard S.A.", + "mad": "0x183D", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "City traffic services - ticket control, city card for Polish municipal services", + "company": "Unicard S.A.", + "mad": "0x183E", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "Public transportation", + "company": "OY MATKAHUOLTO AB", + "mad": "0x183F", + "service_provider": "OY MATKAHUOLTO AB", + "system_integrator": "OY MATKAHUOLTO AB" + }, + { + "application": "Public transportation", + "company": "OY MATKAHUOLTO AB", + "mad": "0x1840", + "service_provider": "OY MATKAHUOLTO AB", + "system_integrator": "OY MATKAHUOLTO AB" + }, + { + "application": "City traffic, prepaid ticket, check in/out", + "company": "ODP-software s.r.o.", + "mad": "0x1841", + "service_provider": "ODP-software", + "system_integrator": "ODP-software" + }, + { + "application": "City traffic, prepaid ticket, check in/out", + "company": "ODP-software s.r.o.", + "mad": "0x1842", + "service_provider": "ODP-software", + "system_integrator": "ODP-software" + }, + { + "application": "Car authentication for telematics", + "company": "NXP Semiconductors", + "mad": "0x1843", + "service_provider": "NXP Semiconductors", + "system_integrator": "NXP Semiconductors" + }, + { + "application": "Public transport ticketing services", + "company": "Netlock Ltd", + "mad": "0x1844", + "service_provider": "Netlock Kft.", + "system_integrator": "Netlock Kft." + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1903", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services", + "company": "Czech Railways", + "mad": "0x1904", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Bus fare collection", + "company": "Ascom Monétel", + "mad": "0x2001", + "service_provider": "C.T.A.V.", + "system_integrator": "Monétel S.A." + }, + { + "application": "Bus fare collection", + "company": "Ascom Monétel", + "mad": "0x2002", + "service_provider": "Conseil Général du TARN", + "system_integrator": "Ascom Monétel" + }, + { + "application": "Bus service, ÖPNV", + "company": "Scheidt & Bachmann", + "mad": "0x2003", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Bus service, ÖPNV", + "company": "Scheidt & Bachmann", + "mad": "0x2004", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Bus Fare Collection", + "company": "Ascom Monétel", + "mad": "0x2005", + "service_provider": "Forbus Intercity", + "system_integrator": "Ascom Monétel S.A." + }, + { + "application": "Public transport", + "company": "Scan Coin AB", + "mad": "0x2006", + "service_provider": "Scan Coin AB", + "system_integrator": "" + }, + { + "application": "Ticketing system for public transport in Sweden, used primarily on buses", + "company": "CPT Nordic AB", + "mad": "0x2007", + "service_provider": "Country traffic in Sweden", + "system_integrator": "CPI Nordic AB" + }, + { + "application": "Bus Fare collection", + "company": "Ascom Monétel", + "mad": "0x2008", + "service_provider": "Setrans P", + "system_integrator": "As om Monetél SA" + }, + { + "application": "Automatic Fare Collection city and intercity bus traffic electronic purse", + "company": "Trgovina in Informatika d.o.o.", + "mad": "0x2009", + "service_provider": "Fourth Way - Alpetour", + "system_integrator": "Fourth Way" + }, + { + "application": "", + "company": "Reserved for MAD", + "mad": "0x200A", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Transport Ticketing, E-Purse, Citycard", + "company": "CJS Consultancy Ltd", + "mad": "0x200B", + "service_provider": "", + "system_integrator": "Transmo Citycard Ltd." + }, + { + "application": "Bus fare collection", + "company": "Ascom Monétel", + "mad": "0x200C", + "service_provider": "Maybus", + "system_integrator": "Ascom Monetel" + }, + { + "application": "Bus services with extension to rail and taxi", + "company": "Questek Marketing", + "mad": "0x200D", + "service_provider": "Questek Marketing", + "system_integrator": "Questek Marketing" + }, + { + "application": "Bus fare colection", + "company": "Ascom Monétel", + "mad": "0x200E", + "service_provider": "Oestfold", + "system_integrator": "Ascom Monétel" + }, + { + "application": "Bus Fare Collection", + "company": "Ascom Monétel", + "mad": "0x200F", + "service_provider": "SATAR", + "system_integrator": "Ascom Monetel S.A." + }, + { + "application": "Bus Fare Collection", + "company": "Ascom Monétel", + "mad": "0x2010", + "service_provider": "Atam Arezzo", + "system_integrator": "Ascom Monetel - SA" + }, + { + "application": "Collect fare system for transit authority", + "company": "Soprin ADS", + "mad": "0x2011", + "service_provider": "Soprin ADS - Ascom Monetel", + "system_integrator": "Soprin ADS" + }, + { + "application": "Busticketing System", + "company": "VFJ Technology Pty Ltd", + "mad": "0x2012", + "service_provider": "King Man County Public Traffic", + "system_integrator": "Barouh Electronic Co." + }, + { + "application": "Bus, Tramway, Underground Services", + "company": "Ascom Monétel", + "mad": "0x2013", + "service_provider": "ZTM (Transport Company of Marsaw)", + "system_integrator": "Ascom Monetel (porject leader Mr. Pascal Valette)" + }, + { + "application": "Electronic transportation voucher", + "company": "GRUPO VR", + "mad": "0x2014", + "service_provider": "Grupo VR", + "system_integrator": "" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x2015", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x2016", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x2017", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x2018", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x2019", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x201A", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x201B", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x201C", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x201D", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x201E", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x201F", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x2020", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x2021", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x2022", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Electronic fee collection", + "company": "EFKON AG", + "mad": "0x2023", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Bus & tramway fare collection", + "company": "Ascom", + "mad": "0x2030", + "service_provider": "SMTU - Montpellier", + "system_integrator": "Ascom Monétel" + }, + { + "application": "City transport bus, ferry, administration", + "company": "VFJ Technology Pty Ltd", + "mad": "0x2031", + "service_provider": "VFJ Technology", + "system_integrator": "Cubic - VFJ" + }, + { + "application": "Bus fare collection", + "company": "Ascom Monétel", + "mad": "0x2032", + "service_provider": "", + "system_integrator": "Ascom Monétel" + }, + { + "application": "Bus fare collection", + "company": "Ascom Monétel", + "mad": "0x2035", + "service_provider": "TCL", + "system_integrator": "Ascom Monétel" + }, + { + "application": "Bus Fare Collection", + "company": "Ascom Monétel", + "mad": "0x2036", + "service_provider": "TCL", + "system_integrator": "Ascom Monétel" + }, + { + "application": "Bus fare collection", + "company": "Ascom", + "mad": "0x2037", + "service_provider": "Tarragone (Spain)", + "system_integrator": "Ascom Monétel" + }, + { + "application": "Bus fare collection", + "company": "Ascom", + "mad": "0x2038", + "service_provider": "Tarragone (Spain)", + "system_integrator": "Ascom Monétel" + }, + { + "application": "Bus fare collection", + "company": "Ascom", + "mad": "0x2039", + "service_provider": "Tarragone (Spain)", + "system_integrator": "Ascom Monétel" + }, + { + "application": "Bus fare collection", + "company": "Ascom", + "mad": "0x203A", + "service_provider": "Tarragone (Spain)", + "system_integrator": "Ascom Monétel" + }, + { + "application": "Bus fare collection", + "company": "Ascom", + "mad": "0x203F", + "service_provider": "Salineira Ltda", + "system_integrator": "Ascom Monetel" + }, + { + "application": "Bus Fare Collection", + "company": "Ascom Monétel", + "mad": "0x2040", + "service_provider": "Ascom Monétel", + "system_integrator": "Ascom Monétel" + }, + { + "application": "Bus Fare Collection", + "company": "Ascom Monétel", + "mad": "0x2041", + "service_provider": "Ascom Monétel", + "system_integrator": "Ascom Meonétel" + }, + { + "application": "Bus Fare Collection", + "company": "Ascom Monétel", + "mad": "0x2042", + "service_provider": "Ascom Monétel", + "system_integrator": "Ascom Monétel" + }, + { + "application": "Bus Fare Collection", + "company": "Ascom Monétel", + "mad": "0x2043", + "service_provider": "Systas", + "system_integrator": "Ascom Monétel" + }, + { + "application": "Bus Fare Collection", + "company": "Ascom Monétel", + "mad": "0x2044", + "service_provider": "Systas", + "system_integrator": "Ascom Moétel" + }, + { + "application": "Access control, time attendance, bus ticket, hotel room card, VIP card f. club", + "company": "Giga-TMS Inc", + "mad": "0x2045", + "service_provider": "Giga TMS", + "system_integrator": "Giga TMS" + }, + { + "application": "Bus fare collection", + "company": "Ascom", + "mad": "0x2046", + "service_provider": "Burulas", + "system_integrator": "Burulas" + }, + { + "application": "Mass Transportation Ticketing", + "company": "Omnifare", + "mad": "0x2047", + "service_provider": "MBS", + "system_integrator": "MBS" + }, + { + "application": "Bus fare collection", + "company": "Ascom", + "mad": "0x2048", + "service_provider": "Eskisehir", + "system_integrator": "EAS" + }, + { + "application": "Bus fare collection", + "company": "Ascom", + "mad": "0x2049", + "service_provider": "Metro Ciudad Mexico", + "system_integrator": "Ascom" + }, + { + "application": "Elec ticketing, access control, electronic purse", + "company": "Empresa 1 Sistemas de Automacao e Comercio", + "mad": "0x204D", + "service_provider": "Empresa 1", + "system_integrator": "Empresa 1" + }, + { + "application": "City card, prepaid ticket, cardholder, servicespass", + "company": "Emcard a.s.", + "mad": "0x204E", + "service_provider": "Emcard", + "system_integrator": "Emtest" + }, + { + "application": "Fidelity, student, period pass, single-use ticket", + "company": "Emcard a.s.", + "mad": "0x204F", + "service_provider": "emcard", + "system_integrator": "emtest" + }, + { + "application": "Fidelity, student, period pass, single-use ticket", + "company": "Emcard a.s.", + "mad": "0x2050", + "service_provider": "emcard", + "system_integrator": "emtest" + }, + { + "application": "Fidelity, student, period pass, single-use ticket", + "company": "Emcard a.s.", + "mad": "0x2051", + "service_provider": "emcard", + "system_integrator": "emtest" + }, + { + "application": "Fidelity, student, period pass, single-use ticket", + "company": "Emcard a.s.", + "mad": "0x2052", + "service_provider": "emcard", + "system_integrator": "emtest" + }, + { + "application": "Bus, Underground", + "company": "ACS - Affiliated Computer Services", + "mad": "0x2053", + "service_provider": "Tisseo", + "system_integrator": "ACS" + }, + { + "application": "Bus Fare Collection", + "company": "A.C.S. SAS France", + "mad": "0x2054", + "service_provider": "ACS", + "system_integrator": "MetropolitanTransitAuthority of Harris Country" + }, + { + "application": "Public Transport Fare Collection", + "company": "Dublin Bus", + "mad": "0x2055", + "service_provider": "Dublin Bus", + "system_integrator": "Dublin Bus" + }, + { + "application": "Fidelity pass", + "company": "Emcard a.s.", + "mad": "0x2056", + "service_provider": "EMCARD, a.s.", + "system_integrator": "EMTEST, a.s." + }, + { + "application": "Service pass", + "company": "Emcard a.s.", + "mad": "0x2057", + "service_provider": "EMCARD, a.s.", + "system_integrator": "EMTEST, a.s." + }, + { + "application": "EFC-single-use ticket", + "company": "Emcard a.s.", + "mad": "0x2058", + "service_provider": "EMCARD, a.s.", + "system_integrator": "EMTEST, a.s." + }, + { + "application": "EFC-time ticket", + "company": "Emcard a.s.", + "mad": "0x2059", + "service_provider": "EMCARD, a.s.", + "system_integrator": "EMTEST, a.s." + }, + { + "application": "Bus Ticketing", + "company": "Krauth Technology", + "mad": "0x205A", + "service_provider": "Prof.A.Krauth Apparatebau", + "system_integrator": "Prof.A.Krauth Apparatebau" + }, + { + "application": "Transit SmartCard System, City E-purse System", + "company": "Intelligent Transaction Systems de Mexico S.A. de C.V.", + "mad": "0x205B", + "service_provider": "St. John's Transportation Commission", + "system_integrator": "Intelligent Transaction Systems de Mexico" + }, + { + "application": "Bus fare collection system", + "company": "PENTA d.o.o.", + "mad": "0x205C", + "service_provider": "PENTA", + "system_integrator": "PENTA" + }, + { + "application": "Bus fare collection system", + "company": "PENTA d.o.o.", + "mad": "0x205D", + "service_provider": "PENTA", + "system_integrator": "PENTA" + }, + { + "application": "Bus fare collection system", + "company": "PENTA d.o.o.", + "mad": "0x205E", + "service_provider": "PENTA", + "system_integrator": "PENTA" + }, + { + "application": "Bus e-ticketing system for different provinces of Iran", + "company": "Processing World Co.", + "mad": "0x205F", + "service_provider": "Processing world co.", + "system_integrator": "Processing world co." + }, + { + "application": "Bus", + "company": "ACS - Affiliated Computer Services", + "mad": "0x2060", + "service_provider": "ACS", + "system_integrator": "ACS" + }, + { + "application": "Electronic ticket", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x2061", + "service_provider": "Mikroelektronika spol.s r.o.", + "system_integrator": "Mikroelektronika spol.s r.o." + }, + { + "application": "Electronic tiicket", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x2062", + "service_provider": "ZAGREBACKI Holding d.o.o.", + "system_integrator": "MIKROELEKTRONIKA spol.s.r.o" + }, + { + "application": "Electronic ticket", + "company": "Mikroelektronika GmbH", + "mad": "0x2063", + "service_provider": "MIKROELEKTRONIKA spol.s.r.o.", + "system_integrator": "MIKROELEKTRONIKA spol.s.r.o." + }, + { + "application": "BUS", + "company": "ACS - Affiliated Computer Services", + "mad": "0x2064", + "service_provider": "ACS", + "system_integrator": "ACS" + }, + { + "application": "Transit ridership", + "company": "FARE Logistics", + "mad": "0x2065", + "service_provider": "", + "system_integrator": "Fare Logistics" + }, + { + "application": "BUS FARE COLLECTION", + "company": "ACS - Affiliated Computer Services", + "mad": "0x2066", + "service_provider": "BRESCIATRASPORTI", + "system_integrator": "ACS" + }, + { + "application": "Bus", + "company": "ACS - Affiliated Computer Services", + "mad": "0x2067", + "service_provider": "ACS", + "system_integrator": "ACS" + }, + { + "application": "Electronic ticket", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x2068", + "service_provider": "Jamaica Urban Transit Company Ltd", + "system_integrator": "Mikroelektronika spol.s r.o." + }, + { + "application": "Electronic couponticket for public transport", + "company": "BULL POLSKA Sp. z o.o.", + "mad": "0x2069", + "service_provider": "BULL POLSKA", + "system_integrator": "BULL POLSKA" + }, + { + "application": "Electronic ticket for public transport", + "company": "BULL POLSKA Sp. z o.o.", + "mad": "0x206A", + "service_provider": "BULL POLSKA", + "system_integrator": "BULL POLSKA" + }, + { + "application": "Bus Rail Fare Collection", + "company": "ACS - Affiliated Computer Services", + "mad": "0x206B", + "service_provider": "DTEI", + "system_integrator": "ACS" + }, + { + "application": "Bus", + "company": "ACS - Affiliated Computer Services", + "mad": "0x206C", + "service_provider": "STO", + "system_integrator": "ACS" + }, + { + "application": "Bus services, bus fare collection", + "company": "ODP-software s.r.o.", + "mad": "0x206D", + "service_provider": "ODP-software", + "system_integrator": "ODP-software" + }, + { + "application": "Bus services, bus fare collection", + "company": "ODP-software s.r.o.", + "mad": "0x206E", + "service_provider": "ODP-software", + "system_integrator": "ODP-software" + }, + { + "application": "Automatic Fare Collection System", + "company": "ACS Solution France", + "mad": "0x206F", + "service_provider": "Briansk", + "system_integrator": "ACS" + }, + { + "application": "Bus fare collection", + "company": "ACS - Affiliated Computer Services", + "mad": "0x2070", + "service_provider": "DOT", + "system_integrator": "ACS" + }, + { + "application": "Bus", + "company": "Xerox", + "mad": "0x2071", + "service_provider": "SEMITAN", + "system_integrator": "TAN" + }, + { + "application": "Card Touch Smart Card Applications", + "company": "Touch Technology International Inc.", + "mad": "0x2101", + "service_provider": "Touch Technology International", + "system_integrator": "Touch Technology International" + }, + { + "application": "Transport Ticketing", + "company": "Ascom", + "mad": "0x2102", + "service_provider": "SBME Milano", + "system_integrator": "A.I.I." + }, + { + "application": "Multi-Modal Transit", + "company": "ERG Transit Systems", + "mad": "0x2103", + "service_provider": "ERG Transit Systems", + "system_integrator": "ERG Transit Systems" + }, + { + "application": "Multi-Modal Transit", + "company": "ERG Transit Systems", + "mad": "0x2104", + "service_provider": "ERG Transit Systems", + "system_integrator": "ERG Transit Systems" + }, + { + "application": "Mass Transportation Ticketing", + "company": "Omnifare", + "mad": "0x2108", + "service_provider": "MBS", + "system_integrator": "MBS" + }, + { + "application": "Pre-paid bus card, passanger ID bus card", + "company": "Intelligent Transaction Systems de Mexico S.A. de C.V.", + "mad": "0x2109", + "service_provider": "Intelligent Transaction", + "system_integrator": "Intelligent Transcation" + }, + { + "application": "Pre-paid bus card, passanger ID bus card", + "company": "Intelligent Transaction Systems de Mexico S.A. de C.V.", + "mad": "0x210A", + "service_provider": "Intelligent Transaction", + "system_integrator": "Intelligent Transcation" + }, + { + "application": "Pre-paid bus card, passanger ID bus card", + "company": "Intelligent Transaction Systems de Mexico S.A. de C.V.", + "mad": "0x210B", + "service_provider": "Intelligent Transaction", + "system_integrator": "Intelligent Transcation" + }, + { + "application": "City card, prepaid ticket, cardholder, servicespass", + "company": "Emcard a.s.", + "mad": "0x210C", + "service_provider": "Emcard", + "system_integrator": "Emtest" + }, + { + "application": "City card, prepaid ticket, cardholder, servicespass", + "company": "Emcard a.s.", + "mad": "0x210D", + "service_provider": "Emcard", + "system_integrator": "Emtest" + }, + { + "application": "Integrated multi-modal transport ticketing system", + "company": "Keane Australia PTY Limited", + "mad": "0x210F", + "service_provider": "TTA", + "system_integrator": "KAMCO" + }, + { + "application": "Integrated multi-modal transport ticketing system", + "company": "Keane Australia PTY Limited", + "mad": "0x2110", + "service_provider": "TTA", + "system_integrator": "KAMCO" + }, + { + "application": "Card holder", + "company": "Emcard a.s.", + "mad": "0x2111", + "service_provider": "EMCARD, a.s.", + "system_integrator": "EMTEST, a.s." + }, + { + "application": "Prepaid ticket", + "company": "Emcard a.s.", + "mad": "0x2112", + "service_provider": "EMCARD, a.s.", + "system_integrator": "EMTEST, a.s." + }, + { + "application": "Electronic purse, city traffic, customer profile, service applic, check-in/out applic", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x2113", + "service_provider": "Mikroelektronika", + "system_integrator": "Mikroelektronika" + }, + { + "application": "Electronic ticketing for city of Friedrichshafen", + "company": "T-Systems GEI GmbH", + "mad": "0x2114", + "service_provider": "T-Systems GEI", + "system_integrator": "T-Systems GEI" + }, + { + "application": "Transportation ticket", + "company": "Haguess s.r.o.", + "mad": "0x2115", + "service_provider": "HAGUESS, a.s.", + "system_integrator": "HAGUESS, a.s" + }, + { + "application": "Bus and rail fare collection", + "company": "ACS - Affiliated Computer Services", + "mad": "0x2116", + "service_provider": "GCRTA", + "system_integrator": "ACS" + }, + { + "application": "Prepaid coupon - prepaid ticket for multimodal transport", + "company": "CSAD SVT Praha", + "mad": "0x2117", + "service_provider": "", + "system_integrator": "Mikroelektronika, EMTEST" + }, + { + "application": "Epurse - electronic purse intended for payment of fare in multimodal public transport", + "company": "CSAD SVT Praha", + "mad": "0x2118", + "service_provider": "", + "system_integrator": "Mikroelektronika, EMTEST" + }, + { + "application": "Automatic fare payment system for multi-modal transit", + "company": "Cubic Corporation", + "mad": "0x2119", + "service_provider": "", + "system_integrator": "Cubic Transportation Systems" + }, + { + "application": "Public transport smartcard integrated ticketing scheme for the Republic of Ireland", + "company": "Railway Procurement Agency", + "mad": "0x211A", + "service_provider": "Dublin Bus, Irish Rail, Bus Eireann, private-bus-operators", + "system_integrator": "RPA" + }, + { + "application": "General Ticketing Solution for Mas Transit", + "company": "Parkeon", + "mad": "0x211B", + "service_provider": "PARKEON", + "system_integrator": "PARKEON" + }, + { + "application": "General Ticketing Solution for Mas Transit", + "company": "Parkeon", + "mad": "0x211C", + "service_provider": "PARKEON", + "system_integrator": "PARKEON" + }, + { + "application": "Multi-modal Transit", + "company": "Västra Götalandsregionen", + "mad": "0x211D", + "service_provider": "Västtrafik AB", + "system_integrator": "Vix ERG" + }, + { + "application": "Transport application", + "company": "Unicard Limited UK", + "mad": "0x211E", + "service_provider": "Unicard Limited", + "system_integrator": "Unicard Limited" + }, + { + "application": "Transit fare collection, transit purse, transit ID", + "company": "GFI Genfare", + "mad": "0x211F", + "service_provider": "", + "system_integrator": "GFI Genfare, an SPX Division" + }, + { + "application": "Transit fare collection, transit purse, transit ID", + "company": "GFI Genfare", + "mad": "0x2120", + "service_provider": "", + "system_integrator": "GFI Genfare, an SPX Division" + }, + { + "application": "Transit fare collection, transit purse, transit ID", + "company": "GFI Genfare", + "mad": "0x2121", + "service_provider": "", + "system_integrator": "GFI Genfare, an SPX Division" + }, + { + "application": "Bus and rail fare collection", + "company": "ACS - Affiliated Computer Services", + "mad": "0x2122", + "service_provider": "RTD", + "system_integrator": "ACS" + }, + { + "application": "Bus services with extension to rail and taxi", + "company": "Questek Marketing", + "mad": "0x2801", + "service_provider": "Questek Marketing", + "system_integrator": "Questek Marketing" + }, + { + "application": "Mass Transportation Ticketing", + "company": "Omnifare", + "mad": "0x2803", + "service_provider": "MBS", + "system_integrator": "MBS" + }, + { + "application": "Tollway system", + "company": "VFJ Technology Pty Ltd", + "mad": "0x3001", + "service_provider": "VFJ Technology Pty Ltd", + "system_integrator": "Chendu Shuguang Optical Fibre Network (Ltd. China)" + }, + { + "application": "Tollway system", + "company": "VFJ Technology Pty Ltd", + "mad": "0x3002", + "service_provider": "VFJ Technology Pty Ltd", + "system_integrator": "Chendu Shuguang Optical Fibre Network (Ltd. China)" + }, + { + "application": "Toll collection", + "company": "Philips Projects", + "mad": "0x3003", + "service_provider": "Concepa (Concecionaria da Rodovia Oso Rio - Porto Alegre)", + "system_integrator": "Philips Projects Brazil" + }, + { + "application": "Toll collection", + "company": "Philips Projects", + "mad": "0x3004", + "service_provider": "Concepa (Concecionaria da Rodovia Oso Rio - Porto Alegre)", + "system_integrator": "Philips Projects Brazil" + }, + { + "application": "Toll collection", + "company": "Philips Projects", + "mad": "0x3005", + "service_provider": "Concepa (Concecionaria da Rodovia Oso Rio - Porto Alegre)", + "system_integrator": "Philips Projects Brazil" + }, + { + "application": "Toll collection", + "company": "Philips Projects", + "mad": "0x3006", + "service_provider": "Concepa (Concecionaria da Rodovia Oso Rio - Porto Alegre)", + "system_integrator": "Philips Projects Brazil" + }, + { + "application": "Toll collection", + "company": "Philips Projects", + "mad": "0x3007", + "service_provider": "Concepa (Concecionaria da Rodovia Oso Rio - Porto Alegre)", + "system_integrator": "Philips Projects Brazil" + }, + { + "application": "Road Tolling Application", + "company": "EFKON AG", + "mad": "0x3008", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Tolling Application", + "company": "EFKON AG", + "mad": "0x3009", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Tolling Application", + "company": "EFKON AG", + "mad": "0x300A", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Tolling Application", + "company": "EFKON AG", + "mad": "0x300B", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Tolling Application", + "company": "EFKON AG", + "mad": "0x300C", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Tolling Application", + "company": "EFKON AG", + "mad": "0x300D", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road toll application", + "company": "EFKON AG", + "mad": "0x300E", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Tollway", + "company": "VFJ Technology Pty Ltd", + "mad": "0x300F", + "service_provider": "VFJ HK", + "system_integrator": "" + }, + { + "application": "Tollway", + "company": "VFJ Technology Pty Ltd", + "mad": "0x3010", + "service_provider": "Xiamto Lintong Tollway", + "system_integrator": "" + }, + { + "application": "Tollway", + "company": "VFJ Technology Pty Ltd", + "mad": "0x3011", + "service_provider": "Xiamto Lintong Tollway", + "system_integrator": "" + }, + { + "application": "Tollway", + "company": "VFJ Technology Pty Ltd", + "mad": "0x3012", + "service_provider": "Xiamto Lintong Tollway", + "system_integrator": "" + }, + { + "application": "Tollway", + "company": "VFJ Technology Pty Ltd", + "mad": "0x3013", + "service_provider": "Xiamto Lintong Tollway", + "system_integrator": "" + }, + { + "application": "Tollway", + "company": "VFJ Technology Pty Ltd", + "mad": "0x3014", + "service_provider": "Austream", + "system_integrator": "Austream" + }, + { + "application": "Road toll application", + "company": "EFKON AG", + "mad": "0x3015", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Road toll application", + "company": "EFKON AG", + "mad": "0x3016", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Road toll application", + "company": "EFKON AG", + "mad": "0x3017", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Road toll application", + "company": "EFKON AG", + "mad": "0x3018", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Road toll application", + "company": "EFKON AG", + "mad": "0x3019", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Road toll application", + "company": "EFKON AG", + "mad": "0x301A", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x301B", + "service_provider": "Efkon", + "system_integrator": "Philips Projects" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x301C", + "service_provider": "Efkon", + "system_integrator": "Philips Projects" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x301D", + "service_provider": "Efkon", + "system_integrator": "Philips Projects" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x301E", + "service_provider": "Efkon", + "system_integrator": "Philips Projects" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x301F", + "service_provider": "Efkon", + "system_integrator": "Philips Projects" + }, + { + "application": "Weighbridge for trucks", + "company": "VFJ Technology Pty Ltd", + "mad": "0x3020", + "service_provider": "Hardware Systems Sales", + "system_integrator": "" + }, + { + "application": "Road toll", + "company": "EFKON AG", + "mad": "0x3021", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Road toll", + "company": "EFKON AG", + "mad": "0x3022", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Road toll", + "company": "EFKON AG", + "mad": "0x3023", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Road toll", + "company": "EFKON AG", + "mad": "0x3024", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Road toll", + "company": "EFKON AG", + "mad": "0x3025", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Road toll", + "company": "EFKON AG", + "mad": "0x3026", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Road toll", + "company": "EFKON AG", + "mad": "0x3027", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Road Toll", + "company": "EFKON AG", + "mad": "0x3028", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Toll", + "company": "EFKON AG", + "mad": "0x3029", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Toll", + "company": "EFKON AG", + "mad": "0x302A", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Toll", + "company": "EFKON AG", + "mad": "0x302B", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Toll", + "company": "EFKON AG", + "mad": "0x302C", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road toll", + "company": "EFKON AG", + "mad": "0x302D", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Road toll", + "company": "EFKON AG", + "mad": "0x302E", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Road toll", + "company": "EFKON AG", + "mad": "0x302F", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Road toll", + "company": "EFKON AG", + "mad": "0x3030", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Road toll", + "company": "EFKON AG", + "mad": "0x3031", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x3032", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x3033", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x3034", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x3035", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x3036", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x3037", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x3038", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x3039", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x303A", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x303B", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Road Toll Application", + "company": "EFKON AG", + "mad": "0x303C", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Road Toll Application", + "company": "Compsis Comp. Sist. Ind. Com. LTDA", + "mad": "0x303E", + "service_provider": "Compsis", + "system_integrator": "Compsis" + }, + { + "application": "Road Toll Application", + "company": "Compsis Comp. Sist. Ind. Com. LTDA", + "mad": "0x303F", + "service_provider": "Compsis", + "system_integrator": "Compsis" + }, + { + "application": "Road Toll Application", + "company": "Compsis Comp. Sist. Ind. Com. LTDA", + "mad": "0x3040", + "service_provider": "Compsis", + "system_integrator": "Compsis" + }, + { + "application": "Road Toll Application", + "company": "Compsis Comp. Sist. Ind. Com. LTDA", + "mad": "0x3041", + "service_provider": "Compsis", + "system_integrator": "Compsis" + }, + { + "application": "Road Toll Application", + "company": "Compsis Comp. Sist. Ind. Com. LTDA", + "mad": "0x3042", + "service_provider": "Compsis", + "system_integrator": "Compsis" + }, + { + "application": "Road Toll", + "company": "EFKON AG", + "mad": "0x3043", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Toll", + "company": "EFKON AG", + "mad": "0x3046", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Road Toll", + "company": "EFKON AG", + "mad": "0x3047", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Toll payment", + "company": "GPS Tecnologia Ltda.", + "mad": "0x3048", + "service_provider": "GPS", + "system_integrator": "GPS" + }, + { + "application": "Electronic toll collection", + "company": "Cetrta Pot d.o.o.", + "mad": "0x3049", + "service_provider": "Dars d.d.", + "system_integrator": "Cetrta POT d.o.o." + }, + { + "application": "Road toll", + "company": "Diners Club Adriatic d.d.", + "mad": "0x305A", + "service_provider": "Diners Club", + "system_integrator": "Diners Club" + }, + { + "application": "Road toll", + "company": "Diners Club Adriatic d.d.", + "mad": "0x305B", + "service_provider": "Diners Club", + "system_integrator": "Diners Club" + }, + { + "application": "Intelligent Transport Services", + "company": "EFKON AG", + "mad": "0x3102", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Intelligent Transport Services", + "company": "EFKON AG", + "mad": "0x3103", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Intelligent Transport Services", + "company": "EFKON AG", + "mad": "0x3104", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Intelligent Transport Services", + "company": "EFKON AG", + "mad": "0x3105", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Intelligent Transport Services", + "company": "EFKON AG", + "mad": "0x3106", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Intelligent Transport Services", + "company": "EFKON AG", + "mad": "0x3107", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Intelligent Transport Services", + "company": "EFKON AG", + "mad": "0x3108", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Intelligent Transport Services", + "company": "EFKON AG", + "mad": "0x3109", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Intelligent Transport Services", + "company": "EFKON AG", + "mad": "0x310A", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Intelligent Transport Services", + "company": "EFKON AG", + "mad": "0x310B", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Stored value card payment system", + "company": "GiroVend Cashless Systems PLC", + "mad": "0x3801", + "service_provider": "GiroVend", + "system_integrator": "GiroVend" + }, + { + "application": "Card Administratin, cardholder adminstration, access control & security, company services, miscellaneous applications", + "company": "Ministry of Defense", + "mad": "0x3802", + "service_provider": "Ministry of Defence", + "system_integrator": "" + }, + { + "application": "Company Payment System, Company Facility Services, Company Identification Services", + "company": "Maas Systems B.V.", + "mad": "0x3803", + "service_provider": "Maas Systems B.V.", + "system_integrator": "Mass Systems B.V." + }, + { + "application": "Company Payment System, Company Facility Services, Company Identification Services", + "company": "Maas Systems B.V.", + "mad": "0x3804", + "service_provider": "Maas Systems B.V.", + "system_integrator": "Mass Systems B.V." + }, + { + "application": "Company Payment System, Company Facility Services, Company Identification Services", + "company": "Maas Systems B.V.", + "mad": "0x3805", + "service_provider": "Maas Systems B.V.", + "system_integrator": "Mass Systems B.V." + }, + { + "application": "Access control, company service", + "company": "Automaten Seitz GmbH", + "mad": "0x3807", + "service_provider": "Automaten Seitz", + "system_integrator": "Automaten Seitz" + }, + { + "application": "Access controll security payment", + "company": "Matsushita Communication Industrial", + "mad": "0x3808", + "service_provider": "Matsushita Communication", + "system_integrator": "Matsushita Communication" + }, + { + "application": "Multi functional badge, private application", + "company": "Microtronic AG", + "mad": "0x3809", + "service_provider": "Microtronic AG", + "system_integrator": "Microtronic AG" + }, + { + "application": "", + "company": "InterCard GmbH Kartensysteme", + "mad": "0x380A", + "service_provider": "Inter Card GmbH", + "system_integrator": "Inter Card GmbH" + }, + { + "application": "", + "company": "InterCard GmbH Kartensysteme", + "mad": "0x380B", + "service_provider": "Inter Card GmbH", + "system_integrator": "Inter Card GmbH" + }, + { + "application": "", + "company": "InterCard GmbH Kartensysteme", + "mad": "0x380C", + "service_provider": "Inter Card GmbH", + "system_integrator": "Inter Card GmbH" + }, + { + "application": "Identification service", + "company": "Pink Roccade", + "mad": "0x380D", + "service_provider": "Pink Roccade", + "system_integrator": "Pink Roccade" + }, + { + "application": "Multiapplication car for industry & trafic, parking, swimming pool", + "company": "ASEC S.A.", + "mad": "0x380E", + "service_provider": "ASEC S.A", + "system_integrator": "ASEC S.A" + }, + { + "application": "Payment and registration system", + "company": "Magna Carta B.U.", + "mad": "0x380F", + "service_provider": "Magna Carta", + "system_integrator": "Magna Carta" + }, + { + "application": "Identification service", + "company": "Pink Roccade", + "mad": "0x3810", + "service_provider": "Pink Roccade", + "system_integrator": "Pink Roccade" + }, + { + "application": "Company Facility Service", + "company": "Deister Electronic", + "mad": "0x3811", + "service_provider": "Deister Electronic GmbH", + "system_integrator": "Deister Electronic GmbH" + }, + { + "application": "Company Facility Service", + "company": "Deister Electronic", + "mad": "0x3812", + "service_provider": "Deister Electronic GmbH", + "system_integrator": "Deister Electronic GmbH" + }, + { + "application": "Multi functional badge for private application", + "company": "Microtronic AG", + "mad": "0x3813", + "service_provider": "Microtronic", + "system_integrator": "Microtronic" + }, + { + "application": "Multi functional badge for private application", + "company": "Microtronic AG", + "mad": "0x3814", + "service_provider": "Microtronic", + "system_integrator": "Microtronic" + }, + { + "application": "Multi functional badge for private application", + "company": "Microtronic AG", + "mad": "0x3815", + "service_provider": "Microtronic", + "system_integrator": "Microtronic" + }, + { + "application": "Multi functional badge for private application", + "company": "Microtronic AG", + "mad": "0x3816", + "service_provider": "Microtronic", + "system_integrator": "Microtronic" + }, + { + "application": "Multi functional badge for private application", + "company": "Microtronic AG", + "mad": "0x3817", + "service_provider": "Microtronic", + "system_integrator": "Microtronic" + }, + { + "application": "Multi functional badge for private application", + "company": "Microtronic AG", + "mad": "0x3818", + "service_provider": "Microtronic", + "system_integrator": "Microtronic" + }, + { + "application": "Multi functional badge for private application", + "company": "Microtronic AG", + "mad": "0x3819", + "service_provider": "Microtronic", + "system_integrator": "Microtronic" + }, + { + "application": "Cashless payment and others", + "company": "GPI GmbH", + "mad": "0x3827", + "service_provider": "GPI GmbH", + "system_integrator": "GPI GmbH" + }, + { + "application": "Company services", + "company": "Deutsche Lufthansa AG FFM", + "mad": "0x3828", + "service_provider": "Deutsche Lufthansa AG", + "system_integrator": "Deutsche Lufthansa AG" + }, + { + "application": "Access control, time management, electronic wallet", + "company": "Universitaire Ziekenhuizen Leuven", + "mad": "0x3829", + "service_provider": "", + "system_integrator": "GET NV" + }, + { + "application": "Company services", + "company": "Card3 GmbH", + "mad": "0x382A", + "service_provider": "Card3 GmbH", + "system_integrator": "Card3 GmbH" + }, + { + "application": "Computer, car parking, elec. purse, access control & security", + "company": "DECA Engineering", + "mad": "0x382B", + "service_provider": "Deca Engineering", + "system_integrator": "Deca Engineering" + }, + { + "application": "", + "company": "Horoquartz Gestion des Temps", + "mad": "0x382C", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "", + "company": "Horoquartz Gestion des Temps", + "mad": "0x382D", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "", + "company": "Horoquartz Gestion des Temps", + "mad": "0x382E", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "", + "company": "Horoquartz Gestion des Temps", + "mad": "0x382F", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "", + "company": "Horoquartz Gestion des Temps", + "mad": "0x3830", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "Road toll", + "company": "Diners Club Adriatic d.d.", + "mad": "0x3831", + "service_provider": "Diners Club", + "system_integrator": "Diners Club" + }, + { + "application": "Company services, access & sec control, electronic purse...", + "company": "Cominfo a.s.", + "mad": "0x3832", + "service_provider": "Cominfo", + "system_integrator": "Cominfo" + }, + { + "application": "Company services", + "company": "Cash Card Automaten GmbH", + "mad": "0x3833", + "service_provider": "Cash Card", + "system_integrator": "Cash Card" + }, + { + "application": "Access control, computer application, company services", + "company": "Volvo Car Corporation", + "mad": "0x3834", + "service_provider": "Volvo Car", + "system_integrator": "Volvo Car" + }, + { + "application": "Time attendnace, fuel, access control", + "company": "Emcard a.s.", + "mad": "0x3835", + "service_provider": "Emtest", + "system_integrator": "Emtest" + }, + { + "application": "Company services", + "company": "Emcard a.s.", + "mad": "0x3836", + "service_provider": "EMCARD, a.s.", + "system_integrator": "EMTEST, a.s." + }, + { + "application": "Multiple Company Services", + "company": "Viessmann Werke GmbH & Co KG", + "mad": "0x3837", + "service_provider": "Viessmann Werke", + "system_integrator": "Viessmann Werke" + }, + { + "application": "E.purse", + "company": "GTI", + "mad": "0x3839", + "service_provider": "Mr. Eric Houri", + "system_integrator": "Mr. Francois Bodard" + }, + { + "application": "Company services", + "company": "MENNICA POLSKA S.A.", + "mad": "0x383A", + "service_provider": "MENNICA POLSKA S.A.", + "system_integrator": "MENNICA POLSKA S.A." + }, + { + "application": "Company Services", + "company": "Scheidt & Bachmann GmbH", + "mad": "0x383B", + "service_provider": "Scheidt & Bachmann GmbH", + "system_integrator": "Scheidt & Bachmann GmbH" + }, + { + "application": "", + "company": "Reac BV", + "mad": "0x383C", + "service_provider": "", + "system_integrator": "REAC" + }, + { + "application": "Follow me printing system", + "company": "N.V. EPZ", + "mad": "0x383D", + "service_provider": "EPZ", + "system_integrator": "Xerox Corporation" + }, + { + "application": "Registration of received radiation dose in nuclear power plant", + "company": "N.V. EPZ", + "mad": "0x383E", + "service_provider": "EPZ", + "system_integrator": "Mirion Technologies/MGP" + }, + { + "application": "Access control, identification", + "company": "Swedish Social Isurance Agency", + "mad": "0x383F", + "service_provider": "Swedish Social Isurance Agency", + "system_integrator": "Swedish Social Isurance Agency" + }, + { + "application": "Payment and registration", + "company": "PAYCULT GMBH", + "mad": "0x3840", + "service_provider": "PAYCULT", + "system_integrator": "PAYCULT" + }, + { + "application": "City transport bus, ferry, administration", + "company": "VFJ Technology Pty Ltd", + "mad": "0x4001", + "service_provider": "VFJ Technology", + "system_integrator": "Cubic - VFJ" + }, + { + "application": "Transport Ticketing, E-Purse, Citycard", + "company": "CJS Consultancy Ltd", + "mad": "0x4002", + "service_provider": "", + "system_integrator": "Transmo Citycard Ltd." + }, + { + "application": "Combined application for access control, ferry and rail ticketing for the Island of Langegeoog", + "company": "Companion GmbH", + "mad": "0x4003", + "service_provider": "Companion GmbH", + "system_integrator": "Companion GmbH, Krups Consultants GmbH, Gemplus GmbH" + }, + { + "application": "User needs and preference", + "company": "University of Newcastle", + "mad": "0x4004", + "service_provider": "Distinct", + "system_integrator": "University of Newcastle" + }, + { + "application": "User needs and preference", + "company": "University of Newcastle", + "mad": "0x4005", + "service_provider": "Distinct", + "system_integrator": "University of Newcastle" + }, + { + "application": "User needs and preference", + "company": "University of Newcastle", + "mad": "0x4006", + "service_provider": "Distinct", + "system_integrator": "University of Newcastle" + }, + { + "application": "User needs and preference", + "company": "University of Newcastle", + "mad": "0x4007", + "service_provider": "Distinct", + "system_integrator": "University of Newcastle" + }, + { + "application": "User needs and preference", + "company": "University of Newcastle", + "mad": "0x4008", + "service_provider": "Distinct", + "system_integrator": "University of Newcastle" + }, + { + "application": "City card services", + "company": "Rosan Finance", + "mad": "0x4009", + "service_provider": "Retail Trade and Services in Moscow", + "system_integrator": "Express card" + }, + { + "application": "City card services", + "company": "Moscow Government Department For Retail Trade and Services", + "mad": "0x400B", + "service_provider": "Retail Trade and Service", + "system_integrator": "Express Card" + }, + { + "application": "Identification of cardholder", + "company": "Rosan Finance", + "mad": "0x400C", + "service_provider": "Retail Trade and Services", + "system_integrator": "Rosan Finance" + }, + { + "application": "Mass Transportation Ticketing", + "company": "Omnifare", + "mad": "0x400D", + "service_provider": "MBS", + "system_integrator": "MBS" + }, + { + "application": "Access control", + "company": "Connex Solutions Limited", + "mad": "0x400E", + "service_provider": "Connex", + "system_integrator": "Connex" + }, + { + "application": "Acess Control, Time and Attendance", + "company": "Milenio 3 Systemas Electonicos", + "mad": "0x400F", + "service_provider": "Milenio3", + "system_integrator": "Milenio3" + }, + { + "application": "City card services", + "company": "Axess AG", + "mad": "0x4010", + "service_provider": "Axess", + "system_integrator": "Axess" + }, + { + "application": "Provision of citizen services", + "company": "UK National Smartcard Project", + "mad": "0x4011", + "service_provider": "English Local Authorities", + "system_integrator": "" + }, + { + "application": "Provision of citizen services", + "company": "UK National Smartcard Project", + "mad": "0x4012", + "service_provider": "English Local Authorities", + "system_integrator": "" + }, + { + "application": "Provision of citizen services", + "company": "UK National Smartcard Project", + "mad": "0x4013", + "service_provider": "English Local Authorities", + "system_integrator": "" + }, + { + "application": "City card, prepaid ticket, cardholder, servicespass", + "company": "Emcard a.s.", + "mad": "0x4014", + "service_provider": "Emcard", + "system_integrator": "Emtest" + }, + { + "application": "Liberec City Car, Card manag center", + "company": "Liberecká IS, a.s.", + "mad": "0x4015", + "service_provider": "Liberecka", + "system_integrator": "Accenture Central Europe" + }, + { + "application": "City Card Services", + "company": "Centro Informatico Municipal", + "mad": "0x4016", + "service_provider": "Donostiako Udala/Ayuntamiento de San Sebastian", + "system_integrator": "Centro Informatico Municipal" + }, + { + "application": "City Card Services", + "company": "Centro Informatico Municipal", + "mad": "0x4017", + "service_provider": "Donostiako Udala/Ayuntamiento de San Sebastian", + "system_integrator": "Centro Informatico Municipal" + }, + { + "application": "City Card Services", + "company": "Centro Informatico Municipal", + "mad": "0x4018", + "service_provider": "Donostiako Udala/Ayuntamiento de San Sebastian", + "system_integrator": "Centro Informatico Municipal" + }, + { + "application": "City Card Services", + "company": "Centro Informatico Municipal", + "mad": "0x4019", + "service_provider": "Donostiako Udala/Ayuntamiento de San Sebastian", + "system_integrator": "Centro Informatico Municipal" + }, + { + "application": "City Card Services", + "company": "Centro Informatico Municipal", + "mad": "0x401A", + "service_provider": "Donostiako Udala/Ayuntamiento de San Sebastian", + "system_integrator": "Centro Informatico Municipal" + }, + { + "application": "City Card Services", + "company": "Centro Informatico Municipal", + "mad": "0x401B", + "service_provider": "Donostiako Udala/Ayuntamiento de San Sebastian", + "system_integrator": "Centro Informatico Municipal" + }, + { + "application": "City Card Services", + "company": "Centro Informatico Municipal", + "mad": "0x401C", + "service_provider": "Donostiako Udala/Ayuntamiento de San Sebastian", + "system_integrator": "Centro Informatico Municipal" + }, + { + "application": "City Card Services", + "company": "Centro Informatico Municipal", + "mad": "0x401D", + "service_provider": "Donostiako Udala/Ayuntamiento de San Sebastian", + "system_integrator": "Centro Informatico Municipal" + }, + { + "application": "City Card Services", + "company": "Centro Informatico Municipal", + "mad": "0x401E", + "service_provider": "Donostiako Udala/Ayuntamiento de San Sebastian", + "system_integrator": "Centro Informatico Municipal" + }, + { + "application": "City Card Services", + "company": "Centro Informatico Municipal", + "mad": "0x401F", + "service_provider": "Donostiako Udala/Ayuntamiento de San Sebastian", + "system_integrator": "Centro Informatico Municipal" + }, + { + "application": "City card", + "company": "Emcard a.s.", + "mad": "0x4020", + "service_provider": "EMCARD, a.s.", + "system_integrator": "EMTEST, a.s." + }, + { + "application": "Programa Informatico para Fidelazcion Clientes", + "company": "LAI Sistemas Informaticos S.L.", + "mad": "0x4021", + "service_provider": "LAI Sistemas Informaticos S.L.", + "system_integrator": "Luis Maria Ortiz Gorraiz" + }, + { + "application": "Programa Informatico para Fidelazcion Clientes", + "company": "LAI Sistemas Informaticos S.L.", + "mad": "0x4022", + "service_provider": "LAI Sistemas Informaticos S.L.", + "system_integrator": "Luis Maria Ortiz Gorraiz" + }, + { + "application": "Programa Informatico para Fidelazcion Clientes", + "company": "LAI Sistemas Informaticos S.L.", + "mad": "0x4023", + "service_provider": "LAI Sistemas Informaticos S.L.", + "system_integrator": "Luis Maria Ortiz Gorraiz" + }, + { + "application": "Programa Informatico para Fidelazcion Clientes", + "company": "LAI Sistemas Informaticos S.L.", + "mad": "0x4024", + "service_provider": "LAI Sistemas Informaticos S.L.", + "system_integrator": "Luis Maria Ortiz Gorraiz" + }, + { + "application": "Programa Informatico para Fidelazcion Clientes", + "company": "LAI Sistemas Informaticos S.L.", + "mad": "0x4025", + "service_provider": "LAI Sistemas Informaticos S.L.", + "system_integrator": "Luis Maria Ortiz Gorraiz" + }, + { + "application": "City card services", + "company": "Monet+ a.s.", + "mad": "0x4026", + "service_provider": "MONET+, a.s.", + "system_integrator": "MONET+, a.s." + }, + { + "application": "Fare collection & access control", + "company": "Pusatec Oy", + "mad": "0x4027", + "service_provider": "PUSATEC", + "system_integrator": "PUSATEC" + }, + { + "application": "Security management; card management; access control", + "company": "NISCAYAH B.V.", + "mad": "0x4028", + "service_provider": "NISCAYAH", + "system_integrator": "NISCAYAH" + }, + { + "application": "Security management; card management; access control", + "company": "NISCAYAH B.V.", + "mad": "0x4029", + "service_provider": "NISCAYAH", + "system_integrator": "NISCAYAH" + }, + { + "application": "City card services", + "company": "Gantner Electronic GmbH", + "mad": "0x402A", + "service_provider": "GANTNER Electronic", + "system_integrator": "GANTNER Electronic" + }, + { + "application": "National ID Card for Bogota City", + "company": "Bogota Distrito Capital", + "mad": "0x402B", + "service_provider": "Tarjeta Ciudadana Bogota Capital - TCBC", + "system_integrator": "SMARTCHIP S.A." + }, + { + "application": "City card services", + "company": "SIT Solution for IT Payment GmbH", + "mad": "0x402C", + "service_provider": "SIT Solution for IT Payment GmbH", + "system_integrator": "SIT Solution for IT Payment GmbH" + }, + { + "application": "Access control, Time attendanc, job control", + "company": "EM Group", + "mad": "0x4701", + "service_provider": "EM Group", + "system_integrator": "EM Group" + }, + { + "application": "Access control", + "company": "One Security PTY Ltd", + "mad": "0x4702", + "service_provider": "One Security", + "system_integrator": "One Security" + }, + { + "application": "Access control & security, entertainment and sports", + "company": "Giga-TMS Inc", + "mad": "0x4703", + "service_provider": "Giga", + "system_integrator": "Giga" + }, + { + "application": "Various Access Control Applications", + "company": "Honeywell Access Systems", + "mad": "0x4707", + "service_provider": "", + "system_integrator": "HAS - Reston, VA; HAS - Oak Creek; HAS - Austin Texas" + }, + { + "application": "Various Access Control Applications", + "company": "Honeywell Access Systems", + "mad": "0x4708", + "service_provider": "", + "system_integrator": "HAS - Reston, VA; HAS - Oak Creek; HAS - Austin Texas" + }, + { + "application": "Various Access Control Applications", + "company": "Honeywell Access Systems", + "mad": "0x4709", + "service_provider": "", + "system_integrator": "HAS - Reston, VA; HAS - Oak Creek; HAS - Austin Texas" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x470A", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x470B", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x470C", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x470D", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x470E", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x470F", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x4710", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x4711", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x4712", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x4713", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x4714", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x4715", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x4716", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x4717", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x4718", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x4719", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x471A", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x471B", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x471C", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x471D", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x471E", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x471F", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x4720", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x4721", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Access Control", + "company": "IOLAN BV", + "mad": "0x4722", + "service_provider": "IOLAN BV", + "system_integrator": "IOLAN BV" + }, + { + "application": "Application COBALT access control ", + "company": "TECHNICOB", + "mad": "0x4723", + "service_provider": "TECHNICOB", + "system_integrator": "TECHNICOB" + }, + { + "application": "Access control, benefits", + "company": "Ústecky kraj", + "mad": "0x4724", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Access control", + "company": "ASCOM", + "mad": "0x4725", + "service_provider": "ASCOM", + "system_integrator": "ASCOM" + }, + { + "application": "Lockers, access control and switch system integration", + "company": "ENKOA System", + "mad": "0x4726", + "service_provider": "Enkoa", + "system_integrator": "Juan Cruz Iriondo" + }, + { + "application": "Lockers, access control and switch system integration", + "company": "ENKOA System", + "mad": "0x4727", + "service_provider": "Enkoa", + "system_integrator": "Juan Cruz Iriondo" + }, + { + "application": "Lockers, access control and switch system integration", + "company": "ENKOA System", + "mad": "0x4728", + "service_provider": "Enkoa", + "system_integrator": "Juan Cruz Iriondo" + }, + { + "application": "Trade fair card Deutsche Messe AG, Hannover", + "company": "Systemform GmbH", + "mad": "0x4801", + "service_provider": "Systemform", + "system_integrator": "Systemform" + }, + { + "application": "Scheidt & Bachmann basis dutes", + "company": "Scheidt & Bachmann", + "mad": "0x4802", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Scheidt & Bachmann basis dutes", + "company": "Scheidt & Bachmann", + "mad": "0x4803", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Scheidt & Bachmann basis dutes", + "company": "Scheidt & Bachmann", + "mad": "0x4804", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Access control & security time management", + "company": "Gelma", + "mad": "0x4805", + "service_provider": "Gelma Industrieelektronik GmbH", + "system_integrator": "" + }, + { + "application": "", + "company": "Systemform GmbH", + "mad": "0x4806", + "service_provider": "Systemform", + "system_integrator": "Systemform" + }, + { + "application": "Zutritt, Zeit- u. Betriebsdatenerfassung", + "company": "Interflex Datensysteme GmbH", + "mad": "0x4807", + "service_provider": "", + "system_integrator": "Interflex Datensysteme GmbH" + }, + { + "application": "Employer indentification card", + "company": "VFJ Technology Pty Ltd", + "mad": "0x4808", + "service_provider": "VFJ Electronics Pty Ltd.", + "system_integrator": "VFJ Electronics PTy Ltd." + }, + { + "application": "City Transport (Metro ticketing, bus ticket)", + "company": "VFJ Technology Pty Ltd", + "mad": "0x4809", + "service_provider": "VFJ Electronic Pty Ltd.", + "system_integrator": "Cubic - VFJ" + }, + { + "application": "Access control & security", + "company": "Ing. Büro Schrick", + "mad": "0x480A", + "service_provider": "Büro Schrick", + "system_integrator": "Büro Schrick" + }, + { + "application": "Michronos Time Attendance System", + "company": "MICOS GmbH", + "mad": "0x480B", + "service_provider": "Micos GmbH", + "system_integrator": "Micos GmbH" + }, + { + "application": "Access control system", + "company": "MICOS GmbH", + "mad": "0x480C", + "service_provider": "Micos", + "system_integrator": "Micos" + }, + { + "application": "Access Controll, Security Electronic Purse, Ski-Ticketing, Ticketing", + "company": "*Siemens ANL", + "mad": "0x480D", + "service_provider": "", + "system_integrator": "Siemens AG" + }, + { + "application": "Card Administratin, cardholder adminstration, access control & security, company services, miscellaneous applications", + "company": "Ministry of Defense", + "mad": "0x480E", + "service_provider": "Ministry of Defence", + "system_integrator": "" + }, + { + "application": "Academic Services, Electronic Purse, Access control & security", + "company": "CNA Limited/Rax-Comm Systems Ltd.", + "mad": "0x480F", + "service_provider": "CNA Limited", + "system_integrator": "CNA Limited" + }, + { + "application": "Time attandence, access control + security, electronic purse, plant data collection", + "company": "LNI Ingenieurgesellschaft für Kommunikationstechnik mbH", + "mad": "0x4810", + "service_provider": "LNI GmbH", + "system_integrator": "LNI GmbH" + }, + { + "application": "Security and Access Control", + "company": "PEC (New Zealand) Ltd.", + "mad": "0x4811", + "service_provider": "Cardax", + "system_integrator": "" + }, + { + "application": "Security and Access Control", + "company": "PEC (New Zealand) Ltd.", + "mad": "0x4812", + "service_provider": "Cardax", + "system_integrator": "" + }, + { + "application": "University & Staff identification", + "company": "VFJ Technology Pty Ltd", + "mad": "0x4813", + "service_provider": "VFJ Hong Kong", + "system_integrator": "" + }, + { + "application": "University & Staff identification", + "company": "VFJ Technology Pty Ltd", + "mad": "0x4814", + "service_provider": "VFJ Hong Kong", + "system_integrator": "" + }, + { + "application": "University & Staff identification", + "company": "VFJ Technology Pty Ltd", + "mad": "0x4815", + "service_provider": "VFJ Hong Kong", + "system_integrator": "" + }, + { + "application": "University & Staff identification", + "company": "VFJ Technology Pty Ltd", + "mad": "0x4816", + "service_provider": "VFJ Hong Kong", + "system_integrator": "" + }, + { + "application": "University & Staff identification", + "company": "VFJ Technology Pty Ltd", + "mad": "0x4817", + "service_provider": "VFJ Hong Kong", + "system_integrator": "" + }, + { + "application": "University & Staff identification", + "company": "VFJ Technology Pty Ltd", + "mad": "0x4818", + "service_provider": "VFJ Hong Kong", + "system_integrator": "" + }, + { + "application": "University & Staff identification", + "company": "VFJ Technology Pty Ltd", + "mad": "0x4819", + "service_provider": "VFJ Hong Kong", + "system_integrator": "" + }, + { + "application": "", + "company": "Reserved for MAD", + "mad": "0x481A", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Access control/security", + "company": "VFJ Technology Pty Ltd", + "mad": "0x481B", + "service_provider": "Taiwan Microcode Co Ltd.", + "system_integrator": "Taiwan Microcode Co Ltd." + }, + { + "application": "Access control/security", + "company": "VFJ Technology Pty Ltd", + "mad": "0x481C", + "service_provider": "Taiwan Microcode Co Ltd.", + "system_integrator": "Taiwan Microcode Co Ltd." + }, + { + "application": "DEM Komponenten für Zutrittskontrolle, Zeiterfassung, Betribsdatenerfassung, Kantine, Automaten, Tankdatenerf.", + "company": "Phg Peter Hengstler GmbH", + "mad": "0x481D", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "OEM-Komponenten für Zutrittskontrolle, Zeiterfassung, elektr. Geldbörse,...", + "company": "Peter Hengstler GmbH + Co KG", + "mad": "0x481E", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "OEM-Komponenten für Zutrittskontrolle, Zeiterfassung, elektr. Geldbörse,...", + "company": "Peter Hengstler GmbH + Co KG", + "mad": "0x481F", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "OEM-Komponenten für Zutrittskontrolle, Zeiterfassung, elektr. Geldbörse,...", + "company": "Peter Hengstler GmbH + Co KG", + "mad": "0x4820", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "OEM-Komponenten für Zutrittskontrolle, Zeiterfassung, elektr. Geldbörse,...", + "company": "Peter Hengstler GmbH + Co KG", + "mad": "0x4821", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "OEM-Komponenten für Zutrittskontrolle, Zeiterfassung, elektr. Geldbörse,...", + "company": "Peter Hengstler GmbH + Co KG", + "mad": "0x4822", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Access control, time management, high security, time attendence", + "company": "Winkhaus Intras Datensysteme GmbH", + "mad": "0x4823", + "service_provider": "Winkhaus Intras Datensysteme GmbH", + "system_integrator": "Winkhaus Intras Datensysteme GmbH" + }, + { + "application": "Access control system, time & attendance system", + "company": "Custom Micro Products Ltd.", + "mad": "0x4824", + "service_provider": "Custom Micro Products Ltd", + "system_integrator": "Custom Micro Products Ltd" + }, + { + "application": "Acess Control", + "company": "CYNAPS", + "mad": "0x4825", + "service_provider": "Cynaps", + "system_integrator": "" + }, + { + "application": "Access control and time managemnet", + "company": "Primion Technology GmbH", + "mad": "0x4826", + "service_provider": "BEL Computer Systems GmbH", + "system_integrator": "BEL Computer Systems GmbH" + }, + { + "application": "Access control and time managemnet", + "company": "Primion Technology GmbH", + "mad": "0x4827", + "service_provider": "BEL Computer Systems GmbH", + "system_integrator": "BEL Computer Systems GmbH" + }, + { + "application": "Access control and time managemnet", + "company": "Primion Technology GmbH", + "mad": "0x4828", + "service_provider": "BEL Computer Systems GmbH", + "system_integrator": "BEL Computer Systems GmbH" + }, + { + "application": "Access control and time managemnet", + "company": "Primion Technology GmbH", + "mad": "0x4829", + "service_provider": "BEL Computer Systems GmbH", + "system_integrator": "BEL Computer Systems GmbH" + }, + { + "application": "Access Control, Time and Attendance, Paid parking, cards and tags", + "company": "Integrated Engineering", + "mad": "0x482A", + "service_provider": "Intesraten Engineering, IE Keyprocessor", + "system_integrator": "IE Keyprocessor" + }, + { + "application": "Access Control", + "company": "Deister Electronic", + "mad": "0x482B", + "service_provider": "Deister Electronic GmbH", + "system_integrator": "Deister Electronic GmbH" + }, + { + "application": "Zutrittskontrolle, Zeiterfassung", + "company": "ZHS Zeitmanagementsysteme GmbH", + "mad": "0x482C", + "service_provider": "", + "system_integrator": "ZHS" + }, + { + "application": "Various", + "company": "BALTECH AG", + "mad": "0x482D", + "service_provider": "PCS GmbH", + "system_integrator": "PCS GmbH, Baltech AG" + }, + { + "application": "Access Control", + "company": "Deister Electronic", + "mad": "0x482E", + "service_provider": "Deister Electronic GmbH", + "system_integrator": "Deister Electronic GmbH" + }, + { + "application": "Access Control & Time Attendence", + "company": "Gelma", + "mad": "0x482F", + "service_provider": "MBB Gelma Industrieelektronik GmbH", + "system_integrator": "MBB Gelma" + }, + { + "application": "Building Management System", + "company": "VFJ Technology Pty Ltd", + "mad": "0x4830", + "service_provider": "VFJ Hong Kong", + "system_integrator": "VFJ Hong Kong" + }, + { + "application": "Combined application for access control, ferry and rail ticketing for the Island of Langegeoog", + "company": "Companion GmbH", + "mad": "0x4831", + "service_provider": "Companion GmbH", + "system_integrator": "Companion GmbH, Krups Consultants GmbH, Gemplus GmbH" + }, + { + "application": "Access control & Security", + "company": "MADA Marx Datentechnik GmbH", + "mad": "0x4832", + "service_provider": "MADA", + "system_integrator": "MADA" + }, + { + "application": "Access Control, time attendance", + "company": "Saubermacher Dienstleistungs GmbH", + "mad": "0x4833", + "service_provider": "AZS Technology AG", + "system_integrator": "AZS Technology AG" + }, + { + "application": "Access control", + "company": "Deister Electronic", + "mad": "0x4834", + "service_provider": "deister electronic GmbH", + "system_integrator": "deister electronic GmbH" + }, + { + "application": "Access control", + "company": "Deister Electronic", + "mad": "0x4835", + "service_provider": "deister electronic GmbH", + "system_integrator": "deister electronic GmbH" + }, + { + "application": "Access control", + "company": "Deister Electronic", + "mad": "0x4836", + "service_provider": "deister electronic GmbH", + "system_integrator": "deister electronic GmbH" + }, + { + "application": "Access control, time & attendance systems", + "company": "Cotag International", + "mad": "0x4837", + "service_provider": "Bewator Cotag Ltd", + "system_integrator": "Bewator Cotag Ltd" + }, + { + "application": "XSkey providing secure access in Rottermdam harbour", + "company": "Secure Logistics", + "mad": "0x4838", + "service_provider": "Secure Logistics", + "system_integrator": "Secure Logistics" + }, + { + "application": "Access control, time attendance, bus ticket, hotel room card, VIP card f. club", + "company": "Giga-TMS Inc", + "mad": "0x4839", + "service_provider": "Giga TMS", + "system_integrator": "Giga TMS" + }, + { + "application": "Access contr, time & attendance, multifunc card", + "company": "Horoquartz Gestion des Temps", + "mad": "0x4840", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "Access controll", + "company": "GRUPO VR", + "mad": "0x4841", + "service_provider": "Grupo VR", + "system_integrator": "" + }, + { + "application": "Access control & security", + "company": "Tyco Integrated Systems B.V.", + "mad": "0x4842", + "service_provider": "Tyco Integrated Systems", + "system_integrator": "Tyco Integrated Systems" + }, + { + "application": "Access controll & security", + "company": "Hi Sec International A/S", + "mad": "0x4843", + "service_provider": "", + "system_integrator": "Hi Sec International A/S" + }, + { + "application": "Access Control, Time & Attendance, E-Purse", + "company": "BALTECH AG", + "mad": "0x4844", + "service_provider": "Baltech", + "system_integrator": "Baltech" + }, + { + "application": "Access Control, Time & Attendance, E-Purse", + "company": "BALTECH AG", + "mad": "0x4845", + "service_provider": "Baltech", + "system_integrator": "Baltech" + }, + { + "application": "Access Control, Time & Attendance, E-Purse", + "company": "BALTECH AG", + "mad": "0x4846", + "service_provider": "Baltech", + "system_integrator": "Baltech" + }, + { + "application": "Access Control, Time & Attendance, E-Purse", + "company": "BALTECH AG", + "mad": "0x4847", + "service_provider": "Baltech", + "system_integrator": "Baltech" + }, + { + "application": "Access Control, Time & Attendance, E-Purse", + "company": "BALTECH AG", + "mad": "0x4848", + "service_provider": "Baltech", + "system_integrator": "Baltech" + }, + { + "application": "Access Control, Time & Attendance, E-Purse", + "company": "BALTECH AG", + "mad": "0x4849", + "service_provider": "Baltech", + "system_integrator": "Baltech" + }, + { + "application": "Access control, payment system", + "company": "Maas Systems B.V.", + "mad": "0x484A", + "service_provider": "Maas Systems B.V.", + "system_integrator": "Maas Systems B.V." + }, + { + "application": "Access control & security", + "company": "BOSCH Telecom GmbH", + "mad": "0x484B", + "service_provider": "Bosch Telecom", + "system_integrator": "Bosch Telecom" + }, + { + "application": "Biometric - access controll & security", + "company": "BOSCH Telecom GmbH", + "mad": "0x484C", + "service_provider": "Bosch Telecom", + "system_integrator": "Bosch Telecom" + }, + { + "application": "Access Control", + "company": "HID Global", + "mad": "0x484D", + "service_provider": "HID Corporation", + "system_integrator": "HID Corporation" + }, + { + "application": "Access Control", + "company": "HID Global", + "mad": "0x484E", + "service_provider": "HID Corporation", + "system_integrator": "HID Corporation" + }, + { + "application": "Access control & security", + "company": "AIE Etudes", + "mad": "0x484F", + "service_provider": "AIE - ID", + "system_integrator": "AIE Etudes" + }, + { + "application": "Access control & security", + "company": "AIE Etudes", + "mad": "0x4850", + "service_provider": "AIE - ID", + "system_integrator": "AIE Etudes" + }, + { + "application": "Access control, company service", + "company": "Automaten Seitz GmbH", + "mad": "0x4851", + "service_provider": "Automaten Seitz", + "system_integrator": "Automaten Seitz" + }, + { + "application": "Access control and securitiy", + "company": "Hitachi Information Technology Co. Ltd.", + "mad": "0x4852", + "service_provider": "Hitachi Information", + "system_integrator": "Hitachi Information" + }, + { + "application": "Access control", + "company": "Petroleos Mexicanos", + "mad": "0x4853", + "service_provider": "Intraproc de Mexico", + "system_integrator": "" + }, + { + "application": "Access controll security payment", + "company": "Matsushita Communication Industrial", + "mad": "0x4854", + "service_provider": "Matsushita Communication", + "system_integrator": "Matsushita Communication" + }, + { + "application": "Storing Resident Info Access Control", + "company": "ITE Smartcard Solutions Limited", + "mad": "0x4855", + "service_provider": "ITE Smartcard", + "system_integrator": "ITE Smartcard" + }, + { + "application": "Storing Resident Info Access Control", + "company": "ITE Smartcard Solutions Limited", + "mad": "0x4856", + "service_provider": "ITE Smartcard", + "system_integrator": "ITE Smartcard" + }, + { + "application": "Access control biometric reader", + "company": "Precise Biometrics AB", + "mad": "0x4857", + "service_provider": "Precise Biometrics AB", + "system_integrator": "Precise Biometrics AB" + }, + { + "application": "Contactless Smartcard Access Controll", + "company": "BQT Solutions Limited", + "mad": "0x4858", + "service_provider": "Banque-Tec", + "system_integrator": "Banque-Tec" + }, + { + "application": "Access control", + "company": "OASys GmbH", + "mad": "0x4859", + "service_provider": "Oasys GmbH", + "system_integrator": "Oasys GmbH" + }, + { + "application": "Access control", + "company": "OASys GmbH", + "mad": "0x486A", + "service_provider": "Oasys GmbH", + "system_integrator": "Oasys GmbH" + }, + { + "application": "Access control & security", + "company": "Third Millennium Systems Ltd", + "mad": "0x486B", + "service_provider": "Third Millenium", + "system_integrator": "Third Millenium" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x486C", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x486D", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x486E", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x486F", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4870", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4871", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4872", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4873", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4874", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4875", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4876", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4877", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4878", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4879", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x487A", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x487B", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x487C", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x487E", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x487F", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4880", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4881", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4882", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4883", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control", + "company": "IoLAN", + "mad": "0x4884", + "service_provider": "Iolan BV", + "system_integrator": "Iolan BV" + }, + { + "application": "Access control & security", + "company": "TechID Engineering bv", + "mad": "0x4885", + "service_provider": "TechID", + "system_integrator": "TechID" + }, + { + "application": "Access control & security", + "company": "N.V. Luchthaven", + "mad": "0x4886", + "service_provider": "N.V. Luchthaven Schiphol", + "system_integrator": "" + }, + { + "application": "Access control & security", + "company": "N.V. Luchthaven", + "mad": "0x4887", + "service_provider": "N.V. Luchthaven Schiphol", + "system_integrator": "" + }, + { + "application": "Access control & security", + "company": "N.V. Luchthaven", + "mad": "0x4888", + "service_provider": "N.V. Luchthaven Schiphol", + "system_integrator": "" + }, + { + "application": "Multi functional badge, private application", + "company": "Microtronic AG", + "mad": "0x4889", + "service_provider": "Microtronic AG", + "system_integrator": "Microtronic AG" + }, + { + "application": "Fingerprint infos compared to user's fingerprint for authentication", + "company": "Biocentric Solutions Inc.", + "mad": "0x489A", + "service_provider": "Biocentric Solutions Inc.", + "system_integrator": "Biocentric Solutions Inc." + }, + { + "application": "Access control application", + "company": "Lenel Systems International", + "mad": "0x489B", + "service_provider": "Lenel Systems International Inc.", + "system_integrator": "Lenel Systems International Inc." + }, + { + "application": "Access control application", + "company": "Lenel Systems International", + "mad": "0x489C", + "service_provider": "Lenel Systems International Inc.", + "system_integrator": "Lenel Systems International Inc." + }, + { + "application": "Access control", + "company": "Interlogix B.V.", + "mad": "0x489D", + "service_provider": "Ge Interlogix", + "system_integrator": "Ge Interlogix" + }, + { + "application": "Biometrial and specific access control data storage", + "company": "Tecisa74", + "mad": "0x489E", + "service_provider": "Tecisa74", + "system_integrator": "Tecisa74" + }, + { + "application": "Biometrial and specific access control data storage", + "company": "Tecisa74", + "mad": "0x489F", + "service_provider": "Tecisa74", + "system_integrator": "Tecisa74" + }, + { + "application": "Biometrial and specific access control data storage", + "company": "Tecisa74", + "mad": "0x48A0", + "service_provider": "Tecisa74", + "system_integrator": "Tecisa74" + }, + { + "application": "Card Holder Data/Card Management Data/Access Control & Security", + "company": "House of Representatives of States General", + "mad": "0x48A1", + "service_provider": "House of Representatives of States General", + "system_integrator": "Paul Sas" + }, + { + "application": "Book and pay system, Access control", + "company": "ADC Systems AB", + "mad": "0x48A2", + "service_provider": "ADC Systems", + "system_integrator": "ADC Systems" + }, + { + "application": "Access contr, time & attendance, multifunc card", + "company": "Horoquartz Gestion des Temps", + "mad": "0x48A3", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "Multiapplication car for industry & trafic, parking, swimming pool", + "company": "ASEC S.A.", + "mad": "0x48A4", + "service_provider": "ASEC S.A", + "system_integrator": "ASEC S.A" + }, + { + "application": "Access control", + "company": "Miditec Datensysteme GmbH", + "mad": "0x48A5", + "service_provider": "Miditec", + "system_integrator": "Miditec" + }, + { + "application": "Acess control", + "company": "Miditec Datensysteme GmbH", + "mad": "0x48A6", + "service_provider": "Miditec", + "system_integrator": "Miditec" + }, + { + "application": "Access control, time & attendence, job control", + "company": "Captor N.V.", + "mad": "0x48A7", + "service_provider": "Captor NV", + "system_integrator": "Captor NV" + }, + { + "application": "Access contr, time & attendance, multifunc card", + "company": "Horoquartz Gestion des Temps", + "mad": "0x48A8", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "Access control & security", + "company": "DATASEC Electronic GmbH", + "mad": "0x48A9", + "service_provider": "Datasec Electronic", + "system_integrator": "Datasec Electronic" + }, + { + "application": "Miscellaneous application, city traffic, access controll & security entertainment, car parking, electronic trade", + "company": "KFAP S.A.", + "mad": "0x48AA", + "service_provider": "KFPA", + "system_integrator": "KFPA" + }, + { + "application": "Access control", + "company": "Electronic Application Laboratory", + "mad": "0x48AB", + "service_provider": "EAL", + "system_integrator": "EAL" + }, + { + "application": "Access control, time management, electronic wallet", + "company": "Universitaire Ziekenhuizen Leuven", + "mad": "0x48AC", + "service_provider": "", + "system_integrator": "GET NV" + }, + { + "application": "Access control, Time and hendance", + "company": "Kaba Benzing GmbH", + "mad": "0x48AD", + "service_provider": "Kaba Benzing", + "system_integrator": "Kaba Benzing" + }, + { + "application": "Attendance-time rading, access control", + "company": "PDTS Gesellschaft für industrielle Datenverarbeitung Ges.mbH", + "mad": "0x48AE", + "service_provider": "PDTS", + "system_integrator": "PDTS" + }, + { + "application": "Access control, Time and attendance", + "company": "Vicking Electronics", + "mad": "0x48AF", + "service_provider": "Vicking Electronics", + "system_integrator": "Vicking Electronics" + }, + { + "application": "", + "company": "Gemplus Nv", + "mad": "0x48B0", + "service_provider": "ING Bank", + "system_integrator": "" + }, + { + "application": "Belgium", + "company": "Gemplus Nv", + "mad": "0x48B1", + "service_provider": "ING Bank", + "system_integrator": "" + }, + { + "application": "Belgium", + "company": "Gemplus Nv", + "mad": "0x48B2", + "service_provider": "ING Bank", + "system_integrator": "" + }, + { + "application": "Access Control", + "company": "IDESCO OY", + "mad": "0x48B3", + "service_provider": "Idesco Oy", + "system_integrator": "Idesco Oy" + }, + { + "application": "Access contr, time & attendance, multifunc card", + "company": "Horoquartz Gestion des Temps", + "mad": "0x48B4", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "Access contr, time & attendance, multifunc card", + "company": "Horoquartz Gestion des Temps", + "mad": "0x48B5", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "Storage of identification data", + "company": "SDS - Security Data Systems", + "mad": "0x48CF", + "service_provider": "SDS", + "system_integrator": "SDS" + }, + { + "application": "Storage of biometric data f. access contr. purposes", + "company": "SDS - Security Data Systems", + "mad": "0x48D0", + "service_provider": "SDS", + "system_integrator": "SDS" + }, + { + "application": "Storage of biometric data f. access contr. purposes", + "company": "SDS - Security Data Systems", + "mad": "0x48D1", + "service_provider": "SDS", + "system_integrator": "SDS" + }, + { + "application": "Storage of biometric data f. access contr. purposes", + "company": "SDS - Security Data Systems", + "mad": "0x48D2", + "service_provider": "SDS", + "system_integrator": "SDS" + }, + { + "application": "Storage of biometric data f. access contr. purposes", + "company": "SDS - Security Data Systems", + "mad": "0x48D3", + "service_provider": "SDS", + "system_integrator": "SDS" + }, + { + "application": "Storage of biometric data f. access contr. purposes", + "company": "SDS - Security Data Systems", + "mad": "0x48D4", + "service_provider": "SDS", + "system_integrator": "SDS" + }, + { + "application": "Storage of biometric data f. access contr. purposes", + "company": "SDS - Security Data Systems", + "mad": "0x48D5", + "service_provider": "SDS", + "system_integrator": "SDS" + }, + { + "application": "Access control & security", + "company": "Hi Sec International A/S", + "mad": "0x48D6", + "service_provider": "HI SEC International", + "system_integrator": "HI SEC International" + }, + { + "application": "Identification for access control", + "company": "Quality Equipment Benelux B.V.", + "mad": "0x48D7", + "service_provider": "Quality Equipment", + "system_integrator": "Quality Equipment" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48D8", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48D9", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48DA", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48DB", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48DC", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48DD", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48DE", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48DF", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48E0", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48E1", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48E2", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48E3", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48E4", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48E5", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Physical access conrtol, biometrics, point of sale", + "company": "Procter and Gamble Company", + "mad": "0x48E6", + "service_provider": "Procter and Gamble Company", + "system_integrator": "Procter and Gamble Company" + }, + { + "application": "Finger Print Application", + "company": "Rexroth the identity company GmbH", + "mad": "0x48E7", + "service_provider": "Rexroth", + "system_integrator": "Rexroth" + }, + { + "application": "Finger Print Application", + "company": "Rexroth the identity company GmbH", + "mad": "0x48E8", + "service_provider": "Rexroth", + "system_integrator": "Rexroth" + }, + { + "application": "Access control and identification", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x48E9", + "service_provider": "PBV Kaufmann", + "system_integrator": "PBV Kaufmann" + }, + { + "application": "Access control and identification", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x48EA", + "service_provider": "PBV Kaufmann", + "system_integrator": "PBV Kaufmann" + }, + { + "application": "Access control and identification", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x48EB", + "service_provider": "PBV Kaufmann", + "system_integrator": "PBV Kaufmann" + }, + { + "application": "Access control and identification", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x48EC", + "service_provider": "PBV Kaufmann", + "system_integrator": "PBV Kaufmann" + }, + { + "application": "Computer, car parking, elec. purse, access control & security", + "company": "DECA Engineering", + "mad": "0x48ED", + "service_provider": "Deca Engineering", + "system_integrator": "Deca Engineering" + }, + { + "application": "Computer, car parking, elec. purse, access control & security", + "company": "DECA Engineering", + "mad": "0x48EE", + "service_provider": "Deca Engineering", + "system_integrator": "Deca Engineering" + }, + { + "application": "Access Control", + "company": "Salto Systems", + "mad": "0x48EF", + "service_provider": "Salto Systems", + "system_integrator": "Salto Systems" + }, + { + "application": "Electronic locks", + "company": "IR Security & Safety GmbH", + "mad": "0x48F0", + "service_provider": "IR Security & Safety", + "system_integrator": "IR Security & Safety" + }, + { + "application": "Access Control & Security", + "company": "CDV International", + "mad": "0x48F1", + "service_provider": "CDV", + "system_integrator": "CDV" + }, + { + "application": "Access Control & Security", + "company": "CDV International", + "mad": "0x48F2", + "service_provider": "CDV", + "system_integrator": "CDV" + }, + { + "application": "Access Control & Security", + "company": "CDV International", + "mad": "0x48F3", + "service_provider": "CDV", + "system_integrator": "CDV" + }, + { + "application": "Access Control & Security", + "company": "CDV International", + "mad": "0x48F4", + "service_provider": "CDV", + "system_integrator": "CDV" + }, + { + "application": "Access Control & Security", + "company": "CDV International", + "mad": "0x48F5", + "service_provider": "CDV", + "system_integrator": "CDV" + }, + { + "application": "Access Control & Security", + "company": "CDV International", + "mad": "0x48F6", + "service_provider": "CDV", + "system_integrator": "CDV" + }, + { + "application": "Access Control & Security", + "company": "CDV International", + "mad": "0x48F7", + "service_provider": "CDV", + "system_integrator": "CDV" + }, + { + "application": "Access Control & Security", + "company": "CDV International", + "mad": "0x48F8", + "service_provider": "CDV", + "system_integrator": "CDV" + }, + { + "application": "Access Control & Security", + "company": "CDV International", + "mad": "0x48F9", + "service_provider": "CDV", + "system_integrator": "CDV" + }, + { + "application": "Access Control & Security", + "company": "CDV International", + "mad": "0x48FA", + "service_provider": "CDV", + "system_integrator": "CDV" + }, + { + "application": "Access control, card contains, biometric data", + "company": "Spica International", + "mad": "0x48FB", + "service_provider": "Spica", + "system_integrator": "Spica" + }, + { + "application": "Access control & scecurity", + "company": "Adasoft AG", + "mad": "0x48FC", + "service_provider": "Adasoft AG", + "system_integrator": "Adasoft AG" + }, + { + "application": "Access control & scecurity", + "company": "Adasoft AG", + "mad": "0x48FD", + "service_provider": "Adasoft AG", + "system_integrator": "Adasoft AG" + }, + { + "application": "Access control & scecurity", + "company": "Adasoft AG", + "mad": "0x48FE", + "service_provider": "Adasoft AG", + "system_integrator": "Adasoft AG" + }, + { + "application": "Access control & scecurity", + "company": "Adasoft AG", + "mad": "0x48FF", + "service_provider": "Adasoft AG", + "system_integrator": "Adasoft AG" + }, + { + "application": "VIGIK", + "company": "Immotec Systemes", + "mad": "0x4902", + "service_provider": "Immotec", + "system_integrator": "Immotec" + }, + { + "application": "VIGIK", + "company": "Immotec Systemes", + "mad": "0x4903", + "service_provider": "Immotec", + "system_integrator": "Immotec" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x4904", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x4905", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x4906", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x4907", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x4908", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x4909", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x490A", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x490B", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x490C", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x490D", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x490E", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x490F", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x4910", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x4911", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x4912", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "(access control and security) VIGIK", + "company": "CDV International", + "mad": "0x4913", + "service_provider": "CDVI", + "system_integrator": "CDVI" + }, + { + "application": "Card Administratin, cardholder adminstration, access control & security, company services, miscellaneous applications", + "company": "Ministry of Defense", + "mad": "0x4A01", + "service_provider": "Ministry of Defence", + "system_integrator": "" + }, + { + "application": "Card Administratin, cardholder adminstration, access control & security, company services, miscellaneous applications", + "company": "Ministry of Defense", + "mad": "0x4A02", + "service_provider": "Ministry of Defence", + "system_integrator": "" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C01", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C02", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C03", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C04", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C05", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C06", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C07", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C08", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C09", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C0A", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C0B", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C0C", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C0D", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C0E", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C0F", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C10", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C11", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C12", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C13", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C14", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C15", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C16", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C17", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C18", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C19", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C1A", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C1B", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C1C", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C1D", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C1E", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C1F", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C20", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C21", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C22", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C23", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C24", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C25", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C26", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C27", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Physical Access Control Systems (PACS) of the major European Union Institues", + "company": "European Commission", + "mad": "0x4C28", + "service_provider": "Various", + "system_integrator": "Various" + }, + { + "application": "Ski ticketing", + "company": "ADI Ltd.", + "mad": "0x5001", + "service_provider": "BO RROC Sigulda", + "system_integrator": "ADI Ltd." + }, + { + "application": "Ski ticketing, member card, ski association, discounts", + "company": "Cetrta Pot d.o.o.", + "mad": "0x5002", + "service_provider": "Slovenian Ski Association", + "system_integrator": "Cetrta Pot" + }, + { + "application": "Ski ticketing system based on electronic purse", + "company": "ADI Ltd.", + "mad": "0x5003", + "service_provider": "Ramkalni Ltd", + "system_integrator": "ADI Ltd" + }, + { + "application": "Ski ticketing", + "company": "ADI Ltd.", + "mad": "0x5004", + "service_provider": "K-Kalins Ltd.", + "system_integrator": "ADI Ltd" + }, + { + "application": "Entertainment and Sports, Stadiums, Parking, Ski Ticketing", + "company": "Axess AG", + "mad": "0x5005", + "service_provider": "Axess", + "system_integrator": "Axess" + }, + { + "application": "Access control & security, city traffic, sports & entertainment", + "company": "IP Core", + "mad": "0x5006", + "service_provider": "IP Core", + "system_integrator": "IP Core" + }, + { + "application": "Ski ticketing", + "company": "ADI Ltd", + "mad": "0x5007", + "service_provider": "FROKS Ltd", + "system_integrator": "ADI" + }, + { + "application": "Ski ticketing", + "company": "ADI Ltd", + "mad": "0x5008", + "service_provider": "Kalnzaki", + "system_integrator": "ADI" + }, + { + "application": "Local Ski Ticketing Sysem based on electronic purse", + "company": "ADI Ltd", + "mad": "0x5009", + "service_provider": "Mezezers Ltd.", + "system_integrator": "ADI Ltd." + }, + { + "application": "Access Control", + "company": "NEDAP NV", + "mad": "0x5101", + "service_provider": "Nedap Ideas", + "system_integrator": "Nedap Ideas" + }, + { + "application": "Access Control & Security", + "company": "NOVO GmbH", + "mad": "0x5102", + "service_provider": "1. FC Köln GmbH&Co KG", + "system_integrator": "" + }, + { + "application": "Access control and security", + "company": "GPS Tecnologia Ltda.", + "mad": "0x5103", + "service_provider": "GPS Tec", + "system_integrator": "GPS Tec" + }, + { + "application": "Access control and security", + "company": "GPS Tecnologia Ltda.", + "mad": "0x5104", + "service_provider": "GPS Tec", + "system_integrator": "GPS Tec" + }, + { + "application": "Access control", + "company": "Custom Micro Products Ltd.", + "mad": "0x5105", + "service_provider": "Custom Micro Products", + "system_integrator": "Custom Micro Products" + }, + { + "application": "Biometric Access Control", + "company": "CYNAPS", + "mad": "0x5106", + "service_provider": "Cynaps", + "system_integrator": "Cynaps" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x5107", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x5108", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x5109", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x510A", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x510B", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x510C", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x510D", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x510E", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x510F", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x5110", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x5111", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x5112", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x5113", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x5114", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x5115", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x5116", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x5117", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x5118", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x5119", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x511A", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x511B", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x511C", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x511D", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x511E", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control and security", + "company": "Alfapass", + "mad": "0x511F", + "service_provider": "Alfapass", + "system_integrator": "Alfapass" + }, + { + "application": "Access control", + "company": "Tyco Software House", + "mad": "0x5120", + "service_provider": "Tyco Software House", + "system_integrator": "Tyco Software House" + }, + { + "application": "Access control", + "company": "Connex Solutions Limited", + "mad": "0x5121", + "service_provider": "Connex", + "system_integrator": "Connex" + }, + { + "application": "Acess Control, Time and Attendance", + "company": "Milenio 3 Systemas Electonicos", + "mad": "0x5122", + "service_provider": "Milenio3", + "system_integrator": "Milenio3" + }, + { + "application": "Access control & security", + "company": "CORESTREET", + "mad": "0x5123", + "service_provider": "Corestreet", + "system_integrator": "Corestreet" + }, + { + "application": "Access control & security", + "company": "Honeywell", + "mad": "0x5124", + "service_provider": "Honeywell", + "system_integrator": "Honeywell" + }, + { + "application": "Access control & security", + "company": "Honeywell", + "mad": "0x5125", + "service_provider": "Honeywell", + "system_integrator": "Honeywell" + }, + { + "application": "Access control & security", + "company": "Honeywell", + "mad": "0x5126", + "service_provider": "Honeywell", + "system_integrator": "Honeywell" + }, + { + "application": "Access control & security", + "company": "Honeywell", + "mad": "0x5127", + "service_provider": "Honeywell", + "system_integrator": "Honeywell" + }, + { + "application": "Access control & security", + "company": "Honeywell", + "mad": "0x5128", + "service_provider": "Honeywell", + "system_integrator": "Honeywell" + }, + { + "application": "Access control & security", + "company": "Honeywell", + "mad": "0x5129", + "service_provider": "Honeywell", + "system_integrator": "Honeywell" + }, + { + "application": "Access control & security", + "company": "Honeywell", + "mad": "0x512A", + "service_provider": "Honeywell", + "system_integrator": "Honeywell" + }, + { + "application": "Access control & security", + "company": "Honeywell", + "mad": "0x512B", + "service_provider": "Honeywell", + "system_integrator": "Honeywell" + }, + { + "application": "Biometrics strong authentication", + "company": "LabCal", + "mad": "0x512C", + "service_provider": "Labcal", + "system_integrator": "Labcal" + }, + { + "application": "Access control & security", + "company": "GOB Software&System GmbH Co. KG", + "mad": "0x512D", + "service_provider": "GOB", + "system_integrator": "GOB" + }, + { + "application": "Access control & security", + "company": "Suprema Inc", + "mad": "0x512E", + "service_provider": "Suprema", + "system_integrator": "Suprema" + }, + { + "application": "Access control & security", + "company": "Suprema Inc", + "mad": "0x512F", + "service_provider": "Suprema", + "system_integrator": "Suprema" + }, + { + "application": "Access control & security", + "company": "Suprema Inc", + "mad": "0x5130", + "service_provider": "Suprema", + "system_integrator": "Suprema" + }, + { + "application": "Access control & security", + "company": "Suprema Inc", + "mad": "0x5131", + "service_provider": "Suprema", + "system_integrator": "Suprema" + }, + { + "application": "Access control & security", + "company": "Suprema Inc", + "mad": "0x5132", + "service_provider": "Suprema", + "system_integrator": "Suprema" + }, + { + "application": "Access control & security", + "company": "Suprema Inc", + "mad": "0x5133", + "service_provider": "Suprema", + "system_integrator": "Suprema" + }, + { + "application": "Access control & security", + "company": "Suprema Inc", + "mad": "0x5134", + "service_provider": "Suprema", + "system_integrator": "Suprema" + }, + { + "application": "Access control & security", + "company": "Suprema Inc", + "mad": "0x5135", + "service_provider": "Suprema", + "system_integrator": "Suprema" + }, + { + "application": "Compelete system for lockers, access control & electr. payment", + "company": "Ojmar S. A.", + "mad": "0x5136", + "service_provider": "", + "system_integrator": "Enkoa System S.L." + }, + { + "application": "Access control", + "company": "Honeywell Building Solutions", + "mad": "0x5137", + "service_provider": "Honeywell", + "system_integrator": "Honeywell" + }, + { + "application": "Electronic purse, access control for buliding automation", + "company": "CDE Communication Data Engineering GmbH", + "mad": "0x5138", + "service_provider": "CDE", + "system_integrator": "CDE" + }, + { + "application": "Electronic purse, access control for buliding automation", + "company": "CDE Communication Data Engineering GmbH", + "mad": "0x5139", + "service_provider": "CDE", + "system_integrator": "CDE" + }, + { + "application": "Company services, access & sec control, electronic purse...", + "company": "Cominfo a.s.", + "mad": "0x513A", + "service_provider": "Cominfo", + "system_integrator": "Cominfo" + }, + { + "application": "Access control, card management", + "company": "ID-WARE", + "mad": "0x513B", + "service_provider": "ID-WARE b.v.", + "system_integrator": "" + }, + { + "application": "Access control, card management", + "company": "ID-WARE", + "mad": "0x513C", + "service_provider": "ID-WARE b.v.", + "system_integrator": "" + }, + { + "application": "Access control & security, city traffic, sports & entertainment", + "company": "IP Core", + "mad": "0x513D", + "service_provider": "IP Core", + "system_integrator": "IP Core" + }, + { + "application": "Access control, computer application, company services", + "company": "Volvo Car Corporation", + "mad": "0x513E", + "service_provider": "Volvo Car", + "system_integrator": "Volvo Car" + }, + { + "application": "Access contr, time and attendance", + "company": "Nisus nv", + "mad": "0x513F", + "service_provider": "Nisus NV", + "system_integrator": "NIsus NV" + }, + { + "application": "Time & attendance", + "company": "Flora Holland", + "mad": "0x5140", + "service_provider": "Interflex Datasystems", + "system_integrator": "Interflex Datasystems" + }, + { + "application": "Elec ticketing, access control, electronic purse", + "company": "Empresa 1 Sistemas de Automacao e Comercio", + "mad": "0x5141", + "service_provider": "Empresa 1", + "system_integrator": "Empresa 1" + }, + { + "application": "Biometric Terminal", + "company": "Recognition Systems LLC", + "mad": "0x5142", + "service_provider": "Recognition Systems", + "system_integrator": "" + }, + { + "application": "Access control & security", + "company": "Evotech B.V.", + "mad": "0x5143", + "service_provider": "Evotech B.V., GTI NV", + "system_integrator": "Evotech B.V." + }, + { + "application": "Time attendnace, fuel, access control", + "company": "Emcard a.s.", + "mad": "0x5144", + "service_provider": "Emtest", + "system_integrator": "Emtest" + }, + { + "application": "Access control and security", + "company": "Scotcomms Technology Group Ltd.", + "mad": "0x5145", + "service_provider": "Various", + "system_integrator": "Scotcomms Technology Group Ltd." + }, + { + "application": "Debit Card, Door Acces Control, Computer Identification", + "company": "Netcard", + "mad": "0x5146", + "service_provider": "Netcard", + "system_integrator": "Netcard" + }, + { + "application": "MES Manufactoring Execution System", + "company": "gbo datacomp GmbH", + "mad": "0x5148", + "service_provider": "Gbo datacomp GmbH", + "system_integrator": "gbo datacomp GmbH" + }, + { + "application": "MES Manufactoring Execution System", + "company": "gbo datacomp GmbH", + "mad": "0x5149", + "service_provider": "Gbo datacomp GmbH", + "system_integrator": "gbo datacomp GmbH" + }, + { + "application": "Access control & security", + "company": "Farpointe Data Inc", + "mad": "0x514A", + "service_provider": "Farpointe", + "system_integrator": "" + }, + { + "application": "Fingerprint Recognition Application", + "company": "ESCO Biometric BVBA", + "mad": "0x514B", + "service_provider": "ESCO Biometric", + "system_integrator": "ESCO Biometric" + }, + { + "application": "Access Control", + "company": "Interflex Datensysteme GmbH", + "mad": "0x514C", + "service_provider": "", + "system_integrator": "Interflex Datensysteme GmbH & CoKG" + }, + { + "application": "Access Control", + "company": "Interflex Datensysteme GmbH", + "mad": "0x514D", + "service_provider": "", + "system_integrator": "Interflex Datensysteme GmbH & CoKG" + }, + { + "application": "Access Control", + "company": "Interflex Datensysteme GmbH", + "mad": "0x514E", + "service_provider": "", + "system_integrator": "Interflex Datensysteme GmbH & CoKG" + }, + { + "application": "Access Control", + "company": "Interflex Datensysteme GmbH", + "mad": "0x514F", + "service_provider": "", + "system_integrator": "Interflex Datensysteme GmbH & CoKG" + }, + { + "application": "Fidelity Card", + "company": "Sogedex", + "mad": "0x5150", + "service_provider": "Sogedex", + "system_integrator": "Sogedex" + }, + { + "application": "Fidelity Card", + "company": "Sogedex", + "mad": "0x5151", + "service_provider": "Sogedex", + "system_integrator": "Sogedex" + }, + { + "application": "Identification and authentification system", + "company": "Sogedex", + "mad": "0x5152", + "service_provider": "Sogedex", + "system_integrator": "Sogedex" + }, + { + "application": "Identification and authentification system", + "company": "Sogedex", + "mad": "0x5153", + "service_provider": "Sogedex", + "system_integrator": "Sogedex" + }, + { + "application": "Access Control, Time Attendance, Job Costing, Ticketing", + "company": "Hectrix Limited", + "mad": "0x5154", + "service_provider": "Hectrix Ltd.", + "system_integrator": "Hectrix. Ltd." + }, + { + "application": "Access Control, Time Attendance, Job Costing, Ticketing", + "company": "Hectrix Limited", + "mad": "0x5155", + "service_provider": "Hectrix Ltd.", + "system_integrator": "Hectrix. Ltd." + }, + { + "application": "Access control & security", + "company": "Roger Dariusz Wensker", + "mad": "0x5156", + "service_provider": "Roger", + "system_integrator": "Roger" + }, + { + "application": "Access control & security", + "company": "Roger Dariusz Wensker", + "mad": "0x5157", + "service_provider": "Roger", + "system_integrator": "Roger" + }, + { + "application": "Access control & security", + "company": "Roger Dariusz Wensker", + "mad": "0x5158", + "service_provider": "Roger", + "system_integrator": "Roger" + }, + { + "application": "Access control & security", + "company": "Roger Dariusz Wensker", + "mad": "0x5159", + "service_provider": "Roger", + "system_integrator": "Roger" + }, + { + "application": "Access & parking control, electronic purse", + "company": "General Meters Corp", + "mad": "0x515A", + "service_provider": "General Meters", + "system_integrator": "General Meters" + }, + { + "application": "Car parking, sport applic, hotel, access control systems", + "company": "DATASEC Electronic GmbH", + "mad": "0x515B", + "service_provider": "Datasec", + "system_integrator": "Datatsec" + }, + { + "application": "Car parking, sport applic, hotel, access control systems", + "company": "DATASEC Electronic GmbH", + "mad": "0x515C", + "service_provider": "Datasec", + "system_integrator": "Datatsec" + }, + { + "application": "Access & Inventory conrtol", + "company": "Shockfish SA", + "mad": "0x515D", + "service_provider": "Shockfish", + "system_integrator": "Shockfish" + }, + { + "application": "Access & Inventory conrtol", + "company": "Shockfish SA", + "mad": "0x515E", + "service_provider": "Shockfish", + "system_integrator": "Shockfish" + }, + { + "application": "Access & Inventory conrtol", + "company": "Shockfish SA", + "mad": "0x515F", + "service_provider": "Shockfish", + "system_integrator": "Shockfish" + }, + { + "application": "Access & Inventory conrtol", + "company": "Shockfish SA", + "mad": "0x5160", + "service_provider": "Shockfish", + "system_integrator": "Shockfish" + }, + { + "application": "Access control", + "company": "EAL Apeldoorn B.V.", + "mad": "0x5161", + "service_provider": "EAL", + "system_integrator": "EAL" + }, + { + "application": "Access Control, E-purse", + "company": "Gemalto", + "mad": "0x5162", + "service_provider": "Gemplus", + "system_integrator": "Gemplus" + }, + { + "application": "Access Control, E-purse", + "company": "Gemalto", + "mad": "0x5163", + "service_provider": "Gemplus", + "system_integrator": "Gemplus" + }, + { + "application": "Ausweiskarte", + "company": "Allgemeine Unfallversicherungsanstalt (AUVA)", + "mad": "0x5164", + "service_provider": "AUVA", + "system_integrator": "AUVA" + }, + { + "application": "Ausweiskarte", + "company": "Allgemeine Unfallversicherungsanstalt (AUVA)", + "mad": "0x5165", + "service_provider": "AUVA", + "system_integrator": "AUVA" + }, + { + "application": "Ausweiskarte", + "company": "Allgemeine Unfallversicherungsanstalt (AUVA)", + "mad": "0x5166", + "service_provider": "AUVA", + "system_integrator": "AUVA" + }, + { + "application": "Access Control & Security", + "company": "Nsecure B.V.", + "mad": "0x5167", + "service_provider": "Nsecure", + "system_integrator": "Nsecure" + }, + { + "application": "Fingerprint application, access control & security", + "company": "Shenzhen Ideal Microelectronics Co. Ltd.", + "mad": "0x5168", + "service_provider": "Shenzhen Ideal Microelectronics Co. Ltd.", + "system_integrator": "Shenzhen Ideal Microelectronics Co. Ltd." + }, + { + "application": "Fingerprint application, access control & security", + "company": "Shenzhen Ideal Microelectronics Co. Ltd.", + "mad": "0x5169", + "service_provider": "Shenzhen Ideal Microelectronics Co. Ltd.", + "system_integrator": "Shenzhen Ideal Microelectronics Co. Ltd." + }, + { + "application": "Fingerprint application, access control & security", + "company": "Shenzhen Ideal Microelectronics Co. Ltd.", + "mad": "0x516A", + "service_provider": "Shenzhen Ideal Microelectronics Co. Ltd.", + "system_integrator": "Shenzhen Ideal Microelectronics Co. Ltd." + }, + { + "application": "Fingerprint application, access control & security", + "company": "Shenzhen Ideal Microelectronics Co. Ltd.", + "mad": "0x516B", + "service_provider": "Shenzhen Ideal Microelectronics Co. Ltd.", + "system_integrator": "Shenzhen Ideal Microelectronics Co. Ltd." + }, + { + "application": "Access Control Reader", + "company": "Access Control Technology", + "mad": "0x516C", + "service_provider": "ACT", + "system_integrator": "ACT" + }, + { + "application": "Access control", + "company": "Cogelec", + "mad": "0x516D", + "service_provider": "Cogelec", + "system_integrator": "Cogelec" + }, + { + "application": "Access control", + "company": "Cogelec", + "mad": "0x516E", + "service_provider": "Cogelec", + "system_integrator": "Cogelec" + }, + { + "application": "Access control", + "company": "Cogelec", + "mad": "0x516F", + "service_provider": "Cogelec", + "system_integrator": "Cogelec" + }, + { + "application": "Access control", + "company": "Cogelec", + "mad": "0x5170", + "service_provider": "Cogelec", + "system_integrator": "Cogelec" + }, + { + "application": "Access control", + "company": "Cogelec", + "mad": "0x5171", + "service_provider": "Cogelec", + "system_integrator": "Cogelec" + }, + { + "application": "Access control", + "company": "Cogelec", + "mad": "0x5172", + "service_provider": "Cogelec", + "system_integrator": "Cogelec" + }, + { + "application": "Access control", + "company": "Cogelec", + "mad": "0x5173", + "service_provider": "Cogelec", + "system_integrator": "Cogelec" + }, + { + "application": "Access control", + "company": "Cogelec", + "mad": "0x5174", + "service_provider": "Cogelec", + "system_integrator": "Cogelec" + }, + { + "application": "Access control", + "company": "Cogelec", + "mad": "0x5175", + "service_provider": "Cogelec", + "system_integrator": "Cogelec" + }, + { + "application": "Access control", + "company": "Cogelec", + "mad": "0x5176", + "service_provider": "Cogelec", + "system_integrator": "Cogelec" + }, + { + "application": "Uhlmann & Zacher Clex prime, online and offline electronic locking and access control systems", + "company": "Uhlmann & Zacher GmbH", + "mad": "0x5177", + "service_provider": "Uhlmann & Zacher GmbH", + "system_integrator": "" + }, + { + "application": "Hotel, acces control & security", + "company": "Talleres De Escoriaza S.A.", + "mad": "0x5178", + "service_provider": "Talleres", + "system_integrator": "Talleres" + }, + { + "application": "Energy Saving System For Hotels, Access Control", + "company": "ENKOA System", + "mad": "0x5179", + "service_provider": "Enkoa System S.L.", + "system_integrator": "Enkoa System S.L." + }, + { + "application": "Access conrol function & security", + "company": "Tyco Fire & Security", + "mad": "0x517A", + "service_provider": "Tyco", + "system_integrator": "Tyco" + }, + { + "application": "Logical & Physical access control", + "company": "Pin Cash International B.V.", + "mad": "0x517B", + "service_provider": "PinCash", + "system_integrator": "PinCash" + }, + { + "application": "VIGIK", + "company": "Immotec Systemes", + "mad": "0x517C", + "service_provider": "Immotec", + "system_integrator": "Immotec" + }, + { + "application": "VIGIK", + "company": "Immotec Systemes", + "mad": "0x517D", + "service_provider": "Immotec", + "system_integrator": "Immotec" + }, + { + "application": "VIGIK", + "company": "Immotec Systemes", + "mad": "0x517E", + "service_provider": "Immotec", + "system_integrator": "Immotec" + }, + { + "application": "MIFARE Booster config", + "company": "NEDAP NV", + "mad": "0x517F", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "MIFARE Booster config", + "company": "NEDAP NV", + "mad": "0x5180", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Access control for centrally managed waste treatment", + "company": "Alphatronics", + "mad": "0x5181", + "service_provider": "Alphatronics", + "system_integrator": "Alphatronics" + }, + { + "application": "Access control and identification", + "company": "CEM Systems", + "mad": "0x5182", + "service_provider": "CEM Systems Ltd", + "system_integrator": "CEM Systems Ltd" + }, + { + "application": "Access control and identification", + "company": "CEM Systems", + "mad": "0x5183", + "service_provider": "CEM Systems Ltd", + "system_integrator": "CEM Systems Ltd" + }, + { + "application": "Access control and identification", + "company": "CEM Systems", + "mad": "0x5184", + "service_provider": "CEM Systems Ltd", + "system_integrator": "CEM Systems Ltd" + }, + { + "application": "Hotel, access contr. & sec", + "company": "Vingcard a.s.", + "mad": "0x5185", + "service_provider": "Vingcard", + "system_integrator": "Vingcard" + }, + { + "application": "Hotel, access contr. & sec", + "company": "Vingcard a.s.", + "mad": "0x5186", + "service_provider": "Vingcard", + "system_integrator": "Vingcard" + }, + { + "application": "Zeiterfassung, Werks- bzw. Gebäudezutritt", + "company": "Voestalpine Informationstechnologie GmbH", + "mad": "0x5187", + "service_provider": "Voestalpine Informationstechnologie GmbH", + "system_integrator": "Voestalpine Informationstechnologie GmbH" + }, + { + "application": "Admiral Ausweiskarte (ID-Card)", + "company": "PDTS Gesellschaft für industrielle Datenverarbeitung Ges.mbH", + "mad": "0x5188", + "service_provider": "Admiral Sportwetten GmbH", + "system_integrator": "" + }, + { + "application": "Personal ID and Reporting of Attendance", + "company": "The Swedish Construction Federation", + "mad": "0x5189", + "service_provider": "Sveriges Byggindustrier", + "system_integrator": "" + }, + { + "application": "Personal ID and Reporting of Attendance", + "company": "The Swedish Construction Federation", + "mad": "0x518A", + "service_provider": "Sveriges Byggindustrier", + "system_integrator": "" + }, + { + "application": "Personal ID and Reporting of Attendance", + "company": "The Swedish Construction Federation", + "mad": "0x518B", + "service_provider": "Sveriges Byggindustrier", + "system_integrator": "" + }, + { + "application": "Personal ID and Reporting of Attendance", + "company": "The Swedish Construction Federation", + "mad": "0x518C", + "service_provider": "Sveriges Byggindustrier", + "system_integrator": "" + }, + { + "application": "Personal identification & reporting of attendance", + "company": "The Swedish Construction Federation", + "mad": "0x518D", + "service_provider": "Swedish Construction Fed", + "system_integrator": "" + }, + { + "application": "Personal identification & reporting of attendance", + "company": "The Swedish Construction Federation", + "mad": "0x518E", + "service_provider": "Swedish Construction Fed", + "system_integrator": "" + }, + { + "application": "Security", + "company": "Telenot Electronic GmbH", + "mad": "0x518F", + "service_provider": "Telenot Electronic GmbH", + "system_integrator": "" + }, + { + "application": "Access Control & Security", + "company": "Kaba-Ilco, Inc.", + "mad": "0x5190", + "service_provider": "Kaba Ilco", + "system_integrator": "Kaba Ilco" + }, + { + "application": "Access Control & Security", + "company": "Blue Systems International", + "mad": "0x5191", + "service_provider": "Blue Products.com", + "system_integrator": "Blue Systems International" + }, + { + "application": "Access Control & Security", + "company": "XceedID Corporation", + "mad": "0x5192", + "service_provider": "Xceed ID Corporation", + "system_integrator": "Xceed ID Corporation" + }, + { + "application": "Access Control & Security", + "company": "XceedID Corporation", + "mad": "0x5193", + "service_provider": "Xceed ID Corporation", + "system_integrator": "Xceed ID Corporation" + }, + { + "application": "Arcelor", + "company": "EM Group", + "mad": "0x5194", + "service_provider": "EMGROUP", + "system_integrator": "EMGROUP" + }, + { + "application": "Identification and authentification system", + "company": "Sogedex", + "mad": "0x5195", + "service_provider": "SOGEDEX", + "system_integrator": "SOGEDEX" + }, + { + "application": "Identification and authentification system", + "company": "Sogedex", + "mad": "0x5196", + "service_provider": "SOGEDEX", + "system_integrator": "SOGEDEX" + }, + { + "application": "Identification and authentification system", + "company": "Sogedex", + "mad": "0x5197", + "service_provider": "SOGEDEX", + "system_integrator": "SOGEDEX" + }, + { + "application": "Identification and authentification system", + "company": "Sogedex", + "mad": "0x5198", + "service_provider": "SOGEDEX", + "system_integrator": "SOGEDEX" + }, + { + "application": "Identification and authentification system", + "company": "Sogedex", + "mad": "0x5199", + "service_provider": "SOGEDEX", + "system_integrator": "SOGEDEX" + }, + { + "application": "Identification and authentification system", + "company": "Sogedex", + "mad": "0x519A", + "service_provider": "SOGEDEX", + "system_integrator": "SOGEDEX" + }, + { + "application": "Identification and authentification system", + "company": "Sogedex", + "mad": "0x519B", + "service_provider": "SOGEDEX", + "system_integrator": "SOGEDEX" + }, + { + "application": "Identification and authentification system", + "company": "Sogedex", + "mad": "0x519C", + "service_provider": "SOGEDEX", + "system_integrator": "SOGEDEX" + }, + { + "application": "Identification and authentification system", + "company": "Sogedex", + "mad": "0x519D", + "service_provider": "SOGEDEX", + "system_integrator": "SOGEDEX" + }, + { + "application": "Identification and authentification system", + "company": "Sogedex", + "mad": "0x519E", + "service_provider": "SOGEDEX", + "system_integrator": "SOGEDEX" + }, + { + "application": "Electronic ticketing system", + "company": "CDE Communication Data Engineering GmbH", + "mad": "0x519F", + "service_provider": "CDE-Competence Center for embedded solutions", + "system_integrator": "CDE - Competence Center for embedded solutions" + }, + { + "application": "Electronic ticketing system", + "company": "CDE Communication Data Engineering GmbH", + "mad": "0x51A0", + "service_provider": "CDE-Competence Center for embedded solutions", + "system_integrator": "CDE - Competence Center for embedded solutions" + }, + { + "application": "Access control & security", + "company": "Shenzhen Ideal Microelectronics Co. Ltd.", + "mad": "0x51A1", + "service_provider": "Shenzen IDEAL Microelectronics Co., Ltd.", + "system_integrator": "Shenzen IDEAL Microelectronics Co., Ltd." + }, + { + "application": "Access control & security", + "company": "Shenzhen Ideal Microelectronics Co. Ltd.", + "mad": "0x51A2", + "service_provider": "Shenzen IDEAL Microelectronics Co., Ltd.", + "system_integrator": "Shenzen IDEAL Microelectronics Co., Ltd." + }, + { + "application": "Access control & security", + "company": "Shenzhen Ideal Microelectronics Co. Ltd.", + "mad": "0x51A3", + "service_provider": "Shenzen IDEAL Microelectronics Co., Ltd.", + "system_integrator": "Shenzen IDEAL Microelectronics Co., Ltd." + }, + { + "application": "Access control & security", + "company": "Shenzhen Ideal Microelectronics Co. Ltd.", + "mad": "0x51A4", + "service_provider": "Shenzen IDEAL Microelectronics Co., Ltd.", + "system_integrator": "Shenzen IDEAL Microelectronics Co., Ltd." + }, + { + "application": "Access control & security", + "company": "Shenzhen Ideal Microelectronics Co. Ltd.", + "mad": "0x51A5", + "service_provider": "Shenzen IDEAL Microelectronics Co., Ltd.", + "system_integrator": "Shenzen IDEAL Microelectronics Co., Ltd." + }, + { + "application": "Access control & security", + "company": "Shenzhen Ideal Microelectronics Co. Ltd.", + "mad": "0x51A6", + "service_provider": "Shenzen IDEAL Microelectronics Co., Ltd.", + "system_integrator": "Shenzen IDEAL Microelectronics Co., Ltd." + }, + { + "application": "Access control & security", + "company": "Shenzhen Ideal Microelectronics Co. Ltd.", + "mad": "0x51A7", + "service_provider": "Shenzen IDEAL Microelectronics Co., Ltd.", + "system_integrator": "Shenzen IDEAL Microelectronics Co., Ltd." + }, + { + "application": "Access control & security", + "company": "Shenzhen Ideal Microelectronics Co. Ltd.", + "mad": "0x51A8", + "service_provider": "Shenzen IDEAL Microelectronics Co., Ltd.", + "system_integrator": "Shenzen IDEAL Microelectronics Co., Ltd." + }, + { + "application": "TIME AND ATTENDANCE, ACCESS CONTROL", + "company": "Pyrescom", + "mad": "0x51A9", + "service_provider": "PYRESCOM", + "system_integrator": "PYRESCOM" + }, + { + "application": "Attendance registration and access control", + "company": "Simac QUADCORE", + "mad": "0x51AA", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Access services (to all buildings of Belgian regional and federal political assembles) and Time and Attendances Services", + "company": "Vlaams Parlement", + "mad": "0x51AB", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Physical Access Control", + "company": "General Motors", + "mad": "0x51AC", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Access Control", + "company": "BEKA Elektronik", + "mad": "0x51AD", + "service_provider": "BEKA Electronik", + "system_integrator": "BEKA Electronik" + }, + { + "application": "Access Control & Security for Ericsson world wide", + "company": "Coor Service Management AB", + "mad": "0x51AE", + "service_provider": "Telefonaktiebolaget LM Ericsson", + "system_integrator": "Coor Service Management AB, PAS, Card and Know IT" + }, + { + "application": "Access Control & Security for Ericsson world wide", + "company": "Coor Service Management AB", + "mad": "0x51AF", + "service_provider": "Telefonaktiebolaget LM Ericsson", + "system_integrator": "Coor Service Management AB, PAS, Card and Know IT" + }, + { + "application": "Access Control & Security for Ericsson world wide", + "company": "Coor Service Management AB", + "mad": "0x51B0", + "service_provider": "Telefonaktiebolaget LM Ericsson", + "system_integrator": "Coor Service Management AB, PAS, Card and Know IT" + }, + { + "application": "Access Control & Security for Ericsson world wide", + "company": "Coor Service Management AB", + "mad": "0x51B1", + "service_provider": "Telefonaktiebolaget LM Ericsson", + "system_integrator": "Coor Service Management AB, PAS, Card and Know IT" + }, + { + "application": "Access Control & Security for Ericsson world wide", + "company": "Coor Service Management AB", + "mad": "0x51B2", + "service_provider": "Telefonaktiebolaget LM Ericsson", + "system_integrator": "Coor Service Management AB, PAS, Card and Know IT" + }, + { + "application": "Access Control & Security for Ericsson world wide", + "company": "Coor Service Management AB", + "mad": "0x51B3", + "service_provider": "Telefonaktiebolaget LM Ericsson", + "system_integrator": "Coor Service Management AB, PAS, Card and Know IT" + }, + { + "application": "Access Control & Security for Ericsson world wide", + "company": "Coor Service Management AB", + "mad": "0x51B4", + "service_provider": "Telefonaktiebolaget LM Ericsson", + "system_integrator": "Coor Service Management AB, PAS, Card and Know IT" + }, + { + "application": "Access Control & Security for Ericsson world wide", + "company": "Coor Service Management AB", + "mad": "0x51B5", + "service_provider": "Telefonaktiebolaget LM Ericsson", + "system_integrator": "Coor Service Management AB, PAS, Card and Know IT" + }, + { + "application": "Access Control & Security for Ericsson world wide", + "company": "Coor Service Management AB", + "mad": "0x51B6", + "service_provider": "Telefonaktiebolaget LM Ericsson", + "system_integrator": "Coor Service Management AB, PAS, Card and Know IT" + }, + { + "application": "Access Control & Security for Ericsson world wide", + "company": "Coor Service Management AB", + "mad": "0x51B7", + "service_provider": "Telefonaktiebolaget LM Ericsson", + "system_integrator": "Coor Service Management AB, PAS, Card and Know IT" + }, + { + "application": "Access Control & Security for Ericsson world wide", + "company": "Coor Service Management AB", + "mad": "0x51B8", + "service_provider": "Telefonaktiebolaget LM Ericsson", + "system_integrator": "Coor Service Management AB, PAS, Card and Know IT" + }, + { + "application": "Access Control & Security for Ericsson world wide", + "company": "Coor Service Management AB", + "mad": "0x51B9", + "service_provider": "Telefonaktiebolaget LM Ericsson", + "system_integrator": "Coor Service Management AB, PAS, Card and Know IT" + }, + { + "application": "Access Control & Security for Ericsson world wide", + "company": "Coor Service Management AB", + "mad": "0x51BA", + "service_provider": "Telefonaktiebolaget LM Ericsson", + "system_integrator": "Coor Service Management AB, PAS, Card and Know IT" + }, + { + "application": "Access control, Time and Attendance", + "company": "Bodet S.A.", + "mad": "0x51BB", + "service_provider": "Bodet SA", + "system_integrator": "Bodet SA" + }, + { + "application": "Access control and security", + "company": "STid Electronic Identification", + "mad": "0x51BC", + "service_provider": "STid", + "system_integrator": "STid" + }, + { + "application": "Access Control- Time stamping", + "company": "MCF RF TECH SRL", + "mad": "0x51BD", + "service_provider": "MCF RF TECH S.R.L.", + "system_integrator": "MCF RF TECH S.R.L." + }, + { + "application": "ID-cards for logistic company", + "company": "PNL - Pan Nordic Logistics", + "mad": "0x51BE", + "service_provider": "Combiport AB", + "system_integrator": "DAS Card AB" + }, + { + "application": "ID-cards for logistic company", + "company": "PNL - Pan Nordic Logistics", + "mad": "0x51BF", + "service_provider": "Combiport AB", + "system_integrator": "DAS Card AB" + }, + { + "application": "Accesss Control; biometric Identification", + "company": "SYTEL", + "mad": "0x51C0", + "service_provider": "SYTEL", + "system_integrator": "SYTEL" + }, + { + "application": "Accesss Control; biometric Identification", + "company": "SYTEL", + "mad": "0x51C1", + "service_provider": "SYTEL", + "system_integrator": "SYTEL" + }, + { + "application": "Accesss Control; biometric Identification", + "company": "SYTEL", + "mad": "0x51C2", + "service_provider": "SYTEL", + "system_integrator": "SYTEL" + }, + { + "application": "Access control and security application - physical security", + "company": "INID BV", + "mad": "0x51C3", + "service_provider": "INID", + "system_integrator": "INID" + }, + { + "application": "Access control Telectronic locks", + "company": "Deister electronic GmbH", + "mad": "0x51C4", + "service_provider": "Deister electronic GmbH", + "system_integrator": "Deister electronic GmbH" + }, + { + "application": "Access control Telectronic locks", + "company": "Deister electronic GmbH", + "mad": "0x51C5", + "service_provider": "Deister electronic GmbH", + "system_integrator": "Deister electronic GmbH" + }, + { + "application": "Access control", + "company": "INSYS MICROELECTRONICS GmbH", + "mad": "0x51C6", + "service_provider": "INSYS MICROELECTRONICS GmbH", + "system_integrator": "INSYS MICROELECTRONICS GmbH" + }, + { + "application": "Access control", + "company": "INSYS MICROELECTRONICS GmbH", + "mad": "0x51C7", + "service_provider": "INSYS MICROELECTRONICS GmbH", + "system_integrator": "INSYS MICROELECTRONICS GmbH" + }, + { + "application": "Access control", + "company": "INSYS MICROELECTRONICS GmbH", + "mad": "0x51C8", + "service_provider": "INSYS MICROELECTRONICS GmbH", + "system_integrator": "INSYS MICROELECTRONICS GmbH" + }, + { + "application": "Access control", + "company": "INSYS MICROELECTRONICS GmbH", + "mad": "0x51C9", + "service_provider": "INSYS MICROELECTRONICS GmbH", + "system_integrator": "INSYS MICROELECTRONICS GmbH" + }, + { + "application": "Access control", + "company": "INSYS MICROELECTRONICS GmbH", + "mad": "0x51CA", + "service_provider": "INSYS MICROELECTRONICS GmbH", + "system_integrator": "INSYS MICROELECTRONICS GmbH" + }, + { + "application": "Access control, security and monitoring", + "company": "Atelei Engineering SLU", + "mad": "0x51CB", + "service_provider": "Atelei Engineering", + "system_integrator": "Atelei Engineering" + }, + { + "application": "Access & biometrics application", + "company": "Manufacture Francaise des Pneumatiques MICHELIN", + "mad": "0x5202", + "service_provider": "MICHELIN", + "system_integrator": "" + }, + { + "application": "Access & biometrics application", + "company": "Manufacture Francaise des Pneumatiques MICHELIN", + "mad": "0x5203", + "service_provider": "MICHELIN", + "system_integrator": "" + }, + { + "application": "Access & biometrics application", + "company": "Manufacture Francaise des Pneumatiques MICHELIN", + "mad": "0x5204", + "service_provider": "MICHELIN", + "system_integrator": "" + }, + { + "application": "Access & biometrics application", + "company": "Manufacture Francaise des Pneumatiques MICHELIN", + "mad": "0x5205", + "service_provider": "MICHELIN", + "system_integrator": "" + }, + { + "application": "Access & biometrics application", + "company": "Manufacture Francaise des Pneumatiques MICHELIN", + "mad": "0x5206", + "service_provider": "MICHELIN", + "system_integrator": "" + }, + { + "application": "Access Control", + "company": "Triple Eye BV", + "mad": "0x5207", + "service_provider": "Triple Eye B.V.", + "system_integrator": "Triple Eye B.V." + }, + { + "application": "Access Control", + "company": "Triple Eye BV", + "mad": "0x5208", + "service_provider": "Triple Eye B.V.", + "system_integrator": "Triple Eye B.V." + }, + { + "application": "Access Control", + "company": "Triple Eye BV", + "mad": "0x5209", + "service_provider": "Triple Eye B.V.", + "system_integrator": "Triple Eye B.V." + }, + { + "application": "Access Control", + "company": "Triple Eye BV", + "mad": "0x520A", + "service_provider": "Triple Eye B.V.", + "system_integrator": "Triple Eye B.V." + }, + { + "application": "Access Control", + "company": "Triple Eye BV", + "mad": "0x520B", + "service_provider": "Triple Eye B.V.", + "system_integrator": "Triple Eye B.V." + }, + { + "application": "Access Control", + "company": "Triple Eye BV", + "mad": "0x520C", + "service_provider": "Triple Eye B.V.", + "system_integrator": "Triple Eye B.V." + }, + { + "application": "Access Control", + "company": "Triple Eye BV", + "mad": "0x520D", + "service_provider": "Triple Eye B.V.", + "system_integrator": "Triple Eye B.V." + }, + { + "application": "Access Control", + "company": "Triple Eye BV", + "mad": "0x520E", + "service_provider": "Triple Eye B.V.", + "system_integrator": "Triple Eye B.V." + }, + { + "application": "A ticketing application for transport systems", + "company": "VERIFONE ITALIA SRL", + "mad": "0x520F", + "service_provider": "VeriFone Italia", + "system_integrator": "VeriFone Italia" + }, + { + "application": "Access control", + "company": "KABA", + "mad": "0x5210", + "service_provider": "Kaba AG", + "system_integrator": "Kaba AG" + }, + { + "application": "Access control", + "company": "KABA", + "mad": "0x5211", + "service_provider": "Kaba AG", + "system_integrator": "Kaba AG" + }, + { + "application": "Access control", + "company": "KABA", + "mad": "0x5212", + "service_provider": "Kaba AG", + "system_integrator": "Kaba AG" + }, + { + "application": "Access control", + "company": "KABA", + "mad": "0x5213", + "service_provider": "Kaba AG", + "system_integrator": "Kaba AG" + }, + { + "application": "Access control", + "company": "KABA", + "mad": "0x5214", + "service_provider": "Kaba AG", + "system_integrator": "Kaba AG" + }, + { + "application": "Access control", + "company": "KABA", + "mad": "0x5215", + "service_provider": "Kaba AG", + "system_integrator": "Kaba AG" + }, + { + "application": "Access control", + "company": "KABA", + "mad": "0x5216", + "service_provider": "Kaba AG", + "system_integrator": "Kaba AG" + }, + { + "application": "Access control & security", + "company": "Keyprocessor B.V.", + "mad": "0x5217", + "service_provider": "Keyprocessor", + "system_integrator": "" + }, + { + "application": "Access control & Security for Ericsson world wide", + "company": "Coor Service Management AB", + "mad": "0x5218", + "service_provider": "Telefonaktiebolaget LM Ericsson", + "system_integrator": " Coor Service Management AB, PAS CARD and Know IT" + }, + { + "application": "Access control", + "company": "MBB Gelma GmbH", + "mad": "0x5229", + "service_provider": "MBB Gelma GmbH", + "system_integrator": "MBB Gelma" + }, + { + "application": "Access control", + "company": "MBB Gelma GmbH", + "mad": "0x522A", + "service_provider": "MBB Gelma GmbH", + "system_integrator": "MBB Gelma" + }, + { + "application": "Access Control, Time & Attendance", + "company": "GRUPO SPEC", + "mad": "0x522B", + "service_provider": "GRUPO SPEC", + "system_integrator": "GRUPO SPEC" + }, + { + "application": "Access Control & Security", + "company": "AB Angpanneföreningen", + "mad": "0x522D", + "service_provider": "AB Angpanneföreningen", + "system_integrator": "AB Angpanneföreningen" + }, + { + "application": "Access control & security", + "company": "Scheidt & Bachmann GmbH", + "mad": "0x522E", + "service_provider": "Scheidt & Bachmann GmbH", + "system_integrator": "Scheidt & Bachmann GmbH" + }, + { + "application": "Access control", + "company": "AMS ENGINEERING Sticht GmbH", + "mad": "0x522F", + "service_provider": "AMS-Engineering", + "system_integrator": "AMS-Engineering" + }, + { + "application": "Access control", + "company": "AMS ENGINEERING Sticht GmbH", + "mad": "0x5230", + "service_provider": "AMS-Engineering", + "system_integrator": "AMS-Engineering" + }, + { + "application": "Security and Access Control", + "company": "Integrated Control Technology Limited", + "mad": "0x5231", + "service_provider": "Integrated Control Technology Limited", + "system_integrator": "Integrated Control Technology Limited" + }, + { + "application": "Centralized access control system", + "company": "National Control Systems S.A.", + "mad": "0x5232", + "service_provider": "National Control Systems S.A.", + "system_integrator": "National Control Systems S.A." + }, + { + "application": "Access control for Pas Card AB and our customers", + "company": "PAS Card AB", + "mad": "0x5233", + "service_provider": "Pas Card AB", + "system_integrator": "Pas Card AB" + }, + { + "application": "Access control for Pas Card AB and our customers", + "company": "PAS Card AB", + "mad": "0x5234", + "service_provider": "Pas Card AB", + "system_integrator": "Pas Card AB" + }, + { + "application": "Access control for Pas Card AB and our customers", + "company": "PAS Card AB", + "mad": "0x5235", + "service_provider": "Pas Card AB", + "system_integrator": "Pas Card AB" + }, + { + "application": "Access control for Pas Card AB and our customers", + "company": "PAS Card AB", + "mad": "0x5236", + "service_provider": "Pas Card AB", + "system_integrator": "Pas Card AB" + }, + { + "application": "Access control for Pas Card AB and our customers", + "company": "PAS Card AB", + "mad": "0x5237", + "service_provider": "Pas Card AB", + "system_integrator": "Pas Card AB" + }, + { + "application": "Access services (to all buildings of Belgian and federal political assemblees) and time and attendance services", + "company": "Vlaams Parlement", + "mad": "0x5238", + "service_provider": "", + "system_integrator": "None" + }, + { + "application": "Access Control & Security Fabricom (GDF SUEZ)", + "company": "Fabricom (GDF SUEZ)", + "mad": "0x5239", + "service_provider": "Fabricom (GDF SUEZ)/Belgian Operations/Communication & Security/Security", + "system_integrator": "Fabricom (GDF SUEZ)/Belgian Operations/Communication & Security/Security" + }, + { + "application": "Access Control & Security Fabricom (GDF SUEZ)", + "company": "Fabricom (GDF SUEZ)", + "mad": "0x523A", + "service_provider": "Fabricom (GDF SUEZ)/Belgian Operations/Communication & Security/Security", + "system_integrator": "Fabricom (GDF SUEZ)/Belgian Operations/Communication & Security/Security" + }, + { + "application": "Access control and security", + "company": "ESTIS", + "mad": "0x523B", + "service_provider": "ESTIS", + "system_integrator": "ESTIS" + }, + { + "application": "Key diversification container", + "company": "KABA", + "mad": "0x523C", + "service_provider": "Kaba AG", + "system_integrator": "Kaba AG" + }, + { + "application": "Key diversification container", + "company": "KABA", + "mad": "0x523D", + "service_provider": "Kaba AG", + "system_integrator": "Kaba AG" + }, + { + "application": "Access control, security and monitoring", + "company": "Atelei Engineering SLU", + "mad": "0x523D", + "service_provider": "Atelei Engineering", + "system_integrator": "Atelei Engineering" + }, + { + "application": "", + "company": "Bombardier Transportation", + "mad": "0x5306", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Access control & security", + "company": "BTICINO s.p.a.", + "mad": "0x5307", + "service_provider": "BTICINO", + "system_integrator": "BTICINO" + }, + { + "application": "Access control & security", + "company": "BTICINO s.p.a.", + "mad": "0x5308", + "service_provider": "BTICINO", + "system_integrator": "BTICINO" + }, + { + "application": "Access control & security", + "company": "BTICINO s.p.a.", + "mad": "0x5309", + "service_provider": "BTICINO", + "system_integrator": "BTICINO" + }, + { + "application": "Access control & security", + "company": "BTICINO s.p.a.", + "mad": "0x530A", + "service_provider": "BTICINO", + "system_integrator": "BTICINO" + }, + { + "application": "Access control & security", + "company": "BTICINO s.p.a.", + "mad": "0x530B", + "service_provider": "BTICINO", + "system_integrator": "BTICINO" + }, + { + "application": "Access Control & Security", + "company": "BSB Electronics Ltd.", + "mad": "0x530C", + "service_provider": "BSB Electronics Ltd.", + "system_integrator": "BSB Electronics Ltd." + }, + { + "application": "Access control security for Uppsala University", + "company": "Uppsala University", + "mad": "0x530D", + "service_provider": "Uppsala University", + "system_integrator": "Uppsala University" + }, + { + "application": "Corporate Access Control application", + "company": "NXP Semiconductors Eindhoven", + "mad": "0x530E", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Corporate Access Control application", + "company": "NXP Semiconductors Eindhoven", + "mad": "0x530F", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Corporate Access Control application", + "company": "NXP Semiconductors Eindhoven", + "mad": "0x5310", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Corporate Access Control application", + "company": "NXP Semiconductors Eindhoven", + "mad": "0x5311", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Corporate Access Control application", + "company": "NXP Semiconductors Eindhoven", + "mad": "0x5312", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Corporate Access Control application", + "company": "NXP Semiconductors Eindhoven", + "mad": "0x5313", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Corporate Access Control application", + "company": "NXP Semiconductors Eindhoven", + "mad": "0x5314", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Corporate Access Control application", + "company": "NXP Semiconductors Eindhoven", + "mad": "0x5315", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Corporate Access Control application", + "company": "NXP Semiconductors Eindhoven", + "mad": "0x5316", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Corporate Access Control application", + "company": "NXP Semiconductors Eindhoven", + "mad": "0x5317", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Access Control", + "company": "EAL Apeldoorn B.V.", + "mad": "0x5318", + "service_provider": "EAL (Apeldoorn) BV", + "system_integrator": "EAL (Apeldoorn) BV" + }, + { + "application": "Access Control reader", + "company": "TIL Technologies", + "mad": "0x5319", + "service_provider": "TIL Technologies", + "system_integrator": "TIL Technologies" + }, + { + "application": "Access Control reader", + "company": "TIL Technologies", + "mad": "0x531A", + "service_provider": "TIL Technologies", + "system_integrator": "TIL Technologies" + }, + { + "application": "Access control", + "company": "BECKMANN GmbH", + "mad": "0x531B", + "service_provider": "BECKMANN GmbH", + "system_integrator": "BECKMANN GmbH" + }, + { + "application": "Access Control using DESFire EV1", + "company": "SIEMENS BT FSP SP PLAC", + "mad": "0x531C", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "", + "company": "DE NEDERLANDSCHE BANK", + "mad": "0x531D", + "service_provider": "AET Europe", + "system_integrator": "EAL NL" + }, + { + "application": "", + "company": "DE NEDERLANDSCHE BANK", + "mad": "0x531E", + "service_provider": "AET Europe", + "system_integrator": "EAL NL" + }, + { + "application": "Standalone Access Control", + "company": "Kimaldi Electronics s.l.", + "mad": "0x531F", + "service_provider": "", + "system_integrator": "KIMALDI Electronics" + }, + { + "application": "Access control & security system", + "company": "Haguess s.r.o.", + "mad": "0x5320", + "service_provider": "Haguess", + "system_integrator": "Haguess" + }, + { + "application": "Centralized access control system", + "company": "National Control Systems S.A", + "mad": "0x5321", + "service_provider": "National Control Systems S.A", + "system_integrator": "National Control Systems S.A" + }, + { + "application": "Centralized access control system", + "company": "National Control Systems S.A", + "mad": "0x5322", + "service_provider": "National Control Systems S.A", + "system_integrator": "National Control Systems S.A" + }, + { + "application": "Access/security", + "company": "ANTWERP WORLD DIAMOND CENTRE", + "mad": "0x5323", + "service_provider": "ANTWERP WORLD DIAMOND CENTRE", + "system_integrator": "Deister + Card Solutions Group" + }, + { + "application": "Acccess Control & security, Resource Acceptability and personnel identity verification", + "company": "Salamander Technologies, Inc.", + "mad": "0x5324", + "service_provider": "N/a", + "system_integrator": "n/a" + }, + { + "application": "High performance physical Accesss Control (reacting and writing on ccard in real time)", + "company": "Qontinuum Plus", + "mad": "0x5325", + "service_provider": "the users themselves", + "system_integrator": "Qontinuum Plus" + }, + { + "application": "Physical access control system", + "company": "Kaba-Ilco, Inc.", + "mad": "0x5327", + "service_provider": "KABA ILCO INC", + "system_integrator": "KABA ILCO INC" + }, + { + "application": "Physical access control system", + "company": "Kaba-Ilco, Inc.", + "mad": "0x5328", + "service_provider": "KABA ILCO INC", + "system_integrator": "KABA ILCO INC" + }, + { + "application": "Physical access control system", + "company": "Kaba-Ilco, Inc.", + "mad": "0x5329", + "service_provider": "KABA ILCO INC", + "system_integrator": "KABA ILCO INC" + }, + { + "application": "Physical access control system", + "company": "Kaba-Ilco, Inc.", + "mad": "0x532A", + "service_provider": "KABA ILCO INC", + "system_integrator": "KABA ILCO INC" + }, + { + "application": "Access Control, Biometrics, Time & attendance, network on card", + "company": "XceedID Corporation", + "mad": "0x532B", + "service_provider": "Ingersoll Rand", + "system_integrator": "Ingersoll Rand, Geoffrey Industries, Schlage, Recognition Systems" + }, + { + "application": "Access Control, Biometrics, Time & attendance, network on card", + "company": "XceedID Corporation", + "mad": "0x532C", + "service_provider": "Ingersoll Rand", + "system_integrator": "Ingersoll Rand, Geoffrey Industries, Schlage, Recognition Systems" + }, + { + "application": "Access Control, Biometrics, Time & attendance, network on card", + "company": "XceedID Corporation", + "mad": "0x532D", + "service_provider": "Ingersoll Rand", + "system_integrator": "Ingersoll Rand, Geoffrey Industries, Schlage, Recognition Systems" + }, + { + "application": "Access control & security", + "company": "Gantner Electronic GmbH", + "mad": "0x532E", + "service_provider": "GANTNER Electronic", + "system_integrator": "GANTNER Electronic" + }, + { + "application": "Standard physical access", + "company": "NXP Semiconductors Columbia PA", + "mad": "0x532F", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Access Control & Electronic security", + "company": "Gunnebo Electronic Security", + "mad": "0x5330", + "service_provider": "Competence Center", + "system_integrator": "GUNNEBO GES" + }, + { + "application": "Access Control & Electronic security", + "company": "Gunnebo Electronic Security", + "mad": "0x5331", + "service_provider": "Competence Center", + "system_integrator": "GUNNEBO GES" + }, + { + "application": "Access Control & Electronic security", + "company": "Gunnebo Electronic Security", + "mad": "0x5332", + "service_provider": "Competence Center", + "system_integrator": "GUNNEBO GES" + }, + { + "application": "Access Control ID", + "company": "EM Group", + "mad": "0x5333", + "service_provider": "EM GROUP", + "system_integrator": "EM GROUP" + }, + { + "application": "Access Control", + "company": "DOM Sicherheitstechnik GmbH & Co. KG", + "mad": "0x5334", + "service_provider": "DOM Sicherheitstechnik GmbH & Co.KG", + "system_integrator": "DOM Sicherheitstechnik GmbH & Co.KG" + }, + { + "application": "Access Control", + "company": "DOM Sicherheitstechnik GmbH & Co. KG", + "mad": "0x5335", + "service_provider": "DOM Sicherheitstechnik GmbH & Co.KG", + "system_integrator": "DOM Sicherheitstechnik GmbH & Co.KG" + }, + { + "application": "Access Control", + "company": "DOM Sicherheitstechnik GmbH & Co. KG", + "mad": "0x5336", + "service_provider": "DOM Sicherheitstechnik GmbH & Co.KG", + "system_integrator": "DOM Sicherheitstechnik GmbH & Co.KG" + }, + { + "application": "Access Control", + "company": "DOM Sicherheitstechnik GmbH & Co. KG", + "mad": "0x5337", + "service_provider": "DOM Sicherheitstechnik GmbH & Co.KG", + "system_integrator": "DOM Sicherheitstechnik GmbH & Co.KG" + }, + { + "application": "Access Control", + "company": "DOM Sicherheitstechnik GmbH & Co. KG", + "mad": "0x5338", + "service_provider": "DOM Sicherheitstechnik GmbH & Co.KG", + "system_integrator": "DOM Sicherheitstechnik GmbH & Co.KG" + }, + { + "application": "Access Control", + "company": "WIGOTEK, Hardware Software Beratung", + "mad": "0x5339", + "service_provider": "WIGOTEK", + "system_integrator": "WIGOTEK" + }, + { + "application": "Access Control", + "company": "WIGOTEK, Hardware Software Beratung", + "mad": "0x533A", + "service_provider": "WIGOTEK", + "system_integrator": "WIGOTEK" + }, + { + "application": "ZKS, Personalnummer, IDs, Nutzerdaten", + "company": "Primion Technology AG", + "mad": "0x533B", + "service_provider": "HDW", + "system_integrator": "Primion" + }, + { + "application": "ZKS, Personalnummer, IDs, Nutzerdaten", + "company": "Primion Technology AG", + "mad": "0x533C", + "service_provider": "HDW", + "system_integrator": "Primion" + }, + { + "application": "ZKS, Personalnummer, IDs, Nutzerdaten", + "company": "Primion Technology AG", + "mad": "0x533D", + "service_provider": "HDW", + "system_integrator": "Primion" + }, + { + "application": "ZKS, Personalnummer, IDs, Nutzerdaten", + "company": "Primion Technology AG", + "mad": "0x533E", + "service_provider": "HDW", + "system_integrator": "Primion" + }, + { + "application": "", + "company": "EVVA-Werk Gesellschaft m.b.H. & Co. KG", + "mad": "0x533F", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Access control and time attendance systems", + "company": "Unicard S.A.", + "mad": "0x5340", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "Access control and time attendance systems", + "company": "Unicard S.A.", + "mad": "0x5341", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "Access control and time attendance systems", + "company": "Unicard S.A.", + "mad": "0x5342", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "Access control", + "company": "TNO ICT", + "mad": "0x5343", + "service_provider": "TNO", + "system_integrator": "TNO" + }, + { + "application": "Access control", + "company": "TNO ICT", + "mad": "0x5344", + "service_provider": "TNO", + "system_integrator": "TNO" + }, + { + "application": "Access control", + "company": "REMSDAQ LIMITED", + "mad": "0x5345", + "service_provider": "", + "system_integrator": "REMSDAQ Limited" + }, + { + "application": "Access control benefits", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x5346", + "service_provider": "KOORDINATOR ODIS s.r.o.", + "system_integrator": "KOORDINATOR ODIS s.r.o." + }, + { + "application": "Access control & security", + "company": "Coor Service Management AB", + "mad": "0x5347", + "service_provider": "SKANDINAVISKA ENSKILDA BANKEN AB", + "system_integrator": "Coor Service Management AB" + }, + { + "application": "Access control & security", + "company": "Coor Service Management AB", + "mad": "0x5348", + "service_provider": "SKANDINAVISKA ENSKILDA BANKEN AB", + "system_integrator": "Coor Service Management AB" + }, + { + "application": "Access control & security", + "company": "Coor Service Management AB", + "mad": "0x5349", + "service_provider": "SKANDINAVISKA ENSKILDA BANKEN AB", + "system_integrator": "Coor Service Management AB" + }, + { + "application": "Access control & security", + "company": "Coor Service Management AB", + "mad": "0x534A", + "service_provider": "SKANDINAVISKA ENSKILDA BANKEN AB", + "system_integrator": "Coor Service Management AB" + }, + { + "application": "Access control & security", + "company": "Coor Service Management AB", + "mad": "0x534B", + "service_provider": "SKANDINAVISKA ENSKILDA BANKEN AB", + "system_integrator": "Coor Service Management AB" + }, + { + "application": "Access control & security", + "company": "Coor Service Management AB", + "mad": "0x534C", + "service_provider": "SKANDINAVISKA ENSKILDA BANKEN AB", + "system_integrator": "Coor Service Management AB" + }, + { + "application": "Access control, user identification, access counter", + "company": "Nordic Alarm AB", + "mad": "0x534D", + "service_provider": "Nordic Alarm AB", + "system_integrator": "Nordic Alarm AB" + }, + { + "application": "Access control, user identification, access counter", + "company": "Nordic Alarm AB", + "mad": "0x534E", + "service_provider": "Nordic Alarm AB", + "system_integrator": "Nordic Alarm AB" + }, + { + "application": "Access control security", + "company": "Mobotix AG Security Vision Systems", + "mad": "0x534F", + "service_provider": "Mobotix AG Security Vision Systems", + "system_integrator": "Mobotix AG Security Vision Systems" + }, + { + "application": "Access Control + Security", + "company": "PKE Electronics AG", + "mad": "0x5350", + "service_provider": "PKE Electronics AG", + "system_integrator": "PKE Electronics AG" + }, + { + "application": "Access Control + Security", + "company": "PKE Electronics AG", + "mad": "0x5351", + "service_provider": "PKE Electronics AG", + "system_integrator": "PKE Electronics AG" + }, + { + "application": "Access Control + Security", + "company": "PKE Electronics AG", + "mad": "0x5352", + "service_provider": "PKE Electronics AG", + "system_integrator": "PKE Electronics AG" + }, + { + "application": "Corporate ID Card BASF", + "company": "Cosmo.id GmbH", + "mad": "0x5353", + "service_provider": "Cosmo.ID", + "system_integrator": "Cosmo.ID" + }, + { + "application": "Corporate ID Crad Daimler", + "company": "Cosmo.id GmbH", + "mad": "0x5354", + "service_provider": "Cosmo.ID", + "system_integrator": "Cosmo.ID" + }, + { + "application": "Access control; Biometric template storage; Offline access control authorization storage; Cash-on card", + "company": "Siemens Building Technologies - Security Solutions - International Headquarters", + "mad": "0x5355", + "service_provider": "Siemens Building Technologies - Security Solutions -worldwide", + "system_integrator": "Siemens Building Technologies - Security Solutions -worldwide" + }, + { + "application": "Access control; Biometric template storage; Offline access control authorization storage; Cash-on card", + "company": "Siemens Building Technologies - Security Solutions - International Headquarters", + "mad": "0x5356", + "service_provider": "Siemens Building Technologies - Security Solutions -worldwide", + "system_integrator": "Siemens Building Technologies - Security Solutions -worldwide" + }, + { + "application": "Access control; Biometric template storage; Offline access control authorization storage; Cash-on card", + "company": "Siemens Building Technologies - Security Solutions - International Headquarters", + "mad": "0x5357", + "service_provider": "Siemens Building Technologies - Security Solutions -worldwide", + "system_integrator": "Siemens Building Technologies - Security Solutions -worldwide" + }, + { + "application": "Access control; Biometric template storage; Offline access control authorization storage; Cash-on card", + "company": "Siemens Building Technologies - Security Solutions - International Headquarters", + "mad": "0x5358", + "service_provider": "Siemens Building Technologies - Security Solutions -worldwide", + "system_integrator": "Siemens Building Technologies - Security Solutions -worldwide" + }, + { + "application": "Access control, security", + "company": "Westec AS", + "mad": "0x5359", + "service_provider": "Westec AS", + "system_integrator": "Westec" + }, + { + "application": "Access control, security", + "company": "Westec AS", + "mad": "0x535A", + "service_provider": "Westec AS", + "system_integrator": "Westec" + }, + { + "application": "Access control, security", + "company": "Westec AS", + "mad": "0x535B", + "service_provider": "Westec AS", + "system_integrator": "Westec" + }, + { + "application": "Access control, security", + "company": "Westec AS", + "mad": "0x535C", + "service_provider": "Westec AS", + "system_integrator": "Westec" + }, + { + "application": "Access control, security", + "company": "Avinor AS", + "mad": "0x535D", + "service_provider": "Avinor AS", + "system_integrator": "Westec AS" + }, + { + "application": "Access Control", + "company": "AMC - Academic Hospital", + "mad": "0x535E", + "service_provider": "EAL (Apeldoorn) B.V.", + "system_integrator": "EAL (Apeldoorn) B.V." + }, + { + "application": "Access control & security", + "company": "Axel Springer AG", + "mad": "0x535F", + "service_provider": "Axel Springer AG", + "system_integrator": "Axel Springer AG" + }, + { + "application": "Access control & security", + "company": "Axel Springer AG", + "mad": "0x5360", + "service_provider": "Axel Springer AG", + "system_integrator": "Axel Springer AG" + }, + { + "application": "Access control & security", + "company": "Axel Springer AG", + "mad": "0x5361", + "service_provider": "Axel Springer AG", + "system_integrator": "Axel Springer AG" + }, + { + "application": "Access Control", + "company": "Universite de Luxembourg", + "mad": "0x5362", + "service_provider": "EAL (Apeldoorn) B.V.", + "system_integrator": "EAL (Apeldoorn) B.V." + }, + { + "application": "Access control, intruder alarm, time & attendance", + "company": "Novar GmbH- Honeywell Security", + "mad": "0x5363", + "service_provider": "NOVAR, HONEYWELL", + "system_integrator": "" + }, + { + "application": "Access Control & Security", + "company": "Vattenfall Research & Development AB", + "mad": "0x5364", + "service_provider": "Vattenfall AB", + "system_integrator": "Coor Service Vattenfall AB" + }, + { + "application": "Access control system", + "company": "ISEO/ATG", + "mad": "0x5365", + "service_provider": "ISEO/ATG", + "system_integrator": "ISEO/ATG" + }, + { + "application": "Access control system", + "company": "ISEO/ATG", + "mad": "0x5366", + "service_provider": "ISEO/ATG", + "system_integrator": "ISEO/ATG" + }, + { + "application": "Access control system", + "company": "ISEO/ATG", + "mad": "0x5367", + "service_provider": "ISEO/ATG", + "system_integrator": "ISEO/ATG" + }, + { + "application": "Access Control, ID Badge, Payment", + "company": "Danfoss A/S", + "mad": "0x5368", + "service_provider": "Vitani A/S", + "system_integrator": "Vitani A/S" + }, + { + "application": "Access control, security and monitoring", + "company": "Atelei Engineering SLU", + "mad": "0x5369", + "service_provider": "Atelei Engineering", + "system_integrator": "Atelei Engineering" + }, + { + "application": "Access Control", + "company": "Teratron GmbH", + "mad": "0x536A", + "service_provider": "Teratron GmbH", + "system_integrator": "Teratron GmbH" + }, + { + "application": "Access Control", + "company": "Assa Abloy (Switzerland)", + "mad": "0x536B", + "service_provider": "Assa Abloy (Switzerland)", + "system_integrator": "Assa Abloy (Switzerland)" + }, + { + "application": "Servicios de Identificacion/Presenncia Corporation; control de Accesos y seguridad", + "company": "IZENPE", + "mad": "0x5401", + "service_provider": "IZENPE", + "system_integrator": "IZENPE" + }, + { + "application": "Servicios de Identificacion/Presenncia Corporation; control de Accesos y seguridad", + "company": "IZENPE", + "mad": "0x5402", + "service_provider": "IZENPE", + "system_integrator": "IZENPE" + }, + { + "application": "Servicios de Identificacion/Presenncia Corporation; control de Accesos y seguridad", + "company": "IZENPE", + "mad": "0x5403", + "service_provider": "IZENPE", + "system_integrator": "IZENPE" + }, + { + "application": "Servicios de Identificacion/Presenncia Corporation; control de Accesos y seguridad", + "company": "IZENPE", + "mad": "0x5404", + "service_provider": "IZENPE", + "system_integrator": "IZENPE" + }, + { + "application": "Corporate ID Card BASF", + "company": "Cosmo.id GmbH", + "mad": "0x5405", + "service_provider": "Cosmo.id", + "system_integrator": "Cosmo.id" + }, + { + "application": "Electrical vehicle charging", + "company": "EnBW Energie Baden-Württemberg AG", + "mad": "0x5406", + "service_provider": "EnBW Systeme Infrastruktur Support GmbH", + "system_integrator": "EnBW Systeme Infrastruktur Support GmbH" + }, + { + "application": "Electronic Access Control Systems EZK", + "company": "Franz Schneider Brakel GmbH + Co KG", + "mad": "0x5407", + "service_provider": "", + "system_integrator": "Franz Schneider Brakel GmbH + Co KG" + }, + { + "application": "Access control & security", + "company": "SCM Microsystems Gmbh", + "mad": "0x5408", + "service_provider": "SCM Microsystems Gmbh", + "system_integrator": "" + }, + { + "application": "Access control and key management system", + "company": "ALCEA", + "mad": "0x5409", + "service_provider": "ALCEA", + "system_integrator": "ALCEA" + }, + { + "application": "Access control and key management system", + "company": "ALCEA", + "mad": "0x540A", + "service_provider": "ALCEA", + "system_integrator": "ALCEA" + }, + { + "application": "Smart City Card \\Schwabencard\"\"", + "company": "Cosmo.id GmbH", + "mad": "0x540B", + "service_provider": "Cosmo.id", + "system_integrator": "Cosmo.id" + }, + { + "application": "Physical access control; Photo; Biometrics data; hourly management; Canteen", + "company": "France Telecom SA", + "mad": "0x540C", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Physical access control; Photo; Biometrics data; hourly management; Canteen", + "company": "France Telecom SA", + "mad": "0x540D", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Physical access control; Photo; Biometrics data; hourly management; Canteen", + "company": "France Telecom SA", + "mad": "0x540E", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Physical access control; Photo; Biometrics data; hourly management; Canteen", + "company": "France Telecom SA", + "mad": "0x540F", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Physical access control; Photo; Biometrics data; hourly management; Canteen", + "company": "France Telecom SA", + "mad": "0x5410", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Access control", + "company": "Medisch Centrum Alkmaar", + "mad": "0x5411", + "service_provider": "EAL (Apeldoorn) B.V.", + "system_integrator": "EAL (Apeldoorn) B.V." + }, + { + "application": "Access control, benefits", + "company": "OREDO s.r.o", + "mad": "0x5412", + "service_provider": "OREDO s.r.o", + "system_integrator": "OREDO s.r.o" + }, + { + "application": "Access control", + "company": "Synchronic", + "mad": "0x5413", + "service_provider": "R&D Synchronic", + "system_integrator": "SYNCHRONIC" + }, + { + "application": "Access Control System", + "company": "Glutz AG, Swiss Access Systems", + "mad": "0x5414", + "service_provider": "Glutz AG", + "system_integrator": "Glutz AG" + }, + { + "application": "Access Control System", + "company": "Glutz AG, Swiss Access Systems", + "mad": "0x5415", + "service_provider": "Glutz AG", + "system_integrator": "Glutz AG" + }, + { + "application": "Access control, security, identification and business services", + "company": "Amtac Professional Services Ptv Ltd", + "mad": "0x5416", + "service_provider": "Amtac Professional Services Ptv Ltd", + "system_integrator": "Amtac Professional Services Ptv Ltd" + }, + { + "application": "Access control, security, identification and business services", + "company": "Amtac Professional Services Ptv Ltd", + "mad": "0x5417", + "service_provider": "Amtac Professional Services Ptv Ltd", + "system_integrator": "Amtac Professional Services Ptv Ltd" + }, + { + "application": "Identification services", + "company": "EasyCheck GmbH", + "mad": "0x5418", + "service_provider": "Stadt Duisburg", + "system_integrator": "Stadt Duisburg" + }, + { + "application": "Access Control, ID Badge, Payment & Hotel", + "company": "Danish Defence", + "mad": "0x5419", + "service_provider": "Vitani A/S", + "system_integrator": "Vitani A/S" + }, + { + "application": "Access control, security and monitoring", + "company": "Atelei Engineering SLU", + "mad": "0x541A", + "service_provider": "Atelei Engineering", + "system_integrator": "Atelei Engineering" + }, + { + "application": "Access to datacenter, cass, rows, disable alarm+security system, employee ID-card", + "company": "VegaSystems", + "mad": "0x541B", + "service_provider": "VegaSystems", + "system_integrator": "VegaSystems" + }, + { + "application": "Academic Services, Electronic Purse, Access control & security", + "company": "CNA Limited/Rax-Comm Systems Ltd.", + "mad": "0x5801", + "service_provider": "CNA Limited", + "system_integrator": "CNA Limited" + }, + { + "application": "Universitz Student & Staff Identification", + "company": "CNA Limited/Rax-Comm Systems Ltd.", + "mad": "0x5802", + "service_provider": "CNA Limited", + "system_integrator": "CNA Limited" + }, + { + "application": "Student/stuff ID Card Travel Pass, Library Card, Photocopy Control & Meal Payment", + "company": "University of Warwick", + "mad": "0x5803", + "service_provider": "University of Warwick", + "system_integrator": "University of Warwick" + }, + { + "application": "Student/stuff ID Card Travel Pass, Library Card, Photocopy Control & Meal Payment", + "company": "University of Warwick", + "mad": "0x5804", + "service_provider": "University of Warwick", + "system_integrator": "University of Warwick" + }, + { + "application": "Student/stuff ID Card Travel Pass, Library Card, Photocopy Control & Meal Payment", + "company": "University of Warwick", + "mad": "0x5805", + "service_provider": "University of Warwick", + "system_integrator": "University of Warwick" + }, + { + "application": "Student/stuff ID Card Travel Pass, Library Card, Photocopy Control & Meal Payment", + "company": "University of Warwick", + "mad": "0x5806", + "service_provider": "University of Warwick", + "system_integrator": "University of Warwick" + }, + { + "application": "Student/stuff ID Card Travel Pass, Library Card, Photocopy Control & Meal Payment", + "company": "University of Warwick", + "mad": "0x5807", + "service_provider": "University of Warwick", + "system_integrator": "University of Warwick" + }, + { + "application": "Accademic services", + "company": "Innolab Private Ltd", + "mad": "0x5809", + "service_provider": "National University of Singapore", + "system_integrator": "Innolab Private Ltd" + }, + { + "application": "Accademic services", + "company": "Innolab Private Ltd", + "mad": "0x580A", + "service_provider": "National University of Singapore", + "system_integrator": "Innolab Private Ltd" + }, + { + "application": "Accademic services", + "company": "Innolab Private Ltd", + "mad": "0x580B", + "service_provider": "National University of Singapore", + "system_integrator": "Innolab Private Ltd" + }, + { + "application": "Accademic services", + "company": "Innolab Private Ltd", + "mad": "0x580C", + "service_provider": "National University of Singapore", + "system_integrator": "Innolab Private Ltd" + }, + { + "application": "Accademic services", + "company": "Innolab Private Ltd", + "mad": "0x580D", + "service_provider": "National University of Singapore", + "system_integrator": "Innolab Private Ltd" + }, + { + "application": "Accademic services", + "company": "Innolab Private Ltd", + "mad": "0x580E", + "service_provider": "National University of Singapore", + "system_integrator": "Innolab Private Ltd" + }, + { + "application": "Academic identity cards", + "company": "Maximus", + "mad": "0x580F", + "service_provider": "Maximus Inc", + "system_integrator": "Maximus Inc" + }, + { + "application": "Basic cardholder info", + "company": "Cambridge University - Institute for Manufacturing", + "mad": "0x5810", + "service_provider": "Cambridge University", + "system_integrator": "Cambridge University" + }, + { + "application": "Basic cardholder info", + "company": "Cambridge University - Institute for Manufacturing", + "mad": "0x5811", + "service_provider": "Cambridge University", + "system_integrator": "Cambridge University" + }, + { + "application": "Basic cardholder info", + "company": "Cambridge University - Institute for Manufacturing", + "mad": "0x5812", + "service_provider": "Cambridge University", + "system_integrator": "Cambridge University" + }, + { + "application": "Basic cardholder info", + "company": "Cambridge University - Institute for Manufacturing", + "mad": "0x5813", + "service_provider": "Cambridge University", + "system_integrator": "Cambridge University" + }, + { + "application": "Academic services", + "company": "Invest Solutions Limited", + "mad": "0x5814", + "service_provider": "Invest Solutions", + "system_integrator": "Invest Solutions" + }, + { + "application": "Academic services", + "company": "Invest Solutions Limited", + "mad": "0x5815", + "service_provider": "Invest Solutions", + "system_integrator": "Invest Solutions" + }, + { + "application": "Access control & security, city traffic, sports & entertainment", + "company": "IP Core", + "mad": "0x5816", + "service_provider": "IP Core", + "system_integrator": "IP Core" + }, + { + "application": "Student, staff ID card", + "company": "University of Bolton", + "mad": "0x5817", + "service_provider": "University of Bolton", + "system_integrator": "University of Bolton" + }, + { + "application": "Student, staff ID card", + "company": "University of Bolton", + "mad": "0x5818", + "service_provider": "University of Bolton", + "system_integrator": "University of Bolton" + }, + { + "application": "Student, staff ID card", + "company": "University of Bolton", + "mad": "0x5819", + "service_provider": "University of Bolton", + "system_integrator": "University of Bolton" + }, + { + "application": "Student, staff ID card", + "company": "University of Bolton", + "mad": "0x581A", + "service_provider": "University of Bolton", + "system_integrator": "University of Bolton" + }, + { + "application": "Railway pass, univers pass, library", + "company": "Emcard a.s.", + "mad": "0x581B", + "service_provider": "Emcard", + "system_integrator": "Emtest" + }, + { + "application": "Railway pass, univers pass, library", + "company": "Emcard a.s.", + "mad": "0x581C", + "service_provider": "Emcard", + "system_integrator": "Emtest" + }, + { + "application": "University Card", + "company": "Faculty of Electrical Engineering and Computing", + "mad": "0x581D", + "service_provider": "Faculty of EE & Computing, Ministry of Science, Technolgoy and Education", + "system_integrator": "Faculty of EE & Computing" + }, + { + "application": "University Card", + "company": "Faculty of Electrical Engineering and Computing", + "mad": "0x581E", + "service_provider": "Faculty of EE & Computing, Ministry of Science, Technolgoy and Education", + "system_integrator": "Faculty of EE & Computing" + }, + { + "application": "University Card", + "company": "Faculty of Electrical Engineering and Computing", + "mad": "0x581F", + "service_provider": "Faculty of EE & Computing, Ministry of Science, Technolgoy and Education", + "system_integrator": "Faculty of EE & Computing" + }, + { + "application": "University Campus Card", + "company": "Smartchip S.A.", + "mad": "0x5820", + "service_provider": "Universidad U.P.B.", + "system_integrator": "Smartchip S.A." + }, + { + "application": "High school pass", + "company": "Emcard a.s.", + "mad": "0x5821", + "service_provider": "EMCARD, a.s.", + "system_integrator": "EMTEST, a.s." + }, + { + "application": "Academic services", + "company": "University of Bath", + "mad": "0x5822", + "service_provider": "University Bath", + "system_integrator": "Royall Security Systems" + }, + { + "application": "Student/stuff ID, library ID, access control, purse 1, purse 2, electroral rights indicator", + "company": "Universität Ulm", + "mad": "0x5823", + "service_provider": "University of Ulm", + "system_integrator": "University of Ulm" + }, + { + "application": "Student/stuff ID, library ID, access control, purse 1, purse 2, electroral rights indicator", + "company": "Universität Ulm", + "mad": "0x5824", + "service_provider": "University of Ulm", + "system_integrator": "University of Ulm" + }, + { + "application": "Student/stuff ID, library ID, access control, purse 1, purse 2, electroral rights indicator", + "company": "Universität Ulm", + "mad": "0x5825", + "service_provider": "University of Ulm", + "system_integrator": "University of Ulm" + }, + { + "application": "Student/stuff ID, library ID, access control, purse 1, purse 2, electroral rights indicator", + "company": "Universität Ulm", + "mad": "0x5826", + "service_provider": "University of Ulm", + "system_integrator": "University of Ulm" + }, + { + "application": "Student/stuff ID, library ID, access control, purse 1, purse 2, electroral rights indicator", + "company": "Universität Ulm", + "mad": "0x5827", + "service_provider": "University of Ulm", + "system_integrator": "University of Ulm" + }, + { + "application": "Student/stuff ID, library ID, access control, purse 1, purse 2, electroral rights indicator", + "company": "Universität Ulm", + "mad": "0x5828", + "service_provider": "University of Ulm", + "system_integrator": "University of Ulm" + }, + { + "application": "University Card (Academic Applications)", + "company": "Faculty of Electrical Engineering and Computing", + "mad": "0x5829", + "service_provider": "Faculty of EE & Computing", + "system_integrator": "Faculty of EE & Computing" + }, + { + "application": "University Card (Academic Applications)", + "company": "Faculty of Electrical Engineering and Computing", + "mad": "0x582A", + "service_provider": "Faculty of EE & Computing", + "system_integrator": "Faculty of EE & Computing" + }, + { + "application": "University Card (Academic Applications)", + "company": "Faculty of Electrical Engineering and Computing", + "mad": "0x582B", + "service_provider": "Faculty of EE & Computing", + "system_integrator": "Faculty of EE & Computing" + }, + { + "application": "University Card (Academic Applications)", + "company": "Faculty of Electrical Engineering and Computing", + "mad": "0x582C", + "service_provider": "Faculty of EE & Computing", + "system_integrator": "Faculty of EE & Computing" + }, + { + "application": "University Card (Academic Applications)", + "company": "Faculty of Electrical Engineering and Computing", + "mad": "0x582D", + "service_provider": "Faculty of EE & Computing", + "system_integrator": "Faculty of EE & Computing" + }, + { + "application": "Academic services, food", + "company": "FH Studienbetriebs GmbH", + "mad": "0x582E", + "service_provider": "FH 00E Studienbetriebs GmbH, HSSE", + "system_integrator": "FH 00E Studienbetriebs GmbH, HSSE" + }, + { + "application": "Library card", + "company": "Technical University Of Szczecin", + "mad": "0x582F", + "service_provider": "techn University Szczecin", + "system_integrator": "techn University Szczecin" + }, + { + "application": "Student/Staff IC Card", + "company": "University of Chester", + "mad": "0x5830", + "service_provider": "University of Chester", + "system_integrator": "University of Chester" + }, + { + "application": "Student/Staff IC Card", + "company": "University of Chester", + "mad": "0x5831", + "service_provider": "University of Chester", + "system_integrator": "University of Chester" + }, + { + "application": "Student/Staff IC Card", + "company": "University of Chester", + "mad": "0x5832", + "service_provider": "University of Chester", + "system_integrator": "University of Chester" + }, + { + "application": "Student/Staff IC Card", + "company": "University of Chester", + "mad": "0x5833", + "service_provider": "University of Chester", + "system_integrator": "University of Chester" + }, + { + "application": "Student/Staff IC Card", + "company": "University of Chester", + "mad": "0x5834", + "service_provider": "University of Chester", + "system_integrator": "University of Chester" + }, + { + "application": "University Campus Card", + "company": "Smartchip S.A.", + "mad": "0x5835", + "service_provider": "Universidad EAFIT", + "system_integrator": "Smartchip S.A." + }, + { + "application": "Online Activity Registration and Ticketing (education)", + "company": "PinCash International", + "mad": "0x5836", + "service_provider": "Pincash international BV", + "system_integrator": "Pincash international BV" + }, + { + "application": "University Card, Library Card, Studen/Staff ID, Academic services", + "company": "Stockholm University", + "mad": "0x5837", + "service_provider": "Stockholm University", + "system_integrator": "Stockholm University" + }, + { + "application": "University Card, Library Card, Studen/Staff ID, Academic services", + "company": "Stockholm University", + "mad": "0x5838", + "service_provider": "Stockholm University", + "system_integrator": "Stockholm University" + }, + { + "application": "University Card, Library Card, Studen/Staff ID, Academic services", + "company": "Stockholm University", + "mad": "0x5839", + "service_provider": "Stockholm University", + "system_integrator": "Stockholm University" + }, + { + "application": "University Card, Library Card, Studen/Staff ID, Academic services", + "company": "Stockholm University", + "mad": "0x583A", + "service_provider": "Stockholm University", + "system_integrator": "Stockholm University" + }, + { + "application": "University Campus Card", + "company": "Smartchip S.A.", + "mad": "0x583B", + "service_provider": "Colegiatura Colombiana", + "system_integrator": "SMARTCHIP S.A." + }, + { + "application": "Student/personnel authentication & identification card", + "company": "Hogeschool Gent", + "mad": "0x583C", + "service_provider": "Associatie Universiteit Gent", + "system_integrator": "Universiteit Gent, Hogeschool Gent, Arteveldeschool, Hogeschool West-Vlaanderen" + }, + { + "application": "Student/personnel authentication & identification card", + "company": "Hogeschool Gent", + "mad": "0x583D", + "service_provider": "Associatie Universiteit Gent", + "system_integrator": "Universiteit Gent, Hogeschool Gent, Arteveldeschool, Hogeschool West-Vlaanderen" + }, + { + "application": "Student/personnel authentication & identification card", + "company": "Hogeschool Gent", + "mad": "0x583E", + "service_provider": "Associatie Universiteit Gent", + "system_integrator": "Universiteit Gent, Hogeschool Gent, Arteveldeschool, Hogeschool West-Vlaanderen" + }, + { + "application": "Student/personnel authentication & identification card", + "company": "Hogeschool Gent", + "mad": "0x583F", + "service_provider": "Associatie Universiteit Gent", + "system_integrator": "Universiteit Gent, Hogeschool Gent, Arteveldeschool, Hogeschool West-Vlaanderen" + }, + { + "application": "Studen/personnel authentication & identification card", + "company": "Hogeschool Gent", + "mad": "0x5840", + "service_provider": "Associatie Universiteit Gent", + "system_integrator": "Associatie Universiteit Gent" + }, + { + "application": "Academic services", + "company": "Group Capmonetique", + "mad": "0x5841", + "service_provider": "MONECARTE", + "system_integrator": "MONECARTE" + }, + { + "application": "Academic services", + "company": "Group Capmonetique", + "mad": "0x5842", + "service_provider": "MONECARTE", + "system_integrator": "MONECARTE" + }, + { + "application": "Academic services", + "company": "Group Capmonetique", + "mad": "0x5843", + "service_provider": "MONECARTE", + "system_integrator": "MONECARTE" + }, + { + "application": "Academic services", + "company": "Group Capmonetique", + "mad": "0x5844", + "service_provider": "MONECARTE", + "system_integrator": "MONECARTE" + }, + { + "application": "Multifunctional IT", + "company": "InterCard AG Informationssysteme", + "mad": "0x5845", + "service_provider": "InterCard", + "system_integrator": "InterCard" + }, + { + "application": "Multifunctional IT", + "company": "InterCard AG Informationssysteme", + "mad": "0x5846", + "service_provider": "InterCard", + "system_integrator": "InterCard" + }, + { + "application": "Multifunctional IT", + "company": "InterCard AG Informationssysteme", + "mad": "0x5847", + "service_provider": "InterCard", + "system_integrator": "InterCard" + }, + { + "application": "Multifunctional IT", + "company": "InterCard AG Informationssysteme", + "mad": "0x5848", + "service_provider": "InterCard", + "system_integrator": "InterCard" + }, + { + "application": "Student and staff identification, access control, attendance monitoring, cashless vending", + "company": "Computer Centre, Lancaster University", + "mad": "0x5849", + "service_provider": "Lancaster University", + "system_integrator": "Lancaster University" + }, + { + "application": "Student and staff identification, access control, attendance monitoring, cashless vending", + "company": "Computer Centre, Lancaster University", + "mad": "0x584A", + "service_provider": "Lancaster University", + "system_integrator": "Lancaster University" + }, + { + "application": "Student and staff identification, access control, attendance monitoring, cashless vending", + "company": "Computer Centre, Lancaster University", + "mad": "0x584B", + "service_provider": "Lancaster University", + "system_integrator": "Lancaster University" + }, + { + "application": "Student and staff identification, access control, attendance monitoring, cashless vending", + "company": "Computer Centre, Lancaster University", + "mad": "0x584C", + "service_provider": "Lancaster University", + "system_integrator": "Lancaster University" + }, + { + "application": "Academic services", + "company": "Gantner Electronic GmbH", + "mad": "0x584D", + "service_provider": "GANTNER Electronic", + "system_integrator": "GANTNER Electronic" + }, + { + "application": "Library card", + "company": "Vienna University of Economics", + "mad": "0x584E", + "service_provider": "Vienna University of Economics", + "system_integrator": "Vienna University of Economics" + }, + { + "application": "University campus card", + "company": "Smartchip S.A.", + "mad": "0x584F", + "service_provider": "Universidad de Antioquia - UedA", + "system_integrator": "Smartchip SA" + }, + { + "application": "Sttuden/personnel access control", + "company": "Caja General de Ahorros de Canarias", + "mad": "0x5850", + "service_provider": "Universidad de La laguna-ULL", + "system_integrator": "CajaCanarias" + }, + { + "application": "Academic services", + "company": "Emtest a.s.", + "mad": "0x5851", + "service_provider": "Ministry of Education of Slovak republic", + "system_integrator": "EMtest-SK, s.r.o." + }, + { + "application": "Internal identification", + "company": "HUB-EHSAL VZW", + "mad": "0x5852", + "service_provider": "HUB", + "system_integrator": "" + }, + { + "application": "University/Campus applications", + "company": "Burall InfoSmart Ltd", + "mad": "0x5853", + "service_provider": "Burall InfoSmart Ltd", + "system_integrator": "Burall InfoSmart Ltd" + }, + { + "application": "University student identification", + "company": "Pro Active", + "mad": "0x5854", + "service_provider": "CNOUS", + "system_integrator": "Pro Active SAS" + }, + { + "application": "University student identification", + "company": "Pro Active", + "mad": "0x5855", + "service_provider": "CNOUS", + "system_integrator": "Pro Active SAS" + }, + { + "application": "University student identification", + "company": "Pro Active", + "mad": "0x5856", + "service_provider": "CNOUS", + "system_integrator": "Pro Active SAS" + }, + { + "application": "University student identification", + "company": "Pro Active", + "mad": "0x5857", + "service_provider": "CNOUS", + "system_integrator": "Pro Active SAS" + }, + { + "application": "University student identification", + "company": "Pro Active", + "mad": "0x5858", + "service_provider": "CNOUS", + "system_integrator": "Pro Active SAS" + }, + { + "application": "University student identification", + "company": "Pro Active", + "mad": "0x5859", + "service_provider": "CNOUS", + "system_integrator": "Pro Active SAS" + }, + { + "application": "University student identification", + "company": "Pro Active", + "mad": "0x585A", + "service_provider": "CNOUS", + "system_integrator": "Pro Active SAS" + }, + { + "application": "University student identification", + "company": "Pro Active", + "mad": "0x585B", + "service_provider": "CNOUS", + "system_integrator": "Pro Active SAS" + }, + { + "application": "Wittenborg Caterchip 2002", + "company": "Ing. Büro Schrick", + "mad": "0x6001", + "service_provider": "Wittenborg Automaten GmbH", + "system_integrator": "Ing. Büro Schrick" + }, + { + "application": "Elecronic food voucher", + "company": "GRUPO VR", + "mad": "0x6002", + "service_provider": "Grupo VR", + "system_integrator": "" + }, + { + "application": "Elecronic supermarket voucher", + "company": "GRUPO VR", + "mad": "0x6003", + "service_provider": "Gruop VR", + "system_integrator": "" + }, + { + "application": "Access controll security payment", + "company": "Matsushita Communication Industrial", + "mad": "0x6004", + "service_provider": "Matsushita Communication", + "system_integrator": "Matsushita Communication" + }, + { + "application": "Electronic food voucher", + "company": "Smart Net Brasil LTDA", + "mad": "0x6005", + "service_provider": "Smart.net Brasil LTDA", + "system_integrator": "Smart.net Brasil LTDA" + }, + { + "application": "Electronic food voucher", + "company": "Smart Net Brasil LTDA", + "mad": "0x6006", + "service_provider": "Smart.net Brasil LTDA", + "system_integrator": "Smart.net Brasil LTDA" + }, + { + "application": "Electronic food voucher", + "company": "Smart Net Brasil LTDA", + "mad": "0x6007", + "service_provider": "Smart.net Brasil LTDA", + "system_integrator": "Smart.net Brasil LTDA" + }, + { + "application": "Electronic food voucher", + "company": "Smart Net Brasil LTDA", + "mad": "0x6008", + "service_provider": "Smart.net Brasil LTDA", + "system_integrator": "Smart.net Brasil LTDA" + }, + { + "application": "Company services, access & sec control, electronic purse...", + "company": "Cominfo a.s.", + "mad": "0x6009", + "service_provider": "Cominfo", + "system_integrator": "Cominfo" + }, + { + "application": "Cshless Payment f. catering/vending", + "company": "VMC House", + "mad": "0x600A", + "service_provider": "VMC", + "system_integrator": "VMC" + }, + { + "application": "Food services", + "company": "Emcard a.s.", + "mad": "0x600B", + "service_provider": "EMCARD, a.s.", + "system_integrator": "EMTEST, a.s." + }, + { + "application": "Academic services, food", + "company": "FH Studienbetriebs GmbH", + "mad": "0x600C", + "service_provider": "FH 00E Studienbetriebs GmbH, HSSE", + "system_integrator": "FH 00E Studienbetriebs GmbH, HSSE" + }, + { + "application": "Academic services, food", + "company": "FH Studienbetriebs GmbH", + "mad": "0x600D", + "service_provider": "FH 00E Studienbetriebs GmbH, HSSE", + "system_integrator": "FH 00E Studienbetriebs GmbH, HSSE" + }, + { + "application": "Menue@web", + "company": "Hofmann Menü-Manufaktur GmbH", + "mad": "0x600F", + "service_provider": "Hofmann Menü-Manufaktur GmbH", + "system_integrator": "Hofmann Menü-Manufaktur GmbH" + }, + { + "application": "Food, Payment in restaurant for employees", + "company": "AB Angpanneföreningen", + "mad": "0x6010", + "service_provider": "AB Angpanneföreningen", + "system_integrator": "AB Angpanneföreningen" + }, + { + "application": "Vending", + "company": "Dallmayr Card Systeme Gmbh", + "mad": "0x6011", + "service_provider": "Dallmayr Card Systeme Gmbh", + "system_integrator": "Dallmayr Card Systeme Gmbh" + }, + { + "application": "Vending", + "company": "Dallmayr Card Systeme Gmbh", + "mad": "0x6012", + "service_provider": "Dallmayr Card Systeme Gmbh", + "system_integrator": "Dallmayr Card Systeme Gmbh" + }, + { + "application": "Vending", + "company": "Dallmayr Card Systeme Gmbh", + "mad": "0x6013", + "service_provider": "Dallmayr Card Systeme Gmbh", + "system_integrator": "Dallmayr Card Systeme Gmbh" + }, + { + "application": "Vending", + "company": "Dallmayr Card Systeme Gmbh", + "mad": "0x6014", + "service_provider": "Dallmayr Card Systeme Gmbh", + "system_integrator": "Dallmayr Card Systeme Gmbh" + }, + { + "application": "Food Vending and control", + "company": "N&W Innovative Solutions", + "mad": "0x6015", + "service_provider": "N&W", + "system_integrator": "N&W" + }, + { + "application": "Food Vending and control", + "company": "N&W Innovative Solutions", + "mad": "0x6016", + "service_provider": "N&W", + "system_integrator": "N&W" + }, + { + "application": "Food Vending and control", + "company": "N&W Innovative Solutions", + "mad": "0x6017", + "service_provider": "N&W", + "system_integrator": "N&W" + }, + { + "application": "Food Vending and control", + "company": "N&W Innovative Solutions", + "mad": "0x6018", + "service_provider": "N&W", + "system_integrator": "N&W" + }, + { + "application": "Retail identification and customer loyalty", + "company": "Unisys New Zealand Ltd", + "mad": "0x6801", + "service_provider": "Unisys", + "system_integrator": "Unisys" + }, + { + "application": "Access control, time attendance, bus ticket, hotel room card, VIP card f. club", + "company": "Giga-TMS Inc", + "mad": "0x7001", + "service_provider": "Giga TMS", + "system_integrator": "Giga TMS" + }, + { + "application": "Company services, access & sec control, electronic purse...", + "company": "Cominfo a.s.", + "mad": "0x7002", + "service_provider": "Cominfo", + "system_integrator": "Cominfo" + }, + { + "application": "Car parking, sport applic, hotel, access control systems", + "company": "DATASEC Electronic GmbH", + "mad": "0x7003", + "service_provider": "Datasec", + "system_integrator": "Datatsec" + }, + { + "application": "Hotel, acces control & security", + "company": "Talleres De Escoriaza S.A.", + "mad": "0x7004", + "service_provider": "Talleres", + "system_integrator": "Talleres" + }, + { + "application": "Energy Saving System For Hotels, Access Control", + "company": "ENKOA System", + "mad": "0x7005", + "service_provider": "Enkoa System S.L.", + "system_integrator": "Enkoa System S.L." + }, + { + "application": "Hotel, access contr. & sec", + "company": "Vingcard a.s.", + "mad": "0x7006", + "service_provider": "Vingcard", + "system_integrator": "Vingcard" + }, + { + "application": "Hotel, access contr. & sec", + "company": "Vingcard a.s.", + "mad": "0x7007", + "service_provider": "Vingcard", + "system_integrator": "Vingcard" + }, + { + "application": "Multi Application Purse - Access-Parking", + "company": "MCF RF TECH SRL", + "mad": "0x7008", + "service_provider": "MCF RF TECH S.R.L.", + "system_integrator": "MCF RF TECH S.R.L." + }, + { + "application": "Access control data for electronic locks", + "company": "Timelox AB", + "mad": "0x7009", + "service_provider": "Timelox AB", + "system_integrator": "Timelox AB" + }, + { + "application": "Energy Saving System", + "company": "ENKOA System", + "mad": "0x700A", + "service_provider": "ENKOA System S.L.", + "system_integrator": "ENKOA System S.L." + }, + { + "application": "Energy Saving System", + "company": "ENKOA System", + "mad": "0x700B", + "service_provider": "ENKOA System S.L.", + "system_integrator": "ENKOA System S.L." + }, + { + "application": "Energy Saving System", + "company": "ENKOA System", + "mad": "0x700C", + "service_provider": "ENKOA System S.L.", + "system_integrator": "ENKOA System S.L." + }, + { + "application": "Hotel", + "company": "SIT Solution for IT Payment GmbH", + "mad": "0x700D", + "service_provider": "SIT Solution for IT Payment GmbH", + "system_integrator": "SIT Solution for IT Payment GmbH" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7502", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7503", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7504", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7505", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7506", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7507", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7508", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7509", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x750A", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x750B", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x750C", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x750D", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x750E", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x750F", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7510", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7511", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7512", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7513", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7514", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7515", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7516", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7517", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7518", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7519", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x751A", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x751B", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x751C", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x751D", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x751E", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x751F", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7520", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional id card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7521", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7522", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7523", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7524", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7525", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7526", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7527", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7528", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7529", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x752A", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x752B", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x752C", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x752D", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x752E", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x752F", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7530", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7531", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7532", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7533", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7534", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7535", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7536", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7537", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7538", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7539", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x753A", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x753B", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x753C", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x753D", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x753E", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x753F", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7540", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Multifunctional ID Card", + "company": "Fraport AG - Frankfurt Airport Services Worldwide", + "mad": "0x7541", + "service_provider": "Fraport AG", + "system_integrator": "Fraport AG" + }, + { + "application": "Access and tiketting system for car sharing", + "company": "Mobility Car Sharing", + "mad": "0x7801", + "service_provider": "Bw-digitronik ag", + "system_integrator": "bw-digitronik ag" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x7901", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x7902", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x7903", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x7904", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x7905", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x7906", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x7907", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x7908", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x7909", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x790A", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x790B", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x790C", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x790D", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x790E", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x790F", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Rijkspas an accescard for Dutch governemental ministries and agencies", + "company": "ICTU", + "mad": "0x7910", + "service_provider": "ICTU", + "system_integrator": "ICTU" + }, + { + "application": "Tollway", + "company": "VFJ Technology Pty Ltd", + "mad": "0x8001", + "service_provider": "Austream", + "system_integrator": "Austream" + }, + { + "application": "Access control system, time & attendance system", + "company": "Custom Micro Products Ltd.", + "mad": "0x8002", + "service_provider": "Custom Micro Products Ltd", + "system_integrator": "Custom Micro Products Ltd" + }, + { + "application": "Busticketing System", + "company": "VFJ Technology Pty Ltd", + "mad": "0x8003", + "service_provider": "King Man County Public Traffic", + "system_integrator": "Barouh Electronic Co." + }, + { + "application": "Building Management System", + "company": "VFJ Technology Pty Ltd", + "mad": "0x8004", + "service_provider": "VFJ Hong Kong", + "system_integrator": "VFJ Hong Kong" + }, + { + "application": "Security and safty services", + "company": "Staat der Nederlanden, Ministerie van Financien Belastingdienst/Centrum voor facilitaire dienstverlening", + "mad": "0x8006", + "service_provider": "Siemens Nederland BV", + "system_integrator": "Siemens Nederland BV" + }, + { + "application": "Zeiterfassung, Werks- bzw. Gebäudezutritt", + "company": "Voestalpine Informationstechnologie GmbH", + "mad": "0x8007", + "service_provider": "Voestalpine Informationstechnologie GmbH", + "system_integrator": "Voestalpine Informationstechnologie GmbH" + }, + { + "application": "Accesss control in sport stadiums and e-purse", + "company": "FortressGb", + "mad": "0x8008", + "service_provider": "FORTRESSGB", + "system_integrator": "FORTRESSGB" + }, + { + "application": "Personal social status information", + "company": "Civil Registry Agency of the Ministry of Justice of Georgia", + "mad": "0x8009", + "service_provider": "Civil Registry Agency of the Ministry of Justice of Georgia", + "system_integrator": "" + }, + { + "application": "Bargeldlose Abrechnungs-Systeme für Casino- u. Gemeinschaftsverpflegung", + "company": "EKS GmbH", + "mad": "0x8801", + "service_provider": "", + "system_integrator": "EKS GmbH" + }, + { + "application": "Tollway system", + "company": "VFJ Technology Pty Ltd", + "mad": "0x8802", + "service_provider": "VFJ Technology Pty Ltd", + "system_integrator": "Chendu Shuguang Optical Fibre Network (Ltd. China)" + }, + { + "application": "Tollway system", + "company": "VFJ Technology Pty Ltd", + "mad": "0x8803", + "service_provider": "VFJ Technology Pty Ltd", + "system_integrator": "Chendu Shuguang Optical Fibre Network (Ltd. China)" + }, + { + "application": "Automatic Fare Collection city and intercity bus traffic electronic purse", + "company": "Trgovina in Informatika d.o.o.", + "mad": "0x8804", + "service_provider": "Fourth Way - Alpetour", + "system_integrator": "Fourth Way" + }, + { + "application": "Employer indentification card", + "company": "VFJ Technology Pty Ltd", + "mad": "0x8805", + "service_provider": "VFJ Electronics Pty Ltd.", + "system_integrator": "VFJ Electronics PTy Ltd." + }, + { + "application": "City Transport (Metro ticketing, bus ticket)", + "company": "VFJ Technology Pty Ltd", + "mad": "0x8806", + "service_provider": "VFJ Electronic Pty Ltd.", + "system_integrator": "Cubic - VFJ" + }, + { + "application": "Time attandence, access control + security, electronic purse, plant data collection", + "company": "LNI Ingenieurgesellschaft für Kommunikationstechnik mbH", + "mad": "0x8807", + "service_provider": "LNI GmbH", + "system_integrator": "LNI GmbH" + }, + { + "application": "Intelligent Estate Management System", + "company": "Rax Comm Systems Limited", + "mad": "0x8808", + "service_provider": "Rax Comm Systems Limited", + "system_integrator": "Rax Comm Systems Limited" + }, + { + "application": "Tollway", + "company": "VFJ Technology Pty Ltd", + "mad": "0x8809", + "service_provider": "Xiamto Lintong Tollway", + "system_integrator": "" + }, + { + "application": "Tollway", + "company": "VFJ Technology Pty Ltd", + "mad": "0x880A", + "service_provider": "Xiamto Lintong Tollway", + "system_integrator": "" + }, + { + "application": "Access Controll, Security Electronic Purse, Ski-Ticketing, Ticketing", + "company": "*Siemens ANL", + "mad": "0x880B", + "service_provider": "", + "system_integrator": "Siemens AG" + }, + { + "application": "DEM Komponenten für Zutrittskontrolle, Zeiterfassung, Betribsdatenerfassung, Kantine, Automaten, Tankdatenerf.", + "company": "Phg Peter Hengstler GmbH", + "mad": "0x880C", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Electronic Purse for Casino and comon catering", + "company": "EKS GmbH", + "mad": "0x880D", + "service_provider": "", + "system_integrator": "EKS" + }, + { + "application": "OEM-Komponenten für Zutrittskontrolle, Zeiterfassung, elektr. Geldbörse,...", + "company": "Peter Hengstler GmbH + Co KG", + "mad": "0x880E", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "OEM-Komponenten für Zutrittskontrolle, Zeiterfassung, elektr. Geldbörse,...", + "company": "Peter Hengstler GmbH + Co KG", + "mad": "0x880F", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "OEM-Komponenten für Zutrittskontrolle, Zeiterfassung, elektr. Geldbörse,...", + "company": "Peter Hengstler GmbH + Co KG", + "mad": "0x8810", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "OEM-Komponenten für Zutrittskontrolle, Zeiterfassung, elektr. Geldbörse,...", + "company": "Peter Hengstler GmbH + Co KG", + "mad": "0x8811", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "OEM-Komponenten für Zutrittskontrolle, Zeiterfassung, elektr. Geldbörse,...", + "company": "Peter Hengstler GmbH + Co KG", + "mad": "0x8812", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Tollway", + "company": "VFJ Technology Pty Ltd", + "mad": "0x8813", + "service_provider": "Austream", + "system_integrator": "Austream" + }, + { + "application": "Transport Ticketing, E-Purse, Citycard", + "company": "CJS Consultancy Ltd", + "mad": "0x8814", + "service_provider": "", + "system_integrator": "Transmo Citycard Ltd." + }, + { + "application": "Academic Services, Electronic Purse, Access control & security", + "company": "CNA Limited/Rax-Comm Systems Ltd.", + "mad": "0x8815", + "service_provider": "CNA Limited", + "system_integrator": "CNA Limited" + }, + { + "application": "Busticketing System", + "company": "VFJ Technology Pty Ltd", + "mad": "0x8816", + "service_provider": "King Man County Public Traffic", + "system_integrator": "Barouh Electronic Co." + }, + { + "application": "Electronic Purse", + "company": "Counter Solutions Ltd.", + "mad": "0x8817", + "service_provider": "Counter Solutions", + "system_integrator": "Counter Solutions" + }, + { + "application": "Building Management System", + "company": "VFJ Technology Pty Ltd", + "mad": "0x8818", + "service_provider": "VFJ Hong Kong", + "system_integrator": "VFJ Hong Kong" + }, + { + "application": "Weighbridge for trucks", + "company": "VFJ Technology Pty Ltd", + "mad": "0x8819", + "service_provider": "Hardware Systems Sales", + "system_integrator": "" + }, + { + "application": "Access Control, Time & Attendance, E-Purse", + "company": "BALTECH AG", + "mad": "0x881A", + "service_provider": "Baltech", + "system_integrator": "Baltech" + }, + { + "application": "Access control, payment system", + "company": "Maas Systems B.V.", + "mad": "0x881B", + "service_provider": "Maas Systems B.V.", + "system_integrator": "Maas Systems B.V." + }, + { + "application": "Access controll security payment", + "company": "Matsushita Communication Industrial", + "mad": "0x881C", + "service_provider": "Matsushita Communication", + "system_integrator": "Matsushita Communication" + }, + { + "application": "Electronic Purse", + "company": "ITE Smartcard Solutions Limited", + "mad": "0x881D", + "service_provider": "ITE Smartcard", + "system_integrator": "ITE Smartcard" + }, + { + "application": "Electronic purse", + "company": "ADI Ltd.", + "mad": "0x881E", + "service_provider": "Kakitis Ltd", + "system_integrator": "ADI Ltd" + }, + { + "application": "Contactless e-purse", + "company": "Banrisul Processamento de Dados Ltda.", + "mad": "0x881F", + "service_provider": "Banco do Estado do Rio Grande do Sul S/A", + "system_integrator": "Banco do Estado do Rio Grande do Sul S/A" + }, + { + "application": "Contactless e-purse", + "company": "Banrisul Processamento de Dados Ltda.", + "mad": "0x8820", + "service_provider": "Banco do Estado do Rio Grande do Sul S/A", + "system_integrator": "Banco do Estado do Rio Grande do Sul S/A" + }, + { + "application": "Multi functional badge, private application", + "company": "Microtronic AG", + "mad": "0x8821", + "service_provider": "Microtronic AG", + "system_integrator": "Microtronic AG" + }, + { + "application": "Prepaid Electronic Purse", + "company": "Rosan Finance", + "mad": "0x8822", + "service_provider": "Retail Trade & services, Entertainments, Fastfoods, Gazolines etc", + "system_integrator": "Rosan Finance" + }, + { + "application": "Payment Catering", + "company": "Pecusoft Software-Entwicklungsgesellschaft mbH", + "mad": "0x8823", + "service_provider": "Pecusoft GmbH", + "system_integrator": "Pecusoft GmbH" + }, + { + "application": "Access control, time management, electronic wallet", + "company": "Universitaire Ziekenhuizen Leuven", + "mad": "0x8825", + "service_provider": "", + "system_integrator": "GET NV" + }, + { + "application": "Vending cashless prepaid", + "company": "MCF RF TECH SRL", + "mad": "0x8826", + "service_provider": "MCF", + "system_integrator": "MCF" + }, + { + "application": "Electronic purse", + "company": "IPC Systems BV", + "mad": "0x8827", + "service_provider": "IPC", + "system_integrator": "IPC" + }, + { + "application": "Vending System", + "company": "Quality Equipment Benelux B.V.", + "mad": "0x8828", + "service_provider": "Quality Equipment", + "system_integrator": "Quality Equipment" + }, + { + "application": "Electronic purse", + "company": "Hör GmbH & Co.", + "mad": "0x8829", + "service_provider": "Hör GmbH", + "system_integrator": "Hör GmbH" + }, + { + "application": "Electronic purse", + "company": "Tietoenator Energy Components", + "mad": "0x882A", + "service_provider": "Tietoenator", + "system_integrator": "Tietoenator" + }, + { + "application": "Electronic purse", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x882B", + "service_provider": "PBV Kaufmann", + "system_integrator": "PBV Kaufmann" + }, + { + "application": "Electronic purse", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x882C", + "service_provider": "PBV Kaufmann", + "system_integrator": "PBV Kaufmann" + }, + { + "application": "Electronic purse", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x882D", + "service_provider": "PBV Kaufmann", + "system_integrator": "PBV Kaufmann" + }, + { + "application": "Electronic purse", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x882E", + "service_provider": "PBV Kaufmann", + "system_integrator": "PBV Kaufmann" + }, + { + "application": "Electronic purse", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x882F", + "service_provider": "PBV Kaufmann", + "system_integrator": "PBV Kaufmann" + }, + { + "application": "Electronic purse", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x8830", + "service_provider": "PBV Kaufmann", + "system_integrator": "PBV Kaufmann" + }, + { + "application": "Electronic purse", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x8831", + "service_provider": "PBV Kaufmann", + "system_integrator": "PBV Kaufmann" + }, + { + "application": "Electronic purse", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x8832", + "service_provider": "PBV Kaufmann", + "system_integrator": "PBV Kaufmann" + }, + { + "application": "Electronic purse", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x8833", + "service_provider": "PBV Kaufmann", + "system_integrator": "PBV Kaufmann" + }, + { + "application": "Electronic purse", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x8834", + "service_provider": "PBV Kaufmann", + "system_integrator": "PBV Kaufmann" + }, + { + "application": "Computer, car parking, elec. purse, access control & security", + "company": "DECA Engineering", + "mad": "0x8835", + "service_provider": "Deca Engineering", + "system_integrator": "Deca Engineering" + }, + { + "application": "Electronic purse, city traffic", + "company": "Plzeňské MÄ›stské Dopravní Podniky A.S.", + "mad": "0x8836", + "service_provider": "Plzenske Mestske", + "system_integrator": "Plzenske Mestske" + }, + { + "application": "", + "company": "TechID Engineering bv", + "mad": "0x8837", + "service_provider": "Tech ID", + "system_integrator": "Tech ID" + }, + { + "application": "Access control, Time attendanc, job control", + "company": "EM Group", + "mad": "0x8838", + "service_provider": "EM Group", + "system_integrator": "EM Group" + }, + { + "application": "Mass Transportation Ticketing", + "company": "Omnifare", + "mad": "0x8839", + "service_provider": "MBS", + "system_integrator": "MBS" + }, + { + "application": "Electronic purse", + "company": "Copie Monnaie France", + "mad": "0x883A", + "service_provider": "Copie Monnaie France", + "system_integrator": "Copie Monnaie France" + }, + { + "application": "Electronic purse", + "company": "Monet+ a.s.", + "mad": "0x883B", + "service_provider": "Monet+", + "system_integrator": "Monet+" + }, + { + "application": "LUAS - light rail", + "company": "Scheidt & Bachmann", + "mad": "0x883C", + "service_provider": "Scheidt & Bachmann", + "system_integrator": "Scheidt & Bachmann" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x883D", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Railway services, city traffic, electronic purse", + "company": "Czech Railways", + "mad": "0x883E", + "service_provider": "Czech Railways", + "system_integrator": "Czech Railways" + }, + { + "application": "Electronic purse, washing card", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x883F", + "service_provider": "BICA AG", + "system_integrator": "BICA AG" + }, + { + "application": "Electronic purse, washing card", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0x8840", + "service_provider": "BICA AG", + "system_integrator": "BICA AG" + }, + { + "application": "Compelete system for lockers, access control & electr. payment", + "company": "Ojmar S. A.", + "mad": "0x8841", + "service_provider": "", + "system_integrator": "Enkoa System S.L." + }, + { + "application": "City traffic, electronic purse, micellaneous applications", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x8842", + "service_provider": "Koordinator", + "system_integrator": "PVT" + }, + { + "application": "Electronic purse, access control for buliding automation", + "company": "CDE Communication Data Engineering GmbH", + "mad": "0x8843", + "service_provider": "CDE", + "system_integrator": "CDE" + }, + { + "application": "Electronic purse, access control for buliding automation", + "company": "CDE Communication Data Engineering GmbH", + "mad": "0x8844", + "service_provider": "CDE", + "system_integrator": "CDE" + }, + { + "application": "Company services, access & sec control, electronic purse...", + "company": "Cominfo a.s.", + "mad": "0x8845", + "service_provider": "Cominfo", + "system_integrator": "Cominfo" + }, + { + "application": "Cashless payment", + "company": "Contidata Datensysteme GmbH", + "mad": "0x8847", + "service_provider": "Contidata", + "system_integrator": "Contidata" + }, + { + "application": "Electronic purse", + "company": "ADE S.r.l.", + "mad": "0x8848", + "service_provider": "ADE", + "system_integrator": "ADE" + }, + { + "application": "Electronic purse", + "company": "ADE S.r.l.", + "mad": "0x8849", + "service_provider": "ADE", + "system_integrator": "ADE" + }, + { + "application": "Electronic purse", + "company": "ADE S.r.l.", + "mad": "0x884A", + "service_provider": "ADE", + "system_integrator": "ADE" + }, + { + "application": "Electronic purse", + "company": "ADE S.r.l.", + "mad": "0x884B", + "service_provider": "ADE", + "system_integrator": "ADE" + }, + { + "application": "Electronic purse", + "company": "Vesiel SPA", + "mad": "0x884C", + "service_provider": "Vesiel", + "system_integrator": "Vesiel" + }, + { + "application": "Electronic purse", + "company": "Vesiel SPA", + "mad": "0x884D", + "service_provider": "Vesiel", + "system_integrator": "Vesiel" + }, + { + "application": "Electronic purse", + "company": "Vesiel SPA", + "mad": "0x884E", + "service_provider": "Vesiel", + "system_integrator": "Vesiel" + }, + { + "application": "Elec ticketing, access control, electronic purse", + "company": "Empresa 1 Sistemas de Automacao e Comercio", + "mad": "0x884F", + "service_provider": "Empresa 1", + "system_integrator": "Empresa 1" + }, + { + "application": "Electronic purse/loyalty", + "company": "Premier Retail Services LTD", + "mad": "0x8850", + "service_provider": "Premier Retail", + "system_integrator": "Premier Retail" + }, + { + "application": "Electronic purse/loyalty", + "company": "Premier Retail Services LTD", + "mad": "0x8851", + "service_provider": "Premier Retail", + "system_integrator": "Premier Retail" + }, + { + "application": "Electronic purse, carparking system, single use ticket, period pass", + "company": "Emcard a.s.", + "mad": "0x8852", + "service_provider": "Emcard", + "system_integrator": "Emtest" + }, + { + "application": "Access & parking control, electronic purse", + "company": "General Meters Corp", + "mad": "0x8853", + "service_provider": "General Meters", + "system_integrator": "General Meters" + }, + { + "application": "Electronic purse", + "company": "DOPRAVNI PODNIK mest Mostu a Litvinova, a.s.", + "mad": "0x8854", + "service_provider": "Dopravni Podnik mest Mostu a Litvinova, a.s.", + "system_integrator": "Mikroelektronika, spol. sr.o., Kpt. Poplera 55, 565 01 Vysoké Myto, CZ" + }, + { + "application": "Privateive Payment System", + "company": "Aztek", + "mad": "0x8855", + "service_provider": "Aztek", + "system_integrator": "Aztek" + }, + { + "application": "Car Parking, Electronic Purse", + "company": "Haguess s.r.o.", + "mad": "0x8856", + "service_provider": "Haguess, s.r.o.", + "system_integrator": "Haguess, s.r.o." + }, + { + "application": "Electronic purse", + "company": "Emcard a.s.", + "mad": "0x8857", + "service_provider": "EMCARD, a.s.", + "system_integrator": "EMTEST, a.s." + }, + { + "application": "MulitApplicaton Purse", + "company": "MCF RF TECH SRL", + "mad": "0x8858", + "service_provider": "MCF Vending", + "system_integrator": "MCF Vending" + }, + { + "application": "Electr purse f. health services", + "company": "QSI", + "mad": "0x8859", + "service_provider": "QSI", + "system_integrator": "QSI" + }, + { + "application": "Closed elc. purse", + "company": "Siemens AG Österreich", + "mad": "0x885A", + "service_provider": "Siemens", + "system_integrator": "Siemens" + }, + { + "application": "Copy machine", + "company": "BCM Bureautique", + "mad": "0x885B", + "service_provider": "BCM Bureautique", + "system_integrator": "BCM Bureautique, Mr. Larbi Seridj" + }, + { + "application": "Transit SmartCard System, City E-purse System", + "company": "Intelligent Transaction Systems de Mexico S.A. de C.V.", + "mad": "0x885C", + "service_provider": "St. John's Transportation Commission", + "system_integrator": "Intelligent Transaction Systems de Mexico" + }, + { + "application": "Electronic purse, city traffic, customer profile, service applic, check-in/out applic", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x885D", + "service_provider": "Mikroelektronika", + "system_integrator": "Mikroelektronika" + }, + { + "application": "Payment, payment OEM, payment partner, entertainment, OEM data", + "company": "Payment Solution AG", + "mad": "0x885E", + "service_provider": "Payment Solution AG", + "system_integrator": "Payment Solution AG" + }, + { + "application": "Payment, payment OEM, payment partner, entertainment, OEM data", + "company": "Payment Solution AG", + "mad": "0x885F", + "service_provider": "Payment Solution AG", + "system_integrator": "Payment Solution AG" + }, + { + "application": "Payment, payment OEM, payment partner, entertainment, OEM data", + "company": "Payment Solution AG", + "mad": "0x8860", + "service_provider": "Payment Solution AG", + "system_integrator": "Payment Solution AG" + }, + { + "application": "E-Purse", + "company": "PT Visionet Internasional", + "mad": "0x8861", + "service_provider": "Visionet", + "system_integrator": "Multipolar" + }, + { + "application": "E-Purse", + "company": "PT Visionet Internasional", + "mad": "0x8862", + "service_provider": "Visionet", + "system_integrator": "Multipolar" + }, + { + "application": "E-Purse", + "company": "PT Visionet Internasional", + "mad": "0x8863", + "service_provider": "Visionet", + "system_integrator": "Multipolar" + }, + { + "application": "Electronic purse", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x8864", + "service_provider": "Siemens Itron Business Services S.A. - Cordoba, Republica Argentina", + "system_integrator": "Siemens Itron Business Services S.A. - Cordoba, Republica Argentina" + }, + { + "application": "Cashless Payment System", + "company": "Infineer", + "mad": "0x8865", + "service_provider": "Infineer", + "system_integrator": "" + }, + { + "application": "Cashless Payment System", + "company": "Infineer", + "mad": "0x8866", + "service_provider": "Infineer", + "system_integrator": "" + }, + { + "application": "Self service kiosk application (ordering and printing photos)", + "company": "CeWe Color AG & Co OHG", + "mad": "0x8867", + "service_provider": "CeWe Color AG & Co OHG", + "system_integrator": "CeWe Color AG & Co OHG" + }, + { + "application": "Self service kiosk application (ordering and printing photos)", + "company": "CeWe Color AG & Co OHG", + "mad": "0x8868", + "service_provider": "CeWe Color AG & Co OHG", + "system_integrator": "CeWe Color AG & Co OHG" + }, + { + "application": "Multiapplication Purse", + "company": "MCF RF TECH SRL", + "mad": "0x8869", + "service_provider": "MCF RF TECH S.R.L.", + "system_integrator": "MCF RF TECH S.R.L." + }, + { + "application": "Vending-Cashless_prepaid", + "company": "MCF RF TECH SRL", + "mad": "0x886A", + "service_provider": "MCF RF TECH S.R.L.", + "system_integrator": "MCF RF TECH S.R.L." + }, + { + "application": "Online Electronic Payment System", + "company": "PinCash International", + "mad": "0x886B", + "service_provider": "Pincash international BV", + "system_integrator": "Pincash international BV" + }, + { + "application": "E-Money Application", + "company": "SQuidcard Ltd", + "mad": "0x886C", + "service_provider": "Squidcard Limited", + "system_integrator": "Applied Card Technologies Ltd" + }, + { + "application": "E-purse", + "company": "Asdion Berhad", + "mad": "0x886D", + "service_provider": "Asdion Berhad", + "system_integrator": "Asdion Berhad" + }, + { + "application": "MIFARE based payment system", + "company": "supercard as", + "mad": "0x886E", + "service_provider": "Supercard as", + "system_integrator": "supercard as" + }, + { + "application": "Electronic purse", + "company": "Group Capmonetique", + "mad": "0x886F", + "service_provider": "CARTAX", + "system_integrator": "MONECARTE" + }, + { + "application": "Electronic purse", + "company": "Group Capmonetique", + "mad": "0x8870", + "service_provider": "SEDECO", + "system_integrator": "MONECARTE" + }, + { + "application": "Electronic purse", + "company": "Group Capmonetique", + "mad": "0x8871", + "service_provider": "MONECARTE", + "system_integrator": "MONECARTE" + }, + { + "application": "Eectronic purse for CROUS", + "company": "Group Capmonetique", + "mad": "0x8872", + "service_provider": "MONECARTE", + "system_integrator": "MONECARTE" + }, + { + "application": "Copier vending Follow-Me Printing", + "company": "Xafax Nederland BV", + "mad": "0x8873", + "service_provider": "Xafax Nederland", + "system_integrator": "Xafax Nederland" + }, + { + "application": "Copier vending Follow-Me Printing", + "company": "Xafax Nederland BV", + "mad": "0x8874", + "service_provider": "Xafax Nederland", + "system_integrator": "Xafax Nederland" + }, + { + "application": "Epurse", + "company": "KORID LK, spol. s r.o", + "mad": "0x8875", + "service_provider": "KORID LK, spol.s.r.o.", + "system_integrator": "KORID LK, spol.s.r.o." + }, + { + "application": "Electronic purse", + "company": "Mikroelektronika GmbH", + "mad": "0x8876", + "service_provider": "MIKROELEKTRONIKA spol.s.r.o., Draby 849, Vysoke Myto 56601, Czech Republic", + "system_integrator": "MIKROELEKTRONIKA spol.s.r.o., Draby 849, Vysoke Myto 56601, Czech Republic" + }, + { + "application": "Electronic payment", + "company": "Dallmayr Card Systeme Gmbh", + "mad": "0x8877", + "service_provider": "Dallmayr Card Systeme Gmbh", + "system_integrator": "Dallmayr Card Systeme Gmbh" + }, + { + "application": "Electronic payment", + "company": "Dallmayr Card Systeme Gmbh", + "mad": "0x8878", + "service_provider": "Dallmayr Card Systeme Gmbh", + "system_integrator": "Dallmayr Card Systeme Gmbh" + }, + { + "application": "Electronic payment", + "company": "Dallmayr Card Systeme Gmbh", + "mad": "0x8879", + "service_provider": "Dallmayr Card Systeme Gmbh", + "system_integrator": "Dallmayr Card Systeme Gmbh" + }, + { + "application": "Electronic payment", + "company": "Dallmayr Card Systeme Gmbh", + "mad": "0x887A", + "service_provider": "Dallmayr Card Systeme Gmbh", + "system_integrator": "Dallmayr Card Systeme Gmbh" + }, + { + "application": "Electronic purse", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x887B", + "service_provider": "ZAGREBACKI Holding d.o.o.", + "system_integrator": "MIKROELEKTRONIKA spol.s.r.o." + }, + { + "application": "Electronic purse", + "company": "Mikroelektronika GmbH", + "mad": "0x887C", + "service_provider": "MIKROELEKTRONIKA spol.s.r.o.", + "system_integrator": "MIKROELEKTRONIKA spol.s.r.o." + }, + { + "application": "Electronic purse", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x887D", + "service_provider": "Mikroelektronika spol.s r.o", + "system_integrator": "Mikroelektronika spol.s r.o" + }, + { + "application": "Electronic Purse", + "company": "Electronic and Software Engineering Limited (EASEL)", + "mad": "0x887E", + "service_provider": "EASEL", + "system_integrator": "EASEL" + }, + { + "application": "Contactless payment", + "company": "Chess embedded Technology", + "mad": "0x887F", + "service_provider": "Chess", + "system_integrator": "Chess" + }, + { + "application": "Electronic purse", + "company": "WIGOTEK, Hardware Software Beratung", + "mad": "0x8880", + "service_provider": "WIGOTEK", + "system_integrator": "WIGOTEK" + }, + { + "application": "Electronic purse", + "company": "WIGOTEK, Hardware Software Beratung", + "mad": "0x8881", + "service_provider": "WIGOTEK", + "system_integrator": "WIGOTEK" + }, + { + "application": "Electronic purse", + "company": "ENKOA System", + "mad": "0x8882", + "service_provider": "ENKOA System S.L.", + "system_integrator": "ENKOA System S.L." + }, + { + "application": "Electronic payment", + "company": "Alcatel-Lucent Bell NV", + "mad": "0x8883", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Electronic payment", + "company": "Alcatel-Lucent Bell NV", + "mad": "0x8884", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Electronic payment", + "company": "Alcatel-Lucent Bell NV", + "mad": "0x8885", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Vending control systems - point, cash purse", + "company": "Unicard S.A.", + "mad": "0x8886", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "Vending control systems - point, cash purse", + "company": "Unicard S.A.", + "mad": "0x8887", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "Vending control systems - point, cash purse", + "company": "Unicard S.A.", + "mad": "0x8888", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "Electronic purse", + "company": "Inepro BV", + "mad": "0x8889", + "service_provider": "Inepro BV", + "system_integrator": "" + }, + { + "application": "Electronic purse", + "company": "Inepro BV", + "mad": "0x888A", + "service_provider": "Inepro BV", + "system_integrator": "" + }, + { + "application": "Electronic purse", + "company": "Inepro BV", + "mad": "0x888B", + "service_provider": "Inepro BV", + "system_integrator": "" + }, + { + "application": "Electronic purse", + "company": "Inepro BV", + "mad": "0x888C", + "service_provider": "Inepro BV", + "system_integrator": "" + }, + { + "application": "Electronic purse", + "company": "Inepro BV", + "mad": "0x888D", + "service_provider": "Inepro BV", + "system_integrator": "" + }, + { + "application": "Electronic purse", + "company": "Inepro BV", + "mad": "0x888E", + "service_provider": "Inepro BV", + "system_integrator": "" + }, + { + "application": "Electronic purse", + "company": "Inepro BV", + "mad": "0x888F", + "service_provider": "Inepro BV", + "system_integrator": "" + }, + { + "application": "Electronic purse", + "company": "Inepro BV", + "mad": "0x8890", + "service_provider": "Inepro BV", + "system_integrator": "" + }, + { + "application": "Electronic purse", + "company": "Inepro BV", + "mad": "0x8891", + "service_provider": "Inepro BV", + "system_integrator": "" + }, + { + "application": "Electronic purse", + "company": "Inepro BV", + "mad": "0x8892", + "service_provider": "Inepro BV", + "system_integrator": "" + }, + { + "application": "Electronic purse for use in proprietary closed system", + "company": "Absec Malaysia SDN BHD", + "mad": "0x8893", + "service_provider": "Absec Malaysia SDN BHD", + "system_integrator": "MLGN Solutions Ltd" + }, + { + "application": "Electronic purse for use in proprietary closed system", + "company": "Absec Malaysia SDN BHD", + "mad": "0x8894", + "service_provider": "Absec Malaysia SDN BHD", + "system_integrator": "MLGN Solutions Ltd" + }, + { + "application": "Electronic purse", + "company": "Koordinator ODIS s.r.o.", + "mad": "0x8895", + "service_provider": "KOORDINATOR ODIS s.r.o.", + "system_integrator": "KOORDINATOR ODIS s.r.o." + }, + { + "application": "Service application for municipal chip card - customer profile (registration) - validity of card (registration)", + "company": "Plzeňské MÄ›stské Dopravní Podniky A.S.", + "mad": "0x8896", + "service_provider": "Plzeňské MÄ›stské Dopravní Podniky A.S.", + "system_integrator": "Plzeňské MÄ›stské Dopravní Podniky A.S." + }, + { + "application": "Electronic purse", + "company": "Mikroelektronika spol.s r.o.", + "mad": "0x8897", + "service_provider": "Jamaica Urban Transit Company Ltd", + "system_integrator": "Mikroelektronika spol.s r.o" + }, + { + "application": "Open cashfile electronic purse", + "company": "Ingenieurbüro Ludwig - Ib Ludwig", + "mad": "0x8898", + "service_provider": "OCF open Cashfile", + "system_integrator": "OCF open Cashfile members" + }, + { + "application": "Open cashfile electronic purse", + "company": "Ingenieurbüro Ludwig - Ib Ludwig", + "mad": "0x8899", + "service_provider": "OCF open Cashfile", + "system_integrator": "OCF open Cashfile members" + }, + { + "application": "Open cashfile electronic purse", + "company": "Ingenieurbüro Ludwig - Ib Ludwig", + "mad": "0x889A", + "service_provider": "OCF open Cashfile", + "system_integrator": "OCF open Cashfile members" + }, + { + "application": "Open cashfile electronic purse", + "company": "Ingenieurbüro Ludwig - Ib Ludwig", + "mad": "0x889B", + "service_provider": "OCF open Cashfile", + "system_integrator": "OCF open Cashfile members" + }, + { + "application": "Open cashfile electronic purse", + "company": "Ingenieurbüro Ludwig - Ib Ludwig", + "mad": "0x889C", + "service_provider": "OCF open Cashfile", + "system_integrator": "OCF open Cashfile members" + }, + { + "application": "Open cashfile electronic purse", + "company": "Ingenieurbüro Ludwig - Ib Ludwig", + "mad": "0x889D", + "service_provider": "OCF open Cashfile", + "system_integrator": "OCF open Cashfile members" + }, + { + "application": "Payment system - electronic purse", + "company": "N&W Innovative Solutions", + "mad": "0x889E", + "service_provider": "N&W", + "system_integrator": "N&W" + }, + { + "application": "Payment system - electronic purse", + "company": "N&W Innovative Solutions", + "mad": "0x889F", + "service_provider": "N&W", + "system_integrator": "N&W" + }, + { + "application": "Payment system - electronic purse", + "company": "N&W Innovative Solutions", + "mad": "0x88A0", + "service_provider": "N&W", + "system_integrator": "N&W" + }, + { + "application": "Payment system - electronic purse", + "company": "N&W Innovative Solutions", + "mad": "0x88A1", + "service_provider": "N&W", + "system_integrator": "N&W" + }, + { + "application": "Contactless payment", + "company": "Rabobank International", + "mad": "0x88A2", + "service_provider": "Rabobank", + "system_integrator": "Rabobank" + }, + { + "application": "Contactless payment", + "company": "Amsterdam Arena", + "mad": "0x88A3", + "service_provider": "Amsterdam Arena", + "system_integrator": "Amsterdam Arena" + }, + { + "application": "Contactless payment", + "company": "Multicard", + "mad": "0x88A4", + "service_provider": "MULTICARD", + "system_integrator": "MULTICARD" + }, + { + "application": "Electronic purse", + "company": "ODP-software s.r.o.", + "mad": "0x88A5", + "service_provider": "ODP-software", + "system_integrator": "ODP-software" + }, + { + "application": "Electronic purse", + "company": "ODP-software s.r.o.", + "mad": "0x88A6", + "service_provider": "ODP-software", + "system_integrator": "ODP-software" + }, + { + "application": "Electronic purse", + "company": "SIT Solution for IT Payment GmbH", + "mad": "0x88A7", + "service_provider": "SIT Solution for IT Payment GmbH", + "system_integrator": "SIT Solution for IT Payment GmbH" + }, + { + "application": "Accesss control in sport stadiums and e-purse", + "company": "FortressGb", + "mad": "0x88AB", + "service_provider": "FORTRESSGB", + "system_integrator": "FORTRESSGB" + }, + { + "application": "Smart City Card \\Schwabencard\"\"", + "company": "Cosmo.id GmbH", + "mad": "0x88AC", + "service_provider": "Cosmo.id", + "system_integrator": "Cosmo.id" + }, + { + "application": "Electronic purse", + "company": "OREDO s.r.o", + "mad": "0x88AD", + "service_provider": "OREDO s.r.o", + "system_integrator": "OREDO s.r.o" + }, + { + "application": "Electronic purse", + "company": "OREDO s.r.o", + "mad": "0x88AE", + "service_provider": "OREDO s.r.o", + "system_integrator": "OREDO s.r.o" + }, + { + "application": "Electronic purse", + "company": "Ústecky kraj", + "mad": "0x88AF", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Electronic purse", + "company": "Ústecky kraj", + "mad": "0x88B0", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Electronic purse", + "company": "TELMAX s.r.o.", + "mad": "0x88B1", + "service_provider": "TELMAX s.r.o.", + "system_integrator": "TELMAX s.r.o." + }, + { + "application": "Contactless Card for payment operations in Kiosk Payment system", + "company": "Sistemas Tecnicos de Cobro S.L.", + "mad": "0x88B2", + "service_provider": "Sistemas Tecnicos de Cobro S.L.", + "system_integrator": "Sistemas Tecnicos de Cobro S.L." + }, + { + "application": "Access control, canteen functionality", + "company": "Elektroniske Betalings Systemer AS", + "mad": "0x88B3", + "service_provider": "Elektroniske Betalings Systemer AS", + "system_integrator": "Elektroniske Betalings Systemer AS" + }, + { + "application": "Electronic purse", + "company": "HUG-Witschi AG", + "mad": "0x88B4", + "service_provider": "HUG-Witschi AG", + "system_integrator": "HUG-Witschi AG" + }, + { + "application": "Electronic purse", + "company": "HUG-Witschi AG", + "mad": "0x88B5", + "service_provider": "HUG-Witschi AG", + "system_integrator": "HUG-Witschi AG" + }, + { + "application": "Electronic purse", + "company": "HUG-Witschi AG", + "mad": "0x88B6", + "service_provider": "HUG-Witschi AG", + "system_integrator": "HUG-Witschi AG" + }, + { + "application": "Electronic purse", + "company": "HUG-Witschi AG", + "mad": "0x88B7", + "service_provider": "HUG-Witschi AG", + "system_integrator": "HUG-Witschi AG" + }, + { + "application": "FIDELIO CRUISE ship property management system, - materials management system, - meal counting system", + "company": "FIDELIO CRUISE SOFTWARE GMBH", + "mad": "0x9101", + "service_provider": "FIDELIO CRUISE SOFTWARE GMBH", + "system_integrator": "FIDELIO CRUISE SOFTWARE GMBH" + }, + { + "application": "FIDELIO CRUISE ship property management system, - materials management system, - meal counting system", + "company": "FIDELIO CRUISE SOFTWARE GMBH", + "mad": "0x9102", + "service_provider": "FIDELIO CRUISE SOFTWARE GMBH", + "system_integrator": "FIDELIO CRUISE SOFTWARE GMBH" + }, + { + "application": "FIDELIO CRUISE ship property management system, - materials management system, - meal counting system", + "company": "FIDELIO CRUISE SOFTWARE GMBH", + "mad": "0x9103", + "service_provider": "FIDELIO CRUISE SOFTWARE GMBH", + "system_integrator": "FIDELIO CRUISE SOFTWARE GMBH" + }, + { + "application": "General / NXP Test / Graz", + "company": "Philips Semiconductors Gratkorn GmbH", + "mad": "0x9502", + "service_provider": "NXP", + "system_integrator": "NXP" + }, + { + "application": "General / NXP Test / Graz", + "company": "Philips Semiconductors Gratkorn GmbH", + "mad": "0x9503", + "service_provider": "NXP", + "system_integrator": "NXP" + }, + { + "application": "General / NXP Test / Graz", + "company": "Philips Semiconductors Gratkorn GmbH", + "mad": "0x9504", + "service_provider": "NXP", + "system_integrator": "NXP" + }, + { + "application": "Prepaid Meteringh, service functions of technical systems", + "company": "Engelmann Sensor GmbH", + "mad": "0x9702", + "service_provider": "Engelmann Sensor GmbH", + "system_integrator": "Engelmann Sensor GmbH" + }, + { + "application": "Prepaid Meteringh, service functions of technical systems", + "company": "Engelmann Sensor GmbH", + "mad": "0x9703", + "service_provider": "Engelmann Sensor GmbH", + "system_integrator": "Engelmann Sensor GmbH" + }, + { + "application": "Prepaid Meteringh, service functions of technical systems", + "company": "Engelmann Sensor GmbH", + "mad": "0x9704", + "service_provider": "Engelmann Sensor GmbH", + "system_integrator": "Engelmann Sensor GmbH" + }, + { + "application": "Prepaid Meteringh, service functions of technical systems", + "company": "Engelmann Sensor GmbH", + "mad": "0x9705", + "service_provider": "Engelmann Sensor GmbH", + "system_integrator": "Engelmann Sensor GmbH" + }, + { + "application": "Prepaid Meteringh, service functions of technical systems", + "company": "Engelmann Sensor GmbH", + "mad": "0x9706", + "service_provider": "Engelmann Sensor GmbH", + "system_integrator": "Engelmann Sensor GmbH" + }, + { + "application": "Prepaid Meteringh, service functions of technical systems", + "company": "Engelmann Sensor GmbH", + "mad": "0x9707", + "service_provider": "Engelmann Sensor GmbH", + "system_integrator": "Engelmann Sensor GmbH" + }, + { + "application": "Prepaid Meteringh, service functions of technical systems", + "company": "Engelmann Sensor GmbH", + "mad": "0x9708", + "service_provider": "Engelmann Sensor GmbH", + "system_integrator": "Engelmann Sensor GmbH" + }, + { + "application": "Health services", + "company": "Rosan Finance", + "mad": "0xA001", + "service_provider": "Express Card", + "system_integrator": "Express Card" + }, + { + "application": "Card holders vital medical data", + "company": "Rosan Finance", + "mad": "0xA002", + "service_provider": "Medical Org.", + "system_integrator": "Rosan Finance" + }, + { + "application": "Identification of card holder", + "company": "Rosan Finance", + "mad": "0xA003", + "service_provider": "Hospitals Cllinics Drug Stores", + "system_integrator": "Rosan Finance" + }, + { + "application": "Medical information", + "company": "CYNAPS", + "mad": "0xA004", + "service_provider": "Cynaps", + "system_integrator": "Cynaps" + }, + { + "application": "Medical information", + "company": "CYNAPS", + "mad": "0xA005", + "service_provider": "Cynaps", + "system_integrator": "Cynaps" + }, + { + "application": "Medical information", + "company": "CYNAPS", + "mad": "0xA006", + "service_provider": "Cynaps", + "system_integrator": "Cynaps" + }, + { + "application": "Medical information", + "company": "CYNAPS", + "mad": "0xA007", + "service_provider": "Cynaps", + "system_integrator": "Cynaps" + }, + { + "application": "Medical information", + "company": "CYNAPS", + "mad": "0xA008", + "service_provider": "Cynaps", + "system_integrator": "Cynaps" + }, + { + "application": "Access control & security, city traffic, sports & entertainment", + "company": "IP Core", + "mad": "0xA009", + "service_provider": "IP Core", + "system_integrator": "IP Core" + }, + { + "application": "Self service, pharmacy, medicine issue", + "company": "EnzoSystems BV", + "mad": "0xA00A", + "service_provider": "EnzoSystems", + "system_integrator": "EnzoSystems" + }, + { + "application": "Health Services", + "company": "QSI", + "mad": "0xA00B", + "service_provider": "QSI", + "system_integrator": "QSI" + }, + { + "application": "Health services", + "company": "Carelink AB", + "mad": "0xA00C", + "service_provider": "Carelink AB", + "system_integrator": "Carelink AB" + }, + { + "application": "Debit card, door access control, computer identification", + "company": "Netcard", + "mad": "0xB001", + "service_provider": "Netcard", + "system_integrator": "Netcard" + }, + { + "application": "Multiapplication car for industry & trafic, parking, swimming pool", + "company": "ASEC S.A.", + "mad": "0xB002", + "service_provider": "ASEC S.A", + "system_integrator": "ASEC S.A" + }, + { + "application": "Miscellaneous application, city traffic, access controll & securitym entertainment, car parking, electronic trade", + "company": "KFAP S.A.", + "mad": "0xB003", + "service_provider": "KFPA", + "system_integrator": "KFPA" + }, + { + "application": "", + "company": "Reac BV", + "mad": "0xB004", + "service_provider": "", + "system_integrator": "REAC" + }, + { + "application": "Electronic purse", + "company": "BULL POLSKA Sp. z o.o.", + "mad": "0xB005", + "service_provider": "BULL POLSKA", + "system_integrator": "BULL POLSKA" + }, + { + "application": "Electronic trade", + "company": "SIT Solution for IT Payment GmbH", + "mad": "0xB006", + "service_provider": "SIT Solution for IT Payment GmbH", + "system_integrator": "SIT Solution for IT Payment GmbH" + }, + { + "application": "Electronic voucher system, loyalty application, electronic wallet, transport", + "company": "Prosoft SPOL S.R.O", + "mad": "0xB007", + "service_provider": "Prosoft SPOL S.R.O", + "system_integrator": "Prosoft SPOL S.R.O" + }, + { + "application": "Electronic voucher system, loyalty application, electronic wallet, transport", + "company": "Prosoft SPOL S.R.O", + "mad": "0xB008", + "service_provider": "Prosoft SPOL S.R.O", + "system_integrator": "Prosoft SPOL S.R.O" + }, + { + "application": "Electronic voucher system, loyalty application, electronic wallet, transport", + "company": "Prosoft SPOL S.R.O", + "mad": "0xB009", + "service_provider": "Prosoft SPOL S.R.O", + "system_integrator": "Prosoft SPOL S.R.O" + }, + { + "application": "Electronic voucher system, loyalty application, electronic wallet, transport", + "company": "Prosoft SPOL S.R.O", + "mad": "0xB00A", + "service_provider": "Prosoft SPOL S.R.O", + "system_integrator": "Prosoft SPOL S.R.O" + }, + { + "application": "Point of sale", + "company": "VFJ Technology Pty Ltd", + "mad": "0xB801", + "service_provider": "VFJ Technology", + "system_integrator": "" + }, + { + "application": "An electronic purse application for Educational Institutions (Universities etc...)", + "company": "VERIFONE ITALIA SRL", + "mad": "0xB802", + "service_provider": "VeriFone Italy", + "system_integrator": "VeriFone Italy" + }, + { + "application": "Banking electronic purse", + "company": "ETC Electronic Technology Communication Company Limited", + "mad": "0xB803", + "service_provider": "Electronic Technology Communication Co Ltd.", + "system_integrator": "Electronic Technology Communication Co Ltd." + }, + { + "application": "Banking prepaid payment", + "company": "ETC Electronic Technology Communication Company Limited", + "mad": "0xB804", + "service_provider": "Vietnam Joint Stock Commercial Bank for Industry and trade (VietinBank)", + "system_integrator": "Electronic Technology Communication Co Ltd (E.T.C)" + }, + { + "application": "Multichip and Multiapplication Credit Card for banking, electronic purse, access control, payment and identification", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0xB805", + "service_provider": "CCC Credit Card Center AG", + "system_integrator": "" + }, + { + "application": "Gaming industry, cashless operation for slotmachines, tables and other Facilities (ID, cashless, offline, purse)", + "company": "Grips Electronic GmbH", + "mad": "0xC001", + "service_provider": "Sun International", + "system_integrator": "Grips, Sun International" + }, + { + "application": "Gaming industry, cashless operation for slotmachines, tables and other Facilities (ID, cashless, offline, purse)", + "company": "Grips Electronic GmbH", + "mad": "0xC002", + "service_provider": "Sun International", + "system_integrator": "Grips, Sun International" + }, + { + "application": "Gaming industry, cashless operation for slotmachines, tables and other Facilities (ID, cashless, offline, purse)", + "company": "Grips Electronic GmbH", + "mad": "0xC003", + "service_provider": "Sun International", + "system_integrator": "Grips, Sun International" + }, + { + "application": "Gaming industry, cashless operation for slotmachines, tables and other Facilities (ID, cashless, offline, purse)", + "company": "Grips Electronic GmbH", + "mad": "0xC004", + "service_provider": "Sun International", + "system_integrator": "Grips, Sun International" + }, + { + "application": "Access Controll, Security Electronic Purse, Ski-Ticketing, Ticketing", + "company": "*Siemens ANL", + "mad": "0xC005", + "service_provider": "", + "system_integrator": "Siemens AG" + }, + { + "application": "Security and safty services", + "company": "Staat der Nederlanden, Ministerie van Financien Belastingdienst/Centrum voor facilitaire dienstverlening", + "mad": "0xC006", + "service_provider": "Siemens Nederland BV", + "system_integrator": "Siemens Nederland BV" + }, + { + "application": "Event ticketing", + "company": "Just Access", + "mad": "0xC007", + "service_provider": "Just Access Inc.", + "system_integrator": "" + }, + { + "application": "Entertainment & Sports", + "company": "A&A Company", + "mad": "0xC008", + "service_provider": "A&A Company", + "system_integrator": "A&A Company" + }, + { + "application": "Miscellaneous application, city traffic, access control & security, entertainment, car parking, electronic trade", + "company": "KFAP S.A.", + "mad": "0xC009", + "service_provider": "KFPA", + "system_integrator": "KFPA" + }, + { + "application": "Access control, time attendance, bus ticket, hotel room card, VIP card f. club", + "company": "Giga-TMS Inc", + "mad": "0xC01A", + "service_provider": "Giga TMS", + "system_integrator": "Giga TMS" + }, + { + "application": "Access control & security, entertainment and sports", + "company": "Giga-TMS Inc", + "mad": "0xC01B", + "service_provider": "Giga", + "system_integrator": "Giga" + }, + { + "application": "Entertainment and Sports, Stadiums, Parking, Ski Ticketing", + "company": "Axess AG", + "mad": "0xC01C", + "service_provider": "Axess", + "system_integrator": "Axess" + }, + { + "application": "Entertainment and Sports, Stadiums, Parking, Ski Ticketing", + "company": "Axess AG", + "mad": "0xC01D", + "service_provider": "Axess", + "system_integrator": "Axess" + }, + { + "application": "Entertainment and Sports, Stadiums, Parking, Ski Ticketing", + "company": "Axess AG", + "mad": "0xC01E", + "service_provider": "Axess", + "system_integrator": "Axess" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC01F", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC020", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC021", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC022", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC023", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC024", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC025", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC026", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC027", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC028", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC029", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC02A", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC02B", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC02C", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Gaming industry, Retail Loyalty, Access Control, Point of Sale", + "company": "Worldsamrt Technology Pty Ltd", + "mad": "0xC02D", + "service_provider": "", + "system_integrator": "Worldsmart Technology" + }, + { + "application": "Compelete system for lockers, access control & electr. payment", + "company": "Ojmar S. A.", + "mad": "0xC02E", + "service_provider": "", + "system_integrator": "Enkoa System S.L." + }, + { + "application": "Company services, access & sec control, electronic purse...", + "company": "Cominfo a.s.", + "mad": "0xC02F", + "service_provider": "Cominfo", + "system_integrator": "Cominfo" + }, + { + "application": "Entertainment & sports", + "company": "n-tree Solutions Ticketsysteme", + "mad": "0xC030", + "service_provider": "n-tree", + "system_integrator": "n-tree" + }, + { + "application": "Access control & security, city traffic, sports & entertainment", + "company": "IP Core", + "mad": "0xC031", + "service_provider": "IP Core", + "system_integrator": "IP Core" + }, + { + "application": "StadiumTicketing & Access Contr", + "company": "T-Systems GEI GmbH", + "mad": "0xC032", + "service_provider": "T-Systems GEI GmbH", + "system_integrator": "T-Systems GEI GmbH" + }, + { + "application": "Car parking, sport applic, hotel, access control systems", + "company": "DATASEC Electronic GmbH", + "mad": "0xC033", + "service_provider": "Datasec", + "system_integrator": "Datatsec" + }, + { + "application": "Gaming Industry", + "company": "Systems in Progress", + "mad": "0xC040", + "service_provider": "Systems in Progress", + "system_integrator": "Systems in Progress" + }, + { + "application": "Gaming Industry", + "company": "Systems in Progress", + "mad": "0xC041", + "service_provider": "Systems in Progress", + "system_integrator": "Systems in Progress" + }, + { + "application": "Gaming Industry", + "company": "Systems in Progress", + "mad": "0xC042", + "service_provider": "Systems in Progress", + "system_integrator": "Systems in Progress" + }, + { + "application": "Gaming Industry", + "company": "Systems in Progress", + "mad": "0xC043", + "service_provider": "Systems in Progress", + "system_integrator": "Systems in Progress" + }, + { + "application": "Payment, payment OEM, payment partner, entertainment, OEM data", + "company": "Payment Solution AG", + "mad": "0xC044", + "service_provider": "Payment Solution AG", + "system_integrator": "Payment Solution AG" + }, + { + "application": "Scorecard for golf, payment solution for golf", + "company": "Gobex", + "mad": "0xC045", + "service_provider": "Gobex", + "system_integrator": "Gobex" + }, + { + "application": "Scorecard for golf, payment solution for golf", + "company": "Gobex", + "mad": "0xC046", + "service_provider": "Gobex", + "system_integrator": "Gobex" + }, + { + "application": "Leisure Management Application. inc. bookings, access control, e-purse and Electronic Point of Sale", + "company": "Gladstone Health & Leisure", + "mad": "0xC047", + "service_provider": "Gladstone", + "system_integrator": "Gladstone" + }, + { + "application": "Leisure Management Application. inc. bookings, access control, e-purse and Electronic Point of Sale", + "company": "Gladstone Health & Leisure", + "mad": "0xC048", + "service_provider": "Gladstone", + "system_integrator": "Gladstone" + }, + { + "application": "Event ticketing", + "company": "IMA ltd.", + "mad": "0xC049", + "service_provider": "IMA LTD.", + "system_integrator": "IMA LTD." + }, + { + "application": "Soccer stadium ticketing and e-purse application", + "company": "Smartchip S.A.", + "mad": "0xC04A", + "service_provider": "Corporacion Dim", + "system_integrator": "Smartchip S.A." + }, + { + "application": "Entertainment & spports", + "company": "Gantner Electronic GmbH", + "mad": "0xC04B", + "service_provider": "GANTNER Electronic", + "system_integrator": "GANTNER Electronic" + }, + { + "application": "Multi-purpose application for sport facilities - access control, purse etc for stadiums, sport centers etc", + "company": "Unicard S.A.", + "mad": "0xC04C", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "Multi-purpose application for sport facilities - access control, purse etc for stadiums, sport centers etc", + "company": "Unicard S.A.", + "mad": "0xC04D", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "Multi-purpose application for sport facilities - access control, purse etc for stadiums, sport centers etc", + "company": "Unicard S.A.", + "mad": "0xC04E", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "Multi-purpose application for sport facilities - access control, purse etc for stadiums, sport centers etc", + "company": "Unicard S.A.", + "mad": "0xC04F", + "service_provider": "UNICARD S.A.", + "system_integrator": "UNICARD S.A." + }, + { + "application": "", + "company": "Reac BV", + "mad": "0xC050", + "service_provider": "", + "system_integrator": "REAC" + }, + { + "application": "Access control and ticketing for entertainment and sports", + "company": "Mosrir Szczecin", + "mad": "0xC051", + "service_provider": "Mosrir Szczecin", + "system_integrator": "Sportdata Sp. 2 0.0." + }, + { + "application": "Accesss control in sport stadiums and e-purse", + "company": "FortressGb", + "mad": "0xC052", + "service_provider": "FORTRESSGB", + "system_integrator": "FORTRESSGB" + }, + { + "application": "Car parking", + "company": "Scheidt & Bachmann", + "mad": "0xC801", + "service_provider": "Scheidt & Bachmann GmbH", + "system_integrator": "" + }, + { + "application": "Car parking", + "company": "Scheidt & Bachmann", + "mad": "0xC802", + "service_provider": "Scheidt & Bachmann GmbH", + "system_integrator": "" + }, + { + "application": "", + "company": "Reserved for MAD", + "mad": "0xC803", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "Car parking systems", + "company": "Eden", + "mad": "0xC805", + "service_provider": "", + "system_integrator": "Eden" + }, + { + "application": "Car Parking", + "company": "MADA Marx Datentechnik GmbH", + "mad": "0xC806", + "service_provider": "MADA", + "system_integrator": "MADA" + }, + { + "application": "Car parking", + "company": "Scheidt & Bachmann", + "mad": "0xC810", + "service_provider": "Scheidt & Bachmann GmbH", + "system_integrator": "" + }, + { + "application": "Car parking", + "company": "CNA Limited/Rax-Comm Systems Ltd.", + "mad": "0xC811", + "service_provider": "CNA Limited", + "system_integrator": "CNA Limited" + }, + { + "application": "Park access application", + "company": "EFKON AG", + "mad": "0xC812", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Park access application", + "company": "EFKON AG", + "mad": "0xC813", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Park access application", + "company": "EFKON AG", + "mad": "0xC814", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Park access application", + "company": "EFKON AG", + "mad": "0xC815", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Park access application", + "company": "EFKON AG", + "mad": "0xC816", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Park access application", + "company": "EFKON AG", + "mad": "0xC817", + "service_provider": "efkon", + "system_integrator": "efkon" + }, + { + "application": "Security and safty services", + "company": "Staat der Nederlanden, Ministerie van Financien Belastingdienst/Centrum voor facilitaire dienstverlening", + "mad": "0xC819", + "service_provider": "Siemens Nederland BV", + "system_integrator": "Siemens Nederland BV" + }, + { + "application": "Car Parking System", + "company": "Edward Keller Ltd.", + "mad": "0xC81A", + "service_provider": "Edward Keller Ltd", + "system_integrator": "Edward Keller Ltd" + }, + { + "application": "Multiapplication car for industry & trafic, parking, swimming pool", + "company": "ASEC S.A.", + "mad": "0xC81B", + "service_provider": "ASEC S.A", + "system_integrator": "ASEC S.A" + }, + { + "application": "Miscellaneous application, city traffic, access control & security entertainment, car parking, electronic trade", + "company": "KFAP S.A.", + "mad": "0xC81C", + "service_provider": "KFPA", + "system_integrator": "KFPA" + }, + { + "application": "Computer, car parking, elec. purse, access control & security", + "company": "DECA Engineering", + "mad": "0xC81D", + "service_provider": "Deca Engineering", + "system_integrator": "Deca Engineering" + }, + { + "application": "", + "company": "TechID Engineering bv", + "mad": "0xC81E", + "service_provider": "Tech ID", + "system_integrator": "Tech ID" + }, + { + "application": "Entertainment and Sports, Stadiums, Parking, Ski Ticketing", + "company": "Axess AG", + "mad": "0xC81F", + "service_provider": "Axess", + "system_integrator": "Axess" + }, + { + "application": "Road toll", + "company": "Diners Club Adriatic d.d.", + "mad": "0xC820", + "service_provider": "Diners Club", + "system_integrator": "Diners Club" + }, + { + "application": "Company services, access & sec control, electronic purse...", + "company": "Cominfo a.s.", + "mad": "0xC821", + "service_provider": "Cominfo", + "system_integrator": "Cominfo" + }, + { + "application": "Access control & security, city traffic, sports & entertainment", + "company": "IP Core", + "mad": "0xC822", + "service_provider": "IP Core", + "system_integrator": "IP Core" + }, + { + "application": "Electronic purse, carparking system, single use ticket, period pass", + "company": "Emcard a.s.", + "mad": "0xC823", + "service_provider": "Emcard", + "system_integrator": "Emtest" + }, + { + "application": "Car parking, sport applic, hotel, access control systems", + "company": "DATASEC Electronic GmbH", + "mad": "0xC824", + "service_provider": "Datasec", + "system_integrator": "Datatsec" + }, + { + "application": "Car parking", + "company": "Parkeon", + "mad": "0xC825", + "service_provider": "Parkeon", + "system_integrator": "Parkeon" + }, + { + "application": "Car parking", + "company": "Parkeon", + "mad": "0xC826", + "service_provider": "Parkeon", + "system_integrator": "Parkeon" + }, + { + "application": "Car parking", + "company": "Parkeon", + "mad": "0xC827", + "service_provider": "Parkeon", + "system_integrator": "Parkeon" + }, + { + "application": "Car parking", + "company": "Parkeon", + "mad": "0xC828", + "service_provider": "Parkeon", + "system_integrator": "Parkeon" + }, + { + "application": "Car parking", + "company": "Parkeon", + "mad": "0xC829", + "service_provider": "Parkeon", + "system_integrator": "Parkeon" + }, + { + "application": "Car parking", + "company": "Parkeon", + "mad": "0xC82A", + "service_provider": "Parkeon", + "system_integrator": "Parkeon" + }, + { + "application": "Car parking", + "company": "Parkeon", + "mad": "0xC82B", + "service_provider": "Parkeon", + "system_integrator": "Parkeon" + }, + { + "application": "Car parking", + "company": "Parkeon", + "mad": "0xC82C", + "service_provider": "Parkeon", + "system_integrator": "Parkeon" + }, + { + "application": "Car parking system", + "company": "PENTA d.o.o.", + "mad": "0xC82D", + "service_provider": "PENTA", + "system_integrator": "PENTA" + }, + { + "application": "Car wash", + "company": "Group Capmonetique", + "mad": "0xC82E", + "service_provider": "MONEPARC, Parc Technologique Les moulins 2, 2791 Chemin St. Bernard, 06220 Vallauris, France", + "system_integrator": "MONECARTE" + }, + { + "application": "Car parking system: storage of entrance and payment information", + "company": "DEC S.R.L", + "mad": "0xC82F", + "service_provider": "DEC S.R.L", + "system_integrator": "DEC S.R.L" + }, + { + "application": "Car parking system: storage of subscription data", + "company": "DEC S.R.L", + "mad": "0xC830", + "service_provider": "DEC S.R.L", + "system_integrator": "DEC S.R.L" + }, + { + "application": "Car parking", + "company": "Cards & Devices GmbH", + "mad": "0xC831", + "service_provider": "Cards & Devices GmbH", + "system_integrator": "Cards & Devices GmbH" + }, + { + "application": "RF Loyalty/Fleet Card System", + "company": "Panasonic Industrial Company", + "mad": "0xC902", + "service_provider": "Panasonic Loyalty", + "system_integrator": "Panasonic Industrial Company" + }, + { + "application": "RF Loyalty/Fleet Card System", + "company": "Panasonic Industrial Company", + "mad": "0xC903", + "service_provider": "Panasonic Loyalty", + "system_integrator": "Panasonic Industrial Company" + }, + { + "application": "Payment, loyalty and vehicle card", + "company": "Tokheim", + "mad": "0xD001", + "service_provider": "Retail Petroleum Systems", + "system_integrator": "Retail Petroleum Systems" + }, + { + "application": "Payment, loyalty and vehicle card", + "company": "Tokheim", + "mad": "0xD002", + "service_provider": "Retail Petroleum Systems", + "system_integrator": "Retail Petroleum Systems" + }, + { + "application": "Payment, loyalty and vehicle card", + "company": "Tokheim", + "mad": "0xD003", + "service_provider": "Retail Petroleum Systems", + "system_integrator": "Retail Petroleum Systems" + }, + { + "application": "Driver Vehicle Indentification / fueling", + "company": "Nedap - CTP B.V.", + "mad": "0xD004", + "service_provider": "Nedap CTP B.V.", + "system_integrator": "D.V.I / Nedap - CTP B.V." + }, + { + "application": "Fuel, Gasoline", + "company": "MADA Marx Datentechnik GmbH", + "mad": "0xD005", + "service_provider": "MADA", + "system_integrator": "MADA" + }, + { + "application": "Electronic fuel voucher", + "company": "GRUPO VR", + "mad": "0xD006", + "service_provider": "Grupo VR", + "system_integrator": "" + }, + { + "application": "Attended and unattended operation", + "company": "Postec Data Systems Limited", + "mad": "0xD007", + "service_provider": "Unisys Marconi Commerce", + "system_integrator": "Postec Data Systems" + }, + { + "application": "Attended and unattended operation", + "company": "Postec Data Systems Limited", + "mad": "0xD008", + "service_provider": "Unisys Marconi Commerce", + "system_integrator": "Postec Data Systems" + }, + { + "application": "Attended and unattended operation", + "company": "Postec Data Systems Limited", + "mad": "0xD009", + "service_provider": "Unisys Marconi Commerce", + "system_integrator": "Postec Data Systems" + }, + { + "application": "Attended and unattended operation", + "company": "Postec Data Systems Limited", + "mad": "0xD00A", + "service_provider": "Unisys Marconi Commerce", + "system_integrator": "Postec Data Systems" + }, + { + "application": "Attended and unattended operation", + "company": "Postec Data Systems Limited", + "mad": "0xD00B", + "service_provider": "Unisys Marconi Commerce", + "system_integrator": "Postec Data Systems" + }, + { + "application": "Attended and unattended operation", + "company": "Postec Data Systems Limited", + "mad": "0xD00C", + "service_provider": "Unisys Marconi Commerce", + "system_integrator": "Postec Data Systems" + }, + { + "application": "Attended and unattended operation", + "company": "Postec Data Systems Limited", + "mad": "0xD00D", + "service_provider": "Unisys Marconi Commerce", + "system_integrator": "Postec Data Systems" + }, + { + "application": "Attended and unattended operation", + "company": "Postec Data Systems Limited", + "mad": "0xD00E", + "service_provider": "Unisys Marconi Commerce", + "system_integrator": "Postec Data Systems" + }, + { + "application": "Attended and unattended operation", + "company": "Postec Data Systems Limited", + "mad": "0xD00F", + "service_provider": "Unisys Marconi Commerce", + "system_integrator": "Postec Data Systems" + }, + { + "application": "Attended and unattended operation", + "company": "Postec Data Systems Limited", + "mad": "0xD010", + "service_provider": "Unisys Marconi Commerce", + "system_integrator": "Postec Data Systems" + }, + { + "application": "Fuel gasoline", + "company": "R&D Solutionz Ltd.", + "mad": "0xD038", + "service_provider": "", + "system_integrator": "R&D" + }, + { + "application": "Fuel gasoline", + "company": "R&D Solutionz Ltd.", + "mad": "0xD039", + "service_provider": "", + "system_integrator": "R&D" + }, + { + "application": "Fuel gasoline", + "company": "R&D Solutionz Ltd.", + "mad": "0xD03A", + "service_provider": "", + "system_integrator": "R&D" + }, + { + "application": "Fuel gasoline", + "company": "R&D Solutionz Ltd.", + "mad": "0xD03B", + "service_provider": "", + "system_integrator": "R&D" + }, + { + "application": "Fuel gasoline", + "company": "R&D Solutionz Ltd.", + "mad": "0xD03C", + "service_provider": "", + "system_integrator": "R&D" + }, + { + "application": "Fuel gasoline", + "company": "R&D Solutionz Ltd.", + "mad": "0xD03D", + "service_provider": "", + "system_integrator": "R&D" + }, + { + "application": "Fuel gasoline", + "company": "R&D Solutionz Ltd.", + "mad": "0xD03E", + "service_provider": "", + "system_integrator": "R&D" + }, + { + "application": "Fuel gasoline", + "company": "R&D Solutionz Ltd.", + "mad": "0xD03F", + "service_provider": "", + "system_integrator": "R&D" + }, + { + "application": "Fuel gasoline", + "company": "R&D Solutionz Ltd.", + "mad": "0xD040", + "service_provider": "", + "system_integrator": "R&D" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD041", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD042", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD043", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD044", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD045", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD046", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD047", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD048", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD049", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD04A", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD04B", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD04C", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD04D", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD04E", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel, Gasoline", + "company": "EFKON AG", + "mad": "0xD04F", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD050", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD051", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD052", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD053", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD054", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD055", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD056", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD057", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD058", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD059", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD05A", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD05B", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD05C", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD05D", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD05E", + "service_provider": "Efkon", + "system_integrator": "Efkon" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD05F", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD060", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD061", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD062", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD063", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD064", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD065", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD066", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD067", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD068", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD069", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD06A", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD06B", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD06C", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Fuel Gasoline India", + "company": "EFKON AG", + "mad": "0xD06D", + "service_provider": "Efkon AG", + "system_integrator": "Efkon AG" + }, + { + "application": "Applications for oil and gas", + "company": "Tietoenator Energy Components", + "mad": "0xD06E", + "service_provider": "Tietoenator", + "system_integrator": "Tietoenator" + }, + { + "application": "Applications for oil and gas", + "company": "Tietoenator Energy Components", + "mad": "0xD06F", + "service_provider": "Tietoenator", + "system_integrator": "Tietoenator" + }, + { + "application": "Applications for oil and gas", + "company": "Tietoenator Energy Components", + "mad": "0xD070", + "service_provider": "Tietoenator", + "system_integrator": "Tietoenator" + }, + { + "application": "Applications for oil and gas", + "company": "Tietoenator Energy Components", + "mad": "0xD071", + "service_provider": "Tietoenator", + "system_integrator": "Tietoenator" + }, + { + "application": "Fuel, gasoline station", + "company": "Hectronic GmbH", + "mad": "0xD072", + "service_provider": "Hectronic GmbH", + "system_integrator": "Hectronic GmbH" + }, + { + "application": "Fuel, gasoline", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0xD073", + "service_provider": "BICA AG", + "system_integrator": "BICA AG" + }, + { + "application": "Fuel, gasoline", + "company": "PBV Kaufmann Systeme GmbH", + "mad": "0xD074", + "service_provider": "BICA AG", + "system_integrator": "BICA AG" + }, + { + "application": "", + "company": "Hectronic GmbH", + "mad": "0xD075", + "service_provider": "", + "system_integrator": "Hectronic GmbH" + }, + { + "application": "", + "company": "Hectronic GmbH", + "mad": "0xD076", + "service_provider": "", + "system_integrator": "Hectronic GmbH" + }, + { + "application": "", + "company": "Hectronic GmbH", + "mad": "0xD077", + "service_provider": "", + "system_integrator": "Hectronic GmbH" + }, + { + "application": "Time attendance, fuel, access control", + "company": "Emcard a.s.", + "mad": "0xD078", + "service_provider": "Emtest", + "system_integrator": "Emtest" + }, + { + "application": "Identification", + "company": "Honeywell Automation India Limited", + "mad": "0xD079", + "service_provider": "Honeywell Automation India Limited", + "system_integrator": "Honeywell Automation India Limited" + }, + { + "application": "Security and safty services", + "company": "Staat der Nederlanden, Ministerie van Financien Belastingdienst/Centrum voor facilitaire dienstverlening", + "mad": "0xD801", + "service_provider": "Siemens Nederland BV", + "system_integrator": "Siemens Nederland BV" + }, + { + "application": "", + "company": "X-Ident GmbH", + "mad": "0xE101", + "service_provider": "", + "system_integrator": "" + }, + { + "application": "NFC applications", + "company": "Philips Semiconductors Gratkorn GmbH", + "mad": "0xE102", + "service_provider": "Philips Semiconductors", + "system_integrator": "Philips Semiconductors" + }, + { + "application": "NFC applications", + "company": "NXP Semiconductors", + "mad": "0xE103", + "service_provider": "Philips SC", + "system_integrator": "Philips SC" + }, + { + "application": "Global purse", + "company": "Microtronic AG", + "mad": "0xE104", + "service_provider": "Microtronic AG", + "system_integrator": "Microtronic AG" + }, + { + "application": "Global purse", + "company": "Microtronic AG", + "mad": "0xE105", + "service_provider": "Microtronic AG", + "system_integrator": "Microtronic AG" + }, + { + "application": "Global purse", + "company": "Microtronic AG", + "mad": "0xE106", + "service_provider": "Microtronic AG", + "system_integrator": "Microtronic AG" + }, + { + "application": "Global purse", + "company": "Microtronic AG", + "mad": "0xE107", + "service_provider": "Microtronic AG", + "system_integrator": "Microtronic AG" + }, + { + "application": "MS-Windows Logon and security facilities", + "company": "Integrated Engineering", + "mad": "0xE801", + "service_provider": "IE Holding", + "system_integrator": "IE Holding" + }, + { + "application": "Security and safty services", + "company": "Staat der Nederlanden, Ministerie van Financien Belastingdienst/Centrum voor facilitaire dienstverlening", + "mad": "0xE802", + "service_provider": "Siemens Nederland BV", + "system_integrator": "Siemens Nederland BV" + }, + { + "application": "Safeguard Security Products Family", + "company": "Utimaco Safeware AG - Österreich", + "mad": "0xE803", + "service_provider": "Utimaco Safeware AG", + "system_integrator": "Ultimaco Safeware AG" + }, + { + "application": "Safeguard Security Products Family", + "company": "Utimaco Safeware AG - Österreich", + "mad": "0xE804", + "service_provider": "Utimaco Safeware AG", + "system_integrator": "Ultimaco Safeware AG" + }, + { + "application": "Safeguard Security Products Family", + "company": "Utimaco Safeware AG - Österreich", + "mad": "0xE805", + "service_provider": "Utimaco Safeware AG", + "system_integrator": "Ultimaco Safeware AG" + }, + { + "application": "Computer, car parking, elec. purse, access control & security", + "company": "DECA Engineering", + "mad": "0xE806", + "service_provider": "Deca Engineering", + "system_integrator": "Deca Engineering" + }, + { + "application": "", + "company": "TechID Engineering bv", + "mad": "0xE807", + "service_provider": "Tech ID", + "system_integrator": "Tech ID" + }, + { + "application": "", + "company": "Horoquartz Gestion des Temps", + "mad": "0xE808", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "", + "company": "Horoquartz Gestion des Temps", + "mad": "0xE809", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "", + "company": "Horoquartz Gestion des Temps", + "mad": "0xE80A", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "", + "company": "Horoquartz Gestion des Temps", + "mad": "0xE80B", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "", + "company": "Horoquartz Gestion des Temps", + "mad": "0xE80C", + "service_provider": "Horoquartz", + "system_integrator": "Horoquartz" + }, + { + "application": "PC log on via MIFARE & DESfire", + "company": "Tx Systems Inc", + "mad": "0xE80D", + "service_provider": "TX Systems", + "system_integrator": "TX Systems" + }, + { + "application": "Access control, computer application, company services", + "company": "Volvo Car Corporation", + "mad": "0xE80E", + "service_provider": "Volvo Car", + "system_integrator": "Volvo Car" + }, + { + "application": "Software Licensing Application", + "company": "OmniCard Group B.V.", + "mad": "0xE80F", + "service_provider": "OmniCard Group B.V.", + "system_integrator": "OmniCard Group B.V." + }, + { + "application": "Computer logon", + "company": "Igel Technology GmbH", + "mad": "0xE810", + "service_provider": "Igel Technology GmbH", + "system_integrator": "Igel Technology GmbH" + }, + { + "application": "MS-Windows PC Logon", + "company": "United Access GmbH", + "mad": "0xE811", + "service_provider": "United Access GmbH", + "system_integrator": "United Access GmbH" + }, + { + "application": "Computer Technical Event - Membercard access control", + "company": "Strawberry AG", + "mad": "0xE812", + "service_provider": "Strawberry AG", + "system_integrator": "" + }, + { + "application": "Payment, payment OEM, payment partner, entertainment, OEM data", + "company": "Payment Solution AG", + "mad": "0xE814", + "service_provider": "Payment Solution AG", + "system_integrator": "Payment Solution AG" + }, + { + "application": "MIFARE PC Logon & Security", + "company": "PinCash International", + "mad": "0xE815", + "service_provider": "Pincash international BV", + "system_integrator": "Pincash international BV" + }, + { + "application": "Logical Access control and software licensing", + "company": "INID BV", + "mad": "0xE816", + "service_provider": "INID", + "system_integrator": "INID" + }, + { + "application": "Miscellaneous applications", + "company": "TechID Engineering bv", + "mad": "0xF001", + "service_provider": "Tech ID", + "system_integrator": "Tech ID" + } +] \ No newline at end of file diff --git a/client/src/aidsearch.c b/client/src/aidsearch.c index 676db4cc7..47c64e77b 100644 --- a/client/src/aidsearch.c +++ b/client/src/aidsearch.c @@ -13,7 +13,7 @@ #include "fileutils.h" #include "pm3_cmd.h" -int openAIDFile(json_t **root, bool verbose) { +static int openAIDFile(json_t **root, bool verbose) { json_error_t error; char *path; @@ -42,8 +42,7 @@ out: return retval; } -int closeAIDFile(json_t *root) { - +static int closeAIDFile(json_t *root) { json_decref(root); return PM3_SUCCESS; } @@ -67,11 +66,10 @@ json_t *AIDSearchGetElm(json_t *root, int elmindx) { } int AIDSearchFree(json_t *root) { - return closeAIDFile(root); } -const char *jsonStrGet(json_t *data, char *name) { +static const char *jsonStrGet(json_t *data, const char *name) { json_t *jstr; jstr = json_object_get(data, name); @@ -88,7 +86,7 @@ const char *jsonStrGet(json_t *data, char *name) { return cstr; } -bool aidCompare(const char *aidlarge, const char *aidsmall) { +static bool aidCompare(const char *aidlarge, const char *aidsmall) { if (strcmp(aidlarge, aidsmall) == 0) return true; @@ -122,8 +120,8 @@ int PrintAIDDescription(json_t *xroot, char *aid, bool verbose) { goto out; json_t *elm = NULL; - int maxaidlen = 0; - for (int elmindx = 0; elmindx < json_array_size(root); elmindx++) { + uint32_t maxaidlen = 0; + for (uint32_t elmindx = 0; elmindx < json_array_size(root); elmindx++) { json_t *data = AIDSearchGetElm(root, elmindx); if (data == NULL) continue; diff --git a/client/src/aidsearch.h b/client/src/aidsearch.h index 00d2b134a..585e173c6 100644 --- a/client/src/aidsearch.h +++ b/client/src/aidsearch.h @@ -15,14 +15,13 @@ #include #include - -#include +#include "jansson.h" int PrintAIDDescription(json_t *xroot, char *aid, bool verbose); int PrintAIDDescriptionBuf(json_t *root, uint8_t *aid, size_t aidlen, bool verbose); json_t *AIDSearchInit(bool verbose); json_t *AIDSearchGetElm(json_t *root, int elmindx); bool AIDGetFromElm(json_t *data, uint8_t *aid, size_t aidmaxlen, int *aidlen); -int AIDSearchFree(); +int AIDSearchFree(json_t *root); #endif diff --git a/client/src/cmddata.c b/client/src/cmddata.c index 9a809f603..75179ce5e 100644 --- a/client/src/cmddata.c +++ b/client/src/cmddata.c @@ -18,6 +18,7 @@ #include "commonutil.h" // ARRAYLEN #include "cmdparser.h" // for command_t #include "ui.h" // for show graph controls +#include "proxgui.h" #include "graph.h" // for graph data #include "comms.h" #include "lfdemod.h" // for demod code @@ -287,7 +288,7 @@ static int usage_data_buffclear(void) { PrintAndLogEx(NORMAL, " h This help"); return PM3_SUCCESS; } -static int usage_data_fsktonrz() { +static int usage_data_fsktonrz(void) { PrintAndLogEx(NORMAL, "Usage: data fsktonrz c l f "); PrintAndLogEx(NORMAL, "Options:"); PrintAndLogEx(NORMAL, " h This help"); @@ -566,7 +567,7 @@ int ASKDemod_ext(const char *Cmd, bool verbose, bool emSearch, uint8_t askType, sscanf(Cmd, "%i %i %i %zu %c", &clk, &invert, &maxErr, &maxLen, &); - if (!maxLen) maxLen = BIGBUF_SIZE; + if (!maxLen) maxLen = pm3_capabilities.bigbuf_size; if (invert != 0 && invert != 1) { PrintAndLogEx(WARNING, "Invalid argument: %s", Cmd); @@ -1275,8 +1276,7 @@ int PSKDemod(const char *Cmd, bool verbose) { return PM3_SUCCESS; } -static int CmdIdteckDemod(const char *Cmd) { - (void)Cmd; // Cmd is not used so far +int demodIdteck(void) { if (PSKDemod("", false) != PM3_SUCCESS) { PrintAndLogEx(DEBUG, "DEBUG: Error - Idteck PSKDemod failed"); @@ -1336,10 +1336,12 @@ static int CmdIdteckDemod(const char *Cmd) { return PM3_SUCCESS; } -int demodIdteck(void) { - return CmdIdteckDemod(""); +/* +static int CmdIdteckDemod(const char *Cmd) { + (void)Cmd; // Cmd is not used so far + return demodIdteck(); } - +*/ // by marshmellow // takes 3 arguments - clock, invert, maxErr as integers @@ -1516,16 +1518,18 @@ static int CmdHexsamples(const char *Cmd) { uint32_t offset = 0; char string_buf[25]; char *string_ptr = string_buf; - uint8_t got[BIGBUF_SIZE]; + uint8_t got[pm3_capabilities.bigbuf_size]; sscanf(Cmd, "%u %u", &requested, &offset); /* if no args send something */ if (requested == 0) requested = 8; + if (requested > pm3_capabilities.bigbuf_size) + requested = pm3_capabilities.bigbuf_size; if (offset + requested > sizeof(got)) { - PrintAndLogEx(NORMAL, "Tried to read past end of buffer, + > %d", BIGBUF_SIZE); + PrintAndLogEx(NORMAL, "Tried to read past end of buffer, + > %d", pm3_capabilities.bigbuf_size); return PM3_EINVARG; } @@ -1590,19 +1594,33 @@ static uint8_t getByte(uint8_t bits_per_sample, BitstreamOut *b) { } int getSamples(uint32_t n, bool verbose) { + return getSamplesEx(0, n, verbose); +} + +int getSamplesEx(uint32_t start, uint32_t end, bool verbose) { + + if (end < start) { + PrintAndLogEx(WARNING, "error, end (%u) is smaller than start (%u)", end, start); + return PM3_EINVARG; + } + //If we get all but the last byte in bigbuf, // we don't have to worry about remaining trash // in the last byte in case the bits-per-sample // does not line up on byte boundaries - uint8_t got[BIGBUF_SIZE - 1] = { 0 }; + uint8_t got[pm3_capabilities.bigbuf_size - 1]; + memset(got, 0x00, sizeof(got)); - if (n == 0 || n > sizeof(got)) - n = sizeof(got); + uint32_t n = end - start; - if (verbose) PrintAndLogEx(INFO, "Reading " _YELLOW_("%u") " bytes from device memory", n); + if (n <= 0 || n > pm3_capabilities.bigbuf_size - 1) + n = pm3_capabilities.bigbuf_size - 1; + + if (verbose) + PrintAndLogEx(INFO, "Reading " _YELLOW_("%u") " bytes from device memory", n); PacketResponseNG response; - if (!GetFromDevice(BIG_BUF, got, n, 0, NULL, 0, &response, 10000, true)) { + if (!GetFromDevice(BIG_BUF, got, n, start, NULL, 0, &response, 10000, true)) { PrintAndLogEx(WARNING, "timeout while waiting for reply."); return PM3_ETIMEOUT; } @@ -1623,7 +1641,7 @@ int getSamples(uint32_t n, bool verbose) { if (verbose) PrintAndLogEx(INFO, "Unpacking..."); BitstreamOut bout = { got, bits_per_sample * n, 0}; - int j = 0; + uint32_t j = 0; for (j = 0; j * bits_per_sample < n * 8 && j < n; j++) { uint8_t sample = getByte(bits_per_sample, &bout); GraphBuffer[j] = ((int) sample) - 127; @@ -1633,7 +1651,7 @@ int getSamples(uint32_t n, bool verbose) { if (verbose) PrintAndLogEx(INFO, "Unpacked %d samples", j); } else { - for (int j = 0; j < n; j++) { + for (uint32_t j = 0; j < n; j++) { GraphBuffer[j] = ((int)got[j]) - 127; } GraphTraceLen = n; @@ -1670,19 +1688,21 @@ int CmdTuneSamples(const char *Cmd) { RepaintGraphWindow(); int timeout = 0; + int timeout_max = 20; PrintAndLogEx(INFO, "Measuring antenna characteristics, please wait..."); clearCommandBuffer(); SendCommandNG(CMD_MEASURE_ANTENNA_TUNING, NULL, 0); PacketResponseNG resp; - while (!WaitForResponseTimeout(CMD_MEASURE_ANTENNA_TUNING, &resp, 2000)) { - timeout++; - printf("."); + PrintAndLogEx(INPLACE, "% 3i", timeout_max - timeout); + while (!WaitForResponseTimeout(CMD_MEASURE_ANTENNA_TUNING, &resp, 500)) { fflush(stdout); - if (timeout > 7) { + if (timeout >= timeout_max) { PrintAndLogEx(WARNING, "\nNo response from Proxmark3. Aborting..."); return PM3_ETIMEOUT; } + timeout++; + PrintAndLogEx(INPLACE, "% 3i", timeout_max - timeout); } if (resp.status != PM3_SUCCESS) { @@ -1691,6 +1711,7 @@ int CmdTuneSamples(const char *Cmd) { } PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(INFO, "---------- " _CYAN_("LF Antenna") " ----------"); // in mVolt struct p { uint32_t v_lf134; @@ -1727,11 +1748,9 @@ int CmdTuneSamples(const char *Cmd) { else sprintf(judgement, _GREEN_("OK")); - PrintAndLogEx(NORMAL, "%sLF antenna is %s \n" - , (package->peak_v < LF_UNUSABLE_V) ? _CYAN_("[!]") : _GREEN_("[+]") - , judgement - ); + PrintAndLogEx((package->peak_v < LF_UNUSABLE_V) ? WARNING : SUCCESS, "LF antenna is %s", judgement); + PrintAndLogEx(INFO, "---------- " _CYAN_("HF Antenna") " ----------"); // HF evaluation if (package->v_hf > NON_VOLTAGE) PrintAndLogEx(SUCCESS, "HF antenna: %5.2f V - 13.56 MHz", (package->v_hf * ANTENNA_ERROR) / 1000.0); @@ -1745,10 +1764,7 @@ int CmdTuneSamples(const char *Cmd) { else sprintf(judgement, _GREEN_("OK")); - PrintAndLogEx(NORMAL, "%sHF antenna is %s" - , (package->v_hf < HF_UNUSABLE_V) ? _CYAN_("[!]") : _GREEN_("[+]") - , judgement - ); + PrintAndLogEx((package->v_hf < HF_UNUSABLE_V) ? WARNING : SUCCESS, "HF antenna is %s", judgement); // graph LF measurements // even here, these values has 3% error. @@ -1809,7 +1825,7 @@ static int CmdLoad(const char *Cmd) { fclose(f); - PrintAndLogEx(SUCCESS, "loaded %zu samples", GraphTraceLen); + PrintAndLogEx(SUCCESS, "loaded " _YELLOW_("%zu") " samples", GraphTraceLen); uint8_t bits[GraphTraceLen]; size_t size = getFromGraphBuf(bits); @@ -2295,26 +2311,37 @@ static int CmdDataNDEF(const char *Cmd) { #define MAX_NDEF_LEN 2048 #endif - CLIParserInit("data ndef", - "Prints NFC Data Exchange Format (NDEF)", - "Usage:\n\tdata ndef -d 9101085402656e48656c6c6f5101085402656e576f726c64\n"); + CLIParserContext *ctx; + CLIParserInit(&ctx, "data ndef", + "Decode and print NFC Data Exchange Format (NDEF)", + "Samples:\n" + _YELLOW_("\tdata ndef -d 9101085402656e48656c6c6f5101085402656e576f726c64\n") + _YELLOW_("\tdata ndef -d 0103d020240203e02c040300fe\n") + ); void *argtable[] = { arg_param_begin, arg_strx0("dD", "data", "", "NDEF data to decode"), + arg_lit0("vV", "verbose", "verbose mode"), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, false); int datalen = 0; uint8_t data[MAX_NDEF_LEN] = {0}; - CLIGetHexWithReturn(1, data, &datalen); - CLIParserFree(); + CLIGetHexWithReturn(ctx, 1, data, &datalen); + bool verbose = arg_get_lit(ctx, 2); + + CLIParserFree(ctx); if (datalen == 0) return PM3_EINVARG; - PrintAndLogEx(INFO, "Parsed NDEF Records"); - return NDEFRecordsDecodeAndPrint(data, datalen); + int res = NDEFDecodeAndPrint(data, datalen, verbose); + if (res != PM3_SUCCESS) { + PrintAndLogEx(INFO, "Trying to parse NDEF records w/o NDEF header"); + res = NDEFRecordsDecodeAndPrint(data, datalen); + } + return res; } static command_t CommandTable[] = { diff --git a/client/src/cmddata.h b/client/src/cmddata.h index a19bead27..acda950a5 100644 --- a/client/src/cmddata.h +++ b/client/src/cmddata.h @@ -13,6 +13,10 @@ #include "common.h" +#ifdef __cplusplus +extern "C" { +#endif + //#include //size_t int CmdData(const char *Cmd); @@ -68,19 +72,23 @@ void setDemodBuff(uint8_t *buff, size_t size, size_t start_idx); bool getDemodBuff(uint8_t *buff, size_t *size); void save_restoreDB(uint8_t saveOpt);// option '1' to save DemodBuffer any other to restore int AutoCorrelate(const int *in, int *out, size_t len, size_t window, bool SaveGrph, bool verbose); + int getSamples(uint32_t n, bool verbose); +int getSamplesEx(uint32_t start, uint32_t end, bool verbose); + void setClockGrid(uint32_t clk, int offset); int directionalThreshold(const int *in, int *out, size_t len, int8_t up, int8_t down); int AskEdgeDetect(const int *in, int *out, int len, int threshold); int demodIdteck(void); #define MAX_DEMOD_BUF_LEN (1024*128) -#define BIGBUF_SIZE 40000 extern uint8_t DemodBuffer[MAX_DEMOD_BUF_LEN]; extern size_t DemodBufferLen; extern int g_DemodClock; extern size_t g_DemodStartIdx; -extern uint8_t g_debugMode; +#ifdef __cplusplus +} +#endif #endif diff --git a/client/src/cmdflashmem.c b/client/src/cmdflashmem.c index 8d19c3888..e90e6025c 100644 --- a/client/src/cmdflashmem.c +++ b/client/src/cmdflashmem.c @@ -18,8 +18,8 @@ #include "comms.h" //getfromdevice #include "cmdflashmemspiffs.h" // spiffs commands -#include "mbedtls/rsa.h" -#include "mbedtls/sha1.h" +#include "rsa.h" +#include "sha1.h" #define MCK 48000000 #define FLASH_MINFAST 24000000 //33000000 @@ -27,8 +27,6 @@ #define FLASH_FASTBAUD MCK #define FLASH_MINBAUD FLASH_FASTBAUD -#define FASTFLASH (FLASHMEM_SPIBAUDRATE > FLASH_MINFAST) - static int CmdHelp(const char *Cmd); static int usage_flashmem_spibaud(void) { @@ -170,7 +168,7 @@ static int CmdFlashMemLoad(const char *Cmd) { return PM3_EINVARG; } size_t datalen = 0; - uint16_t keycount = 0; + uint32_t keycount = 0; int res = 0; uint8_t *data = calloc(FLASH_MEM_MAX_SIZE, sizeof(uint8_t)); @@ -182,6 +180,10 @@ static int CmdFlashMemLoad(const char *Cmd) { free(data); return PM3_EFILE; } + // limited space on flash mem + if (keycount > 0xFFFF) + keycount &= 0xFFFF; + data[0] = (keycount >> 0) & 0xFF; data[1] = (keycount >> 8) & 0xFF; datalen += 2; @@ -193,6 +195,10 @@ static int CmdFlashMemLoad(const char *Cmd) { free(data); return PM3_EFILE; } + // limited space on flash mem + if (keycount > 0xFFFF) + keycount &= 0xFFFF; + data[0] = (keycount >> 0) & 0xFF; data[1] = (keycount >> 8) & 0xFF; datalen += 2; @@ -204,6 +210,10 @@ static int CmdFlashMemLoad(const char *Cmd) { free(data); return PM3_EFILE; } + // limited space on flash mem + if (keycount > 0xFFFF) + keycount &= 0xFFFF; + data[0] = (keycount >> 0) & 0xFF; data[1] = (keycount >> 8) & 0xFF; datalen += 2; diff --git a/client/src/cmdflashmemspiffs.c b/client/src/cmdflashmemspiffs.c index b994ea56c..11c4db2d7 100644 --- a/client/src/cmdflashmemspiffs.c +++ b/client/src/cmdflashmemspiffs.c @@ -19,53 +19,69 @@ static int CmdHelp(const char *Cmd); static int usage_flashmemspiffs_remove(void) { - PrintAndLogEx(NORMAL, "Remove a file from spiffs filesystem"); - PrintAndLogEx(NORMAL, " Usage: mem spiffs remove "); + PrintAndLogEx(NORMAL, "Remove a file from spiffs filesystem\n"); + PrintAndLogEx(NORMAL, "Usage: mem spiffs remove "); + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(NORMAL, "Examples:"); + PrintAndLogEx(NORMAL, _YELLOW_(" mem spiffs remove lasttag.bin")); return PM3_SUCCESS; } static int usage_flashmemspiffs_rename(void) { - PrintAndLogEx(NORMAL, "Rename/move a file in spiffs filesystem"); - PrintAndLogEx(NORMAL, " Usage: mem spiffs rename "); + PrintAndLogEx(NORMAL, "Rename/move a file in spiffs filesystem\n"); + PrintAndLogEx(NORMAL, "Usage: mem spiffs rename "); + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(NORMAL, "Examples:"); + PrintAndLogEx(NORMAL, _YELLOW_(" mem spiffs rename lasttag.bin oldtag.bin")); return PM3_SUCCESS; } static int usage_flashmemspiffs_copy(void) { - PrintAndLogEx(NORMAL, "Copy a file to another (destructively) in spiffs filesystem"); - PrintAndLogEx(NORMAL, " Usage: mem spiffs copy "); + PrintAndLogEx(NORMAL, "Copy a file to another (destructively) in spiffs filesystem\n"); + PrintAndLogEx(NORMAL, "Usage: mem spiffs copy "); + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(NORMAL, "Examples:"); + PrintAndLogEx(NORMAL, _YELLOW_(" mem spiffs copy lasttag.bin lasttag_cpy.bin")); return PM3_SUCCESS; } static int usage_flashmemspiffs_dump(void) { PrintAndLogEx(NORMAL, "Dumps flash memory on device into a file or in console"); - PrintAndLogEx(NORMAL, "Size is handled by first sending a STAT command against file existence"); - PrintAndLogEx(NORMAL, " Usage: mem spiffs dump o [f [e]] [p]"); - PrintAndLogEx(NORMAL, " o : filename in SPIFFS"); - PrintAndLogEx(NORMAL, " f : file name to save to"); - PrintAndLogEx(NORMAL, " p : print dump in console"); - PrintAndLogEx(NORMAL, " e : also save in EML format (good for tags save and dictonnary files)"); + PrintAndLogEx(NORMAL, "Size is handled by first sending a STAT command against file existence\n"); + PrintAndLogEx(NORMAL, "Usage: mem spiffs dump o [f [e]] [p]"); + PrintAndLogEx(NORMAL, " o - filename in SPIFFS"); + PrintAndLogEx(NORMAL, " f - file name to save to "); + PrintAndLogEx(NORMAL, " p - print dump in console"); + PrintAndLogEx(NORMAL, " e - also save in EML format (good for tags save and dictonnary files)"); PrintAndLogEx(NORMAL, " You must specify at lease option f or option p, both if you wish"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " mem spiffs dump o hf_colin/lasttag f lasttag e"); - PrintAndLogEx(NORMAL, " mem spiffs dump o hf_colin/lasttag p"); + PrintAndLogEx(NORMAL, _YELLOW_(" mem spiffs dump o lasttag.bin f lasttag e")); + PrintAndLogEx(NORMAL, _YELLOW_(" mem spiffs dump o lasttag.bin p")); return PM3_SUCCESS; } static int usage_flashmemspiffs_load(void) { PrintAndLogEx(NORMAL, "Uploads binary-wise file into device filesystem"); - PrintAndLogEx(NORMAL, "Usage: mem spiffs load o f "); PrintAndLogEx(NORMAL, "Warning: mem area to be written must have been wiped first"); - PrintAndLogEx(NORMAL, "(this is already taken care when loading dictionaries)"); - PrintAndLogEx(NORMAL, " o : destination filename"); - PrintAndLogEx(NORMAL, " f : local filename"); + PrintAndLogEx(NORMAL, "(this is already taken care when loading dictionaries)\n"); + PrintAndLogEx(NORMAL, "Usage: mem spiffs load o f "); + PrintAndLogEx(NORMAL, " o - destination filename"); + PrintAndLogEx(NORMAL, " f - local filename"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " mem spiffs load f myfile o myapp.conf"); + PrintAndLogEx(NORMAL, _YELLOW_(" mem spiffs load f myfile o myapp.conf")); return PM3_SUCCESS; } - +static int usage_flashmemspiffs_wipe(void) { + PrintAndLogEx(NORMAL, "wipes all files on the device filesystem " _RED_("* Warning *")); + PrintAndLogEx(NORMAL, "Usage: mem spiffs wipe [h]"); + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(NORMAL, "Examples:"); + PrintAndLogEx(NORMAL, _YELLOW_(" mem spiffs wipe")); + return PM3_SUCCESS; +} static int CmdFlashMemSpiFFSMount(const char *Cmd) { (void)Cmd; // Cmd is not used so far clearCommandBuffer(); @@ -277,12 +293,12 @@ static int CmdFlashMemSpiFFSDump(const char *Cmd) { } if ((filename[0] == '\0') && (!print)) { - PrintAndLogEx(FAILED, "No print asked and Local dump Filename missing or invalid"); + PrintAndLogEx(FAILED, "No print asked and local dump filename missing or invalid"); errors = true; } if (destfilename[0] == '\0') { - PrintAndLogEx(FAILED, "SPIFFS Filename missing or invalid"); + PrintAndLogEx(FAILED, "SPIFFS filename missing or invalid"); errors = true; } @@ -320,9 +336,16 @@ static int CmdFlashMemSpiFFSDump(const char *Cmd) { } if (filename[0] != '\0') { - saveFile(filename, "", dump, len); + saveFile(filename, ".bin", dump, len); if (eml) { - saveFileEML(filename, dump, len, 16); + uint8_t eml_len = 16; + + if (strstr(filename, "class") != NULL) + eml_len = 8; + else if (strstr(filename, "mfu") != NULL) + eml_len = 4; + + saveFileEML(filename, dump, len, eml_len); } } @@ -397,6 +420,23 @@ out: return ret_val; } +static int CmdFlashMemSpiFFSWipe(const char *Cmd) { + + char ctmp = tolower(param_getchar(Cmd, 0)); + if (ctmp == 'h') { + return usage_flashmemspiffs_wipe(); + } + + PrintAndLogEx(INFO, "Wiping all files from SPIFFS FileSystem"); + PacketResponseNG resp; + clearCommandBuffer(); + SendCommandNG(CMD_SPIFFS_WIPE, NULL, 0); + WaitForResponse(CMD_SPIFFS_WIPE, &resp); + PrintAndLogEx(INFO, "Done!"); + PrintAndLogEx(HINT, "Try use '" _YELLOW_("mem spiffs tree") "' to verify."); + return PM3_SUCCESS; +} + static int CmdFlashMemSpiFFSLoad(const char *Cmd) { char filename[FILE_PATH_SIZE] = {0}; @@ -457,20 +497,18 @@ static int CmdFlashMemSpiFFSLoad(const char *Cmd) { static command_t CommandTable[] = { {"help", CmdHelp, AlwaysAvailable, "This help"}, - { - "copy", CmdFlashMemSpiFFSCopy, IfPm3Flash, - "Copy a file to another (destructively) in SPIFFS FileSystem in FlashMEM (spiffs)" - }, - {"check", CmdFlashMemSpiFFSCheck, IfPm3Flash, "Check/try to defrag faulty/fragmented Filesystem"}, - {"dump", CmdFlashMemSpiFFSDump, IfPm3Flash, "Dump a file from SPIFFS FileSystem in FlashMEM (spiffs)"}, - {"info", CmdFlashMemSpiFFSInfo, IfPm3Flash, "Print filesystem info and usage statistics (spiffs)"}, - {"load", CmdFlashMemSpiFFSLoad, IfPm3Flash, "Upload file into SPIFFS Filesystem (spiffs)"}, - {"mount", CmdFlashMemSpiFFSMount, IfPm3Flash, "Mount the SPIFFS Filesystem if not already mounted (spiffs)"}, - {"remove", CmdFlashMemSpiFFSRemove, IfPm3Flash, "Remove a file from SPIFFS FileSystem in FlashMEM (spiffs)"}, - {"rename", CmdFlashMemSpiFFSRename, IfPm3Flash, "Rename/move a file in SPIFFS FileSystem in FlashMEM (spiffs)"}, - {"test", CmdFlashMemSpiFFSTest, IfPm3Flash, "Test SPIFFS Operations (require wiping pages 0 and 1)"}, - {"tree", CmdFlashMemSpiFFSTree, IfPm3Flash, "Print the Flash Memory FileSystem Tree (spiffs)"}, + {"copy", CmdFlashMemSpiFFSCopy, IfPm3Flash, "Copy a file to another (destructively) in SPIFFS FileSystem in FlashMEM (spiffs)"}, + {"check", CmdFlashMemSpiFFSCheck, IfPm3Flash, "Check/try to defrag faulty/fragmented Filesystem"}, + {"dump", CmdFlashMemSpiFFSDump, IfPm3Flash, "Dump a file from SPIFFS FileSystem in FlashMEM (spiffs)"}, + {"info", CmdFlashMemSpiFFSInfo, IfPm3Flash, "Print filesystem info and usage statistics (spiffs)"}, + {"load", CmdFlashMemSpiFFSLoad, IfPm3Flash, "Upload file into SPIFFS Filesystem (spiffs)"}, + {"mount", CmdFlashMemSpiFFSMount, IfPm3Flash, "Mount the SPIFFS Filesystem if not already mounted (spiffs)"}, + {"remove", CmdFlashMemSpiFFSRemove, IfPm3Flash, "Remove a file from SPIFFS FileSystem in FlashMEM (spiffs)"}, + {"rename", CmdFlashMemSpiFFSRename, IfPm3Flash, "Rename/move a file in SPIFFS FileSystem in FlashMEM (spiffs)"}, + {"test", CmdFlashMemSpiFFSTest, IfPm3Flash, "Test SPIFFS Operations (require wiping pages 0 and 1)"}, + {"tree", CmdFlashMemSpiFFSTree, IfPm3Flash, "Print the Flash Memory FileSystem Tree (spiffs)"}, {"unmount", CmdFlashMemSpiFFSUnmount, IfPm3Flash, "Un-mount the SPIFFS Filesystem if not already mounted (spiffs)"}, + {"wipe", CmdFlashMemSpiFFSWipe, IfPm3Flash, "Wipe all files from SPIFFS FileSystem." _RED_("* dangerous *") }, {NULL, NULL, NULL, NULL} }; diff --git a/client/src/cmdhf.c b/client/src/cmdhf.c index fbc99dbd5..5fea3c61e 100644 --- a/client/src/cmdhf.c +++ b/client/src/cmdhf.c @@ -37,22 +37,24 @@ #include "cmdhfcryptorf.h" // CryptoRF #include "cmdtrace.h" // trace list #include "ui.h" +#include "proxgui.h" #include "cmddata.h" #include "graph.h" #include "fpga.h" static int CmdHelp(const char *Cmd); -static int usage_hf_search() { +static int usage_hf_search(void) { PrintAndLogEx(NORMAL, "Usage: hf search"); - PrintAndLogEx(NORMAL, "Will try to find a HF read out of the unknown tag. Stops when found."); + PrintAndLogEx(NORMAL, "Will try to find a HF read out of the unknown tag."); + PrintAndLogEx(NORMAL, "Continues to search for all different HF protocols"); PrintAndLogEx(NORMAL, "Options:"); PrintAndLogEx(NORMAL, " h - This help"); PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; } -static int usage_hf_sniff() { +static int usage_hf_sniff(void) { PrintAndLogEx(NORMAL, "The high frequence sniffer will assign all available memory on device for sniffed data"); PrintAndLogEx(NORMAL, "Use " _YELLOW_("'data samples'")" command to download from device, and " _YELLOW_("'data plot'")" to look at it"); PrintAndLogEx(NORMAL, "Press button to quit the sniffing.\n"); @@ -63,18 +65,21 @@ static int usage_hf_sniff() { PrintAndLogEx(NORMAL, " - skip number of triggers"); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "Examples:"); - PrintAndLogEx(NORMAL, " hf sniff"); - PrintAndLogEx(NORMAL, " hf sniff 1000 0"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf sniff")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf sniff 1000 0")); + PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; } -static int usage_hf_tune() { +static int usage_hf_tune(void) { PrintAndLogEx(NORMAL, "Continuously measure HF antenna tuning."); - PrintAndLogEx(NORMAL, "Press button or Enter to interrupt."); + PrintAndLogEx(NORMAL, "Press button or `enter` to interrupt."); PrintAndLogEx(NORMAL, "Usage: hf tune [h] []"); PrintAndLogEx(NORMAL, "Options:"); PrintAndLogEx(NORMAL, " h - This help"); PrintAndLogEx(NORMAL, " - number of iterations (default: 0=infinite)"); + PrintAndLogEx(NORMAL, "Examples:"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf tune 1")); PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; } @@ -89,7 +94,7 @@ int CmdHFSearch(const char *Cmd) { int res = PM3_ESOFT; PROMPT_CLEARLINE; - PrintAndLogEx(INPLACE, "Searching for ThinFilm tag..."); + PrintAndLogEx(INPLACE, " Searching for ThinFilm tag..."); if (IfPm3NfcBarcode()) { if (infoThinFilm(false) == PM3_SUCCESS) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Thinfilm tag") " found\n"); @@ -98,7 +103,7 @@ int CmdHFSearch(const char *Cmd) { } PROMPT_CLEARLINE; - PrintAndLogEx(INPLACE, "Searching for LTO-CM tag..."); + PrintAndLogEx(INPLACE, " Searching for LTO-CM tag..."); if (IfPm3Iso14443a()) { if (infoLTO(false) == PM3_SUCCESS) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("LTO-CM tag") " found\n"); @@ -107,7 +112,7 @@ int CmdHFSearch(const char *Cmd) { } PROMPT_CLEARLINE; - PrintAndLogEx(INPLACE, "Searching for ISO14443-A tag..."); + PrintAndLogEx(INPLACE, " Searching for ISO14443-A tag..."); if (IfPm3Iso14443a()) { if (infoHF14A(false, false, false) > 0) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("ISO14443-A tag") " found\n"); @@ -116,16 +121,25 @@ int CmdHFSearch(const char *Cmd) { } PROMPT_CLEARLINE; - PrintAndLogEx(INPLACE, "Searching for ISO15693 tag..."); + PrintAndLogEx(INPLACE, " Searching for ISO15693 tag..."); if (IfPm3Iso15693()) { - if (readHF15Uid(false)) { + if (readHF15Uid(false, false)) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("ISO15693 tag") " found\n"); res = PM3_SUCCESS; } } PROMPT_CLEARLINE; - PrintAndLogEx(INPLACE, "Searching for LEGIC tag..."); + PrintAndLogEx(INPLACE, " Searching for iCLASS / PicoPass tag..."); + if (IfPm3Iclass()) { + if (read_iclass_csn(false, false) == PM3_SUCCESS) { + PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("iCLASS tag / PicoPass tag") " found\n"); + res = PM3_SUCCESS; + } + } + + PROMPT_CLEARLINE; + PrintAndLogEx(INPLACE, " Searching for LEGIC tag..."); if (IfPm3Legicrf()) { if (readLegicUid(false) == PM3_SUCCESS) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("LEGIC Prime tag") " found\n"); @@ -134,7 +148,7 @@ int CmdHFSearch(const char *Cmd) { } PROMPT_CLEARLINE; - PrintAndLogEx(INPLACE, "Searching for Topaz tag..."); + PrintAndLogEx(INPLACE, " Searching for Topaz tag..."); if (IfPm3Iso14443a()) { if (readTopazUid(false) == PM3_SUCCESS) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("Topaz tag") " found\n"); @@ -142,29 +156,9 @@ int CmdHFSearch(const char *Cmd) { } } + // 14b is the longest test (put last) PROMPT_CLEARLINE; - PrintAndLogEx(INPLACE, "Searching for FeliCa tag..."); - if (IfPm3Felica()) { - if (readFelicaUid(false) == PM3_SUCCESS) { - PrintAndLogEx(NORMAL, "\nValid " _GREEN_("ISO18092 / FeliCa tag") " found\n"); - res = PM3_SUCCESS; - } - } - /* - // 14b and iclass is the longest test (put last) - PROMPT_CLEARLINE; - PrintAndLogEx(INPLACE, "Searching for CryptoRF tag..."); - if (IfPm3Iso14443b()) { - if (readHFCryptoRF(false) == PM3_SUCCESS) { - PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("CryptoRF tag") " found\n"); - res = PM3_SUCCESS; - } - } - */ - - // 14b and iclass is the longest test (put last) - PROMPT_CLEARLINE; - PrintAndLogEx(INPLACE, "Searching for ISO14443-B tag..."); + PrintAndLogEx(INPLACE, " Searching for ISO14443-B tag..."); if (IfPm3Iso14443b()) { if (readHF14B(false) == 1) { PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("ISO14443-B tag") " found\n"); @@ -172,14 +166,26 @@ int CmdHFSearch(const char *Cmd) { } } +/* PROMPT_CLEARLINE; - PrintAndLogEx(INPLACE, "Searching for iClass / PicoPass tag..."); - if (IfPm3Iclass()) { - if (readIclass(false, false) == PM3_SUCCESS) { - PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("iClass tag / PicoPass tag") " found\n"); + PrintAndLogEx(INPLACE, " Searching for FeliCa tag..."); + if (IfPm3Felica()) { + if (readFelicaUid(false) == PM3_SUCCESS) { + PrintAndLogEx(NORMAL, "\nValid " _GREEN_("ISO18092 / FeliCa tag") " found\n"); res = PM3_SUCCESS; } } +*/ + /* + PROMPT_CLEARLINE; + PrintAndLogEx(INPLACE, " Searching for CryptoRF tag..."); + if (IfPm3Iso14443b()) { + if (readHFCryptoRF(false) == PM3_SUCCESS) { + PrintAndLogEx(SUCCESS, "\nValid " _GREEN_("CryptoRF tag") " found\n"); + res = PM3_SUCCESS; + } + } + */ PROMPT_CLEARLINE; if (res != PM3_SUCCESS) { @@ -194,7 +200,7 @@ int CmdHFSearch(const char *Cmd) { int CmdHFTune(const char *Cmd) { char cmdp = tolower(param_getchar(Cmd, 0)); if (cmdp == 'h') return usage_hf_tune(); - int iter = param_get32ex(Cmd, 0, 0, 10); + int iter = param_get32ex(Cmd, 0, 0, 10); PrintAndLogEx(INFO, "Measuring HF antenna, click " _GREEN_("pm3 button") " or press " _GREEN_("Enter") " to exit"); PacketResponseNG resp; @@ -226,7 +232,7 @@ int CmdHFTune(const char *Cmd) { } uint16_t volt = resp.data.asDwords[0] & 0xFFFF; - PrintAndLogEx(INPLACE, "%u mV / %2u V", volt, (uint16_t)(volt / 1000)); + PrintAndLogEx(INPLACE, " %u mV / %2u V", volt, (uint16_t)(volt / 1000)); } mode[0] = 3; @@ -240,20 +246,74 @@ int CmdHFTune(const char *Cmd) { return PM3_SUCCESS; } +// Collects pars of u8, +// uses 16bit transfers from FPGA for speed +// Takes all available bigbuff memory +// data sample to download? Not sure what we can do with the data. int CmdHFSniff(const char *Cmd) { char cmdp = tolower(param_getchar(Cmd, 0)); if (cmdp == 'h') return usage_hf_sniff(); - int skippairs = param_get32ex(Cmd, 0, 0, 10); - int skiptriggers = param_get32ex(Cmd, 1, 0, 10); + struct { + uint32_t samplesToSkip; + uint32_t triggersToSkip; + } PACKED params; + + params.samplesToSkip = param_get32ex(Cmd, 0, 0, 10); + params.triggersToSkip = param_get32ex(Cmd, 1, 0, 10); clearCommandBuffer(); - SendCommandMIX(CMD_HF_SNIFF, skippairs, skiptriggers, 0, NULL, 0); + SendCommandNG(CMD_HF_SNIFF, (uint8_t *)¶ms, sizeof(params)); + + for (;;) { + + if (kbd_enter_pressed()) { + SendCommandNG(CMD_BREAK_LOOP, NULL, 0); + PrintAndLogEx(INFO, "User aborted"); + break; + } + + PacketResponseNG resp; + if (WaitForResponseTimeout(CMD_HF_SNIFF, &resp, 1000)) { + + if (resp.status == PM3_EOPABORTED) { + PrintAndLogEx(INFO, "Button pressed, user aborted"); + break; + } + if (resp.status == PM3_SUCCESS) { + + struct r { + uint16_t len; + } PACKED; + struct r *retval = (struct r *)resp.data.asBytes; + + PrintAndLogEx(INFO, "HF sniff (%u samples)", retval->len); + + PrintAndLogEx(HINT, "Use `" _YELLOW_("data hpf") "` to remove offset"); + PrintAndLogEx(HINT, "Use `" _YELLOW_("data plot") "` to view"); + PrintAndLogEx(HINT, "Use `" _YELLOW_("data save") "` to save"); + + // download bigbuf_malloc:d. + // it reserve memory from the higher end. + // At the moment, sniff takes all free memory in bigbuff. If this changes, + // we can't start from beginning idx 0 but from that hi-to-start-of-allocated. + uint32_t start = pm3_capabilities.bigbuf_size - retval->len; + int res = getSamplesEx(start, start, false); + if (res != PM3_SUCCESS) { + PrintAndLogEx(WARNING, "failed to download samples to client"); + return res; + } + break; + } + } + } + PrintAndLogEx(INFO, "Done."); return PM3_SUCCESS; } int CmdHFPlot(const char *Cmd) { - CLIParserInit("hf plot", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf plot", "Plots HF signal after RF signal path and A/D conversion.", "This can be used after any hf command and will show the last few milliseconds of the HF signal.\n" "Note: If the last hf command terminated because of a timeout you will most probably see nothing.\n"); @@ -261,7 +321,8 @@ int CmdHFPlot(const char *Cmd) { arg_param_begin, arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, true); + CLIParserFree(ctx); uint8_t buf[FPGA_TRACE_SIZE]; diff --git a/client/src/cmdhf14a.c b/client/src/cmdhf14a.c index 262e879f4..6ce4d077e 100644 --- a/client/src/cmdhf14a.c +++ b/client/src/cmdhf14a.c @@ -296,7 +296,7 @@ static int CmdHF14AReader(const char *Cmd) { break; default: PrintAndLogEx(WARNING, "Unknown command."); - return 1; + return PM3_EINVARG; } cmdp++; } @@ -312,7 +312,7 @@ static int CmdHF14AReader(const char *Cmd) { if (!WaitForResponseTimeout(CMD_ACK, &resp, 2500)) { if (!silent) PrintAndLogEx(WARNING, "iso14443a card select failed"); DropField(); - return 1; + return PM3_ESOFT; } iso14a_card_select_t card; @@ -329,14 +329,14 @@ static int CmdHF14AReader(const char *Cmd) { if (select_status == 0) { if (!silent) PrintAndLogEx(WARNING, "iso14443a card select failed"); DropField(); - return 1; + return PM3_ESOFT; } if (select_status == 3) { PrintAndLogEx(INFO, "Card doesn't support standard iso14443-3 anticollision"); PrintAndLogEx(SUCCESS, "ATQA: %02x %02x", card.atqa[1], card.atqa[0]); DropField(); - return 1; + return PM3_ESOFT; } PrintAndLogEx(SUCCESS, " UID: " _GREEN_("%s"), sprint_hex(card.uid, card.uidlen)); @@ -356,7 +356,7 @@ static int CmdHF14AReader(const char *Cmd) { if (!silent) PrintAndLogEx(INFO, "field dropped."); } - return 0; + return PM3_SUCCESS; } static int CmdHF14AInfo(const char *Cmd) { @@ -364,7 +364,8 @@ static int CmdHF14AInfo(const char *Cmd) { bool do_nack_test = false; bool do_aid_search = false; - CLIParserInit("hf 14a info", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf 14a info", "This command makes more extensive tests against a ISO14443a tag in order to collect information", "Sample:\n\thf 14a info -nsv - shows full information about the card\n"); @@ -375,16 +376,16 @@ static int CmdHF14AInfo(const char *Cmd) { arg_lit0("sS", "aidsearch", "checks if AIDs from aidlist.json is present on the card and prints information about found AIDs"), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, true); - verbose = arg_get_lit(1); - do_nack_test = arg_get_lit(2); - do_aid_search = arg_get_lit(3); + verbose = arg_get_lit(ctx, 1); + do_nack_test = arg_get_lit(ctx, 2); + do_aid_search = arg_get_lit(ctx, 3); - CLIParserFree(); + CLIParserFree(ctx); infoHF14A(verbose, do_nack_test, do_aid_search); - return 0; + return PM3_SUCCESS; } // Collect ISO14443 Type A UIDs @@ -401,7 +402,7 @@ static int CmdHF14ACUIDs(const char *Cmd) { for (int i = 0; i < n; i++) { if (kbd_enter_pressed()) { - PrintAndLogEx(WARNING, "\n[!] aborted via keyboard!\n"); + PrintAndLogEx(WARNING, "aborted via keyboard!\n"); break; } @@ -437,6 +438,8 @@ int CmdHF14ASim(const char *Cmd) { bool setEmulatorMem = false; bool verbose = false; bool errors = false; + sector_t *k_sector = NULL; + uint8_t k_sectorsCount = 40; while (param_getchar(Cmd, cmdp) != 0x00 && !errors) { switch (tolower(param_getchar(Cmd, cmdp))) { @@ -520,7 +523,7 @@ int CmdHF14ASim(const char *Cmd) { if ((flags & FLAG_NR_AR_ATTACK) != FLAG_NR_AR_ATTACK) break; nonces_t *data = (nonces_t *)resp.data.asBytes; - readerAttack(data[0], setEmulatorMem, verbose); + readerAttack(k_sector, k_sectorsCount, data[0], setEmulatorMem, verbose); keypress = kbd_enter_pressed(); } @@ -531,7 +534,7 @@ int CmdHF14ASim(const char *Cmd) { } if (resp.status == PM3_EOPABORTED && ((flags & FLAG_NR_AR_ATTACK) == FLAG_NR_AR_ATTACK)) - showSectorTable(); + showSectorTable(k_sector, k_sectorsCount); PrintAndLogEx(INFO, "Done"); return PM3_SUCCESS; @@ -878,7 +881,8 @@ static int CmdHF14AAPDU(const char *Cmd) { bool extendedAPDU = false; int le = 0; - CLIParserInit("hf 14a apdu", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf 14a apdu", "Sends an ISO 7816-4 APDU via ISO 14443-4 block transmission protocol (T=CL). works with all apdu types from ISO 7816-4:2013", "Sample:\n\thf 14a apdu -st 00A404000E325041592E5359532E444446303100\n" "\thf 14a apdu -sd 00A404000E325041592E5359532E444446303100 - decode apdu\n" @@ -897,27 +901,28 @@ static int CmdHF14AAPDU(const char *Cmd) { arg_strx1(NULL, NULL, "", "data if `m` parameter included"), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, false); + CLIExecWithReturn(ctx, Cmd, argtable, false); - activateField = arg_get_lit(1); - leaveSignalON = arg_get_lit(2); - decodeTLV = arg_get_lit(3); - decodeAPDU = arg_get_lit(4); + activateField = arg_get_lit(ctx, 1); + leaveSignalON = arg_get_lit(ctx, 2); + decodeTLV = arg_get_lit(ctx, 3); + decodeAPDU = arg_get_lit(ctx, 4); - CLIGetHexWithReturn(5, header, &headerlen); + CLIGetHexWithReturn(ctx, 5, header, &headerlen); makeAPDU = headerlen > 0; if (makeAPDU && headerlen != 4) { PrintAndLogEx(ERR, "header length must be 4 bytes instead of %d", headerlen); + CLIParserFree(ctx); return 1; } - extendedAPDU = arg_get_lit(6); - le = arg_get_int_def(7, 0); + extendedAPDU = arg_get_lit(ctx, 6); + le = arg_get_int_def(ctx, 7, 0); if (makeAPDU) { uint8_t apdudata[PM3_CMD_DATA_SIZE] = {0}; int apdudatalen = 0; - CLIGetHexBLessWithReturn(8, apdudata, &apdudatalen, 1 + 2); + CLIGetHexBLessWithReturn(ctx, 8, apdudata, &apdudatalen, 1 + 2); APDUStruct apdu; apdu.cla = header[0]; @@ -933,24 +938,27 @@ static int CmdHF14AAPDU(const char *Cmd) { if (APDUEncode(&apdu, data, &datalen)) { PrintAndLogEx(ERR, "can't make apdu with provided parameters."); + CLIParserFree(ctx); return 2; } } else { if (extendedAPDU) { PrintAndLogEx(ERR, "make mode not set but here `e` option."); + CLIParserFree(ctx); return 3; } if (le > 0) { PrintAndLogEx(ERR, "make mode not set but here `l` option."); + CLIParserFree(ctx); return 3; } // len = data + PCB(1b) + CRC(2b) - CLIGetHexBLessWithReturn(8, data, &datalen, 1 + 2); + CLIGetHexBLessWithReturn(ctx, 8, data, &datalen, 1 + 2); } + CLIParserFree(ctx); - CLIParserFree(); PrintAndLogEx(NORMAL, ">>>>[%s%s%s] %s", activateField ? "sel " : "", leaveSignalON ? "keep " : "", decodeTLV ? "TLV" : "", sprint_hex(data, datalen)); if (decodeAPDU) { @@ -1162,7 +1170,8 @@ static int waitCmd(uint8_t iSelect) { static int CmdHF14AAntiFuzz(const char *Cmd) { - CLIParserInit("hf 14a antifuzz", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf 14a antifuzz", "Tries to fuzz the ISO14443a anticollision phase", "Usage:\n" "\thf 14a antifuzz -4\n"); @@ -1174,15 +1183,15 @@ static int CmdHF14AAntiFuzz(const char *Cmd) { arg_lit0(NULL, "10", "10 byte uid"), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, false); + CLIExecWithReturn(ctx, Cmd, argtable, false); uint8_t arg0 = FLAG_4B_UID_IN_DATA; - if (arg_get_lit(2)) + if (arg_get_lit(ctx, 2)) arg0 = FLAG_7B_UID_IN_DATA; - if (arg_get_lit(3)) + if (arg_get_lit(ctx, 3)) arg0 = FLAG_10B_UID_IN_DATA; - CLIParserFree(); + CLIParserFree(ctx); clearCommandBuffer(); SendCommandMIX(CMD_HF_ISO14443A_ANTIFUZZ, arg0, 0, 0, NULL, 0); return 0; @@ -1190,7 +1199,8 @@ static int CmdHF14AAntiFuzz(const char *Cmd) { static int CmdHF14AChaining(const char *Cmd) { - CLIParserInit("hf 14a chaining", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf 14a chaining", "Enable/Disable ISO14443a input chaining. Maximum input length goes from ATS.", "Usage:\n" "\thf 14a chaining disable -> disable chaining\n" @@ -1201,10 +1211,10 @@ static int CmdHF14AChaining(const char *Cmd) { arg_str0(NULL, NULL, "", NULL), arg_param_end }; - CLIExecWithReturn(Cmd, argtable, true); + CLIExecWithReturn(ctx, Cmd, argtable, true); - struct arg_str *str = arg_get_str(1); - int len = arg_get_str_len(1); + struct arg_str *str = arg_get_str(ctx, 1); + int len = arg_get_str_len(ctx, 1); if (len && (!strcmp(str->sval[0], "enable") || !strcmp(str->sval[0], "1"))) APDUInFramingEnable = true; @@ -1212,7 +1222,7 @@ static int CmdHF14AChaining(const char *Cmd) { if (len && (!strcmp(str->sval[0], "disable") || !strcmp(str->sval[0], "0"))) APDUInFramingEnable = false; - CLIParserFree(); + CLIParserFree(ctx); PrintAndLogEx(INFO, "\nISO 14443-4 input chaining %s.\n", APDUInFramingEnable ? "enabled" : "disabled"); @@ -1245,8 +1255,8 @@ int CmdHF14A(const char *Cmd) { return CmdsParse(CommandTable, Cmd); } -static void printTag(char *tag) { - PrintAndLogEx(SUCCESS, "POSSIBLE TYPE:" _YELLOW_(" %s"), tag); +static void printTag(const char *tag) { + PrintAndLogEx(SUCCESS, " " _YELLOW_("%s"), tag); } @@ -1261,9 +1271,11 @@ typedef enum { } nxp_mifare_type_t; // According to NXP AN10833 Rev 3.6 MIFARE Type Identification, Table 6 -int detect_nxp_card(uint8_t sak, uint16_t atqa) { +static int detect_nxp_card(uint8_t sak, uint16_t atqa) { int type = MTNONE; + PrintAndLogEx(SUCCESS, "Possible types:"); + if (sak == 0x00) { printTag("NTAG 20x / 21x / 21x TT / I2C plus"); printTag("MIFARE Ultralight / C / EV1 / Nano"); @@ -1274,10 +1286,12 @@ int detect_nxp_card(uint8_t sak, uint16_t atqa) { printTag("TNP3xxx (Activision Game Appliance)"); type = MTCLASSIC; } + if ((sak & 0x04) == 0x04) { printTag("Any MIFARE CL1 / NTAG424DNA"); type |= MTDESFIRE; } + if ((sak & 0x08) == 0x08) { printTag("MIFARE Classic 1K / Classic 1K CL2"); printTag("MIFARE Plus 2K / Plus EV1 2K"); @@ -1285,18 +1299,22 @@ int detect_nxp_card(uint8_t sak, uint16_t atqa) { type |= MTCLASSIC; type |= MTPLUS; } + if ((sak & 0x09) == 0x09) { printTag("MIFARE Mini 0.3K / Mini CL2 0.3K"); type |= MTMINI; } + if ((sak & 0x10) == 0x10) { printTag("MIFARE Plus 2K / Plus CL2 2K"); type |= MTPLUS; } + if ((sak & 0x11) == 0x11) { printTag("MIFARE Plus 4K / Plus CL2 4K"); type |= MTPLUS; } + if ((sak & 0x18) == 0x18) { if (atqa == 0x0042) { printTag("MIFARE Plus 4K / Plus EV1 4K"); @@ -1306,10 +1324,11 @@ int detect_nxp_card(uint8_t sak, uint16_t atqa) { printTag("MIFARE Classic 4K / Classic 4K CL2"); type |= MTCLASSIC; } - } + if ((sak & 0x20) == 0x20) { if (atqa == 0x0344) { + printTag("MIFARE DESFire MF3ICD40"); printTag("MIFARE DESFire EV1 2K/4K/8K / DESFire EV1 CL2 2K/4K/8K"); printTag("MIFARE NTAG424DNA"); type |= MTDESFIRE; @@ -1322,28 +1341,35 @@ int detect_nxp_card(uint8_t sak, uint16_t atqa) { type |= MTPLUS; } } + if ((sak & 0x24) == 0x24) { if (atqa == 0x0344) { printTag("MIFARE DESFire CL1 / DESFire EV1 CL1"); type |= MTDESFIRE; } } + if ((sak & 0x28) == 0x28) { if (atqa == 0x0344) { printTag("MIFARE DESFire CL1 / DESFire EV1 CL1"); type |= MTDESFIRE; } } + + if (type == MTNONE) { + PrintAndLogEx(WARNING, " failed to fingerprint"); + } + return type; } typedef struct { uint8_t uid0; uint8_t uid1; - char *desc; -} uidname; + const char *desc; +} uid_label_name; -const uidname uidmap[] = { +const uid_label_name uid_label_map[] = { // UID0, UID1, TEXT {0x02, 0x84, "M24SR64-Y"}, {0x02, 0xA3, "25TA02KB-P"}, @@ -1355,16 +1381,15 @@ const uidname uidmap[] = { {0x00, 0x00, "None"} }; -void getTagLabel(uint8_t uid0, uint8_t uid1) { +static void getTagLabel(uint8_t uid0, uint8_t uid1) { int i = 0; - while (uidmap[i].uid0 != 0x00) { - if ((uidmap[i].uid0 == uid0) && (uidmap[i].uid1 == uid1)) { - PrintAndLogEx(SUCCESS, _YELLOW_(" %s"), uidmap[i].desc); + while (uid_label_map[i].uid0 != 0x00) { + if ((uid_label_map[i].uid0 == uid0) && (uid_label_map[i].uid1 == uid1)) { + PrintAndLogEx(SUCCESS, _YELLOW_(" %s"), uid_label_map[i].desc); return; } i += 1; } - return; } int infoHF14A(bool verbose, bool do_nack_test, bool do_aid_search) { @@ -1404,9 +1429,10 @@ int infoHF14A(bool verbose, bool do_nack_test, bool do_aid_search) { } if (verbose) { - PrintAndLogEx(SUCCESS, "-- ISO14443-a Information -----------------------------------"); + PrintAndLogEx(SUCCESS, "------ " _CYAN_("ISO14443-a Information") "------------------"); PrintAndLogEx(SUCCESS, "-------------------------------------------------------------"); } + PrintAndLogEx(SUCCESS, " UID: " _GREEN_("%s"), sprint_hex(card.uid, card.uidlen)); PrintAndLogEx(SUCCESS, "ATQA: " _GREEN_("%02x %02x"), card.atqa[1], card.atqa[0]); PrintAndLogEx(SUCCESS, " SAK: " _GREEN_("%02x [%" PRIu64 "]"), card.sak, resp.oldarg[0]); @@ -1416,7 +1442,7 @@ int infoHF14A(bool verbose, bool do_nack_test, bool do_aid_search) { bool isMifarePlus = false; bool isMifareUltralight = false; int nxptype = MTNONE; - // Double & triple sized UID, can be mapped to a manufacturer. + if (card.uidlen <= 4) { nxptype = detect_nxp_card(card.sak, ((card.atqa[1] << 8) + card.atqa[0])); @@ -1427,9 +1453,12 @@ int infoHF14A(bool verbose, bool do_nack_test, bool do_aid_search) { if ((nxptype & MTOTHER) == MTOTHER) isMifareClassic = true; - } - if (card.uidlen > 4) { + + } else { + + // Double & triple sized UID, can be mapped to a manufacturer. PrintAndLogEx(SUCCESS, "MANUFACTURER: " _YELLOW_("%s"), getTagInfo(card.uid[0])); + switch (card.uid[0]) { case 0x04: // NXP nxptype = detect_nxp_card(card.sak, ((card.atqa[1] << 8) + card.atqa[0])); @@ -1524,7 +1553,7 @@ int infoHF14A(bool verbose, bool do_nack_test, bool do_aid_search) { if (select_status == 2) { uint8_t rats[] = { 0xE0, 0x80 }; // FSDI=8 (FSD=256), CID=0 clearCommandBuffer(); - SendCommandOLD(CMD_HF_ISO14443A_READER, ISO14A_RAW | ISO14A_APPEND_CRC | ISO14A_NO_DISCONNECT, 2, 0, rats, sizeof(rats)); + SendCommandMIX(CMD_HF_ISO14443A_READER, ISO14A_RAW | ISO14A_APPEND_CRC | ISO14A_NO_DISCONNECT, 2, 0, rats, sizeof(rats)); WaitForResponse(CMD_ACK, &resp); memcpy(card.ats, resp.data.asBytes, resp.oldarg[0]); @@ -1746,18 +1775,9 @@ int infoHF14A(bool verbose, bool do_nack_test, bool do_aid_search) { PrintAndLogEx(INFO, "proprietary non iso14443-4 card found, RATS not supported"); } - if (isMifareUltralight) { - PrintAndLogEx(HINT, "Hint: try " _YELLOW_("`hf mfu info`")); - } - if (isMifarePlus) { - PrintAndLogEx(HINT, "Hint: try " _YELLOW_("`hf mfp info`")); - } - if (isMifareDESFire) { - PrintAndLogEx(HINT, "Hint: try " _YELLOW_("`hf mfdes info`")); - } - + int isMagic = 0; if (isMifareClassic || isMifareUltralight) { - detect_classic_magic(); + isMagic = detect_classic_magic(); if (isMifareClassic) { int res = detect_classic_prng(); @@ -1780,6 +1800,15 @@ int infoHF14A(bool verbose, bool do_nack_test, bool do_aid_search) { } } + if (isMifareUltralight) + PrintAndLogEx(HINT, "Hint: try " _YELLOW_("`hf mfu info`")); + + if (isMifarePlus && isMagic == 0) + PrintAndLogEx(HINT, "Hint: try " _YELLOW_("`hf mfp info`")); + + if (isMifareDESFire && isMagic == 0) + PrintAndLogEx(HINT, "Hint: try " _YELLOW_("`hf mfdes info`")); + DropField(); return select_status; } diff --git a/client/src/cmdhf14b.c b/client/src/cmdhf14b.c index 859df4a23..315ef6cd4 100644 --- a/client/src/cmdhf14b.c +++ b/client/src/cmdhf14b.c @@ -31,7 +31,7 @@ static int usage_hf_14b_info(void) { PrintAndLogEx(NORMAL, " h this help"); PrintAndLogEx(NORMAL, " s silently"); PrintAndLogEx(NORMAL, "Example:"); - PrintAndLogEx(NORMAL, " hf 14b info"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b info")); return 0; } static int usage_hf_14b_reader(void) { @@ -40,7 +40,7 @@ static int usage_hf_14b_reader(void) { PrintAndLogEx(NORMAL, " h this help"); PrintAndLogEx(NORMAL, " s silently"); PrintAndLogEx(NORMAL, "Example:"); - PrintAndLogEx(NORMAL, " hf 14b reader"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b reader")); return 0; } static int usage_hf_14b_raw(void) { @@ -54,7 +54,7 @@ static int usage_hf_14b_raw(void) { PrintAndLogEx(NORMAL, " -ss active signal field ON with select for SRx ST Microelectronics tags"); PrintAndLogEx(NORMAL, " -t timeout in ms"); PrintAndLogEx(NORMAL, "Example:"); - PrintAndLogEx(NORMAL, " hf 14b raw -s -c -p 0200a40400"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b raw -s -c -p 0200a40400")); return 0; } static int usage_hf_14b_sniff(void) { @@ -64,7 +64,7 @@ static int usage_hf_14b_sniff(void) { PrintAndLogEx(NORMAL, "Options:"); PrintAndLogEx(NORMAL, " h this help"); PrintAndLogEx(NORMAL, "Example:"); - PrintAndLogEx(NORMAL, " hf 14b sniff"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b sniff")); return 0; } static int usage_hf_14b_sim(void) { @@ -74,8 +74,8 @@ static int usage_hf_14b_sim(void) { PrintAndLogEx(NORMAL, " h this help"); PrintAndLogEx(NORMAL, " u 4byte UID/PUPI"); PrintAndLogEx(NORMAL, "Example:"); - PrintAndLogEx(NORMAL, " hf 14b sim"); - PrintAndLogEx(NORMAL, " hf 14b sim u 11223344"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b sim")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b sim u 11223344")); return 0; } static int usage_hf_14b_read_srx(void) { @@ -84,8 +84,8 @@ static int usage_hf_14b_read_srx(void) { PrintAndLogEx(NORMAL, " h this help"); PrintAndLogEx(NORMAL, " <1|2> 1 = SRIX4K , 2 = SRI512"); PrintAndLogEx(NORMAL, "Example:"); - PrintAndLogEx(NORMAL, " hf 14b sriread 1"); - PrintAndLogEx(NORMAL, " hf 14b sriread 2"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b sriread 1")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b sriread 2")); return 0; } static int usage_hf_14b_write_srx(void) { @@ -96,10 +96,10 @@ static int usage_hf_14b_write_srx(void) { PrintAndLogEx(NORMAL, " BLOCK number depends on tag, special block == FF"); PrintAndLogEx(NORMAL, " hex bytes of data to be written"); PrintAndLogEx(NORMAL, "Example:"); - PrintAndLogEx(NORMAL, " hf 14b sriwrite 1 7F 11223344"); - PrintAndLogEx(NORMAL, " hf 14b sriwrite 1 FF 11223344"); - PrintAndLogEx(NORMAL, " hf 14b sriwrite 2 15 11223344"); - PrintAndLogEx(NORMAL, " hf 14b sriwrite 2 FF 11223344"); + PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b sriwrite 1 7F 11223344")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b sriwrite 1 FF 11223344")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b sriwrite 2 15 11223344")); + PrintAndLogEx(NORMAL, _YELLOW_(" hf 14b sriwrite 2 FF 11223344")); return 0; } static int usage_hf_14b_dump(void) { @@ -112,8 +112,9 @@ static int usage_hf_14b_dump(void) { "\tf filename, if no UID will be used as filename\n" "\n" "Example:\n" - "\thf 14b dump f\n" - "\thf 14b dump 2 f mydump"); + _YELLOW_("\thf 14b dump f\n") + _YELLOW_("\thf 14b dump 2 f mydump") + ); return 0; } @@ -127,35 +128,34 @@ static void switch_on_field_14b(void) { static int switch_off_field_14b(void) { clearCommandBuffer(); SendCommandMIX(CMD_HF_ISO14443B_COMMAND, ISO14B_DISCONNECT, 0, 0, NULL, 0); - return 0; + return PM3_SUCCESS; } static bool waitCmd14b(bool verbose) { PacketResponseNG resp; - if (WaitForResponseTimeout(CMD_ACK, &resp, TIMEOUT)) { - - if ((resp.oldarg[0] & 0xFF) > 0) return false; + if (WaitForResponseTimeout(CMD_HF_ISO14443B_COMMAND, &resp, TIMEOUT)) { uint16_t len = (resp.oldarg[1] & 0xFFFF); - - uint8_t data[PM3_CMD_DATA_SIZE] = {0x00}; - memcpy(data, resp.data.asBytes, len); + uint8_t *data = resp.data.asBytes; if (verbose) { + if (len >= 3) { bool crc = check_crc(CRC_14443_B, data, len); - PrintAndLogEx(SUCCESS, "[LEN %u] %s[%02X %02X] %s", + PrintAndLogEx(SUCCESS, "len %u | %s[%02X %02X] %s", len, sprint_hex(data, len - 2), data[len - 2], data[len - 1], - (crc) ? _GREEN_("OK") : _RED_("FAIL") + (crc) ? _GREEN_("ok") : _RED_("fail") ); + } else if (len == 0) { + PrintAndLogEx(SUCCESS, "received SOF only (maybe iCLASS/Picopass)"); } else { - PrintAndLogEx(SUCCESS, "[LEN %u] %s", len, sprint_hex(data, len)); + PrintAndLogEx(SUCCESS, "len %u | %s", len, sprint_hex(data, len)); } } return true; @@ -168,7 +168,7 @@ static bool waitCmd14b(bool verbose) { static int CmdHF14BList(const char *Cmd) { (void)Cmd; // Cmd is not used so far CmdTraceList("14b"); - return 0; + return PM3_SUCCESS; } static int CmdHF14BSim(const char *Cmd) { @@ -204,7 +204,7 @@ static int CmdHF14BCmdRaw(const char *Cmd) { uint32_t flags = ISO14B_CONNECT; uint32_t temp = 0, user_timeout = 0, time_wait = 0; - if (strlen(Cmd) < 3) return usage_hf_14b_raw(); + if (strlen(Cmd) < 2) return usage_hf_14b_raw(); // strip while (*Cmd == ' ' || *Cmd == '\t') ++Cmd; @@ -286,63 +286,56 @@ static int CmdHF14BCmdRaw(const char *Cmd) { datalen = (datalen > PM3_CMD_DATA_SIZE) ? PM3_CMD_DATA_SIZE : datalen; clearCommandBuffer(); - SendCommandOLD(CMD_HF_ISO14443B_COMMAND, flags, datalen, time_wait, data, datalen); + SendCommandMIX(CMD_HF_ISO14443B_COMMAND, flags, datalen, time_wait, data, datalen); - if (!reply) return PM3_SUCCESS; + if (reply == false) { + return PM3_SUCCESS; + } bool success = true; // get back iso14b_card_select_t, don't print it. - if (select) + if (select) { success = waitCmd14b(false); + } // get back response from the raw bytes you sent. - if (success && datalen > 0) waitCmd14b(true); + if (success && datalen > 0) { + waitCmd14b(true); + } return PM3_SUCCESS; } static bool get_14b_UID(iso14b_card_select_t *card) { - if (!card) + if (card == NULL) return false; - int8_t retry = 3; PacketResponseNG resp; + clearCommandBuffer(); + SendCommandMIX(CMD_HF_ISO14443B_COMMAND, ISO14B_CONNECT | ISO14B_SELECT_SR | ISO14B_DISCONNECT, 0, 0, NULL, 0); + if (WaitForResponseTimeout(CMD_HF_ISO14443B_COMMAND, &resp, TIMEOUT)) { - // test for 14b SR - while (retry--) { - - clearCommandBuffer(); - SendCommandMIX(CMD_HF_ISO14443B_COMMAND, ISO14B_CONNECT | ISO14B_SELECT_SR | ISO14B_DISCONNECT, 0, 0, NULL, 0); - if (WaitForResponseTimeout(CMD_ACK, &resp, TIMEOUT)) { - - uint8_t status = resp.oldarg[0]; - if (status == 0) { - memcpy(card, (iso14b_card_select_t *)resp.data.asBytes, sizeof(iso14b_card_select_t)); - return true; - } + uint8_t status = resp.oldarg[0]; + if (status == 0) { + memcpy(card, (iso14b_card_select_t *)resp.data.asBytes, sizeof(iso14b_card_select_t)); + return true; } - } // retry + } // test 14b standard - retry = 3; - while (retry--) { + clearCommandBuffer(); + SendCommandMIX(CMD_HF_ISO14443B_COMMAND, ISO14B_CONNECT | ISO14B_SELECT_STD | ISO14B_DISCONNECT, 0, 0, NULL, 0); + if (WaitForResponseTimeout(CMD_HF_ISO14443B_COMMAND, &resp, TIMEOUT)) { - clearCommandBuffer(); - SendCommandMIX(CMD_HF_ISO14443B_COMMAND, ISO14B_CONNECT | ISO14B_SELECT_STD | ISO14B_DISCONNECT, 0, 0, NULL, 0); - if (WaitForResponseTimeout(CMD_ACK, &resp, TIMEOUT)) { - - uint8_t status = resp.oldarg[0]; - if (status == 0) { - memcpy(card, (iso14b_card_select_t *)resp.data.asBytes, sizeof(iso14b_card_select_t)); - return true; - } + uint8_t status = resp.oldarg[0]; + if (status == 0) { + memcpy(card, (iso14b_card_select_t *)resp.data.asBytes, sizeof(iso14b_card_select_t)); + return true; } - } // retry - - if (retry <= 0) - PrintAndLogEx(WARNING, "timeout while waiting for reply."); + } + PrintAndLogEx(WARNING, "timeout while waiting for reply."); return false; } @@ -353,18 +346,18 @@ static bool get_14b_UID(iso14b_card_select_t *card) { // 5 = max frame size / -4 info // 6 = FWI / Coding options static void print_atqb_resp(uint8_t *data, uint8_t cid) { - //PrintAndLogEx(NORMAL, " UID: %s", sprint_hex(data+1,4)); - PrintAndLogEx(NORMAL, " App Data: %s", sprint_hex(data, 4)); - PrintAndLogEx(NORMAL, " Protocol: %s", sprint_hex(data + 4, 3)); + //PrintAndLogEx(SUCCESS, " UID: %s", sprint_hex(data+1,4)); + PrintAndLogEx(SUCCESS, " App Data: %s", sprint_hex(data, 4)); + PrintAndLogEx(SUCCESS, " Protocol: %s", sprint_hex(data + 4, 3)); uint8_t BitRate = data[4]; - if (!BitRate) PrintAndLogEx(NORMAL, " Bit Rate: 106 kbit/s only PICC <-> PCD"); - if (BitRate & 0x10) PrintAndLogEx(NORMAL, " Bit Rate: 212 kbit/s PICC -> PCD supported"); - if (BitRate & 0x20) PrintAndLogEx(NORMAL, " Bit Rate: 424 kbit/s PICC -> PCD supported"); - if (BitRate & 0x40) PrintAndLogEx(NORMAL, " Bit Rate: 847 kbit/s PICC -> PCD supported"); - if (BitRate & 0x01) PrintAndLogEx(NORMAL, " Bit Rate: 212 kbit/s PICC <- PCD supported"); - if (BitRate & 0x02) PrintAndLogEx(NORMAL, " Bit Rate: 424 kbit/s PICC <- PCD supported"); - if (BitRate & 0x04) PrintAndLogEx(NORMAL, " Bit Rate: 847 kbit/s PICC <- PCD supported"); - if (BitRate & 0x80) PrintAndLogEx(NORMAL, " Same bit rate <-> required"); + if (!BitRate) PrintAndLogEx(SUCCESS, " Bit Rate: 106 kbit/s only PICC <-> PCD"); + if (BitRate & 0x10) PrintAndLogEx(SUCCESS, " Bit Rate: 212 kbit/s PICC -> PCD supported"); + if (BitRate & 0x20) PrintAndLogEx(SUCCESS, " Bit Rate: 424 kbit/s PICC -> PCD supported"); + if (BitRate & 0x40) PrintAndLogEx(SUCCESS, " Bit Rate: 847 kbit/s PICC -> PCD supported"); + if (BitRate & 0x01) PrintAndLogEx(SUCCESS, " Bit Rate: 212 kbit/s PICC <- PCD supported"); + if (BitRate & 0x02) PrintAndLogEx(SUCCESS, " Bit Rate: 424 kbit/s PICC <- PCD supported"); + if (BitRate & 0x04) PrintAndLogEx(SUCCESS, " Bit Rate: 847 kbit/s PICC <- PCD supported"); + if (BitRate & 0x80) PrintAndLogEx(SUCCESS, " Same bit rate <-> required"); uint16_t maxFrame = data[5] >> 4; if (maxFrame < 5) maxFrame = 8 * maxFrame + 16; @@ -374,26 +367,26 @@ static void print_atqb_resp(uint8_t *data, uint8_t cid) { else if (maxFrame == 8) maxFrame = 256; else maxFrame = 257; - PrintAndLogEx(NORMAL, "Max Frame Size: %u%s bytes", maxFrame, (maxFrame == 257) ? "+ RFU" : ""); + PrintAndLogEx(SUCCESS, "Max Frame Size: %u%s bytes", maxFrame, (maxFrame == 257) ? "+ RFU" : ""); uint8_t protocolT = data[5] & 0xF; - PrintAndLogEx(NORMAL, " Protocol Type: Protocol is %scompliant with ISO/IEC 14443-4", (protocolT) ? "" : "not "); + PrintAndLogEx(SUCCESS, " Protocol Type: Protocol is %scompliant with ISO/IEC 14443-4", (protocolT) ? "" : "not "); uint8_t fwt = data[6] >> 4; if (fwt < 16) { uint32_t etus = (32 << fwt); uint32_t fwt_time = (302 << fwt); - PrintAndLogEx(NORMAL, "Frame Wait Integer: %u - %u ETUs | %u us", fwt, etus, fwt_time); + PrintAndLogEx(SUCCESS, "Frame Wait Integer: %u - %u ETUs | %u us", fwt, etus, fwt_time); } else { - PrintAndLogEx(NORMAL, "Frame Wait Integer: %u - RFU", fwt); + PrintAndLogEx(SUCCESS, "Frame Wait Integer: %u - RFU", fwt); } - PrintAndLogEx(NORMAL, " App Data Code: Application is %s", (data[6] & 4) ? "Standard" : "Proprietary"); - PrintAndLogEx(NORMAL, " Frame Options: NAD is %ssupported", (data[6] & 2) ? "" : "not "); - PrintAndLogEx(NORMAL, " Frame Options: CID is %ssupported", (data[6] & 1) ? "" : "not "); - PrintAndLogEx(NORMAL, "Tag :"); - PrintAndLogEx(NORMAL, " Max Buf Length: %u (MBLI) %s", cid >> 4, (cid & 0xF0) ? "" : "chained frames not supported"); - PrintAndLogEx(NORMAL, " CID : %u", cid & 0x0f); + PrintAndLogEx(SUCCESS, " App Data Code: Application is %s", (data[6] & 4) ? "Standard" : "Proprietary"); + PrintAndLogEx(SUCCESS, " Frame Options: NAD is %ssupported", (data[6] & 2) ? "" : "not "); + PrintAndLogEx(SUCCESS, " Frame Options: CID is %ssupported", (data[6] & 1) ? "" : "not "); + PrintAndLogEx(SUCCESS, "Tag :"); + PrintAndLogEx(SUCCESS, " Max Buf Length: %u (MBLI) %s", cid >> 4, (cid & 0xF0) ? "" : "chained frames not supported"); + PrintAndLogEx(SUCCESS, " CID : %u", cid & 0x0f); return; } @@ -482,9 +475,10 @@ static int print_ST_Lock_info(uint8_t model) { // print UID info from SRx chips (ST Microelectronics) static void print_st_general_info(uint8_t *data, uint8_t len) { //uid = first 8 bytes in data - PrintAndLogEx(NORMAL, " UID: %s", sprint_hex(SwapEndian64(data, 8, 8), len)); - PrintAndLogEx(NORMAL, " MFG: %02X, %s", data[6], getTagInfo(data[6])); - PrintAndLogEx(NORMAL, "Chip: %02X, %s", data[5] >> 2, get_ST_Chip_Model(data[5] >> 2)); + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(SUCCESS, " UID: " _GREEN_("%s"), sprint_hex(SwapEndian64(data, 8, 8), len)); + PrintAndLogEx(SUCCESS, " MFG: %02X, " _YELLOW_("%s"), data[6], getTagInfo(data[6])); + PrintAndLogEx(SUCCESS, "Chip: %02X, " _YELLOW_("%s"), data[5] >> 2, get_ST_Chip_Model(data[5] >> 2)); } //05 00 00 = find one tag in field @@ -515,7 +509,7 @@ static bool HF14B_Std_Info(bool verbose) { SendCommandMIX(CMD_HF_ISO14443B_COMMAND, ISO14B_CONNECT | ISO14B_SELECT_STD | ISO14B_DISCONNECT, 0, 0, NULL, 0); PacketResponseNG resp; - if (!WaitForResponseTimeout(CMD_ACK, &resp, TIMEOUT)) { + if (!WaitForResponseTimeout(CMD_HF_ISO14443B_COMMAND, &resp, TIMEOUT)) { if (verbose) PrintAndLogEx(WARNING, "command execution timeout"); switch_off_field_14b(); return false; @@ -529,7 +523,7 @@ static bool HF14B_Std_Info(bool verbose) { switch (status) { case 0: PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(SUCCESS, " UID : %s", sprint_hex(card.uid, card.uidlen)); + PrintAndLogEx(SUCCESS, " UID : " _GREEN_("%s"), sprint_hex(card.uid, card.uidlen)); PrintAndLogEx(SUCCESS, " ATQB : %s", sprint_hex(card.atqb, sizeof(card.atqb))); PrintAndLogEx(SUCCESS, " CHIPID : %02X", card.chipid); print_atqb_resp(card.atqb, card.cid); @@ -556,7 +550,7 @@ static bool HF14B_ST_Info(bool verbose) { SendCommandMIX(CMD_HF_ISO14443B_COMMAND, ISO14B_CONNECT | ISO14B_SELECT_SR | ISO14B_DISCONNECT, 0, 0, NULL, 0); PacketResponseNG resp; - if (!WaitForResponseTimeout(CMD_ACK, &resp, TIMEOUT)) { + if (!WaitForResponseTimeout(CMD_HF_ISO14443B_COMMAND, &resp, TIMEOUT)) { if (verbose) PrintAndLogEx(WARNING, "command execution timeout"); return false; } @@ -611,7 +605,7 @@ static bool HF14B_ST_Reader(bool verbose) { clearCommandBuffer(); SendCommandMIX(CMD_HF_ISO14443B_COMMAND, ISO14B_CONNECT | ISO14B_SELECT_SR | ISO14B_DISCONNECT, 0, 0, NULL, 0); PacketResponseNG resp; - if (!WaitForResponseTimeout(CMD_ACK, &resp, TIMEOUT)) { + if (!WaitForResponseTimeout(CMD_HF_ISO14443B_COMMAND, &resp, TIMEOUT)) { if (verbose) PrintAndLogEx(WARNING, "command execution timeout"); return false; } @@ -651,7 +645,7 @@ static bool HF14B_Std_Reader(bool verbose) { SendCommandMIX(CMD_HF_ISO14443B_COMMAND, ISO14B_CONNECT | ISO14B_SELECT_STD | ISO14B_DISCONNECT, 0, 0, NULL, 0); PacketResponseNG resp; - if (!WaitForResponseTimeout(CMD_ACK, &resp, TIMEOUT)) { + if (!WaitForResponseTimeout(CMD_HF_ISO14443B_COMMAND, &resp, TIMEOUT)) { if (verbose) PrintAndLogEx(WARNING, "command execution timeout"); return false; } @@ -664,7 +658,7 @@ static bool HF14B_Std_Reader(bool verbose) { switch (status) { case 0: PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(SUCCESS, " UID : %s", sprint_hex(card.uid, card.uidlen)); + PrintAndLogEx(SUCCESS, " UID : " _GREEN_("%s"), sprint_hex(card.uid, card.uidlen)); PrintAndLogEx(SUCCESS, " ATQB : %s", sprint_hex(card.atqb, sizeof(card.atqb))); PrintAndLogEx(SUCCESS, " CHIPID : %02X", card.chipid); print_atqb_resp(card.atqb, card.cid); @@ -684,7 +678,7 @@ static bool HF14B_Std_Reader(bool verbose) { } // test for other 14b type tags (mimic another reader - don't have tags to identify) -static bool HF14B_Other_Reader() { +static bool HF14B_Other_Reader(void) { // uint8_t data[] = {0x00, 0x0b, 0x3f, 0x80}; // uint8_t datalen = 4; @@ -693,9 +687,9 @@ static bool HF14B_Other_Reader() { // uint32_t flags = ISO14B_CONNECT | ISO14B_SELECT_STD | ISO14B_RAW | ISO14B_APPEND_CRC; // clearCommandBuffer(); - // SendCommandOLD(CMD_HF_ISO14443B_COMMAND, flags, datalen, 0, data, datalen); + // SendCommandMIX(CMD_HF_ISO14443B_COMMAND, flags, datalen, 0, data, datalen); // PacketResponseNG resp; - // WaitForResponse(CMD_ACK,&resp); + // WaitForResponse(CMD_HF_ISO14443B_COMMAND,&resp); // if (datalen > 2 ) { // PrintAndLogEx(NORMAL, "\n14443-3b tag found:"); @@ -707,9 +701,9 @@ static bool HF14B_Other_Reader() { // data[0] = ISO14443B_AUTHENTICATE; // clearCommandBuffer(); - // SendCommandOLD(CMD_HF_ISO14443B_COMMAND, flags, 1, 0, data, 1); + // SendCommandMIX(CMD_HF_ISO14443B_COMMAND, flags, 1, 0, data, 1); // PacketResponseNG resp; - // WaitForResponse(CMD_ACK, &resp); + // WaitForResponse(CMD_HF_ISO14443B_COMMAND, &resp); // if (datalen > 0) { // PrintAndLogEx(NORMAL, "\n14443-3b tag found:"); @@ -721,9 +715,9 @@ static bool HF14B_Other_Reader() { // data[0] = ISO14443B_RESET; // clearCommandBuffer(); - // SendCommandOLD(CMD_HF_ISO14443B_COMMAND, flags, 1, 0, data, 1); + // SendCommandMIX(CMD_HF_ISO14443B_COMMAND, flags, 1, 0, data, 1); // PacketResponseNG resp; - // WaitForResponse(CMD_ACK, &resp); + // WaitForResponse(CMD_HF_ISO14443B_COMMAND, &resp); // if (datalen > 0) { // PrintAndLogEx(NORMAL, "\n14443-3b tag found:"); @@ -741,7 +735,6 @@ static bool HF14B_Other_Reader() { static int CmdHF14BReader(const char *Cmd) { char cmdp = tolower(param_getchar(Cmd, 0)); if (cmdp == 'h') return usage_hf_14b_reader(); - bool verbose = !(cmdp == 's'); return readHF14B(verbose); } @@ -759,8 +752,11 @@ static int CmdHF14BReadSri(const char *Cmd) { clearCommandBuffer(); SendCommandMIX(CMD_HF_SRI_READ, blocks, 0, 0, NULL, 0); - return 0; + + // iceman: should download read data and print in client. + return PM3_SUCCESS; } + // New command to write a SRI512/SRIX4K tag. static int CmdHF14BWriteSri(const char *Cmd) { /* @@ -874,7 +870,7 @@ static int CmdHF14BDump(const char *Cmd) { break; } - if (!get_14b_UID(&card)) { + if (get_14b_UID(&card) == false) { PrintAndLogEx(WARNING, "No tag found."); return PM3_SUCCESS; } @@ -899,7 +895,7 @@ static int CmdHF14BDump(const char *Cmd) { SendCommandMIX(CMD_HF_ISO14443B_COMMAND, ISO14B_CONNECT | ISO14B_SELECT_SR, 0, 0, NULL, 0); //select - if (WaitForResponseTimeout(CMD_ACK, &resp, 2000)) { + if (WaitForResponseTimeout(CMD_HF_ISO14443B_COMMAND, &resp, 2000)) { if (resp.oldarg[0]) { PrintAndLogEx(INFO, "failed to select %" PRId64 " | %" PRId64, resp.oldarg[0], resp.oldarg[1]); goto out; @@ -913,9 +909,9 @@ static int CmdHF14BDump(const char *Cmd) { req[1] = blocknum; clearCommandBuffer(); - SendCommandOLD(CMD_HF_ISO14443B_COMMAND, ISO14B_APPEND_CRC | ISO14B_RAW, 2, 0, req, sizeof(req)); + SendCommandMIX(CMD_HF_ISO14443B_COMMAND, ISO14B_APPEND_CRC | ISO14B_RAW, 2, 0, req, sizeof(req)); - if (WaitForResponseTimeout(CMD_ACK, &resp, 2000)) { + if (WaitForResponseTimeout(CMD_HF_ISO14443B_COMMAND, &resp, 2000)) { uint8_t status = resp.oldarg[0] & 0xFF; if (status > 0) { @@ -925,7 +921,7 @@ static int CmdHF14BDump(const char *Cmd) { uint16_t len = (resp.oldarg[1] & 0xFFFF); recv = resp.data.asBytes; - if (!check_crc(CRC_14443_B, recv, len)) { + if (check_crc(CRC_14443_B, recv, len) == false) { PrintAndLogEx(FAILED, "crc fail, retrying one more time"); continue; } @@ -937,7 +933,6 @@ static int CmdHF14BDump(const char *Cmd) { break; } - retry = 0; blocknum++; if (blocknum > blocks) { @@ -955,7 +950,7 @@ static int CmdHF14BDump(const char *Cmd) { goto out; } - PrintAndLogEx(NORMAL, "\n"); + PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "block# | data | ascii"); PrintAndLogEx(NORMAL, "---------+--------------+----------"); @@ -969,12 +964,13 @@ static int CmdHF14BDump(const char *Cmd) { ); } - PrintAndLogEx(NORMAL, "\n"); + PrintAndLogEx(NORMAL, ""); size_t datalen = (blocks + 1) * 4; saveFileEML(filename, data, datalen, 4); saveFile(filename, ".bin", data, datalen); + // JSON? out: return switch_off_field_14b(); } @@ -1096,7 +1092,7 @@ static command_t CommandTable[] = { {"sniff", CmdHF14BSniff, IfPm3Iso14443b, "Eavesdrop ISO 14443B"}, {"sriread", CmdHF14BReadSri, IfPm3Iso14443b, "Read contents of a SRI512 | SRIX4K tag"}, {"sriwrite", CmdHF14BWriteSri, IfPm3Iso14443b, "Write data to a SRI512 | SRIX4K tag"}, - //{"valid", srix4kValid, AlwaysAvailable, "srix4k checksum test"}, +// {"valid", srix4kValid, AlwaysAvailable, "srix4k checksum test"}, {NULL, NULL, NULL, NULL} }; diff --git a/client/src/cmdhf15.c b/client/src/cmdhf15.c index 620a75bd7..49ed24c43 100644 --- a/client/src/cmdhf15.c +++ b/client/src/cmdhf15.c @@ -25,7 +25,7 @@ #include "cmdhf15.h" #include #include "cmdparser.h" // command_t -#include "commonutil.h" // ARRAYLEN +#include "commonutil.h" // ARRAYLEN #include "comms.h" // clearCommandBuffer #include "cmdtrace.h" #include "iso15693tools.h" @@ -62,7 +62,6 @@ typedef struct { const char *desc; } productName; - const productName uidmapping[] = { // UID, #significant Bits, "Vendor(+Product)" @@ -210,6 +209,167 @@ const productName uidmapping[] = { static int CmdHF15Help(const char *Cmd); +static int usage_15_demod(void) { + PrintAndLogEx(NORMAL, "Tries to demodulate / decode ISO15693, from downloaded samples.\n" + "Gather samples with 'hf 15 read' / 'hf 15 record'"); + return PM3_SUCCESS; +} +static int usage_15_samples(void) { + PrintAndLogEx(NORMAL, "Acquire samples as Reader (enables carrier, send inquiry\n" + "and download it to graphbuffer. Try 'hf 15 demod' to try to demodulate/decode signal"); + return PM3_SUCCESS; +} +static int usage_15_info(void) { + PrintAndLogEx(NORMAL, "Uses the optional command 'get_systeminfo' 0x2B to try and extract information\n" + "command may fail, depending on tag.\n" + "defaults to '1 out of 4' mode\n" + "\n" + "Usage: hf 15 info [options] \n" + "Options:\n" + "\t-2 use slower '1 out of 256' mode\n" + "\tuid (either): \n" + "\t <8B hex> full UID eg E011223344556677\n" + "\t u unaddressed mode\n" + "\t * scan for tag\n" + "Examples:\n" + _YELLOW_("\thf 15 info u")); + return PM3_SUCCESS; +} +static int usage_15_record(void) { + PrintAndLogEx(NORMAL, "Record activity without enabling carrier"); + return PM3_SUCCESS; +} +static int usage_15_reader(void) { + PrintAndLogEx(NORMAL, "This command identifies a ISO 15693 tag\n" + "\n" + "Usage: hf 15 reader [h]\n" + "Options:\n" + "\th this help\n" + "\t1 read once\n" + "\n" + "Example:\n" + _YELLOW_("\thf 15 reader\n") + _YELLOW_("\thf 15 reader 1\n")); + return PM3_SUCCESS; +} +static int usage_15_sim(void) { + PrintAndLogEx(NORMAL, "Usage: hf 15 sim \n" + "\n" + "Example:\n" + _YELLOW_("\thf 15 sim E016240000000000")); + return PM3_SUCCESS; +} +static int usage_15_findafi(void) { + PrintAndLogEx(NORMAL, "This command attempts to brute force AFI of an ISO15693 tag\n" + "\n" + "Usage: hf 15 findafi"); + return PM3_SUCCESS; +} +static int usage_15_writeafi(void) { + PrintAndLogEx(NORMAL, "Usage: hf 15 writeafi \n" + "\tuid (either): \n" + "\t <8B hex> full UID eg E011223344556677\n" + "\t u unaddressed mode\n" + "\t * scan for tag\n" + "\t AFI number 0-255"); + return PM3_SUCCESS; +} +static int usage_15_writedsfid(void) { + PrintAndLogEx(NORMAL, "Usage: hf 15 writedsfid \n" + "\tuid (either): \n" + "\t <8B hex> full UID eg E011223344556677\n" + "\t u unaddressed mode\n" + "\t * scan for tag\n" + "\t DSFID number 0-255"); + return PM3_SUCCESS; +} +static int usage_15_dump(void) { + PrintAndLogEx(NORMAL, "This command dumps the contents of a ISO-15693 tag and save it to file\n" + "\n" + "Usage: hf 15 dump [h] \n" + "Options:\n" + "\th this help\n" + "\tf filename, if no UID will be used as filename\n" + "\n" + "Example:\n" + _YELLOW_("\thf 15 dump f\n") + _YELLOW_("\thf 15 dump f mydump")); + return PM3_SUCCESS; +} +static int usage_15_restore(void) { + const char *options[][2] = { + {"h", "this help"}, + {"-2", "use slower '1 out of 256' mode"}, + {"-o", "set OPTION Flag (needed for TI)"}, + {"a", "use addressed mode"}, + {"r ", "numbers of retries on error, default is 3"}, + {"f ", "load "}, + {"b ", "block size, default is 4"} + }; + PrintAndLogEx(NORMAL, "Usage: hf 15 restore [-2] [-o] [h] [r ] [u ] [f ] [b ]"); + PrintAndLogOptions(options, 7, 3); + return PM3_SUCCESS; +} +static int usage_15_raw(void) { + const char *options[][2] = { + {"-r", "do not read response" }, + {"-2", "use slower '1 out of 256' mode" }, + {"-c", "calculate and append CRC" }, + {"-p", "leave the signal field ON" }, + {"", "Tip: turn on debugging for verbose output"}, + }; + PrintAndLogEx(NORMAL, "Usage: hf 15 raw [-r] [-2] [-c] <0A 0B 0C ... hex>\n"); + PrintAndLogOptions(options, 4, 3); + return PM3_SUCCESS; +} +static int usage_15_read(void) { + PrintAndLogEx(NORMAL, "Usage: hf 15 read [options] \n" + "Options:\n" + "\t-2 use slower '1 out of 256' mode\n" + "\tuid (either): \n" + "\t <8B hex> full UID eg E011223344556677\n" + "\t u unaddressed mode\n" + "\t * scan for tag\n" + "\t page number 0-255"); + return PM3_SUCCESS; +} +static int usage_15_write(void) { + PrintAndLogEx(NORMAL, "Usage: hf 15 write [options] \n" + "Options:\n" + "\t-2 use slower '1 out of 256' mode\n" + "\t-o set OPTION Flag (needed for TI)\n" + "\tuid (either): \n" + "\t <8B hex> full UID eg E011223344556677\n" + "\t u unaddressed mode\n" + "\t * scan for tag\n" + "\t page number 0-255\n" + "\t data to be written eg AA BB CC DD"); + return PM3_SUCCESS; +} +static int usage_15_readmulti(void) { + PrintAndLogEx(NORMAL, "Usage: hf 15 readmulti [options] \n" + "Options:\n" + "\t-2 use slower '1 out of 256' mode\n" + "\tuid (either): \n" + "\t <8B hex> full UID eg E011223344556677\n" + "\t u unaddressed mode\n" + "\t * scan for tag\n" + "\t 0-255, page number to start\n" + "\t 1-6, number of pages"); + return PM3_SUCCESS; +} +static int usage_15_csetuid(void) { + PrintAndLogEx(NORMAL, "Set UID for magic Chinese card (only works with such cards)\n" + "\n" + "Usage: hf 15 csetuid \n" + "Options:\n" + "\tuid : <8B hex> full UID eg E011223344556677\n" + "\n" + "Example:\n" + _YELLOW_("\thf 15 csetuid E011223344556677")); + return PM3_SUCCESS; +} + static int nxp_15693_print_signature(uint8_t *uid, uint8_t *signature) { #define PUBLIC_ECDA_KEYLEN 33 @@ -260,10 +420,8 @@ static int nxp_15693_print_signature(uint8_t *uid, uint8_t *signature) { 0x29, 0x29, 0xfd, 0xcd, 0x69, 0x8b, 0x34, 0x68, 0xf2 } }; - */ - + */ uint8_t i; - int res; bool is_valid = false; for (i = 0; i < ARRAYLEN(nxp_15693_public_keys); i++) { @@ -271,14 +429,14 @@ static int nxp_15693_print_signature(uint8_t *uid, uint8_t *signature) { uint8_t key[PUBLIC_ECDA_KEYLEN]; param_gethex_to_eol(nxp_15693_public_keys[i].value, 0, key, PUBLIC_ECDA_KEYLEN, &dl); - res = ecdsa_signature_r_s_verify(MBEDTLS_ECP_DP_SECP128R1, key, uid, 8, signature, 32, false); + int res = ecdsa_signature_r_s_verify(MBEDTLS_ECP_DP_SECP128R1, key, uid, 8, signature, 32, false); is_valid = (res == 0); if (is_valid) break; } PrintAndLogEx(NORMAL, ""); - if (is_valid == false) { + if (is_valid == false || i == ARRAYLEN(nxp_15693_public_keys)) { PrintAndLogEx(SUCCESS, "Signature verification " _RED_("failed")); return PM3_ESOFT; } @@ -292,42 +450,6 @@ static int nxp_15693_print_signature(uint8_t *uid, uint8_t *signature) { return PM3_SUCCESS; } -// fast method to just read the UID of a tag (collision detection not supported) -// *buf should be large enough to fit the 64bit uid -// returns 1 if succeeded -static bool getUID(uint8_t *buf) { - - PacketResponseNG resp; - uint8_t data[5]; - data[0] = ISO15_REQ_SUBCARRIER_SINGLE | ISO15_REQ_DATARATE_HIGH | ISO15_REQ_INVENTORY | ISO15_REQINV_SLOT1; - data[1] = ISO15_CMD_INVENTORY; - data[2] = 0; // mask length - - AddCrc15(data, 3); - - uint8_t retry; - - // don't give up the at the first try - for (retry = 0; retry < 3; retry++) { - - clearCommandBuffer(); - SendCommandOLD(CMD_HF_ISO15693_COMMAND, sizeof(data), 1, 1, data, sizeof(data)); - - if (WaitForResponseTimeout(CMD_ACK, &resp, 2000)) { - - uint8_t resplen = resp.oldarg[0]; - if (resplen >= 12 && CheckCrc15(resp.data.asBytes, 12)) { - memcpy(buf, resp.data.asBytes + 2, 8); - DropField(); - return true; - } - } - } // retry - - DropField(); - return false; -} - // get a product description based on the UID // uid[8] tag uid // returns description of the best match @@ -380,163 +502,62 @@ static const char *TagErrorStr(uint8_t error) { } } -static int usage_15_demod(void) { - PrintAndLogEx(NORMAL, "Tries to demodulate / decode ISO15693, from downloaded samples.\n" - "Gather samples with 'hf 15 read' / 'hf 15 record'"); - return PM3_SUCCESS; +// fast method to just read the UID of a tag (collision detection not supported) +// *buf should be large enough to fit the 64bit uid +// returns 1 if succeeded +static bool getUID(bool loop, uint8_t *buf) { + + uint8_t data[5]; + data[0] = ISO15_REQ_SUBCARRIER_SINGLE | ISO15_REQ_DATARATE_HIGH | ISO15_REQ_INVENTORY | ISO15_REQINV_SLOT1; + data[1] = ISO15_CMD_INVENTORY; + data[2] = 0; // mask length + + AddCrc15(data, 3); + + // params + uint8_t fast = 1; + uint8_t reply = 1; + + while (kbd_enter_pressed() == false) { + clearCommandBuffer(); + SendCommandMIX(CMD_HF_ISO15693_COMMAND, sizeof(data), fast, reply, data, sizeof(data)); + PacketResponseNG resp; + if (WaitForResponseTimeout(CMD_ACK, &resp, 2000)) { + + int resplen = resp.oldarg[0]; + if (resplen >= 12 && CheckCrc15(resp.data.asBytes, 12)) { + + if (buf) + memcpy(buf, resp.data.asBytes + 2, 8); + + DropField(); + + PrintAndLogEx(NORMAL, ""); + PrintAndLogEx(SUCCESS, " UID: " _GREEN_("%s"), iso15693_sprintUID(NULL, buf)); + PrintAndLogEx(SUCCESS, "TYPE: " _YELLOW_("%s"), getTagInfo_15(buf)); + + if (loop == false) { + return true; + } + } + } + if (loop == false) { + break; + } + } + + DropField(); + return false; } -static int usage_15_samples(void) { - PrintAndLogEx(NORMAL, "Acquire samples as Reader (enables carrier, send inquiry\n" - "and download it to graphbuffer. Try 'hf 15 demod' to try to demodulate/decode signal"); - return PM3_SUCCESS; -} -static int usage_15_info(void) { - PrintAndLogEx(NORMAL, "Uses the optional command 'get_systeminfo' 0x2B to try and extract information\n" - "command may fail, depending on tag.\n" - "defaults to '1 out of 4' mode\n" - "\n" - "Usage: hf 15 info [options] \n" - "Options:\n" - "\t-2 use slower '1 out of 256' mode\n" - "\tuid (either): \n" - "\t <8B hex> full UID eg E011223344556677\n" - "\t u unaddressed mode\n" - "\t * scan for tag\n" - "Examples:\n" - "\thf 15 info u"); - return PM3_SUCCESS; -} -static int usage_15_record(void) { - PrintAndLogEx(NORMAL, "Record activity without enabling carrier"); - return PM3_SUCCESS; -} -static int usage_15_reader(void) { - PrintAndLogEx(NORMAL, "This command identifies a ISO 15693 tag\n" - "\n" - "Usage: hf 15 reader [h]\n" - "Options:\n" - "\th this help\n" - "\n" - "Example:\n" - "\thf 15 reader"); - return PM3_SUCCESS; -} -static int usage_15_sim(void) { - PrintAndLogEx(NORMAL, "Usage: hf 15 sim \n" - "\n" - "Example:\n" - "\thf 15 sim E016240000000000"); - return PM3_SUCCESS; -} -static int usage_15_findafi(void) { - PrintAndLogEx(NORMAL, "This command attempts to brute force AFI of an ISO15693 tag\n" - "\n" - "Usage: hf 15 findafi"); - return PM3_SUCCESS; -} -static int usage_15_writeafi(void) { - PrintAndLogEx(NORMAL, "Usage: hf 15 writeafi \n" - "\tuid (either): \n" - "\t <8B hex> full UID eg E011223344556677\n" - "\t u unaddressed mode\n" - "\t * scan for tag\n" - "\tafi#: AFI number 0-255"); - return PM3_SUCCESS; -} -static int usage_15_writedsfid(void) { - PrintAndLogEx(NORMAL, "Usage: hf 15 writedsfid \n" - "\tuid (either): \n" - "\t <8B hex> full UID eg E011223344556677\n" - "\t u unaddressed mode\n" - "\t * scan for tag\n" - "\tdsfid#: DSFID number 0-255"); - return PM3_SUCCESS; -} -static int usage_15_dump(void) { - PrintAndLogEx(NORMAL, "This command dumps the contents of a ISO-15693 tag and save it to file\n" - "\n" - "Usage: hf 15 dump [h] \n" - "Options:\n" - "\th this help\n" - "\tf filename, if no UID will be used as filename\n" - "\n" - "Example:\n" - "\thf 15 dump f\n" - "\thf 15 dump f mydump"); - return PM3_SUCCESS; -} -static int usage_15_restore(void) { - const char *options[][2] = { - {"h", "this help"}, - {"-2", "use slower '1 out of 256' mode"}, - {"-o", "set OPTION Flag (needed for TI)"}, - {"r ", "numbers of retries on error, default is 3"}, - {"u ", "load hf-15--dump.bin"}, - {"f ", "load "}, - {"b ", "block size, default is 4"} - }; - PrintAndLogEx(NORMAL, "Usage: hf 15 restore [-2] [-o] [h] [r ] [u ] [f ] [b ]"); - PrintAndLogOptions(options, 7, 3); - return PM3_SUCCESS; -} -static int usage_15_raw(void) { - const char *options[][2] = { - {"-r", "do not read response" }, - {"-2", "use slower '1 out of 256' mode" }, - {"-c", "calculate and append CRC" }, - {"-p", "leave the signal field ON" }, - {"", "Tip: turn on debugging for verbose output"}, - }; - PrintAndLogEx(NORMAL, "Usage: hf 15 raw [-r] [-2] [-c] <0A 0B 0C ... hex>\n"); - PrintAndLogOptions(options, 4, 3); - return PM3_SUCCESS; -} -static int usage_15_read(void) { - PrintAndLogEx(NORMAL, "Usage: hf 15 read [options] \n" - "Options:\n" - "\t-2 use slower '1 out of 256' mode\n" - "\tuid (either): \n" - "\t <8B hex> full UID eg E011223344556677\n" - "\t u unaddressed mode\n" - "\t * scan for tag\n" - "\tpage#: page number 0-255"); - return PM3_SUCCESS; -} -static int usage_15_write(void) { - PrintAndLogEx(NORMAL, "Usage: hf 15 write [options] \n" - "Options:\n" - "\t-2 use slower '1 out of 256' mode\n" - "\t-o set OPTION Flag (needed for TI)\n" - "\tuid (either): \n" - "\t <8B hex> full UID eg E011223344556677\n" - "\t u unaddressed mode\n" - "\t * scan for tag\n" - "\tpage#: page number 0-255\n" - "\thexdata: data to be written eg AA BB CC DD"); - return PM3_SUCCESS; -} -static int usage_15_readmulti(void) { - PrintAndLogEx(NORMAL, "Usage: hf 15 readmulti [options] \n" - "Options:\n" - "\t-2 use slower '1 out of 256' mode\n" - "\tuid (either): \n" - "\t <8B hex> full UID eg E011223344556677\n" - "\t u unaddressed mode\n" - "\t * scan for tag\n" - "\tstart#: page number to start 0-255\n" - "\tcount#: number of pages"); - return PM3_SUCCESS; -} -static int usage_15_csetuid(void) { - PrintAndLogEx(NORMAL, "Set UID for magic Chinese card (only works with such cards)\n" - "\n" - "Usage: hf 15 csetuid \n" - "Options:\n" - "\tuid : <8B hex> full UID eg E011223344556677\n" - "\n" - "Example:\n" - "\thf 15 csetuid E011223344556677"); - return PM3_SUCCESS; + +// used with 'hf search' +bool readHF15Uid(bool loop, bool verbose) { + uint8_t uid[8] = {0}; + if (getUID(loop, uid) == false) { + if (verbose) PrintAndLogEx(WARNING, "No tag found"); + return false; + } + return true; } /** @@ -584,7 +605,7 @@ static bool prepareHF15Cmd(char **cmd, uint16_t *reqlen, uint8_t *arg1, uint8_t req[tmpreqlen++] |= ISO15_REQ_SUBCARRIER_SINGLE | ISO15_REQ_DATARATE_HIGH | ISO15_REQ_NONINVENTORY | ISO15_REQ_ADDRESS; req[tmpreqlen++] = iso15cmd; - if (!getUID(uid)) { + if (getUID(false, uid) == false) { PrintAndLogEx(WARNING, "No tag found"); return false; } @@ -595,7 +616,6 @@ static bool prepareHF15Cmd(char **cmd, uint16_t *reqlen, uint8_t *arg1, uint8_t default: req[tmpreqlen++] |= ISO15_REQ_SUBCARRIER_SINGLE | ISO15_REQ_DATARATE_HIGH | ISO15_REQ_NONINVENTORY | ISO15_REQ_ADDRESS; req[tmpreqlen++] = iso15cmd; - // parse UID for (int i = 0; i < 8 && (*cmd)[i * 2] && (*cmd)[i * 2 + 1]; i++) { sscanf((char[]) {(*cmd)[i * 2], (*cmd)[i * 2 + 1], 0}, "%X", &temp); @@ -711,17 +731,85 @@ static int CmdHF15Samples(const char *Cmd) { // Get NXP system information from SLIX2 tag/VICC static int NxpSysInfo(uint8_t *uid) { - PacketResponseNG resp; - uint8_t *recv; - uint8_t req[PM3_CMD_DATA_SIZE] = {0}; - uint16_t reqlen; - uint32_t status; - uint8_t arg1 = 1; - if (uid != NULL) { + if (uid == NULL) { + return PM3_EINVARG; + } + + uint8_t req[PM3_CMD_DATA_SIZE] = {0}; + uint8_t fast = 1; + uint8_t reply = 1; + uint16_t reqlen = 0; + + req[reqlen++] |= ISO15_REQ_SUBCARRIER_SINGLE | ISO15_REQ_DATARATE_HIGH | ISO15_REQ_NONINVENTORY | ISO15_REQ_ADDRESS; + req[reqlen++] = ISO15_CMD_GETNXPSYSTEMINFO; + req[reqlen++] = 0x04; // IC manufacturer code + memcpy(req + 3, uid, 8); // add UID + reqlen += 8; + + AddCrc15(req, reqlen); + reqlen += 2; + + PacketResponseNG resp; + clearCommandBuffer(); + SendCommandMIX(CMD_HF_ISO15693_COMMAND, reqlen, fast, reply, req, reqlen); + if (!WaitForResponseTimeout(CMD_ACK, &resp, 2000)) { + PrintAndLogEx(WARNING, "iso15693 timeout"); + DropField(); + return PM3_ETIMEOUT; + } + + DropField(); + + int status = resp.oldarg[0]; + if (status < 2) { + PrintAndLogEx(WARNING, "iso15693 card doesn't answer to NXP systeminfo command"); + return PM3_EWRONGANSWER; + } + + uint8_t *recv = resp.data.asBytes; + + if ((recv[0] & ISO15_RES_ERROR) == ISO15_RES_ERROR) { + PrintAndLogEx(ERR, "iso15693 card returned error %i: %s", recv[0], TagErrorStr(recv[0])); + return PM3_EWRONGANSWER; + } + + bool support_signature = (recv[5] & 0x01); + bool support_easmode = (recv[4] & 0x03); + + PrintAndLogEx(INFO, "--------- " _CYAN_("NXP Sysinfo") " ---------"); + PrintAndLogEx(INFO, " raw : %s", sprint_hex(recv, 8)); + PrintAndLogEx(INFO, " Password protection configuration:"); + PrintAndLogEx(INFO, " * Page L read%s password protected", ((recv[2] & 0x01) ? "" : " not")); + PrintAndLogEx(INFO, " * Page L write%s password protected", ((recv[2] & 0x02) ? "" : " not")); + PrintAndLogEx(INFO, " * Page H read%s password protected", ((recv[2] & 0x08) ? "" : " not")); + PrintAndLogEx(INFO, " * Page H write%s password protected", ((recv[2] & 0x20) ? "" : " not")); + + PrintAndLogEx(INFO, " Lock bits:"); + PrintAndLogEx(INFO, " * AFI%s locked", ((recv[3] & 0x01) ? "" : " not")); // AFI lock bit + PrintAndLogEx(INFO, " * EAS%s locked", ((recv[3] & 0x02) ? "" : " not")); // EAS lock bit + PrintAndLogEx(INFO, " * DSFID%s locked", ((recv[3] & 0x03) ? "" : " not")); // DSFID lock bit + PrintAndLogEx(INFO, " * Password protection configuration%s locked", ((recv[3] & 0x04) ? "" : " not")); // Password protection pointer address and access conditions lock bit + + PrintAndLogEx(INFO, " Features:"); + PrintAndLogEx(INFO, " * User memory password protection%s supported", ((recv[4] & 0x01) ? "" : " not")); + PrintAndLogEx(INFO, " * Counter feature%s supported", ((recv[4] & 0x02) ? "" : " not")); + PrintAndLogEx(INFO, " * EAS ID%s supported by EAS ALARM command", support_easmode ? "" : " not"); + PrintAndLogEx(INFO, " * EAS password protection%s supported", ((recv[4] & 0x04) ? "" : " not")); + PrintAndLogEx(INFO, " * AFI password protection%s supported", ((recv[4] & 0x10) ? "" : " not")); + PrintAndLogEx(INFO, " * Extended mode%s supported by INVENTORY READ command", ((recv[4] & 0x20) ? "" : " not")); + PrintAndLogEx(INFO, " * EAS selection%s supported by extended mode in INVENTORY READ command", ((recv[4] & 0x40) ? "" : " not")); + PrintAndLogEx(INFO, " * READ SIGNATURE command%s supported", support_signature ? "" : " not"); + PrintAndLogEx(INFO, " * Password protection for READ SIGNATURE command%s supported", ((recv[5] & 0x02) ? "" : " not")); + PrintAndLogEx(INFO, " * STAY QUIET PERSISTENT command%s supported", ((recv[5] & 0x03) ? "" : " not")); + PrintAndLogEx(INFO, " * ENABLE PRIVACY command%s supported", ((recv[5] & 0x10) ? "" : " not")); + PrintAndLogEx(INFO, " * DESTROY command%s supported", ((recv[5] & 0x20) ? "" : " not")); + PrintAndLogEx(INFO, " * Additional 32 bits feature flags are%s transmitted", ((recv[5] & 0x80) ? "" : " not")); + + if (support_easmode) { reqlen = 0; req[reqlen++] |= ISO15_REQ_SUBCARRIER_SINGLE | ISO15_REQ_DATARATE_HIGH | ISO15_REQ_NONINVENTORY | ISO15_REQ_ADDRESS; - req[reqlen++] = ISO15_CMD_GETNXPSYSTEMINFO; + req[reqlen++] = ISO15_CMD_EASALARM; req[reqlen++] = 0x04; // IC manufacturer code memcpy(req + 3, uid, 8); // add UID reqlen += 8; @@ -729,13 +817,45 @@ static int NxpSysInfo(uint8_t *uid) { AddCrc15(req, reqlen); reqlen += 2; - //PrintAndLogEx(NORMAL, "cmd %s", sprint_hex(req, reqlen) ); - clearCommandBuffer(); - SendCommandOLD(CMD_HF_ISO15693_COMMAND, reqlen, arg1, 1, req, reqlen); + SendCommandMIX(CMD_HF_ISO15693_COMMAND, reqlen, fast, reply, req, reqlen); if (!WaitForResponseTimeout(CMD_ACK, &resp, 2000)) { - PrintAndLogEx(WARNING, "iso15693 card select failed"); + PrintAndLogEx(WARNING, "iso15693 timeout"); + } else { + PrintAndLogEx(NORMAL, ""); + + status = resp.oldarg[0]; + if (status < 2) { + PrintAndLogEx(INFO, " EAS (Electronic Article Surveillance) is not active"); + } else { + recv = resp.data.asBytes; + + if (!(recv[0] & ISO15_RES_ERROR)) { + PrintAndLogEx(INFO, " EAS (Electronic Article Surveillance) is active."); + PrintAndLogEx(INFO, " EAS sequence: %s", sprint_hex(recv + 1, 32)); + } + } + } + } + + if (support_signature) { + // Check if we can also read the signature + reqlen = 0; + req[reqlen++] |= ISO15_REQ_SUBCARRIER_SINGLE | ISO15_REQ_DATARATE_HIGH | ISO15_REQ_NONINVENTORY | ISO15_REQ_ADDRESS; + req[reqlen++] = ISO15_CMD_READSIGNATURE; + req[reqlen++] = 0x04; // IC manufacturer code + memcpy(req + 3, uid, 8); // add UID + reqlen += 8; + + AddCrc15(req, reqlen); + reqlen += 2; + + clearCommandBuffer(); + SendCommandMIX(CMD_HF_ISO15693_COMMAND, reqlen, fast, reply, req, reqlen); + + if (!WaitForResponseTimeout(CMD_ACK, &resp, 2000)) { + PrintAndLogEx(WARNING, "iso15693 timeout"); DropField(); return PM3_ETIMEOUT; } @@ -743,134 +863,22 @@ static int NxpSysInfo(uint8_t *uid) { DropField(); status = resp.oldarg[0]; - if (status < 2) { - PrintAndLogEx(WARNING, "iso15693 card doesn't answer to NXP systeminfo command"); - return PM3_EWRONGANSVER; + PrintAndLogEx(WARNING, "iso15693 card doesn't answer to READ SIGNATURE command"); + return PM3_EWRONGANSWER; } recv = resp.data.asBytes; - if (recv[0] & ISO15_RES_ERROR) { + if ((recv[0] & ISO15_RES_ERROR) == ISO15_RES_ERROR) { PrintAndLogEx(ERR, "iso15693 card returned error %i: %s", recv[0], TagErrorStr(recv[0])); - return PM3_EWRONGANSVER; + return PM3_EWRONGANSWER; } - bool support_signature = (recv[5] & 0x01); - bool support_easmode = (recv[4] & 0x03); + uint8_t signature[32] = {0x00}; + memcpy(signature, recv + 1, 32); - PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(NORMAL, " NXP SYSINFO : %s", sprint_hex(recv, 8)); - PrintAndLogEx(NORMAL, " Password protection configuration:"); - PrintAndLogEx(NORMAL, " * Page L read%s password protected", ((recv[2] & 0x01) ? "" : " not")); - PrintAndLogEx(NORMAL, " * Page L write%s password protected", ((recv[2] & 0x02) ? "" : " not")); - PrintAndLogEx(NORMAL, " * Page H read%s password protected", ((recv[2] & 0x08) ? "" : " not")); - PrintAndLogEx(NORMAL, " * Page H write%s password protected", ((recv[2] & 0x20) ? "" : " not")); - - PrintAndLogEx(NORMAL, " Lock bits:"); - PrintAndLogEx(NORMAL, " * AFI%s locked", ((recv[3] & 0x01) ? "" : " not")); // AFI lock bit - PrintAndLogEx(NORMAL, " * EAS%s locked", ((recv[3] & 0x02) ? "" : " not")); // EAS lock bit - PrintAndLogEx(NORMAL, " * DSFID%s locked", ((recv[3] & 0x03) ? "" : " not")); // DSFID lock bit - PrintAndLogEx(NORMAL, " * Password protection configuration%s locked", ((recv[3] & 0x04) ? "" : " not")); // Password protection pointer address and access conditions lock bit - - PrintAndLogEx(NORMAL, " Features:"); - PrintAndLogEx(NORMAL, " * User memory password protection%s supported", ((recv[4] & 0x01) ? "" : " not")); - PrintAndLogEx(NORMAL, " * Counter feature%s supported", ((recv[4] & 0x02) ? "" : " not")); - PrintAndLogEx(NORMAL, " * EAS ID%s supported by EAS ALARM command", support_easmode ? "" : " not"); - - PrintAndLogEx(NORMAL, " * EAS password protection%s supported", ((recv[4] & 0x04) ? "" : " not")); - PrintAndLogEx(NORMAL, " * AFI password protection%s supported", ((recv[4] & 0x10) ? "" : " not")); - PrintAndLogEx(NORMAL, " * Extended mode%s supported by INVENTORY READ command", ((recv[4] & 0x20) ? "" : " not")); - PrintAndLogEx(NORMAL, " * EAS selection%s supported by extended mode in INVENTORY READ command", ((recv[4] & 0x40) ? "" : " not")); - PrintAndLogEx(NORMAL, " * READ SIGNATURE command%s supported", support_signature ? "" : " not"); - - PrintAndLogEx(NORMAL, " * Password protection for READ SIGNATURE command%s supported", ((recv[5] & 0x02) ? "" : " not")); - PrintAndLogEx(NORMAL, " * STAY QUIET PERSISTENT command%s supported", ((recv[5] & 0x03) ? "" : " not")); - PrintAndLogEx(NORMAL, " * ENABLE PRIVACY command%s supported", ((recv[5] & 0x10) ? "" : " not")); - PrintAndLogEx(NORMAL, " * DESTROY command%s supported", ((recv[5] & 0x20) ? "" : " not")); - PrintAndLogEx(NORMAL, " * Additional 32 bits feature flags are%s transmitted", ((recv[5] & 0x80) ? "" : " not")); - - if (support_easmode) { - reqlen = 0; - req[reqlen++] |= ISO15_REQ_SUBCARRIER_SINGLE | ISO15_REQ_DATARATE_HIGH | ISO15_REQ_NONINVENTORY | ISO15_REQ_ADDRESS; - req[reqlen++] = ISO15_CMD_EASALARM; - req[reqlen++] = 0x04; // IC manufacturer code - memcpy(req + 3, uid, 8); // add UID - reqlen += 8; - - AddCrc15(req, reqlen); - reqlen += 2; - - //PrintAndLogEx(NORMAL, "cmd %s", sprint_hex(req, reqlen) ); - - clearCommandBuffer(); - SendCommandOLD(CMD_HF_ISO15693_COMMAND, reqlen, arg1, 1, req, reqlen); - - if (!WaitForResponseTimeout(CMD_ACK, &resp, 2000)) { - PrintAndLogEx(WARNING, "iso15693 card select failed"); - } else { - status = resp.oldarg[0]; - - PrintAndLogEx(NORMAL, ""); - - if (status < 2) { - PrintAndLogEx(INFO, " EAS (Electronic Article Surveillance) is not active"); - } else { - recv = resp.data.asBytes; - - if (!(recv[0] & ISO15_RES_ERROR)) { - PrintAndLogEx(INFO, " EAS (Electronic Article Surveillance) is active."); - PrintAndLogEx(INFO, " EAS sequence: %s", sprint_hex(recv + 1, 32)); - } - } - } - } - - if (support_signature) { - // Check if we can also read the signature - reqlen = 0; - req[reqlen++] |= ISO15_REQ_SUBCARRIER_SINGLE | ISO15_REQ_DATARATE_HIGH | ISO15_REQ_NONINVENTORY | ISO15_REQ_ADDRESS; - req[reqlen++] = ISO15_CMD_READSIGNATURE; - req[reqlen++] = 0x04; // IC manufacturer code - memcpy(req + 3, uid, 8); // add UID - reqlen += 8; - - AddCrc15(req, reqlen); - reqlen += 2; - - //PrintAndLogEx(NORMAL, "cmd %s", sprint_hex(req, reqlen) ); - - clearCommandBuffer(); - SendCommandOLD(CMD_HF_ISO15693_COMMAND, reqlen, arg1, 1, req, reqlen); - - if (!WaitForResponseTimeout(CMD_ACK, &resp, 2000)) { - PrintAndLogEx(WARNING, "iso15693 card select failed"); - DropField(); - return PM3_ETIMEOUT; - } - - DropField(); - - status = resp.oldarg[0]; - - if (status < 2) { - PrintAndLogEx(WARNING, "iso15693 card doesn't answer to READ SIGNATURE command"); - return PM3_EWRONGANSVER; - } - - recv = resp.data.asBytes; - - if (recv[0] & ISO15_RES_ERROR) { - PrintAndLogEx(ERR, "iso15693 card returned error %i: %s", recv[0], TagErrorStr(recv[0])); - return PM3_EWRONGANSVER; - } - - uint8_t signature[32] = {0x00}; - memcpy(signature, recv + 1, 32); - - nxp_15693_print_signature(uid, signature); - - } + nxp_15693_print_signature(uid, signature); } return PM3_SUCCESS; @@ -886,85 +894,84 @@ static int CmdHF15Info(const char *Cmd) { if (strlen(Cmd) < 1 || cmdp == 'h') return usage_15_info(); PacketResponseNG resp; - uint8_t *recv; uint8_t req[PM3_CMD_DATA_SIZE] = {0}; uint16_t reqlen; - uint8_t arg1 = 1; - char cmdbuf[100] = {0}; - char *cmd = cmdbuf; + uint8_t fast = 1; + uint8_t reply = 1; uint8_t uid[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + char cmdbuf[100] = {0}; + char *cmd = cmdbuf; strncpy(cmd, Cmd, sizeof(cmdbuf) - 1); - if (!prepareHF15Cmd(&cmd, &reqlen, &arg1, req, ISO15_CMD_SYSINFO)) + if (prepareHF15Cmd(&cmd, &reqlen, &fast, req, ISO15_CMD_SYSINFO) == false) return PM3_SUCCESS; AddCrc15(req, reqlen); reqlen += 2; clearCommandBuffer(); - SendCommandOLD(CMD_HF_ISO15693_COMMAND, reqlen, arg1, 1, req, reqlen); + SendCommandMIX(CMD_HF_ISO15693_COMMAND, reqlen, fast, reply, req, reqlen); if (!WaitForResponseTimeout(CMD_ACK, &resp, 2000)) { - PrintAndLogEx(WARNING, "iso15693 card select failed"); + PrintAndLogEx(WARNING, "iso15693 timeout"); DropField(); return PM3_ETIMEOUT; } DropField(); - uint32_t status = resp.oldarg[0]; - + int status = resp.oldarg[0]; if (status < 2) { - PrintAndLogEx(WARNING, "iso15693 card doesn't answer to systeminfo command"); - return PM3_EWRONGANSVER; + PrintAndLogEx(WARNING, "iso15693 card doesn't answer to systeminfo command (%d)", status); + return PM3_EWRONGANSWER; } - recv = resp.data.asBytes; + uint8_t *data = resp.data.asBytes; - if (recv[0] & ISO15_RES_ERROR) { - PrintAndLogEx(ERR, "iso15693 card returned error %i: %s", recv[0], TagErrorStr(recv[0])); - return PM3_EWRONGANSVER; + if ((data[0] & ISO15_RES_ERROR) == ISO15_RES_ERROR) { + PrintAndLogEx(ERR, "iso15693 card returned error %i: %s", data[0], TagErrorStr(data[0])); + return PM3_EWRONGANSWER; } - memcpy(uid, recv + 2, sizeof(uid)); + memcpy(uid, data + 2, sizeof(uid)); PrintAndLogEx(NORMAL, ""); PrintAndLogEx(INFO, "--- " _CYAN_("Tag Information") " ---------------------------"); PrintAndLogEx(INFO, "-------------------------------------------------------------"); - PrintAndLogEx(SUCCESS, " TYPE: " _YELLOW_("%s"), getTagInfo_15(recv + 2)); + PrintAndLogEx(SUCCESS, " TYPE: " _YELLOW_("%s"), getTagInfo_15(data + 2)); PrintAndLogEx(SUCCESS, " UID: " _GREEN_("%s"), iso15693_sprintUID(NULL, uid)); - PrintAndLogEx(SUCCESS, " SYSINFO: %s", sprint_hex(recv, status - 2)); + PrintAndLogEx(SUCCESS, " SYSINFO: %s", sprint_hex(data, status - 2)); // DSFID - if (recv[1] & 0x01) - PrintAndLogEx(SUCCESS, " - DSFID supported [0x%02X]", recv[10]); + if (data[1] & 0x01) + PrintAndLogEx(SUCCESS, " - DSFID supported [0x%02X]", data[10]); else PrintAndLogEx(SUCCESS, " - DSFID not supported"); // AFI - if (recv[1] & 0x02) - PrintAndLogEx(SUCCESS, " - AFI supported [0x%02X]", recv[11]); + if (data[1] & 0x02) + PrintAndLogEx(SUCCESS, " - AFI supported [0x%02X]", data[11]); else PrintAndLogEx(SUCCESS, " - AFI not supported"); // IC reference - if (recv[1] & 0x08) - PrintAndLogEx(SUCCESS, " - IC reference supported [0x%02X]", recv[14]); + if (data[1] & 0x08) + PrintAndLogEx(SUCCESS, " - IC reference supported [0x%02X]", data[14]); else PrintAndLogEx(SUCCESS, " - IC reference not supported"); // memory - if (recv[1] & 0x04) { + if (data[1] & 0x04) { PrintAndLogEx(SUCCESS, " - Tag provides info on memory layout (vendor dependent)"); - uint8_t blocks = recv[12] + 1; - uint8_t size = (recv[13] & 0x1F); + uint8_t blocks = data[12] + 1; + uint8_t size = (data[13] & 0x1F); PrintAndLogEx(SUCCESS, " %u (or %u) bytes/blocks x %u blocks", size + 1, size, blocks); } else { PrintAndLogEx(SUCCESS, " - Tag does not provide information on memory layout"); } // Check if SLIX2 and attempt to get NXP System Information - PrintAndLogEx(DEBUG, "4 & 08 :: %02x 7 == 1 :: %u 8 == 4 :: %u", recv[4], recv[7], recv[8]); - if (recv[8] == 0x04 && recv[7] == 0x01 && recv[4] & 0x80) { + PrintAndLogEx(DEBUG, "4 & 08 :: %02x 7 == 1 :: %u 8 == 4 :: %u", data[4], data[7], data[8]); + if (data[8] == 0x04 && data[7] == 0x01 && data[4] & 0x80) { return NxpSysInfo(uid); } @@ -974,20 +981,27 @@ static int CmdHF15Info(const char *Cmd) { // Record Activity without enabling carrier //helptext -static int CmdHF15Record(const char *Cmd) { +static int CmdHF15Sniff(const char *Cmd) { char cmdp = tolower(param_getchar(Cmd, 0)); if (cmdp == 'h') return usage_15_record(); + PacketResponseNG resp; clearCommandBuffer(); - SendCommandNG(CMD_HF_ISO15693_RAWADC, NULL, 0); + SendCommandNG(CMD_HF_ISO15693_SNIFF, NULL, 0); + + WaitForResponse(CMD_HF_ISO15693_SNIFF, &resp); + + PrintAndLogEx(HINT, "Try `" _YELLOW_("hf 15 list") "` to view captured tracelog"); + PrintAndLogEx(HINT, "Try `" _YELLOW_("trace save h") "` to save tracelog for later analysing"); return PM3_SUCCESS; } static int CmdHF15Reader(const char *Cmd) { char cmdp = tolower(param_getchar(Cmd, 0)); if (cmdp == 'h') return usage_15_reader(); + bool loop_read = (cmdp == '1') ? false : true; - readHF15Uid(true); + readHF15Uid(loop_read, true); return PM3_SUCCESS; } @@ -997,16 +1011,21 @@ static int CmdHF15Sim(const char *Cmd) { char cmdp = tolower(param_getchar(Cmd, 0)); if (strlen(Cmd) < 1 || cmdp == 'h') return usage_15_sim(); - uint8_t uid[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - if (param_gethex(Cmd, 0, uid, 16)) { + struct { + uint8_t uid[8]; + } PACKED payload; + + if (param_gethex(Cmd, 0, payload.uid, 16)) { PrintAndLogEx(WARNING, "UID must include 16 HEX symbols"); return PM3_EINVARG; } - PrintAndLogEx(SUCCESS, "Starting simulating UID " _YELLOW_("%s"), iso15693_sprintUID(NULL, uid)); + PrintAndLogEx(SUCCESS, "Starting simulating UID " _YELLOW_("%s"), iso15693_sprintUID(NULL, payload.uid)); + PacketResponseNG resp; clearCommandBuffer(); - SendCommandOLD(CMD_HF_ISO15693_SIMULATE, 0, 0, 0, uid, 8); + SendCommandNG(CMD_HF_ISO15693_SIMULATE, (uint8_t*)&payload, sizeof(payload)); + WaitForResponse(CMD_HF_ISO15693_SIMULATE, &resp); return PM3_SUCCESS; } @@ -1043,11 +1062,8 @@ static int CmdHF15FindAfi(const char *Cmd) { // Writes the AFI (Application Family Identifier) of a card static int CmdHF15WriteAfi(const char *Cmd) { - char cmdp = param_getchar(Cmd, 0); - if (strlen(Cmd) < 3 || cmdp == 'h' || cmdp == 'H') return usage_15_writeafi(); - - PacketResponseNG resp; - uint8_t *recv; + char cmdp = tolower(param_getchar(Cmd, 0)); + if (strlen(Cmd) < 3 || cmdp == 'h') return usage_15_writeafi(); // arg: len, speed, recv? // arg0 (datalen, cmd len? .arg0 == crc?) @@ -1055,58 +1071,54 @@ static int CmdHF15WriteAfi(const char *Cmd) { // arg2 (recv == 1 == expect a response) uint8_t req[PM3_CMD_DATA_SIZE] = {0}; uint16_t reqlen = 0; - uint8_t arg1 = 1; - int afinum; + uint8_t fast = 1; + uint8_t reply = 1; + char cmdbuf[100] = {0}; char *cmd = cmdbuf; strncpy(cmd, Cmd, sizeof(cmdbuf) - 1); - if (!prepareHF15Cmd(&cmd, &reqlen, &arg1, req, ISO15_CMD_WRITEAFI)) + if (!prepareHF15Cmd(&cmd, &reqlen, &fast, req, ISO15_CMD_WRITEAFI)) return PM3_SUCCESS; req[0] |= ISO15_REQ_OPTION; // Since we are writing - afinum = strtol(cmd, NULL, 0); + int afinum = strtol(cmd, NULL, 0); req[reqlen++] = (uint8_t)afinum; AddCrc15(req, reqlen); reqlen += 2; - // PrintAndLogEx(NORMAL, "cmd %s", sprint_hex(req, reqlen) ); - + PacketResponseNG resp; clearCommandBuffer(); - SendCommandOLD(CMD_HF_ISO15693_COMMAND, reqlen, arg1, 1, req, reqlen); + SendCommandMIX(CMD_HF_ISO15693_COMMAND, reqlen, fast, reply, req, reqlen); if (!WaitForResponseTimeout(CMD_ACK, &resp, 2000)) { - PrintAndLogEx(ERR, "iso15693 card select failed"); + PrintAndLogEx(ERR, "iso15693 timeout"); DropField(); return PM3_ETIMEOUT; } DropField(); - recv = resp.data.asBytes; + uint8_t *data = resp.data.asBytes; - if (recv[0] & ISO15_RES_ERROR) { - PrintAndLogEx(ERR, "iso15693 card returned error %i: %s", recv[0], TagErrorStr(recv[0])); - return PM3_EWRONGANSVER; + if ((data[0] & ISO15_RES_ERROR) == ISO15_RES_ERROR) { + PrintAndLogEx(ERR, "iso15693 card returned error %i: %s", data[0], TagErrorStr(data[0])); + return PM3_EWRONGANSWER; } PrintAndLogEx(NORMAL, ""); PrintAndLogEx(SUCCESS, "Wrote AFI 0x%02X", afinum); - return PM3_SUCCESS; } // Writes the DSFID (Data Storage Format Identifier) of a card static int CmdHF15WriteDsfid(const char *Cmd) { - char cmdp = param_getchar(Cmd, 0); - if (strlen(Cmd) < 3 || cmdp == 'h' || cmdp == 'H') return usage_15_writedsfid(); - - PacketResponseNG resp; - uint8_t *recv; + char cmdp = tolower(param_getchar(Cmd, 0)); + if (strlen(Cmd) < 3 || cmdp == 'h') return usage_15_writedsfid(); // arg: len, speed, recv? // arg0 (datalen, cmd len? .arg0 == crc?) @@ -1114,13 +1126,15 @@ static int CmdHF15WriteDsfid(const char *Cmd) { // arg2 (recv == 1 == expect a response) uint8_t req[PM3_CMD_DATA_SIZE] = {0}; uint16_t reqlen = 0; - uint8_t arg1 = 1; + uint8_t fast = 1; + uint8_t reply = 1; int dsfidnum; + char cmdbuf[100] = {0}; char *cmd = cmdbuf; strncpy(cmd, Cmd, sizeof(cmdbuf) - 1); - if (!prepareHF15Cmd(&cmd, &reqlen, &arg1, req, ISO15_CMD_WRITEDSFID)) + if (prepareHF15Cmd(&cmd, &reqlen, &fast, req, ISO15_CMD_WRITEDSFID) == false) return PM3_SUCCESS; req[0] |= ISO15_REQ_OPTION; // Since we are writing @@ -1133,28 +1147,27 @@ static int CmdHF15WriteDsfid(const char *Cmd) { reqlen += 2; // PrintAndLogEx(NORMAL, "cmd %s", sprint_hex(req, reqlen) ); - + PacketResponseNG resp; clearCommandBuffer(); - SendCommandOLD(CMD_HF_ISO15693_COMMAND, reqlen, arg1, 1, req, reqlen); + SendCommandMIX(CMD_HF_ISO15693_COMMAND, reqlen, fast, reply, req, reqlen); if (!WaitForResponseTimeout(CMD_ACK, &resp, 2000)) { - PrintAndLogEx(ERR, "iso15693 card select failed"); + PrintAndLogEx(ERR, "iso15693 timeout"); DropField(); return PM3_ETIMEOUT; } DropField(); - recv = resp.data.asBytes; + uint8_t *data = resp.data.asBytes; - if (recv[0] & ISO15_RES_ERROR) { - PrintAndLogEx(ERR, "iso15693 card returned error %i: %s", recv[0], TagErrorStr(recv[0])); - return PM3_EWRONGANSVER; + if ((data[0] & ISO15_RES_ERROR) == ISO15_RES_ERROR) { + PrintAndLogEx(ERR, "iso15693 card returned error %i: %s", data[0], TagErrorStr(data[0])); + return PM3_EWRONGANSWER; } PrintAndLogEx(NORMAL, ""); PrintAndLogEx(SUCCESS, "Wrote DSFID 0x%02X", dsfidnum); - return PM3_SUCCESS; } @@ -1187,15 +1200,13 @@ static int CmdHF15Dump(const char *Cmd) { //Validations if (errors) return usage_15_dump(); - if (!getUID(uid)) { + if (getUID(false, uid) == false) { PrintAndLogEx(WARNING, "No tag found."); return PM3_ESOFT; } if (fileNameLen < 1) { - PrintAndLogEx(INFO, "Using UID as filename"); - fptr += sprintf(fptr, "hf-15-"); FillFileNameByUID(fptr, uid, "-dump", sizeof(uid)); } @@ -1226,24 +1237,24 @@ static int CmdHF15Dump(const char *Cmd) { AddCrc15(req, 11); clearCommandBuffer(); - SendCommandOLD(CMD_HF_ISO15693_COMMAND, sizeof(req), 1, 1, req, sizeof(req)); + SendCommandMIX(CMD_HF_ISO15693_COMMAND, sizeof(req), 1, 1, req, sizeof(req)); if (WaitForResponseTimeout(CMD_ACK, &resp, 2000)) { - uint8_t len = resp.oldarg[0]; + int len = resp.oldarg[0]; if (len < 2) { - PrintAndLogEx(FAILED, "iso15693 card select failed"); + PrintAndLogEx(FAILED, "iso15693 command failed"); continue; } recv = resp.data.asBytes; - if (!CheckCrc15(recv, len)) { - PrintAndLogEx(FAILED, "crc fail"); + if (CheckCrc15(recv, len) == false) { + PrintAndLogEx(FAILED, "crc (" _RED_("fail") ")"); continue; } - if (recv[0] & ISO15_RES_ERROR) { + if ((recv[0] & ISO15_RES_ERROR) == ISO15_RES_ERROR) { PrintAndLogEx(FAILED, "Tag returned Error %i: %s", recv[1], TagErrorStr(recv[1])); break; } @@ -1273,7 +1284,7 @@ static int CmdHF15Dump(const char *Cmd) { size_t datalen = blocknum * 4; saveFile(filename, ".bin", data, datalen); saveFileEML(filename, data, datalen, 4); - saveFileJSON(filename, jsf15, data, datalen); + saveFileJSON(filename, jsf15, data, datalen, NULL); return PM3_SUCCESS; } @@ -1283,21 +1294,11 @@ static int CmdHF15List(const char *Cmd) { return PM3_SUCCESS; } -/* -// Record Activity without enabling carrier -static int CmdHF15Sniff(const char *Cmd) { - clearCommandBuffer(); - SendCommandNG(CMD_HF_ISO15693_SNIFF, NULL, 0); - return PM3_SUCCESS; -} -*/ - static int CmdHF15Raw(const char *Cmd) { - char cmdp = param_getchar(Cmd, 0); - if (strlen(Cmd) < 3 || cmdp == 'h' || cmdp == 'H') return usage_15_raw(); + char cmdp = tolower(param_getchar(Cmd, 0)); + if (strlen(Cmd) < 3 || cmdp == 'h') return usage_15_raw(); - PacketResponseNG resp; int reply = 1, fast = 1, i = 0; bool crc = false, leaveSignalON = false; char buf[5] = ""; @@ -1357,20 +1358,25 @@ static int CmdHF15Raw(const char *Cmd) { datalen += 2; } - clearCommandBuffer(); - SendCommandOLD(CMD_HF_ISO15693_COMMAND, datalen, fast, reply, data, datalen); + PacketResponseNG resp; + clearCommandBuffer(); + SendCommandMIX(CMD_HF_ISO15693_COMMAND, datalen, fast, reply, data, datalen); if (reply) { if (WaitForResponseTimeout(CMD_ACK, &resp, 2000)) { - uint8_t len = resp.oldarg[0]; - PrintAndLogEx(INFO, "received %i octets", len); - PrintAndLogEx(SUCCESS, "%s", sprint_hex(resp.data.asBytes, len)); + int len = resp.oldarg[0]; + if (len < 2) { + PrintAndLogEx(WARNING, "command failed"); + } else { + PrintAndLogEx(SUCCESS, "received %i octets", len); + PrintAndLogEx(SUCCESS, "%s", sprint_hex(resp.data.asBytes, len)); + } } else { - PrintAndLogEx(WARNING, "timeout while waiting for reply."); + PrintAndLogEx(WARNING, "timeout while waiting for reply"); } } - if (!leaveSignalON) + if (leaveSignalON == false) DropField(); return PM3_SUCCESS; @@ -1382,30 +1388,32 @@ static int CmdHF15Raw(const char *Cmd) { */ static int CmdHF15Readmulti(const char *Cmd) { - char cmdp = param_getchar(Cmd, 0); - if (strlen(Cmd) < 3 || cmdp == 'h' || cmdp == 'H') return usage_15_readmulti(); + char cmdp = tolower(param_getchar(Cmd, 0)); + if (strlen(Cmd) < 3 || cmdp == 'h') return usage_15_readmulti(); - PacketResponseNG resp; - uint8_t *recv; uint8_t req[PM3_CMD_DATA_SIZE] = {0}; uint16_t reqlen = 0; - uint8_t arg1 = 1; - uint8_t pagenum, pagecount; + uint8_t fast = 1; + uint8_t reply = 1; + char cmdbuf[100] = {0}; char *cmd = cmdbuf; strncpy(cmd, Cmd, sizeof(cmdbuf) - 1); - if (!prepareHF15Cmd(&cmd, &reqlen, &arg1, req, ISO15_CMD_READMULTI)) + if (!prepareHF15Cmd(&cmd, &reqlen, &fast, req, ISO15_CMD_READMULTI)) return PM3_SUCCESS; // add OPTION flag, in order to get lock-info req[0] |= ISO15_REQ_OPTION; // decimal - pagenum = param_get8ex(cmd, 0, 0, 10); - pagecount = param_get8ex(cmd, 1, 0, 10); + uint8_t pagenum = param_get8ex(cmd, 0, 0, 10); + uint8_t pagecount = param_get8ex(cmd, 1, 0, 10); - // PrintAndLogEx(NORMAL, "ice %d %d\n", pagenum, pagecount); + if (pagecount > 6) { + PrintAndLogEx(WARNING, "Page count must be 6 or less (%d)", pagecount); + return PM3_EINVARG; + } // 0 means 1 page, // 1 means 2 pages, ... @@ -1416,45 +1424,48 @@ static int CmdHF15Readmulti(const char *Cmd) { AddCrc15(req, reqlen); reqlen += 2; + PacketResponseNG resp; clearCommandBuffer(); - SendCommandOLD(CMD_HF_ISO15693_COMMAND, reqlen, arg1, 1, req, reqlen); + SendCommandMIX(CMD_HF_ISO15693_COMMAND, reqlen, fast, reply, req, reqlen); if (!WaitForResponseTimeout(CMD_ACK, &resp, 2000)) { - PrintAndLogEx(FAILED, "iso15693 card select failed"); + PrintAndLogEx(FAILED, "iso15693 card timeout"); DropField(); return PM3_ETIMEOUT; } DropField(); - uint32_t status = resp.oldarg[0]; + int status = resp.oldarg[0]; if (status < 2) { - PrintAndLogEx(FAILED, "iso15693 card select failed"); - return PM3_EWRONGANSVER; + PrintAndLogEx(FAILED, "iso15693 card readmulti failed"); + return PM3_EWRONGANSWER; } - recv = resp.data.asBytes; - - if (!CheckCrc15(recv, status)) { - PrintAndLogEx(FAILED, "CRC failed"); + uint8_t *data = resp.data.asBytes; + + if (CheckCrc15(data, status) == false) { + PrintAndLogEx(FAILED, "crc (" _RED_("fail") ")"); return PM3_ESOFT; } - if (recv[0] & ISO15_RES_ERROR) { - PrintAndLogEx(FAILED, "iso15693 card returned error %i: %s", recv[0], TagErrorStr(recv[0])); - return PM3_EWRONGANSVER; + if ((data[0] & ISO15_RES_ERROR) == ISO15_RES_ERROR) { + PrintAndLogEx(FAILED, "iso15693 card returned error %i: %s", data[0], TagErrorStr(data[0])); + return PM3_EWRONGANSWER; } // skip status byte int start = 1; int stop = (pagecount + 1) * 5; int currblock = pagenum; - // print response + + PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "block# | data |lck| ascii"); PrintAndLogEx(NORMAL, "---------+--------------+---+----------"); + for (int i = start; i < stop; i += 5) { - PrintAndLogEx(NORMAL, "%3d/0x%02X | %s | %d | %s", currblock, currblock, sprint_hex(recv + i + 1, 4), recv[i], sprint_ascii(recv + i + 1, 4)); + PrintAndLogEx(NORMAL, "%3d/0x%02X | %s | %d | %s", currblock, currblock, sprint_hex(data + i + 1, 4), data[i], sprint_ascii(data + i + 1, 4)); currblock++; } @@ -1467,11 +1478,8 @@ static int CmdHF15Readmulti(const char *Cmd) { */ static int CmdHF15Read(const char *Cmd) { - char cmdp = param_getchar(Cmd, 0); - if (strlen(Cmd) < 3 || cmdp == 'h' || cmdp == 'H') return usage_15_read(); - - PacketResponseNG resp; - uint8_t *recv; + char cmdp = tolower(param_getchar(Cmd, 0)); + if (strlen(Cmd) < 3 || cmdp == 'h') return usage_15_read(); // arg: len, speed, recv? // arg0 (datalen, cmd len? .arg0 == crc?) @@ -1479,13 +1487,14 @@ static int CmdHF15Read(const char *Cmd) { // arg2 (recv == 1 == expect a response) uint8_t req[PM3_CMD_DATA_SIZE] = {0}; uint16_t reqlen = 0; - uint8_t arg1 = 1; + uint8_t fast = 1; + uint8_t reply = 1; int blocknum; char cmdbuf[100] = {0}; char *cmd = cmdbuf; strncpy(cmd, Cmd, sizeof(cmdbuf) - 1); - if (!prepareHF15Cmd(&cmd, &reqlen, &arg1, req, ISO15_CMD_READ)) + if (prepareHF15Cmd(&cmd, &reqlen, &fast, req, ISO15_CMD_READ) == false) return PM3_SUCCESS; // add OPTION flag, in order to get lock-info @@ -1498,40 +1507,41 @@ static int CmdHF15Read(const char *Cmd) { AddCrc15(req, reqlen); reqlen += 2; + PacketResponseNG resp; clearCommandBuffer(); - SendCommandOLD(CMD_HF_ISO15693_COMMAND, reqlen, arg1, 1, req, reqlen); + SendCommandMIX(CMD_HF_ISO15693_COMMAND, reqlen, fast, reply, req, reqlen); if (!WaitForResponseTimeout(CMD_ACK, &resp, 2000)) { - PrintAndLogEx(ERR, "iso15693 card select failed"); + PrintAndLogEx(ERR, "iso15693 timeout"); DropField(); return PM3_ETIMEOUT; } DropField(); - uint32_t status = resp.oldarg[0]; + int status = resp.oldarg[0]; if (status < 2) { - PrintAndLogEx(ERR, "iso15693 card select failed"); - return PM3_EWRONGANSVER; + PrintAndLogEx(ERR, "iso15693 command failed"); + return PM3_EWRONGANSWER; } - recv = resp.data.asBytes; + uint8_t *data = resp.data.asBytes; - if (!CheckCrc15(recv, status)) { - PrintAndLogEx(ERR, "CRC failed"); + if (CheckCrc15(data, status) == false) { + PrintAndLogEx(FAILED, "crc (" _RED_("fail") ")"); return PM3_ESOFT; } - if (recv[0] & ISO15_RES_ERROR) { - PrintAndLogEx(ERR, "iso15693 card returned error %i: %s", recv[0], TagErrorStr(recv[0])); - return PM3_EWRONGANSVER; + if ((data[0] & ISO15_RES_ERROR) == ISO15_RES_ERROR) { + PrintAndLogEx(ERR, "iso15693 card returned error %i: %s", data[0], TagErrorStr(data[0])); + return PM3_EWRONGANSWER; } // print response PrintAndLogEx(NORMAL, ""); PrintAndLogEx(NORMAL, "block #%3d |lck| ascii", blocknum); PrintAndLogEx(NORMAL, "------------+---+------"); - PrintAndLogEx(NORMAL, "%s| %d | %s", sprint_hex(recv + 2, status - 4), recv[1], sprint_ascii(recv + 2, status - 4)); + PrintAndLogEx(NORMAL, "%s| %d | %s", sprint_hex(data + 2, status - 4), data[1], sprint_ascii(data + 2, status - 4)); PrintAndLogEx(NORMAL, ""); return PM3_SUCCESS; } @@ -1542,22 +1552,22 @@ static int CmdHF15Read(const char *Cmd) { */ static int CmdHF15Write(const char *Cmd) { - char cmdp = param_getchar(Cmd, 0); - if (strlen(Cmd) < 3 || cmdp == 'h' || cmdp == 'H') return usage_15_write(); + char cmdp = tolower(param_getchar(Cmd, 0)); + if (strlen(Cmd) < 3 || cmdp == 'h') return usage_15_write(); - PacketResponseNG resp; - uint8_t *recv; uint8_t req[PM3_CMD_DATA_SIZE] = {0}; uint16_t reqlen = 0; - uint8_t arg1 = 1; + uint8_t fast = 1; + uint8_t reply = 1; int pagenum, temp; + char cmdbuf[100] = {0}; char *cmd = cmdbuf; char *cmd2; strncpy(cmd, Cmd, sizeof(cmdbuf) - 1); - if (!prepareHF15Cmd(&cmd, &reqlen, &arg1, req, ISO15_CMD_WRITE)) + if (prepareHF15Cmd(&cmd, &reqlen, &fast, req, ISO15_CMD_WRITE) == false) return PM3_SUCCESS; // *cmd -> page num ; *cmd2 -> data @@ -1584,8 +1594,9 @@ static int CmdHF15Write(const char *Cmd) { PrintAndLogEx(INFO, "iso15693 writing to page %02d (0x%02X) | data ", pagenum, pagenum); + PacketResponseNG resp; clearCommandBuffer(); - SendCommandOLD(CMD_HF_ISO15693_COMMAND, reqlen, arg1, 1, req, reqlen); + SendCommandMIX(CMD_HF_ISO15693_COMMAND, reqlen, fast, reply, req, reqlen); if (!WaitForResponseTimeout(CMD_ACK, &resp, 2000)) { PrintAndLogEx(FAILED, "iso15693 card timeout, data may be written anyway"); @@ -1595,57 +1606,52 @@ static int CmdHF15Write(const char *Cmd) { DropField(); - uint32_t status = resp.oldarg[0]; + int status = resp.oldarg[0]; if (status < 2) { - PrintAndLogEx(FAILED, "iso15693 card select failed"); - return PM3_EWRONGANSVER; + PrintAndLogEx(FAILED, "iso15693 command failed"); + return PM3_EWRONGANSWER; } - recv = resp.data.asBytes; + uint8_t *data = resp.data.asBytes; - if (!CheckCrc15(recv, status)) { - PrintAndLogEx(FAILED, "CRC failed"); + if (CheckCrc15(data, status) == false) { + PrintAndLogEx(FAILED, "crc (" _RED_("fail") ")"); return PM3_ESOFT; } - if (recv[0] & ISO15_RES_ERROR) { - PrintAndLogEx(ERR, "iso15693 card returned error %i: %s", recv[0], TagErrorStr(recv[0])); - return PM3_EWRONGANSVER; + if ((data[0] & ISO15_RES_ERROR) == ISO15_RES_ERROR) { + PrintAndLogEx(ERR, "iso15693 card returned error %i: %s", data[0], TagErrorStr(data[0])); + return PM3_EWRONGANSWER; } - PrintAndLogEx(NORMAL, "OK"); + PrintAndLogEx(SUCCESS, "Write " _GREEN_("OK")); return PM3_SUCCESS; } static int CmdHF15Restore(const char *Cmd) { - FILE *f; - uint8_t uid[8] = {0x00}; + char newPrefix[60] = {0x00}; char filename[FILE_PATH_SIZE] = {0x00}; - char buff[255] = {0x00}; size_t blocksize = 4; - uint8_t cmdp = 0; - char newCmdPrefix[FILE_PATH_SIZE + 1] = {0x00}, tmpCmd[FILE_PATH_SIZE + 262] = {0x00}; - char param[FILE_PATH_SIZE] = ""; - char hex[255] = ""; - uint8_t retries = 3, i = 0; - int retval = 0; + uint8_t cmdp = 0, retries = 3; + bool addressed_mode = false; while (param_getchar(Cmd, cmdp) != 0x00) { switch (tolower(param_getchar(Cmd, cmdp))) { - case '-': + case '-': { + char param[3] = ""; param_getstr(Cmd, cmdp, param, sizeof(param)); switch (param[1]) { case '2': case 'o': - strncpy(newCmdPrefix, " ", sizeof(newCmdPrefix) - 1); - strncat(newCmdPrefix, param, sizeof(newCmdPrefix) - strlen(newCmdPrefix) - 1); + sprintf(newPrefix, " %s", param); break; default: - PrintAndLogEx(WARNING, "Unknown parameter '%s'", param); + PrintAndLogEx(WARNING, "11 unknown parameter " _YELLOW_("'%s'"), param); return usage_15_restore(); } break; + } case 'f': param_getstr(Cmd, cmdp + 1, filename, FILE_PATH_SIZE); cmdp++; @@ -1658,83 +1664,85 @@ static int CmdHF15Restore(const char *Cmd) { blocksize = param_get8ex(Cmd, cmdp + 1, 4, 10); cmdp++; break; - case 'u': - param_getstr(Cmd, cmdp + 1, buff, FILE_PATH_SIZE); - cmdp++; - snprintf(filename, sizeof(filename), "hf-15-%s-dump.bin", buff); + case 'a': + addressed_mode = true; break; case 'h': return usage_15_restore(); default: - PrintAndLogEx(WARNING, "Unknown parameter '%c'", param_getchar(Cmd, cmdp)); + PrintAndLogEx(WARNING, "unknown parameter " _YELLOW_("'%c'"), param_getchar(Cmd, cmdp)); return usage_15_restore(); } cmdp++; } - PrintAndLogEx(INFO, "Blocksize: %zu", blocksize); + PrintAndLogEx(INFO, "blocksize: %zu", blocksize); if (!strlen(filename)) { - PrintAndLogEx(WARNING, "Please provide a filename"); + PrintAndLogEx(WARNING, "please provide a filename"); return usage_15_restore(); } - if ((f = fopen(filename, "rb")) == NULL) { - - PrintAndLogEx(WARNING, "Could not find file %s", filename); - return PM3_EFILE; - } - - if (!getUID(uid)) { - PrintAndLogEx(WARNING, "No tag found"); - fclose(f); + uint8_t uid[8] = {0x00}; + if (getUID(false, uid) == false) { + PrintAndLogEx(WARNING, "no tag found"); return PM3_ESOFT; } - PrintAndLogEx(INFO, "Restoring data blocks."); + size_t datalen = 0; + uint8_t *data = NULL; + if (loadFile_safe(filename, ".bin", (void **)&data, &datalen) != PM3_SUCCESS) { + PrintAndLogEx(WARNING, "could not find file " _YELLOW_("%s"), filename); + return PM3_EFILE; + } + + if ((datalen % blocksize) != 0) { + PrintAndLogEx(WARNING, "datalen %zu isn't dividable with blocksize %zu", datalen, blocksize); + free(data); + return PM3_ESOFT; + } + + PrintAndLogEx(INFO, "restoring data blocks"); + + int retval = PM3_SUCCESS; + size_t bytes = 0; + uint16_t i = 0; + while (bytes < datalen) { - while (1) { uint8_t tried = 0; - hex[0] = 0x00; - tmpCmd[0] = 0x00; + char hex[40] = {0x00}; + char tmpCmd[200] = {0x00}; - size_t bytes_read = fread(buff, 1, blocksize, f); - if (bytes_read == 0) { - PrintAndLogEx(SUCCESS, "File reading done `%s`", filename); - fclose(f); - return PM3_SUCCESS; - } else if (bytes_read != blocksize) { - PrintAndLogEx(ERR, "File reading error (%s), %zu bytes read instead of %zu bytes.", filename, bytes_read, blocksize); - fclose(f); - return PM3_EFILE; + if (addressed_mode) { + char uidhex[17] = {0x00}; + hex_to_buffer((uint8_t *)uidhex, uid, sizeof(uid), sizeof(uidhex) - 1, 0, false, true); + hex_to_buffer((uint8_t *)hex, data + i, blocksize, sizeof(hex) - 1, 0, false, true); + snprintf(tmpCmd, sizeof(tmpCmd), "%s %s %u %s", newPrefix, uidhex, i, hex); + } else { + hex_to_buffer((uint8_t *)hex, data + i, blocksize, sizeof(hex) - 1, 0, false, true); + snprintf(tmpCmd, sizeof(tmpCmd), "%s u %u %s", newPrefix, i, hex); } - for (int j = 0; j < blocksize; j++) - snprintf(hex + j * 2, 3, "%02X", buff[j]); - - for (int j = 0; j < ARRAYLEN(uid); j++) - snprintf(buff + j * 2, 3, "%02X", uid[j]); - - //TODO: Addressed mode currently not work - //snprintf(tmpCmd, sizeof(tmpCmd), "%s %s %d %s", newCmdPrefix, buff, i, hex); - snprintf(tmpCmd, sizeof(tmpCmd), "%s u %u %s", newCmdPrefix, i, hex); - PrintAndLogEx(DEBUG, "Command to be sent| %s", tmpCmd); + PrintAndLogEx(DEBUG, "hf 15 write %s", tmpCmd); for (tried = 0; tried < retries; tried++) { - if (!(retval = CmdHF15Write(tmpCmd))) { + retval = CmdHF15Write(tmpCmd); + if (retval == false) { break; } } + if (tried >= retries) { - fclose(f); - PrintAndLogEx(FAILED, "Restore failed. Too many retries."); + free(data); + PrintAndLogEx(FAILED, "restore failed. Too many retries."); return retval; } - + bytes += blocksize; i++; } - fclose(f); - PrintAndLogEx(INFO, "Finish restore"); + free(data); + PrintAndLogEx(INFO, "done"); + PrintAndLogEx(HINT, "try `" _YELLOW_("hf 15 dump") "` to read your card to verify" ); return PM3_SUCCESS; } @@ -1743,111 +1751,77 @@ static int CmdHF15Restore(const char *Cmd) { * Set UID for magic Chinese card */ static int CmdHF15CSetUID(const char *Cmd) { - uint8_t uid[8] = {0x00}; - uint8_t oldUid[8], newUid[8] = {0x00}; - PacketResponseNG resp; - int reply = 1, fast = 0; - uint8_t data[4][9] = {{0x00}}; char cmdp = tolower(param_getchar(Cmd, 0)); if (strlen(Cmd) < 1 || cmdp == 'h') return usage_15_csetuid(); - if (param_gethex(Cmd, 0, uid, 16)) { + + struct { + uint8_t uid[8]; + } PACKED payload; + + if (param_gethex(Cmd, 0, payload.uid, 16)) { PrintAndLogEx(WARNING, "UID must include 16 HEX symbols"); return PM3_EINVARG; } - if (uid[0] != 0xe0) { + if (payload.uid[0] != 0xE0) { PrintAndLogEx(WARNING, "UID must begin with the byte " _YELLOW_("E0")); return PM3_EINVARG; } - PrintAndLogEx(SUCCESS, "Input new UID | " _YELLOW_("%s"), iso15693_sprintUID(NULL, uid)); + PrintAndLogEx(SUCCESS, "reverse input UID " _YELLOW_("%s"), iso15693_sprintUID(NULL, payload.uid)); - if (!getUID(oldUid)) { - PrintAndLogEx(FAILED, "Can't get old/current UID."); + PrintAndLogEx(INFO, "getting current card details..."); + uint8_t carduid[8] = {0x00}; + if (getUID(false, carduid) == false) { + PrintAndLogEx(FAILED, "can't read card UID"); return PM3_ESOFT; } - PrintAndLogEx(INFO, "Using backdoor magic tag function"); + PrintAndLogEx(INFO, "updating tag uid..."); + + PacketResponseNG resp; + clearCommandBuffer(); + SendCommandNG(CMD_HF_ISO15693_CSETUID, (uint8_t*)&payload, sizeof(payload)); - // Command 1 : 02213E00000000 - data[0][0] = 0x02; - data[0][1] = 0x21; - data[0][2] = 0x3e; - data[0][3] = 0x00; - data[0][4] = 0x00; - data[0][5] = 0x00; - data[0][6] = 0x00; - - // Command 2 : 02213F69960000 - data[1][0] = 0x02; - data[1][1] = 0x21; - data[1][2] = 0x3f; - data[1][3] = 0x69; - data[1][4] = 0x96; - data[1][5] = 0x00; - data[1][6] = 0x00; - - // Command 3 : 022138u8u7u6u5 (where uX = uid byte X) - data[2][0] = 0x02; - data[2][1] = 0x21; - data[2][2] = 0x38; - data[2][3] = uid[7]; - data[2][4] = uid[6]; - data[2][5] = uid[5]; - data[2][6] = uid[4]; - - // Command 4 : 022139u4u3u2u1 (where uX = uid byte X) - data[3][0] = 0x02; - data[3][1] = 0x21; - data[3][2] = 0x39; - data[3][3] = uid[3]; - data[3][4] = uid[2]; - data[3][5] = uid[1]; - data[3][6] = uid[0]; - - for (int i = 0; i < 4; i++) { - AddCrc15(data[i], 7); - - clearCommandBuffer(); - SendCommandOLD(CMD_HF_ISO15693_COMMAND, sizeof(data[i]), fast, reply, data[i], sizeof(data[i])); - - if (reply) { - if (WaitForResponseTimeout(CMD_ACK, &resp, 2000)) { - uint8_t len = resp.oldarg[0]; - PrintAndLogEx(INFO, "received %i octets", len); - PrintAndLogEx(INFO, "%s", sprint_hex(resp.data.asBytes, len)); - } else { - PrintAndLogEx(WARNING, "timeout while waiting for reply."); - } - } + if (WaitForResponseTimeout(CMD_HF_ISO15693_CSETUID, &resp, 2000) == false) { + PrintAndLogEx(WARNING, "timeout while waiting for reply"); } - if (!getUID(newUid)) { - PrintAndLogEx(FAILED, "Can't get new UID."); + PrintAndLogEx(INFO, "getting updated card details..."); + + if (getUID(false, carduid) == false) { + PrintAndLogEx(FAILED, "can't read card UID"); return PM3_ESOFT; } - if (memcmp(newUid, uid, 8) != 0) { - PrintAndLogEx(FAILED, "Setting UID on tag failed."); + // reverse cardUID to compare + uint8_t revuid[8] = {0}; + uint8_t i = 0; + while (i < sizeof(revuid)) { + revuid[i] = carduid[7-i]; + i++; + } + + if (memcmp(revuid, payload.uid, 8) != 0) { + PrintAndLogEx(FAILED, "setting new UID (" _RED_("failed") ")"); return PM3_ESOFT; } else { - PrintAndLogEx(SUCCESS, "Old: %s", iso15693_sprintUID(NULL, oldUid)); - PrintAndLogEx(SUCCESS, "New: " _GREEN_("%s"), iso15693_sprintUID(NULL, newUid)); + PrintAndLogEx(SUCCESS, "setting new UID (" _GREEN_("ok") ")"); return PM3_SUCCESS; } } static command_t CommandTable[] = { + {"-----------", CmdHF15Help, AlwaysAvailable, "--------------------- " _CYAN_("General") " ---------------------"}, {"help", CmdHF15Help, AlwaysAvailable, "This help"}, {"list", CmdHF15List, AlwaysAvailable, "List ISO15693 history"}, {"demod", CmdHF15Demod, AlwaysAvailable, "Demodulate ISO15693 from tag"}, {"dump", CmdHF15Dump, IfPm3Iso15693, "Read all memory pages of an ISO15693 tag, save to file"}, {"info", CmdHF15Info, IfPm3Iso15693, "Tag information"}, -// {"sniff", CmdHF15Sniff, IfPm3Iso15693, "Sniff ISO15693 traffic"}, + {"sniff", CmdHF15Sniff, IfPm3Iso15693, "Sniff ISO15693 traffic"}, {"raw", CmdHF15Raw, IfPm3Iso15693, "Send raw hex data to tag"}, - {"record", CmdHF15Record, IfPm3Iso15693, "Record Samples (ISO15693)"}, {"read", CmdHF15Read, IfPm3Iso15693, "Read a block"}, {"reader", CmdHF15Reader, IfPm3Iso15693, "Act like an ISO15693 reader"}, {"readmulti", CmdHF15Readmulti, IfPm3Iso15693, "Reads multiple Blocks"}, @@ -1855,11 +1829,11 @@ static command_t CommandTable[] = { {"samples", CmdHF15Samples, IfPm3Iso15693, "Acquire Samples as Reader (enables carrier, sends inquiry)"}, {"sim", CmdHF15Sim, IfPm3Iso15693, "Fake an ISO15693 tag"}, {"write", CmdHF15Write, IfPm3Iso15693, "Write a block"}, - {"-----------", CmdHF15Help, IfPm3Iso15693, ""}, + {"-----------", CmdHF15Help, IfPm3Iso15693, "----------------------- " _CYAN_("afi") " -----------------------"}, {"findafi", CmdHF15FindAfi, IfPm3Iso15693, "Brute force AFI of an ISO15693 tag"}, {"writeafi", CmdHF15WriteAfi, IfPm3Iso15693, "Writes the AFI on an ISO15693 tag"}, {"writedsfid", CmdHF15WriteDsfid, IfPm3Iso15693, "Writes the DSFID on an ISO15693 tag"}, - {"-----------", CmdHF15Help, IfPm3Iso15693, ""}, + {"-----------", CmdHF15Help, IfPm3Iso15693, "----------------------- " _CYAN_("magic") " -----------------------"}, {"csetuid", CmdHF15CSetUID, IfPm3Iso15693, "Set UID for magic Chinese card"}, {NULL, NULL, NULL, NULL} }; @@ -1874,16 +1848,3 @@ int CmdHF15(const char *Cmd) { clearCommandBuffer(); return CmdsParse(CommandTable, Cmd); } - -// used with 'hf search' -bool readHF15Uid(bool verbose) { - uint8_t uid[8] = {0}; - if (!getUID(uid)) { - if (verbose) PrintAndLogEx(WARNING, "No tag found."); - return false; - } - PrintAndLogEx(NORMAL, ""); - PrintAndLogEx(SUCCESS, " UID: " _GREEN_("%s"), iso15693_sprintUID(NULL, uid)); - PrintAndLogEx(SUCCESS, "TYPE: " _YELLOW_("%s"), getTagInfo_15(uid)); - return true; -} diff --git a/client/src/cmdhf15.h b/client/src/cmdhf15.h index 81530a58c..42e5e12c0 100644 --- a/client/src/cmdhf15.h +++ b/client/src/cmdhf15.h @@ -15,6 +15,6 @@ int CmdHF15(const char *Cmd); -bool readHF15Uid(bool verbose); +bool readHF15Uid(bool loop, bool verbose); #endif diff --git a/client/src/cmdhfcryptorf.c b/client/src/cmdhfcryptorf.c index 559dc0e35..cd3bc93a4 100644 --- a/client/src/cmdhfcryptorf.c +++ b/client/src/cmdhfcryptorf.c @@ -58,11 +58,10 @@ static int usage_hf_cryptorf_sniff(void) { return PM3_SUCCESS; } static int usage_hf_cryptorf_sim(void) { - PrintAndLogEx(NORMAL, "Emulating CryptoRF tag with 4 UID / PUPI\n" - "Usage: hf cryptorf sim [h] [u ]\n" + PrintAndLogEx(NORMAL, "Emulating CryptoRF tag with emulator memory\n" + "Usage: hf cryptorf sim [h] \n" "Options:\n" " h this help\n" - " u 4byte UID/PUPI\n" "\n" "Example:\n" _YELLOW_(" hf cryptorf sim") @@ -116,7 +115,7 @@ static int switch_off_field_cryptorf(void) { static int CmdHFCryptoRFList(const char *Cmd) { (void)Cmd; // Cmd is not used so far - CmdTraceList("14b"); + CmdTraceList("cryptorf"); return PM3_SUCCESS; } @@ -124,13 +123,8 @@ static int CmdHFCryptoRFSim(const char *Cmd) { char cmdp = tolower(param_getchar(Cmd, 0)); if (cmdp == 'h') return usage_hf_cryptorf_sim(); - uint32_t pupi = 0; - if (cmdp == 'u') { - pupi = param_get32ex(Cmd, 1, 0, 16); - } - clearCommandBuffer(); - SendCommandMIX(CMD_HF_ISO14443B_SIMULATE, pupi, 0, 0, NULL, 0); + SendCommandMIX(CMD_HF_CRYPTORF_SIM, 0, 0, 0, NULL, 0); return PM3_SUCCESS; } @@ -152,23 +146,7 @@ static bool get_14b_UID(iso14b_card_select_t *card) { int8_t retry = 3; PacketResponseNG resp; - // test for 14b SR - while (retry--) { - - clearCommandBuffer(); - SendCommandMIX(CMD_HF_ISO14443B_COMMAND, ISO14B_CONNECT | ISO14B_SELECT_SR | ISO14B_DISCONNECT, 0, 0, NULL, 0); - if (WaitForResponseTimeout(CMD_ACK, &resp, TIMEOUT)) { - - uint8_t status = resp.oldarg[0]; - if (status == 0) { - memcpy(card, (iso14b_card_select_t *)resp.data.asBytes, sizeof(iso14b_card_select_t)); - return true; - } - } - } // retry - - // test 14b standard - retry = 3; + // test while (retry--) { clearCommandBuffer(); @@ -495,7 +473,7 @@ static int CmdHFCryptoRFESave(const char *Cmd) { //needs to change saveFileEML(filename, data, numofbytes, 8); //needs to change - saveFileJSON(filename, jsfRaw, data, numofbytes); + saveFileJSON(filename, jsfRaw, data, numofbytes, NULL); return PM3_SUCCESS; } diff --git a/client/src/cmdhfepa.c b/client/src/cmdhfepa.c index e83ee39bf..eb4efc9f1 100644 --- a/client/src/cmdhfepa.c +++ b/client/src/cmdhfepa.c @@ -14,6 +14,7 @@ #include #include #include +#include // tolower #include "cmdparser.h" // command_t #include "commonutil.h" // ARRAYLEN @@ -23,8 +24,27 @@ static int CmdHelp(const char *Cmd); +static int usage_epa_collect(void) { + PrintAndLogEx(NORMAL, "Tries to collect nonces when doing part of PACE protocol.\n" + "\n" + "Usage: hf epa cnonces \n" + "Options:\n" + "\t nonce size\n" + "\t number of nonces to collect\n" + "\t delay between\n" + "\n" + "Example:\n" + _YELLOW_("\thf epa cnonces 4 4 1") + ); + return PM3_SUCCESS; +} + // Perform (part of) the PACE protocol static int CmdHFEPACollectPACENonces(const char *Cmd) { + + char cmdp = tolower(param_getchar(Cmd, 0)); + if (cmdp == 'h') return usage_epa_collect(); + // requested nonce size uint32_t m = 0; // requested number of Nonces @@ -40,13 +60,20 @@ static int CmdHFEPACollectPACENonces(const char *Cmd) { PrintAndLogEx(SUCCESS, "Collecting %u %u byte nonces", n, m); PrintAndLogEx(SUCCESS, "Start: %" PRIu64, msclock() / 1000); - // repeat n times + + struct p { + uint32_t m; + } PACKED payload; + payload.m = m; + for (uint32_t i = 0; i < n; i++) { // execute PACE - clearCommandBuffer(); - SendCommandMIX(CMD_HF_EPA_COLLECT_NONCE, (int)m, 0, 0, NULL, 0); + PacketResponseNG resp; - WaitForResponse(CMD_ACK, &resp); + clearCommandBuffer(); + SendCommandNG(CMD_HF_EPA_COLLECT_NONCE, (uint8_t*)&payload, sizeof(payload)); + + WaitForResponse(CMD_HF_EPA_COLLECT_NONCE, &resp); // check if command failed if (resp.oldarg[0] != 0) { @@ -65,6 +92,7 @@ static int CmdHFEPACollectPACENonces(const char *Cmd) { sleep(d); } } + PrintAndLogEx(SUCCESS, "End: %" PRIu64, msclock() / 1000); return PM3_SUCCESS; } @@ -92,8 +120,8 @@ static int CmdHFEPAPACEReplay(const char *Cmd) { while (Cmd[skip] != ' ' && Cmd[skip] != '\0') { // convert scan_return = sscanf(Cmd + skip, - "%2X%n", - (unsigned int *)(apdus[i] + apdu_lengths[i]), + "%2" SCNx8 "%n", + apdus[i] + apdu_lengths[i], &skip_add ); @@ -155,6 +183,7 @@ static int CmdHFEPAPACEReplay(const char *Cmd) { clearCommandBuffer(); SendCommandMIX(CMD_HF_EPA_REPLAY, 0, 0, 0, NULL, 0); WaitForResponse(CMD_ACK, &resp); + if (resp.oldarg[0] != 0) { PrintAndLogEx(SUCCESS, "\nPACE replay failed in step %u!", (uint32_t)resp.oldarg[0]); PrintAndLogEx(SUCCESS, "Measured times:"); diff --git a/client/src/cmdhffelica.c b/client/src/cmdhffelica.c index dc3b07a1b..f62a9a8ff 100644 --- a/client/src/cmdhffelica.c +++ b/client/src/cmdhffelica.c @@ -22,7 +22,7 @@ #include "util.h" #include "ui.h" #include "mifare.h" // felica_card_select_t struct -#include "mbedtls/des.h" +#include "des.h" #define AddCrc(data, len) compute_crc(CRC_FELICA, (data), (len), (data)+(len)+1, (data)+(len)) static int CmdHelp(const char *Cmd); @@ -123,7 +123,7 @@ static int usage_hf_felica_request_response(void) { return PM3_SUCCESS; } -static void print_status_flag1_interpretation() { +static void print_status_flag1_interpretation(void) { PrintAndLogEx(NORMAL, "\nStatus Flag1:"); PrintAndLogEx(NORMAL, " - 00h : Indicates the successful completion of a command."); PrintAndLogEx(NORMAL, " - FFh : If an error occurs during the processing of a command that includes no list in the command packet, or if " @@ -133,7 +133,7 @@ static void print_status_flag1_interpretation() { "indicating the location of the error."); } -static void print_status_flag2_interpration() { +static void print_status_flag2_interpration(void) { PrintAndLogEx(NORMAL, "\nStatus Flag2:"); PrintAndLogEx(NORMAL, " - 00h : Indicates the successful completion of a command."); PrintAndLogEx(NORMAL, " - 01h : The calculated result is either less than zero when the purse data is decremented, or exceeds 4" @@ -167,7 +167,7 @@ static void print_status_flag2_interpration() { PrintAndLogEx(NORMAL, " - C2h : Command is disabled already: This is the error that occurs in issuance commands."); } -static void print_block_list_element_constraints() { +static void print_block_list_element_constraints(void) { PrintAndLogEx(NORMAL, " - Each Block List Element shall satisfy the following conditions:"); PrintAndLogEx(NORMAL, " - The value of Service Code List Order shall not exceed Number of Service."); PrintAndLogEx(NORMAL, " - Access Mode shall be 000b."); @@ -177,22 +177,22 @@ static void print_block_list_element_constraints() { PrintAndLogEx(NORMAL, " - Block Number shall be in the range of the number of Blocks assigned to the specified Service."); } -static void print_number_of_service_constraints() { +static void print_number_of_service_constraints(void) { PrintAndLogEx(NORMAL, " - Number of Service: shall be a positive integer in the range of 1 to 16, inclusive."); } -static void print_number_of_block_constraints() { +static void print_number_of_block_constraints(void) { PrintAndLogEx(NORMAL, " - Number of Block: shall be less than or equal to the maximum number of Blocks that can be read simultaneously. " "The maximum number of Blocks that can be read simultaneously can differ, depending on the product being used. Use as default 01"); } -static void print_service_code_list_constraints() { +static void print_service_code_list_constraints(void) { PrintAndLogEx(NORMAL, " - Service Code List: For Service Code List, only Service Code existing in the product shall be specified:"); PrintAndLogEx(NORMAL, " - Even when Service Code exists in the product, Service Code not referenced from Block List shall not be specified to Service Code List."); PrintAndLogEx(NORMAL, " - For existence or nonexistence of Service in a product, please check using the Request Service (or Request Service v2) command."); } -static int usage_hf_felica_read_without_encryption() { +static int usage_hf_felica_read_without_encryption(void) { PrintAndLogEx(NORMAL, "\nInfo: Use this command to read Block Data from authentication-not-required Service."); PrintAndLogEx(NORMAL, " - Mode shall be Mode0."); print_number_of_service_constraints(); @@ -215,7 +215,7 @@ static int usage_hf_felica_read_without_encryption() { return PM3_SUCCESS; } -static int usage_hf_felica_write_without_encryption() { +static int usage_hf_felica_write_without_encryption(void) { PrintAndLogEx(NORMAL, "\nInfo: Use this command to write Block Data to authentication-not-required Service."); PrintAndLogEx(NORMAL, " - Mode shall be Mode0."); print_number_of_service_constraints(); @@ -234,7 +234,7 @@ static int usage_hf_felica_write_without_encryption() { return PM3_SUCCESS; } -static int usage_hf_felica_request_system_code() { +static int usage_hf_felica_request_system_code(void) { PrintAndLogEx(NORMAL, "\nInfo: Use this command to acquire System Code registered to the card."); PrintAndLogEx(NORMAL, " - If a card is divided into more than one System, this command acquires System Code of each System existing in the card."); PrintAndLogEx(NORMAL, "\nUsage: hf felica rqsyscode [-h] [-i]"); @@ -246,7 +246,7 @@ static int usage_hf_felica_request_system_code() { return PM3_SUCCESS; } -static int usage_hf_felica_reset_mode() { +static int usage_hf_felica_reset_mode(void) { PrintAndLogEx(NORMAL, "\nInfo: Use this command to reset Mode to Mode 0."); print_status_flag1_interpretation(); print_status_flag2_interpration(); @@ -261,7 +261,7 @@ static int usage_hf_felica_reset_mode() { return PM3_SUCCESS; } -static int usage_hf_felica_request_specification_version() { +static int usage_hf_felica_request_specification_version(void) { PrintAndLogEx(NORMAL, "\nInfo: Use this command to acquire the version of card OS."); PrintAndLogEx(NORMAL, " - Response:"); PrintAndLogEx(NORMAL, " - Format Version: Fixed value 00h. Provided only if Status Flag1 = 00h."); @@ -283,7 +283,7 @@ static int usage_hf_felica_request_specification_version() { return PM3_SUCCESS; } -static int usage_hf_felica_authentication1() { +static int usage_hf_felica_authentication1(void) { PrintAndLogEx(NORMAL, "\nInfo: Initiate mutual authentication. This command must always be executed before Authentication2 command" ", and mutual authentication is achieve only after Authentication2 command has succeeded."); PrintAndLogEx(NORMAL, " - Auth1 Parameters:"); @@ -311,7 +311,7 @@ static int usage_hf_felica_authentication1() { return PM3_SUCCESS; } -static int usage_hf_felica_authentication2() { +static int usage_hf_felica_authentication2(void) { PrintAndLogEx(NORMAL, "\nInfo: Complete mutual authentication. This command can only be executed subsquent to Authentication1" " command."); PrintAndLogEx(NORMAL, " - Auth2 Parameters:"); @@ -551,7 +551,7 @@ static bool check_last_idm(uint8_t *data, uint16_t datalen) { * @param wr_noCry_resp frame in which the response will be saved. * @return success if response was received. */ -int send_wr_unencrypted(uint8_t flags, uint16_t datalen, uint8_t *data, bool verbose, felica_status_response_t *wr_noCry_resp) { +static int send_wr_unencrypted(uint8_t flags, uint16_t datalen, uint8_t *data, bool verbose, felica_status_response_t *wr_noCry_resp) { clear_and_send_command(flags, datalen, data, verbose); PacketResponseNG resp; if (!waitCmdFelica(0, &resp, verbose)) { @@ -1367,7 +1367,8 @@ static int CmdHFFelicaRequestService(const char *Cmd) { flags |= FELICA_RAW; } - datalen = (datalen > PM3_CMD_DATA_SIZE) ? PM3_CMD_DATA_SIZE : datalen; +// Todo activate once datalen isn't hardcoded anymore... +// datalen = (datalen > PM3_CMD_DATA_SIZE) ? PM3_CMD_DATA_SIZE : datalen; if (!custom_IDm && !check_last_idm(data, datalen)) { return PM3_EINVARG; } @@ -1464,7 +1465,7 @@ static int CmdHFFelicaSimLite(const char *Cmd) { return PM3_SUCCESS; } -static void printSep() { +static void printSep(void) { PrintAndLogEx(INFO, "------------------------------------------------------------------------------------"); } @@ -1632,7 +1633,7 @@ static int CmdHFFelicaDumpLite(const char *Cmd) { printf("."); fflush(stdout); if (kbd_enter_pressed()) { - PrintAndLogEx(WARNING, "\n[!] aborted via keyboard!\n"); + PrintAndLogEx(WARNING, "aborted via keyboard!\n"); DropField(); return PM3_EOPABORTED; } @@ -1847,7 +1848,8 @@ int readFelicaUid(bool verbose) { } static command_t CommandTable[] = { - {"----------- General -----------", CmdHelp, AlwaysAvailable, ""}, + + {"-----------", CmdHelp, AlwaysAvailable, "----------------------- " _CYAN_("General") " -----------------------"}, {"help", CmdHelp, AlwaysAvailable, "This help"}, {"list", CmdHFFelicaList, AlwaysAvailable, "List ISO 18092/FeliCa history"}, {"reader", CmdHFFelicaReader, IfPm3Felica, "Act like an ISO18092/FeliCa reader"}, @@ -1855,7 +1857,7 @@ static command_t CommandTable[] = { {"raw", CmdHFFelicaCmdRaw, IfPm3Felica, "Send raw hex data to tag"}, {"rdunencrypted", CmdHFFelicaReadWithoutEncryption, IfPm3Felica, "read Block Data from authentication-not-required Service."}, {"wrunencrypted", CmdHFFelicaWriteWithoutEncryption, IfPm3Felica, "write Block Data to an authentication-not-required Service."}, - {"----------- FeliCa Standard -----------", CmdHelp, AlwaysAvailable, ""}, + {"-----------", CmdHelp, AlwaysAvailable, "----------------------- " _CYAN_("FeliCa Standard") " -----------------------"}, //{"dump", CmdHFFelicaDump, IfPm3Felica, "Wait for and try dumping FeliCa"}, {"rqservice", CmdHFFelicaRequestService, IfPm3Felica, "verify the existence of Area and Service, and to acquire Key Version."}, {"rqresponse", CmdHFFelicaRequestResponse, IfPm3Felica, "verify the existence of a card and its Mode."}, @@ -1874,7 +1876,7 @@ static command_t CommandTable[] = { //{"readv2", CmdHFFelicaNotImplementedYet, IfPm3Felica, "read Block Data from authentication-required Service."}, //{"writev2", CmdHFFelicaNotImplementedYet, IfPm3Felica, "write Block Data to authentication-required Service."}, //{"uprandomid", CmdHFFelicaNotImplementedYet, IfPm3Felica, "update Random ID (IDr)."}, - {"----------- FeliCa Light -----------", CmdHelp, AlwaysAvailable, ""}, + {"-----------", CmdHelp, AlwaysAvailable, "----------------------- " _CYAN_("FeliCa Light") " -----------------------"}, {"litesim", CmdHFFelicaSimLite, IfPm3Felica, " - only reply to poll request"}, {"litedump", CmdHFFelicaDumpLite, IfPm3Felica, "Wait for and try dumping FelicaLite"}, // {"sim", CmdHFFelicaSim, IfPm3Felica, " -- Simulate ISO 18092/FeliCa tag"} diff --git a/client/src/cmdhffido.c b/client/src/cmdhffido.c index e35479db9..50c1495c8 100644 --- a/client/src/cmdhffido.c +++ b/client/src/cmdhffido.c @@ -18,14 +18,12 @@ // https://fidoalliance.org/specs/fido-u2f-v1.2-ps-20170411/fido-u2f-raw-message-formats-v1.2-ps-20170411.html //----------------------------------------------------------------------------- - #include "cmdhffido.h" #include #include "cmdparser.h" // command_t #include "commonutil.h" - #include "comms.h" #include "proxmark3.h" #include "emv/emvcore.h" @@ -50,7 +48,7 @@ static int CmdHFFidoInfo(const char *cmd) { infoHF14A(false, false, false); // FIDO info - PrintAndLogEx(NORMAL, "--------------------------------------------"); + PrintAndLogEx(INFO, "-----------" _CYAN_("FIDO Info") "---------------------------------"); SetAPDULogging(false); uint8_t buf[APDU_RES_LEN] = {0}; @@ -70,7 +68,7 @@ static int CmdHFFidoInfo(const char *cmd) { PrintAndLogEx(ERR, "APDU exchange error. Card returns 0x0000."); DropField(); - return 0; + return PM3_SUCCESS; } if (!strncmp((char *)buf, "U2F_V2", 7)) { @@ -92,13 +90,12 @@ static int CmdHFFidoInfo(const char *cmd) { } if (sw != 0x9000) { PrintAndLogEx(ERR, "FIDO2 version doesn't exist (%04x - %s).", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); - - return 0; + return PM3_SUCCESS; } if (buf[0]) { PrintAndLogEx(ERR, "FIDO2 get version error: %d - %s", buf[0], fido2GetCmdErrorDescription(buf[0])); - return 0; + return PM3_SUCCESS; } if (len > 1) { @@ -107,21 +104,20 @@ static int CmdHFFidoInfo(const char *cmd) { } else { PrintAndLogEx(ERR, "FIDO2 version length error"); } - return 0; + return PM3_SUCCESS; } -static json_t *OpenJson(int paramnum, char *fname, void *argtable[], bool *err) { +static json_t *OpenJson(CLIParserContext *ctx, int paramnum, char *fname, void *argtable[], bool *err) { json_t *root = NULL; json_error_t error; *err = false; - uint8_t jsonname[250] = {0}; + uint8_t jsonname[FILE_PATH_SIZE] = {0}; char *cjsonname = (char *)jsonname; int jsonnamelen = 0; - // CLIGetStrWithReturn(paramnum, jsonname, &jsonnamelen); - if (CLIParamStrToBuf(arg_get_str(paramnum), jsonname, sizeof(jsonname), &jsonnamelen)) { - CLIParserFree(); + // CLIGetStrWithReturn(ctx, paramnum, jsonname, &jsonnamelen); + if (CLIParamStrToBuf(arg_get_str(ctx, paramnum), jsonname, sizeof(jsonname), &jsonnamelen)) { return NULL; } @@ -160,9 +156,9 @@ static int CmdHFFidoRegister(const char *cmd) { uint8_t cdata[250] = {0}; int applen = 0; uint8_t adata[250] = {0}; - json_t *root = NULL; - CLIParserInit("hf fido reg", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf fido reg", "Initiate a U2F token registration. Needs two 32-byte hash numbers. \nchallenge parameter (32b) and application parameter (32b).", "Usage:\n\thf fido reg -> execute command with 2 parameters, filled 0x00\n" "\thf fido reg 000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f 000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f -> execute command with parameters" @@ -179,19 +175,21 @@ static int CmdHFFidoRegister(const char *cmd) { arg_str0(NULL, NULL, "", NULL), arg_param_end }; - CLIExecWithReturn(cmd, argtable, true); + CLIExecWithReturn(ctx, cmd, argtable, true); - bool APDULogging = arg_get_lit(1); - bool verbose = arg_get_lit(2); - bool verbose2 = arg_get_lit(2) > 1; - bool paramsPlain = arg_get_lit(3); - bool showDERTLV = arg_get_lit(4); + bool APDULogging = arg_get_lit(ctx, 1); + bool verbose = arg_get_lit(ctx, 2); + bool verbose2 = arg_get_lit(ctx, 2) > 1; + bool paramsPlain = arg_get_lit(ctx, 3); + bool showDERTLV = arg_get_lit(ctx, 4); - char fname[250] = {0}; + char fname[FILE_PATH_SIZE] = {0}; bool err; - root = OpenJson(5, fname, argtable, &err); - if (err) - return 1; + json_t *root = OpenJson(ctx, 5, fname, argtable, &err); + if (err) { + CLIParserFree(ctx); + return PM3_EINVARG; + } if (root) { size_t jlen; JsonLoadBufAsHex(root, "$.ChallengeParam", data, 32, &jlen); @@ -200,16 +198,18 @@ static int CmdHFFidoRegister(const char *cmd) { if (paramsPlain) { memset(cdata, 0x00, 32); - CLIGetStrWithReturn(6, cdata, &chlen); + CLIGetStrWithReturn(ctx, 6, cdata, &chlen); if (chlen > 16) { PrintAndLogEx(ERR, "ERROR: challenge parameter length in ASCII mode must be less than 16 chars instead of: %d", chlen); - return 1; + CLIParserFree(ctx); + return PM3_EINVARG; } } else { - CLIGetHexWithReturn(6, cdata, &chlen); + CLIGetHexWithReturn(ctx, 6, cdata, &chlen); if (chlen && chlen != 32) { PrintAndLogEx(ERR, "ERROR: challenge parameter length must be 32 bytes only."); - return 1; + CLIParserFree(ctx); + return PM3_EINVARG; } } if (chlen) @@ -218,22 +218,24 @@ static int CmdHFFidoRegister(const char *cmd) { if (paramsPlain) { memset(adata, 0x00, 32); - CLIGetStrWithReturn(7, adata, &applen); + CLIGetStrWithReturn(ctx, 7, adata, &applen); if (applen > 16) { PrintAndLogEx(ERR, "ERROR: application parameter length in ASCII mode must be less than 16 chars instead of: %d", applen); - return 1; + CLIParserFree(ctx); + return PM3_EINVARG; } } else { - CLIGetHexWithReturn(7, adata, &applen); + CLIGetHexWithReturn(ctx, 7, adata, &applen); if (applen && applen != 32) { PrintAndLogEx(ERR, "ERROR: application parameter length must be 32 bytes only."); - return 1; + CLIParserFree(ctx); + return PM3_EINVARG; } } if (applen) memmove(&data[32], adata, 32); - CLIParserFree(); + CLIParserFree(ctx); SetAPDULogging(APDULogging); @@ -256,7 +258,7 @@ static int CmdHFFidoRegister(const char *cmd) { if (sw != 0x9000) { PrintAndLogEx(ERR, "Can't select FIDO application. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); - return 2; + return PM3_ESOFT; } res = FIDORegister(data, buf, sizeof(buf), &len, &sw); @@ -268,22 +270,24 @@ static int CmdHFFidoRegister(const char *cmd) { if (sw != 0x9000) { PrintAndLogEx(ERR, "ERROR execute register command. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); - return 3; + return PM3_ESOFT; } PrintAndLogEx(NORMAL, ""); if (APDULogging) - PrintAndLogEx(NORMAL, "---------------------------------------------------------------"); + PrintAndLogEx(INFO, "---------------------------------------------------------------"); + PrintAndLogEx(NORMAL, "data len: %zu", len); + if (verbose2) { - PrintAndLogEx(NORMAL, "--------------data----------------------"); + PrintAndLogEx(INFO, "------------ " _CYAN_("data") " ----------------------"); dump_buffer((const unsigned char *)buf, len, NULL, 0); - PrintAndLogEx(NORMAL, "--------------data----------------------"); + PrintAndLogEx(INFO, "-------------" _CYAN_("data") " ----------------------"); } if (buf[0] != 0x05) { PrintAndLogEx(ERR, "ERROR: First byte must be 0x05, but it %2x", buf[0]); - return 5; + return PM3_ESOFT; } PrintAndLogEx(SUCCESS, "User public key: %s", sprint_hex(&buf[1], 65)); @@ -337,6 +341,7 @@ static int CmdHFFidoRegister(const char *cmd) { &buf[67], keyHandleLen, // keyHandle &buf[1], 65, // user public key NULL, 0); + (void)res; //PrintAndLogEx(NORMAL, "--xbuf(%d)[%d]: %s", res, xbuflen, sprint_hex(xbuf, xbuflen)); res = ecdsa_signature_verify(MBEDTLS_ECP_DP_SECP256R1, public_key, xbuf, xbuflen, &buf[hashp], len - hashp, true); if (res) { @@ -354,12 +359,11 @@ static int CmdHFFidoRegister(const char *cmd) { } PrintAndLogEx(INFO, "\nauth command: "); - printf("hf fido auth %s%s", paramsPlain ? "-p " : "", sprint_hex_inrow(&buf[67], keyHandleLen)); + PrintAndLogEx(INFO, "hf fido auth %s%s", paramsPlain ? "-p " : "", sprint_hex_inrow(&buf[67], keyHandleLen)); if (chlen || applen) - printf(" %s", paramsPlain ? (char *)cdata : sprint_hex_inrow(cdata, 32)); + PrintAndLogEx(INFO, " %s", paramsPlain ? (char *)cdata : sprint_hex_inrow(cdata, 32)); if (applen) - printf(" %s", paramsPlain ? (char *)adata : sprint_hex_inrow(adata, 32)); - printf("\n"); + PrintAndLogEx(INFO, " %s", paramsPlain ? (char *)adata : sprint_hex_inrow(adata, 32)); if (root) { JsonSaveBufAsHex(root, "ChallengeParam", data, 32); @@ -372,16 +376,15 @@ static int CmdHFFidoRegister(const char *cmd) { res = json_dump_file(root, fname, JSON_INDENT(2)); if (res) { PrintAndLogEx(ERR, "ERROR: can't save the file: %s", fname); - return 200; + return PM3_EFILE; } PrintAndLogEx(SUCCESS, "File " _YELLOW_("`%s`") " saved.", fname); // free json object json_decref(root); } - - return 0; -}; + return PM3_SUCCESS; +} static int CmdHFFidoAuthenticate(const char *cmd) { uint8_t data[512] = {0}; @@ -390,9 +393,9 @@ static int CmdHFFidoAuthenticate(const char *cmd) { uint8_t public_key[65] = {0}; int hdatalen = 0; uint8_t keyHandleLen = 0; - json_t *root = NULL; - CLIParserInit("hf fido auth", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf fido auth", "Initiate a U2F token authentication. Needs key handle and two 32-byte hash numbers. \nkey handle(var 0..255), challenge parameter (32b) and application parameter (32b).", "Usage:\n\thf fido auth 000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f -> execute command with 2 parameters, filled 0x00 and key handle\n" "\thf fido auth 000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f " @@ -413,22 +416,25 @@ static int CmdHFFidoAuthenticate(const char *cmd) { arg_str0(NULL, NULL, "", NULL), arg_param_end }; - CLIExecWithReturn(cmd, argtable, true); + CLIExecWithReturn(ctx, cmd, argtable, true); - bool APDULogging = arg_get_lit(1); - bool verbose = arg_get_lit(2); - bool paramsPlain = arg_get_lit(3); + bool APDULogging = arg_get_lit(ctx, 1); + bool verbose = arg_get_lit(ctx, 2); + bool paramsPlain = arg_get_lit(ctx, 3); uint8_t controlByte = 0x08; - if (arg_get_lit(5)) + if (arg_get_lit(ctx, 5)) controlByte = 0x03; - if (arg_get_lit(6)) + if (arg_get_lit(ctx, 6)) controlByte = 0x07; char fname[250] = {0}; bool err; - root = OpenJson(7, fname, argtable, &err); - if (err) - return 1; + json_t *root = OpenJson(ctx, 7, fname, argtable, &err); + if (err) { + CLIParserFree(ctx); + return PM3_EINVARG; + } + if (root) { size_t jlen; JsonLoadBufAsHex(root, "$.ChallengeParam", data, 32, &jlen); @@ -441,21 +447,25 @@ static int CmdHFFidoAuthenticate(const char *cmd) { } // public key - CLIGetHexWithReturn(8, hdata, &hdatalen); + CLIGetHexWithReturn(ctx, 8, hdata, &hdatalen); if (hdatalen && hdatalen != 65) { PrintAndLogEx(ERR, "ERROR: public key length must be 65 bytes only."); - return 1; + CLIParserFree(ctx); + return PM3_EINVARG; } + if (hdatalen) { memmove(public_key, hdata, hdatalen); public_key_loaded = true; } - CLIGetHexWithReturn(9, hdata, &hdatalen); + CLIGetHexWithReturn(ctx, 9, hdata, &hdatalen); if (hdatalen > 255) { PrintAndLogEx(ERR, "ERROR: application parameter length must be less than 255."); - return 1; + CLIParserFree(ctx); + return PM3_EINVARG; } + if (hdatalen) { keyHandleLen = hdatalen; data[64] = keyHandleLen; @@ -464,39 +474,45 @@ static int CmdHFFidoAuthenticate(const char *cmd) { if (paramsPlain) { memset(hdata, 0x00, 32); - CLIGetStrWithReturn(9, hdata, &hdatalen); + CLIGetStrWithReturn(ctx, 9, hdata, &hdatalen); if (hdatalen > 16) { PrintAndLogEx(ERR, "ERROR: challenge parameter length in ASCII mode must be less than 16 chars instead of: %d", hdatalen); - return 1; + CLIParserFree(ctx); + return PM3_EINVARG; } } else { - CLIGetHexWithReturn(10, hdata, &hdatalen); + CLIGetHexWithReturn(ctx, 10, hdata, &hdatalen); if (hdatalen && hdatalen != 32) { PrintAndLogEx(ERR, "ERROR: challenge parameter length must be 32 bytes only."); - return 1; + CLIParserFree(ctx); + return PM3_EINVARG; } } + if (hdatalen) memmove(data, hdata, 32); if (paramsPlain) { memset(hdata, 0x00, 32); - CLIGetStrWithReturn(11, hdata, &hdatalen); + CLIGetStrWithReturn(ctx, 11, hdata, &hdatalen); if (hdatalen > 16) { PrintAndLogEx(ERR, "ERROR: application parameter length in ASCII mode must be less than 16 chars instead of: %d", hdatalen); - return 1; + CLIParserFree(ctx); + return PM3_EINVARG; } } else { - CLIGetHexWithReturn(10, hdata, &hdatalen); + CLIGetHexWithReturn(ctx, 10, hdata, &hdatalen); if (hdatalen && hdatalen != 32) { PrintAndLogEx(ERR, "ERROR: application parameter length must be 32 bytes only."); - return 1; + CLIParserFree(ctx); + return PM3_EINVARG; } } + if (hdatalen) memmove(&data[32], hdata, 32); - CLIParserFree(); + CLIParserFree(ctx); SetAPDULogging(APDULogging); @@ -524,7 +540,7 @@ static int CmdHFFidoAuthenticate(const char *cmd) { if (sw != 0x9000) { PrintAndLogEx(ERR, "Can't select FIDO application. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); - return 2; + return PM3_ESOFT; } res = FIDOAuthentication(data, datalen, controlByte, buf, sizeof(buf), &len, &sw); @@ -536,7 +552,7 @@ static int CmdHFFidoAuthenticate(const char *cmd) { if (sw != 0x9000) { PrintAndLogEx(ERR, "ERROR execute authentication command. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); - return 3; + return PM3_ESOFT; } PrintAndLogEx(NORMAL, "---------------------------------------------------------------"); @@ -563,6 +579,7 @@ static int CmdHFFidoAuthenticate(const char *cmd) { &buf[1], 4, // counter data, 32, // challenge parameter NULL, 0); + (void)res; //PrintAndLogEx(NORMAL, "--xbuf(%d)[%d]: %s", res, xbuflen, sprint_hex(xbuf, xbuflen)); res = ecdsa_signature_verify(MBEDTLS_ECP_DP_SECP256R1, public_key, xbuf, xbuflen, &buf[5], len - 5, true); if (res) { @@ -591,15 +608,15 @@ static int CmdHFFidoAuthenticate(const char *cmd) { res = json_dump_file(root, fname, JSON_INDENT(2)); if (res) { PrintAndLogEx(ERR, "ERROR: can't save the file: %s", fname); - return 200; + return PM3_EFILE; } PrintAndLogEx(SUCCESS, "File " _YELLOW_("`%s`") " saved.", fname); // free json object json_decref(root); } - return 0; -}; + return PM3_ESOFT; +} static void CheckSlash(char *fileName) { if ((fileName[strlen(fileName) - 1] != '/') && @@ -607,6 +624,7 @@ static void CheckSlash(char *fileName) { strcat(fileName, "/"); } +//iceman, todo: use searchfile.. static int GetExistsFileNameJson(const char *prefixDir, const char *reqestedFileName, char *fileName) { fileName[0] = 0x00; strcpy(fileName, get_my_executable_directory()); @@ -628,18 +646,18 @@ static int GetExistsFileNameJson(const char *prefixDir, const char *reqestedFile strcat(fileName, ".json"); if (access(fileName, F_OK) < 0) { - return 1; // file not found + return PM3_EFILE; // file not found } } - return 0; + return PM3_SUCCESS; } static int CmdHFFido2MakeCredential(const char *cmd) { json_error_t error; - json_t *root = NULL; - char fname[300] = {0}; + char fname[FILE_PATH_SIZE] = {0}; - CLIParserInit("hf fido make", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf fido make", "Execute a FIDO2 Make Credential command. Needs json file with parameters. Sample file " _YELLOW_("`fido2.json`") " in `resources/`.", "Usage:\n\thf fido make -> execute command with default parameters file `fido2.json`\n" "\thf fido make test.json -> execute command with parameters file `text.json`"); @@ -653,38 +671,38 @@ static int CmdHFFido2MakeCredential(const char *cmd) { arg_str0(NULL, NULL, "", "JSON input / output file name for parameters. Default `fido2.json`"), arg_param_end }; - CLIExecWithReturn(cmd, argtable, true); + CLIExecWithReturn(ctx, cmd, argtable, true); - bool APDULogging = arg_get_lit(1); - bool verbose = arg_get_lit(2); - bool verbose2 = arg_get_lit(2) > 1; - bool showDERTLV = arg_get_lit(3); - bool showCBOR = arg_get_lit(4); + bool APDULogging = arg_get_lit(ctx, 1); + bool verbose = arg_get_lit(ctx, 2); + bool verbose2 = arg_get_lit(ctx, 2) > 1; + bool showDERTLV = arg_get_lit(ctx, 3); + bool showCBOR = arg_get_lit(ctx, 4); - uint8_t jsonname[250] = {0}; + uint8_t jsonname[FILE_PATH_SIZE] = {0}; char *cjsonname = (char *)jsonname; int jsonnamelen = 0; - CLIGetStrWithReturn(5, jsonname, &jsonnamelen); + CLIGetStrWithReturn(ctx, 5, jsonname, &jsonnamelen); if (!jsonnamelen) { strcat(cjsonname, "fido2"); jsonnamelen = strlen(cjsonname); } - CLIParserFree(); + CLIParserFree(ctx); SetAPDULogging(APDULogging); int res = GetExistsFileNameJson("fido", cjsonname, fname); - if (res) { + if (res != PM3_SUCCESS) { PrintAndLogEx(ERR, "ERROR: Can't found the json file."); return res; } PrintAndLogEx(NORMAL, "fname: %s\n", fname); - root = json_load_file(fname, 0, &error); + json_t *root = json_load_file(fname, 0, &error); if (!root) { PrintAndLogEx(ERR, "ERROR: json error on line %d: %s", error.line, error.text); - return 1; + return PM3_EFILE; } uint8_t data[2048] = {0}; @@ -695,7 +713,6 @@ static int CmdHFFido2MakeCredential(const char *cmd) { DropField(); res = FIDOSelect(true, true, buf, sizeof(buf), &len, &sw); - if (res) { PrintAndLogEx(ERR, "Can't select authenticator. res=%x. Exit...", res); DropField(); @@ -705,7 +722,7 @@ static int CmdHFFido2MakeCredential(const char *cmd) { if (sw != 0x9000) { PrintAndLogEx(ERR, "Can't select FIDO application. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); - return 2; + return PM3_ESOFT; } res = FIDO2CreateMakeCredentionalReq(root, data, sizeof(data), &datalen); @@ -714,9 +731,9 @@ static int CmdHFFido2MakeCredential(const char *cmd) { if (showCBOR) { PrintAndLogEx(INFO, "CBOR make credential request:"); - PrintAndLogEx(NORMAL, "---------------- CBOR ------------------"); + PrintAndLogEx(INFO, "---------------- " _CYAN_("CBOR") " ------------------"); TinyCborPrintFIDOPackage(fido2CmdMakeCredential, false, data, datalen); - PrintAndLogEx(NORMAL, "---------------- CBOR ------------------"); + PrintAndLogEx(INFO, "---------------- " _CYAN_("CBOR") " ------------------"); } res = FIDO2MakeCredential(data, datalen, buf, sizeof(buf), &len, &sw); @@ -728,20 +745,20 @@ static int CmdHFFido2MakeCredential(const char *cmd) { if (sw != 0x9000) { PrintAndLogEx(ERR, "ERROR execute make credential command. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); - return 3; + return PM3_EFILE; } if (buf[0]) { PrintAndLogEx(ERR, "FIDO2 make credential error: %d - %s", buf[0], fido2GetCmdErrorDescription(buf[0])); - return 0; + return PM3_SUCCESS; } PrintAndLogEx(SUCCESS, "MakeCredential result (%zu b) OK.", len); if (showCBOR) { PrintAndLogEx(SUCCESS, "CBOR make credential response:"); - PrintAndLogEx(NORMAL, "---------------- CBOR ------------------"); + PrintAndLogEx(INFO, "---------------- " _CYAN_("CBOR") " ------------------"); TinyCborPrintFIDOPackage(fido2CmdMakeCredential, true, &buf[1], len - 1); - PrintAndLogEx(NORMAL, "---------------- CBOR ------------------"); + PrintAndLogEx(INFO, "---------------- " _CYAN_("CBOR") " ------------------"); } // parse returned cbor @@ -751,21 +768,21 @@ static int CmdHFFido2MakeCredential(const char *cmd) { res = json_dump_file(root, fname, JSON_INDENT(2)); if (res) { PrintAndLogEx(ERR, "ERROR: can't save the file: %s", fname); - return 200; + return PM3_EFILE; } PrintAndLogEx(SUCCESS, "File " _YELLOW_("`%s`") " saved.", fname); } json_decref(root); - return 0; -}; + return PM3_SUCCESS; +} static int CmdHFFido2GetAssertion(const char *cmd) { json_error_t error; - json_t *root = NULL; - char fname[300] = {0}; + char fname[FILE_PATH_SIZE] = {0}; - CLIParserInit("hf fido assert", + CLIParserContext *ctx; + CLIParserInit(&ctx, "hf fido assert", "Execute a FIDO2 Get Assertion command. Needs json file with parameters. Sample file " _YELLOW_("`fido2.json`") " in `resources/`.", "Usage:\n\thf fido assert -> execute command with default parameters file `fido2.json`\n" "\thf fido assert test.json -l -> execute command with parameters file `text.json` and add to request CredentialId"); @@ -779,38 +796,38 @@ static int CmdHFFido2GetAssertion(const char *cmd) { arg_str0(NULL, NULL, "", "JSON input / output file name for parameters. Default `fido2.json`"), arg_param_end }; - CLIExecWithReturn(cmd, argtable, true); + CLIExecWithReturn(ctx, cmd, argtable, true); - bool APDULogging = arg_get_lit(1); - bool verbose = arg_get_lit(2); - bool verbose2 = arg_get_lit(2) > 1; - bool showCBOR = arg_get_lit(3); - bool createAllowList = arg_get_lit(4); + bool APDULogging = arg_get_lit(ctx, 1); + bool verbose = arg_get_lit(ctx, 2); + bool verbose2 = arg_get_lit(ctx, 2) > 1; + bool showCBOR = arg_get_lit(ctx, 3); + bool createAllowList = arg_get_lit(ctx, 4); - uint8_t jsonname[250] = {0}; + uint8_t jsonname[FILE_PATH_SIZE] = {0}; char *cjsonname = (char *)jsonname; int jsonnamelen = 0; - CLIGetStrWithReturn(5, jsonname, &jsonnamelen); + CLIGetStrWithReturn(ctx, 5, jsonname, &jsonnamelen); if (!jsonnamelen) { strcat(cjsonname, "fido2"); jsonnamelen = strlen(cjsonname); } - CLIParserFree(); + CLIParserFree(ctx); SetAPDULogging(APDULogging); int res = GetExistsFileNameJson("fido", cjsonname, fname); - if (res) { + if (res != PM3_SUCCESS) { PrintAndLogEx(ERR, "ERROR: Can't found the json file."); return res; } PrintAndLogEx(NORMAL, "fname: %s\n", fname); - root = json_load_file(fname, 0, &error); + json_t *root = json_load_file(fname, 0, &error); if (!root) { PrintAndLogEx(ERR, "ERROR: json error on line %d: %s", error.line, error.text); - return 1; + return PM3_EFILE; } uint8_t data[2048] = {0}; @@ -821,9 +838,8 @@ static int CmdHFFido2GetAssertion(const char *cmd) { DropField(); res = FIDOSelect(true, true, buf, sizeof(buf), &len, &sw); - if (res) { - PrintAndLogEx(ERR, "Can't select authenticator. res=%x. Exit...", res); + PrintAndLogEx(ERR, "Can't select authenticator. res=%x. exiting...", res); DropField(); return res; } @@ -831,7 +847,7 @@ static int CmdHFFido2GetAssertion(const char *cmd) { if (sw != 0x9000) { PrintAndLogEx(ERR, "Can't select FIDO application. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); DropField(); - return 2; + return PM3_ESOFT; } res = FIDO2CreateGetAssertionReq(root, data, sizeof(data), &datalen, createAllowList); @@ -840,9 +856,9 @@ static int CmdHFFido2GetAssertion(const char *cmd) { if (showCBOR) { PrintAndLogEx(SUCCESS, "CBOR get assertion request:"); - PrintAndLogEx(NORMAL, "---------------- CBOR ------------------"); + PrintAndLogEx(NORMAL, "---------------- " _CYAN_("CBOR") " ------------------"); TinyCborPrintFIDOPackage(fido2CmdGetAssertion, false, data, datalen); - PrintAndLogEx(NORMAL, "---------------- CBOR ------------------"); + PrintAndLogEx(NORMAL, "---------------- " _CYAN_("CBOR") " ------------------"); } res = FIDO2GetAssertion(data, datalen, buf, sizeof(buf), &len, &sw); @@ -854,20 +870,20 @@ static int CmdHFFido2GetAssertion(const char *cmd) { if (sw != 0x9000) { PrintAndLogEx(ERR, "ERROR execute get assertion command. APDU response status: %04x - %s", sw, GetAPDUCodeDescription(sw >> 8, sw & 0xff)); - return 3; + return PM3_ESOFT; } if (buf[0]) { PrintAndLogEx(ERR, "FIDO2 get assertion error: %d - %s", buf[0], fido2GetCmdErrorDescription(buf[0])); - return 0; + return PM3_ESOFT; } PrintAndLogEx(SUCCESS, "GetAssertion result (%zu b) OK.", len); if (showCBOR) { PrintAndLogEx(SUCCESS, "CBOR get assertion response:"); - PrintAndLogEx(NORMAL, "---------------- CBOR ------------------"); + PrintAndLogEx(NORMAL, "---------------- " _CYAN_("CBOR") " ------------------"); TinyCborPrintFIDOPackage(fido2CmdGetAssertion, true, &buf[1], len - 1); - PrintAndLogEx(NORMAL, "---------------- CBOR ------------------"); + PrintAndLogEx(NORMAL, "---------------- " _CYAN_("CBOR") " ------------------"); } // parse returned cbor @@ -877,32 +893,32 @@ static int CmdHFFido2GetAssertion(const char *cmd) { res = json_dump_file(root, fname, JSON_INDENT(2)); if (res) { PrintAndLogEx(ERR, "ERROR: can't save the file: %s", fname); - return 200; + return PM3_EFILE; } PrintAndLogEx(SUCCESS, "File " _YELLOW_("`%s`") " saved.", fname); } json_decref(root); - return 0; -}; + return PM3_SUCCESS; +} static command_t CommandTable[] = { - {"help", CmdHelp, AlwaysAvailable, "This help."}, - {"info", CmdHFFidoInfo, IfPm3Iso14443a, "Info about FIDO tag."}, - {"reg", CmdHFFidoRegister, IfPm3Iso14443a, "FIDO U2F Registration Message."}, - {"auth", CmdHFFidoAuthenticate, IfPm3Iso14443a, "FIDO U2F Authentication Message."}, - {"make", CmdHFFido2MakeCredential, IfPm3Iso14443a, "FIDO2 MakeCredential command."}, - {"assert", CmdHFFido2GetAssertion, IfPm3Iso14443a, "FIDO2 GetAssertion command."}, - {NULL, NULL, 0, NULL} + {"help", CmdHelp, AlwaysAvailable, "This help."}, + {"info", CmdHFFidoInfo, IfPm3Iso14443a, "Info about FIDO tag."}, + {"reg", CmdHFFidoRegister, IfPm3Iso14443a, "FIDO U2F Registration Message."}, + {"auth", CmdHFFidoAuthenticate, IfPm3Iso14443a, "FIDO U2F Authentication Message."}, + {"make", CmdHFFido2MakeCredential, IfPm3Iso14443a, "FIDO2 MakeCredential command."}, + {"assert", CmdHFFido2GetAssertion, IfPm3Iso14443a, "FIDO2 GetAssertion command."}, + {NULL, NULL, 0, NULL} }; int CmdHFFido(const char *Cmd) { - (void)WaitForResponseTimeout(CMD_ACK, NULL, 100); + clearCommandBuffer(); return CmdsParse(CommandTable, Cmd); } int CmdHelp(const char *Cmd) { (void)Cmd; // Cmd is not used so far CmdsHelp(CommandTable); - return 0; + return PM3_SUCCESS; } diff --git a/client/src/cmdhficlass.c b/client/src/cmdhficlass.c index c687e316d..4527d2dd5 100644 --- a/client/src/cmdhficlass.c +++ b/client/src/cmdhficlass.c @@ -2,6 +2,7 @@ // Copyright (C) 2010 iZsh , Hagen Fritsch // Copyright (C) 2011 Gerhard de Koning Gans // Copyright (C) 2014 Midnitesnake & Andy Davies & Martin Holst Swende +// Copyright (C) 2019 piwi // Copyright (C) 2020 Iceman // // This code is licensed to you under the terms of the GNU GPL, version 2 or, @@ -13,12 +14,13 @@ #include "cmdhficlass.h" #include +#include "cliparser.h" #include "cmdparser.h" // command_t #include "commonutil.h" // ARRAYLEN #include "cmdtrace.h" #include "util_posix.h" #include "comms.h" -#include "mbedtls/des.h" +#include "des.h" #include "loclass/cipherutils.h" #include "loclass/cipher.h" #include "loclass/ikeys.h" @@ -33,6 +35,7 @@ #define ICLASS_KEYS_MAX 8 #define ICLASS_AUTH_RETRY 10 #define ICLASS_DECRYPTION_BIN "iclass_decryptionkey.bin" +static uint8_t empty[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; static int CmdHelp(const char *Cmd); @@ -48,8 +51,8 @@ static uint8_t iClass_Key_Table[ICLASS_KEYS_MAX][8] = { }; static int usage_hf_iclass_sim(void) { - PrintAndLogEx(NORMAL, "Simulate a iclass legacy/standard tag\n"); - PrintAndLogEx(NORMAL, "Usage: hf iclass sim [h]