phpqrcode/0000755000175000017500000000000011453417106012071 5ustar thijsthijsphpqrcode/bindings/0000755000175000017500000000000011453417102013662 5ustar thijsthijsphpqrcode/bindings/tcpdf/0000755000175000017500000000000011453417102014762 5ustar thijsthijsphpqrcode/bindings/tcpdf/qrcode.php0000644000175000017500000024201011432665114016754 0ustar thijsthijs // http://phpqrcode.sourceforge.net/ // https://sourceforge.net/projects/phpqrcode/ // // The "PHP QR Code encoder" is based on // "C libqrencode library" (ver. 3.1.1) // License: GNU-LGPL 2.1 // Copyright (C) 2006-2010 by Kentaro Fukuchi // http://megaui.net/fukuchi/works/qrencode/index.en.html // // Reed-Solomon code encoder is written by Phil Karn, KA9Q. // Copyright (C) 2002-2006 Phil Karn, KA9Q // // QR Code is registered trademark of DENSO WAVE INCORPORATED // http://www.denso-wave.com/qrcode/index-e.html // --------------------------------------------------------- // // Author: Nicola Asuni // // (c) Copyright 2010: // Nicola Asuni // Tecnick.com S.r.l. // Via della Pace, 11 // 09044 Quartucciu (CA) // ITALY // www.tecnick.com // info@tecnick.com //============================================================+ /** * Class to create QR-code arrays for TCPDF class. * QR Code symbol is a 2D barcode that can be scanned by handy terminals such as a mobile phone with CCD. * The capacity of QR Code is up to 7000 digits or 4000 characters, and has high robustness. * This class supports QR Code model 2, described in JIS (Japanese Industrial Standards) X0510:2004 or ISO/IEC 18004. * Currently the following features are not supported: ECI and FNC1 mode, Micro QR Code, QR Code model 1, Structured mode. * * This class is derived from "PHP QR Code encoder" by Dominik Dzienia (http://phpqrcode.sourceforge.net/) based on "libqrencode C library 3.1.1." by Kentaro Fukuchi (http://megaui.net/fukuchi/works/qrencode/index.en.html), contains Reed-Solomon code written by Phil Karn, KA9Q. QR Code is registered trademark of DENSO WAVE INCORPORATED (http://www.denso-wave.com/qrcode/index-e.html). * Please read comments on this class source file for full copyright and license information. * * @package com.tecnick.tcpdf * @abstract Class for generating QR-code array for TCPDF. * @author Nicola Asuni * @copyright 2010 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com * @link http://www.tcpdf.org * @license http://www.gnu.org/copyleft/lesser.html LGPL * @version 1.0.002 */ // definitions if (!defined('QRCODEDEFS')) { /** * Indicate that definitions for this class are set */ define('QRCODEDEFS', true); // ----------------------------------------------------- // Encoding modes (characters which can be encoded in QRcode) /** * Encoding mode */ define('QR_MODE_NL', -1); /** * Encoding mode numeric (0-9). 3 characters are encoded to 10bit length. In theory, 7089 characters or less can be stored in a QRcode. */ define('QR_MODE_NM', 0); /** * Encoding mode alphanumeric (0-9A-Z $%*+-./:) 45characters. 2 characters are encoded to 11bit length. In theory, 4296 characters or less can be stored in a QRcode. */ define('QR_MODE_AN', 1); /** * Encoding mode 8bit byte data. In theory, 2953 characters or less can be stored in a QRcode. */ define('QR_MODE_8B', 2); /** * Encoding mode KANJI. A KANJI character (multibyte character) is encoded to 13bit length. In theory, 1817 characters or less can be stored in a QRcode. */ define('QR_MODE_KJ', 3); /** * Encoding mode STRUCTURED (currently unsupported) */ define('QR_MODE_ST', 4); // ----------------------------------------------------- // Levels of error correction. // QRcode has a function of an error correcting for miss reading that white is black. // Error correcting is defined in 4 level as below. /** * Error correction level L : About 7% or less errors can be corrected. */ define('QR_ECLEVEL_L', 0); /** * Error correction level M : About 15% or less errors can be corrected. */ define('QR_ECLEVEL_M', 1); /** * Error correction level Q : About 25% or less errors can be corrected. */ define('QR_ECLEVEL_Q', 2); /** * Error correction level H : About 30% or less errors can be corrected. */ define('QR_ECLEVEL_H', 3); // ----------------------------------------------------- // Version. Size of QRcode is defined as version. // Version is from 1 to 40. // Version 1 is 21*21 matrix. And 4 modules increases whenever 1 version increases. // So version 40 is 177*177 matrix. /** * Maximum QR Code version. */ define('QRSPEC_VERSION_MAX', 40); /** * Maximum matrix size for maximum version (version 40 is 177*177 matrix). */ define('QRSPEC_WIDTH_MAX', 177); // ----------------------------------------------------- /** * Matrix index to get width from $capacity array. */ define('QRCAP_WIDTH', 0); /** * Matrix index to get number of words from $capacity array. */ define('QRCAP_WORDS', 1); /** * Matrix index to get remainder from $capacity array. */ define('QRCAP_REMINDER', 2); /** * Matrix index to get error correction level from $capacity array. */ define('QRCAP_EC', 3); // ----------------------------------------------------- // Structure (currently usupported) /** * Number of header bits for structured mode */ define('STRUCTURE_HEADER_BITS', 20); /** * Max number of symbols for structured mode */ define('MAX_STRUCTURED_SYMBOLS', 16); // ----------------------------------------------------- // Masks /** * Down point base value for case 1 mask pattern (concatenation of same color in a line or a column) */ define('N1', 3); /** * Down point base value for case 2 mask pattern (module block of same color) */ define('N2', 3); /** * Down point base value for case 3 mask pattern (1:1:3:1:1(dark:bright:dark:bright:dark)pattern in a line or a column) */ define('N3', 40); /** * Down point base value for case 4 mask pattern (ration of dark modules in whole) */ define('N4', 10); // ----------------------------------------------------- // Optimization settings /** * if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code */ define('QR_FIND_BEST_MASK', true); /** * if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly */ define('QR_FIND_FROM_RANDOM', 2); /** * when QR_FIND_BEST_MASK === false */ define('QR_DEFAULT_MASK', 2); // ----------------------------------------------------- } // end of definitions // #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*# if (!class_exists('QRcode', false)) { // for compaibility with PHP4 if (!function_exists('str_split')) { /** * Convert a string to an array (needed for PHP4 compatibility) * @param string $string The input string. * @param int $split_length Maximum length of the chunk. * @return If the optional split_length parameter is specified, the returned array will be broken down into chunks with each being split_length in length, otherwise each chunk will be one character in length. FALSE is returned if split_length is less than 1. If the split_length length exceeds the length of string , the entire string is returned as the first (and only) array element. */ function str_split($string, $split_length=1) { if ((strlen($string) > $split_length) OR (!$split_length)) { do { $c = strlen($string); $parts[] = substr($string, 0, $split_length); $string = substr($string, $split_length); } while ($string !== false); } else { $parts = array($string); } return $parts; } } // ##################################################### /** * Class to create QR-code arrays for TCPDF class. * QR Code symbol is a 2D barcode that can be scanned by handy terminals such as a mobile phone with CCD. * The capacity of QR Code is up to 7000 digits or 4000 characters, and has high robustness. * This class supports QR Code model 2, described in JIS (Japanese Industrial Standards) X0510:2004 or ISO/IEC 18004. * Currently the following features are not supported: ECI and FNC1 mode, Micro QR Code, QR Code model 1, Structured mode. * * This class is derived from "PHP QR Code encoder" by Dominik Dzienia (http://phpqrcode.sourceforge.net/) based on "libqrencode C library 3.1.1." by Kentaro Fukuchi (http://megaui.net/fukuchi/works/qrencode/index.en.html), contains Reed-Solomon code written by Phil Karn, KA9Q. QR Code is registered trademark of DENSO WAVE INCORPORATED (http://www.denso-wave.com/qrcode/index-e.html). * Please read comments on this class source file for full copyright and license information. * * @name QRcode * @package com.tecnick.tcpdf * @abstract Class for generating QR-code array for TCPDF. * @author Nicola Asuni * @copyright 2010 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com * @link http://www.tcpdf.org * @license http://www.gnu.org/copyleft/lesser.html LGPL * @version 1.0.002 */ class QRcode { /** * @var barcode array to be returned which is readable by TCPDF * @access protected */ protected $barcode_array = array(); /** * @var QR code version. Size of QRcode is defined as version. Version is from 1 to 40. Version 1 is 21*21 matrix. And 4 modules increases whenever 1 version increases. So version 40 is 177*177 matrix. * @access protected */ protected $version = 0; /** * @var Levels of error correction. See definitions for possible values. * @access protected */ protected $level = QR_ECLEVEL_L; /** * @var Encoding mode * @access protected */ protected $hint = QR_MODE_8B; /** * @var if true the input string will be converted to uppercase * @access protected */ protected $casesensitive = true; /** * @var structured QR code (not supported yet) * @access protected */ protected $structured = 0; /** * @var mask data * @access protected */ protected $data; // FrameFiller /** * @var width * @access protected */ protected $width; /** * @var frame * @access protected */ protected $frame; /** * @var X position of bit * @access protected */ protected $x; /** * @var Y position of bit * @access protected */ protected $y; /** * @var direction * @access protected */ protected $dir; /** * @var single bit * @access protected */ protected $bit; // ---- QRrawcode ---- /** * @var data code * @access protected */ protected $datacode = array(); /** * @var error correction code * @access protected */ protected $ecccode = array(); /** * @var blocks * @access protected */ protected $blocks; /** * @var Reed-Solomon blocks * @access protected */ protected $rsblocks = array(); //of RSblock /** * @var counter * @access protected */ protected $count; /** * @var data length * @access protected */ protected $dataLength; /** * @var error correction length * @access protected */ protected $eccLength; /** * @var b1 * @access protected */ protected $b1; // ---- QRmask ---- /** * @var run length * @access protected */ protected $runLength = array(); // ---- QRsplit ---- /** * @var input data string * @access protected */ protected $dataStr = ''; /** * @var input items * @access protected */ protected $items; // Reed-Solomon items /** * @var Reed-Solomon items * @access protected */ protected $rsitems = array(); /** * @var array of frames * @access protected */ protected $frames = array(); /** * @var alphabet-numeric convesion table * @access protected */ protected $anTable = array( -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, // -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, // 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, // -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 // ); /** * @var array Table of the capacity of symbols * See Table 1 (pp.13) and Table 12-16 (pp.30-36), JIS X0510:2004. * @access protected */ protected $capacity = array( array( 0, 0, 0, array( 0, 0, 0, 0)), // array( 21, 26, 0, array( 7, 10, 13, 17)), // 1 array( 25, 44, 7, array( 10, 16, 22, 28)), // array( 29, 70, 7, array( 15, 26, 36, 44)), // array( 33, 100, 7, array( 20, 36, 52, 64)), // array( 37, 134, 7, array( 26, 48, 72, 88)), // 5 array( 41, 172, 7, array( 36, 64, 96, 112)), // array( 45, 196, 0, array( 40, 72, 108, 130)), // array( 49, 242, 0, array( 48, 88, 132, 156)), // array( 53, 292, 0, array( 60, 110, 160, 192)), // array( 57, 346, 0, array( 72, 130, 192, 224)), // 10 array( 61, 404, 0, array( 80, 150, 224, 264)), // array( 65, 466, 0, array( 96, 176, 260, 308)), // array( 69, 532, 0, array( 104, 198, 288, 352)), // array( 73, 581, 3, array( 120, 216, 320, 384)), // array( 77, 655, 3, array( 132, 240, 360, 432)), // 15 array( 81, 733, 3, array( 144, 280, 408, 480)), // array( 85, 815, 3, array( 168, 308, 448, 532)), // array( 89, 901, 3, array( 180, 338, 504, 588)), // array( 93, 991, 3, array( 196, 364, 546, 650)), // array( 97, 1085, 3, array( 224, 416, 600, 700)), // 20 array(101, 1156, 4, array( 224, 442, 644, 750)), // array(105, 1258, 4, array( 252, 476, 690, 816)), // array(109, 1364, 4, array( 270, 504, 750, 900)), // array(113, 1474, 4, array( 300, 560, 810, 960)), // array(117, 1588, 4, array( 312, 588, 870, 1050)), // 25 array(121, 1706, 4, array( 336, 644, 952, 1110)), // array(125, 1828, 4, array( 360, 700, 1020, 1200)), // array(129, 1921, 3, array( 390, 728, 1050, 1260)), // array(133, 2051, 3, array( 420, 784, 1140, 1350)), // array(137, 2185, 3, array( 450, 812, 1200, 1440)), // 30 array(141, 2323, 3, array( 480, 868, 1290, 1530)), // array(145, 2465, 3, array( 510, 924, 1350, 1620)), // array(149, 2611, 3, array( 540, 980, 1440, 1710)), // array(153, 2761, 3, array( 570, 1036, 1530, 1800)), // array(157, 2876, 0, array( 570, 1064, 1590, 1890)), // 35 array(161, 3034, 0, array( 600, 1120, 1680, 1980)), // array(165, 3196, 0, array( 630, 1204, 1770, 2100)), // array(169, 3362, 0, array( 660, 1260, 1860, 2220)), // array(173, 3532, 0, array( 720, 1316, 1950, 2310)), // array(177, 3706, 0, array( 750, 1372, 2040, 2430)) // 40 ); /** * @var array Length indicator * @access protected */ protected $lengthTableBits = array( array(10, 12, 14), array( 9, 11, 13), array( 8, 16, 16), array( 8, 10, 12) ); /** * @var array Table of the error correction code (Reed-Solomon block) * See Table 12-16 (pp.30-36), JIS X0510:2004. * @access protected */ protected $eccTable = array( array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)), // array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1 array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)), // array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)), // array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5 array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)), // array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)), // array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)), // array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)), // array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), // 10 array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)), // array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)), // array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)), // array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)), // array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), // 15 array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)), // array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)), // array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)), // array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)), // array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), // 20 array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)), // array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)), // array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)), // array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)), // array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), // 25 array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)), // array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)), // array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)), // array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)), // array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), // 30 array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)), // array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)), // array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)), // array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)), // array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), // 35 array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)), // array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)), // array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)), // array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)), // array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)) // 40 ); /** * @var array Positions of alignment patterns. * This array includes only the second and the third position of the alignment patterns. Rest of them can be calculated from the distance between them. * See Table 1 in Appendix E (pp.71) of JIS X0510:2004. * @access protected */ protected $alignmentPattern = array( array( 0, 0), array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5 array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10 array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), // 11-15 array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), // 16-20 array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), // 21-25 array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), // 26-30 array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), // 31-35 array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58) // 35-40 ); /** * @var array Version information pattern (BCH coded). * See Table 1 in Appendix D (pp.68) of JIS X0510:2004. * size: [QRSPEC_VERSION_MAX - 6] * @access protected */ protected $versionPattern = array( 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, // 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, // 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, // 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64, // 0x27541, 0x28c69 ); /** * @var array Format information * @access protected */ protected $formatInfo = array( array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976), // array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0), // array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed), // array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b) // ); // ------------------------------------------------- // ------------------------------------------------- /** * This is the class constructor. * Creates a QRcode object * @param string $code code to represent using QRcode * @param string $eclevel error level: * @access public * @since 1.0.000 */ public function __construct($code, $eclevel = 'L') { $barcode_array = array(); if ((is_null($code)) OR ($code == '\0') OR ($code == '')) { return false; } // set error correction level $this->level = array_search($eclevel, array('L', 'M', 'Q', 'H')); if ($this->level === false) { $this->level = QR_ECLEVEL_L; } if (($this->hint != QR_MODE_8B) AND ($this->hint != QR_MODE_KJ)) { return false; } if (($this->version < 0) OR ($this->version > QRSPEC_VERSION_MAX)) { return false; } $this->items = array(); $this->encodeString($code); $qrTab = $this->binarize($this->data); $size = count($qrTab); $barcode_array['num_rows'] = $size; $barcode_array['num_cols'] = $size; $barcode_array['bcode'] = array(); foreach ($qrTab as $line) { $arrAdd = array(); foreach (str_split($line) as $char) { $arrAdd[] = ($char=='1')?1:0; } $barcode_array['bcode'][] = $arrAdd; } $this->barcode_array = $barcode_array; } /** * Returns a barcode array which is readable by TCPDF * @return array barcode array readable by TCPDF; * @access public */ public function getBarcodeArray() { return $this->barcode_array; } /** * Convert the frame in binary form * @param array $frame array to binarize * @return array frame in binary form */ protected function binarize($frame) { $len = count($frame); // the frame is square (width = height) foreach ($frame as &$frameLine) { for ($i=0; $i<$len; $i++) { $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0'; } } return $frame; } /** * Encode the input string to QR code * @param string $string input string to encode */ protected function encodeString($string) { $this->dataStr = $string; if (!$this->casesensitive) { $this->toUpper(); } $ret = $this->splitString(); if ($ret < 0) { return NULL; } $this->encodeMask(-1); } /** * Encode mask * @param int $mask masking mode */ protected function encodeMask($mask) { $spec = array(0, 0, 0, 0, 0); $this->datacode = $this->getByteStream($this->items); if (is_null($this->datacode)) { return NULL; } $spec = $this->getEccSpec($this->version, $this->level, $spec); $this->b1 = $this->rsBlockNum1($spec); $this->dataLength = $this->rsDataLength($spec); $this->eccLength = $this->rsEccLength($spec); $this->ecccode = array_fill(0, $this->eccLength, 0); $this->blocks = $this->rsBlockNum($spec); $ret = $this->init($spec); if ($ret < 0) { return NULL; } $this->count = 0; $this->width = $this->getWidth($this->version); $this->frame = $this->newFrame($this->version); $this->x = $this->width - 1; $this->y = $this->width - 1; $this->dir = -1; $this->bit = -1; // inteleaved data and ecc codes for ($i=0; $i < ($this->dataLength + $this->eccLength); $i++) { $code = $this->getCode(); $bit = 0x80; for ($j=0; $j<8; $j++) { $addr = $this->getNextPosition(); $this->setFrameAt($addr, 0x02 | (($bit & $code) != 0)); $bit = $bit >> 1; } } // remainder bits $j = $this->getRemainder($this->version); for ($i=0; $i<$j; $i++) { $addr = $this->getNextPosition(); $this->setFrameAt($addr, 0x02); } // masking $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0); if ($mask < 0) { if (QR_FIND_BEST_MASK) { $masked = $this->mask($this->width, $this->frame, $this->level); } else { $masked = $this->makeMask($this->width, $this->frame, (intval(QR_DEFAULT_MASK) % 8), $this->level); } } else { $masked = $this->makeMask($this->width, $this->frame, $mask, $this->level); } if ($masked == NULL) { return NULL; } $this->data = $masked; } // - - - - - - - - - - - - - - - - - - - - - - - - - // FrameFiller /** * Set frame value at specified position * @param array $at x,y position * @param int $val value of the character to set */ protected function setFrameAt($at, $val) { $this->frame[$at['y']][$at['x']] = chr($val); } /** * Get frame value at specified position * @param array $at x,y position * @return value at specified position */ protected function getFrameAt($at) { return ord($this->frame[$at['y']][$at['x']]); } /** * Return the next frame position * @return array of x,y coordinates */ protected function getNextPosition() { do { if ($this->bit == -1) { $this->bit = 0; return array('x'=>$this->x, 'y'=>$this->y); } $x = $this->x; $y = $this->y; $w = $this->width; if ($this->bit == 0) { $x--; $this->bit++; } else { $x++; $y += $this->dir; $this->bit--; } if ($this->dir < 0) { if ($y < 0) { $y = 0; $x -= 2; $this->dir = 1; if ($x == 6) { $x--; $y = 9; } } } else { if ($y == $w) { $y = $w - 1; $x -= 2; $this->dir = -1; if ($x == 6) { $x--; $y -= 8; } } } if (($x < 0) OR ($y < 0)) { return NULL; } $this->x = $x; $this->y = $y; } while(ord($this->frame[$y][$x]) & 0x80); return array('x'=>$x, 'y'=>$y); } // - - - - - - - - - - - - - - - - - - - - - - - - - // QRrawcode /** * Initialize code. * @param array $spec array of ECC specification * @return 0 in case of success, -1 in case of error */ protected function init($spec) { $dl = $this->rsDataCodes1($spec); $el = $this->rsEccCodes1($spec); $rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); $blockNo = 0; $dataPos = 0; $eccPos = 0; $endfor = $this->rsBlockNum1($spec); for ($i=0; $i < $endfor; ++$i) { $ecc = array_slice($this->ecccode, $eccPos); $this->rsblocks[$blockNo] = array(); $this->rsblocks[$blockNo]['dataLength'] = $dl; $this->rsblocks[$blockNo]['data'] = array_slice($this->datacode, $dataPos); $this->rsblocks[$blockNo]['eccLength'] = $el; $ecc = $this->encode_rs_char($rs, $this->rsblocks[$blockNo]['data'], $ecc); $this->rsblocks[$blockNo]['ecc'] = $ecc; $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); $dataPos += $dl; $eccPos += $el; $blockNo++; } if ($this->rsBlockNum2($spec) == 0) { return 0; } $dl = $this->rsDataCodes2($spec); $el = $this->rsEccCodes2($spec); $rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); if ($rs == NULL) { return -1; } $endfor = $this->rsBlockNum2($spec); for ($i=0; $i < $endfor; ++$i) { $ecc = array_slice($this->ecccode, $eccPos); $this->rsblocks[$blockNo] = array(); $this->rsblocks[$blockNo]['dataLength'] = $dl; $this->rsblocks[$blockNo]['data'] = array_slice($this->datacode, $dataPos); $this->rsblocks[$blockNo]['eccLength'] = $el; $ecc = $this->encode_rs_char($rs, $this->rsblocks[$blockNo]['data'], $ecc); $this->rsblocks[$blockNo]['ecc'] = $ecc; $this->ecccode = array_merge(array_slice($this->ecccode, 0, $eccPos), $ecc); $dataPos += $dl; $eccPos += $el; $blockNo++; } return 0; } /** * Return Reed-Solomon block code. * @return array rsblocks */ protected function getCode() { if ($this->count < $this->dataLength) { $row = $this->count % $this->blocks; $col = $this->count / $this->blocks; if ($col >= $this->rsblocks[0]['dataLength']) { $row += $this->b1; } $ret = $this->rsblocks[$row]['data'][$col]; } elseif ($this->count < $this->dataLength + $this->eccLength) { $row = ($this->count - $this->dataLength) % $this->blocks; $col = ($this->count - $this->dataLength) / $this->blocks; $ret = $this->rsblocks[$row]['ecc'][$col]; } else { return 0; } $this->count++; return $ret; } // - - - - - - - - - - - - - - - - - - - - - - - - - // QRmask /** * Write Format Information on frame and returns the number of black bits * @param int $width frame width * @param array $frame frame * @param array $mask masking mode * @param int $level error correction level * @return int blacks */ protected function writeFormatInformation($width, &$frame, $mask, $level) { $blacks = 0; $format = $this->getFormatInfo($mask, $level); for ($i=0; $i<8; ++$i) { if ($format & 1) { $blacks += 2; $v = 0x85; } else { $v = 0x84; } $frame[8][$width - 1 - $i] = chr($v); if ($i < 6) { $frame[$i][8] = chr($v); } else { $frame[$i + 1][8] = chr($v); } $format = $format >> 1; } for ($i=0; $i<7; ++$i) { if ($format & 1) { $blacks += 2; $v = 0x85; } else { $v = 0x84; } $frame[$width - 7 + $i][8] = chr($v); if ($i == 0) { $frame[8][7] = chr($v); } else { $frame[8][6 - $i] = chr($v); } $format = $format >> 1; } return $blacks; } /** * mask0 * @param int $x X position * @param int $y Y position * @return int mask */ protected function mask0($x, $y) { return ($x + $y) & 1; } /** * mask1 * @param int $x X position * @param int $y Y position * @return int mask */ protected function mask1($x, $y) { return ($y & 1); } /** * mask2 * @param int $x X position * @param int $y Y position * @return int mask */ protected function mask2($x, $y) { return ($x % 3); } /** * mask3 * @param int $x X position * @param int $y Y position * @return int mask */ protected function mask3($x, $y) { return ($x + $y) % 3; } /** * mask4 * @param int $x X position * @param int $y Y position * @return int mask */ protected function mask4($x, $y) { return (((int)($y / 2)) + ((int)($x / 3))) & 1; } /** * mask5 * @param int $x X position * @param int $y Y position * @return int mask */ protected function mask5($x, $y) { return (($x * $y) & 1) + ($x * $y) % 3; } /** * mask6 * @param int $x X position * @param int $y Y position * @return int mask */ protected function mask6($x, $y) { return ((($x * $y) & 1) + ($x * $y) % 3) & 1; } /** * mask7 * @param int $x X position * @param int $y Y position * @return int mask */ protected function mask7($x, $y) { return ((($x * $y) % 3) + (($x + $y) & 1)) & 1; } /** * Return bitmask * @param int $maskNo mask number * @param int $width width * @param array $frame frame * @return array bitmask */ protected function generateMaskNo($maskNo, $width, $frame) { $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); for ($y=0; $y<$width; ++$y) { for ($x=0; $x<$width; ++$x) { if (ord($frame[$y][$x]) & 0x80) { $bitMask[$y][$x] = 0; } else { $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y); $bitMask[$y][$x] = ($maskFunc == 0)?1:0; } } } return $bitMask; } /** * makeMaskNo * @param int $maskNo * @param int $width * @param int $s * @param int $d * @param boolean $maskGenOnly * @return int b */ protected function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly=false) { $b = 0; $bitMask = array(); $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); if ($maskGenOnly) { return; } $d = $s; for ($y=0; $y<$width; ++$y) { for ($x=0; $x<$width; ++$x) { if ($bitMask[$y][$x] == 1) { $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]); } $b += (int)(ord($d[$y][$x]) & 1); } } return $b; } /** * makeMask * @param int $width * @param array $frame * @param int $maskNo * @param int $level * @return array mask */ protected function makeMask($width, $frame, $maskNo, $level) { $masked = array_fill(0, $width, str_repeat("\0", $width)); $this->makeMaskNo($maskNo, $width, $frame, $masked); $this->writeFormatInformation($width, $masked, $maskNo, $level); return $masked; } /** * calcN1N3 * @param int $length * @return int demerit */ protected function calcN1N3($length) { $demerit = 0; for ($i=0; $i<$length; ++$i) { if ($this->runLength[$i] >= 5) { $demerit += (N1 + ($this->runLength[$i] - 5)); } if ($i & 1) { if (($i >= 3) AND ($i < ($length-2)) AND ($this->runLength[$i] % 3 == 0)) { $fact = (int)($this->runLength[$i] / 3); if (($this->runLength[$i-2] == $fact) AND ($this->runLength[$i-1] == $fact) AND ($this->runLength[$i+1] == $fact) AND ($this->runLength[$i+2] == $fact)) { if (($this->runLength[$i-3] < 0) OR ($this->runLength[$i-3] >= (4 * $fact))) { $demerit += N3; } elseif ((($i+3) >= $length) OR ($this->runLength[$i+3] >= (4 * $fact))) { $demerit += N3; } } } } } return $demerit; } /** * evaluateSymbol * @param int $width * @param array $frame * @return int demerit */ protected function evaluateSymbol($width, $frame) { $head = 0; $demerit = 0; for ($y=0; $y<$width; ++$y) { $head = 0; $this->runLength[0] = 1; $frameY = $frame[$y]; if ($y > 0) { $frameYM = $frame[$y-1]; } for ($x=0; $x<$width; ++$x) { if (($x > 0) AND ($y > 0)) { $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]); $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]); if (($b22 | ($w22 ^ 1)) & 1) { $demerit += N2; } } if (($x == 0) AND (ord($frameY[$x]) & 1)) { $this->runLength[0] = -1; $head = 1; $this->runLength[$head] = 1; } elseif ($x > 0) { if ((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) { $head++; $this->runLength[$head] = 1; } else { $this->runLength[$head]++; } } } $demerit += $this->calcN1N3($head+1); } for ($x=0; $x<$width; ++$x) { $head = 0; $this->runLength[0] = 1; for ($y=0; $y<$width; ++$y) { if (($y == 0) AND (ord($frame[$y][$x]) & 1)) { $this->runLength[0] = -1; $head = 1; $this->runLength[$head] = 1; } elseif ($y > 0) { if ((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) { $head++; $this->runLength[$head] = 1; } else { $this->runLength[$head]++; } } } $demerit += $this->calcN1N3($head+1); } return $demerit; } /** * mask * @param int $width * @param array $frame * @param int $level * @return array best mask */ protected function mask($width, $frame, $level) { $minDemerit = PHP_INT_MAX; $bestMaskNum = 0; $bestMask = array(); $checked_masks = array(0, 1, 2, 3, 4, 5, 6, 7); if (QR_FIND_FROM_RANDOM !== false) { $howManuOut = 8 - (QR_FIND_FROM_RANDOM % 9); for ($i = 0; $i < $howManuOut; ++$i) { $remPos = rand (0, count($checked_masks)-1); unset($checked_masks[$remPos]); $checked_masks = array_values($checked_masks); } } $bestMask = $frame; foreach ($checked_masks as $i) { $mask = array_fill(0, $width, str_repeat("\0", $width)); $demerit = 0; $blacks = 0; $blacks = $this->makeMaskNo($i, $width, $frame, $mask); $blacks += $this->writeFormatInformation($width, $mask, $i, $level); $blacks = (int)(100 * $blacks / ($width * $width)); $demerit = (int)((int)(abs($blacks - 50) / 5) * N4); $demerit += $this->evaluateSymbol($width, $mask); if ($demerit < $minDemerit) { $minDemerit = $demerit; $bestMask = $mask; $bestMaskNum = $i; } } return $bestMask; } // - - - - - - - - - - - - - - - - - - - - - - - - - // QRsplit /** * Return true if the character at specified position is a number * @param string $str string * @param int $pos characted position * @return boolean true of false */ protected function isdigitat($str, $pos) { if ($pos >= strlen($str)) { return false; } return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9'))); } /** * Return true if the character at specified position is an alphanumeric character * @param string $str string * @param int $pos characted position * @return boolean true of false */ protected function isalnumat($str, $pos) { if ($pos >= strlen($str)) { return false; } return ($this->lookAnTable(ord($str[$pos])) >= 0); } /** * identifyMode * @param int $pos * @return int mode */ protected function identifyMode($pos) { if ($pos >= strlen($this->dataStr)) { return QR_MODE_NL; } $c = $this->dataStr[$pos]; if ($this->isdigitat($this->dataStr, $pos)) { return QR_MODE_NM; } elseif ($this->isalnumat($this->dataStr, $pos)) { return QR_MODE_AN; } elseif ($this->hint == QR_MODE_KJ) { if ($pos+1 < strlen($this->dataStr)) { $d = $this->dataStr[$pos+1]; $word = (ord($c) << 8) | ord($d); if (($word >= 0x8140 && $word <= 0x9ffc) OR ($word >= 0xe040 && $word <= 0xebbf)) { return QR_MODE_KJ; } } } return QR_MODE_8B; } /** * eatNum * @return int run */ protected function eatNum() { $ln = $this->lengthIndicator(QR_MODE_NM, $this->version); $p = 0; while($this->isdigitat($this->dataStr, $p)) { $p++; } $run = $p; $mode = $this->identifyMode($p); if ($mode == QR_MODE_8B) { $dif = $this->estimateBitsModeNum($run) + 4 + $ln + $this->estimateBitsMode8(1) // + 4 + l8 - $this->estimateBitsMode8($run + 1); // - 4 - l8 if ($dif > 0) { return $this->eat8(); } } if ($mode == QR_MODE_AN) { $dif = $this->estimateBitsModeNum($run) + 4 + $ln + $this->estimateBitsModeAn(1) // + 4 + la - $this->estimateBitsModeAn($run + 1);// - 4 - la if ($dif > 0) { return $this->eatAn(); } } $this->items = $this->appendNewInputItem($this->items, QR_MODE_NM, $run, str_split($this->dataStr)); return $run; } /** * eatAn * @return int run */ protected function eatAn() { $la = $this->lengthIndicator(QR_MODE_AN, $this->version); $ln = $this->lengthIndicator(QR_MODE_NM, $this->version); $p = 0; while($this->isalnumat($this->dataStr, $p)) { if ($this->isdigitat($this->dataStr, $p)) { $q = $p; while($this->isdigitat($this->dataStr, $q)) { $q++; } $dif = $this->estimateBitsModeAn($p) // + 4 + la + $this->estimateBitsModeNum($q - $p) + 4 + $ln - $this->estimateBitsModeAn($q); // - 4 - la if ($dif < 0) { break; } else { $p = $q; } } else { $p++; } } $run = $p; if (!$this->isalnumat($this->dataStr, $p)) { $dif = $this->estimateBitsModeAn($run) + 4 + $la + $this->estimateBitsMode8(1) // + 4 + l8 - $this->estimateBitsMode8($run + 1); // - 4 - l8 if ($dif > 0) { return $this->eat8(); } } $this->items = $this->appendNewInputItem($this->items, QR_MODE_AN, $run, str_split($this->dataStr)); return $run; } /** * eatKanji * @return int run */ protected function eatKanji() { $p = 0; while($this->identifyMode($p) == QR_MODE_KJ) { $p += 2; } $this->items = $this->appendNewInputItem($this->items, QR_MODE_KJ, $p, str_split($this->dataStr)); return $run; } /** * eat8 * @return int run */ protected function eat8() { $la = $this->lengthIndicator(QR_MODE_AN, $this->version); $ln = $this->lengthIndicator(QR_MODE_NM, $this->version); $p = 1; $dataStrLen = strlen($this->dataStr); while($p < $dataStrLen) { $mode = $this->identifyMode($p); if ($mode == QR_MODE_KJ) { break; } if ($mode == QR_MODE_NM) { $q = $p; while($this->isdigitat($this->dataStr, $q)) { $q++; } $dif = $this->estimateBitsMode8($p) // + 4 + l8 + $this->estimateBitsModeNum($q - $p) + 4 + $ln - $this->estimateBitsMode8($q); // - 4 - l8 if ($dif < 0) { break; } else { $p = $q; } } elseif ($mode == QR_MODE_AN) { $q = $p; while($this->isalnumat($this->dataStr, $q)) { $q++; } $dif = $this->estimateBitsMode8($p) // + 4 + l8 + $this->estimateBitsModeAn($q - $p) + 4 + $la - $this->estimateBitsMode8($q); // - 4 - l8 if ($dif < 0) { break; } else { $p = $q; } } else { $p++; } } $run = $p; $this->items = $this->appendNewInputItem($this->items, QR_MODE_8B, $run, str_split($this->dataStr)); return $run; } /** * splitString */ protected function splitString() { while (strlen($this->dataStr) > 0) { if ($this->dataStr == '') { return 0; } $mode = $this->identifyMode(0); switch ($mode) { case QR_MODE_NM: { $length = $this->eatNum(); break; } case QR_MODE_AN: { $length = $this->eatAn(); break; } case QR_MODE_KJ: { if ($hint == QR_MODE_KJ) { $length = $this->eatKanji(); } else { $length = $this->eat8(); } break; } default: { $length = $this->eat8(); break; } } if ($length == 0) { return 0; } if ($length < 0) { return -1; } $this->dataStr = substr($this->dataStr, $length); } } /** * toUpper */ protected function toUpper() { $stringLen = strlen($this->dataStr); $p = 0; while ($p < $stringLen) { $mode = $this->identifyMode(substr($this->dataStr, $p), $this->hint); if ($mode == QR_MODE_KJ) { $p += 2; } else { if ((ord($this->dataStr[$p]) >= ord('a')) AND (ord($this->dataStr[$p]) <= ord('z'))) { $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32); } $p++; } } return $this->dataStr; } // - - - - - - - - - - - - - - - - - - - - - - - - - // QRinputItem /** * newInputItem * @param int $mode * @param int $size * @param array $data * @param array $bstream * @return array input item */ protected function newInputItem($mode, $size, $data, $bstream=null) { $setData = array_slice($data, 0, $size); if (count($setData) < $size) { $setData = array_merge($setData, array_fill(0, ($size - count($setData)), 0)); } if (!$this->check($mode, $size, $setData)) { return NULL; } $inputitem = array(); $inputitem['mode'] = $mode; $inputitem['size'] = $size; $inputitem['data'] = $setData; $inputitem['bstream'] = $bstream; return $inputitem; } /** * encodeModeNum * @param array $inputitem * @param int $version * @return array input item */ protected function encodeModeNum($inputitem, $version) { $words = (int)($inputitem['size'] / 3); $inputitem['bstream'] = array(); $val = 0x1; $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, $val); $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_NM, $version), $inputitem['size']); for ($i=0; $i < $words; ++$i) { $val = (ord($inputitem['data'][$i*3 ]) - ord('0')) * 100; $val += (ord($inputitem['data'][$i*3+1]) - ord('0')) * 10; $val += (ord($inputitem['data'][$i*3+2]) - ord('0')); $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 10, $val); } if ($inputitem['size'] - $words * 3 == 1) { $val = ord($inputitem['data'][$words*3]) - ord('0'); $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, $val); } elseif (($inputitem['size'] - ($words * 3)) == 2) { $val = (ord($inputitem['data'][$words*3 ]) - ord('0')) * 10; $val += (ord($inputitem['data'][$words*3+1]) - ord('0')); $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 7, $val); } return $inputitem; } /** * encodeModeAn * @param array $inputitem * @param int $version * @return array input item */ protected function encodeModeAn($inputitem, $version) { $words = (int)($inputitem['size'] / 2); $inputitem['bstream'] = array(); $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x02); $inputitem['bstream'] = $this->appendNum(v, $this->lengthIndicator(QR_MODE_AN, $version), $inputitem['size']); for ($i=0; $i < $words; ++$i) { $val = (int)$this->lookAnTable(ord($inputitem['data'][$i*2 ])) * 45; $val += (int)$this->lookAnTable(ord($inputitem['data'][$i*2+1])); $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 11, $val); } if ($inputitem['size'] & 1) { $val = $this->lookAnTable(ord($inputitem['data'][($words * 2)])); $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 6, $val); } return $inputitem; } /** * encodeMode8 * @param array $inputitem * @param int $version * @return array input item */ protected function encodeMode8($inputitem, $version) { $inputitem['bstream'] = array(); $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x4); $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_8B, $version), $inputitem['size']); for ($i=0; $i < $inputitem['size']; ++$i) { $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 8, ord($inputitem['data'][$i])); } return $inputitem; } /** * encodeModeKanji * @param array $inputitem * @param int $version * @return array input item */ protected function encodeModeKanji($inputitem, $version) { $inputitem['bstream'] = array(); $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x8); $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_KJ, $version), (int)($inputitem['size'] / 2)); for ($i=0; $i<$inputitem['size']; $i+=2) { $val = (ord($inputitem['data'][$i]) << 8) | ord($inputitem['data'][$i+1]); if ($val <= 0x9ffc) { $val -= 0x8140; } else { $val -= 0xc140; } $h = ($val >> 8) * 0xc0; $val = ($val & 0xff) + $h; $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 13, $val); } return $inputitem; } /** * encodeModeStructure * @param array $inputitem * @return array input item */ protected function encodeModeStructure($inputitem) { $inputitem['bstream'] = array(); $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x03); $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, ord($inputitem['data'][1]) - 1); $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, ord($inputitem['data'][0]) - 1); $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 8, ord($inputitem['data'][2])); return $inputitem; } /** * encodeBitStream * @param array $inputitem * @param int $version * @return array input item */ protected function encodeBitStream($inputitem, $version) { $inputitem['bstream'] = array(); $words = $this->maximumWords($inputitem['mode'], $version); if ($inputitem['size'] > $words) { $st1 = $this->newInputItem($inputitem['mode'], $words, $inputitem['data']); $st2 = $this->newInputItem($inputitem['mode'], $inputitem['size'] - $words, array_slice($inputitem['data'], $words)); $st1 = $this->encodeBitStream($st1, $version); $st2 = $this->encodeBitStream($st2, $version); $inputitem['bstream'] = array(); $inputitem['bstream'] = $this->appendBitstream($inputitem['bstream'], $st1['bstream']); $inputitem['bstream'] = $this->appendBitstream($inputitem['bstream'], $st2['bstream']); } else { switch($inputitem['mode']) { case QR_MODE_NM: { $inputitem = $this->encodeModeNum($inputitem, $version); break; } case QR_MODE_AN: { $inputitem = $this->encodeModeAn($inputitem, $version); break; } case QR_MODE_8B: { $inputitem = $this->encodeMode8($inputitem, $version); break; } case QR_MODE_KJ: { $inputitem = $this->encodeModeKanji($inputitem, $version); break; } case QR_MODE_ST: { $inputitem = $this->encodeModeStructure($inputitem); break; } default: { break; } } } return $inputitem; } // - - - - - - - - - - - - - - - - - - - - - - - - - // QRinput /** * Append data to an input object. * The data is copied and appended to the input object. * @param array items input items * @param int $mode encoding mode. * @param int $size size of data (byte). * @param array $data array of input data. * @return items * */ protected function appendNewInputItem($items, $mode, $size, $data) { $items[] = $this->newInputItem($mode, $size, $data); return $items; } /** * insertStructuredAppendHeader * @param array $items * @param int $size * @param int $index * @param int $parity * @return array items */ protected function insertStructuredAppendHeader($items, $size, $index, $parity) { if ($size > MAX_STRUCTURED_SYMBOLS) { return -1; } if (($index <= 0) OR ($index > MAX_STRUCTURED_SYMBOLS)) { return -1; } $buf = array($size, $index, $parity); $entry = $this->newInputItem(QR_MODE_ST, 3, buf); array_unshift($items, $entry); return $items; } /** * calcParity * @param array $items * @return int parity */ protected function calcParity($items) { $parity = 0; foreach ($items as $item) { if ($item['mode'] != QR_MODE_ST) { for ($i=$item['size']-1; $i>=0; --$i) { $parity ^= $item['data'][$i]; } } } return $parity; } /** * checkModeNum * @param int $size * @param array $data * @return boolean true or false */ protected function checkModeNum($size, $data) { for ($i=0; $i<$size; ++$i) { if ((ord($data[$i]) < ord('0')) OR (ord($data[$i]) > ord('9'))){ return false; } } return true; } /** * estimateBitsModeNum * @param int $size * @return int number of bits */ protected function estimateBitsModeNum($size) { $w = (int)$size / 3; $bits = $w * 10; switch($size - $w * 3) { case 1: { $bits += 4; break; } case 2: { $bits += 7; break; } default: { break; } } return $bits; } /** * Look up the alphabet-numeric convesion table (see JIS X0510:2004, pp.19). * @param int $c character value * @return value */ protected function lookAnTable($c) { return (($c > 127)?-1:$this->anTable[$c]); } /** * checkModeAn * @param int $size * @param array $data * @return boolean true or false */ protected function checkModeAn($size, $data) { for ($i=0; $i<$size; ++$i) { if ($this->lookAnTable(ord($data[$i])) == -1) { return false; } } return true; } /** * estimateBitsModeAn * @param int $size * @return int number of bits */ protected function estimateBitsModeAn($size) { $w = (int)($size / 2); $bits = $w * 11; if ($size & 1) { $bits += 6; } return $bits; } /** * estimateBitsMode8 * @param int $size * @return int number of bits */ protected function estimateBitsMode8($size) { return $size * 8; } /** * estimateBitsModeKanji * @param int $size * @return int number of bits */ protected function estimateBitsModeKanji($size) { return (int)(($size / 2) * 13); } /** * checkModeKanji * @param int $size * @param array $data * @return boolean true or false */ protected function checkModeKanji($size, $data) { if ($size & 1) { return false; } for ($i=0; $i<$size; $i+=2) { $val = (ord($data[$i]) << 8) | ord($data[$i+1]); if (($val < 0x8140) OR (($val > 0x9ffc) AND ($val < 0xe040)) OR ($val > 0xebbf)) { return false; } } return true; } /** * Validate the input data. * @param int $mode encoding mode. * @param int $size size of data (byte). * @param array data data to validate * @return boolean true in case of valid data, false otherwise */ protected function check($mode, $size, $data) { if ($size <= 0) { return false; } switch($mode) { case QR_MODE_NM: { return $this->checkModeNum($size, $data); } case QR_MODE_AN: { return $this->checkModeAn($size, $data); } case QR_MODE_KJ: { return $this->checkModeKanji($size, $data); } case QR_MODE_8B: { return true; } case QR_MODE_ST: { return true; } default: { break; } } return false; } /** * estimateBitStreamSize * @param array $items * @param int $version * @return int bits */ protected function estimateBitStreamSize($items, $version) { $bits = 0; if ($version == 0) { $version = 1; } foreach ($items as $item) { switch($item['mode']) { case QR_MODE_NM: { $bits = $this->estimateBitsModeNum($item['size']); break; } case QR_MODE_AN: { $bits = $this->estimateBitsModeAn($item['size']); break; } case QR_MODE_8B: { $bits = $this->estimateBitsMode8($item['size']); break; } case QR_MODE_KJ: { $bits = $this->estimateBitsModeKanji($item['size']); break; } case QR_MODE_ST: { return STRUCTURE_HEADER_BITS; } default: { return 0; } } $l = $this->lengthIndicator($item['mode'], $version); $m = 1 << $l; $num = (int)(($item['size'] + $m - 1) / $m); $bits += $num * (4 + $l); } return $bits; } /** * estimateVersion * @param array $items * @return int version */ protected function estimateVersion($items) { $version = 0; $prev = 0; do { $prev = $version; $bits = $this->estimateBitStreamSize($items, $prev); $version = $this->getMinimumVersion((int)(($bits + 7) / 8), $this->level); if ($version < 0) { return -1; } } while ($version > $prev); return $version; } /** * lengthOfCode * @param int $mode * @param int $version * @param int $bits * @return int size */ protected function lengthOfCode($mode, $version, $bits) { $payload = $bits - 4 - $this->lengthIndicator($mode, $version); switch($mode) { case QR_MODE_NM: { $chunks = (int)($payload / 10); $remain = $payload - $chunks * 10; $size = $chunks * 3; if ($remain >= 7) { $size += 2; } elseif ($remain >= 4) { $size += 1; } break; } case QR_MODE_AN: { $chunks = (int)($payload / 11); $remain = $payload - $chunks * 11; $size = $chunks * 2; if ($remain >= 6) { ++$size; } break; } case QR_MODE_8B: { $size = (int)($payload / 8); break; } case QR_MODE_KJ: { $size = (int)(($payload / 13) * 2); break; } case QR_MODE_ST: { $size = (int)($payload / 8); break; } default: { $size = 0; break; } } $maxsize = $this->maximumWords($mode, $version); if ($size < 0) { $size = 0; } if ($size > $maxsize) { $size = $maxsize; } return $size; } /** * createBitStream * @param array $items * @return array of items and total bits */ protected function createBitStream($items) { $total = 0; foreach ($items as $key => $item) { $items[$key] = $this->encodeBitStream($item, $this->version); $bits = count($items[$key]['bstream']); $total += $bits; } return array($items, $total); } /** * convertData * @param array $items * @return array items */ protected function convertData($items) { $ver = $this->estimateVersion($items); if ($ver > $this->version) { $this->version = $ver; } for (;;) { $cbs = $this->createBitStream($items); $items = $cbs[0]; $bits = $cbs[1]; if ($bits < 0) { return -1; } $ver = $this->getMinimumVersion((int)(($bits + 7) / 8), $this->level); if ($ver < 0) { return -1; } elseif ($ver > $this->version) { $this->version = $ver; } else { break; } } return $items; } /** * Append Padding Bit to bitstream * @param array $bstream * @return array bitstream */ protected function appendPaddingBit($bstream) { $bits = count($bstream); $maxwords = $this->getDataLength($this->version, $this->level); $maxbits = $maxwords * 8; if ($maxbits == $bits) { return 0; } if ($maxbits - $bits < 5) { return $this->appendNum($bstream, $maxbits - $bits, 0); } $bits += 4; $words = (int)(($bits + 7) / 8); $padding = array(); $padding = $this->appendNum($padding, $words * 8 - $bits + 4, 0); $padlen = $maxwords - $words; if ($padlen > 0) { $padbuf = array(); for ($i=0; $i<$padlen; ++$i) { $padbuf[$i] = ($i&1)?0x11:0xec; } $padding = $this->appendBytes($padding, $padlen, $padbuf); } return $this->appendBitstream($bstream, $padding); } /** * mergeBitStream * @param array $bstream * @return array bitstream */ protected function mergeBitStream($items) { $items = $this->convertData($items); $bstream = array(); foreach ($items as $item) { $bstream = $this->appendBitstream($bstream, $item['bstream']); } return $bstream; } /** * Returns a stream of bits. * @param int $items * @return array padded merged byte stream */ protected function getBitStream($items) { $bstream = $this->mergeBitStream($items); return $this->appendPaddingBit($bstream); } /** * Pack all bit streams padding bits into a byte array. * @param int $items * @return array padded merged byte stream */ protected function getByteStream($items) { $bstream = $this->getBitStream($items); return $this->bitstreamToByte($bstream); } // - - - - - - - - - - - - - - - - - - - - - - - - - // QRbitstream /** * Return an array with zeros * @param int $setLength array size * @return array */ protected function allocate($setLength) { return array_fill(0, $setLength, 0); } /** * Return new bitstream from number * @param int $bits number of bits * @param int $num number * @return array bitstream */ protected function newFromNum($bits, $num) { $bstream = $this->allocate($bits); $mask = 1 << ($bits - 1); for ($i=0; $i<$bits; ++$i) { if ($num & $mask) { $bstream[$i] = 1; } else { $bstream[$i] = 0; } $mask = $mask >> 1; } return $bstream; } /** * Return new bitstream from bytes * @param int $size size * @param array $data bytes * @return array bitstream */ protected function newFromBytes($size, $data) { $bstream = $this->allocate($size * 8); $p=0; for ($i=0; $i<$size; ++$i) { $mask = 0x80; for ($j=0; $j<8; ++$j) { if ($data[$i] & $mask) { $bstream[$p] = 1; } else { $bstream[$p] = 0; } $p++; $mask = $mask >> 1; } } return $bstream; } /** * Append one bitstream to another * @param array $bitstream original bitstream * @param array $append bitstream to append * @return array bitstream */ protected function appendBitstream($bitstream, $append) { if ((!is_array($append)) OR (count($append) == 0)) { return $bitstream; } if (count($bitstream) == 0) { return $append; } return array_values(array_merge($bitstream, $append)); } /** * Append one bitstream created from number to another * @param array $bitstream original bitstream * @param int $bits number of bits * @param int $num number * @return array bitstream */ protected function appendNum($bitstream, $bits, $num) { if ($bits == 0) { return 0; } $b = $this->newFromNum($bits, $num); return $this->appendBitstream($bitstream, $b); } /** * Append one bitstream created from bytes to another * @param array $bitstream original bitstream * @param int $size size * @param array $data bytes * @return array bitstream */ protected function appendBytes($bitstream, $size, $data) { if ($size == 0) { return 0; } $b = $this->newFromBytes($size, $data); return $this->appendBitstream($bitstream, $b); } /** * Convert bitstream to bytes * @param array $bitstream original bitstream * @return array of bytes */ protected function bitstreamToByte($bstream) { $size = count($bstream); if ($size == 0) { return array(); } $data = array_fill(0, (int)(($size + 7) / 8), 0); $bytes = (int)($size / 8); $p = 0; for ($i=0; $i<$bytes; $i++) { $v = 0; for ($j=0; $j<8; $j++) { $v = $v << 1; $v |= $bstream[$p]; $p++; } $data[$i] = $v; } if ($size & 7) { $v = 0; for ($j=0; $j<($size & 7); $j++) { $v = $v << 1; $v |= $bstream[$p]; $p++; } $data[$bytes] = $v; } return $data; } // - - - - - - - - - - - - - - - - - - - - - - - - - // QRspec /** * Replace a value on the array at the specified position * @param array $srctab * @param int $x X position * @param int $y Y position * @param string $repl value to replace * @param int $replLen length of the repl string * @return array srctab */ protected function qrstrset($srctab, $x, $y, $repl, $replLen=false) { $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl)); return $srctab; } /** * Return maximum data code length (bytes) for the version. * @param int $version version * @param int $level error correction level * @return int maximum size (bytes) */ protected function getDataLength($version, $level) { return $this->capacity[$version][QRCAP_WORDS] - $this->capacity[$version][QRCAP_EC][$level]; } /** * Return maximum error correction code length (bytes) for the version. * @param int $version version * @param int $level error correction level * @return int ECC size (bytes) */ protected function getECCLength($version, $level){ return $this->capacity[$version][QRCAP_EC][$level]; } /** * Return the width of the symbol for the version. * @param int $version version * @return int width */ protected function getWidth($version) { return $this->capacity[$version][QRCAP_WIDTH]; } /** * Return the numer of remainder bits. * @param int $version version * @return int number of remainder bits */ protected function getRemainder($version) { return $this->capacity[$version][QRCAP_REMINDER]; } /** * Return a version number that satisfies the input code length. * @param int $size input code length (byte) * @param int $level error correction level * @return int version number */ protected function getMinimumVersion($size, $level) { for ($i=1; $i <= QRSPEC_VERSION_MAX; ++$i) { $words = $this->capacity[$i][QRCAP_WORDS] - $this->capacity[$i][QRCAP_EC][$level]; if ($words >= $size) { return $i; } } return -1; } /** * Return the size of length indicator for the mode and version. * @param int $mode encoding mode * @param int $version version * @return int the size of the appropriate length indicator (bits). */ protected function lengthIndicator($mode, $version) { if ($mode == QR_MODE_ST) { return 0; } if ($version <= 9) { $l = 0; } elseif ($version <= 26) { $l = 1; } else { $l = 2; } return $this->lengthTableBits[$mode][$l]; } /** * Return the maximum length for the mode and version. * @param int $mode encoding mode * @param int $version version * @return int the maximum length (bytes) */ protected function maximumWords($mode, $version) { if ($mode == QR_MODE_ST) { return 3; } if ($version <= 9) { $l = 0; } else if ($version <= 26) { $l = 1; } else { $l = 2; } $bits = $this->lengthTableBits[$mode][$l]; $words = (1 << $bits) - 1; if ($mode == QR_MODE_KJ) { $words *= 2; // the number of bytes is required } return $words; } /** * Return an array of ECC specification. * @param int $version version * @param int $level error correction level * @param array $spec an array of ECC specification contains as following: {# of type1 blocks, # of data code, # of ecc code, # of type2 blocks, # of data code} * @return array spec */ protected function getEccSpec($version, $level, $spec) { if (count($spec) < 5) { $spec = array(0, 0, 0, 0, 0); } $b1 = $this->eccTable[$version][$level][0]; $b2 = $this->eccTable[$version][$level][1]; $data = $this->getDataLength($version, $level); $ecc = $this->getECCLength($version, $level); if ($b2 == 0) { $spec[0] = $b1; $spec[1] = (int)($data / $b1); $spec[2] = (int)($ecc / $b1); $spec[3] = 0; $spec[4] = 0; } else { $spec[0] = $b1; $spec[1] = (int)($data / ($b1 + $b2)); $spec[2] = (int)($ecc / ($b1 + $b2)); $spec[3] = $b2; $spec[4] = $spec[1] + 1; } return $spec; } /** * Put an alignment marker. * @param array $frame frame * @param int $width width * @param int $ox X center coordinate of the pattern * @param int $oy Y center coordinate of the pattern * @return array frame */ protected function putAlignmentMarker($frame, $ox, $oy) { $finder = array( "\xa1\xa1\xa1\xa1\xa1", "\xa1\xa0\xa0\xa0\xa1", "\xa1\xa0\xa1\xa0\xa1", "\xa1\xa0\xa0\xa0\xa1", "\xa1\xa1\xa1\xa1\xa1" ); $yStart = $oy - 2; $xStart = $ox - 2; for ($y=0; $y < 5; $y++) { $frame = $this->qrstrset($frame, $xStart, $yStart+$y, $finder[$y]); } return $frame; } /** * Put an alignment pattern. * @param int $version version * @param array $fram frame * @param int $width width * @return array frame */ protected function putAlignmentPattern($version, $frame, $width) { if ($version < 2) { return $frame; } $d = $this->alignmentPattern[$version][1] - $this->alignmentPattern[$version][0]; if ($d < 0) { $w = 2; } else { $w = (int)(($width - $this->alignmentPattern[$version][0]) / $d + 2); } if ($w * $w - 3 == 1) { $x = $this->alignmentPattern[$version][0]; $y = $this->alignmentPattern[$version][0]; $frame = $this->putAlignmentMarker($frame, $x, $y); return $frame; } $cx = $this->alignmentPattern[$version][0]; $wo = $w - 1; for ($x=1; $x < $wo; ++$x) { $frame = $this->putAlignmentMarker($frame, 6, $cx); $frame = $this->putAlignmentMarker($frame, $cx, 6); $cx += $d; } $cy = $this->alignmentPattern[$version][0]; for ($y=0; $y < $wo; ++$y) { $cx = $this->alignmentPattern[$version][0]; for ($x=0; $x < $wo; ++$x) { $frame = $this->putAlignmentMarker($frame, $cx, $cy); $cx += $d; } $cy += $d; } return $frame; } /** * Return BCH encoded version information pattern that is used for the symbol of version 7 or greater. Use lower 18 bits. * @param int $version version * @return BCH encoded version information pattern */ protected function getVersionPattern($version) { if (($version < 7) OR ($version > QRSPEC_VERSION_MAX)) { return 0; } return $this->versionPattern[($version - 7)]; } /** * Return BCH encoded format information pattern. * @param array $mask * @param int $level error correction level * @return BCH encoded format information pattern */ protected function getFormatInfo($mask, $level) { if (($mask < 0) OR ($mask > 7)) { return 0; } if (($level < 0) OR ($level > 3)) { return 0; } return $this->formatInfo[$level][$mask]; } /** * Put a finder pattern. * @param array $frame frame * @param int $width width * @param int $ox X center coordinate of the pattern * @param int $oy Y center coordinate of the pattern * @return array frame */ protected function putFinderPattern($frame, $ox, $oy) { $finder = array( "\xc1\xc1\xc1\xc1\xc1\xc1\xc1", "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", "\xc1\xc1\xc1\xc1\xc1\xc1\xc1" ); for ($y=0; $y < 7; $y++) { $frame = $this->qrstrset($frame, $ox, ($oy + $y), $finder[$y]); } return $frame; } /** * Return a copy of initialized frame. * @param int $version version * @return Array of unsigned char. */ protected function createFrame($version) { $width = $this->capacity[$version][QRCAP_WIDTH]; $frameLine = str_repeat ("\0", $width); $frame = array_fill(0, $width, $frameLine); // Finder pattern $frame = $this->putFinderPattern($frame, 0, 0); $frame = $this->putFinderPattern($frame, $width - 7, 0); $frame = $this->putFinderPattern($frame, 0, $width - 7); // Separator $yOffset = $width - 7; for ($y=0; $y < 7; ++$y) { $frame[$y][7] = "\xc0"; $frame[$y][$width - 8] = "\xc0"; $frame[$yOffset][7] = "\xc0"; ++$yOffset; } $setPattern = str_repeat("\xc0", 8); $frame = $this->qrstrset($frame, 0, 7, $setPattern); $frame = $this->qrstrset($frame, $width-8, 7, $setPattern); $frame = $this->qrstrset($frame, 0, $width - 8, $setPattern); // Format info $setPattern = str_repeat("\x84", 9); $frame = $this->qrstrset($frame, 0, 8, $setPattern); $frame = $this->qrstrset($frame, $width - 8, 8, $setPattern, 8); $yOffset = $width - 8; for ($y=0; $y < 8; ++$y,++$yOffset) { $frame[$y][8] = "\x84"; $frame[$yOffset][8] = "\x84"; } // Timing pattern $wo = $width - 15; for ($i=1; $i < $wo; ++$i) { $frame[6][7+$i] = chr(0x90 | ($i & 1)); $frame[7+$i][6] = chr(0x90 | ($i & 1)); } // Alignment pattern $frame = $this->putAlignmentPattern($version, $frame, $width); // Version information if ($version >= 7) { $vinf = $this->getVersionPattern($version); $v = $vinf; for ($x=0; $x<6; ++$x) { for ($y=0; $y<3; ++$y) { $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1)); $v = $v >> 1; } } $v = $vinf; for ($y=0; $y<6; ++$y) { for ($x=0; $x<3; ++$x) { $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1)); $v = $v >> 1; } } } // and a little bit... $frame[$width - 8][8] = "\x81"; return $frame; } /** * Set new frame for the specified version. * @param int $version version * @return Array of unsigned char. */ protected function newFrame($version) { if (($version < 1) OR ($version > QRSPEC_VERSION_MAX)) { return NULL; } if (!isset($this->frames[$version])) { $this->frames[$version] = $this->createFrame($version); } if (is_null($this->frames[$version])) { return NULL; } return $this->frames[$version]; } /** * Return block number 0 * @param array $spec * @return int value */ protected function rsBlockNum($spec) { return ($spec[0] + $spec[3]); } /** * Return block number 1 * @param array $spec * @return int value */ protected function rsBlockNum1($spec) { return $spec[0]; } /** * Return data codes 1 * @param array $spec * @return int value */ protected function rsDataCodes1($spec) { return $spec[1]; } /** * Return ecc codes 1 * @param array $spec * @return int value */ protected function rsEccCodes1($spec) { return $spec[2]; } /** * Return block number 2 * @param array $spec * @return int value */ protected function rsBlockNum2($spec) { return $spec[3]; } /** * Return data codes 2 * @param array $spec * @return int value */ protected function rsDataCodes2($spec) { return $spec[4]; } /** * Return ecc codes 2 * @param array $spec * @return int value */ protected function rsEccCodes2($spec) { return $spec[2]; } /** * Return data length * @param array $spec * @return int value */ protected function rsDataLength($spec) { return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); } /** * Return ecc length * @param array $spec * @return int value */ protected function rsEccLength($spec) { return ($spec[0] + $spec[3]) * $spec[2]; } // - - - - - - - - - - - - - - - - - - - - - - - - - // QRrs /** * Initialize a Reed-Solomon codec and add it to existing rsitems * @param int $symsize symbol size, bits * @param int $gfpoly Field generator polynomial coefficients * @param int $fcr first root of RS code generator polynomial, index form * @param int $prim primitive element to generate polynomial roots * @param int $nroots RS code generator polynomial degree (number of roots) * @param int $pad padding bytes at front of shortened block * @return array Array of RS values:. */ protected function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) { foreach ($this->rsitems as $rs) { if (($rs['pad'] != $pad) OR ($rs['nroots'] != $nroots) OR ($rs['mm'] != $symsize) OR ($rs['gfpoly'] != $gfpoly) OR ($rs['fcr'] != $fcr) OR ($rs['prim'] != $prim)) { continue; } return $rs; } $rs = $this->init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad); array_unshift($this->rsitems, $rs); return $rs; } // - - - - - - - - - - - - - - - - - - - - - - - - - // QRrsItem /** * modnn * @param array RS values * @param int $x X position * @return int X osition */ protected function modnn($rs, $x) { while ($x >= $rs['nn']) { $x -= $rs['nn']; $x = ($x >> $rs['mm']) + ($x & $rs['nn']); } return $x; } /** * Initialize a Reed-Solomon codec and returns an array of values. * @param int $symsize symbol size, bits * @param int $gfpoly Field generator polynomial coefficients * @param int $fcr first root of RS code generator polynomial, index form * @param int $prim primitive element to generate polynomial roots * @param int $nroots RS code generator polynomial degree (number of roots) * @param int $pad padding bytes at front of shortened block * @return array Array of RS values:. */ protected function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) { // Based on Reed solomon encoder by Phil Karn, KA9Q (GNU-LGPLv2) $rs = null; // Check parameter ranges if (($symsize < 0) OR ($symsize > 8)) { return $rs; } if (($fcr < 0) OR ($fcr >= (1<<$symsize))) { return $rs; } if (($prim <= 0) OR ($prim >= (1<<$symsize))) { return $rs; } if (($nroots < 0) OR ($nroots >= (1<<$symsize))) { return $rs; } if (($pad < 0) OR ($pad >= ((1<<$symsize) -1 - $nroots))) { return $rs; } $rs = array(); $rs['mm'] = $symsize; $rs['nn'] = (1 << $symsize) - 1; $rs['pad'] = $pad; $rs['alpha_to'] = array_fill(0, ($rs['nn'] + 1), 0); $rs['index_of'] = array_fill(0, ($rs['nn'] + 1), 0); // PHP style macro replacement ;) $NN =& $rs['nn']; $A0 =& $NN; // Generate Galois field lookup tables $rs['index_of'][0] = $A0; // log(zero) = -inf $rs['alpha_to'][$A0] = 0; // alpha**-inf = 0 $sr = 1; for ($i=0; $i<$rs['nn']; ++$i) { $rs['index_of'][$sr] = $i; $rs['alpha_to'][$i] = $sr; $sr <<= 1; if ($sr & (1 << $symsize)) { $sr ^= $gfpoly; } $sr &= $rs['nn']; } if ($sr != 1) { // field generator polynomial is not primitive! return NULL; } // Form RS code generator polynomial from its roots $rs['genpoly'] = array_fill(0, ($nroots + 1), 0); $rs['fcr'] = $fcr; $rs['prim'] = $prim; $rs['nroots'] = $nroots; $rs['gfpoly'] = $gfpoly; // Find prim-th root of 1, used in decoding for ($iprim=1; ($iprim % $prim) != 0; $iprim += $rs['nn']) { ; // intentional empty-body loop! } $rs['iprim'] = (int)($iprim / $prim); $rs['genpoly'][0] = 1; for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) { $rs['genpoly'][$i+1] = 1; // Multiply rs->genpoly[] by @**(root + x) for ($j = $i; $j > 0; --$j) { if ($rs['genpoly'][$j] != 0) { $rs['genpoly'][$j] = $rs['genpoly'][$j-1] ^ $rs['alpha_to'][$this->modnn($rs, $rs['index_of'][$rs['genpoly'][$j]] + $root)]; } else { $rs['genpoly'][$j] = $rs['genpoly'][$j-1]; } } // rs->genpoly[0] can never be zero $rs['genpoly'][0] = $rs['alpha_to'][$this->modnn($rs, $rs['index_of'][$rs['genpoly'][0]] + $root)]; } // convert rs->genpoly[] to index form for quicker encoding for ($i = 0; $i <= $nroots; ++$i) { $rs['genpoly'][$i] = $rs['index_of'][$rs['genpoly'][$i]]; } return $rs; } /** * Encode a Reed-Solomon codec and returns the parity array * @param array $rs RS values * @param array $data data * @param array $parity parity * @return parity array */ protected function encode_rs_char($rs, $data, $parity) { $MM =& $rs['mm']; // bits per symbol $NN =& $rs['nn']; // the total number of symbols in a RS block $ALPHA_TO =& $rs['alpha_to']; // the address of an array of NN elements to convert Galois field elements in index (log) form to polynomial form $INDEX_OF =& $rs['index_of']; // the address of an array of NN elements to convert Galois field elements in polynomial form to index (log) form $GENPOLY =& $rs['genpoly']; // an array of NROOTS+1 elements containing the generator polynomial in index form $NROOTS =& $rs['nroots']; // the number of roots in the RS code generator polynomial, which is the same as the number of parity symbols in a block $FCR =& $rs['fcr']; // first consecutive root, index form $PRIM =& $rs['prim']; // primitive element, index form $IPRIM =& $rs['iprim']; // prim-th root of 1, index form $PAD =& $rs['pad']; // the number of pad symbols in a block $A0 =& $NN; $parity = array_fill(0, $NROOTS, 0); for ($i=0; $i < ($NN - $NROOTS - $PAD); $i++) { $feedback = $INDEX_OF[$data[$i] ^ $parity[0]]; if ($feedback != $A0) { // feedback term is non-zero // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must // always be for the polynomials constructed by init_rs() $feedback = $this->modnn($rs, $NN - $GENPOLY[$NROOTS] + $feedback); for ($j=1; $j < $NROOTS; ++$j) { $parity[$j] ^= $ALPHA_TO[$this->modnn($rs, $feedback + $GENPOLY[($NROOTS - $j)])]; } } // Shift array_shift($parity); if ($feedback != $A0) { array_push($parity, $ALPHA_TO[$this->modnn($rs, $feedback + $GENPOLY[0])]); } else { array_push($parity, 0); } } return $parity; } } // end QRcode class } // END OF "class_exists QRcode" ?> phpqrcode/cache/0000755000175000017500000000000011453417106013134 5ustar thijsthijsphpqrcode/cache/frame_1.dat0000644000175000017500000000014111432665120015132 0ustar thijsthijsxÚÁ À E9³u`³"PÅ„CÛ牗T!0$ E•ɲQ™Ém½úhÛ¾9{kI"› 9Ln)Ap¤åÖ¾Ë>ß^‡Õz³mënÅ–;ü´mßn†ú¦Ëphpqrcode/cache/frame_1.png0000644000175000017500000000017611432665120015156 0ustar thijsthijs‰PNG  IHDR“Ù7ÕPLTEÿÿÿ¥ÙŸÝ3IDATxœc`üÃÀPû÷ƒë_8ñCþÿÿÁðˆ1èú Œ@ºˆ]‘0ˆ÷O-ÝÉRIEND®B`‚phpqrcode/cache/frame_10.dat0000644000175000017500000000031411432665120015214 0ustar thijsthijsxÚí—M„ F]sëIX´;¹Ün6üÔ : ã®+_^J””r¼Þf‚¾AŸ2KB" Édd9 Á$aŠt)·d¯Og­½’UŸ´·f¿.gãú«šßÞzÊœ3æ”Î1z®ÏMQåqߨ!Ò,“â§8ßu¶ÿþAUõOœA•H×|ç¶úԹܧ|Câç›NŒcàŠS`Å 9-çèL8Fªû Ý™ztöñfÍ““5ßÖ}òfêzoŸœ»Ã‰dÝWª||ï<–phpqrcode/cache/frame_10.png0000644000175000017500000000031211432665120015226 0ustar thijsthijs‰PNG  IHDR99¶ÖÆPLTEÿÿÿ¥ÙŸÝIDATxœÍ‘± €0D/•kÙd'± Éh:‚…¥¸‚بg~’/ŽàUã.|Æœàî°©™ ÜÆÑYxEÇ4’ 4dÀ%ŽsRÃ?5›—…UÀáes°{Îdûi^ç'›;…êã”…º9^0ÿ"]G«ŽÕW/8Sào}ˆ$zd\IEND®B`‚phpqrcode/cache/frame_11.dat0000644000175000017500000000032211432665120015214 0ustar thijsthijsxÚí—M„ F]sëIX”Ün7›òã F .û¹²ñå¥Ä44„/Ù€R>CAC¦3…t4Sh•èD­Ð0G»˜†*ºß·³Ö6h€ßå̾?ÎâÓ¨›ß™û’y7æ„„L1r¾oŒ,ùUK)´Ù¢ÙÍnv³»E÷æ×°.žfç°^h×ùjPýÕ7ÿkìf7»ï4àe]©U7¢ @¯Óxen»Çsí¼î~–fjx؉Æóœ¾\Ü佤Õg¾KSwÁ MÞC«| zAJphpqrcode/cache/frame_11.png0000644000175000017500000000031511432665120015232 0ustar thijsthijs‰PNG  IHDR==$¬óªPLTEÿÿÿ¥ÙŸÝ‚IDATxœÍ‘1 €0 E ¸y¢Þ@ïâRz6GGG7Ý»ˆ.“ÔÁ øÉðøüÀ#Ñ …-Á+Œõ³BŠ4Õ’9"- ®µ©C'.Í0P–:~ëpa™|‚L=’ÌË)™Ÿtþ:ƒAcP‘u¶+øËù®üAv¼e¼mî9J½ýZÎÉÐIEND®B`‚phpqrcode/cache/frame_12.dat0000644000175000017500000000033611432665120015222 0ustar thijsthijsxÚí˜A… D]s런€Ün7û‹bÅ•éàÆT&b$cI^n3RZùcbÁGM;(íq&8D‚YÒLªC\Ń‹j®";ôúଵ®º uõ÷Âìµá,ŒjÅœ{áQs  ÷Xy‹a¹üN230Ãw ­@hZa€´×CDP-†‘ouŽ*?òyº™wäÌ¢e½)o–} eÞr/Þp dÿ›éÿC¡?'…Eîphpqrcode/cache/frame_12.png0000644000175000017500000000033011432665120015230 0ustar thijsthijs‰PNG  IHDRAA´9[PLTEÿÿÿ¥ÙŸÝIDATxœc`üÿ00Ô‚Yÿã\ÁŒ¿0ÖŸ‹`ÖùÿÿÁêþÞ"ÆP0p``øûÿ¿á/Dõ ÀbPÖÐûPö{Ã÷z°Ë¾Yñÿÿ‡#‹!Ô ¼›); gåÃYSÿÃý÷/0 AÃ’6@b®pu®p½V-œÅcMþÕÄ-äIEND®B`‚phpqrcode/cache/frame_13.dat0000644000175000017500000000033711432665120015224 0ustar thijsthijsxÚí˜AÄ E»öÖ“¸€]½ÞDo6jéÄ&£¥è¦ ßUCùy…&DRªŠv{*DŒGr2)I\ Rvv)$"–êR³'\íŠ:,­Ë¸.Á{_Du¡¹ýÿ >ŸNÌýzIÏY²Îdc«œ}^—,K2Çã¾M‰\ÜeQeQeyËhæ°bænþ±bäo2b+Y–ÔEÿ]eQeQ–·±ä›( ºi—¢y–Œ}Þ<:¯¡Ÿ©Ù˜nv¼9-¿Û_XÄ{†¶.òGÛ£U.Ò]ÐÅE¼—jô¤òJšphpqrcode/cache/frame_13.png0000644000175000017500000000032211432665120015232 0ustar thijsthijs‰PNG  IHDREE&C¹jPLTEÿÿÿ¥ÙŸÝ‡IDATxœÝ’Á €0 EO^»T'p½H—sîЋèEbLltAðŸ?¿Ð|G¢”ö„ 4ûL‹RA4yÉuåXŠÙ>×…"91’:©“:ý¯ÓÝYtZ3#óñ´F¤pðÇ`MÚI¬OúÆÕIÔIç¸Îq}ãê¤NO8!B>Na"NßNãói_A¼Ø33ý؉ÏqÞ®§sbíŸÚ>ñvbíÝI’8»ÃŽÄÚg6yZ×·wphpqrcode/cache/frame_14.png0000644000175000017500000000032511432665120015236 0ustar thijsthijs‰PNG  IHDRIIK½™ŸPLTEÿÿÿ¥ÙŸÝŠIDATxœÝ’± €0 ŠYØ‚&P &AT(Y‘ (ii ð$6‰aÄÖéõ²ü’É€uTDÑĘq,°¸³ælÍŬiDaÄ<’ˆ$v~Ì §ò½…§P€[ôžV‡q¼ÜGöc-þÜ­Tœ;è½Ú"|uêvjt­f­nxà h2^f7râÜÂÞIEND®B`‚phpqrcode/cache/frame_15.dat0000644000175000017500000000036211432665120015224 0ustar thijsthijsxÚí˜1à E3sëJ ön7›Õ© ¸]ú¦XÊÓ“QŒä”¶D»Œ†ˆâI&Å’ÇJÉ´b6çVhåG´Pòò¥Tenirß‚÷^  U.§pô­ž©[¯OðùY?«ºóLc͸[Î1v‹³ã}˱5f]•TšS¥Á npû/7ijõÌ·³jî&jÏì=«•Z¿{[ý†›jßð/À npƒî,ÜYøà7¸õЈ‰˜µÜ(‡IÏ-‡\™½Çzê¡r/¤›êØ5¿¼¸Mï-Û¾ÍïTÛ3Õ¦Íî¢/´é=y“'º¼#phpqrcode/cache/frame_15.png0000644000175000017500000000033311432665120015236 0ustar thijsthijs‰PNG  IHDRMMÙÇ{óPLTEÿÿÿ¥ÙŸÝIDATxœc`üj¡Ì«\¡Ì¯hLöÿäÿ©-ÿÿ÷þÿ»C! „á?Tôÿ†¿Pµ@æ‹Â˜ƒLôC=Ľ*¾×C|ñ½‚ákýÿðÿãÿEER;È|1êcs#‚ùÁlýðÂoÀó1,UE]j]& 1kLF8ûMÀä@ÒaaIEND®B`‚phpqrcode/cache/frame_16.dat0000644000175000017500000000036211432665120015225 0ustar thijsthijsxÚí™A„ E]sëIX´;¸Ün6€È`‚q”êêW6ñ奚`Œ%A/3!¢°‚¢Š!g–ÈÌ¡’1N) éE¢Ï|;®—>6â¸Þ97$ëÄôëc]kköwé1Öü[·m­CÍœcÊRºÄê¹>¦èµ¾šE,•hʼnp„#áxFyWÏÇVWGçòÕ3¼Õ+шþàË“úSŽâ}Äž#áG8b^c^cÏÀŽp„c&3YQ"ñŽ÷çÌvµù›…ñàÎþþ¼–¹kÞ9ŠÜ‡÷}”¹³ï×ú ¢Ä¿QäÿL—/ÝÔÀÏphpqrcode/cache/frame_16.png0000644000175000017500000000032311432665120015236 0ustar thijsthijs‰PNG  IHDRQQAØuPLTEÿÿÿ¥ÙŸÝˆIDATxœc`üj¡Ì?ñ ®Pöß@ 6;]«/¡÷C¡Àá?Tüÿÿ†¿0õ@ö8‹ÃÙƒYüC=Ôýì ßë¡þ*o`øZÿ?ü?¡Š#« î úˆ÷"±w£Š#ü‹ŒÿáËG qW$õ®Hæ ³k‘ØŒ6Åï ÖÙ…ïIEND®B`‚phpqrcode/cache/frame_17.dat0000644000175000017500000000035511432665120015230 0ustar thijsthijsxÚí™A Ä E»öÖ.’]½ÞDo6jí Ìtjm\þ瑱<! 4!äx½Ü û Tð)"T&_h‘šLe\5Ó©Ä}T—Ò]o]ûꬵ®»Nu_Ë ˜õûq6>êæ3¾ä¾kÌS:Çèû}Ñ%j{]Ѫ™B…+\á W¸>ÇõêùtZW#géi½PÝÁWƒõ™®SúŠy…+\á W¸â>€ûæ®p…+\ŸâÊÌÄ$íJ Êâ®”òÛuüÜÚ›¿DÏØðgg4~Ûm4®b{˜º¯r;£zfQ¥vq UloXå óšÅ{phpqrcode/cache/frame_17.png0000644000175000017500000000032311432665120015237 0ustar thijsthijs‰PNG  IHDRUU;:PLTEÿÿÿ¥ÙŸÝˆIDATxœc`üWjaì³\aì»ö[0ûC=Åê¿×ƒÐÛ Œ¡PÂÀð&þÿÃ_˜z û?€Åáìá$ñ,U0@„*¾Öÿ‡"TqdõƒÁý£áCqQ$öj$ví$ÿ"…0ŸÂÞï€â®Hê]‘ÌqE5ÎfD°Hof¦Et§IEND®B`‚phpqrcode/cache/frame_18.dat0000644000175000017500000000037311432665120015231 0ustar thijsthijsxÚí™A ƒ0E]çÖ…,2;sƒä&ÉÍšh¥ÛêO¡ôÝÈàã1&09OIv@DDÒ Ì&§Ù‰KXÈÕFv•<Ádqò9Ö<%h•¹ Yïs !(d¥²ës;~||b(ÏøYůg#µ`œK ±S¼Åô¹Ä¶˜ùsàidßLg:Ó™Îtþ/gmª™ƒkÅMâ3³{­4rTÈQýÿe¥·s·>ó<Ó™Ît¦3éÌ;ïH¼#Ñ™Ît¦3ÍYœ+og©hù¶óµÙ½¬lnðûF>Øi^»#awm;gè~pÛgìNs{6z’‘»ãºïÞäp¾Ê'phpqrcode/cache/frame_18.png0000644000175000017500000000034411432665120015243 0ustar thijsthijs‰PNG  IHDRYYoÅìPLTEÿÿÿ¥ÙŸÝ™IDATxœc`üjaœ÷\aœÿ‘8ÁœõÿÿÈÿÿw¬ç{ýÿ¿÷ÁzCahÚ˜Ìÿÿ az@œÿ–Ap†µ 0 aÀÞÀ hè”70|­ÿDãÿÿG“AÑ3Èü3ð2£!JžL.2ÇM)tà XR BžëA2®Èz\‘MCáÔ"s‘8Ͻ¿¥HêIEND®B`‚phpqrcode/cache/frame_19.dat0000644000175000017500000000040311432665120015224 0ustar thijsthijsxÚíšA Ä E»öÖ.ÌNo 7Ñ›¶iiRÚN2‹áW%ðxÁ@ÚÚœê'­ u6×êˆ.*S;}˜«ÒàÏT úèÌzrt¹ï%ç,ÒÅÚâÎ}ç;“âç)¹Ÿ˜âÝZÚîLåè¹÷¬Pçç$¯×÷ÏqËgœLÂôdJ‡;Üáw¸Ãý.]z#Ÿ¾«[ͽïOg‚­Æô"ÐË áBíî¦}Ç}‡;Üáw¸Ãî˜#1GbŽ„;Üáw¸Ãý_ÝC+w¢@Dfî÷ïç™uø2™ÅÚÉNþû9R7|pWßkïû®¿“ßßkºö¿ºú»¼ÎÓphpqrcode/cache/frame_19.png0000644000175000017500000000034111432665120015241 0ustar thijsthijs‰PNG  IHDR]]ý¿ø€PLTEÿÿÿ¥ÙŸÝ–IDATxœí”± Â0DÏmv`obÒD™„‘#Hn¬Ð ãˆûBM!¾Ü<=}K~…¸Ì è ±@n ܑ׿½3 Î2 á¸Ì`1|àYv¬3™ ?m`nZ(Í\gl‘{êð¤Öfµ³±÷lÙü[Ûd‡½Ã…ÞÍ‹êw©­ëO!}'úm+è‚Á –Z$ ÁK-IEND®B`‚phpqrcode/cache/frame_2.dat0000644000175000017500000000016711432665120015143 0ustar thijsthijsxÚÍ’Í À F{vë&  à&°Y+?Z1öÐSŸ'y!¢ŸÌÁa815&£•Û´ŽÙHå£Ùžc³•l«ÏFÆè1º#é6 fÊÖü©§6Äø•O7ˆ¨†C¦«›ðÖžÏ8gI®ÏöfB¦ÃÄÿæ\DÔ»(phpqrcode/cache/frame_2.png0000644000175000017500000000022011432665120015145 0ustar thijsthijs‰PNG  IHDRþ' PLTEÿÿÿ¥ÙŸÝEIDATxœc`ü€¡öÿ}×ÿ‘ °c¨Ãÿÿÿþ‚¢Xì@V}yãÿð )@–+HÌ$ &jA#ÕB¶pekIEND®B`‚phpqrcode/cache/frame_20.dat0000644000175000017500000000037211432665120015221 0ustar thijsthijsxÚíšM à …³öÖ3»x½‰Þ¬þ¥M XPè{Y… óø…™²¼^fŠ˜}iTðIÓ(:”ÎÑ!ˆ0”ÎRÔïà’N׎í98k­;]#¦÷êY2ëçÇÙø\¨™×YòUs¢¶ÆJg=wQºJ•×uSu0â`À0€á®f¢®šÉu]µêà_ÖîbŸîÀ0€ `@nEnEnÅÀ0€áw(K’‰‰X’“ ãyiûþË|áËÎÉxn•Ùu80ˆìkìç ³s²?Kw8HìþDö—vzÙ7Óphpqrcode/cache/frame_20.png0000644000175000017500000000034111432665120015231 0ustar thijsthijs‰PNG  IHDRaaüÈ]àPLTEÿÿÿ¥ÙŸÝ–IDATxœí”1Â0 E†*×bÉ: ŽÑ©JnÚ+tALô—ÇLl€/ÖÓ“#å[2_µ€¹/@P7¶ÄBž\ãN27‘·ÈmܱV~“Õ‘ wËĦžN©»OœYòô rÉzJ¸æv"÷öîìÜïþï_\ß÷ÜÙÐ@“gl³–[§{Л%.˜¹`Þ´4r-=á/tN3IËIEND®B`‚phpqrcode/cache/frame_21.dat0000644000175000017500000000040411432665120015216 0ustar thijsthijsxÚíšA„ E]sëIX´;¹Ün6Up‚“в™ÿ]Ù˜þ< i-eWö‹¶˜)×äÅ•¼ÉÂ…H\jvqÙHL\6–šÝÐ…rI›¢LܹÜÕ%ÅÓ@´þ±V—vÆÂúý¤(ÏP4|ÎXnÒgÉß¼~]D¾ÉÕ×u1Us S\À°€,ÿÅ2Þ¢N§Ã?D›KºüF-:“eJ]p_À°€,˜a0Ã`†ÁÝ XÀ°`†Á ƒw,` X´]˜ˆ™‚¹‹˜°5 ‰®Y4{屿ñ2íûåvçJs†±Ûí9±˜í)õu±Û¹êÏØ,«]¸“‹Ù^_§7$ƒ_Íphpqrcode/cache/frame_21.png0000644000175000017500000000035311432665120015235 0ustar thijsthijs‰PNG  IHDReen²¿ŒPLTEÿÿÿ¥ÙŸÝ IDATxœí”1Â0×m~׸¢Q¦â ¤‰ü6z(SF¼ ’+X‹“¾Cy@„rÝh´'ÝÃ< +=l¡±’ô\èNø©ÙWsn oŒ/Žæœç°8¾K.Å,NÐÿ9ïòí¾Åär/S‹àØ“Ɔá×éÜvïÛ;Û†Û;[wWEGEêvÕKú‘¢3ñë’³*gÕNM"#é ¸Ê_FËÍÄIEND®B`‚phpqrcode/cache/frame_22.dat0000644000175000017500000000042211432665120015217 0ustar thijsthijsxÚíšA „0 E]{ë.’]{{{³©Z¥BepÆÞwe@V›ERZ3»Á"*2o€4¦y‰)i#dÒbdFÒ…´ŒI"ú‘—4ž½W­IíuŠÓ45ßx«.Z­SÙ{ÁŸ¯8åËÿk={o.±qÊÙ£[œÍ:帒q»õƒy )t#á„N8ádCj-OOG}¼:/Ÿ:sz!Å)^<ùe½·S·uâ{ 'œp 'ú=ú=ú=¾'œp 'œp¢ß£ß£ßãN8á„Óÿ9©ªˆôpQQõ]HÔpz¾ØGœ^æ½Qº˜I|¾ß³u;9™ÎïÕëd;“X~$ËÙÑÉt¶ÊÛédyphpqrcode/cache/frame_22.png0000644000175000017500000000034211432665120015234 0ustar thijsthijs‰PNG  IHDRiiLŸyPLTEÿÿÿ¥ÙŸÝ—IDATxœc`ü00Ô"qï30¸"¸.¢pÿ‚¹ìPô/¬·Šþõ2†"€Ã„ìÿÿ zAÜÿÈ,‹Ì²êþeo`ø^ò†¯õÿÃÿÆ,šÞAâ£Á);Îô‘ gjÉÊ¢r/£rŸþG +ÔdüÎH%0HÖU¯+ªÉhÜZT.# JÂèRŠGIEND®B`‚phpqrcode/cache/frame_23.dat0000644000175000017500000000041011432665120015215 0ustar thijsthijsxÚíšA à E³öÖfo 7Ñ›U) %M!ΔÂûYu(<šð“sK²“Tœ›Ó É&§IÚ\i+¥Ðª™(m®´FQ¡¹¯h±æöüèv~n1„oÏ]sëçÖï¤_ÞŸÊ3`î_w2õȹ•lc[¼•;·Ûc֟ˤ’Nóª4Üpà 7ÜpÃímTÿ¸œ›‘ÝêrÞiñä_ƒç¿pS=7Þ7Üpà 7ÜpÃ>IŸ¤Oò-Á 7Üpà 7ú$}’>É·7Üpà ·tss‰Órs §åVÍÎÜÆ÷’mýï¡Ò¹ò‡Þñ}R~7ôà&¾÷º?7ùÞýÔ¦Iïbhâ{æ»<ÀMi-phpqrcode/cache/frame_23.png0000644000175000017500000000033411432665120015236 0ustar thijsthijs‰PNG  IHDRmm‘6}PLTEÿÿÿ¥ÙŸÝ‘IDATxœc`ü_j‘¸W?0¸"q  pÏ‚¹ê¡( Ôû½ŠÞ~`` E€†ÿH²ÿ0üEÒ äþG`Ydî—…U0Àƒ„*¾ÖÿG Y4½ƒÄGƒSv4œé#;ÎÔ’mEåFåŠþG +Ô–üÈáŒ\ze]Qõº¢šŒÆ­Eå2¢p‹˜Çû•ÙOIEND®B`‚phpqrcode/cache/frame_24.dat0000644000175000017500000000043711432665120015227 0ustar thijsthijsxÚí›Aƒ E»öÖMX0;¸ÜnVP4ÚHSS»xßU3±/O´ý LiJ4ž±Vâ JCŠ%ý‰6VR&ÃÞD‘BœHjDù‚JÏ??™¯êBl­cDZñ½§'óU­ëXïUïÞ0æÃywÍį÷j¬é똳€3Å›¾ë˜cj†ù£{¨¥½:GqÄGÿÝñøŸûÚ°N†v;¹¶ç¬“J ‡ÄÐ<û‡É]ŽêëÈóˆ#Ž8âˆ#Ž8âH'§“ÓÉùÍÁGqÄGéätr:9Ï#Ž8âˆ#Ž8âØ“h­ˆ¯NÔt”Œ´Ö_ÝØ>t¹eëìS­¯¦æžù^\g¯õÎQe?ùvuöÌoïÕ;ˆï>ìˆ*ïwlò×mÑphpqrcode/cache/frame_24.png0000644000175000017500000000036211432665120015240 0ustar thijsthijs‰PNG  IHDRqqذޓPLTEÿÿÿ¥ÙŸÝ§IDATxœí•± Â0EÏc°J@(35Ud¯–Q¥ DY!MDcës¸Éù3Aä KOOß’ÿ3HgyñÓ@|(ÜS@ÚCÉ?€g@‘4ïŽfô~DÉ6¯ŒjНøß¼6³ô³‹¢Í-ý]¢Ìw@ÏܧOÏùµ½ï×ý¶Ÿuûm?ßõWâñÔ/õ¯ÿSµû¿¼½§¼§û™;bWó DHØ×‘IEND®B`‚phpqrcode/cache/frame_25.dat0000644000175000017500000000042611432665120015226 0ustar thijsthijsxÚíÛA à …á¬së‚‹™]rƒx½Y51mMÈBG ÿ¸*Sx|Ua5Ƶ‚Z—Š„-,Ž1ä²HÑPÒRj–šX5§®i†©’áG©>W¥ŽžRïöÕ/Ëâ+uT廯å Ïӯ嗴ªuæÏ¥Ú[Sía£[kví÷5•+5n§Á´JêÜ%+V¬X±bÅŠõ߬u'Á±þÔû SRýå÷štzZ»ì+÷+V¬X±bÅŠ•ٟٟٟûŠ+V¬X±bÅÊìÏìÏìÏ}ÅŠ+V¬X±ö±ª¤¥ÖVI©¢ÖÖ‘+k«qÿ[úËtŽ·oVZÍþvoNV³wÇ}µ{³r<ýR­Þ"RÍÞ]ê W«r}phpqrcode/cache/frame_25.png0000644000175000017500000000036211432665120015241 0ustar thijsthijs‰PNG  IHDRuuJÊ<ÿPLTEÿÿÿ¥ÙŸÝ§IDATxœí•!Â@Eÿ*loÀiö$4HŽAMÓ“p²„+¬iŠ`ó;TÍ EIvÜËËßdç‹A šÐj¢æse9ÏüZ“+òDÞ«w>?ȃÙ'„ZÍ ö|"ë¼0ÍÌÞpñßùÔ©ý¦c§ö?6„÷䎼HߟÞç—ö¿÷¥ŸeûÒÏoýÆñÕñ‘n¿nÿrßL?æ>‰.Ýûž[ÇÁòÂN ô±1IEND®B`‚phpqrcode/cache/frame_26.dat0000644000175000017500000000045011432665120015224 0ustar thijsthijsxÚí›A à E³öÖ…,t§7ˆ7Ñ›U E)i7ï»*~cÃüÅÄXÖEBÆè°FC–˜³6¡:&çL,å¬Mv.ŽÂÎæKgŸÕ¸ãYMç>ŸÎí>ûmÛš·?ª•vô¹¾mg?ßÒ±Îþ³æÎ·ªd˜“Cµ¹U¦ÏIk•ÚÚE\ÕÙMs†f˜a†f˜a>œ[sÓˆ9쬩ެ8böËî”]ßöLgÉÝÁ›³è¾äEo‚ w1phpqrcode/cache/frame_26.png0000644000175000017500000000036411432665120015244 0ustar thijsthijs‰PNG  IHDRyy'4 PLTEÿÿÿ¥ÙŸÝ©IDATxœc`üþ``¨EøÏÀàŠ,ð/MàDàCýÿÿì`êßE°ßå`êÏ}ÆPdàÀÀðYÅÿÿ ‘Í üG`¨£*¨†$R˜²70Ã)Ô˾Öÿ¢ÿáÿ!f Zߎ,£q;|UŒÆíPU¡‰.àŒ.Ðû=^ÐcŽñ?ZÜ¢Ô¦ ®èf¸¢Û‚!P‹.Àˆ&B3í•ê"ÜÙIEND®B`‚phpqrcode/cache/frame_27.dat0000644000175000017500000000043411432665120015227 0ustar thijsthijsxÚíÛAƒ …᮹uÌNn7›MZkR\ü㪙&/_Pã,&ç¹’}h•IKh69ÕÒLçRK-éU®k¯ésêˆtw>=Öº´';ûñ¹ÇB¼´·¤·so÷¼Ÿ>_1”ëâžßó©•ž½Ôjì\Þê{)ÛÊ,?§Çjé~h:vìØ±cÇŽ;vìÿ¦÷øf?Õ3½æ•S½–þÙ±wûÐsçyÇŽ;vìØ±cÇŽ9Ž9Ž9Žç;vìØ±cÇŽ;ssssï:ìØ±cÇŽ;ö»Ú8'2Ê.%^d–^뻽ï÷üº®õ2Ëä;¡}ç8ýÝÀ]}/r{îú;¡Û{~tºö.ð.]}zS/¡‚{Õphpqrcode/cache/frame_27.png0000644000175000017500000000035511432665120015245 0ustar thijsthijs‰PNG  IHDR}}µNþfPLTEÿÿÿ¥ÙŸÝ¢IDATxœí•;Â0DÇm.åâ(¤‰|&’#ÐÑ"¹AÐDƒãÄRfCøx›‰žž6²¦X8.çtÎ^Àµ1`˜À†Œ!GßäGòrôn¿œ@1øÀ ; Îd¨ÆŒ¹-æÊJ´¸¥¯Yâ…±Úñ±¯ý/£vû»Fíö[“[ Æóª½ÓÜxÕ¥[½ÈÉðv‡·YÎgÀêfoéÛÓ0IEND®B`‚phpqrcode/cache/frame_28.dat0000644000175000017500000000047611432665120015236 0ustar thijsthijsxÚíœAƒ E]{ë&.fvr¹ ܬ h$Át£ŒiÞwÕI,?/@ç/¦1® ÓÐS¢¶…ãCVošl+'™@w’¬+[9PýéÀg5Þ½§.rvÐÞ~Y–æ7ÞR¯öA9 n®¿¤gvóSuwœ…PÔ—AÒ¾ð8­rSß}4ÛÇy0SqàÌÀ0€ `ð&­ßð§ûƒ£>^õ1O÷HG½8ð þâÍ›ëoa`¾¸`À0€ È äòy;0€ `È äòw" `À0 /È äîDÀ0€ þ“¨ˆ¨%ÕäAM$*îù~ð²OÜG-?f½r¼˜ùî—lf}+&óÎç}`3ó}> op`1û_90ùÿƒ“¾öø'…phpqrcode/cache/frame_28.png0000644000175000017500000000035211432665120015243 0ustar thijsthijs‰PNG  IHDRÝnKPLTEÿÿÿ¥ÙŸÝŸIDATxœí–± ƒ0E¿+†a @… Ùk¥Ë L@•>M”&ðÜÄw—°âÓUOOq¿1óÙ¯À,Èk¼ \4ÙûDšlû”3}÷Èqƒ˜ pȈMæ|Õ$G‘ÿqîAܧ‰xqÃ)â82Û_ŽÍ9ÿ¿—èÔ¾Êrj_e9µ¯ó8CZCn4w6]8ê¾ä[âp¼Éñæ[–̆8MÞ¨šºŽ.qIEND®B`‚phpqrcode/cache/frame_29.dat0000644000175000017500000000046511432665120015235 0ustar thijsthijsxÚíÜAƒ …a×Þº ‹™Ü@n7+*¶šÖÚ4‘!Í?®Jšðò ³”抮«]ª—ÉSŸâTf)–ÙsŠIÂ"…È”bžÝ0…Š|•"LuÙ¸î,Ž×EÇ1\6®*ÏuQÞ?¼>aÌÏ…ãþñŽÄRõ-r­“÷n.ïꯋ\®T¿ü:Ó*)|)°À ,°À ,þÑâêóåéx_ã¬}:^R„ƒUoÉ¢‰uÁ~ÁÞ‰X`XÐÐÐа_`X`XÐÐа_`X`XÐÐÐаwbX`¿¥PUõö)DÔÞ"cÈ{‹zçÎõ3ê›é<}¸ó¡^?b÷mÿÎÂìžƒíº°»óaûŽ´’Âê.] ³{Q6uáT,9phpqrcode/cache/frame_29.png0000644000175000017500000000035011432665120015242 0ustar thijsthijs‰PNG  IHDR……O©PLTEÿÿÿ¥ÙŸÝIDATxœc`üŽ00Ô¢ŠýÀàŠ*òU]ä.XäC=]™ó½Î~`` E! ÿQÕüÿÁðÕ È4Vƒ&2ª†T5È B ÈB _ëÿ£ lj0Íü~ŠjFãkh©¯¡¥f4¾E k ÑÿáŒÀ¶ Z|¡µI€j\1ÌqŰ S¤C„]mÌTƒ(¼IEND®B`‚phpqrcode/cache/frame_3.dat0000644000175000017500000000017411432665120015142 0ustar thijsthijsxÚí“Á À E{vë&  à&°Y+¢b¤öÐkŸ'yù‘¤¿ÌÁa :äÀTXlÞ¶$W+Óvû®îœ¢9}gRæ¬@H0YPB½ÆÃEmÚÚ?ûœÍ±ísœÖ"bµìt2cnÖé†É:½ﺭë;¿Y§“ÃzÿQã«7¿Ôphpqrcode/cache/frame_3.png0000644000175000017500000000022311432665120015151 0ustar thijsthijs‰PNG  IHDRl]õLPLTEÿÿÿ¥ÙŸÝHIDATxœc`üÿ‡¡öÿß ®ÿÿ `1ÆÐ†ÿÿÿÿ`ø "Èf}¨`ø_ÿ½‚ñÿ×  É@–+HÌ$ &jA#)Â_lšˆÎIEND®B`‚phpqrcode/cache/frame_30.dat0000644000175000017500000000050411432665120015217 0ustar thijsthijsxÚíÜAƒ …a×ܺ f'7›ÈÍŠ‚VteÒþãª!6/_0›‰q­Ù%Næ š8/¥•ÄIJ’¤$‹ˆªIN œ$›\' K5ß¾s¥NÒÞ'a𦓽qEÄ}öIùvüX?aJÏèϽ+~ÿvæR:&©¶Æ®å­Î>IeK™üsÔ«$ñÝ$ÁL0Á“4iÝžºŸì+æìFõÔm_)IB#I8}÷++½™t³O8O8c1ÁL0ÁL0¡¤¤ä<ÁL0ÁL0Áz@z@z@ÎL0ÁL0ÁL0¡¤¤ä<ÁL0ÁL0ùuqâœô`’‚ˆH&K9ÿÔ þân¿Px©÷;ñd&Ìó= î¬ÊDuþÉqŸè΄9~;=%ÑœT%Q§t¨7ÿw0åphpqrcode/cache/frame_30.png0000644000175000017500000000037711432665120015243 0ustar thijsthijs‰PNG  IHDR‰‰"ꉊPLTEÿÿÿ¥ÙŸÝ´IDATxœí–± Â0E/ʬB“(PD•1REñ.L”(+Ð š8'ˆâ|a_e==ÝÉ÷›“ Uþ 2h´t"Md Z>¨†+Væ«·ù§:ñÒÒÄAš8üý-+mTíÎÎbl°Ál°ÁlèštMº&]“³l°Ál°Áº&]“®I×ä¼Ál°Ál°Áº&]“®Éyƒ 6Ø`ƒ 6Ø`ƒÍÝi¬uy´ØXWòè±Éi¬²\t†ýz•—Š>•.î”z¾kÊß t²¿7©ß7òwJõÏ”¶4Òw‘ÒˆßÓÖÍ85‰phpqrcode/cache/frame_31.png0000644000175000017500000000040411432665120015233 0ustar thijsthijs‰PNG  IHDR°kæPLTEÿÿÿ¥ÙŸÝ¹IDATxœí–± Â0E/m6`6Q2nP†b‚”””ˆ ÜXIëq Qøl*D|rõôt–ý›/ éL"ƒî^V]ÛÈwLKX@§ö¹kèˆ7Ø«g/Í&µÆb”hv)ÂÎ˲¨Z_[úñÉß{'O’Ðà$tè‰;ØÂBÑ*ìú‰7VëjÚs²jÚs²jÚÿaõ9:æ('”ç¨Ï¦m[šZ¶Ëy—5>½±€l{Td;&ãœn•†!¢IEND®B`‚phpqrcode/cache/frame_32.dat0000644000175000017500000000051111432665120015217 0ustar thijsthijsxÚíÜÁ „ …áÖ¾õ€‹ë.ß ßDßl¬, ¦šMz‰ÿ6›†Ã‡ gcJËD;ô'.®A’IqžÞ‰ÄI,Ir¢Y¨»‘ËFk%‰DþOæy|EDªD×û(LÓ_YÊ>*ßš?aÊOƒ¿k±L_£<[c—ñ¶ï>Êc˘õuÔLIäÕ%Â#Œ0Â#Œ0Â#ŒÞotÑ¢šõµ}ÅÜ4Ífv_)‰ÂE¢pú¬h5R·88³1Â#Œ0Â#Œ0¢ÓÒié´tZÎ#Œ0Â#Œ0Â#Œ0¢ÓÒié´tZÎ#Œ0Â#Œ0Â#Œ0¢ÓÒié´tZÎlŒ0Â#Œ0£÷9q"¢ÉHÜœH™Qþµï"ÛÕL5}-ÝÜY×¾Óê¸kì`¤â>¶z鸳®þÖ4&Òp÷á!‘Šû!«ù`¿:5phpqrcode/cache/frame_32.png0000644000175000017500000000040611432665120015236 0ustar thijsthijs‰PNG  IHDR‘‘ùÈ`PLTEÿÿÿ¥ÙŸÝ»IDATxœí–± Â0E/•Ç` J D…2F*oÂ,Œ@A‰² ¢‰y\>›>Bç*yz:ËúW|iÈOZŠ {"+ÃÆMÉø°'¸õŒ 8¿çup…GO i¶æè½X(ÉÎSf¯ýz–¹7OSÍó Q4ý|º(we;¸€~¥Vê^mÞœÞëžï{¿=ß÷|þßÛWرÂÖTrëË|§k÷ èêý4IJÇRg¶OÌöge/†`û"Ñ}RIEND®B`‚phpqrcode/cache/frame_33.dat0000644000175000017500000000052711432665120015227 0ustar thijsthijsxÚíÜAƒ …a×Þº‰‹™Ü@n7+*L++ÓæŸ®óò‰ÌbbÜ*LCï‘°‡‰c k™H¥rš”j•²J5Yíi~0•_«òŒû×TÊTõ}å—e©>ýö5‘b_åwÐÍŸ?¿¤ßìæ§ÖÜù†\ý­RaÆi+7õßW©¦\ãþwLUNåL¦Â +¬°Â +¬°Âêÿ­jßÒO·ŸkcëÞñôç\Ë©|%•o<á‹k–­Lî+Î+Îv¬°Â +¬°Â +¬°ÂŠ>}ú ô8¯°Â +¬°Â +¬°Â +ú ôè3Ðgà¼Â +¬°Â +¬°Â +¬è3Ðg Ï@Ÿó +¬°Â +¬°Â +¬°:R‰¨ªX³ÚB‰9«”IÔ=çkÞ±o/SwçØ˜™Ù¯Ï`g¶áÅÊÌÈr_Ù™™Y¾ƒVSY™ÅzIefnmQoz >áphpqrcode/cache/frame_33.png0000644000175000017500000000037511432665120015244 0ustar thijsthijs‰PNG  IHDR••kl* PLTEÿÿÿ¥ÙŸÝ²IDATxœí–1 Â@EÿV¶¹”7P<ŠÛHŽày<€¥G°´Ÿ&$…ò€,df,‹YC>Y–ÿ‹BsîÀÁj7ÁÚj—î&=¹jãÚÍûFýÙ·1ÊÖœ @ËqÂÃîSÍ^û✖Ü÷9uaé‡T¨[K߯С§~ܱ˜‹öýÓ{“˼$÷;.ó’\æ%¹O¹s ídûäìoƒBŸ×c•s}WªïÅzo¤¹ž­šë㜞"€û-öÁ›IEND®B`‚phpqrcode/cache/frame_34.dat0000644000175000017500000000051311432665120015223 0ustar thijsthijsxÚíÜ1Žƒ0ÐÔÜz% Ü…à›˜›­ NR’¥‚Yé Uä_O6ÈSÌmm5kû¬ÍñþþÉS}N\_g³´ŠaVë¨ë5ö1öY­¾U·þ¼ßÂUK6†MÆŒ3f̘1cÆŒ3fQ’}§<´Ö]q?´Ö’å/ÿ¼h-ºYØ}æ}æÀŒ3f̘1cÆŒ3} } } } ï3f̘1cÆŒ3f̘1Ó×Ð×Ð×Ð×ð>cÆŒ3f̘1cÆŒ3} } } } ßf̘1cÆŒ3fÌþÙ†ZÍRJ5\P³ú|6»î¾ù9ùîŽ>ÿ1Ó÷º¾F¬Y«;³Pói·û,ÖLßíÙŒœ,Òìè]²Pó¶7õ xCphpqrcode/cache/frame_34.png0000644000175000017500000000040011432665120015232 0ustar thijsthijs‰PNG  IHDR™™’ ùPLTEÿÿÿ¥ÙŸÝµIDATxœí—± AEÿE–`;&` †–a${íXÄ-؉‰˜¨ßdeÙ?gt(Âlòáñ˜ãØÌ¢csG`ßÂÛXŠyr W/8#Ï©„™6sG^Ó;òÌnÝž@1ÙãÞÎ4(/¦À0ÿÔ¬.¼Dª%z\rlÈ:FLwæ×þ(Ì_™Ñ¥0§2£KaNeF—Âülœ{ð@ïÞ“ÓÛü¥Kº¥gSöy›©›?G ¼& Ê»#Ã'ž»¥2hBIEND®B`‚phpqrcode/cache/frame_35.dat0000644000175000017500000000052611432665120015230 0ustar thijsthijsxÚíݱnƒ0ÐÌüu%{ VœÔ¦¨ ~‘Î#K¬ WGtgY3÷·(“sž·PK·ÌëÄJ—暪¤[å"¥K«Ý–*`ºÍî<Ý´ÎåëÇt¯÷Ý4ŽãtùzJù{ßÕ{v¸ÿ¼¦±\ Ö‡¯{v®Ç®Ì3T×?fèãì»2}nûz¿…œšnŽ;vìØ±cÇŽ»«Òµê§ë]Ëîuº^ÓM/~ÕxýìBï;Ï;ï vìØ±cÇŽ;vú¬>«Ï곞wìØ±cÇŽ;vìØé³ú¬>«ÏzÞ±cÇŽ;vìØ±c§Ïê³ú¬>ë]ÁŽ;vìØ±cÇNŸÕgõY}ÖóŽ;vìØ±cÇŽÝÓåœÊg›®L k—rJùw»ö½âyîGÈN¶üq&yû>ïlèƒ]¸sµ÷û.Þ™äû{6zºhgáÒ…ûÝ|O‰§phpqrcode/cache/frame_35.png0000644000175000017500000000036311432665120015243 0ustar thijsthijs‰PNG  IHDR”èè•PLTEÿÿÿ¥ÙŸÝ¨IDATxœí—1ƒ0—Š–Oä)ùüÄMÄçÒòŒônnsF4Ü^Úá³¶β¶ñ¡Éú¼Á9âIðÓpÞaœN(3×é”%¢ôéLfNØh¦@ºü0ºùST ª, X¤}•¦9ó‚o¯ÙôÞë4½÷:Mï½NÓ{¿“ù°`kÁ‘þÞ¥#«MÙ&¸wþù‹É;B Æ6!·›7¼Ëäôæ\šW°ýEIEND®B`‚phpqrcode/cache/frame_36.dat0000644000175000017500000000056211432665120015231 0ustar thijsthijsxÚíÝAnƒ0Ь¹u%ön7›Õ …´R0Qß°Š,¢¯'c`xž5µ·H•sš–`s3O÷ —0•„K²’ð.-aJyªÉ‚&Ì¿&ïuxî9#{ãy8Ãðæ?OYÖyX¯å¾ÛãPŽ®?8Îé×kyª˰Ô3XÓ>ªocÍÃRm­fùÙÝÂVM؇OÈ!C† þÃ×'ŒëŸmÖ‘æø)íúçÃu¤&_ŽoÏRRö§)ûË»oy’å#æ¥õÒoK–,Y²dÉ’%K–,õ6ô6ô6ô6¬—,Y²dÉ’%K–,Y²d©·¡·¡·¡·a½dÉ’%K–,Y²dÉ’¥Þ†Þ†Þ†Þ†Þ†õ’%K–,Y²dÉ’%K–zzzzÖK¿=,Y²dÉ’%K–,Yþ•2å4½¢[.!StË<ÇÌm„â/{È혂¯ÐûññòÌ™H½¸g{¼Y†='å8/ãž9s|ÆŸ’2êYHo)Þ+u¨omà÷phpqrcode/cache/frame_37.png0000644000175000017500000000042711432665120015246 0ustar thijsthijs‰PNG  IHDR¥¥寙PLTEÿÿÿ¥ÙŸÝÌIDATxœí—± Â0EÏm6`†`%#P’e*`—ˆ†ÉM”DŸ‹•å>ŹóÓÓÉòýæK€9w‘“¥1ÉÚÒ¡bô‘éH žK`‘/±ç^®ÁpŽùÒ& [s6"°.zì\¥ö “K¨»¿ru ó]¤Ztcó½uµ´ ¢.[éØ!_>¹|îÿþƒ»ß»žwK]ÏŽ»¥®gÇÝR׳ãî;=Sz te{˸cš‡–ÒÔ%=+Õ¬“é8%]O)é…è_ÀËðítÿ=IEND®B`‚phpqrcode/cache/frame_38.dat0000644000175000017500000000054611432665120015235 0ustar thijsthijsxÚíÝAªƒ0ÐŽÝuÁA2«;ÐèÎkü(üg¾Ày•tp9Äï$Ëò™¹Dœ”ò¼\ºe^'tÒ-aIºŠFMšSškÂðIóŤÓ:7®¤|LúkŸNã8N7®œöi}ö‡×Ÿi,Ÿ[W†¿g®Ó´Ì°ë?3ô1÷i™¾N·}}=ÂOM:4“”)S¦L™2eÊ”)S¦L#$½ÿ ôÂJã­þÂJM:}ý]˜•ÖL›Ù§ÎSÿQL™2eÊ”)S¦L™2Õ¡èPt(:Šó”)S¦L™2eÊ”)S¦:ŠE‡¢Cqž2eÊ”)S¦L™2eÊ”©E‡¢CÑ¡8O™2eÊ”)S¦L™2eÊT‡¢CÑ¡èPœ§L™2eÊ”)S¦L™2Ý“¦”sJCIKÖÔ‚iÍ93ônº_Ñò ÿ¾¿ü¼“+R‡û®£“ièû£Žû4ö\Çg¿¥¤‘ïŽ;% }ßaÞnŽ£phpqrcode/cache/frame_38.png0000644000175000017500000000042711432665120015247 0ustar thijsthijs‰PNG  IHDR©©jlPLTEÿÿÿ¥ÙŸÝÌIDATxœí—1 Â@E'UŽ!ÞÄÆ¤Ë#•d¯–XXXŠW°‘4®ßÙe-Âþ‹Ef«Ìçñ™0¿ùÒ ‘‘{‘m®ú—»(?V@ LÀm ó‹Þþ À˜Ç8¨w³ËŸnBÉϽƒLÖN4“þC:{qùÖIŠÆ"'ƒ“»~õÀ8ï¡H¼ð—F—¶T]Ÿ¶T]Ÿ¶T]Ÿ¶Tý }äòÌå5éiáò<'ÚFYªXcTšôËàMÚhؤ ³¦‹¸ ‘_3òŠ:£t™IEND®B`‚phpqrcode/cache/frame_39.dat0000644000175000017500000000062411432665120015233 0ustar thijsthijsxÚíÝAnƒ0Ь¹u%ön7›'"¤ê‚t½a¹‰¾ž,‹þçù:S{‰:9¥érnæiÈiÓšö–rI»ÊƶÍSIYAÚ”Ó¯iÇu¾ÿÞµœ·¶ûûv†áð—ߺ–®;¡ìÛr&ôÝó3ËÓõ»Ï»×úÇ™0•‰k»Ì=dÓ^§oãîÛeÚ2Íícw©bJÚ¾ª´lÙ²eË–-[¶Ÿ`»÷néýö±Ö½·Gúßá±VÒŽ;iÇßþ§µm«Ú·Î[ç-[¶lÙ²eË–-[¶lÙ²VvÊšL¦sÞ²eË–-[¶lÙ²eË–-Û`iõ`§¬éÁô`z0ç-[¶lÙ²eË–-[¶lÙ² –VvÊšL¦sÞ²eË–-[¶lÙ²eË–-Û`iõ`§¬éÁô`z0ç-[¶lÙ²eË–-[¶lÙþ9mNëS‹mJ)çÔU“v±Í}œÎàeŸp¿¾êëç_„ìjæƒ; cö`ñï†{² ïÞv߯¿Óp{&Ô–6ú]œOiÃßsº™oDŸ!Ophpqrcode/cache/frame_39.png0000644000175000017500000000041011432665120015240 0ustar thijsthijs‰PNG  IHDR­­øamPLTEÿÿÿ¥ÙŸÝ½IDATxœí—± 1D7•íý”à᧘Fòu~€…½•æ¸kŽqO,™€…‹I³dx,Éî4cõ¹›‰¼fÛù6Pùù–w@Ne¹ [ï0§²LÙÂXŸƒÅVÒÛeòÍdÑ_Ó>âjÞ9š/¤ÚÎmJ8úRý^”&ÝèÝá—¢ÿ™–E÷¦åAѽiyPtoZý{zäòƒËW’7ŸpWP²4ê4Ë®9Ò¤ë/iÈ,E»Ì27–T¤˜2[wIEND®B`‚phpqrcode/cache/frame_4.dat0000644000175000017500000000020111432665120015132 0ustar thijsthijsxÚí”Á À E=»uÐ pجQ•ØCOMŸ'ÃË$ ³@à¨Ø3e–F©\FNXRyÉØ¾C{‰a8­Ræ Ńa2@ñ圉qküßÉH1ê(£ˆÅ`cç¦j³~Ë0ö¥¿ÃܨÖËÃØ¹nXÿGåÿÄ€phpqrcode/cache/frame_4.png0000644000175000017500000000022511432665120015154 0ustar thijsthijs‰PNG  IHDR!!m*P,PLTEÿÿÿ¥ÙŸÝJIDATxœc`üÿÿCíÿÿ÷\ÿÿ¿ˆJBÄCCþAÃ_0IS6;]ÿ¿¼è¶ð€lW°¸+X „¬“Œ 6œ~Ë´ÆãúIEND®B`‚phpqrcode/cache/frame_40.dat0000644000175000017500000000062611432665120015225 0ustar thijsthijsxÚíÝAŠƒ@Ь½õ€‹îÞ@o¢7“˜`“Qfeºä•«PA>¦ÀÚôã°<]ßÕÐëß³bZ«nã¥^A›öQ}[÷9^ª]«yþìnajM܇K̘1cÆŒ3f̘1ã¸Æ{ßW5}ç½{ÍÑ7lMßÒïÞšxÜI<¼áK½¨Æáαyl3f̘1cÆŒ3f̘1ã«Û»Ù»={·“αyl3f̘1cÆŒ3f̘1ã«Û»Ù»={·“αyl3f̘1cÆŒ3f̘1ã«Û»Ù»={·“αyl3f̘1cÆŒ3f̘1ã«Û»Ù»={·“αyl3f̘1cÆŒ3f̘ñ÷çœSÊ‘ŒÓ’7¥HÆKÞ¼g\ç¾âuõßÏ_ÿªr'4Ü[çÞ-Æ]›…qˆûL·ç8ƱÛY1q„»‹Ä!î—ÞÔ/(%ûphpqrcode/cache/frame_40.png0000644000175000017500000000041311432665120015233 0ustar thijsthijs‰PNG  IHDR±±±çΆPLTEÿÿÿ¥ÙŸÝÀIDATxœí˜A Â0EV9CoãÆ¸.=FWÒ\Ç[ô =‰nÄUg ‚%¶aB!åñæo&HR¯eÎŒŸ€=ã3çÏÃÊo£HÞlóZÿ¡ÃçfõÓ‘¬ Ä)XX}åä8oŸòðÛôµus¶¿ÎÃPpE?ée³ù¾WÿW÷ ÿ¿üÈgø-û‘Ïð[ö#Ÿá·ìG>Ãÿ¦ß9üêð ›-?NÞ’ð|²yÜ|:¿çBç};ÇÙ{‚qöþ ü…ÏÒzqyÛIEND®B`‚phpqrcode/cache/frame_5.dat0000644000175000017500000000020311432665120015135 0ustar thijsthijsxÚí”1À E½u 7ЛÀÍZµ‡|N†—üD B0@R$l,-™>VKZ[<ýØÚz—qÆŽ¨ØYJ&ƒiåš‚‹ZyË:Y'ë¯YµÁVÿ&—e•RÄ"§sj©Ýrþö+Ëé‰ù.·MÆŽ»–Ó9ÓòzµsŽ”É,phpqrcode/cache/frame_5.png0000644000175000017500000000022611432665120015156 0ustar thijsthijs‰PNG  IHDR%%ÿP²@PLTEÿÿÿ¥ÙŸÝKIDATxœc`üÿÿCíÿÿ?0¸I"ÎÂÀð~0ü“ÂþPÁð¿þÿ÷  ›¿V€Üd»‚Å]Áj d-˜d‘B›¢×ê¸ÚIEND®B`‚phpqrcode/cache/frame_6.dat0000644000175000017500000000020411432665120015137 0ustar thijsthijsxÚí•1À E;{ë&@o€7›µ"jÄM:øœL^~`ù0 ‡USajVã6KâÜã#syNÝ=EãõÝI±3•BÓ%Ôo<\ÔLËæÎÜ™;ó™¹ f«ˆÓ2±šìtrÆÜL§ë™NŽ9Ý¦í»¿1N¦w¤ìÍØphpqrcode/cache/frame_6.png0000644000175000017500000000022711432665120015160 0ustar thijsthijs‰PNG  IHDR))’®’µPLTEÿÿÿ¥ÙŸÝLIDATxœc`üÿÿÿ†Z uŸÁH]D§ rŒ¡¡¡ ÿA á/„ò\!r®•PªB1‚)E/ÊÐBr¶IEND®B`‚phpqrcode/cache/frame_7.dat0000644000175000017500000000030411432665120015141 0ustar thijsthijsxÚí•A„ E]sëIXÐÜn7›‚Õ)ŒµàÊ…ŸUãËOm~Úœ«’]$9iƒ²É©è’—ˆBº8ët¥†h¸¤cÑQACÿ÷C‘ý%ë›fâ×ß‹«ý1“D’½Q;dl•·rß(K2[¹.C"ÚOѯ÷s½û\ˆµ9ËœX»¯B}Ç{ªï7'Oõƈ zÔ·3€õ´î½åœìëó3”Á|rÓä|ë·¡ñVïï[¿i|&³´v‹Z½óL_»È.’phpqrcode/cache/frame_7.png0000644000175000017500000000027511432665120015164 0ustar thijsthijs‰PNG  IHDR--ÔpÙPLTEÿÿÿ¥ÙŸÝrIDATxœ¥Á € —hФ{àcîie–âÓ„‡D?æÜ㌠À>&“%l@PÕXˆ£"bÇn¨²Ev—<!ç<JÓ;Bí˜u Z¦à¦  óÛ× .4Çê˜Õßô… }Ï~KKÞ%¿ùaq„ŽèqèÜ5[IEND®B`‚phpqrcode/cache/frame_8.dat0000644000175000017500000000031111432665120015140 0ustar thijsthijsxÚí–AÄ E»öÖ“¸Ð]½ÞDo6ˆ´Á©ƒØµßU)/? ”‚ÊöäœÏ-±˜’«f„÷@´L ªÃÔ ÌTnB¤ª®NŒêH1FNx$¨êU8ùIN w¯2Iö]‰Æ¢‚•ëY’iŸç¡a™ØÛcFphpqrcode/cache/frame_8.png0000644000175000017500000000031411432665120015157 0ustar thijsthijs‰PNG  IHDR11IRÓ_PLTEÿÿÿ¥ÙŸÝIDATxœµ± ƒ0DÏU¦@Y…Ƥ@)ƒ Ù0OÆ`V AipŽûñGLÀ5OO÷¥³Œ@¥Faï(þ^ÎÙ¸?9[_–²¡StO9™Q¬ùyå]¾&í=2¾IûCÆ–JÏ÷åg×þÇ99úžïÖ÷Ø™Gï£ßŸ¡òý×à;IEND®B`‚phpqrcode/cache/frame_9.dat0000644000175000017500000000031611432665120015146 0ustar thijsthijsxÚí–A„ E]sëIX´;¹Ün6ª¡0+>+›¾ü”Xý!Dy½õ„>5ü!…D¥n¢' ‘ŠÝv)wè>×EÕçrÖÚÅsñš½<ÎÒù©™ë=«ïE:›•Ž2º?I³TzÜ·!1e¦¨åµ¼ÞêUÛ¥fM=ím³Æ”«t4jÿxM͵ÞåõN/ʈ8êE ŒzBØÝ«½_çoý3´Ëá!³µ¿òlSx‰sT>—<³åw8KI³hA‰so¦/³â7êphpqrcode/cache/frame_9.png0000644000175000017500000000030711432665120015162 0ustar thijsthijs‰PNG  IHDR55Û(13PLTEÿÿÿ¥ÙŸÝ|IDATxœ½± €PCó+[Wp˜¿â(ÚÈʼn,ítá7¢Ä»óÄ Ló9¸Š`PNQ¹•gcÁµÔ¼ãšQ P=O\š i2Ï?}Nò?÷8’ô9zì‰-÷Ï¿ù_}*çèÜèÿ½ìmýlOñÑóè÷/gxx €HŠˆ[@$IEND®B`‚phpqrcode/cache/mask_0/0000755000175000017500000000000011453417102014302 5ustar thijsthijsphpqrcode/cache/mask_0/mask_101_0.dat0000644000175000017500000000023511432665114016534 0ustar thijsthijsxÚíÚ1À …áÓÀý/×ÉFSÛ4•Ç`ÜXÈ%0èÞ"’O&+Ó*[[V³/-«Ù©EJKTÜKWÆoëz¬Õ”–Á‚ ,¿´¨få™µÄ ŸÅòÍB¿`Á‚ vvvz ,X°°Ã°Ã°ÃÐûX°`Á’lÑ}T,Ež,©³Rý‡d°8–u‹àyE¿ì`9¦ä phpqrcode/cache/mask_0/mask_105_0.dat0000644000175000017500000000024211432665114016536 0ustar thijsthijsxÚíÚA € À»¯Ñÿ®SQ”Pà ÕèÍË2¤¹k]G ÌÝ(Ñ v™ôS/þÙú-SÏùlýÒiS›õvQ%´çγ¬¹ñ(&&&&¦¨)y?më¥{_޼s™Æ˜œ'&&&&&&}O7Ò÷œ'&&&&&&}OßÓ÷ü#˜˜˜˜˜^gÊ>Ö:˜&õM1ã ÕÁT™Fšb{¯Î:O_2-Nv+[phpqrcode/cache/mask_0/mask_109_0.dat0000644000175000017500000000024111432665114016541 0ustar thijsthijsxÚíÚ= €0 н§iï9'Åb‡$ ¾tËýáÚû^#iª¥Ëi?³ÅôÛbúK[AUØF徯µÄ³x]mŸ]2Ž-Ä–KŽ~ ÏVw}¶X›ûÆÆÆÆÆÆÆ&O²É“Þ666666yRž”'½%lllll/´åhœl…Ãîm ¹¤êádël™¶´3Ù+ïÛmÍ«phpqrcode/cache/mask_0/mask_113_0.dat0000644000175000017500000000025311432665114016537 0ustar thijsthijsxÚíÚ; …0Ð>«Iö¿9+Eñƒ‚sá=ϤL1Ì„[¤÷¹FáZU‹4‡?i<ÿç;7çòç;‡ÆP¥Œ#ýW-[ñݯ6÷µddddddüc",;í"¼Ÿskæ‘‘‘‘‘‘‘‘Q&—Éerw######£L.¯Êäæ‘‘‘‘‘‘‘±Ð˜y¼1†^˲\òîÆØ3Æâ³ÚÓóøÏÆ ‘Ñvphpqrcode/cache/mask_0/mask_117_0.dat0000644000175000017500000000025211432665114016542 0ustar thijsthijsxÚíÚA „0 Ð}OÓÞÿr³R,#3öñ¥Ë,âÃþ¢½o5ŸCµØÐq:õõÖ;;¬wvN­ÁJZGÅ=Œm»û}Úö ѱ¬¬¬¬¬¬¬¬µ¦2âÞi‹RïïkÆj_YYYYYYYYeÙ_ö·¯¬¬¬¬¬¬¬¬²¿ì/ûÛWVVVVVVÖkîáýd-úϺ,#¦ßÀOÖÎZc]|‡{ž¾Áúˆ­$™phpqrcode/cache/mask_0/mask_121_0.dat0000644000175000017500000000026511432665114016541 0ustar thijsthijsxÚíÛ1„ ОÓÀý/·•w YMüSø Ä8>2SÐûÖF O­EÓÈÌÓc«W\ûÛ¼š‹{c§æpK›GÕžB·ÐšþímûŽxhfffffffæ/s2ÛÇÚ2W|*÷d®1ÛÏÌÌÌÌÌÌÌÌÌê*5³ºÊÆÌÌÌÌÌÌÌ̬®RW©«œaÌÌÌÌÌÌÌÌsöòËÁ\xm~8ß®¸ƒr0wæjsdm÷ªýü&óâyÙphpqrcode/cache/mask_0/mask_125_0.dat0000644000175000017500000000026211432665114016542 0ustar thijsthijsxÚíÛA € н§Ñû_®•‘TH`3AO—L4ü kí£ÍÃ(áÍÛewö›GWÖÙ××.í #ÃÞ2¿û¡} \ëçYú»¤´gggggggggg_d>Ïïµòj^™ÕØsíö;;;;;;;;;;»'ÇÉqö;;;;;;;;;»'˰ËqþuììììììììµÇ_Pì‰Íçö—ÏóYwÄ{eÿš=dÍ×ÌýþGû/ý“¸phpqrcode/cache/mask_0/mask_129_0.dat0000644000175000017500000000030411432665114016543 0ustar thijsthijsxÚíÛ1 Å ÀÞÓèý/—*Ÿ„DøEØ'ÉhgõtÙ-ì}_£pV‹· \"Ìb=sþ—ÁÌå™ó[ƒÐJŒô=8DhÅoàºÛž' 0XÐ ÑüÎÛ´©è‘¬e 0`À€ ˜ôÊ Ì j" 0`ÀÀ¼ Wf`^P0`À€æ½2ó‚šÈ€ ¼Ò óÉôd07(ì“Y‹/XLÿGb…yÁ"êpTphpqrcode/cache/mask_0/mask_137_0.dat0000644000175000017500000000031611432665114016545 0ustar thijsthijsxÚíÜ1„ ОÓÀý/·•+FÉZ?®JšÉ Læ7Ôº¬ØÝ*ÑBÚa%L~šŒË»òä”ÉØéÊ“C“ðJ›´YîIWJ ½™ý.K]ñR˜0a„ “›$ç“ïINTwÎlLža¢Ÿè±L˜0a„ &Ld@PÔO˜0a„ &L˜0‘e@P?a„ &L˜0aÂD”e@ý„ &L˜0aÂäÏM²ŸIlL&)dl˜ígøÃacR™<É$övê,ý„ɺ?U2ç]phpqrcode/cache/mask_0/mask_141_0.dat0000644000175000017500000000032311432665114016536 0ustar thijsthijsxÚíÜ= €0 н§iï9'EÑúÖDx͘%«Iö¿9+EñÇ{ˆõ$åm†ƒ^˜&µŽ§u¼³S"µÍDŒþ6ÚŸ]9ùÉè8ìU“M£“bÔÒ¾£Y¤Òù[ß2拉Ĉ#FŒ1bĈ£Ï%ôµiRNšæ½–Ñ³ì#;›#FŒ1bĈ‘N«¯1Òií#FŒ1bĈ#FŒtZ}‘Nk1bĈ#FŒ1b¤ÓêkŒtZ;›#FŒ1bÄèõFV-ŒÂuè"IoD-Œ*£7uû×jÚ>b´MV“+phpqrcode/cache/mask_0/mask_149_0.dat0000644000175000017500000000033711432665114016553 0ustar thijsthijsxÚíÜA € н§Ñû_®MEQXPà§ž.Ý|94³°ÖeµÁ{³JL¨všŠÕ#«^Ü÷Ïn[õ ß?;µ ZIV-ñ»ÚÄ*wï¸Ë’1*+V¬X±bÅŠ«ßX¥ü·¯g¥ÛwŒèqX}ÇJ½RÛY±bÅŠ+V¬X±beΠwfeΠ^±bÅŠ+V¬X±bÅÊœAïÌÊœA½bÅŠ+V¬X±bÅŠ•9ƒÞÙœÁœA½bÅŠ+V¬X±bÅŠÕl•ó0ÞÎ*0Tßj`?˜öÝΪ²ú¢Õð;Xë«ë=zZr*phpqrcode/cache/mask_0/mask_153_0.dat0000644000175000017500000000033611432665114016545 0ustar thijsthijsxÚíÜ1€ ÐÓÀý/礑h¢&F¾ú`ìÒ¼@I;Pë¼ZÀ^­•XÛÍŒÙmfÏÆ.™=Û5 [if-õœ­R+!wr»Ëœg\j̘1cÆŒ3f̘1cf–Ôo.±2¬?Š1ûž™zæ `ÆŒ3f̘1cÆŒ™¹†™¹†zÆŒ3f̘1cÆŒ3fæztfæê3f̘1cÆŒ3f̘™k˜k03×ð0cÆŒ3f̘1cö³¬Ï9;³ÐÄŽÍö›‰`vf•Ù̆ßÍšZϘß¶W9phpqrcode/cache/mask_0/mask_157_0.dat0000644000175000017500000000034311432665114016547 0ustar thijsthijsxÚíÜA € н§Ñû_®•QRù©§»Y ùkí«…ìÍ*q͵ÓîØ=j7§~ÙnNýÔ.p%Úµäs·i¯ÝÕã.½×ÈöرcÇŽ;vìØ±{Ù.-W¬õ2={êì¾mgÞy+رcÇŽ;vìØÉ³2;yÖ¼cÇŽ;vìØ±cÇNž•ɨɳæ;vìØ±cÇŽ;v2™<ËNžõV°cÇŽ;vìØ±“ge2vò¬yÇŽ;vìØ±cÇî¦]ÞÂ;»àæÆv¹"õÞ]e÷'»˜;[“ç»û{¾|Aµphpqrcode/cache/mask_0/mask_161_0.dat0000644000175000017500000000036111432665114016542 0ustar thijsthijsxÚíÜA € н§Ñû_®U¡”ñÁ§K7ã&ç/ªõ\-hw«DØ+dø±á¼èN^ÎUÿ9y4 ]©†-ý9ìJ,aïð}—³ÞØ2dÈ!ÃÍ ï6×I™ÜÒ2î‡ ÷2Ô}S2dÈ!C† 2d(s0/3”9è‡ 2dÈ!C† 2”9˜—ÊôC† 2dÈ!C† ÊÌË2™ƒ~è›Â!C† 2dÈ!C™ƒy™¡ÌA?dÈ!C† 2dÈpÑ0ó'èƒax3èY/ùãƒae¸Ÿaà»\Óû!Ãõ}ë2äphpqrcode/cache/mask_0/mask_165_0.dat0000644000175000017500000000036611432665114016553 0ustar thijsthijsxÚíÝ; €0À>§Iî9+ÅàDyÁIÊ4Ë ÷5Ö:¯¶W«ÄÙv«dù¢åqñߜܴ<þæd×2x%[¶žËU™%ðÝÞî2×]&K–,Y²dÉ’%Ë¡,S¿Õ—“r2ydÌ=,ÿk©_º{X²dÉ’%K–,Y²d)Û0³”mè—,Y²dÉ’%K–,Y²d)Û0³”mè—,Y²dÉ’%K–,Y²”m˜Çe,eú%K–,Y²dÉ’%K–,eæq–² ýÒÝÃ’%K–,Y²dÉ’å…eî:ËŠ<³Œš!Óÿ¡ÐYV–,ßñ:B¿dù|O¨$*#phpqrcode/cache/mask_0/mask_169_0.dat0000644000175000017500000000036511432665114016556 0ustar thijsthijsxÚíÝ1 €0À>¯Iþÿ9EQÑ=˜¤Ls æä¶IïË{³Zt¡ã´R¦™þ}òÀôï“SÓð•n:ª|§›R[è?î¶Ô_*S¦L™2eÊ”)S¦L™™&ϦëI šê¯O˜2ÕOý£˜2eÊ”)S¦L™2e*C1ïËP˜ÊPôS¦L™2eÊ”)S¦L™ÊPÌû2¦2ý”)S¦L™2eÊ”)S¦Le(æ}¦2ý”)S¦L™2eÊ”)S¦Le(æ}¦2ý”)S¦L™2eÊ”)S¦³iöc7;Ó"…Þ™FͦÞÙ™v¦L Üý^¥Ÿ2}oOäß'rphpqrcode/cache/mask_0/mask_173_0.dat0000644000175000017500000000040511432665114016544 0ustar thijsthijsxÚíÝ1ƒ0ÀÞ¯±ÿÿ¹T ¥ˆ¬[4véæ2ŠØÆ½ok݇ÕÊ;¦Ó²]fûôÖžýdûä½ölj°lGÒÿö0n+œß»m³GŒË–-[¶lÙ²eû"Ûêï·ûY»}o¯öíÀ–íÕVÞÊ[¶lÙ²eË–-[¶lÙ²e«ÓÕ°ÕƒÉ[Ï2¶lÙ²eË–-[¶lÙ²e«ÓÕ°ÕƒÉ[Ï2¶lÙ²eË–-[¶lÙ²e«ÓÕ°ÕƒÉ[¶lÙ²eË–-[¶lÙ²eËV¦«a«“·lÙ²eË–-[¶lÙ²ef[ÿB°“mа÷¶Eû„”;¶N¶-ÛœT¸/r’·lÿ¿?ØÔ*Ñphpqrcode/cache/mask_0/mask_177_0.dat0000644000175000017500000000041011432665114016544 0ustar thijsthijsxÚíÝ1 …0Ð>§Iî9+?вØèß—”iÖ‡ dšÌ¹¯ÕxÖˆxÝNÌø/ÆÕ§|{öظ²ÿöìÖ8d¥¯´ÿø0òhž×=öùcFf̘1cÆŒ3f̘q¼qÂ=ïw6Ê;l·»4cÆ•±<–ÇŒ3f̘1cÆŒ3fÌXï¦Ò»1Ö»ÉcÆŒ3f̘1cÆŒ3fÌXï¦b¬w“ÇŒ3f̘1cÆŒ3f̘±ÞM'ÄXï&å1cÆŒ3f̘1cÆŒ3Ö»é„ônŒõnò˜1cÆŒ3f̘1cÆŒÃ3U<‡ \7í+’Þ(<OÆŒŸ·ÎŠ™–ÇŒßÛÕä4@phpqrcode/cache/mask_0/mask_21_0.dat0000644000175000017500000000006011432665114016451 0ustar thijsthijsxÚ30€C „.l‚H¢4S‹H3× ä2„ªA&M-²epµØ„ƒZ zSáphpqrcode/cache/mask_0/mask_25_0.dat0000644000175000017500000000007111432665114016457 0ustar thijsthijsxÚ30€C(„.\H2tÓƒȳÇ䂩Äzà~Ã`=èa@e=p·à’"GÊÔvÔphpqrcode/cache/mask_0/mask_29_0.dat0000644000175000017500000000007311432665114016465 0ustar thijsthijsxÚ30€C$\ø$‘dL/@™½†x L-VéQ½õÂÃwõb‹#ê…»ÙŸ4%zšGŸäphpqrcode/cache/mask_0/mask_33_0.dat0000644000175000017500000000007611432665114016463 0ustar thijsthijsxÚ30€C4\„ ©4fàÔq‡!ÈSSɨÃÎ xšÁŸÆÀfàJct2îBJ¨a‹åÏphpqrcode/cache/mask_0/mask_37_0.dat0000644000175000017500000000010111432665114016454 0ustar thijsthijsxÚ30€C, ¸ˆQ„¤jК…P×]†D@.˜¼ÊFÍ5k›Ï„óØ,|yhÌ‚ûÑ€eÔ4 iüCphpqrcode/cache/mask_0/mask_41_0.dat0000644000175000017500000000010411432665114016452 0ustar thijsthijsxÚ30€C ¸ˆUˆ¤rȘIÐÆ†DB.˜>‚JGÍ5sÔÌAe&¼, ® ›I¨ `3á~7 V)-ÌDø?ƒphpqrcode/cache/mask_0/mask_45_0.dat0000644000175000017500000000015211432665114016461 0ustar thijsthijsxÚí”1 w^ÿÿœ“F- `")Ò40÷’COEP,¦ú[Ïm-/lGyع{’ÓÅ‹½©ïºäÅNÏF933gÍÙØ•“¤lü; ¶Ù—œx¬bsN6ô„#~¿`79Ñ€†phpqrcode/cache/mask_0/mask_49_0.dat0000644000175000017500000000016011432665114016464 0ustar thijsthijsxÚíÕKÀ EÑ9«ýo®#?H/›6g$Ï-ª­,X] ˜›xݘ;Àð·˜ XÔ°ì9ºˆ<ÜѺ¤åq¤Œ2 Af÷îHð7ø/5We„{Ô#ØáìfÞ¨ÁÐ?à®4û=N >Çæphpqrcode/cache/mask_0/mask_53_0.dat0000644000175000017500000000016111432665114016460 0ustar thijsthijsxÚíÖK @!й«Ñýo®QÑϺ:(m&ܯžs-¹¬®É6õÑZ{¥m4Y†²Xâù®.FÀÙ­‹ê¦XZi·Ðùj=:έ֋bå¿‘VH 8 –#¤[—ù²¾‹ãYвç¾^XÔ÷ephpqrcode/cache/mask_0/mask_57_0.dat0000644000175000017500000000016511432665114016470 0ustar thijsthijsxÚíÖA À À{^“üÿs=YLÕš ( ou¨– j) ¬ª Z7y„ÙëÍñv,Ô´ìwVQ ži»¤ìGiÒ¤¹ÅDfÂÛ•ÉÄwo4ùѤ¹ÐÄoÎLÿÌéLȼÁœ©·›Á³Õì}î4 håphpqrcode/cache/mask_0/mask_61_0.dat0000644000175000017500000000016711432665114016465 0ustar thijsthijsxÚíÖ9 ! Ð>§Iî9+Ř¥˜Q~ìßÇèd®%ÆÕ¹Ã²MÿÌÞ÷Ͷ¶éd*bKæ»»89Îz]T÷ ÅaÆ [±½s­õé8;µþí6þ5ذa/¶ÿ=؉°næZô<Øü–m>sÎÜ÷v“‚Âuphpqrcode/cache/mask_0/mask_65_0.dat0000644000175000017500000000017311432665114016466 0ustar thijsthijsxÚí×AÀ À;¯ÿ®'±­•å`C$›‰ª­,°º(Àn>kxê óèÁj°ì>t<ƒë’–GÐ@ 4üÀ€ÜÕgG^…y§’3I 4”5`Ÿ$gH¼–îêÌÇ´²!pš‡†Á”"$phpqrcode/cache/mask_0/mask_69_0.dat0000644000175000017500000000017611432665114016475 0ustar thijsthijsxÚí×KÀ Ð=§û_®+­mÏBìà’d|Q"s+1®®È"¯),ß=“EÛàa TÄ"çÒÅãnæE-3 ,°ÀKY‹wÝ=ZšZïT Þ.,°ÀK1‹ÿ#Öž!ÅŠ+V¬å¬ª½õöí÷.Ýõ±2¯X±bÅŠ•ÿ¬Ì+V¬X±–²ê.ökBèÞz±·ÔwðƒÕ±¦Ì€gÌkë¡YZýphpqrcode/cache/mask_0/mask_89_0.dat0000644000175000017500000000022411432665114016471 0ustar thijsthijsxÚíÙ1€ …á½§iï9'Œˆ€Ñ×ýËHl?Lšà^"ë&M—™?bî—qÃÜ?˸äÉ,µ9²þó!µ‰z¢]VêÈScÆŒ3æ_š•÷à¾cÓé!î`nÍô3f̘1cÆÌŒ„™ 3f̘1/fÖ>.Uæ¤ÄcóË»;ã ¨2;æ™YÒžÕÏ+™7Þýphpqrcode/cache/mask_0/mask_93_0.dat0000644000175000017500000000023111432665114016462 0ustar thijsthijsxÚíÙK À EÑyV÷¿¹Ž,ÚO¬mÞ rãPHŽ0 {’´š°ôäå2ûbö¨ìýÞc{t¦Qáƒ] {QÞ{“Þ{弬֒¤ÇŽ;vìØ_Ú³ßÕ}ÏÂ÷ýËL€}l§ß±cÇŽ;vì̑̑̑رcÇŽû¢öüÐÎ.LÛæÕegwì3ö´žqe¿ÿѾ@iphpqrcode/cache/mask_0/mask_97_0.dat0000644000175000017500000000022611432665114016472 0ustar thijsthijsxÚíÙA À DÑ}N“Üÿr]Y” ¶šÛþ¸Ì"<40 {©H¼ÙpuÂù<phpqrcode/cache/mask_1/0000755000175000017500000000000011453417102014303 5ustar thijsthijsphpqrcode/cache/mask_1/mask_101_1.dat0000644000175000017500000000017311432665116016541 0ustar thijsthijsxÚíÖ1 À н§‰÷¿\Q÷ªEóþ¢d  1¢¦ÌNô<±#½ËÕ–¯Õ-7u™þ.ÃÓl²Ô¦eiXXXXXRZVíÊVeIo1û,,,,,v%‹?ŒÙgaaaa±÷YÌ K&K=/·œ·+Ûå˱ó²Öò¼ÞŽãphpqrcode/cache/mask_1/mask_105_1.dat0000644000175000017500000000020211432665116016536 0ustar thijsthijsxÚíÖ1€ ÐÝÓ”û_Î¥‡b€÷ KóB¬?"Ó*#WÌʘt€éÍùíügÓŽ“JîéqUM9¸•‡‰‰‰‰©ÔTùêçLLv“¾Ç¤ïÙLLLLLLz“¾gG01111šòy„iåÑߘ–4mð=Õ›n§¥+2phpqrcode/cache/mask_1/mask_109_1.dat0000644000175000017500000000020211432665116016542 0ustar thijsthijsxÚíÖ± À À>Ó˜ý—Kƒ€°•À}“ˆÆ:!£èiY‰™'*3§]fÛsþÛÉÓÒîm¹ºb[ÞJÂÆÆÆÆÆÆ¶Å–ÝKÆ9›}ccccccÓ'u.6ûÆÆÆÆÆÆÆ¦s±é“Þ6666¶R[ÿ^gû{/lÇØÙ·Û Þ7Í‚phpqrcode/cache/mask_1/mask_113_1.dat0000644000175000017500000000021111432665116016535 0ustar thijsthijsxÚíÖ1€ ÀÞ×ÿÿœ -8fL(pBŽlDM™è9";ýÄ-÷ò÷;?1îpâÐ{¼\åÆú%-ŒŒŒŒŒŒ“3:@Ûad4ŒŒŒŒŒŒŒŒú*£NîÍaddddddÔÉÍ#######ã#c]75®ÓåÚã¢Æåæ1ÏxYuñphpqrcode/cache/mask_1/mask_117_1.dat0000644000175000017500000000020611432665116016545 0ustar thijsthijsxÚíÖ» À À>Ó˜ý—Kƒ€ø$ø^’ 8Y–QSV'zž8‘þjzëÌʇ¬™^]Þסµ‡¬õekXYYYYYYYjݵ#¶ +«yeeeeeeeeµ#²²šWVVVVVVVV;"+«yeeeeeeel­'ëe;b»±&²^9¯{­/ÊJ$pphpqrcode/cache/mask_1/mask_121_1.dat0000644000175000017500000000022211432665116016536 0ustar thijsthijsxÚí×1 À н§‰÷¿\— ¥C¡PbÑ—EÁÁ$’DdÆ©ÄÊ•Y»³ÿŸtëÚ…öλ»÷ÏÕÛó0£$ìììììììììì›ì§ûù¹ÆÎ®ÞÙÙÙÙÙÙÙÙÙÙõóììêÝg–a7ÇyëØÙÙÙÙÙÙÙ¯³ç—½Y??ÿØÙ{Õ{ý¾D“phpqrcode/cache/mask_1/mask_129_1.dat0000644000175000017500000000024411432665116016552 0ustar thijsthijsxÚíÛ1 À н§Iî¹.¢Bq+FÚ—¥Å)<ä“ F´Ê£®¨®Ñƒ‡ÁÊåóC t°ùLWáƒÖP– 0`p AÅ|ÐÏ02‘ 0``_0+3°/ÈD 0`À€}Á¬ÌÀ¾ 0`À€ö³2û‚LdÀ€ >nо V/Q2'ö? *Aæ )xS¡phpqrcode/cache/mask_1/mask_133_1.dat0000644000175000017500000000024411432665116016545 0ustar thijsthijsxÚí×1€ ÐÝÓ”û_Î…€“ºh«¼¿h˜šÒ|"zÚÛ‰™-*dNÁâÔâÙó¦H¼‡«QÄ¢ÕR ,X°`ñc‹¬Þ9ÎY°(na_°`Á‚ ,Xè,XØ,X°`Á‚ Þ#:8 ﻓ ,X°`ÁBïdÁ¾`Á‚ ,X|Ï¢Y\X¬Ö;Ç 7-ݹ; `phpqrcode/cache/mask_1/mask_137_1.dat0000644000175000017500000000025511432665116016553 0ustar thijsthijsxÚí×1 €0 ÐÝÓ¤÷¿œKh]D¥‘¾,-t ò#²ÚŒŠQ[T©Ñ “K“s§7_Š›è¤È?9|•B&ÙX›^L˜0a„ÉÂ&3÷“þ„ÉMÌ&L˜0a„ &2 ¼ÃD4c™0a„ &L˜È€òÐŒe„ &L˜0ab·—w˜È€f,&L˜0a„É7&y2¹a²ònßoL˜<01O ˜ì¾ç phpqrcode/cache/mask_1/mask_141_1.dat0000644000175000017500000000026011432665116016542 0ustar thijsthijsxÚí×1 À À>¯9ÿÿ¹4¢6)ƒ3×$`s ²¸uÊ®‰>Wdš¾ ›)›g³•'°±MÂ{3\d6u¹’bذaÆ 6lؼn³û]ÜNذ9ÄFÞ°aÆ 6lذa£3°a#oذaÆ 6lذÑذÑ5e16lذaÆ ]SŸb£kÊ6lذaÆ ›mê—ͤÍß;CûcÃf‘¼IdsG¹ÿphpqrcode/cache/mask_1/mask_145_1.dat0000644000175000017500000000026311432665116016551 0ustar thijsthijsxÚíÜ!€0@Ïk®ÿÿ¦¡ 4a)³qæ2i.YCUO{35²UZÆFŒn]ÏfN>bd£ðwtzJF}ÁFŒ1bĈ#FŒýÆ(¡¯FŒ6r1bĈ#FŒ1ÒE1ÒiÝlFŒ1bĈ#FŒtFŒÜ#FŒ1bĈ#FŒtZ}#÷ˆ#FŒ1bĈÑl£þeôÀHÉùG£µÜ£@£Ù’îphpqrcode/cache/mask_1/mask_149_1.dat0000644000175000017500000000027211432665114016553 0ustar thijsthijsxÚíØ1€ ÐÝÓ”û_Î…ˆƒqÁHÞ_Xšòc‰èi«#Gd̘ŠÕ”Õ›á÷g…¬LUè^Ý®VR«>dKV¬X±bÅŠ+VÛXeùo¿ÎX±ÚÌJ_±bÅŠ+V¬X±bÅÊ;ƒÝ™+}ÅŠ+V¬X±bÅŠ+VöAV¬ô•ngÅŠ+V¬X±bÅŠ•}+ï úŠ+V¬X±bÅŠ«VýËjÒÊ>øhewfõ›•¾*`uTqíphpqrcode/cache/mask_1/mask_153_1.dat0000644000175000017500000000027311432665116016551 0ustar thijsthijsxÚíØ1 €0ÀÞ×\þÿ9›Ãbt³Ešc'›ªÎHHÍ•š9³efßžmff²MïÙíª›õ #.̘1cÆŒ3f̘1cf–Ô7¯3f̘Ùg̘1cÆŒ3f̘1c¦o2cæ]Ã?€3f̘1cÆŒ3fÞ5ôMfÌì3f̘1cÆŒ3f̘1Ó7utfÌì3f̘1cÆŒ3f̘=ÌúËl¡™¾ùj¦£3ûÕÌ>ÛÈì¤ÐVüphpqrcode/cache/mask_1/mask_157_1.dat0000644000175000017500000000030111432665116016545 0ustar thijsthijsxÚí×1 À À>¯9ÿÿ¹4S¦d/Ì5‚Õ1ÈÊVÍ)SkŽJžµ»­vßÜ7´³ÝÞÝíé…ÛÍeGä°cÇŽ;vìØ±c÷²]Z¯¸îÙ±c'ïØ±cÇŽ;vìØ±Ó+رÓgå;vìØ±cÇŽ;}V¯`ÇNÞù+رcÇŽ;vìØé:;vòŽ;vìØ±cÇŽ;½‚;}VÞ±cÇŽ;vìØµ±›'»ÍvzÅ#;Œ]Œ¼klw¯oA`phpqrcode/cache/mask_1/mask_161_1.dat0000644000175000017500000000031211432665116016542 0ustar thijsthijsxÚíØ1€0ÐÝÓÐû_Î…XӨš yi~…ˆ¬Q©bÖÕkvÈp±á³ê7'M u¸Ù=¼]ņÙð([ 2dÈáÏ +þÛ\' 2”‡ 2dÈ!C† 2´s0/3d(½) 2dÈ!C† 24ë1dhç 2dÈ!C† 2dhÖcÈ¡ÊS¦L™2eÊ”)S¦L™2­œMç S¦LÍS¦L™2eÊ”)S¦L™2•Må}¦LÍSS¦L™2eÊ”)S¦LeSyŸ)SóÔÅ”)S¦L™2eÊ”)S;Ù”)S;ó”)S¦L™2eÊ”)S¦v(²)S¦v(æ)S¦L™2eÊ”)S¦íLódºÍT6}a*ï3mljžmzC'phpqrcode/cache/mask_1/mask_173_1.dat0000644000175000017500000000033211432665116016547 0ustar thijsthijsxÚíØ1€ ÐÝÓ”û_Î¥''Ó@y]Xšò1?"g¬:1çŠfn˶ÌöË»ö¬­m¼·¯«»™m.?¶¶lÙ²eË–-ÛF¶«ÿß>glÙ²•·Þ2¶lÙ²eË–-[¶lÙ²e«O`Ë–­¼eË–-[¶lÙ²eË–-[¶lõ lÙ²•·lÙ²eË–-[¶lÙ²eËV¦O`Ë–­¼eË–-[¶lÙ²eË–-[¶z0}[¶z0yË–-[¶lÙ²eË–-[¶E¶ùe[h«OøÍVWö…­¼=Ìötÿ*|phpqrcode/cache/mask_1/mask_177_1.dat0000644000175000017500000000034211432665116016554 0ustar thijsthijsxÚíØ1€ ÀÞ×ÿÿœÍE¨¬Œp0×XÐà„,a#rÚÊ}®¨6}ÇŒ§¿Ùÿ»¶‰±~އ£\Ð8 •ÆŒ3f̘1cÆŒ—7®ðÎ{Ö3f,ÝyŒ3f̘1cÆŒ3fÌX_¡¯`ÌXï&3f̘1cÆŒ3f̘±ÞM_Á˜1cy̘1cÆŒ3f̘1cÆŒë+3f,ÝyŒ3f̘1cÆŒ3fÌX_¡bÌXï&3f̘1cÆŒ3fÌxãü2žd¬¯øÔX'Äx[cy|¨ñ ¸•3ëphpqrcode/cache/mask_1/mask_21_1.dat0000644000175000017500000000005211432665116016456 0ustar thijsthijsxÚ30€C €±¹ °„(­Ô’"J„¹†```ˆ¨ Å ƒI- Sáphpqrcode/cache/mask_1/mask_25_1.dat0000644000175000017500000000006011432665116016461 0ustar thijsthijsxÚ30€C(€ñ¹ p„ ½ô#C‚=P…†`êû„0 —büƒSÂ>vÒphpqrcode/cache/mask_1/mask_29_1.dat0000644000175000017500000000006211432665116016467 0ustar thijsthijsxÚ30€C$ã2À²¥—Y2ì…*6Ä FõÔ w2âh ôë_¼z‹±Ÿâphpqrcode/cache/mask_1/mask_33_1.dat0000644000175000017500000000006511432665114016463 0ustar thijsthijsxÚ30€C4ç2 *‹ÔPA;  q‚Q3†ð4CA,fÍtÿÏphpqrcode/cache/mask_1/mask_37_1.dat0000644000175000017500000000007011432665116016465 0ustar thijsthijsxÚ30€C,&Çe@ @¨¬fQSÜÕdˆŒš5jÖ 7 ž¨‡«Y¤†QfHAphpqrcode/cache/mask_1/mask_41_1.dat0000644000175000017500000000007211432665116016462 0ustar thijsthijsxÚ30€C&Ïe@,@¨*fÒB%Ý ÕhHŒš9j標ƒÊLxY@Å2d¨˜INxm&?phpqrcode/cache/mask_1/mask_45_1.dat0000644000175000017500000000012211432665116016462 0ustar thijsthijsxÚ30€C\À¸ HÕt2•O³i©§»‘œN¢ÙP͆DQ³½Ù„Ò œ?‚ÌM'ô3›PéMm³©•Nˆ)c‡ŠÙToâÌ×Ò€yphpqrcode/cache/mask_1/mask_49_1.dat0000644000175000017500000000012411432665116016470 0ustar thijsthijsxÚ30€C|À¸ Ht·]„JvÐC^ y… ;  FíµƒH;ˆI»p‘nÇhºYvS ÒÆê¦]b먡iMâƒx;£ÃÇÙphpqrcode/cache/mask_1/mask_53_1.dat0000644000175000017500000000012711432665116016466 0ustar thijsthijsxÚ30€CBÀ¸ È]h¦í¢§.‚þBò™vA 1$ ŒÚ5j×·‹Øüµk4ŽÚ5èì"¶µAK»h‘¿Hi »h_¤Ù9Xphpqrcode/cache/mask_1/mask_57_1.dat0000644000175000017500000000013411432665116016470 0ustar thijsthijsxÚ30€Cb€p :…ØD©lç@è$ÊŸH^¥ÀN¨A†$ƒQ;Gíµ“.v’R&ÀEGíMC£vŽÚI%;IiõÑÞNÚ• ¤¶Á†Ÿ4OÒíÁŠhØphpqrcode/cache/mask_1/mask_61_1.dat0000644000175000017500000000013511432665116016464 0ustar thijsthijsxÚ30€CbpPº™ÝØÅi`÷@ê&ÚßH^§Ðn¨a†dQ»Gíµ{ÔnD„ÑTKd¤È©ŒN LkµË¦ˆLsšFuФ«;˜0aJoòܧ^ÃôÄÄŽc„‰›ÉÇ„ ÓöÛ<…éå}òþaün °O~SGæó&phpqrcode/cache/mask_1/mask_77_1.dat0000644000175000017500000000015611432665116016476 0ustar thijsthijsxÚíØ1 …áÝiêþ—³ž(þ7Š4_„6a–gc5Á”©Õ.²õ½Ã{mž«MŸ[stb[.%Á† Û—¶ÕþVV±¹±ñ°aÃÆÌb.0³°aÃöºmõ÷í„ÍCïUüqasyß4¶òõephpqrcode/cache/mask_1/mask_81_1.dat0000644000175000017500000000016211432665116016466 0ustar thijsthijsxÚíØ1 …áÝiêþ—³‰‡6ùßh¨/ š0«É'±ždêôŠ+÷|ý‘1BÅ£>­¼`¬dY0bĈqÓ¨xÛ:F×Fî FŒ12¯™×ÌkŒ1bŒhTüâþ2zš3ª?RŒâÁX;rÜåphpqrcode/cache/mask_1/mask_85_1.dat0000644000175000017500000000016211432665116016472 0ustar thijsthijsxÚíÙ1 À н§‰÷¿\©]‹‰4ðþ˜AA hÄÌØM¬\Q‘µjsë·úAk§U·ûújm‘un2RÃÊÊÊÊÚΚ5·ž:k;«»ÅÊÊÊÊjƲº[¬¬¬¬eoÅí­›[™oð¬ÿ[ÇÎk®õ¨ðZäphpqrcode/cache/mask_1/mask_89_1.dat0000644000175000017500000000017111432665116016476 0ustar thijsthijsxÚíÙ1€ ÐÝÓ”û_Î…‹N…h}%Àƒ@ iDOËHŒ±*cä"æûµ<öØgþâÈ)û§Ñû_.Ä4I‘ìâ‡y킎¢¸`)-5*¥ç(™é£of[Ósm€}åÑÃöý¶õÉö6YM ;;;;;ûG{ô»zÕØ·µ»«ìììììììz1vw•}œ=úwuûìýLÆ%û?û"ç=Ç~e—iphpqrcode/cache/mask_1/mask_97_1.dat0000644000175000017500000000017011432665116016474 0ustar thijsthijsxÚíÙ1 À0н§1÷¿\—ÐtncKÌû«ƒ‰D"‘H$ÊäD™œH$‰D"Q&—WerûH$‰D"ñ±ç*x[±(Ë?/ÚÇ÷ˆ'ŸŠndphpqrcode/cache/mask_2/mask_117_2.dat0000644000175000017500000000017511432665116016554 0ustar thijsthijsxÚíÚ1 À À>¯9ÿÿ¹4!m dOƒs\§0X,laÕ5#¿÷Eª¾>Z[íœÖ·ŽÉêã½ÄR©T*•J¥R?Q-œº«*¯T*•J¥R©º?U÷—W*•J¥R©TÝŸªûË+•J¥R©Ô¤Úùó~m5Õ©;ªòúSõ&+phpqrcode/cache/mask_2/mask_121_2.dat0000644000175000017500000000017711432665116016551 0ustar thijsthijsxÚíÛ1 ! Àþ^ÿÿ9áJAHˆ2!à`ÈF¬%ý×ä6rìî8;ê"WWõ›Gy+d5™L&“ÉdòrÒF&›g2™L&“Éd²\%cå*2™L&“Éd2Ù¦O–«Èd2™L&“É rñï— äÌ}›L6ÏÏÈ"ìÐgphpqrcode/cache/mask_2/mask_125_2.dat0000644000175000017500000000020211432665116016542 0ustar thijsthijsxÚíÛ!À P¿Ó”û_ƒ@ U(Ûkp@^Mú£Ú®5ÕôªúËîòâ-ú‰:ðöVF_žÌ\t:N§Óétú÷õ¼yžN×qt:N§ÓétºG—ãô;N§Óét:.ËÐå8:N§ÓétzA}ÿµ‹ôÔyžN×q¿Ñ;+nŠ&phpqrcode/cache/mask_2/mask_129_2.dat0000644000175000017500000000022111432665116016547 0ustar thijsthijsxÚíÛ1 À0н§Ñû_®KÈVÚ¡¨'.Éôþ!«²¶w]A0XðÄú÷~˜ «ÚÞ  ö!›š€€€€€€à£ fK# x˜Fy€À4È vey€€€€€€€@^°+È ç º~™ž ¨Û L#ÁêveIphpqrcode/cache/mask_2/mask_133_2.dat0000644000175000017500000000022611432665116016547 0ustar thijsthijsxÚíÛ1 À н§‰÷¿œ‹à&´`¢ô…Lâð”üÁˆQ-½g=Aq•bëú¹ŠÊª<‹všb½+©)((((((((ÊIën*…÷­l𠆆fŽÆ„ÓÐÐÐÐÐÐÐÐÐÈš44²& ¬)OÑÈšÞY“FÖ4á444444444c4~œ9S³:3ÐЌטpšÇ®>®phpqrcode/cache/mask_2/mask_145_2.dat0000644000175000017500000000024511432665116016553 0ustar thijsthijsxÚíÜ1 À н§ùÞÿr] Ý,tˆQ^È&ÊCˆð“§ÆÒ~ë щ¢Éj~mɾ¢.ÕåŽFgÑüìMDDDDDDDDDDDÔST™×ˆˆêD¦ŸˆˆˆˆˆˆˆˆˆH¦•ŽˆdZï‘L+¯É´DDDDDDDDDDD2-‘é'"""""""":BÔäת½EåY„ˆ¨Ddú‰¾û† †Šphpqrcode/cache/mask_2/mask_149_2.dat0000644000175000017500000000025611432665116016561 0ustar thijsthijsxÚíÜ;€@ÀÞÓÀý/gcaGÖBXBç'“-ˆ¼Âˆ«²»ouÕ§UQ½dõRVOm¡šTƒÎ*Ç«Ê;;šŠŠŠŠŠŠŠŠŠj¨ªå»ŠªEe2PQQQQQQQQQQQɨ¨ä TTTTTTTTTTTTr»3•œÁ¼¢¢¢¢¢¢¢¢¢¢¢’3ØR©ä &ÕßTsþŒ·»ªk¤¢z_e2P=ê ïd™phpqrcode/cache/mask_2/mask_153_2.dat0000644000175000017500000000026111432665116016550 0ustar thijsthijsxÚíÜ1 €0 ÐÝÓ¤÷¿œ‹8ZP!¿úB¶ÒòèèZuÔÈè³¶"û“ìbuºñö™‹ÈÒ*îÎÆ²é)]MFFFFFFFFFFFFö†¬%= #‹‘™ddddddddddddr ot2¹†yFFFFFFFFFFFF&× #“k‘‘‘‘‘‘‘‘‘‘‘‘É5ÈÈL 2222222222²(YÚµ½7ÉÈ"d¦ÙóÞ@H—phpqrcode/cache/mask_2/mask_157_2.dat0000644000175000017500000000026211432665116016555 0ustar thijsthijsxÚíÜ1 €0À>¯¹üÿs6‚M¹ÎqUH1¤XØ&Uç̘½fÝ/u-çûé'ñíæ.ºû[ÍKGGGGGGGGGG÷H×|NG¨“(ttttttttttú¬NF§ÏÊ;::::::::::}–ŽNŸ¥££££££££££Ózèè$ >«“Ñé³…ŽŽŽŽŽŽŽŽn­ üAø#ºî^AG—§“(t¯ì =3{phpqrcode/cache/mask_2/mask_161_2.dat0000644000175000017500000000027611432665116016555 0ustar thijsthijsxÚíÜ!€0 PÏiºû_3Z±üÂkêÈÈ ¢Y¿ jÖHêKEøca-ϾxôèHSaj…~ÃÑJ¸~C@6†Üm Ã…¦ !!!!!!!!!!!¡ÌPæ@HHHHHHHHHHH(s°/ÊÌCBBBBBBBBBBB™ƒm”Pæ`ÚÊ e„„„„„„„„„„„w„™Aÿ†0g×#$Lš6„ûúv#phpqrcode/cache/mask_2/mask_165_2.dat0000644000175000017500000000030511432665116016552 0ustar thijsthijsxÚíÝ1 €0 ÐÝÓ¤÷¿œ‹Šè ?òBÆVü¥UG¼žµ%åùÐêþ¸åÙ×*“+ú_ŽfÊËs MIIIIIIIIIù–2d;£¤l¨4‰()))))))))))eöqJÙ†IDIIIIIIIIIII)Û ¤”mPRRRRRRRRRRRÊ6lº””² JJJJJJJJJJJJÙ†}œR¶aQRRRRRRRRRRNeòK?R픔͔&åW½3Uphpqrcode/cache/mask_2/mask_169_2.dat0000644000175000017500000000030411432665116016555 0ustar thijsthijsxÚíÝ1 À н§‰÷¿\¡›CqøÑ²YäáÈ_Z5kDöWO‘’.?üq´ë¶ÞÒôJÓÑQº¾;¨IIIIIIIIIIIII·JCvSRÒC¤¦)))))))))))© ÅMJjJ‘’’’’’’’’’’’ÊPlѤ¤2RRRRRRRRRRRRR[4)© …””””””””””””T†BJ*C1OIIIIIIIIIIo“†ÿíæ@iÒnJJÚ_jJ‘Fô (phpqrcode/cache/mask_2/mask_173_2.dat0000644000175000017500000000031711432665116016554 0ustar thijsthijsxÚíÝ+€@ PÏiº÷¿ÚfÝtóš:>y &d U߬ÔýÍS´´[íþª»ùé¡Õ]5Z;a¼Û5VÛž™´´´´´´´´´´AÚÀï[ZÚË´Œ–––––––––––––V¦«¡ÕƒI0ZZZZZZZZZZZZZZ=-­L‚ÑÒÒÒÒÒÒÒÒÒÒÒÒÒêÁhiõ`Œ–––––––––––––VFK«“·´´´´´´´´´´´´ÉÚü?‚ݧÍìhioÒJ0Úà}³¢ophpqrcode/cache/mask_2/mask_177_2.dat0000644000175000017500000000032111432665116016553 0ustar thijsthijsxÚíÝ1 À EÁ>§Yï¹4’V$Í~± ,CŠ…¼&UóŒÞ÷;OoŠk5b÷ÑÏ™áâ”óŽG°x9¥Û%&&&&&&&&&&&n$îöõOL|‡Øv#&&&&&&&&&&&&&ÖÝbbݘ˜˜˜˜˜˜˜˜˜˜˜˜˜Xw#&ÖÝl7bbbbbbbbbbbbbbÝM"ÖÝl7bbbbbbbbbbbbbbÝMa!&Ö݈‰‰‰‰‰‰‰‰‰‰‰‰3Ä)U *F™>–phpqrcode/cache/mask_2/mask_45_2.dat0000644000175000017500000000010411432665116016464 0ustar thijsthijsxÚ30€Cܸ ·j4ŠUˆ2ÛLÕpŽ!hTõpW5Å;Õ£1?HTS"SU5Ît2¬TžðÆ…+:tphpqrcode/cache/mask_2/mask_49_2.dat0000644000175000017500000000010611432665116016472 0ustar thijsthijsxÚ30€C¼¸ †”Zè k‡!%:pÉãD£:FuÐUN‘a¯c4•Œê@è ²V£‰Üiw¸ëœñÏ»ÆÄphpqrcode/cache/mask_2/mask_53_2.dat0000644000175000017500000000011111432665116016461 0ustar thijsthijsxÚ30€CB p Y]˜‚TÔE Á.CŠuÁ¹†$ Q]£ºFuÎ_#P×hÚÕ5øußr .üùk¤éüñ…cØ×phpqrcode/cache/mask_2/mask_57_2.dat0000644000175000017500000000011411432665116016470 0ustar thijsthijsxÚ30€Câp XÅ©ª“T@²†TÐ ç’ˆFuŽêÕ94uâ)ÁFuަ¡Q£:©§“ÔÖu(Fu±øÄÕ"gphpqrcode/cache/mask_2/mask_61_2.dat0000644000175000017500000000011611432665116016465 0ustar thijsthijsxÚ30€C¢p SÝôÑM ÇnCj鯝ŠÕ=ª{T÷¨îÐM@|T÷hjÕ=ª{T7Šn2ZØtÒM¨\Õ=¼â›.ãÀ{phpqrcode/cache/mask_2/mask_65_2.dat0000644000175000017500000000013111432665116016466 0ustar thijsthijsxÚí×K EÑy«yîsM"šfîÃI‡ ’Zl¥†} ÌZ—„h‚w°£B?Z°¶ÇGp LBv!öKz)xv5‚’¼æ¡oýªphpqrcode/cache/mask_2/mask_69_2.dat0000644000175000017500000000013011432665116016471 0ustar thijsthijsxÚí×1 CÑÝÓ´÷¿œ‹t”jTDÈ"ÂáP4kññFŠý§tn·)J¤·øb%.Eذ(‚ÂÔ¡   \¨(?áãJj¡L*ïÍK¦Þ„òphpqrcode/cache/mask_2/mask_73_2.dat0000644000175000017500000000013611432665116016472 0ustar thijsthijsxÚíØ! CQÏi¶û_CÀFþRâ±T`ÖÆ·2¦Ø—Òâe®¤Žú&ÏúÉÅ !!!M¥P?!ØL$$$zœGBBÊ–Äß«R¼Ÿ4éí} §œˆðOphpqrcode/cache/mask_2/mask_77_2.dat0000644000175000017500000000014211432665116016473 0ustar thijsthijsxÚíØ1À н§Áû_®‹CMŠØ>òGót Ñ«eó¨+Ž×FWÄZE¼­mÓ&gÞ‡F£Ñ¶h‰ùF+×t/F£ÙYvF£´õ³ïµÜì¥Õjçô[*7òÕa¶phpqrcode/cache/mask_2/mask_81_2.dat0000644000175000017500000000014411432665116016470 0ustar thijsthijsxÚíØ1 À0н§Ñû_®KÉÒ©Vi!O\"á‘Aøˆ«ò]¯:‚x»‘çÃbWµ½1ÅuȦ&‰Ä_‰µT ΋6œH$‰ÒU^‰Dâ~bׯëb=gˆ³âžûXî­ÛÙphpqrcode/cache/mask_2/mask_85_2.dat0000644000175000017500000000014511432665116016475 0ustar thijsthijsxÚíØ1 À0Ð=§1÷¿\—B7¡ÖÖOþ$á‘A0$â¬ý8W­ ¦ê­þwjguÞu¿­æ§Š¡R©T*u•÷S֧ލæ•J¥R©ÞTóJ¥R©ÿRö‡ÕêÞ¢N¨æµ˜çVûphpqrcode/cache/mask_2/mask_89_2.dat0000644000175000017500000000014611432665116016502 0ustar thijsthijsxÚíÙ± À0 À>ÓÈû/—&E*câÇQqâëÃŃ ªzf$òš«ÈËrM…ßåô„ß<ŽÈsa#d2™L&’?ïArYŸÉd2™LöG"ë3™L&“{ÊÙëRygw“;ÈúÊ ƒñÚIphpqrcode/cache/mask_2/mask_93_2.dat0000644000175000017500000000014711432665116016476 0ustar thijsthijsxÚíÙ1 1Àþ^cþÿ¹kµx³X FÌŒÿæËô-=VD½"%»CúRÉ N§Óé—陯A請w:N§Óéz$]¤Óét:ýn½âÚCÏözGݽé/jcØphpqrcode/cache/mask_2/mask_97_2.dat0000644000175000017500000000015711432665116016503 0ustar thijsthijsxÚíÙ1 À0н§Ñû_®Ki·vH4 ’)ë_%s×_½Õƒd3KŽO1^ša†§LŸá,†$’H"‰$’KzRP—t[I&¯ÿX’ÝÍ9‰$’H"‰$’äIò$y’sI$‘DI$É“äIò$»I$‘DÉ%eëÌsò!¹¼=—™‚äLAZ5—œ'åÌ“IVý“rîn¸»/2oÆ…phpqrcode/cache/mask_3/mask_113_3.dat0000644000175000017500000000031011432665116016541 0ustar thijsthijsxÚíÚA €0 DÑ}N“ÞÿrnDëÂFj2úK‚ÂÈCÂt?W«ÜݲîZ“iêÀ.qÕÁ‹ŒoýP ô¯ªª%SmjÕÖÂ7ËÞ¦‹:·©ª¨¢Š*ª¨N©Ê:@¤:݇·ìýÁоº•*€¹Š*ª¨¢Š*ª¨f©ÒW9dª2˜«¨¢Š*ª¨¢Šj–*}•S@ Ê`®¢Š*ª¨¢Šj½ªæ¯à§ª6ðJlº¾êÑ¿Ã}ÕÕ}ÕÕ§€•T‹¿UßaÈ24hntphpqrcode/cache/mask_3/mask_117_3.dat0000644000175000017500000000030711432665116016553 0ustar thijsthijsxÚíÛ1 Ã0 Ð]§Qî¹.¡xIÚB$úŒ‡€Á?~!É<ÇQ?ß#–ç¶Ð5µ/tIÝJ8owøié{áßçâ¬}£Sø˜^ã~‡¢½q猉P„ &L˜0áJá¢î1ÊúϻݢðD×K'¬J¨Ã„ &L˜0á…õÃn «ê0a„ &Lxgaý°Gƒ°*¡&L˜0aÂ{ g{衟þ2¨ë‡s¢Ή~˜ðì7\]%r¢Jôö9nZphpqrcode/cache/mask_3/mask_121_3.dat0000644000175000017500000000032411432665116016545 0ustar thijsthijsxÚíÛ1à À×8ÿÿ\Ô& J‚‰Ê!†H©l8U–=$¢®-eVÙ=§&ÞgN¾t‰gj7ÎÔ>n\Ô>ý—Ý9w%koµßoK7ʨ]òSÖ]f%¦M›6mÚ´i?V;¿¬Úùýv_ûbôVLÚ*‰ºM›6mÚ´iÓ¦ý·Ú¦³ä`m•DݦM›6mÚ´iÓ^XÛtc–¼C[%Q·iÓ¦M›6mÚKiÇ”çwsÐ>×TßÐoǬé&z¿8ÝĬ鿡Úÿí˜UIb¡JòÉ®Ð=phpqrcode/cache/mask_3/mask_125_3.dat0000644000175000017500000000031711432665116016553 0ustar thijsthijsxÚíÛ1 Ä Ð~N3ÞÿrÛ„]·‰BБÝ'?<Âà/̼VÛµ»Ýóþü¨ ïÒ”¿ÿ´…<–’0-_±Jä[¥ü?† +wÔÄ^;*ÃyòäÉ“'Ož<ù’/9ÏÏɯì9±<áîyÓÆœ'Ož¥ùz†Öô#EŠ)R¤H‘Z@ªbÂl-)ÌÝ¿ñ<ß§*©OURŸ"5&•ö›š5ý*iúeÎ J]®+phpqrcode/cache/mask_3/mask_145_3.dat0000644000175000017500000000036511432665116016560 0ustar thijsthijsxÚíÜÁ ‚@Ðý|Íóÿ®”•:Œ^ñ ³JyÌ¡¤ªyM§î×j‹×-' 9¤V—SÛýÖ¦K¶©9ëÇe¬µ)PíyUûû¹£wËeÞ-m jÔ¨Q£F5jÔ¨RËiÙ«ÔF4×_wk}·0+µµjRBR£F5jÔ¨Q»ƒš¾¦eßOMBJHjÔ¨Q£F5jwPÓ×´ì˪IH I5jÔ¨Q£FͳÇúš–íÙc éw5jÔ¨Q£FíµŠ:¡œÿÑzS«Ž*2¤¯UZ_«¾CÒ×*­e_Oí´ïZ¥%dIȯûâ†bphpqrcode/cache/mask_3/mask_149_3.dat0000644000175000017500000000037211432665116016562 0ustar thijsthijsxÚíÜA‚0Ð}Oó¹ÿåÜ â¦Hé ¯éÂô“'¬Z×2{oVÛ|Ι«%µ™ê>‚yû·R{‡!8îäÂI+JpI|#¶Ýfì–5κ[âP A‚ $H Á‚Q}ð)Õ&<¹÷E‚§ JQ)J A‚ $H Ás5zþ¥¨%H A‚ $Hà4A^£ÿ5A)*E $H A‚ $è½ Þ3ïMHQ‚ $H A‚ç æü3Þ§`ÞP¯©®o¢Ý>X{טÔè+±ÑWb£¿¡àìß`IÑã)5׈%dšphpqrcode/cache/mask_3/mask_153_3.dat0000644000175000017500000000037311432665116016556 0ustar thijsthijsxÚíÜA Â0Ð}Nósÿ˹)7mJ¦õ…,Å}8µêX=c¿W^G“e’ÝNó«Ïê³ÒX“%K–,Y²dÉ’ÕgõY}VŸ•ÆþgÉ’%K–,Y²dõY­GŸ%+¥1Y²dÉ’%K–,Y}VŸÕgõYi,É’%K–,Y²dßÈVìÍe¾ßø"»}Ûkgë©äÖS»ËkÜgo,›ò›­ä4.iüõ~!_2§phpqrcode/cache/mask_3/mask_161_3.dat0000644000175000017500000000042511432665116016553 0ustar thijsthijsxÚíÜA Â0Ð}N“ÜÿrnªF±ÑTká…,„€NûðÛ ÄZ—Ñ’f7J÷:³Æ’^`WáÙ”U×á»nXÚ¤¼Ç§M-½¾‡™#V¹¥+ß¡ËÛ+9z–ÜÒ–YÒ l”)S¦L™òo•cŸ±¯Ê±O_Cå?ß©õ%Ê;*Kl‰M™2eÊ”)S¦L™2åYeý²]ÊÏÊ[bS¦L™2eÊ”)S¦LyVY¿lW„òGÊ[bS¦L™2eÊ”)S¦LÙÙ ý²]g+$¶ßeÊ”)S¦L™2eÊ”­Ð/Ûq¶BbKlÊ”)S¦L™2eÊqÊ™ÿ‚þ¨œ]à­Â£{ÎA¿¼¦œÔ/×ô~¹¦ïŠœV9ï»\%ö÷‰[ãP¯#'phpqrcode/cache/mask_3/mask_165_3.dat0000644000175000017500000000042511432665116016557 0ustar thijsthijsxÚíÝA Â0Ð}N3¹ÿåÜT‰ #ØZþÀ Y¥uÈí:ÆÌ›¯1–ϱE®Uæ¹TÙT|SüþÒ·Ô ñ ¿qž)òm-sG²øì ¾ ýBæÈ.C‘ĉ'Nœ8qâÄŸâáÿÕ÷âwv7û[Æç'„tgÄÿ!.Õ¥:qâĉ'Nœ8qâÄÄõãv`ˆ_+.Õ¥:qâĉ'Nœ8qâÄÄõãv`ˆ—êR8qâĉ'Nœ8qâΤèÇíÀ8“"Õ¥:qâĉ'Nœ8qâÄIÑÛq&EªKuâĉ'Nœ8qâ½Ä+¾È9:¹}kFT?^úñêпG¼Åo<0Õ«Cªg/æ_phpqrcode/cache/mask_3/mask_169_3.dat0000644000175000017500000000043611432665116016565 0ustar thijsthijsxÚíÝA‚0Ð}O3Üÿrnˆ¢‰ñ·¾¦ ¨)}á'3ªæ1EÎÇh‹ßÑ]î4üP[ £_«ñÁ¥]Kvè‡<ÃË™fpý©#ýûª¶y_Êlù[œgëe£ôéÓ§OŸ>}úôéÓÿoý ªµ%uJV/µ°“{¿„þ—ô%¿ä§OŸ>}úôéÓ§OŸþ¨úê}Ýú§êK~ÉOŸ>}úôéÓ§OŸ>ýQõÕûº=ô/Ñ—ü’Ÿ>}úôéÓ§OŸ>}ú£ê«÷u{èï×—ü’Ÿ>}úôéÓ§OŸ>}ú£ê«÷u{蟪/ù%?}úôéÓ§OŸ>}ú¿×¯.N4ÿ»áƒVMm–¢R³•𥑸™Òá¸t(1ï…¢|phpqrcode/cache/mask_3/mask_177_3.dat0000644000175000017500000000047011432665116016562 0ustar thijsthijsxÚíÝA Â0Ð}N“ÜÿrnJ‰‰šL|% ¡‚¿åᤳi­×Ñö^÷QºÏ÷g ÜM|†ŠÁµŒ/³Î~ú³SS?žª½3ðÓ=Î8RT´4Œ2ýæn«äŒz­’60TPATPATPñ¢"åÉôVôd:U±hªÑ)*–« „ *¨ ‚ *¨ ‚ *¨ ‚Š3Th±´XºÍ%*$ˆ±¯ ‚ *¨ ‚ *¨ ‚ *¨ø[Z,-ßS!A$ˆ}TPATPATPAÅñ*´XZ,ÝæV*$ˆ¡‚ *¨ ‚ *¨ ‚ *¨ â Z,-–ns‰ "Aì+¨ ‚ *¨ ‚ *¨ ‚Š…*jÔÀ­¤ <{såž}EMk±jZ‹EÅZ‰ÿ;'HMKœ›ünÃ!phpqrcode/cache/mask_3/mask_21_3.dat0000644000175000017500000000007411432665116016466 0ustar thijsthijsxÚ30€C0‚.€ "‹"‘D)7dÜjC$Ä…Ê…".l‚¸M@óÄ,‚á0&‡S½phpqrcode/cache/mask_3/mask_25_3.dat0000644000175000017500000000011311432665116016464 0ustar thijsthijsxÚ30€C‚.@‘@–AÓÄe@ÓÐY¦Á9†hˆ SЏpI  i0ÏqaC\±5 ‡&’L3Äe§¸4á6 †ýv˜phpqrcode/cache/mask_3/mask_29_3.dat0000644000175000017500000000011311432665116016470 0ustar thijsthijsxÚ30€C$\&y.|’H²´3 Èd8Ï âÂ. E\ø$ GMF6 _Ú0ăp.î$Ód$7ã‘Äa2Rhà‘cŸ†phpqrcode/cache/mask_3/mask_33_3.dat0000644000175000017500000000011711432665116016467 0ustar thijsthijsxÚ30€C \€U² ì TÐÇ\€*¶À¹†8n)(â"¤`Ô–¡f <ÍàOc[ð§1CÜù…*¶ÀýBH>[ ‰µu\Î}phpqrcode/cache/mask_3/mask_37_3.dat0000644000175000017500000000012311432665116016470 0ustar thijsthijsxÚ30€Cl ¸ §"dUx ã28ñªÚçâA\ø¥¡ˆ‹E£6ŽÚ8€6Â2á,dHL µ‘èb£!16"B•ȳ”gphpqrcode/cache/mask_3/mask_41_3.dat0000644000175000017500000000012511432665116016465 0ustar thijsthijsxÚ30€C¸Lj¹ˆUˆ¤r`m'hb;œgHqVE\Ä*4µ}ÔöQÛéb;Ô>bË:CÂ¥ \Š¸Ò†Ê¶#ùH…DØŽòDª_Ó>phpqrcode/cache/mask_3/mask_45_3.dat0000644000175000017500000000016711432665116016477 0ustar thijsthijsxÚí”K À D÷sšñþ—ëFJ(&™)ô³0d¡øÐ‡’³FÞg!Œ[8Ò=èÛ&ËiaÂÎD)Åd8&AËÕ¬¡a³áÀÛä 1'™I–I”«×³ž7Ù9ù­ exÀ“ß¾È ÄÒIìû&Ö´¯Cçu´ÍJy‚phpqrcode/cache/mask_3/mask_49_3.dat0000644000175000017500000000017711432665116016504 0ustar thijsthijsxÚí•AÀ ï¼fýÿçz!–š¢»M…pP"Ù‰@ÜÚÔO³p¦b)bØE5DÖTYdÐàŒ¤j¨zÐú¥‘nüSwSŠê·T|·;•’S¥‘O©ª¯Š*PARà÷à…j²+î»j·#Igê n£ZÿÔ âÅ :îÆ phpqrcode/cache/mask_3/mask_53_3.dat0000644000175000017500000000020011432665116016462 0ustar thijsthijsxÚí–K À0D÷s½ÿåº ­¥‰Ñ! -(.Bp&|ˆ"-t–&`Æq‘Q-"†ð9Ù_+)Be/H8¾ãD®¼%‘a~šÐ}spKFN˜úöœ¶Ö=,ÂÆ;‡;a^tª4÷–‰Ï\™ÞF™ÎáÂÀÊÎSNé§éâphpqrcode/cache/mask_3/mask_57_3.dat0000644000175000017500000000017611432665116016502 0ustar thijsthijsxÚí–1 À0 w¿Fþÿ纄â¡(–hI!äÈŒ°*{}W”µVR ù¢-ÙÜÚ¢g«–j›®mr†wèÈêpÁ±Û±UlLà¶<¢qæÙäœíÌíØŽí§¶°À ¤?Æm&ÀM0¸ ö7[ûm›“wôK/8®gphpqrcode/cache/mask_3/mask_61_3.dat0000644000175000017500000000020611432665116016467 0ustar thijsthijsxÚí–A À0ï¾fýÿçz‘4-%š•Ò*Ãâd°Ðpž!ÝyZÜ«‰æ‚uäõ(ù¸~ë=¹&ÉÛ“´‹)œÌR2â"/ò"ÿ<9çŠFΊ=r§þbòšó"/ò“ƒîÌíçrw¹"2®¯¹ãçÈøùBòèŸ#3-Ø0-KÀWphpqrcode/cache/mask_3/mask_65_3.dat0000644000175000017500000000020711432665116016474 0ustar thijsthijsxÚí—Q € Dÿç4»÷¿\?R•Û …Å,û!¨Oв-òNv®Í1 :Âc¡Zœuï Ú"U‹MÕF ~jK¨€´…-la‹[^q^³Q\éœ=…o”-la‹ÿZpUÒÞB¬„äÿ ±@IµÖKµJzÉ¢|1â ÷¹phpqrcode/cache/mask_3/mask_69_3.dat0000644000175000017500000000021111432665116016473 0ustar thijsthijsxÚí×Á €0 Ð{¿&ûÿŸó2¤'—®dô l†=,¹F½îéy;$§ì‡¤”WEË-R„Ѝ³:¢¡%T,O2½×g…"Ä"‹,²È¢/DÍyĈ˜¹ôɧ{þO䮳È"‹,:N„vÈEñWNÎ#(&,ö,‘ä•ºŠ®ë]æxØ…phpqrcode/cache/mask_3/mask_73_3.dat0000644000175000017500000000023111432665116016470 0ustar thijsthijsxÚí˜Q €0 Cÿ{šìþ—ógè;è¥JJ?dÔ¬K„=ÚRaÃsJhTJ6exÎkaºú¥§\$é‘n¯´IE,-/ÑÓXB¢è*Ñ…=ËâžíÚÒýweeé4™¢è¸tÿöÌ’tšLщî«t t”ß«œèà¯bž –gF…fž ÖáqºõoÖd¢Ðdn-ð?phpqrcode/cache/mask_3/mask_77_3.dat0000644000175000017500000000023511432665116016500 0ustar thijsthijsxÚíØA €0 Àû¾&ùÿç¼­BŠiÖRaK"té`I@³¶|¶º…fX—ö±Ôâ­yiöåólõE‘:Sza18G¾À‰if˜K*©¤?–:YÜC1쌞졘(ቷ—êöJ*©¤’¾’jÊl*Õí•TRI×KëÌîR^Ø™æœÞksûÂ)cÌ)cÌ)³JZø¦¶óí¥äãa·phpqrcode/cache/mask_3/mask_81_3.dat0000644000175000017500000000022211432665116016467 0ustar thijsthijsxÚíØ1 À Fá=§‰÷¿\‘,JÑGAúÄ¡‹ýhjÀÌ>ÚÙ#Ê3X™À’ø:çk÷Ô¹\ûFM JÝhuÇú½3¸¨>ƒT­ZõŸÔ{ÇãPSgøP'¹ÉkÔV¸jÕªU«¶_Û¯ý¯U«V­º•»=P Îo†O:WÒ‹ÞäÝjü[ŸWxÒÎmò Ù5phpqrcode/cache/mask_3/mask_85_3.dat0000644000175000017500000000024011432665116016473 0ustar thijsthijsxÚíÙK €0 EÑyVóºÿÍ9)µ:©ÖÜÒFá`hP©®ry¯+ºk[Ò>«±ØÐý§âGæâ»Z}Ë(P’Ú£h7ŸÛ®îÈHŠ €@ª€÷4¬î¤#Éøè@˜˜è@— È^©÷ÁF`ø•zæ4TÆi¨Q±“ó€2殾Êè}  kÃV·phpqrcode/cache/mask_3/mask_89_3.dat0000644000175000017500000000024511432665116016504 0ustar thijsthijsxÚíÙ1€ …á½§)÷¿œ *.@àUÁü ƒÓÓ|±¶‰î¹’âeŵ6Û¢‚‹äw5*÷ô) oôi¨K®‘¢4nk>Áè1}d>œÐ@ 4ÐXYC¾oœò Û¡1<º©A§ h F„ûÆt ß 4Ð@µ5´—ž1ÁWrÒï>7û«û†Gíµ}}¤¡x7|ÇN‘gÆîÚNphpqrcode/cache/mask_3/mask_93_3.dat0000644000175000017500000000024711432665116016501 0ustar thijsthijsxÚíÙA €0 DÑ}N“ÞÿrnJɪQš~éB¨Œú06 û£n®aá¸<<¦×‡‡ôÿe6×M—R™ýCùÅPÈ ¥LÀ±ôÌ“išØ9MŽ 2È ƒLkÅ®½dD»v*ó"a·ÔX†jBdAdªdèôZöÀTßdAd®qYø0exö÷ö¼Ÿqe§çÊN¯«Œú©ª&WV“ææQvcôphpqrcode/cache/mask_3/mask_97_3.dat0000644000175000017500000000025711432665116016506 0ustar thijsthijsxÚíÚÁ € „áû>Íøþ/×EÊ.*èdÙ/‚ÈÍ6JÊ#M׈âØR ¬`ÚDh¹R½¼¦(©u§½J®aRJ(g£¹Êè ßÒy†»J(¡„J(¡ôv%_ªìR̓1e•Ú…û(Ñq¼—PB %”PBi_%RåFJtï%”PB %”~«$ë|ÿ Ü”4ö º—äN•ØDoª”;U®Wšö,ÉÝqúpÇTióœphpqrcode/cache/mask_4/0000755000175000017500000000000011453417104014310 5ustar thijsthijsphpqrcode/cache/mask_4/mask_101_4.dat0000644000175000017500000000027611432665116016553 0ustar thijsthijsxÚíšA€ Füÿs^1 b¤‹ÆáИª]ÃØÖ4šm+Æ8Ð+˜Ve¬Ä^H­R]–\Íc‡®ŠÛ ·oõWN#¸îXáéØá+lð ž­HE³cp \à—^.Î9qñW9ø¼ïç"ò…:¸À.ŸæBßÿó÷ùBƒ \àæ0Ìa˜ÃPǨcp \ÞÍÅïO•’‹N¥qjpGÖô}“ô}¥Ê$.äË…Š§ÐŠphpqrcode/cache/mask_4/mask_105_4.dat0000644000175000017500000000027011432665116016551 0ustar thijsthijsxÚíšK €0 D÷=Mrÿ˹‘øA …ÎTáe‘EFóL2 #ŽÈÌé¹¢…_I!“‹•ßú­£ç딤Ѻ““Î-Õ«km¿Oñá]sS T6*ùª'8Á NŸâ$Þî'N¥Z‹Êí^œ©Oê“ÎInܸqãÆMŸÔ'õIç¤s’7nÜþÑm÷Æ«[>mzÑriÃËöÉí“'Ònàf¿}‘–|b6ͧphpqrcode/cache/mask_4/mask_113_4.dat0000644000175000017500000000031211432665116016545 0ustar thijsthijsxÚíÚA à н§Ñû_®‹Jb)t&„çBBÒøK_•‰¤Ö³µÖ6õC+5/q_Üghfâ×Çú©Éíÿž¿CbH+¾p›º¿¯§;WK?ÞüGútô ‰ñ¿*GŽ9r|‚c`ÕÑc¾¶Î9FKHÌq4­«9räÈ‘#Ç…ŽêUÏ×ÍGë*GŽ9räÈÑ>¹}rûäÖUë*GŽ9r|ºcÌ[Á£cNâ¬Þ[_=Æ×«5¼^ÍJ¼£ù¸ 1*ôq›vphpqrcode/cache/mask_4/mask_117_4.dat0000644000175000017500000000031711432665116016556 0ustar thijsthijsxÚíÚË Ã н_£ÿÿs]4Ø¥©Dg¤nò¸à‰2Jj}´ÖÚÒ¾·RsSWG¶R¿ŒÉ§†žÚ)5¬»ÞE†áämá#ܯ•ã¾Õðk_"ÃzŸ”š3Â\¹råÊ•+×r ­L»k|ê/{„¹;Ž'×àÔ§™Üÿr6âÆÂV2cñ,‹ºò4äFüŽÞûæqkQŸ¼?vÌýFòäÂÇy›þý;ç¬äÔcê<õÅÙÕã<ÛÃt·óWʃ}à5&×Í6gΜ9sæÌy᜾ë…ɳÝíŽ]ïuWar¹³÷ٺ͙3gΜ9sæ¬WéUz•^eݶnsæÌ™3gΜ9ëUz•^eݶnsæÌ™3gΜsœ3¿~¹;×&ÿ÷ËÛvS׫¢¬WU'ÌÙû¼)9;üÌÁÙphpqrcode/cache/mask_4/mask_125_4.dat0000644000175000017500000000032511432665116016554 0ustar thijsthijsxÚíÛA Ð=§û_Î V\`ª‘™Y¼.~íâ_´÷×1Æ8/Gë5Òc¢ßo Júæâ9ða’ñåhÍôð£ýüž£ßs¦<ùe´ÍÏ?øåÜ2B¯srzî“çÎ;wîܹsçþg÷ÐÿóלÉé7[ω&5ÝóÒK¸[ïöyîܹsçÎ;wîzœ§ÇYïöyîܹsçÎ;w=NÓãô8û¼}ž;wîܹsç^Õ=þ µÕ=?}{Áñ&•Ûãzj«^ÒÝz?žžq‘“¼phpqrcode/cache/mask_4/mask_129_4.dat0000644000175000017500000000033411432665116016560 0ustar thijsthijsxÚíÛ;ƒ0ÐÞ§±ï¹4hó¡ žUô(\HŒà…õ™óy¬µ¶­uŒÙ'ÁÎ˯¦ NïÒ·»÷«óýDŽqsÝ|>úê³q|oçá}© ×Ú Aþ)pÀpÐÐAh—öâ ˜ ¶+‰]Z9È&hãÀûÀ\à€8à€ô}A_ÐÌs8à€ô}A_ÐÌs8à€ô}A_ÐÌs8à€ƒÿtø—釃 îß^íÖó}aÆûB—íxD¤B<Æ¥SÙphpqrcode/cache/mask_4/mask_133_4.dat0000644000175000017500000000033411432665116016553 0ustar thijsthijsxÚíÛA à н§Ñû_®›Òš…BþÂËB¨2à‹f™ó{­µ ÇíÆcf¥¨°gÈKqøã=óÙ)Ú®£‹»çWÀŠlK2Þ¿ÊË8:oþCRd¬\pÁ\pñ@­ï+$EÅÿÏùQ.ìÎç\pÁ\è#úˆ>¢Ø/œ#\pÁ\pÁ…>¢è#ö ç\pÁ\p¡è#úˆ>âqŽpÁ\pÁÅ.º¾$¿ºÈIqü𽤠dô‘ÑG’R»°_4¦è ò€˜phpqrcode/cache/mask_4/mask_137_4.dat0000644000175000017500000000037011432665116016557 0ustar thijsthijsxÚíÜA ƒ0Ð}N“Üÿr݈EJq>ø²¥¶ò‹¯‡€½Çãáy­ç%y>Æ1Lb’Óœ}};°8íÕ÷““”޶ |퇥·õÙʯÎt´m¯‹þ8ÓܪìsP’œ«Ã 'œpÂÉ‹œ”ÝŸìg J²¸ë{òîqs’‘$ΉõDÝQw8á„N8á„Nn;Ñï„÷;úâ'ÖuGÝá„N8á„N8±hÐ> õDÝQw8á„N8á„NìÚ´h=Qw8á„N8á„“;©}šÄì$+ɾàÿ]FN¿Ócú´$±N¬'QIªÃ|håçdphpqrcode/cache/mask_4/mask_141_4.dat0000644000175000017500000000037611432665116016560 0ustar thijsthijsxÚíÜË Â0Ð}¿&ùÿŸsa‰4j)Î œ,²0"CsÌp ´µÛè½—Ìcl-³šªRúÕLžá÷Ÿï‹Ó9šò1u3õt]ÿá±}øµ˜kÛþ½ª?Ôã¼%1æ°j²vŠn¸á†n¸áæ47 æÎMH5³lñ×3ÜäTéÆy£OéSÜpà 7Üpà 7Qnä©…ò”þÆóFŸÒ§¸á†n¸á†nÜkÊSr¸{M}JŸâ†n¸á†n¸q¯)OÉáî57ú7Üpà 7ÜpÃÍ 7Åoœyr“WÍÑÌq~‚ÉÊS-*O%V³€çM`5 ]l¼ºDphpqrcode/cache/mask_4/mask_145_4.dat0000644000175000017500000000037711432665116016565 0ustar thijsthijsxÚíÜA ƒ0À{^“üÿs^ŠÕƒ‰íÁld<µT3MXÖú=Zk“·¥æ&šç˜';QïyvosÿúõÝÖIqŒ]~;øUûçñåŒÚaØÊçÓÔ?Úé\R‚ìçÀDy£ÆGqÄGqÄG¯qÓ×Z`¢}ù‘–½_LëÈ|d]³®qÄGqÄG½Þ‘¾¶h_ÓûŽÌGÖ5ëGqÄGqÄ‘}Z}Mï·Ok>²®qÄGqÄGqdŸV_ÓûíÓš¬kqÄGqÄG?9JxkÕÙQf¢þ{ÉžnGy}­ÆõµÔDË82ÕäD)¡6Œœ“6phpqrcode/cache/mask_4/mask_149_4.dat0000644000175000017500000000040311432665116016557 0ustar thijsthijsxÚíÜÁ !н_£ÿÿsmœÉ Œ„Á+XÓ‹9=ó.ªõ=Zkça”š]ÕÞ’> K¯jò´oé ¾ªý|¯SªŠSWKùZmË׌ºƒÃjé¾€Ã\’йçЪ2ï W\qÅW\qÅÕñ®"~·ß× ­jvÚtòê®òªŠv¥_Ùíƒ\qÅW\qÅW\q%g3Èä ú•}+®¸âŠ+®¸âŠ+®ä r9ƒœA¿²rÅW\qÅW\qÅ•œAÎ g3èWöAû W\qÅW\qÅW—«œÆ]åVµ~v{êDŸ™3ÔÈœ!¹ªƒ\éWÇô«¬Â^<ír/phpqrcode/cache/mask_4/mask_153_4.dat0000644000175000017500000000040611432665116016555 0ustar thijsthijsxÚíØ1ƒ0ÀÞ¯ñýÿsi,')p!äµ4.ÜГ;±½¿WUmßçj=¿²„²ê°Ê.NO¾þ>úûšçTµÚ[÷¾S7vÜÛœg¶q•„?æ÷ÞÒ š{pe¹o“3Î8ãŒ3Î8ãŒ3Î8{ØYXzðá,°²Û_úO¤ÓYfeñÎô3sÓÜäŒ3Î8ãŒ3Î8ãŒ3¹†\C®!×ÐÏÌMs“3Î8ãŒ3Î8ãŒ3Îär ¹†\C?379ãŒ3Î8ãŒ3Î8ãŒ3¹†\C®!×07ÍMÎ8ãŒ3Î8ãŒ3ÎÎq¶þÚé,»²ËmMrs›k¤Wvœ3ýìÀ~–WÜ €WBphpqrcode/cache/mask_4/mask_157_4.dat0000644000175000017500000000037711432665116016570 0ustar thijsthijsxÚíÜ1Â0ÀÞ¯ñýÿs4˜"FPà=iRX¢XÉÛ0ç멪€u 4ftÑÖl}Òm¾øßýžéâž­»Sû|²ËÑŽëSÌ û¶ŽÄPÏ5<]öÉrÇwÜqÇwÜq÷£»È^QáéN6ÃûáéZ¸sß™³æ,wÜqÇwÜqÇ>«Ïê³ú¬ûΜ5g¹ãŽ;î¸ãŽ;îôY}VŸÕgÝwæ,wÜqÇwÜqÇwú¬>«Ïê³æ¬9ËwÜqÇwÜq§Ïê³ú¬>ë¾3gÍYî¸ãŽ;î¸ãî[ww?P3Üå§ÛþòÑÆ˜ÝggtŸí®¡;÷]ûû.3àw4A¯phpqrcode/cache/mask_4/mask_161_4.dat0000644000175000017500000000044411432665116016556 0ustar thijsthijsxÚíÚA‚@ Ðýœfæþ—s!AL€Ä_|,ˆ™4òl)iï¯mŒ²ßl­×‰0'¼÷ +E¸û…£ ÷–]N\ºêüxÅ#·‡§2Ÿç/ü¼_¬{—7gÛò9ì¼Ù·ÔÀÖ}óï2‡rÈ!‡•?}-³#T—Õe9äC9äC9üÀ¡~ùöý²÷6Sʇ겺Ì!‡rÈ!‡rÈ!‡æôËÞÛ˜sÕe9äC9äC94ç _öÞÆœƒ|¨.«ËrÈ!‡rÈ!‡šsÐ/›s0ç ªËê2‡rÈ!‡rÈá8ì§}D‚ÃÎìçw£ùýrï—«DXΡ|xÃ|˜ä!à2ðphpqrcode/cache/mask_4/mask_165_4.dat0000644000175000017500000000044411432665116016562 0ustar thijsthijsxÚíÚA 1 Ð}OÓÞÿr.ª"Ñ*?úfÑÅÌP‚óLHIï—kŒµÎ«õZQ¦…8 Gy÷êqkñ-ž¿ÿÎn5£Œ½Ú+?ÌÒñùù¾Ýâ¿ø|ÖŽ÷Òþà·kKn®E¢¬ñŹä’K.¹ä’K.?ï2º£˜.ó£|¼EJ§{å2<Ê:.åKu\ç’K.¹ä’K.¹ä’Ë—úñ¿êÇmu)_ªãê8—\rÉ%—\rÉ%—\šÛÐ;'2·!_ªãê8—\rÉ%—\rÉ%—\šÛÐ;'2·!_ªã\rÉ%—\rÉ%—\rinC?nnÃ9‘¹ ùRç’K.¹ä’K.¹äò;.û²óHqY'ÊݽéþN·F?ÞKôã•¢,êR¾üé|™è My*3phpqrcode/cache/mask_4/mask_169_4.dat0000644000175000017500000000045111432665116016564 0ustar thijsthijsxÚíÚA 1 Ð}OÓÞÿrºq\Xé`¾ófQQ¤ûLHIïÏgŒQlÝ×z^¤õÂÜÇ™éä‹oÏeºýŠÝò#-ý|vz=ö­Ým„œþîøÛã]É?þËÚª¸­A‘æœ>§œrÊ)§œrÊ)§œrú­ÓÊ]ôöyP¤çuè‹w Š4Ë©|ªî«ûœrÊ)§œrÊ)§œrúÇNõû—í÷ÝKâT>U÷Õ}N9å”SN9å”SN95‡¢ß7‡â^ÊŠ|ªîsÊ)§œrÊ)§œrÊ©9ý¾9÷RæPäSuŸSN9å”SN9å”SN95‡¢ßw/eE>U÷9å”SN9å”SN9½ŠÓ>í|*9ÍŠô`?ü£.:§ßï1ý~Z¤áNåÓKäÓúÁÞ” '‚phpqrcode/cache/mask_4/mask_173_4.dat0000644000175000017500000000045311432665116016561 0ustar thijsthijsxÚíØK 1À}N“ÜÿrnÂa øÃ~ZY!ÎÐJÑt^ï×5Æ(¸/«õÌjk–z[pjµ§_Ø?~v:|jwúÕ–_mû£îXzòoõ–Ó6?nËÞŠ<ö°j³$pË-·ÜrË-·_p[z¾=ÞVíæ–Qí¦3ÝæTéV¿ÕoÍ ÜrË-·ÜrË-·ÜrË-·r09˜L¦ßšÌ ÜrË-·ÜrË-·ÜrË-·r09˜L¦ßšÌ ÜrË-·ÜrË-·ÜrË-·r09˜L¦ßšÌ ÜrË-·ÜrË-·ÜrË-·r09˜L¦ßšÌ ÜrË-·ÜrË-·Ür›æv­æ6¯Ú÷ßý?•,eå`=*K¬6Ú­~û§ý6£à ´*×phpqrcode/cache/mask_4/mask_177_4.dat0000644000175000017500000000045411432665116016566 0ustar thijsthijsxÚíØA !À»¯Ñÿ.1B„éMyð”![ c÷þ\cŒ²ûZ­çV\¹Üq“Š7ßâÝEó‡Oýzg~ÅkëøË¿jž;pg”Šu²Í[*7Š×½¥ºöÀŠóTpÌ1ÇsÌ1ÇsÌñqÇ!¯ÿ‹ã Šw/òr¯ÿå8«âXÇú±~l®à˜cŽ9æ˜cŽ9æ˜cŽ9–»ÉÝänr7¹›~l®0WpÌ1ÇsÌ1ÇsÌ1ÇËÝänr7¹›~l®0WpÌ1ÇsÌ1ÇsÌ1ÇËÝänr7¹›~¬›+8æ˜cŽ9æ˜cŽ9æ˜cŽånr7¹›ÜM+8æ˜cŽ9æ˜cŽ9æ˜ãtÇû§oEÇ™ŸÉN¥Xy¹[ËÝR+¾‰cýø¯ûqNÑ\,4Jphpqrcode/cache/mask_4/mask_21_4.dat0000644000175000017500000000007111432665116016465 0ustar thijsthijsxÚ30@CƒË¿¨¡!\ ()æ"’Ì…*“†0’ ™'qˆâ4Í(¢èæâ¥‡¹vSßphpqrcode/cache/mask_4/mask_25_4.dat0000644000175000017500000000011411432665116016467 0ustar thijsthijsxÚ30@CCC‡Ë€° D!GŒ 9ö ²ìò H.t8‰G·i´¶ê7œ>5Ä8›"ìAòalö`‘A—Æ]vÒphpqrcode/cache/mask_4/mask_29_4.dat0000644000175000017500000000011611432665116016475 0ustar thijsthijsxÚ30@CCC8 \ÄÉbH‘ K‰½ØEöBÙHâH$6A8I@¿É#Ã^˜ÖXÀ"‹ƒ{‰‘%Ú^ÿâÂi/¦,6›Ÿåphpqrcode/cache/mask_4/mask_33_4.dat0000644000175000017500000000013111432665116016465 0ustar thijsthijsxÚ30@CCC ä2 ^Š´!\I*¨á\€*î€*Ç0Nrá’€“D¨ l˨;“;à)g ¢[*4$˜N ñ¥SÂî@ <ÒÜ®—"ƒâÏphpqrcode/cache/mask_4/mask_37_4.dat0000644000175000017500000000012611432665116016475 0ustar thijsthijsxÚ30@CCC4 ¸ HS…©¡ŽTUÔt>@UwAyX B"¹ðIÂI"Ug㨻FÝE wAóQ¹ÃoNƒ‹“ªŠw!…%„Ü…E>…_ßAphpqrcode/cache/mask_4/mask_41_4.dat0000644000175000017500000000013111432665116016464 0ustar thijsthijsxÚ30@CCC¬$p®¯22UÒ„MÜ eãPƒDrR'IPI¼í£îuç¨;Éu§L–`É€E%þÒâNRURìN”ð$BQîÄTIH1F?„phpqrcode/cache/mask_4/mask_45_4.dat0000644000175000017500000000017011432665116016473 0ustar thijsthijsxÚí”A !E÷žFï¹Ù„S‘ãÿL‹\ÕòIõ-3[v/Ñ¡¶î v½1:­µwt™8.m4ZÈØ¼“4gr½7y‰í¼AÚ#–%Ö½qºä}srªwò#OÞ<=<|&–Ë·Rù®Ðeï_÷ <>ñ€ˆphpqrcode/cache/mask_4/mask_49_4.dat0000644000175000017500000000017411432665116016503 0ustar thijsthijsxÚí•Á !Dï~þÿÏíe)­qº,‹„d|¥¨:™%щDyG.÷ú;G(©p`è$Y±*W–¼·íC-QPሄ£^Usüéö‘!ûi2„ƒãè¾jŽ#²ÕVΑ¬Ê¤Ûëó¡åù`ןøÜôªÇæphpqrcode/cache/mask_4/mask_53_4.dat0000644000175000017500000000020011432665116016464 0ustar thijsthijsxÚí–K À0÷žFï¹vaS E|ÏZÐ… !™|$ªg˜Y’Cˆö¨¹‚]êvêU§Ê‘yímß+Œ‹÷ ² “W&)n…ã5^¯x•Þ—.$åï©î…S-¯¹‡ãõO¯úÏ!zñ”Z¸º¡TÝèPx}î¼0p²gcphpqrcode/cache/mask_4/mask_57_4.dat0000644000175000017500000000020211432665116016472 0ustar thijsthijsxÚí–K€0D÷œî97 þ‘jb",X´}†WÍDÕµÌì±{‰ÖÉ f“ÉÓѱDx"$T‘g¼O먌Çd.vß¼H~ÚölÏÿyÂiâžy(JÍ'AÖ<û»mÏö|Ùø{;xÖÈ‹íDšð9¤tUɉž~Ÿ8¼ˆÃhçphpqrcode/cache/mask_4/mask_61_4.dat0000644000175000017500000000020411432665116016467 0ustar thijsthijsxÚí–A À0ï¾Fÿÿ¹^Jk(µêÚC`s2ÅIÂÕ{˜Y¢:@t†Î¡ž£ƒ…]ï ]¡÷ë~»ÖåüJoøR¥]¤±ÎéMozoàÝÊ5é(y?çAzÄ›÷œÞô¦÷Ó»úÂ^½q:|ȇ‰Œå¹By>Aÿà½Áy÷~pw˜Âsphpqrcode/cache/mask_4/mask_65_4.dat0000644000175000017500000000021411432665116016474 0ustar thijsthijsxÚí—K€ D÷œ¦½ÿåtX£Ð™.4ÓE1^ÂãÓhv†»OæÍx„ùéW“ð0 ñ°JHÅ»‡½­ðz[ÿ^܈[vâȾ yy‡ZÀkß=`„™êv·cíǃî…<ȃ<üÚCî/)zàÜ‘×¯× ¡ÈÃÇÎC²Œš""phpqrcode/cache/mask_4/mask_69_4.dat0000644000175000017500000000021611432665116016502 0ustar thijsthijsxÚí—;À0CwN÷¿\—ˆ~¤¨;C$3°$<)/m­ºß¥žeÎ¥T±‘2  —:¥]ÿ^VV¡%ƲzAïnÈpv…s"y‘y‘y)zöá¤dÄu6½àª½Gú¾È‹¼ÈËi^šÂ/<ÊtÓrÂrrÚ)9ͤlõrìó‚.¶‡Öphpqrcode/cache/mask_4/mask_73_4.dat0000644000175000017500000000022511432665116016475 0ustar thijsthijsxÚí˜A €0 ïyMòÿÏé¡´)1Ý-‚lE3š=Ô}¬ˆ(Öô°9ŸTÇdÎÒò–E/eO ZOžîãÛÅ»KíY;ÛúpS5Ð+‘ÄëNžäIžŠžà| "©eìvúö+DÝ“æNs'Oò¤WŽkîäIž¾ð„ì†Ìž¸¤FúòrÜi9Î&óô«ÿ ‡]?ÃóAphpqrcode/cache/mask_4/mask_77_4.dat0000644000175000017500000000024211432665116016500 0ustar thijsthijsxÚí˜Ñ €0Eßý÷ÿ?×ËjFe8¯0êú uØN©0Õ­µ‰lB´†6‡:«h·<½õ–§¥CÜe\,¹ †ìÔÜ—~ø & rd0 »Sz£7z+ô–êoº»ÓÜþëäÝŽVâuÊ:¥7z£·Wo¿š ËÎSÖ)ë”Þèmoù3ë O‹y;:*h¥Þ>û¿a€ïCephpqrcode/cache/mask_4/mask_81_4.dat0000644000175000017500000000023111432665116016471 0ustar thijsthijsxÚí˜A €0 ïyMòÿÏy‘XE m7"89ä 2’Ѹ ûQ1ݳÌëˆ+¸x‰x;ÅÓt35DIY÷¶1x\:už³ýº•}î¦e/ ê§Æ#ñø¢Th< ‰ùùU¤BzÔË<²×ì5ñˆG<’×ä5{G<⢿®5Äñ<饫>¯]ž×UÄr¿xuÐ ” Üûphpqrcode/cache/mask_4/mask_85_4.dat0000644000175000017500000000023211432665116016476 0ustar thijsthijsxÚí™1 À EwO“Üÿr]J‡ÚÖä ¥Ï!`7<‚ jv.wOÄj¦¥æ‘©§>˯¥–­¡×·y Ú¾K@[%ìˆ"ªÆ^ñŠW¼â5ÓŸ.ó"êL‡¾Í‹¨R¯Ô+÷^ñŠW¼20P¯ÜxÅ+^¿âµêe¿÷ª£?¦:·f0É< ¤.ôú£z­oN$Zúphpqrcode/cache/mask_4/mask_89_4.dat0000644000175000017500000000024411432665116016505 0ustar thijsthijsxÚíÙ1 €0 …á½§Iî9«Æ% Í Š‡ VÞðÚ€f×r÷ÅÖ0}òzì=¼#9ùìéûÎäÒ•:§þû~›sØó¹¨1BÕg&ë4pÆgœq.p.»í°&g·ÿÂT05Érgú™sgœqÆçrgæ¯Ïuô3çÎ8ãŒóëkÿ.Egm²»b*ÐÍ&›7ÔÉÍÎ?íçúð ¯:Þüphpqrcode/cache/mask_4/mask_93_4.dat0000644000175000017500000000025011432665116016475 0ustar thijsthijsxÚíÙK À „á½§Iî¹n$}P‚ÅŒBù]¸‘Né§È@ÍÎáî%sŒfkÒ«¢}CzòoA}aʽ2½|¤îé~ØÀªD&žl=¥êÀÜç¦Yœ®•ÁwÜqÇ}³» q\ÜEéY³˜já®K_âÎyçžÁwÜqÇwz$=’É=ƒ;î¸ãŽû_Ý‹ÿ€>ÜõéŸ+ÑpÓÓöH“öÈéÜ9ï¢DÞiphpqrcode/cache/mask_4/mask_97_4.dat0000644000175000017500000000026011432665116016502 0ustar thijsthijsxÚíšA €0 ï}MúÿÏy)Ú^Z!ÙÕÃôq3mXЈgõÞ‹ê$ÚÂçP'?ë{vﻕÉr¨u¬3‡ÓÝÓvuijSW¥i©M%|Wƒƒ¾Kp€à8À!ÉA–—ºÁaäÂòTy?ep°qà<0—à8Àp ·’[É­Ì%æà8Àá¿_ñW‡ýÙT©Ï­!Ï­.‡Ï8pÞpH× y1ù>phpqrcode/cache/mask_5/0000755000175000017500000000000011453417104014311 5ustar thijsthijsphpqrcode/cache/mask_5/mask_101_5.dat0000644000175000017500000000034011432665116016545 0ustar thijsthijsxÚíšÑ € Eßýšíÿ®+£%=ÜM¢3Cbvó¸ Ѭ›«ÍNkû¹´gqõkqq{©%ôO¿ÒòüoçžùÈû,i–¨ÅKÖeœeçÁ3[›|‰îiž¶÷‡¾õ˜ã©V¥¥h]` Æ` Æ0¦Ê•±¸zË´TÔ0Gu×ì/qŒ8F®„1ƒ±3¶:WÊò>õ˜´#ŽÇÈ•0c0öQÆ8»øE=F#Ž‘+a ÆþÄXÖÍž+cV©%9W>ßíQž]Tk©¹“Y-gL¸÷óîq¬DË艋Ïphpqrcode/cache/mask_5/mask_105_5.dat0000644000175000017500000000034011432665116016551 0ustar thijsthijsxÚíšA Ä ï¾fúÿŸË%YÃâÈ®Ø5Š/Ò™¢íƒgÉQѫݾC†up’™éÍ÷“»jÓöm?“Uß›ZKqCÔÊ\phpqrcode/cache/mask_5/mask_113_5.dat0000644000175000017500000000036511432665116016557 0ustar thijsthijsxÚí›Á ƒ0DïùšÝÿÿ¹^Ò6¥I63[è[EDqÌc˜ÅÑ+•ÏjÃy¤ì81•û\c ·‹7Úc«åªÆõû?uý}DK™4¦}Çï,¥kkûgì--ž3[÷½´U…Æ‚y„UX…UXýSV ³:Ï«ëûÕî,÷è|æýкSúô¾Š¯â«° «° «° «VÉ«¢¼*ÑXÒ[á«ø*¾ «° «° «°zŠUò*ßN÷Vø*¾J€UX…UX…ÕSóèXiýÊjTi4f¹õZkU^­Ôè_‡ìê­~ŠU‘çxþ }Õ®ñZ/rphpqrcode/cache/mask_5/mask_117_5.dat0000644000175000017500000000036311432665116016561 0ustar thijsthijsxÚí›Á„ Dï|Mçÿn/*{ÁM¦ÕÍ+„˜pÐI_&mˆ-äŽèѾžCæõä­òÏ3­2u­?o-kgB7wc=¯™‘ªU%yíoÝùRæhÓ¯șDo:Ö¶y¤R£JkQ^a†a†a†ÿáqOgÚiJ¯ýç ;úœáqOgÚ)ÓŠãÃø0 Ã0 Ã0 Ãð[¦v×ö>ç=>ŒãÃ0 Ã0 Ã0 ÃOf˜z˜3Ž»=>ŒãÃ0 Ã0 Ã0ü.†3ÿ÷ïZ£$¯×·8\õp”ÔÃùw4½Çá:ã¨ÖZÀp¤:q¹ÖÄù§X 7phpqrcode/cache/mask_5/mask_121_5.dat0000644000175000017500000000040011432665116016544 0ustar thijsthijsxÚí›Q Ä Dÿsšäþ—Ûº´²[+'Ò¾(RbC^ѽD(Â÷°Ã³‡düY9$ýoÎ!hý9ûÕ×ߛꨳwTìÞ[õÊÒX!gM÷ÅíË\¨›]æ6«[È5¬ŒVô4ä‘™sba¶a¶a¶ÇÙž´ë`{ÞÞscûÌK¶<æð\fΉuF·Ñmt¶a¶a¶a¶ßÍöìýöÙÙMëLgx/¹—D·Ñmt¶a¶a¶a¶ŸÂ6g7xÉ,/‰n£Ûè6lÃ6lÃ6lÃöóØß»9ÔYyë¦f;å>F•³ÞWyãNÙ\/¹BÎyu^‹mÅÿœ©aâø(’Ô¾phpqrcode/cache/mask_5/mask_125_5.dat0000644000175000017500000000040111432665116016551 0ustar thijsthijsxÚí›A Ä E÷ž&¹ÿåfc;S´¶$?‹‹”ŠØQ4ëáYaßhûyJ}9ºg=×Ú=©liŸ´.;nh_ÍÔýïwzýží.÷qôƒCW”¶üÏȧyº× uëÞë’PkÏ;ÌÃ<ÌÃ<ÌÃ<ÌÃ|*óqëùÎü,‡ m“kWæqçNÊl—%ª ŸÇçñy˜‡y˜‡y˜‡y˜‡ù×Ì×^Ïæ2ä°…sX|ŸÇçaæaæaæaæ3Ï™9lH‹Ïãóø<ÌÃ<ÌÃ<ÌÃ<Ì¿›÷웿Ì[í¢õüên`ì™TíÚûqж8ó¡^—vôy©öŽ«phpqrcode/cache/mask_5/mask_129_5.dat0000644000175000017500000000040311432665116016557 0ustar thijsthijsxÚí›1Ã0 w¿Füÿçº$uPXFC‚SŒ ðd°ºPq•*+fÇïPá{qÕ®•*|þÑ æìþ®bûÿÚÿ=¥lÈÞówoÊõ =d±¬!Ó7ñû×wZ¶ê Aƒ>€X€XèÄÂ*/dâø~ªAÍœ¸c¡fV¾YXå…,Cßo¡¾€/à ° ° ° äòy¼€/à ÌH° ° °@^ /È ø¾ÀŒ ° ° äòy¼€/à ÌH° ° oeÁuÏujö>Èn;×å…°çï]_mî;×å…N˜Y›3´ÒÀ´>ÀJNtphpqrcode/cache/mask_5/mask_133_5.dat0000644000175000017500000000037311432665116016560 0ustar thijsthijsxÚíÜA Ã0 DѽOcÝÿr]4%1mCTåÉÆ¯„Ð÷xΜ[DvÌ=Æá{Fúú–E¤Ïµˆäq½?Ý¿Ü9ûkeÑ­ù}±'2^ý•cœçš4G”žÛ:¶3=J£K-šôF0‚Œ`#ÿÍHÒþˆwð'#ß<{Ú~—Z4é :BG舻F0‚Œ`„áGø~„ŽÐ:‚Œ`#Á?Âð#t„ŽÐw-Œ`#Á?Âð#ü¡#t#ÁF0r·…ïÙ}Qõš}e¤üÝòR‹Ú;ø<ùçCžéV‹}Ñ—‘ìó¢ËÙY-Hžphpqrcode/cache/mask_5/mask_137_5.dat0000644000175000017500000000044411432665116016563 0ustar thijsthijsxÚíÜÑ ƒ0 …áû>Móþ/·ÇkÅ1mÂøªÈXº³ü=‰–ö¾µÈhýÕÚîså×áH"ãk ÇM„:îúê–3qÒOü¿W}ÿ9’Ô–¬I”‰“ýHž1ÙG;þ- Ï©sìîÚ¶ù?Ò[%M Å v°ƒìü#;£zg^ÝÔ3Õd}Î6‹“Å9ÛÆÎ¨Þ™×@7õ”Ò„ïð¾#gÃv°ƒì`;׳£Þ©\ï$ÔÅåŸð¾ÃwälØÁv°ƒì`çvÔ;ÞÖ}7Êwøß‘³a;ØÁv°ƒkA­µ”ïð¾#gÃv°ƒì`ç=N2wúxg§WÓ¤@n?Ûëc}½SQ“:ûZd?+¨ÏÎú9vÆÎzß)£ÉæÝáPphpqrcode/cache/mask_5/mask_141_5.dat0000644000175000017500000000045111432665116016554 0ustar thijsthijsxÚíÜÑ Â0 …áû=Móþ/çÍt"Ö uí|Y)²‚Ô˜§iF[[­fYÛlyúÜjRÿf65¯½óMMºŽû¦}ü5_ öMÿ=~¿~ø¶×ÙL·ßTTÜl³¹Çu%\Ëî¬G¶¥žÅ~Yµ¢",Í7aqƒ)La S˜Â¦þÁÔÈ|jŸ©‘ùÔ©ÞEï⤑4߄Š¢StÊÚS˜Â¦0…)Lå1%ŸºJ>Õ«ùökÁ'\j‚NÑ):eí‡)La S˜Â¦Ò˜’O©ù^¿æK§è²öæ0…)La SÞ¡•O©ùz‡–NÑ):…)La S˜ÂÔU˜J8ÿfóM‹Š›O§&ϧZT>•s6P휛4¾æ›ê› ¦Z„RÅú& Ý¶³îphpqrcode/cache/mask_5/mask_145_5.dat0000644000175000017500000000045411432665116016563 0ustar thijsthijsxÚíÜÛ‚0„áû>Mûþ/ç…(¥xtˆßBqCRÇý;n!Ô:EuŽòp^ÛÐãÓˆÚÐý¥Fmàö‘Flýê’ú¶F[¿ðsÕrD‘¬ÑØ:šUnµÞR¶Òÿ¶öÒbæìéX&_i1‘¨Q`a kXÃÖ°†5¬aíä¬Ù¯ÝYë­¬çvÊDj”Õ÷_Yë­C®çvÊð5¾Æ×øÖ°†5¬a kXÚ~íÄýÚÁE®ð5¾Æ×øÖ°†5¬a kXûÖôkgì×ÜËþ}m„¯ñ5¾æ?$Ö°†5¬a kXóì±~ͽlÏó5¾Æ×°†5¬a kXÃÚm¾Ûçð:ªÝnmkQï?Zh”ӯͧ)ýZ²FyutÖ†ÍG‰svH\SGŒÐphpqrcode/cache/mask_5/mask_149_5.dat0000644000175000017500000000046211432665116016566 0ustar thijsthijsxÚíÜ[ Â0Ðÿ®&³ÿÍùcµ }-s+'Їœ^;AÇxŽêã=¦ÅëQ­Ï_gUÝﵪæãx­ÆÞGûõTí½ëȺV¹ïúœU̪UE®«å¬æõ_IÇ´;ÿŽÇT1×öÅóôÌ Š©µ ]W 2È ƒ 2Èà ¶|oß5ØuóꆬuI¶:(WK­U躒ƒrPÊAdAdA; vÞ®íÑoíÝ_zNOæÏ{2rPÊA9È ƒ 2È ƒ 2Èà9íÑß}^O挞Œ”ƒrÐwQdAdAýn½žŒßMÈA9(dAdA¯^Wó„² ŽäZ…Ý.+•³GŸ^«ÌÿëKêÉÜÑ`×µ}Ë`_FÖê÷kphpqrcode/cache/mask_5/mask_153_5.dat0000644000175000017500000000046311432665116016562 0ustar thijsthijsxÚíÜÑ ‚@Ðw¿fæÿ®—¬¨Ð¬`ïÖÙD"I¶ÁÃe­ê<:aÔu,7ï«öOfÖÛ³šuÀëPÍ6Žî~ñís¾zÕÁÏûãsÞÏ,jÄÕ¬c¯³ëÌVöZvߨmé° ¸ì—s^uÜH®YðuÆ&›l²É&›l²É&›_±9¤¯±ÚÜê ;]³Ä^Ðjs«O;ì˜Ü”›rSn²É&›l²É&›l²9½Íy×›ƒÖèzAÖ ’›rSnÊM6Ùd“M6Ùd“M6§µéÞƒ»÷@/è±$7å¦Ü”›l²É&›l²É&›lzŽzAžC‘›rSnÊM6Ùd“M6Ùd“ÍOlîþ7á°šUìu¶NªãÖ›»F¯Úcú·óÌêÍP³P›—œSÔ,l;HûO§phpqrcode/cache/mask_5/mask_157_5.dat0000644000175000017500000000043011432665116016560 0ustar thijsthijsxÚíØ1ƒ0DÑÞ§ñÞÿriœ˜( r*¥· „\™Õ~>Cï£*¥ú¬v¹ïsýØ]Åœ_{W!Çzﶬ/ÏÝÞõ÷ÝÅÕ)½Ë™»¹Áöä¤vÿ ›ÏV‘®×6ÜV‘•Þ»ð¹Ã,f1‹YÌb³˜Ê Ìn^o¯¿>¿þí\Oï]øÜñ,Ïò,Ïb³˜Å,f1‹YyVž•gåYžåYžåYÌb³˜Å,f1+Ïʳò¬<˳<˳¾1‹YÌb³˜Å¬<+Ïʳò,Ïò,Ïb³˜Å,f1‹YyVž•gåYžåYžåYÌb³˜Å,fÿïÝukys77—Èì}ïvçŠÉæmbž=¥wÙsw³)ï»tWÖ†Ó:®phpqrcode/cache/mask_5/mask_161_5.dat0000644000175000017500000000051011432665116016552 0ustar thijsthijsxÚíÜI ƒ@н§éºÿå²ÑDp@ èo|m ˜¢ßrHk㨤Ñ~c˜½o³^ÝÃJz­×°‚–#5l»¿î¦S_92Ûî ©“[¯}¾ÜÃÈZÊŸ‡ó=œìTê2ìÿÆ€×P‘™2[cVì衆ÌC–Yf™å'-‡ÛìXÎ9>üv§Ë~u»“½sK5ì`Êe¹,—å2Ë,³Ì2Ë,³Ì2Ëç-ë—ßÐ//¯/o_q¾}KÇç¾ä²\–Ër™e–Yf™e–Yf™å³–õËoè—Ý+òÿ¹/¹,—å²\f™e–Yf™e–YfÙ³úe÷Šx¶B.Ëe¹Ì2Ë,³Ì2Ë,³Ì²g+ôËîñl…\–ËrÙ16Ë,³Ì2Ë,³üì<œv.×r륆Á½Þ¼‚™ýrO5ÌÿŸöÔs_ýZÎÉ”uËI¹_ÃìÞ*Ÿphpqrcode/cache/mask_5/mask_165_5.dat0000644000175000017500000000051411432665116016562 0ustar thijsthijsxÚíÛQ ‚PÐW3³ÿÍõ“aVr‡ÎS$ ä9¼ÃmD«®£ÓFmc¹û\vÜ™eçí{µì°íÍZÔ¸¯¾z¶×ëòWßs¶ÇYÆŽèZöˆu¹ÍrõÔÉÛòòjö¥ƒ³çv\®™ÙÑcJ-‡¬KÆgœqÆgü#ã!=äj|¿Þ¥Ÿþ˘Z¦÷ã«ñý{nÏïÄþ‹—ãr\Ž3Î8ãŒ3Î8ãŒ3žn\?þ‡ýxL-ÇÜs“ãr\ŽËqÆgœqÆgœqÆŒëÇÿ­÷ Ì÷Ü丗ãrœqÆgœqÆgœqï¤èÇ=ã9.Çå¸gœqÆgœqÆgÜ;)úqÏÀx'EŽËq9î¿:ãŒ3Î8ãŒ3žg¼;’”ZÖˆu¹N°£ûñѬˠ~ü~ιÏÀL«åãäãj¼_Zü!uphpqrcode/cache/mask_5/mask_169_5.dat0000644000175000017500000000052011432665116016563 0ustar thijsthijsxÚíÛÑj„0Ð÷|Íäÿ®/¶niµ¢K¹£'ŠÈÊ.rö:ÁT-m&¶ZÛx9¯yüq§3rÿµOgàv¼OO_zׯ§u`]ÿüÈ·¾ßitëØ§™ãt½Ùñil¦oc¿‚ö1ã3j9Ž%_g|ëÔ§Æ)ûì³Ï>ûì³Ï>ûϰ¿=×teÌ&õþ_ã4¤Þÿ²¿=×t¥UŸÊ}¹/÷å>ûì³Ï>ûì³Ï>ûO´¯Þr½5/u“¹>¹/÷å¾ÜgŸ}öÙgŸ}öÙgÿ®öÕûO®÷½Ûsv®OîË}¹/÷ÙgŸ}öÙgŸ}öÙ·–G½o-w{¬å‘ûr_î{ægŸ}öÙgŸ}öÙg_½¯Þ÷nµûì³Ïþ=ì×n]˜4Nk§Öβ_Êðÿ­÷«M½¿ž¦×ûû´Ï8ím?ñÿ´SF…·<·phpqrcode/cache/mask_5/mask_173_5.dat0000644000175000017500000000055211432665116016563 0ustar thijsthijsxÚíÛ[ ƒ0Ðÿ¬&³ÿÍõG1Ðø¢gäD)[°Cz¼±÷eDÖѷц÷=R¾NÏ6²îóÚFÒíJm ÞÏJq÷Pœ}ëxÞö séîÑ_¾õ}¶éGÚF©y;žíú¿‹ [;ý]™öé¯eÃk[®ÅQbT«m±yË&0 L`ÂÌ„Y?á¨ÇðرÝÚæ¼wØ›· ïfý„£ÃcÇÊÕVNä9Á½˜À&0 L`˜×„Zý„¤}0=F=F9ANä÷L`˜À&0 L`Bz¬Y²fIñß=F9ANä&0 L`˜À&0 ž‹´fIÑs‘r‚œ 'È L`˜À&0 L`<iÍ’£ç"å9AN˜À&0 L`˜ðVÖ­aB¯XÛ"ý„±²ù×,U­m…>Øö± =Æw˜óZ¶gBΜPª¶” !8phpqrcode/cache/mask_5/mask_177_5.dat0000644000175000017500000000056111432665116016567 0ustar thijsthijsxÚíÝÑŠÂ0Ð÷~ÍÌÿÿܾحˆšŠ ÎuO,"% ñô:$Xui=¹ÕѶ«×ÕƒŸïô¸g÷Ƹ?Îq­.úÕSo~æz׉¹õWï:ó™·=Žh1cÜqóøèñþ]ì”Ƕ¼îiÇÖ!÷¼ßçírß8Æó˜¬`+XÁ V°‚ õеÓê»j›Ïjž;—8ÆóX®+ä ¹ÂoV°‚¬`+XÁ V°â?[1µ^ñh-Ö³5Z;§¶©¶ùrmS®+ä ¹ÂoV°‚¬`+XÁ V°â;¬°ËZ,µÍYµM¹B®+ä V°‚¬`+XÁ V°‚ö™Z‹eŸ©Ú¦}¦r…\!WȬ`+XÁ V°‚¬`+ì3µKmÓ>S¹B®+ä V°‚¬`+XÁ V°¢cþò㊛Ç{g;¦^Qq5¡ZU»ÆÕÝ®ûŸQÛLã0+*&YDqÈñéô*6phpqrcode/cache/mask_5/mask_21_5.dat0000644000175000017500000000011211432665116016463 0ustar thijsthijsxÚŽA ï¾fçÿŸ+¢ÂÊ(\=İØH=ÔŒ·É% „´²ÿî*å@ÿ?6+¸5Ž»¶ˆ%§]^ÝønÒ¡™SÓphpqrcode/cache/mask_5/mask_25_5.dat0000644000175000017500000000013611432665116016475 0ustar thijsthijsxÚ‘a @!ƒÿï4îþ— ޳ʢš™ ?,"ÅÔÌ"j½¦¡Ž?n<¶OÕÛäa ¬w, l}rG‹M;ϦÏ9[ží ¤¢_ú±x|ŸÊÖ=´l4lK¨ýv½phpqrcode/cache/mask_5/mask_29_5.dat0000644000175000017500000000015011432665116016475 0ustar thijsthijsxÚÕ’] À ƒß=M¿û_n0W .«Ž=-ÁŸ4¡mÄy×B€ìÓ+² ‰·ÜR×á“çôˆ‹†$¼­Æƒ.=s/,+îB÷7žó³q®zÄ~§q>=GéÙêŽZùyÎ:—ÜDRŸ«phpqrcode/cache/mask_5/mask_33_5.dat0000644000175000017500000000015211432665116016472 0ustar thijsthijsxÚíSI!»óúÿÏMÆ…8B5-„!M@µj_´\ýLÀ¥ã@;¿:Žx©ºÁBÐІ)êHy  ˜á˜Ðq½œñb?DoÌ:ôÆ‚‰ð[^/+Ì‹²ß·½¬p|ø¶Îºphpqrcode/cache/mask_5/mask_37_5.dat0000644000175000017500000000014711432665116016502 0ustar thijsthijsxÚí”Q !Dÿ=sÿË‹-.Ú0-}6Š%“(÷Í=ó$”ZºÐeõB½¤¹˜Ž2N°0¤#–i sEµ¸0P©^â\—ñ2~Ö¥7”ºV_Îøë¥ÍŹ$FŒ¯oÂðphpqrcode/cache/mask_5/mask_41_5.dat0000644000175000017500000000015711432665116016476 0ustar thijsthijsxÚíTA À »÷5Íÿ?7˜«ÈXMtxÒ´x©¤ …¸?@‚˜›7@ò¾~"éN$õ‡SÖɰÄ{ø+C³¨ÛA'Êör\PŒpè<Þ÷-¼ ͺ:S3s¹Ô‰ùÛ»ËÞ©Îz#žóqw™ó› >þphpqrcode/cache/mask_5/mask_45_5.dat0000644000175000017500000000022011432665116016471 0ustar thijsthijsxÚíUA€ »ï5íÿ?ç„U:N&Z"†”:;4P1=ƒbNvSGÆM1¶ÜË›½n<ëv`q³¤{ìîßMg§ã¶4þå=Gó-T¹‹º?›“Ôß='kíÈu™Û­ž“õ>‘ëß'¯®çþÜ(éκŽö Jô{EßѵsÊ]È ,§sqðphpqrcode/cache/mask_5/mask_49_5.dat0000644000175000017500000000022211432665116016477 0ustar thijsthijsxÚíVA À »÷5Íÿ?·Ã*jL+ìdÁŤÖν ^aÍÜAÇahŸr€4…ÃŽÙ©©'\GÝdŸP›­¾¸ì9æe´ro #ÑÐq½úß«åŠ!˜¯Wã{EV2 ÷^ÝÜqˆu°Ñ¡TÁÞ«Pýè8ôüðé?ËÁޏŽS¯öñÈÄ\ÄP%Ç[phpqrcode/cache/mask_5/mask_53_5.dat0000644000175000017500000000023111432665116016472 0ustar thijsthijsxÚíVAÀ »óúÿÏíâ"Ë zYf5ƘJC ª ˜A;ÄÜáé¾Âlû\˜,†ëdòR.¯ \(åe_Ýú ³æôеaNi5†ª\żކÿÐÐë‡aLPòò(¯ÐàÒ;×ý±2שÃãå¯jÈN6O u…+é¯Ñl{y•«6odúá^ ãÚàçC[‡%® „phpqrcode/cache/mask_5/mask_57_5.dat0000644000175000017500000000023311432665116016500 0ustar thijsthijsxÚíVA À »÷5Éÿ?·‹NÝlªƒZ‹HAbB‰Z0aÓ ìÎMÆÒÃd`1Ýz”'"<Õ1™æ9nvͨ.ãô )bÝ»µ~¤;˜Ÿ9ú¾ÕZ#tõBÁ~phpqrcode/cache/mask_5/mask_65_5.dat0000644000175000017500000000024311432665116016500 0ustar thijsthijsxÚíWA !¼ûçÿŸÛKK.Tèè^B „f¬AÕˆ„ÎsV¸óòDöËaWòó Ø 1 ̓½áåì`ÔP=i²Œ> xh-Z‹Öâ^-öÞí¨Ò~qæÁa%2xïÑÇJ †~ýGµ­ÅÍZ0“ÞW ­Âø«Ï³žÇ/*1äç,Ö»ÿÖÂÓ“ÜÜmßEÃŽ Çphpqrcode/cache/mask_5/mask_69_5.dat0000644000175000017500000000024711432665116016510 0ustar thijsthijsxÚí˜Á À Cï~Móÿ?·‹NâÚ%!µÈ  ¡o¥Õˆn¨ZLkËw ¸oNAÝwZP\%-‡h-/‘Ï c”Hò2Où³y¿½øwß½õše*-¢¼˜‘™‘]Íè³OF§™!“iag†Áè4×¥b®#ב™‘]Ɉ¹OO-!ÉË×+C®…¤7òw{$Þr3ƒZ‹€QP•$×Bøíú†Nphpqrcode/cache/mask_5/mask_73_5.dat0000644000175000017500000000027011432665116016477 0ustar thijsthijsxÚíX[€ ûßiÖû_ÎTŒh`FM !„Ò´{$s/@¾Ãª»#tž~Bh79!°z8u>vèä·ªÜêÄb§˜Nûg¶zv*ªÔ6Ð1^N+ù™œu’wòî­ÞµúÝð›!©f^ë4T37ïZýnø-•“òNy'ïäÝÞý»fzËô~§¼SÞÉ»/xGÎU*˜©ÊÑ»”yÁ_3ýb&6^3gpÊÓi–wñxÊŒq ÀñÄphpqrcode/cache/mask_5/mask_77_5.dat0000644000175000017500000000030111432665116016476 0ustar thijsthijsxÚí˜Q€ Cÿwšõþ—ó#&C`T£±ÃÃ6¼”ƹ—B¶ü(«Þ©9Ü Ù'Ö†äÑÖìƒÚ¢ÓÀÀzk·å"hõÜêÝv.` »øâücXöB5[ñ(ÅÖF>71Ó/3ò4ÎØÎªz÷^'ÑÔÝ[˜Fyglg•®M>•OÅTLÅ4Ï”{÷&3ëWy*ŸÊ§b*¦ï`ºÚ<3õ;´‘îÞVo0÷/s—6nÿ‘§Ï0Íya½ß[û”ªmácEphpqrcode/cache/mask_5/mask_81_5.dat0000644000175000017500000000027411432665116016502 0ustar thijsthijsxÚí˜Á À Cï~Móÿ?·Ãtz°U4½ŒÔ"£ }tšÕÀMX2|.îÉ‹¸Ë™F\œžð¸õÑÂ~mõ‘4 ÷±¿ØXu Ù”, ÍÌw—:— E†Æ„>еXÿõ̯=_Ö]g>±>óÂÆzæ×ž‡/ë)5ךk±k±kùµüZs­¸X‹µX¿¬Y{Ü®Ñè}ô¶áç~mt¿æîšìÃÏý:S#™µÑ&;U#)ñÚäphpqrcode/cache/mask_5/mask_85_5.dat0000644000175000017500000000027211432665116016504 0ustar thijsthijsxÚí™A €0 ïyMòÿÏy°R‹Zj²+›–"9Ô%NÓ`Ü›EÕ¼›ž=Êëe×(Ï[­QëZ_ù—ãšó»ÂŒ­µ×¾±ß/ÃæïNN èÙj«µ3Pci%ÅU ˆ1 ¾g é· Ü±;O5aÚÏÒJŠ«ò€ò€b@ ¨P= < < Ä€øÀ~Á)®¨nÁÈü¿ö {Çú¤g”¯ØZ9qýŽ*¯¬³´ .Yphpqrcode/cache/mask_5/mask_89_5.dat0000644000175000017500000000032411432665116016506 0ustar thijsthijsxÚí™á à „ÿû4Éû¿Üþ¸5eÆÙå®npQ¤´ Gú™cÖÍf‡µðl^^‡;;bŽ5;`¬k¶©¶U͹߮¾ßj`ÍNósÜùùO=Ú\[a6‡žÁ°¶~ÞnLÍD?‹ ±!6ÄÆ°ñuüÈF%w¿*Ȭ²ÌkÎù¦f¢Ÿ77”SĆØbƒÃ†êXodw_ùØÂ—mµ¨â†â†ØbClüÈNÛ™ ck&äîY¯­VoÜ¡™×·B×¢»Ø¨œAl6Æ šæJjÜxphpqrcode/cache/mask_5/mask_93_5.dat0000644000175000017500000000032711432665116016504 0ustar thijsthijsxÚí™K Ã0 D÷>æþ—ë&©»ð¯µ& áÉÆ fP^”ÁŠ8BY5ÊÇs(imœ®¼ÙÒ®¤±®=f—µ÷3¨/wÛ§§‡E»¬y¯§ŸïYŽQ¦wf‘á[}¯å¨ ²„[»9ï0303ÏefÇÏÌ™Ùñ3'3=<òÆK{níæ¼Sg¨3ü›`f`f`æ¿Ìdø™ÞÞè®oiü£¦ÎPgø7Á ÌÀ Ì܇GµjkÞG]í}?V/æë kÒ×Þ÷ÀWi72–Js™vÃ|*"f^phpqrcode/cache/mask_5/mask_97_5.dat0000644000175000017500000000033011432665116016502 0ustar thijsthijsxÚíšA„ E÷œ¦½ÿåf!3bf5í¯Æ¼Bˆ‘ùé£|#f=<3l6<›§Ž_+xjÿ©ÁÛ) “ÙÝ©Ãy°“ïÿ¯ ‰J ¹yXiïÜ»ª5¤IzsÙžîcëuÄeQ¡¡ °K°K°K·d)â—>,ͼwx®DƒÖ·.,;ãÂsÔ%êg,Á,Á,=€¥ëýRÐóὓ¼7u‰ºÄK°K°ôT–D÷†<(n lY’þŸÞhÐùVÛ¹s÷Þ•ôy¸Œ¥´ýP±§Eñ<¸öqphpqrcode/cache/mask_6/0000755000175000017500000000000011453417106014314 5ustar thijsthijsphpqrcode/cache/mask_6/mask_101_6.dat0000644000175000017500000000042311432665120016544 0ustar thijsthijsxÚíšk „0 „ÿç4Éý/·Ën_.‰Ê2#ˆS‹H”6±_“PâÞZ ›Ïf˳_¡îé,ï7ØžÛà+·%×åWÇÂîd„–âÏnå}–“_&«Ok;Œ×úP¾Çfµ>³t‚yY×¾]Öns °;s·æs‚Ú,º!Lk¬ÁÔ…cbLŒ‰12cÔX9Ëó1 ÔÀZç#XÐò±En#;ÏsvŒT~L~L±RŒ‰11vsÆ.‹•”³‹1‚ò±¿ò1ù1ù1ÅJ1&ÆÄØÓÙŃó1ù1ù1ÅJ1&ƞī²gËØ KLƪjl¬¬k{g¼Úž5óKò1/ëÇù¯~,aŒ»ù‰õc««ö$“Þphpqrcode/cache/mask_6/mask_105_6.dat0000644000175000017500000000042011432665120016545 0ustar thijsthijsxÚíšQ ƒ@ Dÿsšäþ—k¡®ÙBÒZ»#o)Sd}ÌGÜ·Šå¹lú쯯Ö^‹žúú³®)G]Sñ4ÝS×ëšÞÞñ¸ó?½#BºZö:Õã+{þñÅ×s§ÁH¨KþNóiIŽÂ!¦«mþòe1 RWe9!ÿ¡`ö`ï¶ìUy¯Ë€§uë:檞»ëÖåšU=w×-ûo•ÔºwB·}cMÞKßÃ÷è¹°{°{ä=òyßÃ÷è¹°{°{ä=òyßÃ÷è¹°{°wSö¤caoìi'Ýföºé½õyO=C•yO=C•y¯›ß[Ÿ÷Äó{SÞ»œ=—;Ÿ|v4}ϯ2‰¨¸0§phpqrcode/cache/mask_6/mask_109_6.dat0000644000175000017500000000040111432665120016550 0ustar thijsthijsxÚíšAÂ0 ï~ýÿÏDBHÓC½HãV2‡Æ0Ùn¥uoªò£løì¯¯²¯Ë»=Û¢s9[ˆŽõl'«ºÝ?™íë7ÏíR"¯ &“§Û2™ÕßÏ:7QqX_•n» §û]£$ÓÕš–EIYôÁ*¦³ÆL”üq0 “0 “0ù{LJýäз(s\ɳwœô¾‰¦X÷-Ó7^öÑIt„I˜„I˜„Iü$~?‰N¢“0 “0 “0‰ŸÄOâ'ÑIt’g7LÂ$Lþ-“›„¡€Iuzrfr M÷“^ê'}“éÍ÷“•ùÉ(ÉO~RŸé]1Y²ãLÄžuÒå9ó¡QÍÓ•phpqrcode/cache/mask_6/mask_113_6.dat0000644000175000017500000000045711432665120016556 0ustar thijsthijsxÚí›Ñ Eßû5ôÿN£°¤Õ‰ëõÁÃÈbF6¨on´¶¯,m›>·gSÅ9ìñÞRWã½ðˆcŒÇ•9Œ&»%‰1ùöÏ_÷Þcx= GR^°šw-z?Ãêdzõvî=î,¹ê°}Ô¥?ǹژ³:Å9œmÓ=—ó=@U”¶ä²‰„UX…UXýVe ³ûÕÜÅ~Õby4WúÕéiæ¿:Ýe=ó‰ó¡¬F§ùœ»ÓÚªÍW°ÓÕv=u¹™×€ÕQÛΛ˶a¶a¶aû¶eùv÷ŸæKòíÊvTKf5æeŸåóŸ—ool+óíÃ…n£Ûè6lÃ6lÃ6lÃ6lß„íuùv´w“íé\öQK®¨%Ñmt݆m؆m؆m؆í?g›½jɹµ$ºn£Û° Û° Û° Ûwb;é@™Ì¶²ëæÌvÚj45ß.ËönJÒS6·–\Õwãò¾›VKj{ÊFlË¿hSvžu»Hû%;{ã˜à}phpqrcode/cache/mask_6/mask_125_6.dat0000644000175000017500000000046111432665120016554 0ustar thijsthijsxÚí›A„0E÷œ¦Üÿr3™±¶&H °yØb+öùSlhí0Ͳ6L¦ëöwEŸÍÑ¿žœfÇ®I‡»÷¤vî;»íó&vwž,oýÅ]ué¶dþ]|½k棘øÞ9ÔŠCú“¦}îs“1»9Jw9Ë¡½Zb¢=ðŠèå€PK&æaæaæaæa>€ù’õüɼ—Æú$<>¯OÑôvòÊù'ÅûËåCçÑytæaæaæaæa~›ùòõ|êžÔÙ'9li‹Î£óè<ÌÃ<ÌÃ<ÌÃ<ÌÃüóìI‘æç°è<:ÎÃ<ÌÃ<ÌÃ<ÌÃüóÙ•WæÇ²¸‚y¿:.z=¿ª ŒÝ“ʯ œsØVšÃ¶E=ll›_k0_#võ°³Î¯˜mÝ÷›jphpqrcode/cache/mask_6/mask_129_6.dat0000644000175000017500000000046611432665120016565 0ustar thijsthijsxÚí›Ñ Ã0EßýýÿŸÛ`ILA·‡¶ZÆIKŽ‚ØœxcYåR_²ýÖÏ_5Ï ƒw¼îŽk`…W\ƒ Ë,ûóñ¸‡o5ß¼'žíÄ–•²ÑqUÜ~² _?àù¸g0÷¦u]2*=ö[|ÇVžˆÛSÆ9mmKl « 2v¬µmX€X€…‡±ù…ÌC\—LÉÜ­‘V\2={·FZqq½)úLé_—•P­_ð8}¾@_@#Á,À,À~¿€_À/Ðè h$X€X€XÀ/àð øú} ° ° øü~¿@_ / ‘``þ˜…–1× =“¾; Ù´s_èšñt¿Ð5ãé~!›w®ó MóΛ_x ÚÖÚfÿ½/h÷¡øfj[ùphpqrcode/cache/mask_6/mask_133_6.dat0000644000175000017500000000045011432665120016551 0ustar thijsthijsxÚíœAƒ0 ï~ýÿϵRI m»¨ƒ2—ÔÍd³'s‹RGîÝ{¾>©žÃQ<Óâ{X‹_ãZLF{Y~R‹¯ÿN“ÿœ¶8aDT%#Wçßãˆ6_ËyE­~¹èîØ×1íÊyxƶ¦—5¢Z!œÕˆm®–ubÀŒÀŒÀŒü #?Òå£ì;ðÆÈ̳Ëò!þÕã|(|ÇiAGÐöZ0#0#0‚ÁàGð#è:‚ŽÀŒÀŒÀŒàGð#øtAGØkÁŒÀŒÀ~?‚Á #è:#0#0#?0²èà2âêf?2²lí—ù‘¼…ÉÅ™:?r‡~ö²ö³ï~ÄwæÃˆëŠ®“@Ž:’¶sQºxðŸ#phpqrcode/cache/mask_6/mask_137_6.dat0000644000175000017500000000054311432665120016560 0ustar thijsthijsxÚíœÑƒ Eßû5ðÿ?·e…¥ÕÍÍ^²4fHåp[1-e)UQÊV¬û]žU™W÷Nî5ù§o“*8|›Œ÷Û©ìW¹£š6žbk?Ý÷ÿ{‹f¬´„ì|>¾sÖª‡ìür6öö¸“6‡«ú°6ÉrÒŸ¶=ûüv¸Ú²þWy±Ú ¢¶Š-¸Ê' ìÀìÀΟ²ãÅ;q tQE>U–϶öf‘¯•ê³­ìxñN]TcÑ(sâ®7tÝAwðÙ`v`v`v`çkvˆwfŽwtû;]«ùÞ ;躃Ï;°;°;°;çÙ!Þ™;Þaoôå]ºƒî ;øl°;°;°;°Ã· | Ê· èºƒîà³ÁìÀìÀìŒì(3}Œìl.­š?«…"Þ‰r}äÇ;Ú\}¼S¦Ù-AžœüwÚ<9;úEVœ'§×ˆôó¡ðphpqrcode/cache/mask_6/mask_141_6.dat0000644000175000017500000000054511432665120016555 0ustar thijsthijsxÚíœa Fÿ÷4íý/§‰c Òêâ¤]òزÈ…¥ª[²¬¤=Éð[E럓ÖÜósî¹m,éšÛfÒn/ß|kj\ä¿òj§?g½ÝþòÈ[qþû(NO˜Zc5ûŠ©SGGP[oM×Vá’Ö¸´éf¼¥÷vÖL<lYQ7dí?Fxk}´–Ðjoex]?ºö'#{ÿ>ÏY Øæ9›UB—¹þYÌyΖW~Ö{|À½³V½_Õ.Ùüû¼¬c¶ï³ùÏ÷`ÙÁDKÛÊ1ЈŸ³q/ýÊ'(Àp,½jq­´#aiY+XZ܆Mlb›ØÄ&6±‰MlÞ`3i¾yÆ,}î¹rg6ô•­yYÅ,-Ê b–Ó]9§;úè&ݤ›t›ØÄ&6±‰Mlb›OÏfô|3fíÁy/èå¼ ºI7é&ÝÄ&6±‰Mlb›ØÄæS³iíÁk­=àÝô‚è&ݤ›t›ØÄ&6±‰Mlb›žC±ö€ä9ºI7é¦ÿ´ØÄ&6±‰Mlb›¿a3ªlè'6³*­Žl^U§Ý7ßL«ÙפÕÀì^ÐU}Ú}^PX}ÚÁ Šg³Æ)g\íè®›5UÞk¶cphpqrcode/cache/mask_6/mask_157_6.dat0000644000175000017500000000051311432665120016557 0ustar thijsthijsxÚíÝA‚@DÑ}Ÿfæþ—ÓDÐN%¾Ón Ã§ü,ÚÖ–ÕSVÛVí>·ÇW³Ã³»—CöaïzÈ6îÝÉUü¼~Ò»·{`ný•ЏõÙÉÝ»dvVýy~µrÒ·Z¯"çq·Ûk{>g$ÅáXK¶õÈU}m\b÷ja¤GÞx˜Å,f1‹YÌbö¿™òÙ]½z¬‘­Ìž½ƒš^¯.ë5Ó[?Ö嬜•³r³˜Å,f1‹YÌòY>Ëgù¬œ•³rVÎb³˜Å,f1‹Y>Ëgù,Ÿ•³rVÎúmŒYÌb³˜Å,fù,Ÿå³|VÎÊY9‹YÌb³˜Å,fù,Ÿå³|VÎÊY9+g1‹YÌb³˜ýŠÙ‹ ½̦M7>2{9zºÏ¶hŸm3Éçûlò|ã9ßxóÙ¼™ä#f#Ÿx•6 ÿ˜³-îvë%…N'phpqrcode/cache/mask_6/mask_161_6.dat0000644000175000017500000000061711432665120016557 0ustar thijsthijsxÚíÝQnà EÑVûß\«ÖNˆÌ4M¹¯ÊÁ–edFsó ¸÷­Œ¤Ò¯¥MŸûwUÂuy‡Ÿ59çÚ‡#èXûðЈeûj÷Ÿ«²Vøð«(ÙmÖÑóûïkk)‘¥dùuþxÎÚ¸Ãò9Ñv×Ú×îìŒÔ£í­Œú;œÏv¡E¹¹¶MGlicw`ªÛΈ D,cËX>“å¸>öd­È>öô«vÉNùjÉžYÓªVþuûb­­£!¤M—é2]¦ËXÆ2–±Œe,cËX~šeùò;äËÇçËõçÓkþÉØ]¦Ët™.cËXÆ2–±Œe,cùQ–åËï/›+ò’±/ºL—é2]Æ2–±Œe,cËXƲµòesE¬­ Ët™.ëccËXÆ2–±Œe,[[!_6WÄÚ ºL—é2]Æ2–±Œe,cËa,'îtËò5eIey¹K{T¾¼Þë>)_ÎÜë~Η{ü\‘¾|oEÒØWæ{+,çŠJè{+f].XÎ9?+?·phpqrcode/cache/mask_6/mask_165_6.dat0000644000175000017500000000062011432665120016555 0ustar thijsthijsxÚíÝájƒ0Ðÿyšäý_nƒ©ÉF"Ýw¥Ç–2t <½~™’Z·¥¥-µ/eø¹~mÊùœìåçú¬÷¼/[ØkÞ—?椋§¿ÿòO~ÙÚ¼/çÅëëÛ±—W´¶Ò»œ¿²_þÖZ{Åø=gßIk}/wO-ùUöŽûºߥŸ5iÉ3|–-3[ôRÚޑɽY6€-úÄdœqÆgœqÆ—ÆS¯ÕÖJ¿nŸ×ÃëJùÆ-e}œÿ^÷ÖJ‹­Ç‡ÖÊ1º5óZ†Ý¹EŽËq9.ÇgœqÆgœqÆÏ1®¿z<òÿãÇú¹Éq9.Çå8ãŒ3Î8ãŒ3Î8ã ÆÕãïV»æº179.Çå¸gœqÆgœqÆgÜ3)êq÷Àx&EŽËq9.ÇgœqÆgœqÆ÷LŠzÜ=0žI‘ãr\Ž»VgœqÆgœqÆŸdûì³Ï>ûì³ûãµ¾ +õþõ'{«„Õ§_õVËŠÚx­-âJýËø<ӛܗûr_î³Ï>ûì³Ï>ûì³iûêý;×ûù÷öœr­OîË}¹/÷ÙgŸ}öÙgŸ}öÙ¿¦}õþ½ë}÷ö¼x­OîË}¹/÷ÙgŸ}öÙgŸ}öÙ·—G½o/{{ìå‘ûr_îûÎÏ>ûì³Ï>ûì³o/zß^÷öØË#÷å¾Ü÷Ÿ}öÙgŸ}öÙ¿†ý£d²ì'ŸÊ³µ|ÔQR½ßNSï·Ã3¹’êý³œËÓãÏåYÖú²ÏäÚ³ÿ‰ZÉ'Çms¿EŸÇ·j›5øphpqrcode/cache/mask_6/mask_173_6.dat0000644000175000017500000000065511432665120016564 0ustar thijsthijsxÚíÝaŠÂ0Ðÿ9MrÿËí¢­M SÜ*:a_-²5hh_¿)©uÛZÖ­[éþ®÷¦lïÓoûÛ’sŸmKúšíø›NÇ{òÿãHÌ?x­Ï`l‡#fï9>’ÚŸ[¯õeé·Ð„ÏŽß“­¡ ï?þ^ìóöm÷ó®­ð*û/KËm¿—ãhËy%ÞËv-nKl¥í»Âè–í¤kK¸L`˜À&&Ìê g5†¯µ•(·gºwxôY¢ÜžîÞáa¬žpVcøZ[‰Æ#O=¡ëSNä9Á½˜À&0 L`˜Ç„¥ê ¹ç't­jŒjŒ]QNä9Á½˜À&0 L`˜Ás–ÌYRcü@QNä9 L`˜À&0 L`‚ç"ÍYRcô\¤œ 'È r˜À&0 L`˜ÀÏE𳤯è¹H9ANä&0 L`˜À&ü²¯ 7špÜ6¯`Â|õ²¬õ„hm¸œs–ò¯ ××ëR5Ƭ™³Æ˜½È‰ k\ÌX/²Ï ‘ )÷g9Èphpqrcode/cache/mask_6/mask_177_6.dat0000644000175000017500000000067111432665120016566 0ustar thijsthijsxÚíÝÑn„ …á{žÞÿåÚ¤*4vÛ´u¦û¡1‰£²ø{f{Š¿Ð¿³_ñù,¶,K9o 4ŽÇµôù7lËñÞniJiggiår<¤-MGÆ ¬À ¬À ¬À ¬xuVÄ÷+zÌÒRøCÌr9‡+Gqç6ÞQWžñb"ø×Qe×ï"ùWLº‚® +è ß XXXXX/ÁŠ|~Åj,ÖnŒÖmu¼MÞæÚÛ¤+è º‚®ð ‚XXXXXñ¯Ya,–±X¼Í;¼Mº‚® +è ß XXXXX晋ež)oÓÓ˜Þf’|¦ƒ·™–5²H“û¸ëŠší¥÷7/Dphpqrcode/cache/mask_6/mask_21_6.dat0000644000175000017500000000012711432665120016466 0ustar thijsthijsxÚQÀ Cÿ9M{ÿËi]èÒýX‰1¤À Å-½ C!»É³Dìû7 W ìÙœ§Ø&rDñ)~Î]<MÎ ·3(>{ƒïA ¡«ÿíŽa²¼Sýphpqrcode/cache/mask_6/mask_25_6.dat0000644000175000017500000000016111432665120016470 0ustar thijsthijsxÚQAÀ »÷5öÿŸÛ2)êe+Ä(XmÊZtÆ*(õÚ¹«;ÃçtJã<峂†_Ú¤‡3°oŠÜ½Ú´"Ì¢a²zh}Ñ&qv€µSGÊÖ™,ó-÷‡™J›Í4}³™¦oS[âü}wphpqrcode/cache/mask_6/mask_29_6.dat0000644000175000017500000000016611432665120016501 0ustar thijsthijsxÚÕRA À0 ºûšäÿŸÛXcÔõ²ÓL(4E”ÔˆB 8CÖܾ޳nÃM©+lǪÃÕ†Ožé1]&•Ú¥4UëD-6-$:6ÊdZá?yæÛlôÝf£?í˜ åŽ8?žß²±<Ûlôž}ž¹g›göí *phpqrcode/cache/mask_6/mask_33_6.dat0000644000175000017500000000017411432665120016473 0ustar thijsthijsxÚíS1À Ûy ùÿçÚ+³H:96r9MI1î 4o¾ øÜ÷7ÿªAmí]eÐX»Ž8â¥ú†ZVQ_ž½<»å a(¥bùÿ ù½ó É7FF¾1’2/äd^¨û™—ðâ*ûœ‹Ì ç"óRu`Ïophpqrcode/cache/mask_6/mask_37_6.dat0000644000175000017500000000020011432665120016465 0ustar thijsthijsxÚí”AÀ &ýÿçÚT `½ôèjvˆº“bç'J)…ªÅ¡}r™D"Tphpqrcode/cache/mask_6/mask_49_6.dat0000644000175000017500000000027111432665120016500 0ustar thijsthijsxÚíVQÅ ûïiàþ—{K&·ÂêÇûYX¤³ØÙ0ï̦!=ÛýŠ­tÇån&ÅðfpŒWL ±`¤/¯<Ï“KVrU¢\1öbGpáê@ÄìÓ‘&fNëŒ/+ƽqÙà ¢`ðàòAWÿçêSƒÉßRGpõþ_5|Æ|zÀ×xν:¸¢ªåJ©‚+WE©m4hÛ4Ú3tÜ­ƒ.×Á©A­g`\ÉÒù¬÷ʤþ*ÙÅFÈôphpqrcode/cache/mask_6/mask_53_6.dat0000644000175000017500000000030311432665120016467 0ustar thijsthijsxÚí–Ñ€ EßùùÿŸ«-M¨Ë[¢s §Ì°ÛZ7]Y›&æ»][Ñ O;|âXº8–¿û?ˆå^2N=<€FÚB†UÎ8ÏSƒV† >Ëße§L><3Ü*=Ç´d¢#P%št8ZzØfø†¨RŸD•K{‰à~Djùfˆú!õ‰»ƒöCçá®å3Ì*Ïp¦…!V«ZŽ´ ¯å¼¶±µœ×6¦sY½Qè‡y}Ö’£ mF é<*B’phpqrcode/cache/mask_6/mask_57_6.dat0000644000175000017500000000031311432665120016474 0ustar thijsthijsxÚíWÑà |çkàÿ®K¦ÂÜQ¹-Ë^@cª"Wr^U‡YÅÔM³>_Ý`åÃî8¦޹€GÁ1“œ`–B”Ý`;»ù+ØÂì}åÄÌØ&s£ÒçŒ]<§J…QF=mb3 UŒF'ÚØ6¶Æ–á„E âü€¹5õJa÷wZØÖù60¢¬ ß[¹·ë¶9¡±ý9¶”ì{Á–SšÛ\Ýž8Õ`k&­Áœos}{â[Rß¾ý[¥+—þwðºÕO‹èd^jWphpqrcode/cache/mask_6/mask_61_6.dat0000644000175000017500000000030311432665120016466 0ustar thijsthijsxÚí—KÀ D÷s¸ÿåÚ¤µE~Ý‚ihÌÄ'™ ÑŽÍÀòNÏ'oVWßéà£jspèÚCzÓþìÑο©¥ÃaÌÏg!«…#WD%~Ü˃Y?±JÛfŒÚåR€E¸¢ŽÁKoæÍ¼™Ç˜§ü|Ƀˎ*ÌOÿP7 Šž‡åÛn¾ë¼½¥™7ósã†`ž½ïÌÍÖÀõsúåçdôD¾Ÿÿ¹Ÿsé~>ý<ßiÌK'Žl'¸×9¥ûÐ%.ÆîÄ7phpqrcode/cache/mask_6/mask_65_6.dat0000644000175000017500000000031611432665120016476 0ustar thijsthijsxÚíWQÅ ûïiäþ—{KžNLk?˜e$ŒQ´ikÝìÆÚ4¸çö1{˜á‰ð×`+®!úÚ®ºM Á? áû “’°È1b°8†ž £·¦.ŒÞ^ƒwÌÞò¹ìèsn²ÁFjè5¹…EaQX|‹=wä¼@°2v<òŋŞ»‰–|4w»êê\ÔUXÇBQz+óÊT±ÈTǹÖcøBÓzž/4­ç8Õë,‘»5Ý`¡¥¨»ý¹È± üOV$ phpqrcode/cache/mask_6/mask_69_6.dat0000644000175000017500000000033111432665120016477 0ustar thijsthijsxÚí˜KÄ @÷œî¹™dThÃðí¦ hLSSEžq eY@<ã¯+Þ*£|ß窮 %‹®‹>¥¡¨®‹¹zÃ*7ë–Åe´¤öÆ6ãQ¶½©S`šÞ.²¯>»sE Ë'¨%@[‘Ž6°@PË0Ãh £aôFÕxtpl²2§Âóý ‡Q-g1N†feo^ßøÑüë†Ñ0F¯dT>N_ÕOö’‘wË‹G3ìùªu†åœÁ»gˆå {‘3<Ê[žÔº b?Â'6ï^ºŠphpqrcode/cache/mask_6/mask_73_6.dat0000644000175000017500000000034611432665120016500 0ustar thijsthijsxÚíXÑà |¿¯ÿÿ¹-™NЮM¶4¦¡¦^8ôDšiÆd¦gy½Š¬æ—žîÄ41ibؘÖã,œ;xÓ-2ûN;┹ÜEqúܹN>t”èLå®Ó41"¿áËŠ–?J´bQ¡Å_é@wÅÝsgõ»°Çõ9PÛq¾Ø5ó½ £kY,àÃdzÎ⬼«¼+¸ûïšÉÿ#ÜÒï*ïªfw?É­`d¸cT••;Oê‰×L¹¬fŠ£‰ÅkæUºŠÒºÊèwœ&fqGß(0ÊášwB陓=~©õÃphpqrcode/cache/mask_6/mask_77_6.dat0000644000175000017500000000037011432665120016501 0ustar thijsthijsxÚí˜Ñà EßùøÿŸÛ²i‹ÙÅVäaË.š¦±F©§pST›YÖô4q÷ú~´z…«=Ÿä:öÍ’ û6îøÍüôm8‘¾:#0PضiDy:2Å '§ùZ­s±Š&}Ïôçæ»œ\r‘0\¥Åš•˜Xw¬Â;iP¬äàÈ”Lœ)ÒS¬±£eÔ•Ü{hˆDu9÷L‘žb½•©JÞÒS÷ŒSÆ)™’)™ÞgZš{÷þeÜøŸé)ã”qJ¦dúLw+ƒ#Ó3-V0ÅÕ·lîjƒ¹™ýÚ ×S-ÕS ê½9=ݯ÷¦5ÁPPïõq1Mõ?ågÓphpqrcode/cache/mask_6/mask_81_6.dat0000644000175000017500000000035611432665120016500 0ustar thijsthijsxÚí™Q„0Dÿ9 Üÿr»ÉÚR³LÕvök‡šÆ`´¤¯0 º;æi6ÜûçÑÚ\|ñí_¿êccÔ1«¢h¾ýuŒ§½ioÞó#2ƒ¬}x*.YûtÃ&¸­± Ö°¶ÀÖq/K‚;3ÌväeÐ̢Ȋ҂AÛH±ë?`]é5ÒðK¿¡Êü´†w¿!}{Zû߲žW Œ”yâ·¾Àž^§_y­¼k±k±–^K¯•תáb-ÖbÝYSÚ¸'ÖœNóÈuÃ×õšÕ#M½fõHS¯Q?|]¯IýðA¯ÆÚi™Mû÷‘yíì¤yuWàphpqrcode/cache/mask_6/mask_85_6.dat0000644000175000017500000000034511432665120016502 0ustar thijsthijsxÚí™Q ! Dÿç4Éý/×Bµj«î6? YfAƒ>cؘó¬Y3tïöúí§£>åä3õÕ“mîëböÛúÂׯµŠéŸ»E³ ‚ÞnøU‹ºÎl¨³çqí´s‘;YCr†jðê(Ó[”½sêŠ1 ÄÀI(ù@§Ãé7le`•†u$½šëˆÜû—ºâ€â€b@ (P> 8 8 Ä€ø+6à °ª#ÛÒF8°#ù€mjFñ|àD½À©õ‚–ðjF3¨Ä‚U‰ã€Ñê†=¨^‡phpqrcode/cache/mask_6/mask_89_6.dat0000644000175000017500000000040711432665120016505 0ustar thijsthijsxÚí™Q Ä Dÿsšäþ—ÛÂêšB¢n3B?&•²l¨D}ÆÁ¨63„é0q¿õ몼Þ/O½Å1à‰cNB£ËF™ÄœÌZ4§½çðÿ`¡¶`ãÿÑØ93ºr]=÷55ô#=:ξÉXÓú¼½¥íwƒ›Xµ´5øD“ ²A6ÈÆÛØ€é wBŠAõ†ûJ~ 2S–¹æœ{ä™®Ø,UÚ½Á¼Á¼Á3…l ²A6޲A½áõFv÷•߉mxkQæ æ ž)dƒlw³¬´ÝÙG"šIÕª¨7fµ¶šÞÀÖÚ¼ÞÐcw_:©ÃÖ´(¶°ß„à:¬ÏS6*í±â¾phpqrcode/cache/mask_6/mask_93_6.dat0000644000175000017500000000042411432665120016477 0ustar thijsthijsxÚíša Ã0…ÿ{½ÿå6X]1&[´Œñl)¥ÒΚ¯æÇÜL²ŒÕÈœóËu~tžþ¼ž³û±KÒæÇîÄ1»>Þ?p]cŸä/Înõ˨¦Û‚™yô=1®w‹™¥`Lôé}œ¥b£þci¸Û4‹Y_ª9R« Rb$=ðŠè© %‰3`Ì€™`&WÏè|L’®gŒ^ ¡Zgj6Rº+íèªOõ̸‹"Ýò­žc‚:ƒ:ƒ¹ Ì€0fÀÌMÌÔê™Ùš^´Ö·åƒ^i`ÔÔÌM`Ì€0óó̤·WߘÉï [f¢®ö¹ž©èQêš^ER5pÔ×>×À}m£oa†K*MÉ!´ÎpåÇú&ÙmRphpqrcode/cache/mask_6/mask_97_6.dat0000644000175000017500000000040711432665120016504 0ustar thijsthijsxÚíšaƒ0…ÿs¸ÿå¶dÅêÒÒFx[²=4ÆH–ùŠoŠj3«4í&§s}¹*ŽÃž— ÷a V¸cˆ&3žêÜ5‰arWç^aþ«÷LClÉÒzžqì,ÝÌÑ1†xî µ‰SQ»N»ô»]·¢/GiuÄ`&æ ¢–wƒ%‚,‘%²D–ÈYú"K½t¸¤+åHE'|R2Ï(v1¨öv–¢ÿqiëëŸqd‰,‘%²D–~€¥è%Ø»Jjï}íͺĺÄgY"Kd‰,ý+Kñö –]W–të+sF/)ü]¥.zNòÚÝ'`°>®½1='#–`+bƒ¥l]Z±”¶­¬ýðphpqrcode/cache/mask_7/0000755000175000017500000000000011453417106014315 5ustar thijsthijsphpqrcode/cache/mask_7/mask_101_7.dat0000644000175000017500000000040311432665120016544 0ustar thijsthijsxÚíšQà Cÿ}rÿËm“Ê`éÚÊfªjòTé#±¥ÔäÞ54'tûí…îf¼aÈЇo°–$±c<ÙËêãÝÓÕñHÝ Ìh8„lÕÛûþÁëo=½Ä„ŽÅ§àHvº©;‹z€¤!ƒ|/‹FŽÐ3cfÌŒ‰S×Ê…±±ゼêñ 8©KŽ)4©9 ”Qç1ç1×J3fÆÌØÅ›S+ÅwÖcçõ˜ó˜ó˜k¥3cf캌ùîâ¾zÌyÌy̵Ҍ™±1¦{¨²bL÷¶çÍX™S+óï.to{>ô˜îmO§ÇJ2²û3cÄ<6ãXn0F´ )phpqrcode/cache/mask_7/mask_105_7.dat0000644000175000017500000000037011432665120016553 0ustar thijsthijsxÚíšA Ä0E÷žFï¹a MÒ™˜N¾Px)¸pQ£¼è_è~ž|ñ(b¿F’„šç$.Ÿa¿o“ÝòWÿGNÚPæUÇ–·‰Mþ%{‡ëoôHQôÙUñl¯Ö´¿¬L^>+Éçm­“#{°{eo&Y2sÛoM•)gncO9s›ßZг´3wÇo™„Ú+Âè{ô=f.ìÁìÁz½‡Þ£ïÑ÷˜¹°{°{è=ôz¾GßcæÂìÁÞsÙkCQÏžpÓíÊ^¶€&Ñ{^£÷¼Nï­Ê·UïÕìï ìe5°ç}¯æE‰wGûßn+ophpqrcode/cache/mask_7/mask_109_7.dat0000644000175000017500000000036211432665120016560 0ustar thijsthijsxÚíšA …0 D÷9MrÿË}µÚ*˜ _x-d˜ú:Î"îÇŠ¢Ý-kÅ"Šâ¨š¢œ•dŒ{›¿Õ»ü¤·ñã¯ó³ÞÊגɬ|'ƒÒÚràQ5+ sûŒ¡)Ûc•Õê7úÕ-ÑÕó»1nní–ºqÿÉ”–ÔÍJtgô¬^îʉwÿ̘Ň-ùƒ?ÿ*š&Mmý@ee5éø^Ñ c¢”° «° «ÀªÒ,¬¶ýªïbï\1¿×3ýjõ4óØT¿ZžfÅ¢·»o鯠«è*º «° «° «°:›Uüêt¿*ü¿ú½¹ºŠ®¢«° «° «° «“Xů²0<·BWÑUtVaVaVƒYÕl Þ°ªÙkýf5éýª_Ö ¿ªÙkýáW5{­«µ€ä–5pnõC¬éªZ:¬Å bvphpqrcode/cache/mask_7/mask_117_7.dat0000644000175000017500000000043011432665120016553 0ustar thijsthijsxÚí›Yà Dÿç4pÿËU•²ÈêIª>"ù%6æed ‘Ò8rðS ÍNs޵U¯ánëk5¦Xe­øjѻު®u—Ûî¦ô¿ö±VÛXgøê,l`øøîuÝÊÀî÷£!‚h‰XZù\VãlM±ìë|[ͬÝÂ0 Ã0 Ã0 ÿÃí–#hF'ëøc]²±ž¾¦iéí>ìúŽûHÐat†a†a†a~<ÃÔÆzØyÆqkO‡£Ãè0 Ã0 Ã0 ÃðææŒãªžF‡Ña†a†aþ)†§2Ç˰éfÃ’áþ%ƒÀz8ùëátO=¼žâ€3ÿ=Ž‚áÖî3œÜ:ìÿcw‘ ûV$¢phpqrcode/cache/mask_7/mask_121_7.dat0000644000175000017500000000045511432665120016555 0ustar thijsthijsxÚí›[ Ä Eÿ³šdÿ›ú°ŒÆi;^az,ø#6Æž^rÝׂ§h¶ŽôµÈêÐ&Ýì¨çÜ^amýËÀ•YŸ9×_ÒØºô5C·r–6ë®ðt^ù^ÅWlûÅÐEä˜ôز~É¿|èM®èmýÁåÛmSò}÷¶Ó( Û° Û° Û°}ŽmQ½]ŒZ§Vüq½]¼ÓvËѲ"™M¹1fÙúGÔÛÛ, q½½ÍB·Ñmt¶a¶a¶a¶ÂöÄz»eF²3»cxI¹—D·Ñmt¶a¶a¶a¶ÿŸmÎnð’ý$ºn£Û° Û° Û° Ûa[}ï¦`[yëæÀö–°¾Þ–Þ»)Ïn<¹æ4ÜKú/éó¼¤O¢»s§l¨nçlÔmŸµÝ/GëÙphpqrcode/cache/mask_7/mask_125_7.dat0000644000175000017500000000044011432665120016553 0ustar thijsthijsxÚí›Aà ïûüÿϵ•B¡m)©í$_pìŒV¬¥ÔaA³jÉÍÂâgö°ôûµ'´^ýo8üÒaíËÕƒÚw7ZJPWm’^%sh¹ãúÎôìó~Lܳ[âÔö-RÓEŧ좪¤´^iu?¢½ éaæaæaæaæ˜Ï:ÏoÌ<¬çšÜëí©ø±u§fçGVßi GçÑy˜‡y˜‡y˜‡y˜‡ùËÌçžç“î¤ð°ùGçÑy˜‡y˜‡y˜‡y˜‡ù+Ìs'…‡ö°è<:ÎÃ<ÌÃ<ÌÃ<ÌÃü%æã¨½1ÿ6ðÉ|É=ÏÏZïz'ÿ6ðÅÃÆ¿ ì\_²p”«ç¥ Í5•ÇÑ}–çµÝ¬ó€°mƒ¬ßÿžuý±& ° ° ?ÆÂȪÎìëöºš{wx¤Æ‚Ã#µºÚ’Œ–iæôwÖ5³Ô5f¾@_ /à‘```¼@^ /è ô<,À,À,È äò}¾€G‚X€X€òy¼@^ /ÐðH° ° ÿÍB3+> 7}ï,Ì.Ú–æ…ðæ…ðç…Õ6”äï}玅Ù^²ξà=Lwÿ»ùwSûphpqrcode/cache/mask_7/mask_133_7.dat0000644000175000017500000000043111432665120016552 0ustar thijsthijsxÚíÜA à FáýœFï¹RH1 )Ÿ¥ƒæåÏ[˜R>£N¾š{µNžÏºÈl#Ò6¤ž¯E¿Û1õÎZœÿ|X½·iã’‘Ñõúˆ‘Ñõ¦‹ºÀ[·ÓŸ‡9òþº™ãóIÝ’H_‡÷;2‰m`#ÁF0ò?Œ$½ynõï걫ZOá&Ôc†wÜÖc»BŽÈ9â] #ÁF0ÂGøá#rDŽÈŒ`#ÁFøá#rDŽÈïZÁF0‚>ÂGø‘#rDŽ`#ÁF~b$ó<{ÃHÖiö#ß…Èõ‘´óì­”‹O Lõ‘’ï#e ) Pró͇i9rÍȤ)+lÉ ³Mphpqrcode/cache/mask_7/mask_137_7.dat0000644000175000017500000000051311432665120016557 0ustar thijsthijsxÚíœÝ à Fïó4úþ/· úc§‹«_Ç‚+¸{üSÚK<ŸÚÎo[l ìÀìÀΟ²Ó ©ý0û¡7Ö‰µVÆl;b¶–ëüè™7æõfM¾S´†î ;è1ìÀìÀìÀìL³C¾<ßQí[+@wÐt‡˜ v`v`v`v&Ù!ß ›ï°7ÚX+@wÐt‡˜ v`v`v`v8 ÊYP΂¢;èºCÌ;°;°;°saG{™Ä;Ú»>vRœ|ÇžåùŽö®K¾£½ë£ØMÎðHÖ ‚³#Ð(S›ËÎòúqÌçdphpqrcode/cache/mask_7/mask_141_7.dat0000644000175000017500000000051211432665120016551 0ustar thijsthijsxÚíœA„ E÷= Üÿr“IëŒTY@¿ÉÄÅ0!µøø|1”²—št¹bG0µæÔ—Ѥ…s¡2Z/îç¿oa‚ìøÜ\ÿq¬ãzÜÛOnÒ‹MºÏñÞn™šñt„áX"Kÿ—m‘eM}çÚòCpµíÄP™L^¾µŒ„S0S0S0S£L ø)Ç”‚ŸÚ˜êYß¾%žÔbÑý,õS©l?ÕzC§Ð)tеLÁLÁLÁLI2…ŸzŸŠRX¶h¾£@§Ð)tеLÁLÁLÁLI1…Ÿz‘ŸbÏ·óŽB§Ð)Ö~0S0S0S0Å7´ø)ö|ù†B§Ð)˜‚)˜‚)˜‚©÷3Õ–«L%Ÿ tfª¬wM±Ÿ*:~ªhù©»¡Zºç«sn’cª÷$1UTtJgÆ8‹ÌÕOYºEphpqrcode/cache/mask_7/mask_145_7.dat0000644000175000017500000000053511432665120016562 0ustar thijsthijsxÚíœÑ à Eßó5úÿ?W6Zµ ¦-›^é±àƒ2‰q§×ÄbG‰Ÿ¢X6(ƉuÍ"“LbÑbÝGuû÷ŽÎ¼®··Gkø¨:HwA[¿jšÔm¯øH¢ø¬Ýžï3ïŬýîßâOðkQ{l·|ê»èT›†EmÇ JfÙLÊ?ŸÚ2"&Á¬Á¬Á¬Á¬ÁÚ¬)Äk©ÝRf¢—µÙcï“Ñ̉ÓåFŠÑ,§“z©¦=躆®±‡„5Xƒ5Xƒ5Xƒµ7±F¼¶\¼¦p–ÚUs#躆®±‡„5Xƒ5Xƒ5Xƒµ°F¼¶d¼ÆYö•ܺ†®¡kì!a Ö` Ö` Ö`o‰×8ËæÛct ]CרC¬Á¬Á¬ gMå­‚5…[´N¬%éÄk÷h•ñZp®?›¯IÜ£•ϲƒ^n$ˆÑæÞY7A×ÖÆëZP[¶ fÈ“0phpqrcode/cache/mask_7/mask_149_7.dat0000644000175000017500000000053711432665120016570 0ustar thijsthijsxÚíÜÑnà …á{? ¼ÿËu“Ú†­…´2»ÕG$nˆˆcççÈF¡µKëÉ×Ðb3ª÷ôþÖªt³îûªPc çÌ¥Ó7[¢?9:ñÕý['éÁë9'¾*Ó– àGæÜa°½hÖ_¿¹/«zÁ+Î6XB‡>ê˜2ôqYÀJ…0Êù黚BfaƒÄ 1ˆÁª ȇ9c7Gë ùOl©ô,Å^¥ßÅ꽓òÁ3ƒÕòA:Hé Ä 1ˆA bƒÄàÿ0X4œ%Ù«½û#ÇÔd>¢&Cé ¤ƒÄ 1ˆA bƒ<šA{ôo¿G¯&óLM†ÒA:H1ˆA bƒÄ 1è¿ {ôj2þ› ƒtbƒÄ 1ˆA &1Xç`¼_ Ö9ÛðÊ`«™®B˜¶G_çlÃ5™:g5™¶ajMæÍLÔÁŠËèƒIý <|r.phpqrcode/cache/mask_7/mask_153_7.dat0000644000175000017500000000053711432665120016563 0ustar thijsthijsxÚíÜQ‚0„á÷= ½ÿ匉B5ˆ ю惤/ͲåïØIÙiº^-àî®Zkm|»YDhë9 ›ÎêÃ\{’KÇÆ¶·{Ÿy—³Ç3ßv†¶Ì»œE]u`RÚÇrý"›ß}ÛY ½ëeÂ2{ÛVV8][×.n:+2_ç¶ÊÂBÃ&6±‰Mlb›ØÄ&6ß`3i¿9Y³³åΌ諡yÙúU}ÔŸ82f-vÚ–Õ6 nÒMºI7±‰Mlb›ØÄ&6±ùólæî7ãÎð‚þÕ ¢›t“nÒMlb›ØÄ&6±‰Mlþ2›ÎüÍÙ^Ð/ˆnÒMºI7±‰Mlb›ØÄ&6±é;gxA¾C¡›t“núO‹Mlb›ØÄ&6±y€Íy•ÇfP¥Õ[6Ÿ4ºßÌ«Ùk`v^Ð+Ó9Ä Ê¬OÛ±ùð}Ïæ”¨›™+ZXíè®=:iWEphpqrcode/cache/mask_7/mask_157_7.dat0000644000175000017500000000047411432665120016567 0ustar thijsthijsxÚíÜM ƒ0Eáù[M²ÿÍ•‚­ü£s¡_„ ž‰ÇÛã ­}F¹†Qks½‡Ì{Ý%¶WqÛ÷×îø.ž­¬Ýþϯ­]Ü8evV½ßbvV}è®_µÜEÌ»n3W^KÃ\Ÿ`äÖV캽çZl³˜Å,f1‹YÌþ;³af±Ôkž·Þ¨×úiàè“ÁÄzÍôÖËz?urVÎÊY9‹YÌb³˜Å,fù,Ÿå³|VÎÊY9+g1‹YÌb³˜Å,Ÿå³|–ÏÊY9+gý7Æ,f1‹YÌb³|–ÏòY>+g嬜Å,f1‹YÌb³|–ÏòY>+g嬜•³˜Å,f1‹YÌþÈlâùƳi§o˜ý.\¦ÏÆo<úl;9º:Âg[®Ï¶lŸmÁÔ^œI>=gÏ™œ³-yk_TAµphpqrcode/cache/mask_7/mask_161_7.dat0000644000175000017500000000057011432665120016557 0ustar thijsthijsxÚíÜÑŽÂ …áûyšòþ/皨E)Æ®›î1~4áœý93,˵´ «+µØZT=Zeâ¶C»¹ú.~ißµ§¯ÊÞÖ&>Œ,–ÿÔï´6eù˜·í•Ö~,láW]ì ®»º2Íê꺱Ý\Ñþ;×µ2j"–±Œe,ËrXŒÝµVÓ(ícìµµZÓ–1‘™§8Þ©í§‰±/,'ÇØt™.ÓeºŒe,cËXÆ2–±Œåß±,_þŠ|ytõüç£ï|ÎÜ]¦Ët™.cËXÆ2–±Œe,cyËòå/É—­ysî‹.ÓeºL—±Œe,cËXÆ2–±lo…|ÙZ{+è2]¦Ëbl,cËXÆ2–±Œe{+äËÖŠØ[A—é2]¦ËXÆ2–±Œe,c9åÌCÐXÎ<ëþÆò’Ÿ/owsP¾œyÖý]¾œyÖ}·VdÙìæ°¹¯d9J—Ó‡ì)Ë1õ jI2ëphpqrcode/cache/mask_7/mask_165_7.dat0000644000175000017500000000056711432665120016571 0ustar thijsthijsxÚíÝQŽ‚0Ðÿ·š²ÿÍM&A,NĘ̈!—x0é‡&XZׇZ»-KØ«[êÞÉeÉj‡½Œëæx,ƒ§¼ú.ï·g}ë`;ÿþþ+k{ËÑ~1ŸŽÿ}á+k{ËØ¥ž™¾SGùWãgî}‡Ý¬@Û?_µö8í¾o+·k][·hô”Wü8~·u·ÜMÆgœqÆg|j<õ·ú¶¶Ú*ßq=<¯”Ïü¤æÛ“RwÆ“ëñÕøøÌüÄÌéŸÈq9.Çå8ãŒ3Î8ãŒ3Î8ãIÆÕãUGÿ?~µsnr\ŽËq9Î8ãŒ3Î8ãŒ3Îx€qõøÇÕã®yç979.Çå¸gœqÆgœqÆgÜ=)êq×À¸'EŽËq9.ÇgœqÆgœqÆwOŠzÜ50îI‘ãr\Žû­Î8ãŒ3Î8ãŒ_ÆøVvd}²ÇÞøü¡aõx˯ÇÛ5êñã)¹&ÿ9)ñÙÞf¼¥çxþ3øYH]ûS^*/phpqrcode/cache/mask_7/mask_169_7.dat0000644000175000017500000000057711432665120016576 0ustar thijsthijsxÚíÝ]Ž‚0Ð÷o5íþ77™‰& Ãüè-LxØ”âñÚ¦M[»=ðµ8j®hï絚¦Wµ¢~_oÓí;Z»ßÛ…CŸ:^ÚF›*üéæÏJÛjÓècßþ›[»Óþk¾û7þUÓ>È«nwù[úp®ìê-Îuÿü5D{~žkV^UöÙgŸ}öÙgŸ}ö/c{¸'èJ½n<ä—¥UïïOï×ÔÄÛcmWê-íó“Òä¾Ü—ûrŸ}öÙgŸ}öÙgŸýSÛ×ß¿x?tnÏ¢´ÁÆúä¾Ü—ûrŸ}öÙgŸ}öÙgŸýÛ×ß¿lßÜžë“ûr_îË}öÙgŸ}öÙgŸ}ö­åÑß·–ÇÜkyä¾Ü—ûþó³Ï>ûì³Ï>ûì[Ë£¿o-¹=ÖòÈ}¹/÷ýçgŸ}öÙgŸ}öOa?}_ž…ýä]yìO šßßÞ—gÙßoO·e ëïGïË3ÏíiãŒõµAôïìÉ•ûÏíå~åñÕ'zphpqrcode/cache/mask_7/mask_173_7.dat0000644000175000017500000000062511432665120016563 0ustar thijsthijsxÚíÝÝjÃ0 Ð{=Mòþ/· RbÖH¬û«´rj\Ç=ý,ºm·coúZŽ8;»ïmÏ÷½mÛÝë±0b÷ƒ_ßšt$~Wu5ÛÇšNnÜ'?dÕf2¶í(oÁïßGÚ,Løþù÷õ6_{»zÅÑ÷Æ? Ë9úwq9Ç àS!ÆŒëÛ9Îoë€î2 L`˜˜pµŒ¬––O»Enï¶v8L˜²v8L¸º UáY×"ûd}ê K›r‚œ 'È ÖL`˜À&0 L`B'fÕ:ïO8ÛTcTc\kŒr‚œ 'È ÖL`˜À&0 L`BìY²gIñ§kŒr‚œ 'È ÖL`˜À&0 L`‚ç"íYRcô\¤œ 'È r˜À&0 L`˜ÀÏEÚ³¤Æè¹H9ANä&0 L`˜À&ü'úÿ!Ø;êÅq+¶Yõ„l*´Ü³´þ=Ø€ã9¶jŒ[2ÚÖÿ€ Ms¤Ÿ‡Ô„–ç­ë*Øphpqrcode/cache/mask_7/mask_177_7.dat0000644000175000017500000000062711432665120016571 0ustar thijsthijsxÚíÝÑjƒ0Ð÷|Mòÿ?WV³bRæ ænÇ‚/n%†ììzQ¬õ¹µ…?ÝVŽ·¶îþtÄKù|ŽC–Eé‡?:·³3ßüð·~û/s|þƒ³•Õ.ùúw¾ÌqÄ6µâ¦yœ-×Vñç×x;FÜÂ>eýÊÿ>¾ïKÆ0»}y³,JÔü~íËñ×2dV°‚¬`+XÁ V„ô)}ÅfŨƚÕ[·+³s[®¯Ø­Hè+öï”+ä ¹B®p  V°‚¬`+XÁ Vü +ûŠQy4»Gë®cºMÝæ Û”+ä ¹B®p  V°‚¬`+XÁ Vüu+Ü‹å^,ÝæMݦ\!WÈr…kV°‚¬`+XÁ V°Âs¦îÅòœ©nÓs¦r…\!WȬ`+XÁ V°‚¬`+;’ÐÀQ±ÊIÖÀQH8Rÿ¼ñÒˆGÉ"èz,ù½&‡ñþ;±­Ð'oñ»97”%P8%÷6oǽ;]ÞúNWnÝ[äf7¹ÌÕvÔphpqrcode/cache/mask_7/mask_29_7.dat0000644000175000017500000000016111432665120016476 0ustar thijsthijsxÚÕR9À ÛýšøÿŸ«ŠÈQpX˜$læÅ²f!I2pgSãªêªMZj·ºóÌÃÂ"útŠðï¡e0¾¿#Ô›`_Ë1-±ÞóŽé´câÝÍ÷òha÷~/¡Eh™4¦Åæ"ä˜~Ï phpqrcode/cache/mask_7/mask_37_7.dat0000644000175000017500000000017211432665120016477 0ustar thijsthijsxÚíT;@!Û9 ½ÿåÌ#þ¥àðF1a±)VÒª¶‚sjÉG?QÌáâg.Íáâ°…‹Ö¿qq¤> C­ ¿šº´ï GJÊóu’ØÓø4nFCîGl"€…‹Í4æ)a£ÌéãÌé{Œ5Ö=êÍÈnµCphpqrcode/cache/mask_7/mask_41_7.dat0000644000175000017500000000017311432665120016473 0ustar thijsthijsxÚíTAÀ »÷5ôÿŸ[fDYæ(O’^¬ÅbR3/~t/L"¹Ä7SQQ5…jÔ\S—šiíñÎb£ß#Õ†ÈÂ×+Ç£¤w#æzõx?Þã½§A-ëšw•u曑Y7$b.%AËÇ;•w«Rµ÷ñoxG}?ƒphpqrcode/cache/mask_7/mask_45_7.dat0000644000175000017500000000025511432665120016500 0ustar thijsthijsxÚíUÑ À |¿¯±ÿÿ¹1(ÓÒ¼½ 6A1“ÓK‘!-9F0ƒ[‹u†Ç¹‰R`¯ŽŒÝسÛܾҨȉ1É< &‰,öƒ~3kרCŒÆhU è¼·Æìþ!Lª9Ñy‡²ceKdã˜k} ꨹Ó1YiœÚÿœ¼š;ÚU“b3xL¢Ïþ8'Ü§ÙØ?Öp'+%ä¿w &Ž;5&ÂÎ 8±‹¾TÔ€Œphpqrcode/cache/mask_7/mask_49_7.dat0000644000175000017500000000025411432665120016503 0ustar thijsthijsxÚíVË€0»÷kàÿÎhœC-X.žÆ<ì¨h6Ì‹ 3À½ð,B Ô”ó,ç@’Ï€d5$K¸"T|p•%9"¼ypæ,ïâæ¡=<ÆÉm¡•÷˜Ô‰!‹«?¸¦÷DÀW"˜²(®¸Aó-Ö\- J\©{0p¥lÁWW]ƒÒŒ4ºž?4h= Z_ƒÖd+ýg(æ*ã*+ë¶µ(ÏÇæphpqrcode/cache/mask_7/mask_53_7.dat0000644000175000017500000000026011432665120016473 0ustar thijsthijsxÚí–KÀ D÷s¼ÿåš&´Råkºiª&,H)øtD×jÁ =¨µÐÎQa˜ž«P"d¹s1ZyC®|hey ­üCvéaH°›7ø‰+ùO…Åu¥QÎsZtb…°Íð7 µvãúÀŠ­h™VµÌ µ~èùà·1#ÿ~‡[Ëf˜†ùÙæfHkZ¶JtµœŸmZÎÏ6½—ÉsÕúá‹ ƒw¸rÍ&C×ß¶fphpqrcode/cache/mask_7/mask_57_7.dat0000644000175000017500000000027411432665120016504 0ustar thijsthijsxÚí—A€0ïûšöÿŸ3&•ÒH)Kb¼Ð&ˆqÅÖžÕ[-ÌÀÞÏÖŒ …Ú9Ér¡Ys ×.«ÎiÝÓ¾`´ìòØú~—­ëGé{cœiƒÕ‚»\Y<˜.©|·Åì2´ØÛŸÙ2š ŠQQ[[÷^N·ë€88½líÏÃÁ[}[šPl?g+o*Ï–˜4W¶û1  ü Õ33˜Ò[¿\Gosó­bkèm”mËômÿÊ^¬¢hëphpqrcode/cache/mask_7/mask_61_7.dat0000644000175000017500000000026711432665120016501 0ustar thijsthijsxÚí—K À D÷sšäþ—+-µ*5ÿm²¤cŸaT¢1Ø9—YÌ쌧êL9 糶¬²çísù//i‡‡Ê\„éb®ö©æÂÄ«âÞë-"^²DŒH-iÝ;bnA¢¼™7ófîet¶7Ù·yÌ£E:r”<4ß6ó(üu÷y{K3oæ"óÌý|a½oÌ?ᜟ‡ï竟“ò´pù9åýœj~NêÆ›Èìs¹ÑçTYú¡ Âuphpqrcode/cache/mask_7/mask_65_7.dat0000644000175000017500000000027311432665120016502 0ustar thijsthijsxÚí—A€ ïûøÿçŒI‘*í6^L!é…°¶ ¸i)mTÇT] VW\ï9e@—4Ku^Â#N%:ö,ÖÙmYÈÂJNã„è9¯“Šà¶©ˆvAè2úþÑÏœ”HÉ"YüšÅÜö +?`ýBXDüBX̽{¿‹Á.³Ëw‘ÿ¨d‘,~΂k’,¸^ïbQâ~±.Ãà\¯wó ®×ë^«Ï÷îOY˜ÞEôJmXâÑÏ"%phpqrcode/cache/mask_7/mask_69_7.dat0000644000175000017500000000031211432665120016500 0ustar thijsthijsxÚí˜M…0„÷sšöþ—{1©c-?ó6&Ó&,$Rȇmí\=¹ÍÂe¤÷œ\ZI›YûB„kruêPì½±¾¼Gï…öå3ŠhŒZØ<7†ÅlÊÝ%ꯉ3¨@ûqH\J˜#1#1ú£j=š5³úï:O‡ðy;/1Ô{†Áh×…túŽô¯#1£O2šÕ€cTœì¡<\¸á³³3¬é"!¹=Ï`½ö 9FýŽøŒ!üFŇÚphpqrcode/cache/mask_7/mask_73_7.dat0000644000175000017500000000033511432665120016500 0ustar thijsthijsxÚíXÑà |¿¯ÿÿ¹eKkuŪMºMx ^9""ûRÇ®Ž@ªkEbCJNmLÖ]-†Íõí9c†êx LÔºân §¹;“«”?‘4hc»Ëõ/5ÜñÊbÿÁèô‚çmq0E†Jî’»sgµ„el}ž×Ìâ’šY<(­N¶âÃð®YœYwYwÉ]rww¯™Î7Bu6¸ßeÝeÝ%w¿Ê;W©¸c¦* w¯™Ô\¥ÖLéŒ\š)1o‰ëwÄ^w&樻wËu'Qé½fGóAphpqrcode/cache/mask_7/mask_77_7.dat0000644000175000017500000000034211432665120016502 0ustar thijsthijsxÚí˜Kà D÷sûþ—k+‘@LâªV¼`1²ó°GAd[ÜÃBS dzZXnž[A©Ë>'o5+óÛ]95å • ®,tYþ‚i;r}ͧšn4íÄÕ"òCÄvKJEY^¯ˆN°@ŽLÉôÇ™Îlfn=§XNTßìmL«focj¥¯ÎS¬]Roe·×Á>eŸ’)™’©‡iíìÍüËt'û7?eŸ²OÉ”L¿‚iþÁìÀ4ÿ6¸3•ÚÙ+ ëpÿËäßßü4ÿ68ø©¥†ýôLƒ}Zy}M¦¡øVmephpqrcode/cache/mask_7/mask_81_7.dat0000644000175000017500000000032511432665120016476 0ustar thijsthijsxÚí™ÁÄ Dïó5ðÿ?×lÒ"ÍŠÝ•¹u4áÀa„>ukv oÌ40Ý÷ãT±%9¯‘Ô6²ü÷ªU5‹*sI{`¹ªÿ™_²>S?ç}(:yâTïlï{G&E\”Ö6¨õ}"A’¤X‹õ XϬ«²³Ç<Âmwx°fÜá‘G”ã¢0 ¸¨y˜Íîã›7”¤î›±–•™´x½ÖößÇôF­õχõV­´Óe`V÷!fõÕ.®¿o³úŠà¥ 7ÀÔ€^çQ ¦b@ ˆ\H/×¥cþÝÐQ¬LËâ,èXy÷?u$tUs@s@ ˆ1 ää44Ä€?c€¹/ °¶/žB¹~€¶/ˆ~À:+“-?`|?`9~À(øØ-Ï>‹sÀ2Zp¼2Zýphpqrcode/cache/mask_7/mask_89_7.dat0000644000175000017500000000036411432665120016511 0ustar thijsthijsxÚí™Í„ „ïó4åý_n³ J]¤D˜f= $=ˆ©ü|´kv´B计9.…b{Ï×÷s&oüÖŒ–öôy7çûWË¢kXV Ù6^Í„13u r }Gýéš8 ®;gqNߤÌ÷kÑΚìZlˆ ±!6ÞÇIo¸ ‰i&~¦7Z¾G“L#)UÖFéŠ ½QÙÈЊŠÊ)bClˆ ±‘džôÆEoDK+‹#ùZTqCqC9Elˆ ±ñb6¸Å¥6¸µ¶“ ËÓ6‘RËzƒ[k»è n­Íýû²`;¶µèØØŒYWeÂÆ†ý1jÞþphpqrcode/cache/mask_7/mask_93_7.dat0000644000175000017500000000037011432665120016501 0ustar thijsthijsxÚíšQ Ã0 Cÿu÷þ—ƒ4uYâ†Vl(ÿ¸¸Æ}qDÒˆ}l¤™ŽàÛÆ±Ãè´ðãÜ¥A~Õ,Q–ÍQgŸs?XU÷ª8å(™Yȯöâ^Õ½ ²ò9ÑÞÄZJg ~Èd±/Ii Ëûmq¬kàR»Ï¸Ïxo23fÆÌ˜™_`¦« 3ä›á33Õå-EÏ„îL/´øª44°î^;13ÕºfBÕgtÄ þ…Hö±i"phpqrcode/cache/mask_7/mask_97_7.dat0000644000175000017500000000037611432665120016513 0ustar thijsthijsxÚíšáƒ0„ÿßÓÀû¿Ü²D[ÌÚâV.K¶«Iÿ`…â'ž³sxáº÷Âyäå”$ùxãxÃ"Îéª×= O^&pêb¶ÊÈYʬž$êKŸÝ£àÁÉŽ8KŸ…Ë ÎeÃŒó¡¥ ÔøŸ3:$bI,‰%±$–ÄÒYb襶 M)¯TôŽ %q®¬Èô綦EÿœX}jlØT—T—ôŽKbI,‰%±ô,ñõã_e[%íýŽöV]R]Ò;N,‰%±$–þ’%VŸ@`‰Ñ%pa©m€§—(}ñ_¥%í%ÚÛ¸ÚÛøÚÛÈ4¥='u)ai¿.;M¾ù>phpqrcode/CHANGELOG0000644000175000017500000000235511453415554013315 0ustar thijsthijs* 1.0.0 build 2010031920 - first public release - help in readme, install - cleanup ans separation of QRtools and QRspec - now TCPDF binding requires minimal changes in TCPDF, having most of job done in QRtools tcpdfBarcodeArray - nicer QRtools::timeBenchmark output - license and copyright notices in files - indent cleanup - from tab to 4spc, keep it that way please :) - sf project, repository, wiki - simple code generator in index.php * 1.1.0 build 2010032113 - added merge tool wich generate merged version of code located in phpqrcode.php - splited qrconst.php from qrlib.php * 1.1.1 build 2010032405 - patch by Rick Seymour allowing saving PNG and displaying it at the same time - added version info in VERSION file - modified merge tool to include version info into generated file - fixed e-mail in almost all head comments * 1.1.2 build 2010032722 - full integration with TCPDF thanks to Nicola Asuni, it's author - fixed bug with alphanumeric encoding detection * 1.1.3 build 2010081807 - short opening tags replaced with standard ones * 1.1.4 build 2010100721 - added missing static keyword QRinput::check (found by Luke Brookhart, Onjax LLC) phpqrcode/index.php0000644000175000017500000000711111432665120013707 0ustar thijsthijs * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ echo "

PHP QR Code


"; //set it to writable location, a place for temp generated PNG files $PNG_TEMP_DIR = dirname(__FILE__).DIRECTORY_SEPARATOR.'temp'.DIRECTORY_SEPARATOR; //html PNG location prefix $PNG_WEB_DIR = 'temp/'; include "qrlib.php"; //ofcourse we need rights to create temp dir if (!file_exists($PNG_TEMP_DIR)) mkdir($PNG_TEMP_DIR); $filename = $PNG_TEMP_DIR.'test.png'; //processing form input //remember to sanitize user input in real-life solution !!! $errorCorrectionLevel = 'L'; if (isset($_REQUEST['level']) && in_array($_REQUEST['level'], array('L','M','Q','H'))) $errorCorrectionLevel = $_REQUEST['level']; $matrixPointSize = 4; if (isset($_REQUEST['size'])) $matrixPointSize = min(max((int)$_REQUEST['size'], 1), 10); if (isset($_REQUEST['data'])) { //it's very important! if (trim($_REQUEST['data']) == '') die('data cannot be empty! back'); // user data $filename = $PNG_TEMP_DIR.'test'.md5($_REQUEST['data'].'|'.$errorCorrectionLevel.'|'.$matrixPointSize).'.png'; QRcode::png($_REQUEST['data'], $filename, $errorCorrectionLevel, $matrixPointSize, 2); } else { //default data echo 'You can provide data in GET parameter: like that
'; QRcode::png('PHP QR Code :)', $filename, $errorCorrectionLevel, $matrixPointSize, 2); } //display generated file echo '
'; //config form echo '
Data:   ECC:   Size:  

'; // benchmark QRtools::timeBenchmark(); phpqrcode/INSTALL0000644000175000017500000000377211432665120013131 0ustar thijsthijs== REQUIREMENTS == * PHP5 * PHP GD2 extension with JPEG and PNG support == INSTALLATION == If you want to recreate cache by yourself make sure cache directory is writable and you have permisions to write into it. Also make sure you are able to read files in it if you have cache option enabled == CONFIGURATION == Feel free to modify config constants in qrconfig.php file. Read about it in provided comments and project wiki page (links in README file) == QUICK START == Notice: probably you should'nt use all of this in same script :) encode('PHP QR Code :)'); QRspec::debug($tab, true); == TCPDF INTEGRATION == Inside bindings/tcpdf you will find slightly modified 2dbarcodes.php. Instal phpqrcode liblaty inside tcpdf folder, then overwrite (or merge) 2dbarcodes.php Then use similar as example #50 from TCPDF examples: true, 'padding' => 4, 'fgcolor' => array(0,0,0), 'bgcolor' => false, //array(255,255,255) ); //code name: QR, specify error correction level after semicolon (L,M,Q,H) $pdf->write2DBarcode('PHP QR Code :)', 'QR,L', '', '', 30, 30, $style, 'N'); phpqrcode/LICENSE0000644000175000017500000001720711432665120013103 0ustar thijsthijs GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. phpqrcode/phpqrcode.php0000644000175000017500000035566411453415612014612 0ustar thijsthijs * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* * Version: 1.1.4 * Build: 2010100721 */ //---- qrconst.php ----------------------------- /* * PHP QR Code encoder * * Common constants * * Based on libqrencode C library distributed under LGPL 2.1 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi * * PHP QR Code is distributed under LGPL 3 * Copyright (C) 2010 Dominik Dzienia * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ // Encoding modes define('QR_MODE_NUL', -1); define('QR_MODE_NUM', 0); define('QR_MODE_AN', 1); define('QR_MODE_8', 2); define('QR_MODE_KANJI', 3); define('QR_MODE_STRUCTURE', 4); // Levels of error correction. define('QR_ECLEVEL_L', 0); define('QR_ECLEVEL_M', 1); define('QR_ECLEVEL_Q', 2); define('QR_ECLEVEL_H', 3); // Supported output formats define('QR_FORMAT_TEXT', 0); define('QR_FORMAT_PNG', 1); class qrstr { public static function set(&$srctab, $x, $y, $repl, $replLen = false) { $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl)); } } //---- merged_config.php ----------------------------- /* * PHP QR Code encoder * * Config file, tuned-up for merged verion */ define('QR_CACHEABLE', false); // use cache - more disk reads but less CPU power, masks and format templates are stored there define('QR_CACHE_DIR', false); // used when QR_CACHEABLE === true define('QR_LOG_DIR', false); // default error logs dir define('QR_FIND_BEST_MASK', true); // if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code define('QR_FIND_FROM_RANDOM', 2); // if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly define('QR_DEFAULT_MASK', 2); // when QR_FIND_BEST_MASK === false define('QR_PNG_MAXIMUM_SIZE', 1024); // maximum allowed png image width (in pixels), tune to make sure GD and PHP can handle such big images //---- qrtools.php ----------------------------- /* * PHP QR Code encoder * * Toolset, handy and debug utilites. * * PHP QR Code is distributed under LGPL 3 * Copyright (C) 2010 Dominik Dzienia * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ class QRtools { //---------------------------------------------------------------------- public static function binarize($frame) { $len = count($frame); foreach ($frame as &$frameLine) { for($i=0; $i<$len; $i++) { $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0'; } } return $frame; } //---------------------------------------------------------------------- public static function tcpdfBarcodeArray($code, $mode = 'QR,L', $tcPdfVersion = '4.5.037') { $barcode_array = array(); if (!is_array($mode)) $mode = explode(',', $mode); $eccLevel = 'L'; if (count($mode) > 1) { $eccLevel = $mode[1]; } $qrTab = QRcode::text($code, false, $eccLevel); $size = count($qrTab); $barcode_array['num_rows'] = $size; $barcode_array['num_cols'] = $size; $barcode_array['bcode'] = array(); foreach ($qrTab as $line) { $arrAdd = array(); foreach(str_split($line) as $char) $arrAdd[] = ($char=='1')?1:0; $barcode_array['bcode'][] = $arrAdd; } return $barcode_array; } //---------------------------------------------------------------------- public static function clearCache() { self::$frames = array(); } //---------------------------------------------------------------------- public static function buildCache() { QRtools::markTime('before_build_cache'); $mask = new QRmask(); for ($a=1; $a <= QRSPEC_VERSION_MAX; $a++) { $frame = QRspec::newFrame($a); if (QR_IMAGE) { $fileName = QR_CACHE_DIR.'frame_'.$a.'.png'; QRimage::png(self::binarize($frame), $fileName, 1, 0); } $width = count($frame); $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); for ($maskNo=0; $maskNo<8; $maskNo++) $mask->makeMaskNo($maskNo, $width, $frame, $bitMask, true); } QRtools::markTime('after_build_cache'); } //---------------------------------------------------------------------- public static function log($outfile, $err) { if (QR_LOG_DIR !== false) { if ($err != '') { if ($outfile !== false) { file_put_contents(QR_LOG_DIR.basename($outfile).'-errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND); } else { file_put_contents(QR_LOG_DIR.'errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND); } } } } //---------------------------------------------------------------------- public static function dumpMask($frame) { $width = count($frame); for($y=0;$y<$width;$y++) { for($x=0;$x<$width;$x++) { echo ord($frame[$y][$x]).','; } } } //---------------------------------------------------------------------- public static function markTime($markerId) { list($usec, $sec) = explode(" ", microtime()); $time = ((float)$usec + (float)$sec); if (!isset($GLOBALS['qr_time_bench'])) $GLOBALS['qr_time_bench'] = array(); $GLOBALS['qr_time_bench'][$markerId] = $time; } //---------------------------------------------------------------------- public static function timeBenchmark() { self::markTime('finish'); $lastTime = 0; $startTime = 0; $p = 0; echo ''; foreach($GLOBALS['qr_time_bench'] as $markerId=>$thisTime) { if ($p > 0) { echo ''; } else { $startTime = $thisTime; } $p++; $lastTime = $thisTime; } echo '
BENCHMARK
till '.$markerId.': '.number_format($thisTime-$lastTime, 6).'s
TOTAL: '.number_format($lastTime-$startTime, 6).'s
'; } } //########################################################################## QRtools::markTime('start'); //---- qrspec.php ----------------------------- /* * PHP QR Code encoder * * QR Code specifications * * Based on libqrencode C library distributed under LGPL 2.1 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi * * PHP QR Code is distributed under LGPL 3 * Copyright (C) 2010 Dominik Dzienia * * The following data / specifications are taken from * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) * or * "Automatic identification and data capture techniques -- * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ define('QRSPEC_VERSION_MAX', 40); define('QRSPEC_WIDTH_MAX', 177); define('QRCAP_WIDTH', 0); define('QRCAP_WORDS', 1); define('QRCAP_REMINDER', 2); define('QRCAP_EC', 3); class QRspec { public static $capacity = array( array( 0, 0, 0, array( 0, 0, 0, 0)), array( 21, 26, 0, array( 7, 10, 13, 17)), // 1 array( 25, 44, 7, array( 10, 16, 22, 28)), array( 29, 70, 7, array( 15, 26, 36, 44)), array( 33, 100, 7, array( 20, 36, 52, 64)), array( 37, 134, 7, array( 26, 48, 72, 88)), // 5 array( 41, 172, 7, array( 36, 64, 96, 112)), array( 45, 196, 0, array( 40, 72, 108, 130)), array( 49, 242, 0, array( 48, 88, 132, 156)), array( 53, 292, 0, array( 60, 110, 160, 192)), array( 57, 346, 0, array( 72, 130, 192, 224)), //10 array( 61, 404, 0, array( 80, 150, 224, 264)), array( 65, 466, 0, array( 96, 176, 260, 308)), array( 69, 532, 0, array( 104, 198, 288, 352)), array( 73, 581, 3, array( 120, 216, 320, 384)), array( 77, 655, 3, array( 132, 240, 360, 432)), //15 array( 81, 733, 3, array( 144, 280, 408, 480)), array( 85, 815, 3, array( 168, 308, 448, 532)), array( 89, 901, 3, array( 180, 338, 504, 588)), array( 93, 991, 3, array( 196, 364, 546, 650)), array( 97, 1085, 3, array( 224, 416, 600, 700)), //20 array(101, 1156, 4, array( 224, 442, 644, 750)), array(105, 1258, 4, array( 252, 476, 690, 816)), array(109, 1364, 4, array( 270, 504, 750, 900)), array(113, 1474, 4, array( 300, 560, 810, 960)), array(117, 1588, 4, array( 312, 588, 870, 1050)), //25 array(121, 1706, 4, array( 336, 644, 952, 1110)), array(125, 1828, 4, array( 360, 700, 1020, 1200)), array(129, 1921, 3, array( 390, 728, 1050, 1260)), array(133, 2051, 3, array( 420, 784, 1140, 1350)), array(137, 2185, 3, array( 450, 812, 1200, 1440)), //30 array(141, 2323, 3, array( 480, 868, 1290, 1530)), array(145, 2465, 3, array( 510, 924, 1350, 1620)), array(149, 2611, 3, array( 540, 980, 1440, 1710)), array(153, 2761, 3, array( 570, 1036, 1530, 1800)), array(157, 2876, 0, array( 570, 1064, 1590, 1890)), //35 array(161, 3034, 0, array( 600, 1120, 1680, 1980)), array(165, 3196, 0, array( 630, 1204, 1770, 2100)), array(169, 3362, 0, array( 660, 1260, 1860, 2220)), array(173, 3532, 0, array( 720, 1316, 1950, 2310)), array(177, 3706, 0, array( 750, 1372, 2040, 2430)) //40 ); //---------------------------------------------------------------------- public static function getDataLength($version, $level) { return self::$capacity[$version][QRCAP_WORDS] - self::$capacity[$version][QRCAP_EC][$level]; } //---------------------------------------------------------------------- public static function getECCLength($version, $level) { return self::$capacity[$version][QRCAP_EC][$level]; } //---------------------------------------------------------------------- public static function getWidth($version) { return self::$capacity[$version][QRCAP_WIDTH]; } //---------------------------------------------------------------------- public static function getRemainder($version) { return self::$capacity[$version][QRCAP_REMINDER]; } //---------------------------------------------------------------------- public static function getMinimumVersion($size, $level) { for($i=1; $i<= QRSPEC_VERSION_MAX; $i++) { $words = self::$capacity[$i][QRCAP_WORDS] - self::$capacity[$i][QRCAP_EC][$level]; if($words >= $size) return $i; } return -1; } //###################################################################### public static $lengthTableBits = array( array(10, 12, 14), array( 9, 11, 13), array( 8, 16, 16), array( 8, 10, 12) ); //---------------------------------------------------------------------- public static function lengthIndicator($mode, $version) { if ($mode == QR_MODE_STRUCTURE) return 0; if ($version <= 9) { $l = 0; } else if ($version <= 26) { $l = 1; } else { $l = 2; } return self::$lengthTableBits[$mode][$l]; } //---------------------------------------------------------------------- public static function maximumWords($mode, $version) { if($mode == QR_MODE_STRUCTURE) return 3; if($version <= 9) { $l = 0; } else if($version <= 26) { $l = 1; } else { $l = 2; } $bits = self::$lengthTableBits[$mode][$l]; $words = (1 << $bits) - 1; if($mode == QR_MODE_KANJI) { $words *= 2; // the number of bytes is required } return $words; } // Error correction code ----------------------------------------------- // Table of the error correction code (Reed-Solomon block) // See Table 12-16 (pp.30-36), JIS X0510:2004. public static $eccTable = array( array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)), array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1 array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)), array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)), array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5 array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)), array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)), array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)), array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)), array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), //10 array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)), array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)), array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)), array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)), array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), //15 array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)), array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)), array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)), array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)), array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), //20 array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)), array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)), array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)), array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)), array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), //25 array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)), array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)), array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)), array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)), array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), //30 array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)), array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)), array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)), array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)), array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), //35 array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)), array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)), array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)), array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)), array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)),//40 ); //---------------------------------------------------------------------- // CACHEABLE!!! public static function getEccSpec($version, $level, array &$spec) { if (count($spec) < 5) { $spec = array(0,0,0,0,0); } $b1 = self::$eccTable[$version][$level][0]; $b2 = self::$eccTable[$version][$level][1]; $data = self::getDataLength($version, $level); $ecc = self::getECCLength($version, $level); if($b2 == 0) { $spec[0] = $b1; $spec[1] = (int)($data / $b1); $spec[2] = (int)($ecc / $b1); $spec[3] = 0; $spec[4] = 0; } else { $spec[0] = $b1; $spec[1] = (int)($data / ($b1 + $b2)); $spec[2] = (int)($ecc / ($b1 + $b2)); $spec[3] = $b2; $spec[4] = $spec[1] + 1; } } // Alignment pattern --------------------------------------------------- // Positions of alignment patterns. // This array includes only the second and the third position of the // alignment patterns. Rest of them can be calculated from the distance // between them. // See Table 1 in Appendix E (pp.71) of JIS X0510:2004. public static $alignmentPattern = array( array( 0, 0), array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5 array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10 array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), //11-15 array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), //16-20 array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), //21-25 array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), //26-30 array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), //31-35 array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58), //35-40 ); /** -------------------------------------------------------------------- * Put an alignment marker. * @param frame * @param width * @param ox,oy center coordinate of the pattern */ public static function putAlignmentMarker(array &$frame, $ox, $oy) { $finder = array( "\xa1\xa1\xa1\xa1\xa1", "\xa1\xa0\xa0\xa0\xa1", "\xa1\xa0\xa1\xa0\xa1", "\xa1\xa0\xa0\xa0\xa1", "\xa1\xa1\xa1\xa1\xa1" ); $yStart = $oy-2; $xStart = $ox-2; for($y=0; $y<5; $y++) { QRstr::set($frame, $xStart, $yStart+$y, $finder[$y]); } } //---------------------------------------------------------------------- public static function putAlignmentPattern($version, &$frame, $width) { if($version < 2) return; $d = self::$alignmentPattern[$version][1] - self::$alignmentPattern[$version][0]; if($d < 0) { $w = 2; } else { $w = (int)(($width - self::$alignmentPattern[$version][0]) / $d + 2); } if($w * $w - 3 == 1) { $x = self::$alignmentPattern[$version][0]; $y = self::$alignmentPattern[$version][0]; self::putAlignmentMarker($frame, $x, $y); return; } $cx = self::$alignmentPattern[$version][0]; for($x=1; $x<$w - 1; $x++) { self::putAlignmentMarker($frame, 6, $cx); self::putAlignmentMarker($frame, $cx, 6); $cx += $d; } $cy = self::$alignmentPattern[$version][0]; for($y=0; $y<$w-1; $y++) { $cx = self::$alignmentPattern[$version][0]; for($x=0; $x<$w-1; $x++) { self::putAlignmentMarker($frame, $cx, $cy); $cx += $d; } $cy += $d; } } // Version information pattern ----------------------------------------- // Version information pattern (BCH coded). // See Table 1 in Appendix D (pp.68) of JIS X0510:2004. // size: [QRSPEC_VERSION_MAX - 6] public static $versionPattern = array( 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64, 0x27541, 0x28c69 ); //---------------------------------------------------------------------- public static function getVersionPattern($version) { if($version < 7 || $version > QRSPEC_VERSION_MAX) return 0; return self::$versionPattern[$version -7]; } // Format information -------------------------------------------------- // See calcFormatInfo in tests/test_qrspec.c (orginal qrencode c lib) public static $formatInfo = array( array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976), array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0), array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed), array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b) ); public static function getFormatInfo($mask, $level) { if($mask < 0 || $mask > 7) return 0; if($level < 0 || $level > 3) return 0; return self::$formatInfo[$level][$mask]; } // Frame --------------------------------------------------------------- // Cache of initial frames. public static $frames = array(); /** -------------------------------------------------------------------- * Put a finder pattern. * @param frame * @param width * @param ox,oy upper-left coordinate of the pattern */ public static function putFinderPattern(&$frame, $ox, $oy) { $finder = array( "\xc1\xc1\xc1\xc1\xc1\xc1\xc1", "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", "\xc1\xc1\xc1\xc1\xc1\xc1\xc1" ); for($y=0; $y<7; $y++) { QRstr::set($frame, $ox, $oy+$y, $finder[$y]); } } //---------------------------------------------------------------------- public static function createFrame($version) { $width = self::$capacity[$version][QRCAP_WIDTH]; $frameLine = str_repeat ("\0", $width); $frame = array_fill(0, $width, $frameLine); // Finder pattern self::putFinderPattern($frame, 0, 0); self::putFinderPattern($frame, $width - 7, 0); self::putFinderPattern($frame, 0, $width - 7); // Separator $yOffset = $width - 7; for($y=0; $y<7; $y++) { $frame[$y][7] = "\xc0"; $frame[$y][$width - 8] = "\xc0"; $frame[$yOffset][7] = "\xc0"; $yOffset++; } $setPattern = str_repeat("\xc0", 8); QRstr::set($frame, 0, 7, $setPattern); QRstr::set($frame, $width-8, 7, $setPattern); QRstr::set($frame, 0, $width - 8, $setPattern); // Format info $setPattern = str_repeat("\x84", 9); QRstr::set($frame, 0, 8, $setPattern); QRstr::set($frame, $width - 8, 8, $setPattern, 8); $yOffset = $width - 8; for($y=0; $y<8; $y++,$yOffset++) { $frame[$y][8] = "\x84"; $frame[$yOffset][8] = "\x84"; } // Timing pattern for($i=1; $i<$width-15; $i++) { $frame[6][7+$i] = chr(0x90 | ($i & 1)); $frame[7+$i][6] = chr(0x90 | ($i & 1)); } // Alignment pattern self::putAlignmentPattern($version, $frame, $width); // Version information if($version >= 7) { $vinf = self::getVersionPattern($version); $v = $vinf; for($x=0; $x<6; $x++) { for($y=0; $y<3; $y++) { $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1)); $v = $v >> 1; } } $v = $vinf; for($y=0; $y<6; $y++) { for($x=0; $x<3; $x++) { $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1)); $v = $v >> 1; } } } // and a little bit... $frame[$width - 8][8] = "\x81"; return $frame; } //---------------------------------------------------------------------- public static function debug($frame, $binary_mode = false) { if ($binary_mode) { foreach ($frame as &$frameLine) { $frameLine = join('  ', explode('0', $frameLine)); $frameLine = join('██', explode('1', $frameLine)); } ?>


        '; echo join("
        ", $frame); echo '






'; } else { foreach ($frame as &$frameLine) { $frameLine = join(' ', explode("\xc0", $frameLine)); $frameLine = join('', explode("\xc1", $frameLine)); $frameLine = join(' ', explode("\xa0", $frameLine)); $frameLine = join('', explode("\xa1", $frameLine)); $frameLine = join('', explode("\x84", $frameLine)); //format 0 $frameLine = join('', explode("\x85", $frameLine)); //format 1 $frameLine = join('', explode("\x81", $frameLine)); //special bit $frameLine = join(' ', explode("\x90", $frameLine)); //clock 0 $frameLine = join('', explode("\x91", $frameLine)); //clock 1 $frameLine = join(' ', explode("\x88", $frameLine)); //version $frameLine = join('', explode("\x89", $frameLine)); //version $frameLine = join('♦', explode("\x01", $frameLine)); $frameLine = join('⋅', explode("\0", $frameLine)); } ?> "; echo join("
", $frame); echo "
"; } } //---------------------------------------------------------------------- public static function serial($frame) { return gzcompress(join("\n", $frame), 9); } //---------------------------------------------------------------------- public static function unserial($code) { return explode("\n", gzuncompress($code)); } //---------------------------------------------------------------------- public static function newFrame($version) { if($version < 1 || $version > QRSPEC_VERSION_MAX) return null; if(!isset(self::$frames[$version])) { $fileName = QR_CACHE_DIR.'frame_'.$version.'.dat'; if (QR_CACHEABLE) { if (file_exists($fileName)) { self::$frames[$version] = self::unserial(file_get_contents($fileName)); } else { self::$frames[$version] = self::createFrame($version); file_put_contents($fileName, self::serial(self::$frames[$version])); } } else { self::$frames[$version] = self::createFrame($version); } } if(is_null(self::$frames[$version])) return null; return self::$frames[$version]; } //---------------------------------------------------------------------- public static function rsBlockNum($spec) { return $spec[0] + $spec[3]; } public static function rsBlockNum1($spec) { return $spec[0]; } public static function rsDataCodes1($spec) { return $spec[1]; } public static function rsEccCodes1($spec) { return $spec[2]; } public static function rsBlockNum2($spec) { return $spec[3]; } public static function rsDataCodes2($spec) { return $spec[4]; } public static function rsEccCodes2($spec) { return $spec[2]; } public static function rsDataLength($spec) { return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); } public static function rsEccLength($spec) { return ($spec[0] + $spec[3]) * $spec[2]; } } //---- qrimage.php ----------------------------- /* * PHP QR Code encoder * * Image output of code using GD2 * * PHP QR Code is distributed under LGPL 3 * Copyright (C) 2010 Dominik Dzienia * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ define('QR_IMAGE', true); class QRimage { //---------------------------------------------------------------------- public static function png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE) { $image = self::image($frame, $pixelPerPoint, $outerFrame); if ($filename === false) { Header("Content-type: image/png"); ImagePng($image); } else { if($saveandprint===TRUE){ ImagePng($image, $filename); header("Content-type: image/png"); ImagePng($image); }else{ ImagePng($image, $filename); } } ImageDestroy($image); } //---------------------------------------------------------------------- public static function jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85) { $image = self::image($frame, $pixelPerPoint, $outerFrame); if ($filename === false) { Header("Content-type: image/jpeg"); ImageJpeg($image, null, $q); } else { ImageJpeg($image, $filename, $q); } ImageDestroy($image); } //---------------------------------------------------------------------- private static function image($frame, $pixelPerPoint = 4, $outerFrame = 4) { $h = count($frame); $w = strlen($frame[0]); $imgW = $w + 2*$outerFrame; $imgH = $h + 2*$outerFrame; $base_image =ImageCreate($imgW, $imgH); $col[0] = ImageColorAllocate($base_image,255,255,255); $col[1] = ImageColorAllocate($base_image,0,0,0); imagefill($base_image, 0, 0, $col[0]); for($y=0; $y<$h; $y++) { for($x=0; $x<$w; $x++) { if ($frame[$y][$x] == '1') { ImageSetPixel($base_image,$x+$outerFrame,$y+$outerFrame,$col[1]); } } } $target_image =ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint); ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH); ImageDestroy($base_image); return $target_image; } } //---- qrinput.php ----------------------------- /* * PHP QR Code encoder * * Input encoding class * * Based on libqrencode C library distributed under LGPL 2.1 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi * * PHP QR Code is distributed under LGPL 3 * Copyright (C) 2010 Dominik Dzienia * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ define('STRUCTURE_HEADER_BITS', 20); define('MAX_STRUCTURED_SYMBOLS', 16); class QRinputItem { public $mode; public $size; public $data; public $bstream; public function __construct($mode, $size, $data, $bstream = null) { $setData = array_slice($data, 0, $size); if (count($setData) < $size) { $setData = array_merge($setData, array_fill(0,$size-count($setData),0)); } if(!QRinput::check($mode, $size, $setData)) { throw new Exception('Error m:'.$mode.',s:'.$size.',d:'.join(',',$setData)); return null; } $this->mode = $mode; $this->size = $size; $this->data = $setData; $this->bstream = $bstream; } //---------------------------------------------------------------------- public function encodeModeNum($version) { try { $words = (int)($this->size / 3); $bs = new QRbitstream(); $val = 0x1; $bs->appendNum(4, $val); $bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM, $version), $this->size); for($i=0; $i<$words; $i++) { $val = (ord($this->data[$i*3 ]) - ord('0')) * 100; $val += (ord($this->data[$i*3+1]) - ord('0')) * 10; $val += (ord($this->data[$i*3+2]) - ord('0')); $bs->appendNum(10, $val); } if($this->size - $words * 3 == 1) { $val = ord($this->data[$words*3]) - ord('0'); $bs->appendNum(4, $val); } else if($this->size - $words * 3 == 2) { $val = (ord($this->data[$words*3 ]) - ord('0')) * 10; $val += (ord($this->data[$words*3+1]) - ord('0')); $bs->appendNum(7, $val); } $this->bstream = $bs; return 0; } catch (Exception $e) { return -1; } } //---------------------------------------------------------------------- public function encodeModeAn($version) { try { $words = (int)($this->size / 2); $bs = new QRbitstream(); $bs->appendNum(4, 0x02); $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN, $version), $this->size); for($i=0; $i<$words; $i++) { $val = (int)QRinput::lookAnTable(ord($this->data[$i*2 ])) * 45; $val += (int)QRinput::lookAnTable(ord($this->data[$i*2+1])); $bs->appendNum(11, $val); } if($this->size & 1) { $val = QRinput::lookAnTable(ord($this->data[$words * 2])); $bs->appendNum(6, $val); } $this->bstream = $bs; return 0; } catch (Exception $e) { return -1; } } //---------------------------------------------------------------------- public function encodeMode8($version) { try { $bs = new QRbitstream(); $bs->appendNum(4, 0x4); $bs->appendNum(QRspec::lengthIndicator(QR_MODE_8, $version), $this->size); for($i=0; $i<$this->size; $i++) { $bs->appendNum(8, ord($this->data[$i])); } $this->bstream = $bs; return 0; } catch (Exception $e) { return -1; } } //---------------------------------------------------------------------- public function encodeModeKanji($version) { try { $bs = new QRbitrtream(); $bs->appendNum(4, 0x8); $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI, $version), (int)($this->size / 2)); for($i=0; $i<$this->size; $i+=2) { $val = (ord($this->data[$i]) << 8) | ord($this->data[$i+1]); if($val <= 0x9ffc) { $val -= 0x8140; } else { $val -= 0xc140; } $h = ($val >> 8) * 0xc0; $val = ($val & 0xff) + $h; $bs->appendNum(13, $val); } $this->bstream = $bs; return 0; } catch (Exception $e) { return -1; } } //---------------------------------------------------------------------- public function encodeModeStructure() { try { $bs = new QRbitstream(); $bs->appendNum(4, 0x03); $bs->appendNum(4, ord($this->data[1]) - 1); $bs->appendNum(4, ord($this->data[0]) - 1); $bs->appendNum(8, ord($this->data[2])); $this->bstream = $bs; return 0; } catch (Exception $e) { return -1; } } //---------------------------------------------------------------------- public function estimateBitStreamSizeOfEntry($version) { $bits = 0; if($version == 0) $version = 1; switch($this->mode) { case QR_MODE_NUM: $bits = QRinput::estimateBitsModeNum($this->size); break; case QR_MODE_AN: $bits = QRinput::estimateBitsModeAn($this->size); break; case QR_MODE_8: $bits = QRinput::estimateBitsMode8($this->size); break; case QR_MODE_KANJI: $bits = QRinput::estimateBitsModeKanji($this->size);break; case QR_MODE_STRUCTURE: return STRUCTURE_HEADER_BITS; default: return 0; } $l = QRspec::lengthIndicator($this->mode, $version); $m = 1 << $l; $num = (int)(($this->size + $m - 1) / $m); $bits += $num * (4 + $l); return $bits; } //---------------------------------------------------------------------- public function encodeBitStream($version) { try { unset($this->bstream); $words = QRspec::maximumWords($this->mode, $version); if($this->size > $words) { $st1 = new QRinputItem($this->mode, $words, $this->data); $st2 = new QRinputItem($this->mode, $this->size - $words, array_slice($this->data, $words)); $st1->encodeBitStream($version); $st2->encodeBitStream($version); $this->bstream = new QRbitstream(); $this->bstream->append($st1->bstream); $this->bstream->append($st2->bstream); unset($st1); unset($st2); } else { $ret = 0; switch($this->mode) { case QR_MODE_NUM: $ret = $this->encodeModeNum($version); break; case QR_MODE_AN: $ret = $this->encodeModeAn($version); break; case QR_MODE_8: $ret = $this->encodeMode8($version); break; case QR_MODE_KANJI: $ret = $this->encodeModeKanji($version);break; case QR_MODE_STRUCTURE: $ret = $this->encodeModeStructure(); break; default: break; } if($ret < 0) return -1; } return $this->bstream->size(); } catch (Exception $e) { return -1; } } }; //########################################################################## class QRinput { public $items; private $version; private $level; //---------------------------------------------------------------------- public function __construct($version = 0, $level = QR_ECLEVEL_L) { if ($version < 0 || $version > QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) { throw new Exception('Invalid version no'); return NULL; } $this->version = $version; $this->level = $level; } //---------------------------------------------------------------------- public function getVersion() { return $this->version; } //---------------------------------------------------------------------- public function setVersion($version) { if($version < 0 || $version > QRSPEC_VERSION_MAX) { throw new Exception('Invalid version no'); return -1; } $this->version = $version; return 0; } //---------------------------------------------------------------------- public function getErrorCorrectionLevel() { return $this->level; } //---------------------------------------------------------------------- public function setErrorCorrectionLevel($level) { if($level > QR_ECLEVEL_H) { throw new Exception('Invalid ECLEVEL'); return -1; } $this->level = $level; return 0; } //---------------------------------------------------------------------- public function appendEntry(QRinputItem $entry) { $this->items[] = $entry; } //---------------------------------------------------------------------- public function append($mode, $size, $data) { try { $entry = new QRinputItem($mode, $size, $data); $this->items[] = $entry; return 0; } catch (Exception $e) { return -1; } } //---------------------------------------------------------------------- public function insertStructuredAppendHeader($size, $index, $parity) { if( $size > MAX_STRUCTURED_SYMBOLS ) { throw new Exception('insertStructuredAppendHeader wrong size'); } if( $index <= 0 || $index > MAX_STRUCTURED_SYMBOLS ) { throw new Exception('insertStructuredAppendHeader wrong index'); } $buf = array($size, $index, $parity); try { $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf); array_unshift($this->items, $entry); return 0; } catch (Exception $e) { return -1; } } //---------------------------------------------------------------------- public function calcParity() { $parity = 0; foreach($this->items as $item) { if($item->mode != QR_MODE_STRUCTURE) { for($i=$item->size-1; $i>=0; $i--) { $parity ^= $item->data[$i]; } } } return $parity; } //---------------------------------------------------------------------- public static function checkModeNum($size, $data) { for($i=0; $i<$size; $i++) { if((ord($data[$i]) < ord('0')) || (ord($data[$i]) > ord('9'))){ return false; } } return true; } //---------------------------------------------------------------------- public static function estimateBitsModeNum($size) { $w = (int)$size / 3; $bits = $w * 10; switch($size - $w * 3) { case 1: $bits += 4; break; case 2: $bits += 7; break; default: break; } return $bits; } //---------------------------------------------------------------------- public static $anTable = array( -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ); //---------------------------------------------------------------------- public static function lookAnTable($c) { return (($c > 127)?-1:self::$anTable[$c]); } //---------------------------------------------------------------------- public static function checkModeAn($size, $data) { for($i=0; $i<$size; $i++) { if (self::lookAnTable(ord($data[$i])) == -1) { return false; } } return true; } //---------------------------------------------------------------------- public static function estimateBitsModeAn($size) { $w = (int)($size / 2); $bits = $w * 11; if($size & 1) { $bits += 6; } return $bits; } //---------------------------------------------------------------------- public static function estimateBitsMode8($size) { return $size * 8; } //---------------------------------------------------------------------- public function estimateBitsModeKanji($size) { return (int)(($size / 2) * 13); } //---------------------------------------------------------------------- public static function checkModeKanji($size, $data) { if($size & 1) return false; for($i=0; $i<$size; $i+=2) { $val = (ord($data[$i]) << 8) | ord($data[$i+1]); if( $val < 0x8140 || ($val > 0x9ffc && $val < 0xe040) || $val > 0xebbf) { return false; } } return true; } /*********************************************************************** * Validation **********************************************************************/ public static function check($mode, $size, $data) { if($size <= 0) return false; switch($mode) { case QR_MODE_NUM: return self::checkModeNum($size, $data); break; case QR_MODE_AN: return self::checkModeAn($size, $data); break; case QR_MODE_KANJI: return self::checkModeKanji($size, $data); break; case QR_MODE_8: return true; break; case QR_MODE_STRUCTURE: return true; break; default: break; } return false; } //---------------------------------------------------------------------- public function estimateBitStreamSize($version) { $bits = 0; foreach($this->items as $item) { $bits += $item->estimateBitStreamSizeOfEntry($version); } return $bits; } //---------------------------------------------------------------------- public function estimateVersion() { $version = 0; $prev = 0; do { $prev = $version; $bits = $this->estimateBitStreamSize($prev); $version = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); if ($version < 0) { return -1; } } while ($version > $prev); return $version; } //---------------------------------------------------------------------- public static function lengthOfCode($mode, $version, $bits) { $payload = $bits - 4 - QRspec::lengthIndicator($mode, $version); switch($mode) { case QR_MODE_NUM: $chunks = (int)($payload / 10); $remain = $payload - $chunks * 10; $size = $chunks * 3; if($remain >= 7) { $size += 2; } else if($remain >= 4) { $size += 1; } break; case QR_MODE_AN: $chunks = (int)($payload / 11); $remain = $payload - $chunks * 11; $size = $chunks * 2; if($remain >= 6) $size++; break; case QR_MODE_8: $size = (int)($payload / 8); break; case QR_MODE_KANJI: $size = (int)(($payload / 13) * 2); break; case QR_MODE_STRUCTURE: $size = (int)($payload / 8); break; default: $size = 0; break; } $maxsize = QRspec::maximumWords($mode, $version); if($size < 0) $size = 0; if($size > $maxsize) $size = $maxsize; return $size; } //---------------------------------------------------------------------- public function createBitStream() { $total = 0; foreach($this->items as $item) { $bits = $item->encodeBitStream($this->version); if($bits < 0) return -1; $total += $bits; } return $total; } //---------------------------------------------------------------------- public function convertData() { $ver = $this->estimateVersion(); if($ver > $this->getVersion()) { $this->setVersion($ver); } for(;;) { $bits = $this->createBitStream(); if($bits < 0) return -1; $ver = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); if($ver < 0) { throw new Exception('WRONG VERSION'); return -1; } else if($ver > $this->getVersion()) { $this->setVersion($ver); } else { break; } } return 0; } //---------------------------------------------------------------------- public function appendPaddingBit(&$bstream) { $bits = $bstream->size(); $maxwords = QRspec::getDataLength($this->version, $this->level); $maxbits = $maxwords * 8; if ($maxbits == $bits) { return 0; } if ($maxbits - $bits < 5) { return $bstream->appendNum($maxbits - $bits, 0); } $bits += 4; $words = (int)(($bits + 7) / 8); $padding = new QRbitstream(); $ret = $padding->appendNum($words * 8 - $bits + 4, 0); if($ret < 0) return $ret; $padlen = $maxwords - $words; if($padlen > 0) { $padbuf = array(); for($i=0; $i<$padlen; $i++) { $padbuf[$i] = ($i&1)?0x11:0xec; } $ret = $padding->appendBytes($padlen, $padbuf); if($ret < 0) return $ret; } $ret = $bstream->append($padding); return $ret; } //---------------------------------------------------------------------- public function mergeBitStream() { if($this->convertData() < 0) { return null; } $bstream = new QRbitstream(); foreach($this->items as $item) { $ret = $bstream->append($item->bstream); if($ret < 0) { return null; } } return $bstream; } //---------------------------------------------------------------------- public function getBitStream() { $bstream = $this->mergeBitStream(); if($bstream == null) { return null; } $ret = $this->appendPaddingBit($bstream); if($ret < 0) { return null; } return $bstream; } //---------------------------------------------------------------------- public function getByteStream() { $bstream = $this->getBitStream(); if($bstream == null) { return null; } return $bstream->toByte(); } } //---- qrbitstream.php ----------------------------- /* * PHP QR Code encoder * * Bitstream class * * Based on libqrencode C library distributed under LGPL 2.1 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi * * PHP QR Code is distributed under LGPL 3 * Copyright (C) 2010 Dominik Dzienia * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ class QRbitstream { public $data = array(); //---------------------------------------------------------------------- public function size() { return count($this->data); } //---------------------------------------------------------------------- public function allocate($setLength) { $this->data = array_fill(0, $setLength, 0); return 0; } //---------------------------------------------------------------------- public static function newFromNum($bits, $num) { $bstream = new QRbitstream(); $bstream->allocate($bits); $mask = 1 << ($bits - 1); for($i=0; $i<$bits; $i++) { if($num & $mask) { $bstream->data[$i] = 1; } else { $bstream->data[$i] = 0; } $mask = $mask >> 1; } return $bstream; } //---------------------------------------------------------------------- public static function newFromBytes($size, $data) { $bstream = new QRbitstream(); $bstream->allocate($size * 8); $p=0; for($i=0; $i<$size; $i++) { $mask = 0x80; for($j=0; $j<8; $j++) { if($data[$i] & $mask) { $bstream->data[$p] = 1; } else { $bstream->data[$p] = 0; } $p++; $mask = $mask >> 1; } } return $bstream; } //---------------------------------------------------------------------- public function append(QRbitstream $arg) { if (is_null($arg)) { return -1; } if($arg->size() == 0) { return 0; } if($this->size() == 0) { $this->data = $arg->data; return 0; } $this->data = array_values(array_merge($this->data, $arg->data)); return 0; } //---------------------------------------------------------------------- public function appendNum($bits, $num) { if ($bits == 0) return 0; $b = QRbitstream::newFromNum($bits, $num); if(is_null($b)) return -1; $ret = $this->append($b); unset($b); return $ret; } //---------------------------------------------------------------------- public function appendBytes($size, $data) { if ($size == 0) return 0; $b = QRbitstream::newFromBytes($size, $data); if(is_null($b)) return -1; $ret = $this->append($b); unset($b); return $ret; } //---------------------------------------------------------------------- public function toByte() { $size = $this->size(); if($size == 0) { return array(); } $data = array_fill(0, (int)(($size + 7) / 8), 0); $bytes = (int)($size / 8); $p = 0; for($i=0; $i<$bytes; $i++) { $v = 0; for($j=0; $j<8; $j++) { $v = $v << 1; $v |= $this->data[$p]; $p++; } $data[$i] = $v; } if($size & 7) { $v = 0; for($j=0; $j<($size & 7); $j++) { $v = $v << 1; $v |= $this->data[$p]; $p++; } $data[$bytes] = $v; } return $data; } } //---- qrsplit.php ----------------------------- /* * PHP QR Code encoder * * Input splitting classes * * Based on libqrencode C library distributed under LGPL 2.1 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi * * PHP QR Code is distributed under LGPL 3 * Copyright (C) 2010 Dominik Dzienia * * The following data / specifications are taken from * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) * or * "Automatic identification and data capture techniques -- * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ class QRsplit { public $dataStr = ''; public $input; public $modeHint; //---------------------------------------------------------------------- public function __construct($dataStr, $input, $modeHint) { $this->dataStr = $dataStr; $this->input = $input; $this->modeHint = $modeHint; } //---------------------------------------------------------------------- public static function isdigitat($str, $pos) { if ($pos >= strlen($str)) return false; return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9'))); } //---------------------------------------------------------------------- public static function isalnumat($str, $pos) { if ($pos >= strlen($str)) return false; return (QRinput::lookAnTable(ord($str[$pos])) >= 0); } //---------------------------------------------------------------------- public function identifyMode($pos) { if ($pos >= strlen($this->dataStr)) return QR_MODE_NUL; $c = $this->dataStr[$pos]; if(self::isdigitat($this->dataStr, $pos)) { return QR_MODE_NUM; } else if(self::isalnumat($this->dataStr, $pos)) { return QR_MODE_AN; } else if($this->modeHint == QR_MODE_KANJI) { if ($pos+1 < strlen($this->dataStr)) { $d = $this->dataStr[$pos+1]; $word = (ord($c) << 8) | ord($d); if(($word >= 0x8140 && $word <= 0x9ffc) || ($word >= 0xe040 && $word <= 0xebbf)) { return QR_MODE_KANJI; } } } return QR_MODE_8; } //---------------------------------------------------------------------- public function eatNum() { $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); $p = 0; while(self::isdigitat($this->dataStr, $p)) { $p++; } $run = $p; $mode = $this->identifyMode($p); if($mode == QR_MODE_8) { $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln + QRinput::estimateBitsMode8(1) // + 4 + l8 - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 if($dif > 0) { return $this->eat8(); } } if($mode == QR_MODE_AN) { $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln + QRinput::estimateBitsModeAn(1) // + 4 + la - QRinput::estimateBitsModeAn($run + 1);// - 4 - la if($dif > 0) { return $this->eatAn(); } } $ret = $this->input->append(QR_MODE_NUM, $run, str_split($this->dataStr)); if($ret < 0) return -1; return $run; } //---------------------------------------------------------------------- public function eatAn() { $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); $p = 0; while(self::isalnumat($this->dataStr, $p)) { if(self::isdigitat($this->dataStr, $p)) { $q = $p; while(self::isdigitat($this->dataStr, $q)) { $q++; } $dif = QRinput::estimateBitsModeAn($p) // + 4 + la + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln - QRinput::estimateBitsModeAn($q); // - 4 - la if($dif < 0) { break; } else { $p = $q; } } else { $p++; } } $run = $p; if(!self::isalnumat($this->dataStr, $p)) { $dif = QRinput::estimateBitsModeAn($run) + 4 + $la + QRinput::estimateBitsMode8(1) // + 4 + l8 - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 if($dif > 0) { return $this->eat8(); } } $ret = $this->input->append(QR_MODE_AN, $run, str_split($this->dataStr)); if($ret < 0) return -1; return $run; } //---------------------------------------------------------------------- public function eatKanji() { $p = 0; while($this->identifyMode($p) == QR_MODE_KANJI) { $p += 2; } $ret = $this->input->append(QR_MODE_KANJI, $p, str_split($this->dataStr)); if($ret < 0) return -1; return $run; } //---------------------------------------------------------------------- public function eat8() { $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); $p = 1; $dataStrLen = strlen($this->dataStr); while($p < $dataStrLen) { $mode = $this->identifyMode($p); if($mode == QR_MODE_KANJI) { break; } if($mode == QR_MODE_NUM) { $q = $p; while(self::isdigitat($this->dataStr, $q)) { $q++; } $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln - QRinput::estimateBitsMode8($q); // - 4 - l8 if($dif < 0) { break; } else { $p = $q; } } else if($mode == QR_MODE_AN) { $q = $p; while(self::isalnumat($this->dataStr, $q)) { $q++; } $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 + QRinput::estimateBitsModeAn($q - $p) + 4 + $la - QRinput::estimateBitsMode8($q); // - 4 - l8 if($dif < 0) { break; } else { $p = $q; } } else { $p++; } } $run = $p; $ret = $this->input->append(QR_MODE_8, $run, str_split($this->dataStr)); if($ret < 0) return -1; return $run; } //---------------------------------------------------------------------- public function splitString() { while (strlen($this->dataStr) > 0) { if($this->dataStr == '') return 0; $mode = $this->identifyMode(0); switch ($mode) { case QR_MODE_NUM: $length = $this->eatNum(); break; case QR_MODE_AN: $length = $this->eatAn(); break; case QR_MODE_KANJI: if ($hint == QR_MODE_KANJI) $length = $this->eatKanji(); else $length = $this->eat8(); break; default: $length = $this->eat8(); break; } if($length == 0) return 0; if($length < 0) return -1; $this->dataStr = substr($this->dataStr, $length); } } //---------------------------------------------------------------------- public function toUpper() { $stringLen = strlen($this->dataStr); $p = 0; while ($p<$stringLen) { $mode = self::identifyMode(substr($this->dataStr, $p), $this->modeHint); if($mode == QR_MODE_KANJI) { $p += 2; } else { if (ord($this->dataStr[$p]) >= ord('a') && ord($this->dataStr[$p]) <= ord('z')) { $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32); } $p++; } } return $this->dataStr; } //---------------------------------------------------------------------- public static function splitStringToQRinput($string, QRinput $input, $modeHint, $casesensitive = true) { if(is_null($string) || $string == '\0' || $string == '') { throw new Exception('empty string!!!'); } $split = new QRsplit($string, $input, $modeHint); if(!$casesensitive) $split->toUpper(); return $split->splitString(); } } //---- qrrscode.php ----------------------------- /* * PHP QR Code encoder * * Reed-Solomon error correction support * * Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q * (libfec is released under the GNU Lesser General Public License.) * * Based on libqrencode C library distributed under LGPL 2.1 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi * * PHP QR Code is distributed under LGPL 3 * Copyright (C) 2010 Dominik Dzienia * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ class QRrsItem { public $mm; // Bits per symbol public $nn; // Symbols per block (= (1<= $this->nn) { $x -= $this->nn; $x = ($x >> $this->mm) + ($x & $this->nn); } return $x; } //---------------------------------------------------------------------- public static function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) { // Common code for intializing a Reed-Solomon control block (char or int symbols) // Copyright 2004 Phil Karn, KA9Q // May be used under the terms of the GNU Lesser General Public License (LGPL) $rs = null; // Check parameter ranges if($symsize < 0 || $symsize > 8) return $rs; if($fcr < 0 || $fcr >= (1<<$symsize)) return $rs; if($prim <= 0 || $prim >= (1<<$symsize)) return $rs; if($nroots < 0 || $nroots >= (1<<$symsize)) return $rs; // Can't have more roots than symbol values! if($pad < 0 || $pad >= ((1<<$symsize) -1 - $nroots)) return $rs; // Too much padding $rs = new QRrsItem(); $rs->mm = $symsize; $rs->nn = (1<<$symsize)-1; $rs->pad = $pad; $rs->alpha_to = array_fill(0, $rs->nn+1, 0); $rs->index_of = array_fill(0, $rs->nn+1, 0); // PHP style macro replacement ;) $NN =& $rs->nn; $A0 =& $NN; // Generate Galois field lookup tables $rs->index_of[0] = $A0; // log(zero) = -inf $rs->alpha_to[$A0] = 0; // alpha**-inf = 0 $sr = 1; for($i=0; $i<$rs->nn; $i++) { $rs->index_of[$sr] = $i; $rs->alpha_to[$i] = $sr; $sr <<= 1; if($sr & (1<<$symsize)) { $sr ^= $gfpoly; } $sr &= $rs->nn; } if($sr != 1){ // field generator polynomial is not primitive! $rs = NULL; return $rs; } /* Form RS code generator polynomial from its roots */ $rs->genpoly = array_fill(0, $nroots+1, 0); $rs->fcr = $fcr; $rs->prim = $prim; $rs->nroots = $nroots; $rs->gfpoly = $gfpoly; /* Find prim-th root of 1, used in decoding */ for($iprim=1;($iprim % $prim) != 0;$iprim += $rs->nn) ; // intentional empty-body loop! $rs->iprim = (int)($iprim / $prim); $rs->genpoly[0] = 1; for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) { $rs->genpoly[$i+1] = 1; // Multiply rs->genpoly[] by @**(root + x) for ($j = $i; $j > 0; $j--) { if ($rs->genpoly[$j] != 0) { $rs->genpoly[$j] = $rs->genpoly[$j-1] ^ $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[$j]] + $root)]; } else { $rs->genpoly[$j] = $rs->genpoly[$j-1]; } } // rs->genpoly[0] can never be zero $rs->genpoly[0] = $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[0]] + $root)]; } // convert rs->genpoly[] to index form for quicker encoding for ($i = 0; $i <= $nroots; $i++) $rs->genpoly[$i] = $rs->index_of[$rs->genpoly[$i]]; return $rs; } //---------------------------------------------------------------------- public function encode_rs_char($data, &$parity) { $MM =& $this->mm; $NN =& $this->nn; $ALPHA_TO =& $this->alpha_to; $INDEX_OF =& $this->index_of; $GENPOLY =& $this->genpoly; $NROOTS =& $this->nroots; $FCR =& $this->fcr; $PRIM =& $this->prim; $IPRIM =& $this->iprim; $PAD =& $this->pad; $A0 =& $NN; $parity = array_fill(0, $NROOTS, 0); for($i=0; $i< ($NN-$NROOTS-$PAD); $i++) { $feedback = $INDEX_OF[$data[$i] ^ $parity[0]]; if($feedback != $A0) { // feedback term is non-zero // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must // always be for the polynomials constructed by init_rs() $feedback = $this->modnn($NN - $GENPOLY[$NROOTS] + $feedback); for($j=1;$j<$NROOTS;$j++) { $parity[$j] ^= $ALPHA_TO[$this->modnn($feedback + $GENPOLY[$NROOTS-$j])]; } } // Shift array_shift($parity); if($feedback != $A0) { array_push($parity, $ALPHA_TO[$this->modnn($feedback + $GENPOLY[0])]); } else { array_push($parity, 0); } } } } //########################################################################## class QRrs { public static $items = array(); //---------------------------------------------------------------------- public static function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) { foreach(self::$items as $rs) { if($rs->pad != $pad) continue; if($rs->nroots != $nroots) continue; if($rs->mm != $symsize) continue; if($rs->gfpoly != $gfpoly) continue; if($rs->fcr != $fcr) continue; if($rs->prim != $prim) continue; return $rs; } $rs = QRrsItem::init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad); array_unshift(self::$items, $rs); return $rs; } } //---- qrmask.php ----------------------------- /* * PHP QR Code encoder * * Masking * * Based on libqrencode C library distributed under LGPL 2.1 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi * * PHP QR Code is distributed under LGPL 3 * Copyright (C) 2010 Dominik Dzienia * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ define('N1', 3); define('N2', 3); define('N3', 40); define('N4', 10); class QRmask { public $runLength = array(); //---------------------------------------------------------------------- public function __construct() { $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0); } //---------------------------------------------------------------------- public function writeFormatInformation($width, &$frame, $mask, $level) { $blacks = 0; $format = QRspec::getFormatInfo($mask, $level); for($i=0; $i<8; $i++) { if($format & 1) { $blacks += 2; $v = 0x85; } else { $v = 0x84; } $frame[8][$width - 1 - $i] = chr($v); if($i < 6) { $frame[$i][8] = chr($v); } else { $frame[$i + 1][8] = chr($v); } $format = $format >> 1; } for($i=0; $i<7; $i++) { if($format & 1) { $blacks += 2; $v = 0x85; } else { $v = 0x84; } $frame[$width - 7 + $i][8] = chr($v); if($i == 0) { $frame[8][7] = chr($v); } else { $frame[8][6 - $i] = chr($v); } $format = $format >> 1; } return $blacks; } //---------------------------------------------------------------------- public function mask0($x, $y) { return ($x+$y)&1; } public function mask1($x, $y) { return ($y&1); } public function mask2($x, $y) { return ($x%3); } public function mask3($x, $y) { return ($x+$y)%3; } public function mask4($x, $y) { return (((int)($y/2))+((int)($x/3)))&1; } public function mask5($x, $y) { return (($x*$y)&1)+($x*$y)%3; } public function mask6($x, $y) { return ((($x*$y)&1)+($x*$y)%3)&1; } public function mask7($x, $y) { return ((($x*$y)%3)+(($x+$y)&1))&1; } //---------------------------------------------------------------------- private function generateMaskNo($maskNo, $width, $frame) { $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); for($y=0; $y<$width; $y++) { for($x=0; $x<$width; $x++) { if(ord($frame[$y][$x]) & 0x80) { $bitMask[$y][$x] = 0; } else { $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y); $bitMask[$y][$x] = ($maskFunc == 0)?1:0; } } } return $bitMask; } //---------------------------------------------------------------------- public static function serial($bitFrame) { $codeArr = array(); foreach ($bitFrame as $line) $codeArr[] = join('', $line); return gzcompress(join("\n", $codeArr), 9); } //---------------------------------------------------------------------- public static function unserial($code) { $codeArr = array(); $codeLines = explode("\n", gzuncompress($code)); foreach ($codeLines as $line) $codeArr[] = str_split($line); return $codeArr; } //---------------------------------------------------------------------- public function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly = false) { $b = 0; $bitMask = array(); $fileName = QR_CACHE_DIR.'mask_'.$maskNo.DIRECTORY_SEPARATOR.'mask_'.$width.'_'.$maskNo.'.dat'; if (QR_CACHEABLE) { if (file_exists($fileName)) { $bitMask = self::unserial(file_get_contents($fileName)); } else { $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); if (!file_exists(QR_CACHE_DIR.'mask_'.$maskNo)) mkdir(QR_CACHE_DIR.'mask_'.$maskNo); file_put_contents($fileName, self::serial($bitMask)); } } else { $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); } if ($maskGenOnly) return; $d = $s; for($y=0; $y<$width; $y++) { for($x=0; $x<$width; $x++) { if($bitMask[$y][$x] == 1) { $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]); } $b += (int)(ord($d[$y][$x]) & 1); } } return $b; } //---------------------------------------------------------------------- public function makeMask($width, $frame, $maskNo, $level) { $masked = array_fill(0, $width, str_repeat("\0", $width)); $this->makeMaskNo($maskNo, $width, $frame, $masked); $this->writeFormatInformation($width, $masked, $maskNo, $level); return $masked; } //---------------------------------------------------------------------- public function calcN1N3($length) { $demerit = 0; for($i=0; $i<$length; $i++) { if($this->runLength[$i] >= 5) { $demerit += (N1 + ($this->runLength[$i] - 5)); } if($i & 1) { if(($i >= 3) && ($i < ($length-2)) && ($this->runLength[$i] % 3 == 0)) { $fact = (int)($this->runLength[$i] / 3); if(($this->runLength[$i-2] == $fact) && ($this->runLength[$i-1] == $fact) && ($this->runLength[$i+1] == $fact) && ($this->runLength[$i+2] == $fact)) { if(($this->runLength[$i-3] < 0) || ($this->runLength[$i-3] >= (4 * $fact))) { $demerit += N3; } else if((($i+3) >= $length) || ($this->runLength[$i+3] >= (4 * $fact))) { $demerit += N3; } } } } } return $demerit; } //---------------------------------------------------------------------- public function evaluateSymbol($width, $frame) { $head = 0; $demerit = 0; for($y=0; $y<$width; $y++) { $head = 0; $this->runLength[0] = 1; $frameY = $frame[$y]; if ($y>0) $frameYM = $frame[$y-1]; for($x=0; $x<$width; $x++) { if(($x > 0) && ($y > 0)) { $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]); $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]); if(($b22 | ($w22 ^ 1))&1) { $demerit += N2; } } if(($x == 0) && (ord($frameY[$x]) & 1)) { $this->runLength[0] = -1; $head = 1; $this->runLength[$head] = 1; } else if($x > 0) { if((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) { $head++; $this->runLength[$head] = 1; } else { $this->runLength[$head]++; } } } $demerit += $this->calcN1N3($head+1); } for($x=0; $x<$width; $x++) { $head = 0; $this->runLength[0] = 1; for($y=0; $y<$width; $y++) { if($y == 0 && (ord($frame[$y][$x]) & 1)) { $this->runLength[0] = -1; $head = 1; $this->runLength[$head] = 1; } else if($y > 0) { if((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) { $head++; $this->runLength[$head] = 1; } else { $this->runLength[$head]++; } } } $demerit += $this->calcN1N3($head+1); } return $demerit; } //---------------------------------------------------------------------- public function mask($width, $frame, $level) { $minDemerit = PHP_INT_MAX; $bestMaskNum = 0; $bestMask = array(); $checked_masks = array(0,1,2,3,4,5,6,7); if (QR_FIND_FROM_RANDOM !== false) { $howManuOut = 8-(QR_FIND_FROM_RANDOM % 9); for ($i = 0; $i < $howManuOut; $i++) { $remPos = rand (0, count($checked_masks)-1); unset($checked_masks[$remPos]); $checked_masks = array_values($checked_masks); } } $bestMask = $frame; foreach($checked_masks as $i) { $mask = array_fill(0, $width, str_repeat("\0", $width)); $demerit = 0; $blacks = 0; $blacks = $this->makeMaskNo($i, $width, $frame, $mask); $blacks += $this->writeFormatInformation($width, $mask, $i, $level); $blacks = (int)(100 * $blacks / ($width * $width)); $demerit = (int)((int)(abs($blacks - 50) / 5) * N4); $demerit += $this->evaluateSymbol($width, $mask); if($demerit < $minDemerit) { $minDemerit = $demerit; $bestMask = $mask; $bestMaskNum = $i; } } return $bestMask; } //---------------------------------------------------------------------- } //---- qrencode.php ----------------------------- /* * PHP QR Code encoder * * Main encoder classes. * * Based on libqrencode C library distributed under LGPL 2.1 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi * * PHP QR Code is distributed under LGPL 3 * Copyright (C) 2010 Dominik Dzienia * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ class QRrsblock { public $dataLength; public $data = array(); public $eccLength; public $ecc = array(); public function __construct($dl, $data, $el, &$ecc, QRrsItem $rs) { $rs->encode_rs_char($data, $ecc); $this->dataLength = $dl; $this->data = $data; $this->eccLength = $el; $this->ecc = $ecc; } }; //########################################################################## class QRrawcode { public $version; public $datacode = array(); public $ecccode = array(); public $blocks; public $rsblocks = array(); //of RSblock public $count; public $dataLength; public $eccLength; public $b1; //---------------------------------------------------------------------- public function __construct(QRinput $input) { $spec = array(0,0,0,0,0); $this->datacode = $input->getByteStream(); if(is_null($this->datacode)) { throw new Exception('null imput string'); } QRspec::getEccSpec($input->getVersion(), $input->getErrorCorrectionLevel(), $spec); $this->version = $input->getVersion(); $this->b1 = QRspec::rsBlockNum1($spec); $this->dataLength = QRspec::rsDataLength($spec); $this->eccLength = QRspec::rsEccLength($spec); $this->ecccode = array_fill(0, $this->eccLength, 0); $this->blocks = QRspec::rsBlockNum($spec); $ret = $this->init($spec); if($ret < 0) { throw new Exception('block alloc error'); return null; } $this->count = 0; } //---------------------------------------------------------------------- public function init(array $spec) { $dl = QRspec::rsDataCodes1($spec); $el = QRspec::rsEccCodes1($spec); $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); $blockNo = 0; $dataPos = 0; $eccPos = 0; for($i=0; $iecccode,$eccPos); $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); $dataPos += $dl; $eccPos += $el; $blockNo++; } if(QRspec::rsBlockNum2($spec) == 0) return 0; $dl = QRspec::rsDataCodes2($spec); $el = QRspec::rsEccCodes2($spec); $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); if($rs == NULL) return -1; for($i=0; $iecccode,$eccPos); $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); $dataPos += $dl; $eccPos += $el; $blockNo++; } return 0; } //---------------------------------------------------------------------- public function getCode() { $ret; if($this->count < $this->dataLength) { $row = $this->count % $this->blocks; $col = $this->count / $this->blocks; if($col >= $this->rsblocks[0]->dataLength) { $row += $this->b1; } $ret = $this->rsblocks[$row]->data[$col]; } else if($this->count < $this->dataLength + $this->eccLength) { $row = ($this->count - $this->dataLength) % $this->blocks; $col = ($this->count - $this->dataLength) / $this->blocks; $ret = $this->rsblocks[$row]->ecc[$col]; } else { return 0; } $this->count++; return $ret; } } //########################################################################## class QRcode { public $version; public $width; public $data; //---------------------------------------------------------------------- public function encodeMask(QRinput $input, $mask) { if($input->getVersion() < 0 || $input->getVersion() > QRSPEC_VERSION_MAX) { throw new Exception('wrong version'); } if($input->getErrorCorrectionLevel() > QR_ECLEVEL_H) { throw new Exception('wrong level'); } $raw = new QRrawcode($input); QRtools::markTime('after_raw'); $version = $raw->version; $width = QRspec::getWidth($version); $frame = QRspec::newFrame($version); $filler = new FrameFiller($width, $frame); if(is_null($filler)) { return NULL; } // inteleaved data and ecc codes for($i=0; $i<$raw->dataLength + $raw->eccLength; $i++) { $code = $raw->getCode(); $bit = 0x80; for($j=0; $j<8; $j++) { $addr = $filler->next(); $filler->setFrameAt($addr, 0x02 | (($bit & $code) != 0)); $bit = $bit >> 1; } } QRtools::markTime('after_filler'); unset($raw); // remainder bits $j = QRspec::getRemainder($version); for($i=0; $i<$j; $i++) { $addr = $filler->next(); $filler->setFrameAt($addr, 0x02); } $frame = $filler->frame; unset($filler); // masking $maskObj = new QRmask(); if($mask < 0) { if (QR_FIND_BEST_MASK) { $masked = $maskObj->mask($width, $frame, $input->getErrorCorrectionLevel()); } else { $masked = $maskObj->makeMask($width, $frame, (intval(QR_DEFAULT_MASK) % 8), $input->getErrorCorrectionLevel()); } } else { $masked = $maskObj->makeMask($width, $frame, $mask, $input->getErrorCorrectionLevel()); } if($masked == NULL) { return NULL; } QRtools::markTime('after_mask'); $this->version = $version; $this->width = $width; $this->data = $masked; return $this; } //---------------------------------------------------------------------- public function encodeInput(QRinput $input) { return $this->encodeMask($input, -1); } //---------------------------------------------------------------------- public function encodeString8bit($string, $version, $level) { if(string == NULL) { throw new Exception('empty string!'); return NULL; } $input = new QRinput($version, $level); if($input == NULL) return NULL; $ret = $input->append($input, QR_MODE_8, strlen($string), str_split($string)); if($ret < 0) { unset($input); return NULL; } return $this->encodeInput($input); } //---------------------------------------------------------------------- public function encodeString($string, $version, $level, $hint, $casesensitive) { if($hint != QR_MODE_8 && $hint != QR_MODE_KANJI) { throw new Exception('bad hint'); return NULL; } $input = new QRinput($version, $level); if($input == NULL) return NULL; $ret = QRsplit::splitStringToQRinput($string, $input, $hint, $casesensitive); if($ret < 0) { return NULL; } return $this->encodeInput($input); } //---------------------------------------------------------------------- public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false) { $enc = QRencode::factory($level, $size, $margin); return $enc->encodePNG($text, $outfile, $saveandprint=false); } //---------------------------------------------------------------------- public static function text($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) { $enc = QRencode::factory($level, $size, $margin); return $enc->encode($text, $outfile); } //---------------------------------------------------------------------- public static function raw($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) { $enc = QRencode::factory($level, $size, $margin); return $enc->encodeRAW($text, $outfile); } } //########################################################################## class FrameFiller { public $width; public $frame; public $x; public $y; public $dir; public $bit; //---------------------------------------------------------------------- public function __construct($width, &$frame) { $this->width = $width; $this->frame = $frame; $this->x = $width - 1; $this->y = $width - 1; $this->dir = -1; $this->bit = -1; } //---------------------------------------------------------------------- public function setFrameAt($at, $val) { $this->frame[$at['y']][$at['x']] = chr($val); } //---------------------------------------------------------------------- public function getFrameAt($at) { return ord($this->frame[$at['y']][$at['x']]); } //---------------------------------------------------------------------- public function next() { do { if($this->bit == -1) { $this->bit = 0; return array('x'=>$this->x, 'y'=>$this->y); } $x = $this->x; $y = $this->y; $w = $this->width; if($this->bit == 0) { $x--; $this->bit++; } else { $x++; $y += $this->dir; $this->bit--; } if($this->dir < 0) { if($y < 0) { $y = 0; $x -= 2; $this->dir = 1; if($x == 6) { $x--; $y = 9; } } } else { if($y == $w) { $y = $w - 1; $x -= 2; $this->dir = -1; if($x == 6) { $x--; $y -= 8; } } } if($x < 0 || $y < 0) return null; $this->x = $x; $this->y = $y; } while(ord($this->frame[$y][$x]) & 0x80); return array('x'=>$x, 'y'=>$y); } } ; //########################################################################## class QRencode { public $casesensitive = true; public $eightbit = false; public $version = 0; public $size = 3; public $margin = 4; public $structured = 0; // not supported yet public $level = QR_ECLEVEL_L; public $hint = QR_MODE_8; //---------------------------------------------------------------------- public static function factory($level = QR_ECLEVEL_L, $size = 3, $margin = 4) { $enc = new QRencode(); $enc->size = $size; $enc->margin = $margin; switch ($level.'') { case '0': case '1': case '2': case '3': $enc->level = $level; break; case 'l': case 'L': $enc->level = QR_ECLEVEL_L; break; case 'm': case 'M': $enc->level = QR_ECLEVEL_M; break; case 'q': case 'Q': $enc->level = QR_ECLEVEL_Q; break; case 'h': case 'H': $enc->level = QR_ECLEVEL_H; break; } return $enc; } //---------------------------------------------------------------------- public function encodeRAW($intext, $outfile = false) { $code = new QRcode(); if($this->eightbit) { $code->encodeString8bit($intext, $this->version, $this->level); } else { $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); } return $code->data; } //---------------------------------------------------------------------- public function encode($intext, $outfile = false) { $code = new QRcode(); if($this->eightbit) { $code->encodeString8bit($intext, $this->version, $this->level); } else { $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); } QRtools::markTime('after_encode'); if ($outfile!== false) { file_put_contents($outfile, join("\n", QRtools::binarize($code->data))); } else { return QRtools::binarize($code->data); } } //---------------------------------------------------------------------- public function encodePNG($intext, $outfile = false,$saveandprint=false) { try { ob_start(); $tab = $this->encode($intext); $err = ob_get_contents(); ob_end_clean(); if ($err != '') QRtools::log($outfile, $err); $maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab)+2*$this->margin)); QRimage::png($tab, $outfile, min(max(1, $this->size), $maxSize), $this->margin,$saveandprint); } catch (Exception $e) { QRtools::log($outfile, $e->getMessage()); } } } phpqrcode/qrbitstream.php0000644000175000017500000001241211432665120015135 0ustar thijsthijs * * PHP QR Code is distributed under LGPL 3 * Copyright (C) 2010 Dominik Dzienia * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ class QRbitstream { public $data = array(); //---------------------------------------------------------------------- public function size() { return count($this->data); } //---------------------------------------------------------------------- public function allocate($setLength) { $this->data = array_fill(0, $setLength, 0); return 0; } //---------------------------------------------------------------------- public static function newFromNum($bits, $num) { $bstream = new QRbitstream(); $bstream->allocate($bits); $mask = 1 << ($bits - 1); for($i=0; $i<$bits; $i++) { if($num & $mask) { $bstream->data[$i] = 1; } else { $bstream->data[$i] = 0; } $mask = $mask >> 1; } return $bstream; } //---------------------------------------------------------------------- public static function newFromBytes($size, $data) { $bstream = new QRbitstream(); $bstream->allocate($size * 8); $p=0; for($i=0; $i<$size; $i++) { $mask = 0x80; for($j=0; $j<8; $j++) { if($data[$i] & $mask) { $bstream->data[$p] = 1; } else { $bstream->data[$p] = 0; } $p++; $mask = $mask >> 1; } } return $bstream; } //---------------------------------------------------------------------- public function append(QRbitstream $arg) { if (is_null($arg)) { return -1; } if($arg->size() == 0) { return 0; } if($this->size() == 0) { $this->data = $arg->data; return 0; } $this->data = array_values(array_merge($this->data, $arg->data)); return 0; } //---------------------------------------------------------------------- public function appendNum($bits, $num) { if ($bits == 0) return 0; $b = QRbitstream::newFromNum($bits, $num); if(is_null($b)) return -1; $ret = $this->append($b); unset($b); return $ret; } //---------------------------------------------------------------------- public function appendBytes($size, $data) { if ($size == 0) return 0; $b = QRbitstream::newFromBytes($size, $data); if(is_null($b)) return -1; $ret = $this->append($b); unset($b); return $ret; } //---------------------------------------------------------------------- public function toByte() { $size = $this->size(); if($size == 0) { return array(); } $data = array_fill(0, (int)(($size + 7) / 8), 0); $bytes = (int)($size / 8); $p = 0; for($i=0; $i<$bytes; $i++) { $v = 0; for($j=0; $j<8; $j++) { $v = $v << 1; $v |= $this->data[$p]; $p++; } $data[$i] = $v; } if($size & 7) { $v = 0; for($j=0; $j<($size & 7); $j++) { $v = $v << 1; $v |= $this->data[$p]; $p++; } $data[$bytes] = $v; } return $data; } } phpqrcode/qrconfig.php0000644000175000017500000000264611432665120014420 0ustar thijsthijs * * PHP QR Code is distributed under LGPL 3 * Copyright (C) 2010 Dominik Dzienia * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ // Encoding modes define('QR_MODE_NUL', -1); define('QR_MODE_NUM', 0); define('QR_MODE_AN', 1); define('QR_MODE_8', 2); define('QR_MODE_KANJI', 3); define('QR_MODE_STRUCTURE', 4); // Levels of error correction. define('QR_ECLEVEL_L', 0); define('QR_ECLEVEL_M', 1); define('QR_ECLEVEL_Q', 2); define('QR_ECLEVEL_H', 3); // Supported output formats define('QR_FORMAT_TEXT', 0); define('QR_FORMAT_PNG', 1); class qrstr { public static function set(&$srctab, $x, $y, $repl, $replLen = false) { $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl)); } } phpqrcode/qrencode.php0000644000175000017500000004214211432665120014403 0ustar thijsthijs * * PHP QR Code is distributed under LGPL 3 * Copyright (C) 2010 Dominik Dzienia * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ class QRrsblock { public $dataLength; public $data = array(); public $eccLength; public $ecc = array(); public function __construct($dl, $data, $el, &$ecc, QRrsItem $rs) { $rs->encode_rs_char($data, $ecc); $this->dataLength = $dl; $this->data = $data; $this->eccLength = $el; $this->ecc = $ecc; } }; //########################################################################## class QRrawcode { public $version; public $datacode = array(); public $ecccode = array(); public $blocks; public $rsblocks = array(); //of RSblock public $count; public $dataLength; public $eccLength; public $b1; //---------------------------------------------------------------------- public function __construct(QRinput $input) { $spec = array(0,0,0,0,0); $this->datacode = $input->getByteStream(); if(is_null($this->datacode)) { throw new Exception('null imput string'); } QRspec::getEccSpec($input->getVersion(), $input->getErrorCorrectionLevel(), $spec); $this->version = $input->getVersion(); $this->b1 = QRspec::rsBlockNum1($spec); $this->dataLength = QRspec::rsDataLength($spec); $this->eccLength = QRspec::rsEccLength($spec); $this->ecccode = array_fill(0, $this->eccLength, 0); $this->blocks = QRspec::rsBlockNum($spec); $ret = $this->init($spec); if($ret < 0) { throw new Exception('block alloc error'); return null; } $this->count = 0; } //---------------------------------------------------------------------- public function init(array $spec) { $dl = QRspec::rsDataCodes1($spec); $el = QRspec::rsEccCodes1($spec); $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); $blockNo = 0; $dataPos = 0; $eccPos = 0; for($i=0; $iecccode,$eccPos); $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); $dataPos += $dl; $eccPos += $el; $blockNo++; } if(QRspec::rsBlockNum2($spec) == 0) return 0; $dl = QRspec::rsDataCodes2($spec); $el = QRspec::rsEccCodes2($spec); $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); if($rs == NULL) return -1; for($i=0; $iecccode,$eccPos); $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); $dataPos += $dl; $eccPos += $el; $blockNo++; } return 0; } //---------------------------------------------------------------------- public function getCode() { $ret; if($this->count < $this->dataLength) { $row = $this->count % $this->blocks; $col = $this->count / $this->blocks; if($col >= $this->rsblocks[0]->dataLength) { $row += $this->b1; } $ret = $this->rsblocks[$row]->data[$col]; } else if($this->count < $this->dataLength + $this->eccLength) { $row = ($this->count - $this->dataLength) % $this->blocks; $col = ($this->count - $this->dataLength) / $this->blocks; $ret = $this->rsblocks[$row]->ecc[$col]; } else { return 0; } $this->count++; return $ret; } } //########################################################################## class QRcode { public $version; public $width; public $data; //---------------------------------------------------------------------- public function encodeMask(QRinput $input, $mask) { if($input->getVersion() < 0 || $input->getVersion() > QRSPEC_VERSION_MAX) { throw new Exception('wrong version'); } if($input->getErrorCorrectionLevel() > QR_ECLEVEL_H) { throw new Exception('wrong level'); } $raw = new QRrawcode($input); QRtools::markTime('after_raw'); $version = $raw->version; $width = QRspec::getWidth($version); $frame = QRspec::newFrame($version); $filler = new FrameFiller($width, $frame); if(is_null($filler)) { return NULL; } // inteleaved data and ecc codes for($i=0; $i<$raw->dataLength + $raw->eccLength; $i++) { $code = $raw->getCode(); $bit = 0x80; for($j=0; $j<8; $j++) { $addr = $filler->next(); $filler->setFrameAt($addr, 0x02 | (($bit & $code) != 0)); $bit = $bit >> 1; } } QRtools::markTime('after_filler'); unset($raw); // remainder bits $j = QRspec::getRemainder($version); for($i=0; $i<$j; $i++) { $addr = $filler->next(); $filler->setFrameAt($addr, 0x02); } $frame = $filler->frame; unset($filler); // masking $maskObj = new QRmask(); if($mask < 0) { if (QR_FIND_BEST_MASK) { $masked = $maskObj->mask($width, $frame, $input->getErrorCorrectionLevel()); } else { $masked = $maskObj->makeMask($width, $frame, (intval(QR_DEFAULT_MASK) % 8), $input->getErrorCorrectionLevel()); } } else { $masked = $maskObj->makeMask($width, $frame, $mask, $input->getErrorCorrectionLevel()); } if($masked == NULL) { return NULL; } QRtools::markTime('after_mask'); $this->version = $version; $this->width = $width; $this->data = $masked; return $this; } //---------------------------------------------------------------------- public function encodeInput(QRinput $input) { return $this->encodeMask($input, -1); } //---------------------------------------------------------------------- public function encodeString8bit($string, $version, $level) { if(string == NULL) { throw new Exception('empty string!'); return NULL; } $input = new QRinput($version, $level); if($input == NULL) return NULL; $ret = $input->append($input, QR_MODE_8, strlen($string), str_split($string)); if($ret < 0) { unset($input); return NULL; } return $this->encodeInput($input); } //---------------------------------------------------------------------- public function encodeString($string, $version, $level, $hint, $casesensitive) { if($hint != QR_MODE_8 && $hint != QR_MODE_KANJI) { throw new Exception('bad hint'); return NULL; } $input = new QRinput($version, $level); if($input == NULL) return NULL; $ret = QRsplit::splitStringToQRinput($string, $input, $hint, $casesensitive); if($ret < 0) { return NULL; } return $this->encodeInput($input); } //---------------------------------------------------------------------- public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false) { $enc = QRencode::factory($level, $size, $margin); return $enc->encodePNG($text, $outfile, $saveandprint=false); } //---------------------------------------------------------------------- public static function text($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) { $enc = QRencode::factory($level, $size, $margin); return $enc->encode($text, $outfile); } //---------------------------------------------------------------------- public static function raw($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) { $enc = QRencode::factory($level, $size, $margin); return $enc->encodeRAW($text, $outfile); } } //########################################################################## class FrameFiller { public $width; public $frame; public $x; public $y; public $dir; public $bit; //---------------------------------------------------------------------- public function __construct($width, &$frame) { $this->width = $width; $this->frame = $frame; $this->x = $width - 1; $this->y = $width - 1; $this->dir = -1; $this->bit = -1; } //---------------------------------------------------------------------- public function setFrameAt($at, $val) { $this->frame[$at['y']][$at['x']] = chr($val); } //---------------------------------------------------------------------- public function getFrameAt($at) { return ord($this->frame[$at['y']][$at['x']]); } //---------------------------------------------------------------------- public function next() { do { if($this->bit == -1) { $this->bit = 0; return array('x'=>$this->x, 'y'=>$this->y); } $x = $this->x; $y = $this->y; $w = $this->width; if($this->bit == 0) { $x--; $this->bit++; } else { $x++; $y += $this->dir; $this->bit--; } if($this->dir < 0) { if($y < 0) { $y = 0; $x -= 2; $this->dir = 1; if($x == 6) { $x--; $y = 9; } } } else { if($y == $w) { $y = $w - 1; $x -= 2; $this->dir = -1; if($x == 6) { $x--; $y -= 8; } } } if($x < 0 || $y < 0) return null; $this->x = $x; $this->y = $y; } while(ord($this->frame[$y][$x]) & 0x80); return array('x'=>$x, 'y'=>$y); } } ; //########################################################################## class QRencode { public $casesensitive = true; public $eightbit = false; public $version = 0; public $size = 3; public $margin = 4; public $structured = 0; // not supported yet public $level = QR_ECLEVEL_L; public $hint = QR_MODE_8; //---------------------------------------------------------------------- public static function factory($level = QR_ECLEVEL_L, $size = 3, $margin = 4) { $enc = new QRencode(); $enc->size = $size; $enc->margin = $margin; switch ($level.'') { case '0': case '1': case '2': case '3': $enc->level = $level; break; case 'l': case 'L': $enc->level = QR_ECLEVEL_L; break; case 'm': case 'M': $enc->level = QR_ECLEVEL_M; break; case 'q': case 'Q': $enc->level = QR_ECLEVEL_Q; break; case 'h': case 'H': $enc->level = QR_ECLEVEL_H; break; } return $enc; } //---------------------------------------------------------------------- public function encodeRAW($intext, $outfile = false) { $code = new QRcode(); if($this->eightbit) { $code->encodeString8bit($intext, $this->version, $this->level); } else { $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); } return $code->data; } //---------------------------------------------------------------------- public function encode($intext, $outfile = false) { $code = new QRcode(); if($this->eightbit) { $code->encodeString8bit($intext, $this->version, $this->level); } else { $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); } QRtools::markTime('after_encode'); if ($outfile!== false) { file_put_contents($outfile, join("\n", QRtools::binarize($code->data))); } else { return QRtools::binarize($code->data); } } //---------------------------------------------------------------------- public function encodePNG($intext, $outfile = false,$saveandprint=false) { try { ob_start(); $tab = $this->encode($intext); $err = ob_get_contents(); ob_end_clean(); if ($err != '') QRtools::log($outfile, $err); $maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab)+2*$this->margin)); QRimage::png($tab, $outfile, min(max(1, $this->size), $maxSize), $this->margin,$saveandprint); } catch (Exception $e) { QRtools::log($outfile, $e->getMessage()); } } } phpqrcode/qrimage.php0000644000175000017500000000705111432665120014230 0ustar thijsthijs * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ define('QR_IMAGE', true); class QRimage { //---------------------------------------------------------------------- public static function png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE) { $image = self::image($frame, $pixelPerPoint, $outerFrame); if ($filename === false) { Header("Content-type: image/png"); ImagePng($image); } else { if($saveandprint===TRUE){ ImagePng($image, $filename); header("Content-type: image/png"); ImagePng($image); }else{ ImagePng($image, $filename); } } ImageDestroy($image); } //---------------------------------------------------------------------- public static function jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85) { $image = self::image($frame, $pixelPerPoint, $outerFrame); if ($filename === false) { Header("Content-type: image/jpeg"); ImageJpeg($image, null, $q); } else { ImageJpeg($image, $filename, $q); } ImageDestroy($image); } //---------------------------------------------------------------------- private static function image($frame, $pixelPerPoint = 4, $outerFrame = 4) { $h = count($frame); $w = strlen($frame[0]); $imgW = $w + 2*$outerFrame; $imgH = $h + 2*$outerFrame; $base_image =ImageCreate($imgW, $imgH); $col[0] = ImageColorAllocate($base_image,255,255,255); $col[1] = ImageColorAllocate($base_image,0,0,0); imagefill($base_image, 0, 0, $col[0]); for($y=0; $y<$h; $y++) { for($x=0; $x<$w; $x++) { if ($frame[$y][$x] == '1') { ImageSetPixel($base_image,$x+$outerFrame,$y+$outerFrame,$col[1]); } } } $target_image =ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint); ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH); ImageDestroy($base_image); return $target_image; } }phpqrcode/qrinput.php0000644000175000017500000006034311453414600014306 0ustar thijsthijs * * PHP QR Code is distributed under LGPL 3 * Copyright (C) 2010 Dominik Dzienia * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ define('STRUCTURE_HEADER_BITS', 20); define('MAX_STRUCTURED_SYMBOLS', 16); class QRinputItem { public $mode; public $size; public $data; public $bstream; public function __construct($mode, $size, $data, $bstream = null) { $setData = array_slice($data, 0, $size); if (count($setData) < $size) { $setData = array_merge($setData, array_fill(0,$size-count($setData),0)); } if(!QRinput::check($mode, $size, $setData)) { throw new Exception('Error m:'.$mode.',s:'.$size.',d:'.join(',',$setData)); return null; } $this->mode = $mode; $this->size = $size; $this->data = $setData; $this->bstream = $bstream; } //---------------------------------------------------------------------- public function encodeModeNum($version) { try { $words = (int)($this->size / 3); $bs = new QRbitstream(); $val = 0x1; $bs->appendNum(4, $val); $bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM, $version), $this->size); for($i=0; $i<$words; $i++) { $val = (ord($this->data[$i*3 ]) - ord('0')) * 100; $val += (ord($this->data[$i*3+1]) - ord('0')) * 10; $val += (ord($this->data[$i*3+2]) - ord('0')); $bs->appendNum(10, $val); } if($this->size - $words * 3 == 1) { $val = ord($this->data[$words*3]) - ord('0'); $bs->appendNum(4, $val); } else if($this->size - $words * 3 == 2) { $val = (ord($this->data[$words*3 ]) - ord('0')) * 10; $val += (ord($this->data[$words*3+1]) - ord('0')); $bs->appendNum(7, $val); } $this->bstream = $bs; return 0; } catch (Exception $e) { return -1; } } //---------------------------------------------------------------------- public function encodeModeAn($version) { try { $words = (int)($this->size / 2); $bs = new QRbitstream(); $bs->appendNum(4, 0x02); $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN, $version), $this->size); for($i=0; $i<$words; $i++) { $val = (int)QRinput::lookAnTable(ord($this->data[$i*2 ])) * 45; $val += (int)QRinput::lookAnTable(ord($this->data[$i*2+1])); $bs->appendNum(11, $val); } if($this->size & 1) { $val = QRinput::lookAnTable(ord($this->data[$words * 2])); $bs->appendNum(6, $val); } $this->bstream = $bs; return 0; } catch (Exception $e) { return -1; } } //---------------------------------------------------------------------- public function encodeMode8($version) { try { $bs = new QRbitstream(); $bs->appendNum(4, 0x4); $bs->appendNum(QRspec::lengthIndicator(QR_MODE_8, $version), $this->size); for($i=0; $i<$this->size; $i++) { $bs->appendNum(8, ord($this->data[$i])); } $this->bstream = $bs; return 0; } catch (Exception $e) { return -1; } } //---------------------------------------------------------------------- public function encodeModeKanji($version) { try { $bs = new QRbitrtream(); $bs->appendNum(4, 0x8); $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI, $version), (int)($this->size / 2)); for($i=0; $i<$this->size; $i+=2) { $val = (ord($this->data[$i]) << 8) | ord($this->data[$i+1]); if($val <= 0x9ffc) { $val -= 0x8140; } else { $val -= 0xc140; } $h = ($val >> 8) * 0xc0; $val = ($val & 0xff) + $h; $bs->appendNum(13, $val); } $this->bstream = $bs; return 0; } catch (Exception $e) { return -1; } } //---------------------------------------------------------------------- public function encodeModeStructure() { try { $bs = new QRbitstream(); $bs->appendNum(4, 0x03); $bs->appendNum(4, ord($this->data[1]) - 1); $bs->appendNum(4, ord($this->data[0]) - 1); $bs->appendNum(8, ord($this->data[2])); $this->bstream = $bs; return 0; } catch (Exception $e) { return -1; } } //---------------------------------------------------------------------- public function estimateBitStreamSizeOfEntry($version) { $bits = 0; if($version == 0) $version = 1; switch($this->mode) { case QR_MODE_NUM: $bits = QRinput::estimateBitsModeNum($this->size); break; case QR_MODE_AN: $bits = QRinput::estimateBitsModeAn($this->size); break; case QR_MODE_8: $bits = QRinput::estimateBitsMode8($this->size); break; case QR_MODE_KANJI: $bits = QRinput::estimateBitsModeKanji($this->size);break; case QR_MODE_STRUCTURE: return STRUCTURE_HEADER_BITS; default: return 0; } $l = QRspec::lengthIndicator($this->mode, $version); $m = 1 << $l; $num = (int)(($this->size + $m - 1) / $m); $bits += $num * (4 + $l); return $bits; } //---------------------------------------------------------------------- public function encodeBitStream($version) { try { unset($this->bstream); $words = QRspec::maximumWords($this->mode, $version); if($this->size > $words) { $st1 = new QRinputItem($this->mode, $words, $this->data); $st2 = new QRinputItem($this->mode, $this->size - $words, array_slice($this->data, $words)); $st1->encodeBitStream($version); $st2->encodeBitStream($version); $this->bstream = new QRbitstream(); $this->bstream->append($st1->bstream); $this->bstream->append($st2->bstream); unset($st1); unset($st2); } else { $ret = 0; switch($this->mode) { case QR_MODE_NUM: $ret = $this->encodeModeNum($version); break; case QR_MODE_AN: $ret = $this->encodeModeAn($version); break; case QR_MODE_8: $ret = $this->encodeMode8($version); break; case QR_MODE_KANJI: $ret = $this->encodeModeKanji($version);break; case QR_MODE_STRUCTURE: $ret = $this->encodeModeStructure(); break; default: break; } if($ret < 0) return -1; } return $this->bstream->size(); } catch (Exception $e) { return -1; } } }; //########################################################################## class QRinput { public $items; private $version; private $level; //---------------------------------------------------------------------- public function __construct($version = 0, $level = QR_ECLEVEL_L) { if ($version < 0 || $version > QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) { throw new Exception('Invalid version no'); return NULL; } $this->version = $version; $this->level = $level; } //---------------------------------------------------------------------- public function getVersion() { return $this->version; } //---------------------------------------------------------------------- public function setVersion($version) { if($version < 0 || $version > QRSPEC_VERSION_MAX) { throw new Exception('Invalid version no'); return -1; } $this->version = $version; return 0; } //---------------------------------------------------------------------- public function getErrorCorrectionLevel() { return $this->level; } //---------------------------------------------------------------------- public function setErrorCorrectionLevel($level) { if($level > QR_ECLEVEL_H) { throw new Exception('Invalid ECLEVEL'); return -1; } $this->level = $level; return 0; } //---------------------------------------------------------------------- public function appendEntry(QRinputItem $entry) { $this->items[] = $entry; } //---------------------------------------------------------------------- public function append($mode, $size, $data) { try { $entry = new QRinputItem($mode, $size, $data); $this->items[] = $entry; return 0; } catch (Exception $e) { return -1; } } //---------------------------------------------------------------------- public function insertStructuredAppendHeader($size, $index, $parity) { if( $size > MAX_STRUCTURED_SYMBOLS ) { throw new Exception('insertStructuredAppendHeader wrong size'); } if( $index <= 0 || $index > MAX_STRUCTURED_SYMBOLS ) { throw new Exception('insertStructuredAppendHeader wrong index'); } $buf = array($size, $index, $parity); try { $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf); array_unshift($this->items, $entry); return 0; } catch (Exception $e) { return -1; } } //---------------------------------------------------------------------- public function calcParity() { $parity = 0; foreach($this->items as $item) { if($item->mode != QR_MODE_STRUCTURE) { for($i=$item->size-1; $i>=0; $i--) { $parity ^= $item->data[$i]; } } } return $parity; } //---------------------------------------------------------------------- public static function checkModeNum($size, $data) { for($i=0; $i<$size; $i++) { if((ord($data[$i]) < ord('0')) || (ord($data[$i]) > ord('9'))){ return false; } } return true; } //---------------------------------------------------------------------- public static function estimateBitsModeNum($size) { $w = (int)$size / 3; $bits = $w * 10; switch($size - $w * 3) { case 1: $bits += 4; break; case 2: $bits += 7; break; default: break; } return $bits; } //---------------------------------------------------------------------- public static $anTable = array( -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ); //---------------------------------------------------------------------- public static function lookAnTable($c) { return (($c > 127)?-1:self::$anTable[$c]); } //---------------------------------------------------------------------- public static function checkModeAn($size, $data) { for($i=0; $i<$size; $i++) { if (self::lookAnTable(ord($data[$i])) == -1) { return false; } } return true; } //---------------------------------------------------------------------- public static function estimateBitsModeAn($size) { $w = (int)($size / 2); $bits = $w * 11; if($size & 1) { $bits += 6; } return $bits; } //---------------------------------------------------------------------- public static function estimateBitsMode8($size) { return $size * 8; } //---------------------------------------------------------------------- public function estimateBitsModeKanji($size) { return (int)(($size / 2) * 13); } //---------------------------------------------------------------------- public static function checkModeKanji($size, $data) { if($size & 1) return false; for($i=0; $i<$size; $i+=2) { $val = (ord($data[$i]) << 8) | ord($data[$i+1]); if( $val < 0x8140 || ($val > 0x9ffc && $val < 0xe040) || $val > 0xebbf) { return false; } } return true; } /*********************************************************************** * Validation **********************************************************************/ public static function check($mode, $size, $data) { if($size <= 0) return false; switch($mode) { case QR_MODE_NUM: return self::checkModeNum($size, $data); break; case QR_MODE_AN: return self::checkModeAn($size, $data); break; case QR_MODE_KANJI: return self::checkModeKanji($size, $data); break; case QR_MODE_8: return true; break; case QR_MODE_STRUCTURE: return true; break; default: break; } return false; } //---------------------------------------------------------------------- public function estimateBitStreamSize($version) { $bits = 0; foreach($this->items as $item) { $bits += $item->estimateBitStreamSizeOfEntry($version); } return $bits; } //---------------------------------------------------------------------- public function estimateVersion() { $version = 0; $prev = 0; do { $prev = $version; $bits = $this->estimateBitStreamSize($prev); $version = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); if ($version < 0) { return -1; } } while ($version > $prev); return $version; } //---------------------------------------------------------------------- public static function lengthOfCode($mode, $version, $bits) { $payload = $bits - 4 - QRspec::lengthIndicator($mode, $version); switch($mode) { case QR_MODE_NUM: $chunks = (int)($payload / 10); $remain = $payload - $chunks * 10; $size = $chunks * 3; if($remain >= 7) { $size += 2; } else if($remain >= 4) { $size += 1; } break; case QR_MODE_AN: $chunks = (int)($payload / 11); $remain = $payload - $chunks * 11; $size = $chunks * 2; if($remain >= 6) $size++; break; case QR_MODE_8: $size = (int)($payload / 8); break; case QR_MODE_KANJI: $size = (int)(($payload / 13) * 2); break; case QR_MODE_STRUCTURE: $size = (int)($payload / 8); break; default: $size = 0; break; } $maxsize = QRspec::maximumWords($mode, $version); if($size < 0) $size = 0; if($size > $maxsize) $size = $maxsize; return $size; } //---------------------------------------------------------------------- public function createBitStream() { $total = 0; foreach($this->items as $item) { $bits = $item->encodeBitStream($this->version); if($bits < 0) return -1; $total += $bits; } return $total; } //---------------------------------------------------------------------- public function convertData() { $ver = $this->estimateVersion(); if($ver > $this->getVersion()) { $this->setVersion($ver); } for(;;) { $bits = $this->createBitStream(); if($bits < 0) return -1; $ver = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); if($ver < 0) { throw new Exception('WRONG VERSION'); return -1; } else if($ver > $this->getVersion()) { $this->setVersion($ver); } else { break; } } return 0; } //---------------------------------------------------------------------- public function appendPaddingBit(&$bstream) { $bits = $bstream->size(); $maxwords = QRspec::getDataLength($this->version, $this->level); $maxbits = $maxwords * 8; if ($maxbits == $bits) { return 0; } if ($maxbits - $bits < 5) { return $bstream->appendNum($maxbits - $bits, 0); } $bits += 4; $words = (int)(($bits + 7) / 8); $padding = new QRbitstream(); $ret = $padding->appendNum($words * 8 - $bits + 4, 0); if($ret < 0) return $ret; $padlen = $maxwords - $words; if($padlen > 0) { $padbuf = array(); for($i=0; $i<$padlen; $i++) { $padbuf[$i] = ($i&1)?0x11:0xec; } $ret = $padding->appendBytes($padlen, $padbuf); if($ret < 0) return $ret; } $ret = $bstream->append($padding); return $ret; } //---------------------------------------------------------------------- public function mergeBitStream() { if($this->convertData() < 0) { return null; } $bstream = new QRbitstream(); foreach($this->items as $item) { $ret = $bstream->append($item->bstream); if($ret < 0) { return null; } } return $bstream; } //---------------------------------------------------------------------- public function getBitStream() { $bstream = $this->mergeBitStream(); if($bstream == null) { return null; } $ret = $this->appendPaddingBit($bstream); if($ret < 0) { return null; } return $bstream; } //---------------------------------------------------------------------- public function getByteStream() { $bstream = $this->getBitStream(); if($bstream == null) { return null; } return $bstream->toByte(); } } phpqrcode/qrlib.php0000644000175000017500000000310211432665120013705 0ustar thijsthijs * * PHP QR Code is distributed under LGPL 3 * Copyright (C) 2010 Dominik Dzienia * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ $QR_BASEDIR = dirname(__FILE__).DIRECTORY_SEPARATOR; // Required libs include $QR_BASEDIR."qrconst.php"; include $QR_BASEDIR."qrconfig.php"; include $QR_BASEDIR."qrtools.php"; include $QR_BASEDIR."qrspec.php"; include $QR_BASEDIR."qrimage.php"; include $QR_BASEDIR."qrinput.php"; include $QR_BASEDIR."qrbitstream.php"; include $QR_BASEDIR."qrsplit.php"; include $QR_BASEDIR."qrrscode.php"; include $QR_BASEDIR."qrmask.php"; include $QR_BASEDIR."qrencode.php"; phpqrcode/qrmask.php0000644000175000017500000003045011432665120014100 0ustar thijsthijs * * PHP QR Code is distributed under LGPL 3 * Copyright (C) 2010 Dominik Dzienia * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ define('N1', 3); define('N2', 3); define('N3', 40); define('N4', 10); class QRmask { public $runLength = array(); //---------------------------------------------------------------------- public function __construct() { $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0); } //---------------------------------------------------------------------- public function writeFormatInformation($width, &$frame, $mask, $level) { $blacks = 0; $format = QRspec::getFormatInfo($mask, $level); for($i=0; $i<8; $i++) { if($format & 1) { $blacks += 2; $v = 0x85; } else { $v = 0x84; } $frame[8][$width - 1 - $i] = chr($v); if($i < 6) { $frame[$i][8] = chr($v); } else { $frame[$i + 1][8] = chr($v); } $format = $format >> 1; } for($i=0; $i<7; $i++) { if($format & 1) { $blacks += 2; $v = 0x85; } else { $v = 0x84; } $frame[$width - 7 + $i][8] = chr($v); if($i == 0) { $frame[8][7] = chr($v); } else { $frame[8][6 - $i] = chr($v); } $format = $format >> 1; } return $blacks; } //---------------------------------------------------------------------- public function mask0($x, $y) { return ($x+$y)&1; } public function mask1($x, $y) { return ($y&1); } public function mask2($x, $y) { return ($x%3); } public function mask3($x, $y) { return ($x+$y)%3; } public function mask4($x, $y) { return (((int)($y/2))+((int)($x/3)))&1; } public function mask5($x, $y) { return (($x*$y)&1)+($x*$y)%3; } public function mask6($x, $y) { return ((($x*$y)&1)+($x*$y)%3)&1; } public function mask7($x, $y) { return ((($x*$y)%3)+(($x+$y)&1))&1; } //---------------------------------------------------------------------- private function generateMaskNo($maskNo, $width, $frame) { $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); for($y=0; $y<$width; $y++) { for($x=0; $x<$width; $x++) { if(ord($frame[$y][$x]) & 0x80) { $bitMask[$y][$x] = 0; } else { $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y); $bitMask[$y][$x] = ($maskFunc == 0)?1:0; } } } return $bitMask; } //---------------------------------------------------------------------- public static function serial($bitFrame) { $codeArr = array(); foreach ($bitFrame as $line) $codeArr[] = join('', $line); return gzcompress(join("\n", $codeArr), 9); } //---------------------------------------------------------------------- public static function unserial($code) { $codeArr = array(); $codeLines = explode("\n", gzuncompress($code)); foreach ($codeLines as $line) $codeArr[] = str_split($line); return $codeArr; } //---------------------------------------------------------------------- public function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly = false) { $b = 0; $bitMask = array(); $fileName = QR_CACHE_DIR.'mask_'.$maskNo.DIRECTORY_SEPARATOR.'mask_'.$width.'_'.$maskNo.'.dat'; if (QR_CACHEABLE) { if (file_exists($fileName)) { $bitMask = self::unserial(file_get_contents($fileName)); } else { $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); if (!file_exists(QR_CACHE_DIR.'mask_'.$maskNo)) mkdir(QR_CACHE_DIR.'mask_'.$maskNo); file_put_contents($fileName, self::serial($bitMask)); } } else { $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); } if ($maskGenOnly) return; $d = $s; for($y=0; $y<$width; $y++) { for($x=0; $x<$width; $x++) { if($bitMask[$y][$x] == 1) { $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]); } $b += (int)(ord($d[$y][$x]) & 1); } } return $b; } //---------------------------------------------------------------------- public function makeMask($width, $frame, $maskNo, $level) { $masked = array_fill(0, $width, str_repeat("\0", $width)); $this->makeMaskNo($maskNo, $width, $frame, $masked); $this->writeFormatInformation($width, $masked, $maskNo, $level); return $masked; } //---------------------------------------------------------------------- public function calcN1N3($length) { $demerit = 0; for($i=0; $i<$length; $i++) { if($this->runLength[$i] >= 5) { $demerit += (N1 + ($this->runLength[$i] - 5)); } if($i & 1) { if(($i >= 3) && ($i < ($length-2)) && ($this->runLength[$i] % 3 == 0)) { $fact = (int)($this->runLength[$i] / 3); if(($this->runLength[$i-2] == $fact) && ($this->runLength[$i-1] == $fact) && ($this->runLength[$i+1] == $fact) && ($this->runLength[$i+2] == $fact)) { if(($this->runLength[$i-3] < 0) || ($this->runLength[$i-3] >= (4 * $fact))) { $demerit += N3; } else if((($i+3) >= $length) || ($this->runLength[$i+3] >= (4 * $fact))) { $demerit += N3; } } } } } return $demerit; } //---------------------------------------------------------------------- public function evaluateSymbol($width, $frame) { $head = 0; $demerit = 0; for($y=0; $y<$width; $y++) { $head = 0; $this->runLength[0] = 1; $frameY = $frame[$y]; if ($y>0) $frameYM = $frame[$y-1]; for($x=0; $x<$width; $x++) { if(($x > 0) && ($y > 0)) { $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]); $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]); if(($b22 | ($w22 ^ 1))&1) { $demerit += N2; } } if(($x == 0) && (ord($frameY[$x]) & 1)) { $this->runLength[0] = -1; $head = 1; $this->runLength[$head] = 1; } else if($x > 0) { if((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) { $head++; $this->runLength[$head] = 1; } else { $this->runLength[$head]++; } } } $demerit += $this->calcN1N3($head+1); } for($x=0; $x<$width; $x++) { $head = 0; $this->runLength[0] = 1; for($y=0; $y<$width; $y++) { if($y == 0 && (ord($frame[$y][$x]) & 1)) { $this->runLength[0] = -1; $head = 1; $this->runLength[$head] = 1; } else if($y > 0) { if((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) { $head++; $this->runLength[$head] = 1; } else { $this->runLength[$head]++; } } } $demerit += $this->calcN1N3($head+1); } return $demerit; } //---------------------------------------------------------------------- public function mask($width, $frame, $level) { $minDemerit = PHP_INT_MAX; $bestMaskNum = 0; $bestMask = array(); $checked_masks = array(0,1,2,3,4,5,6,7); if (QR_FIND_FROM_RANDOM !== false) { $howManuOut = 8-(QR_FIND_FROM_RANDOM % 9); for ($i = 0; $i < $howManuOut; $i++) { $remPos = rand (0, count($checked_masks)-1); unset($checked_masks[$remPos]); $checked_masks = array_values($checked_masks); } } $bestMask = $frame; foreach($checked_masks as $i) { $mask = array_fill(0, $width, str_repeat("\0", $width)); $demerit = 0; $blacks = 0; $blacks = $this->makeMaskNo($i, $width, $frame, $mask); $blacks += $this->writeFormatInformation($width, $mask, $i, $level); $blacks = (int)(100 * $blacks / ($width * $width)); $demerit = (int)((int)(abs($blacks - 50) / 5) * N4); $demerit += $this->evaluateSymbol($width, $mask); if($demerit < $minDemerit) { $minDemerit = $demerit; $bestMask = $mask; $bestMaskNum = $i; } } return $bestMask; } //---------------------------------------------------------------------- } phpqrcode/qrrscode.php0000644000175000017500000002044511432665120014427 0ustar thijsthijs * * PHP QR Code is distributed under LGPL 3 * Copyright (C) 2010 Dominik Dzienia * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ class QRrsItem { public $mm; // Bits per symbol public $nn; // Symbols per block (= (1<= $this->nn) { $x -= $this->nn; $x = ($x >> $this->mm) + ($x & $this->nn); } return $x; } //---------------------------------------------------------------------- public static function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) { // Common code for intializing a Reed-Solomon control block (char or int symbols) // Copyright 2004 Phil Karn, KA9Q // May be used under the terms of the GNU Lesser General Public License (LGPL) $rs = null; // Check parameter ranges if($symsize < 0 || $symsize > 8) return $rs; if($fcr < 0 || $fcr >= (1<<$symsize)) return $rs; if($prim <= 0 || $prim >= (1<<$symsize)) return $rs; if($nroots < 0 || $nroots >= (1<<$symsize)) return $rs; // Can't have more roots than symbol values! if($pad < 0 || $pad >= ((1<<$symsize) -1 - $nroots)) return $rs; // Too much padding $rs = new QRrsItem(); $rs->mm = $symsize; $rs->nn = (1<<$symsize)-1; $rs->pad = $pad; $rs->alpha_to = array_fill(0, $rs->nn+1, 0); $rs->index_of = array_fill(0, $rs->nn+1, 0); // PHP style macro replacement ;) $NN =& $rs->nn; $A0 =& $NN; // Generate Galois field lookup tables $rs->index_of[0] = $A0; // log(zero) = -inf $rs->alpha_to[$A0] = 0; // alpha**-inf = 0 $sr = 1; for($i=0; $i<$rs->nn; $i++) { $rs->index_of[$sr] = $i; $rs->alpha_to[$i] = $sr; $sr <<= 1; if($sr & (1<<$symsize)) { $sr ^= $gfpoly; } $sr &= $rs->nn; } if($sr != 1){ // field generator polynomial is not primitive! $rs = NULL; return $rs; } /* Form RS code generator polynomial from its roots */ $rs->genpoly = array_fill(0, $nroots+1, 0); $rs->fcr = $fcr; $rs->prim = $prim; $rs->nroots = $nroots; $rs->gfpoly = $gfpoly; /* Find prim-th root of 1, used in decoding */ for($iprim=1;($iprim % $prim) != 0;$iprim += $rs->nn) ; // intentional empty-body loop! $rs->iprim = (int)($iprim / $prim); $rs->genpoly[0] = 1; for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) { $rs->genpoly[$i+1] = 1; // Multiply rs->genpoly[] by @**(root + x) for ($j = $i; $j > 0; $j--) { if ($rs->genpoly[$j] != 0) { $rs->genpoly[$j] = $rs->genpoly[$j-1] ^ $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[$j]] + $root)]; } else { $rs->genpoly[$j] = $rs->genpoly[$j-1]; } } // rs->genpoly[0] can never be zero $rs->genpoly[0] = $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[0]] + $root)]; } // convert rs->genpoly[] to index form for quicker encoding for ($i = 0; $i <= $nroots; $i++) $rs->genpoly[$i] = $rs->index_of[$rs->genpoly[$i]]; return $rs; } //---------------------------------------------------------------------- public function encode_rs_char($data, &$parity) { $MM =& $this->mm; $NN =& $this->nn; $ALPHA_TO =& $this->alpha_to; $INDEX_OF =& $this->index_of; $GENPOLY =& $this->genpoly; $NROOTS =& $this->nroots; $FCR =& $this->fcr; $PRIM =& $this->prim; $IPRIM =& $this->iprim; $PAD =& $this->pad; $A0 =& $NN; $parity = array_fill(0, $NROOTS, 0); for($i=0; $i< ($NN-$NROOTS-$PAD); $i++) { $feedback = $INDEX_OF[$data[$i] ^ $parity[0]]; if($feedback != $A0) { // feedback term is non-zero // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must // always be for the polynomials constructed by init_rs() $feedback = $this->modnn($NN - $GENPOLY[$NROOTS] + $feedback); for($j=1;$j<$NROOTS;$j++) { $parity[$j] ^= $ALPHA_TO[$this->modnn($feedback + $GENPOLY[$NROOTS-$j])]; } } // Shift array_shift($parity); if($feedback != $A0) { array_push($parity, $ALPHA_TO[$this->modnn($feedback + $GENPOLY[0])]); } else { array_push($parity, 0); } } } } //########################################################################## class QRrs { public static $items = array(); //---------------------------------------------------------------------- public static function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) { foreach(self::$items as $rs) { if($rs->pad != $pad) continue; if($rs->nroots != $nroots) continue; if($rs->mm != $symsize) continue; if($rs->gfpoly != $gfpoly) continue; if($rs->fcr != $fcr) continue; if($rs->prim != $prim) continue; return $rs; } $rs = QRrsItem::init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad); array_unshift(self::$items, $rs); return $rs; } }phpqrcode/qrspec.php0000644000175000017500000006376411432665622014124 0ustar thijsthijs * * PHP QR Code is distributed under LGPL 3 * Copyright (C) 2010 Dominik Dzienia * * The following data / specifications are taken from * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) * or * "Automatic identification and data capture techniques -- * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ define('QRSPEC_VERSION_MAX', 40); define('QRSPEC_WIDTH_MAX', 177); define('QRCAP_WIDTH', 0); define('QRCAP_WORDS', 1); define('QRCAP_REMINDER', 2); define('QRCAP_EC', 3); class QRspec { public static $capacity = array( array( 0, 0, 0, array( 0, 0, 0, 0)), array( 21, 26, 0, array( 7, 10, 13, 17)), // 1 array( 25, 44, 7, array( 10, 16, 22, 28)), array( 29, 70, 7, array( 15, 26, 36, 44)), array( 33, 100, 7, array( 20, 36, 52, 64)), array( 37, 134, 7, array( 26, 48, 72, 88)), // 5 array( 41, 172, 7, array( 36, 64, 96, 112)), array( 45, 196, 0, array( 40, 72, 108, 130)), array( 49, 242, 0, array( 48, 88, 132, 156)), array( 53, 292, 0, array( 60, 110, 160, 192)), array( 57, 346, 0, array( 72, 130, 192, 224)), //10 array( 61, 404, 0, array( 80, 150, 224, 264)), array( 65, 466, 0, array( 96, 176, 260, 308)), array( 69, 532, 0, array( 104, 198, 288, 352)), array( 73, 581, 3, array( 120, 216, 320, 384)), array( 77, 655, 3, array( 132, 240, 360, 432)), //15 array( 81, 733, 3, array( 144, 280, 408, 480)), array( 85, 815, 3, array( 168, 308, 448, 532)), array( 89, 901, 3, array( 180, 338, 504, 588)), array( 93, 991, 3, array( 196, 364, 546, 650)), array( 97, 1085, 3, array( 224, 416, 600, 700)), //20 array(101, 1156, 4, array( 224, 442, 644, 750)), array(105, 1258, 4, array( 252, 476, 690, 816)), array(109, 1364, 4, array( 270, 504, 750, 900)), array(113, 1474, 4, array( 300, 560, 810, 960)), array(117, 1588, 4, array( 312, 588, 870, 1050)), //25 array(121, 1706, 4, array( 336, 644, 952, 1110)), array(125, 1828, 4, array( 360, 700, 1020, 1200)), array(129, 1921, 3, array( 390, 728, 1050, 1260)), array(133, 2051, 3, array( 420, 784, 1140, 1350)), array(137, 2185, 3, array( 450, 812, 1200, 1440)), //30 array(141, 2323, 3, array( 480, 868, 1290, 1530)), array(145, 2465, 3, array( 510, 924, 1350, 1620)), array(149, 2611, 3, array( 540, 980, 1440, 1710)), array(153, 2761, 3, array( 570, 1036, 1530, 1800)), array(157, 2876, 0, array( 570, 1064, 1590, 1890)), //35 array(161, 3034, 0, array( 600, 1120, 1680, 1980)), array(165, 3196, 0, array( 630, 1204, 1770, 2100)), array(169, 3362, 0, array( 660, 1260, 1860, 2220)), array(173, 3532, 0, array( 720, 1316, 1950, 2310)), array(177, 3706, 0, array( 750, 1372, 2040, 2430)) //40 ); //---------------------------------------------------------------------- public static function getDataLength($version, $level) { return self::$capacity[$version][QRCAP_WORDS] - self::$capacity[$version][QRCAP_EC][$level]; } //---------------------------------------------------------------------- public static function getECCLength($version, $level) { return self::$capacity[$version][QRCAP_EC][$level]; } //---------------------------------------------------------------------- public static function getWidth($version) { return self::$capacity[$version][QRCAP_WIDTH]; } //---------------------------------------------------------------------- public static function getRemainder($version) { return self::$capacity[$version][QRCAP_REMINDER]; } //---------------------------------------------------------------------- public static function getMinimumVersion($size, $level) { for($i=1; $i<= QRSPEC_VERSION_MAX; $i++) { $words = self::$capacity[$i][QRCAP_WORDS] - self::$capacity[$i][QRCAP_EC][$level]; if($words >= $size) return $i; } return -1; } //###################################################################### public static $lengthTableBits = array( array(10, 12, 14), array( 9, 11, 13), array( 8, 16, 16), array( 8, 10, 12) ); //---------------------------------------------------------------------- public static function lengthIndicator($mode, $version) { if ($mode == QR_MODE_STRUCTURE) return 0; if ($version <= 9) { $l = 0; } else if ($version <= 26) { $l = 1; } else { $l = 2; } return self::$lengthTableBits[$mode][$l]; } //---------------------------------------------------------------------- public static function maximumWords($mode, $version) { if($mode == QR_MODE_STRUCTURE) return 3; if($version <= 9) { $l = 0; } else if($version <= 26) { $l = 1; } else { $l = 2; } $bits = self::$lengthTableBits[$mode][$l]; $words = (1 << $bits) - 1; if($mode == QR_MODE_KANJI) { $words *= 2; // the number of bytes is required } return $words; } // Error correction code ----------------------------------------------- // Table of the error correction code (Reed-Solomon block) // See Table 12-16 (pp.30-36), JIS X0510:2004. public static $eccTable = array( array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)), array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1 array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)), array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)), array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5 array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)), array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)), array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)), array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)), array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), //10 array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)), array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)), array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)), array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)), array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), //15 array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)), array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)), array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)), array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)), array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), //20 array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)), array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)), array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)), array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)), array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), //25 array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)), array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)), array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)), array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)), array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), //30 array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)), array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)), array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)), array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)), array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), //35 array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)), array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)), array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)), array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)), array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)),//40 ); //---------------------------------------------------------------------- // CACHEABLE!!! public static function getEccSpec($version, $level, array &$spec) { if (count($spec) < 5) { $spec = array(0,0,0,0,0); } $b1 = self::$eccTable[$version][$level][0]; $b2 = self::$eccTable[$version][$level][1]; $data = self::getDataLength($version, $level); $ecc = self::getECCLength($version, $level); if($b2 == 0) { $spec[0] = $b1; $spec[1] = (int)($data / $b1); $spec[2] = (int)($ecc / $b1); $spec[3] = 0; $spec[4] = 0; } else { $spec[0] = $b1; $spec[1] = (int)($data / ($b1 + $b2)); $spec[2] = (int)($ecc / ($b1 + $b2)); $spec[3] = $b2; $spec[4] = $spec[1] + 1; } } // Alignment pattern --------------------------------------------------- // Positions of alignment patterns. // This array includes only the second and the third position of the // alignment patterns. Rest of them can be calculated from the distance // between them. // See Table 1 in Appendix E (pp.71) of JIS X0510:2004. public static $alignmentPattern = array( array( 0, 0), array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5 array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10 array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), //11-15 array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), //16-20 array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), //21-25 array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), //26-30 array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), //31-35 array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58), //35-40 ); /** -------------------------------------------------------------------- * Put an alignment marker. * @param frame * @param width * @param ox,oy center coordinate of the pattern */ public static function putAlignmentMarker(array &$frame, $ox, $oy) { $finder = array( "\xa1\xa1\xa1\xa1\xa1", "\xa1\xa0\xa0\xa0\xa1", "\xa1\xa0\xa1\xa0\xa1", "\xa1\xa0\xa0\xa0\xa1", "\xa1\xa1\xa1\xa1\xa1" ); $yStart = $oy-2; $xStart = $ox-2; for($y=0; $y<5; $y++) { QRstr::set($frame, $xStart, $yStart+$y, $finder[$y]); } } //---------------------------------------------------------------------- public static function putAlignmentPattern($version, &$frame, $width) { if($version < 2) return; $d = self::$alignmentPattern[$version][1] - self::$alignmentPattern[$version][0]; if($d < 0) { $w = 2; } else { $w = (int)(($width - self::$alignmentPattern[$version][0]) / $d + 2); } if($w * $w - 3 == 1) { $x = self::$alignmentPattern[$version][0]; $y = self::$alignmentPattern[$version][0]; self::putAlignmentMarker($frame, $x, $y); return; } $cx = self::$alignmentPattern[$version][0]; for($x=1; $x<$w - 1; $x++) { self::putAlignmentMarker($frame, 6, $cx); self::putAlignmentMarker($frame, $cx, 6); $cx += $d; } $cy = self::$alignmentPattern[$version][0]; for($y=0; $y<$w-1; $y++) { $cx = self::$alignmentPattern[$version][0]; for($x=0; $x<$w-1; $x++) { self::putAlignmentMarker($frame, $cx, $cy); $cx += $d; } $cy += $d; } } // Version information pattern ----------------------------------------- // Version information pattern (BCH coded). // See Table 1 in Appendix D (pp.68) of JIS X0510:2004. // size: [QRSPEC_VERSION_MAX - 6] public static $versionPattern = array( 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64, 0x27541, 0x28c69 ); //---------------------------------------------------------------------- public static function getVersionPattern($version) { if($version < 7 || $version > QRSPEC_VERSION_MAX) return 0; return self::$versionPattern[$version -7]; } // Format information -------------------------------------------------- // See calcFormatInfo in tests/test_qrspec.c (orginal qrencode c lib) public static $formatInfo = array( array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976), array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0), array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed), array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b) ); public static function getFormatInfo($mask, $level) { if($mask < 0 || $mask > 7) return 0; if($level < 0 || $level > 3) return 0; return self::$formatInfo[$level][$mask]; } // Frame --------------------------------------------------------------- // Cache of initial frames. public static $frames = array(); /** -------------------------------------------------------------------- * Put a finder pattern. * @param frame * @param width * @param ox,oy upper-left coordinate of the pattern */ public static function putFinderPattern(&$frame, $ox, $oy) { $finder = array( "\xc1\xc1\xc1\xc1\xc1\xc1\xc1", "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", "\xc1\xc1\xc1\xc1\xc1\xc1\xc1" ); for($y=0; $y<7; $y++) { QRstr::set($frame, $ox, $oy+$y, $finder[$y]); } } //---------------------------------------------------------------------- public static function createFrame($version) { $width = self::$capacity[$version][QRCAP_WIDTH]; $frameLine = str_repeat ("\0", $width); $frame = array_fill(0, $width, $frameLine); // Finder pattern self::putFinderPattern($frame, 0, 0); self::putFinderPattern($frame, $width - 7, 0); self::putFinderPattern($frame, 0, $width - 7); // Separator $yOffset = $width - 7; for($y=0; $y<7; $y++) { $frame[$y][7] = "\xc0"; $frame[$y][$width - 8] = "\xc0"; $frame[$yOffset][7] = "\xc0"; $yOffset++; } $setPattern = str_repeat("\xc0", 8); QRstr::set($frame, 0, 7, $setPattern); QRstr::set($frame, $width-8, 7, $setPattern); QRstr::set($frame, 0, $width - 8, $setPattern); // Format info $setPattern = str_repeat("\x84", 9); QRstr::set($frame, 0, 8, $setPattern); QRstr::set($frame, $width - 8, 8, $setPattern, 8); $yOffset = $width - 8; for($y=0; $y<8; $y++,$yOffset++) { $frame[$y][8] = "\x84"; $frame[$yOffset][8] = "\x84"; } // Timing pattern for($i=1; $i<$width-15; $i++) { $frame[6][7+$i] = chr(0x90 | ($i & 1)); $frame[7+$i][6] = chr(0x90 | ($i & 1)); } // Alignment pattern self::putAlignmentPattern($version, $frame, $width); // Version information if($version >= 7) { $vinf = self::getVersionPattern($version); $v = $vinf; for($x=0; $x<6; $x++) { for($y=0; $y<3; $y++) { $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1)); $v = $v >> 1; } } $v = $vinf; for($y=0; $y<6; $y++) { for($x=0; $x<3; $x++) { $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1)); $v = $v >> 1; } } } // and a little bit... $frame[$width - 8][8] = "\x81"; return $frame; } //---------------------------------------------------------------------- public static function debug($frame, $binary_mode = false) { if ($binary_mode) { foreach ($frame as &$frameLine) { $frameLine = join('  ', explode('0', $frameLine)); $frameLine = join('██', explode('1', $frameLine)); } ?>


        '; echo join("
        ", $frame); echo '






'; } else { foreach ($frame as &$frameLine) { $frameLine = join(' ', explode("\xc0", $frameLine)); $frameLine = join('', explode("\xc1", $frameLine)); $frameLine = join(' ', explode("\xa0", $frameLine)); $frameLine = join('', explode("\xa1", $frameLine)); $frameLine = join('', explode("\x84", $frameLine)); //format 0 $frameLine = join('', explode("\x85", $frameLine)); //format 1 $frameLine = join('', explode("\x81", $frameLine)); //special bit $frameLine = join(' ', explode("\x90", $frameLine)); //clock 0 $frameLine = join('', explode("\x91", $frameLine)); //clock 1 $frameLine = join(' ', explode("\x88", $frameLine)); //version $frameLine = join('', explode("\x89", $frameLine)); //version $frameLine = join('♦', explode("\x01", $frameLine)); $frameLine = join('⋅', explode("\0", $frameLine)); } ?> "; echo join("
", $frame); echo "
"; } } //---------------------------------------------------------------------- public static function serial($frame) { return gzcompress(join("\n", $frame), 9); } //---------------------------------------------------------------------- public static function unserial($code) { return explode("\n", gzuncompress($code)); } //---------------------------------------------------------------------- public static function newFrame($version) { if($version < 1 || $version > QRSPEC_VERSION_MAX) return null; if(!isset(self::$frames[$version])) { $fileName = QR_CACHE_DIR.'frame_'.$version.'.dat'; if (QR_CACHEABLE) { if (file_exists($fileName)) { self::$frames[$version] = self::unserial(file_get_contents($fileName)); } else { self::$frames[$version] = self::createFrame($version); file_put_contents($fileName, self::serial(self::$frames[$version])); } } else { self::$frames[$version] = self::createFrame($version); } } if(is_null(self::$frames[$version])) return null; return self::$frames[$version]; } //---------------------------------------------------------------------- public static function rsBlockNum($spec) { return $spec[0] + $spec[3]; } public static function rsBlockNum1($spec) { return $spec[0]; } public static function rsDataCodes1($spec) { return $spec[1]; } public static function rsEccCodes1($spec) { return $spec[2]; } public static function rsBlockNum2($spec) { return $spec[3]; } public static function rsDataCodes2($spec) { return $spec[4]; } public static function rsEccCodes2($spec) { return $spec[2]; } public static function rsDataLength($spec) { return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); } public static function rsEccLength($spec) { return ($spec[0] + $spec[3]) * $spec[2]; } }phpqrcode/qrsplit.php0000644000175000017500000002616511432665120014310 0ustar thijsthijs * * PHP QR Code is distributed under LGPL 3 * Copyright (C) 2010 Dominik Dzienia * * The following data / specifications are taken from * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) * or * "Automatic identification and data capture techniques -- * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ class QRsplit { public $dataStr = ''; public $input; public $modeHint; //---------------------------------------------------------------------- public function __construct($dataStr, $input, $modeHint) { $this->dataStr = $dataStr; $this->input = $input; $this->modeHint = $modeHint; } //---------------------------------------------------------------------- public static function isdigitat($str, $pos) { if ($pos >= strlen($str)) return false; return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9'))); } //---------------------------------------------------------------------- public static function isalnumat($str, $pos) { if ($pos >= strlen($str)) return false; return (QRinput::lookAnTable(ord($str[$pos])) >= 0); } //---------------------------------------------------------------------- public function identifyMode($pos) { if ($pos >= strlen($this->dataStr)) return QR_MODE_NUL; $c = $this->dataStr[$pos]; if(self::isdigitat($this->dataStr, $pos)) { return QR_MODE_NUM; } else if(self::isalnumat($this->dataStr, $pos)) { return QR_MODE_AN; } else if($this->modeHint == QR_MODE_KANJI) { if ($pos+1 < strlen($this->dataStr)) { $d = $this->dataStr[$pos+1]; $word = (ord($c) << 8) | ord($d); if(($word >= 0x8140 && $word <= 0x9ffc) || ($word >= 0xe040 && $word <= 0xebbf)) { return QR_MODE_KANJI; } } } return QR_MODE_8; } //---------------------------------------------------------------------- public function eatNum() { $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); $p = 0; while(self::isdigitat($this->dataStr, $p)) { $p++; } $run = $p; $mode = $this->identifyMode($p); if($mode == QR_MODE_8) { $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln + QRinput::estimateBitsMode8(1) // + 4 + l8 - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 if($dif > 0) { return $this->eat8(); } } if($mode == QR_MODE_AN) { $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln + QRinput::estimateBitsModeAn(1) // + 4 + la - QRinput::estimateBitsModeAn($run + 1);// - 4 - la if($dif > 0) { return $this->eatAn(); } } $ret = $this->input->append(QR_MODE_NUM, $run, str_split($this->dataStr)); if($ret < 0) return -1; return $run; } //---------------------------------------------------------------------- public function eatAn() { $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); $p = 0; while(self::isalnumat($this->dataStr, $p)) { if(self::isdigitat($this->dataStr, $p)) { $q = $p; while(self::isdigitat($this->dataStr, $q)) { $q++; } $dif = QRinput::estimateBitsModeAn($p) // + 4 + la + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln - QRinput::estimateBitsModeAn($q); // - 4 - la if($dif < 0) { break; } else { $p = $q; } } else { $p++; } } $run = $p; if(!self::isalnumat($this->dataStr, $p)) { $dif = QRinput::estimateBitsModeAn($run) + 4 + $la + QRinput::estimateBitsMode8(1) // + 4 + l8 - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 if($dif > 0) { return $this->eat8(); } } $ret = $this->input->append(QR_MODE_AN, $run, str_split($this->dataStr)); if($ret < 0) return -1; return $run; } //---------------------------------------------------------------------- public function eatKanji() { $p = 0; while($this->identifyMode($p) == QR_MODE_KANJI) { $p += 2; } $ret = $this->input->append(QR_MODE_KANJI, $p, str_split($this->dataStr)); if($ret < 0) return -1; return $run; } //---------------------------------------------------------------------- public function eat8() { $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); $p = 1; $dataStrLen = strlen($this->dataStr); while($p < $dataStrLen) { $mode = $this->identifyMode($p); if($mode == QR_MODE_KANJI) { break; } if($mode == QR_MODE_NUM) { $q = $p; while(self::isdigitat($this->dataStr, $q)) { $q++; } $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln - QRinput::estimateBitsMode8($q); // - 4 - l8 if($dif < 0) { break; } else { $p = $q; } } else if($mode == QR_MODE_AN) { $q = $p; while(self::isalnumat($this->dataStr, $q)) { $q++; } $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 + QRinput::estimateBitsModeAn($q - $p) + 4 + $la - QRinput::estimateBitsMode8($q); // - 4 - l8 if($dif < 0) { break; } else { $p = $q; } } else { $p++; } } $run = $p; $ret = $this->input->append(QR_MODE_8, $run, str_split($this->dataStr)); if($ret < 0) return -1; return $run; } //---------------------------------------------------------------------- public function splitString() { while (strlen($this->dataStr) > 0) { if($this->dataStr == '') return 0; $mode = $this->identifyMode(0); switch ($mode) { case QR_MODE_NUM: $length = $this->eatNum(); break; case QR_MODE_AN: $length = $this->eatAn(); break; case QR_MODE_KANJI: if ($hint == QR_MODE_KANJI) $length = $this->eatKanji(); else $length = $this->eat8(); break; default: $length = $this->eat8(); break; } if($length == 0) return 0; if($length < 0) return -1; $this->dataStr = substr($this->dataStr, $length); } } //---------------------------------------------------------------------- public function toUpper() { $stringLen = strlen($this->dataStr); $p = 0; while ($p<$stringLen) { $mode = self::identifyMode(substr($this->dataStr, $p), $this->modeHint); if($mode == QR_MODE_KANJI) { $p += 2; } else { if (ord($this->dataStr[$p]) >= ord('a') && ord($this->dataStr[$p]) <= ord('z')) { $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32); } $p++; } } return $this->dataStr; } //---------------------------------------------------------------------- public static function splitStringToQRinput($string, QRinput $input, $modeHint, $casesensitive = true) { if(is_null($string) || $string == '\0' || $string == '') { throw new Exception('empty string!!!'); } $split = new QRsplit($string, $input, $modeHint); if(!$casesensitive) $split->toUpper(); return $split->splitString(); } }phpqrcode/qrtools.php0000644000175000017500000001427411432665120014313 0ustar thijsthijs * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ class QRtools { //---------------------------------------------------------------------- public static function binarize($frame) { $len = count($frame); foreach ($frame as &$frameLine) { for($i=0; $i<$len; $i++) { $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0'; } } return $frame; } //---------------------------------------------------------------------- public static function tcpdfBarcodeArray($code, $mode = 'QR,L', $tcPdfVersion = '4.5.037') { $barcode_array = array(); if (!is_array($mode)) $mode = explode(',', $mode); $eccLevel = 'L'; if (count($mode) > 1) { $eccLevel = $mode[1]; } $qrTab = QRcode::text($code, false, $eccLevel); $size = count($qrTab); $barcode_array['num_rows'] = $size; $barcode_array['num_cols'] = $size; $barcode_array['bcode'] = array(); foreach ($qrTab as $line) { $arrAdd = array(); foreach(str_split($line) as $char) $arrAdd[] = ($char=='1')?1:0; $barcode_array['bcode'][] = $arrAdd; } return $barcode_array; } //---------------------------------------------------------------------- public static function clearCache() { self::$frames = array(); } //---------------------------------------------------------------------- public static function buildCache() { QRtools::markTime('before_build_cache'); $mask = new QRmask(); for ($a=1; $a <= QRSPEC_VERSION_MAX; $a++) { $frame = QRspec::newFrame($a); if (QR_IMAGE) { $fileName = QR_CACHE_DIR.'frame_'.$a.'.png'; QRimage::png(self::binarize($frame), $fileName, 1, 0); } $width = count($frame); $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); for ($maskNo=0; $maskNo<8; $maskNo++) $mask->makeMaskNo($maskNo, $width, $frame, $bitMask, true); } QRtools::markTime('after_build_cache'); } //---------------------------------------------------------------------- public static function log($outfile, $err) { if (QR_LOG_DIR !== false) { if ($err != '') { if ($outfile !== false) { file_put_contents(QR_LOG_DIR.basename($outfile).'-errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND); } else { file_put_contents(QR_LOG_DIR.'errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND); } } } } //---------------------------------------------------------------------- public static function dumpMask($frame) { $width = count($frame); for($y=0;$y<$width;$y++) { for($x=0;$x<$width;$x++) { echo ord($frame[$y][$x]).','; } } } //---------------------------------------------------------------------- public static function markTime($markerId) { list($usec, $sec) = explode(" ", microtime()); $time = ((float)$usec + (float)$sec); if (!isset($GLOBALS['qr_time_bench'])) $GLOBALS['qr_time_bench'] = array(); $GLOBALS['qr_time_bench'][$markerId] = $time; } //---------------------------------------------------------------------- public static function timeBenchmark() { self::markTime('finish'); $lastTime = 0; $startTime = 0; $p = 0; echo ''; foreach($GLOBALS['qr_time_bench'] as $markerId=>$thisTime) { if ($p > 0) { echo ''; } else { $startTime = $thisTime; } $p++; $lastTime = $thisTime; } echo '
BENCHMARK
till '.$markerId.': '.number_format($thisTime-$lastTime, 6).'s
TOTAL: '.number_format($lastTime-$startTime, 6).'s
'; } } //########################################################################## QRtools::markTime('start'); phpqrcode/README0000644000175000017500000000314211432665120012747 0ustar thijsthijsThis is PHP implementation of QR Code 2-D barcode generator. It is pure-php LGPL-licensed implementation based on C libqrencode by Kentaro Fukuchi. == LICENSING == Copyright (C) 2010 by Dominik Dzienia This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License (LICENSE file) for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA == INSTALATION AND USAGE == * INSTALL file * http://sourceforge.net/apps/mediawiki/phpqrcode/index.php?title=Main_Page == CONTACT == Fell free to contact me via e-mail (deltalab at poczta dot fm) or using folowing project pages: * http://sourceforge.net/projects/phpqrcode/ * http://phpqrcode.sourceforge.net/ == ACKNOWLEDGMENTS == Based on C libqrencode library (ver. 3.1.1) Copyright (C) 2006-2010 by Kentaro Fukuchi http://megaui.net/fukuchi/works/qrencode/index.en.html QR Code is registered trademarks of DENSO WAVE INCORPORATED in JAPAN and other countries. Reed-Solomon code encoder is written by Phil Karn, KA9Q. Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q phpqrcode/tools/0000755000175000017500000000000011453417106013231 5ustar thijsthijsphpqrcode/tools/merge.bat0000644000175000017500000000002611432665114015017 0ustar thijsthijsphp ./merge.php pausephpqrcode/tools/merge.php0000644000175000017500000000505411432665114015046 0ustar thijsthijs * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ $QR_BASEDIR = dirname(__FILE__).DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR; $QR_TOOLSDIR = dirname(__FILE__).DIRECTORY_SEPARATOR; $outputFile = $QR_BASEDIR.'phpqrcode.php'; // Required libs $fileList = array( $QR_BASEDIR.'qrconst.php', $QR_TOOLSDIR.'merged_config.php', $QR_BASEDIR.'qrtools.php', $QR_BASEDIR.'qrspec.php', $QR_BASEDIR.'qrimage.php', $QR_BASEDIR.'qrinput.php', $QR_BASEDIR.'qrbitstream.php', $QR_BASEDIR.'qrsplit.php', $QR_BASEDIR.'qrrscode.php', $QR_BASEDIR.'qrmask.php', $QR_BASEDIR.'qrencode.php' ); $headerFile = $QR_TOOLSDIR.'merged_header.php'; $versionFile = $QR_BASEDIR.'VERSION'; $outputCode = ''; foreach($fileList as $fileName) { $outputCode .= "\n\n".'//---- '.basename($fileName).' -----------------------------'."\n\n"; $anotherCode = file_get_contents($fileName); $anotherCode = preg_replace ('/^<\?php/', '', $anotherCode); $anotherCode = preg_replace ('/\?>\*$/', '', $anotherCode); $outputCode .= "\n\n".$anotherCode."\n\n"; } $versionDataEx = explode("\n", file_get_contents($versionFile)); $outputContents = file_get_contents($headerFile); $outputContents .= "\n\n/*\n * Version: ".trim($versionDataEx[0])."\n * Build: ".trim($versionDataEx[1])."\n */\n\n"; $outputContents .= $outputCode; file_put_contents($outputFile, $outputContents); phpqrcode/tools/merge.sh0000644000175000017500000000003211432665114014660 0ustar thijsthijs#!/bin/sh php ./merge.phpphpqrcode/tools/merged_config.php0000644000175000017500000000240411432665114016533 0ustar thijsthijs * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ phpqrcode/VERSION0000644000175000017500000000002111453415340013130 0ustar thijsthijs1.1.4 2010100721