aboutsummaryrefslogtreecommitdiffhomepage
path: root/inc/3rdparty/libraries/tcpdf/include
diff options
context:
space:
mode:
authorThomas Citharel <tcit@tcit.fr>2015-02-18 19:17:31 +0100
committerThomas Citharel <tcit@tcit.fr>2015-02-18 19:17:31 +0100
commit4b1fa4c2febc7abbc6da3d65e4e760949a55843c (patch)
treea93ec906dbb03ec70e9cdc5dc876392c6d758e97 /inc/3rdparty/libraries/tcpdf/include
parent364953ede585b75fb29dc94b1c5f853053eaed0b (diff)
parentdf89c6f71adebfdb754ec3eb2fd775d8efbdb280 (diff)
downloadwallabag-4b1fa4c2febc7abbc6da3d65e4e760949a55843c.tar.gz
wallabag-4b1fa4c2febc7abbc6da3d65e4e760949a55843c.tar.zst
wallabag-4b1fa4c2febc7abbc6da3d65e4e760949a55843c.zip
Merge pull request #1081 from wallabag/dev1.9
Version 1.9.0
Diffstat (limited to 'inc/3rdparty/libraries/tcpdf/include')
-rw-r--r--inc/3rdparty/libraries/tcpdf/include/barcodes/datamatrix.php1176
-rw-r--r--inc/3rdparty/libraries/tcpdf/include/barcodes/pdf417.php996
-rw-r--r--inc/3rdparty/libraries/tcpdf/include/barcodes/qrcode.php2866
-rw-r--r--inc/3rdparty/libraries/tcpdf/include/sRGB.iccbin0 -> 6922 bytes
-rw-r--r--inc/3rdparty/libraries/tcpdf/include/tcpdf_colors.php462
-rw-r--r--inc/3rdparty/libraries/tcpdf/include/tcpdf_filters.php481
-rw-r--r--inc/3rdparty/libraries/tcpdf/include/tcpdf_font_data.php18447
-rw-r--r--inc/3rdparty/libraries/tcpdf/include/tcpdf_fonts.php2583
-rw-r--r--inc/3rdparty/libraries/tcpdf/include/tcpdf_images.php355
-rw-r--r--inc/3rdparty/libraries/tcpdf/include/tcpdf_static.php2851
10 files changed, 30217 insertions, 0 deletions
diff --git a/inc/3rdparty/libraries/tcpdf/include/barcodes/datamatrix.php b/inc/3rdparty/libraries/tcpdf/include/barcodes/datamatrix.php
new file mode 100644
index 00000000..c1067299
--- /dev/null
+++ b/inc/3rdparty/libraries/tcpdf/include/barcodes/datamatrix.php
@@ -0,0 +1,1176 @@
1<?php
2//============================================================+
3// File name : datamatrix.php
4// Version : 1.0.008
5// Begin : 2010-06-07
6// Last Update : 2014-05-06
7// Author : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
8// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
9// -------------------------------------------------------------------
10// Copyright (C) 2010-2014 Nicola Asuni - Tecnick.com LTD
11//
12// This file is part of TCPDF software library.
13//
14// TCPDF is free software: you can redistribute it and/or modify it
15// under the terms of the GNU Lesser General Public License as
16// published by the Free Software Foundation, either version 3 of the
17// License, or (at your option) any later version.
18//
19// TCPDF is distributed in the hope that it will be useful, but
20// WITHOUT ANY WARRANTY; without even the implied warranty of
21// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
22// See the GNU Lesser General Public License for more details.
23//
24// You should have received a copy of the GNU Lesser General Public License
25// along with TCPDF. If not, see <http://www.gnu.org/licenses/>.
26//
27// See LICENSE.TXT file for more information.
28// -------------------------------------------------------------------
29//
30// DESCRIPTION :
31//
32// Class to create DataMatrix ECC 200 barcode arrays for TCPDF class.
33// DataMatrix (ISO/IEC 16022:2006) is a 2-dimensional bar code.
34//============================================================+
35
36/**
37* @file
38* Class to create DataMatrix ECC 200 barcode arrays for TCPDF class.
39* DataMatrix (ISO/IEC 16022:2006) is a 2-dimensional bar code.
40*
41* @package com.tecnick.tcpdf
42* @author Nicola Asuni
43* @version 1.0.008
44*/
45
46// custom definitions
47if (!defined('DATAMATRIXDEFS')) {
48
49 /**
50 * Indicate that definitions for this class are set
51 */
52 define('DATAMATRIXDEFS', true);
53
54 // -----------------------------------------------------
55
56} // end of custom definitions
57
58// #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#
59
60
61/**
62* ASCII encoding: ASCII character 0 to 127 (1 byte per CW)
63*/
64define('ENC_ASCII', 0);
65
66/**
67* C40 encoding: Upper-case alphanumeric (3/2 bytes per CW)
68*/
69define('ENC_C40', 1);
70
71/**
72* TEXT encoding: Lower-case alphanumeric (3/2 bytes per CW)
73*/
74define('ENC_TXT', 2);
75
76/**
77* X12 encoding: ANSI X12 (3/2 byte per CW)
78*/
79define('ENC_X12', 3);
80
81/**
82* EDIFACT encoding: ASCII character 32 to 94 (4/3 bytes per CW)
83*/
84define('ENC_EDF', 4);
85
86/**
87* BASE 256 encoding: ASCII character 0 to 255 (1 byte per CW)
88*/
89define('ENC_BASE256', 5);
90
91/**
92* ASCII extended encoding: ASCII character 128 to 255 (1/2 byte per CW)
93*/
94define('ENC_ASCII_EXT', 6);
95
96/**
97* ASCII number encoding: ASCII digits (2 bytes per CW)
98*/
99define('ENC_ASCII_NUM', 7);
100
101/**
102* @class Datamatrix
103* Class to create DataMatrix ECC 200 barcode arrays for TCPDF class.
104* DataMatrix (ISO/IEC 16022:2006) is a 2-dimensional bar code.
105*
106* @package com.tecnick.tcpdf
107* @author Nicola Asuni
108* @version 1.0.004
109*/
110class Datamatrix {
111
112 /**
113 * Barcode array to be returned which is readable by TCPDF.
114 * @protected
115 */
116 protected $barcode_array = array();
117
118 /**
119 * Store last used encoding for data codewords.
120 * @protected
121 */
122 protected $last_enc = ENC_ASCII;
123
124 /**
125 * Table of Data Matrix ECC 200 Symbol Attributes:<ul>
126 * <li>total matrix rows (including finder pattern)</li>
127 * <li>total matrix cols (including finder pattern)</li>
128 * <li>total matrix rows (without finder pattern)</li>
129 * <li>total matrix cols (without finder pattern)</li>
130 * <li>region data rows (with finder pattern)</li>
131 * <li>region data col (with finder pattern)</li>
132 * <li>region data rows (without finder pattern)</li>
133 * <li>region data col (without finder pattern)</li>
134 * <li>horizontal regions</li>
135 * <li>vertical regions</li>
136 * <li>regions</li>
137 * <li>data codewords</li>
138 * <li>error codewords</li>
139 * <li>blocks</li>
140 * <li>data codewords per block</li>
141 * <li>error codewords per block</li>
142 * </ul>
143 * @protected
144 */
145 protected $symbattr = array(
146 // square form ---------------------------------------------------------------------------------------
147 array(0x00a,0x00a,0x008,0x008,0x00a,0x00a,0x008,0x008,0x001,0x001,0x001,0x003,0x005,0x001,0x003,0x005), // 10x10
148 array(0x00c,0x00c,0x00a,0x00a,0x00c,0x00c,0x00a,0x00a,0x001,0x001,0x001,0x005,0x007,0x001,0x005,0x007), // 12x12
149 array(0x00e,0x00e,0x00c,0x00c,0x00e,0x00e,0x00c,0x00c,0x001,0x001,0x001,0x008,0x00a,0x001,0x008,0x00a), // 14x14
150 array(0x010,0x010,0x00e,0x00e,0x010,0x010,0x00e,0x00e,0x001,0x001,0x001,0x00c,0x00c,0x001,0x00c,0x00c), // 16x16
151 array(0x012,0x012,0x010,0x010,0x012,0x012,0x010,0x010,0x001,0x001,0x001,0x012,0x00e,0x001,0x012,0x00e), // 18x18
152 array(0x014,0x014,0x012,0x012,0x014,0x014,0x012,0x012,0x001,0x001,0x001,0x016,0x012,0x001,0x016,0x012), // 20x20
153 array(0x016,0x016,0x014,0x014,0x016,0x016,0x014,0x014,0x001,0x001,0x001,0x01e,0x014,0x001,0x01e,0x014), // 22x22
154 array(0x018,0x018,0x016,0x016,0x018,0x018,0x016,0x016,0x001,0x001,0x001,0x024,0x018,0x001,0x024,0x018), // 24x24
155 array(0x01a,0x01a,0x018,0x018,0x01a,0x01a,0x018,0x018,0x001,0x001,0x001,0x02c,0x01c,0x001,0x02c,0x01c), // 26x26
156 array(0x020,0x020,0x01c,0x01c,0x010,0x010,0x00e,0x00e,0x002,0x002,0x004,0x03e,0x024,0x001,0x03e,0x024), // 32x32
157 array(0x024,0x024,0x020,0x020,0x012,0x012,0x010,0x010,0x002,0x002,0x004,0x056,0x02a,0x001,0x056,0x02a), // 36x36
158 array(0x028,0x028,0x024,0x024,0x014,0x014,0x012,0x012,0x002,0x002,0x004,0x072,0x030,0x001,0x072,0x030), // 40x40
159 array(0x02c,0x02c,0x028,0x028,0x016,0x016,0x014,0x014,0x002,0x002,0x004,0x090,0x038,0x001,0x090,0x038), // 44x44
160 array(0x030,0x030,0x02c,0x02c,0x018,0x018,0x016,0x016,0x002,0x002,0x004,0x0ae,0x044,0x001,0x0ae,0x044), // 48x48
161 array(0x034,0x034,0x030,0x030,0x01a,0x01a,0x018,0x018,0x002,0x002,0x004,0x0cc,0x054,0x002,0x066,0x02a), // 52x52
162 array(0x040,0x040,0x038,0x038,0x010,0x010,0x00e,0x00e,0x004,0x004,0x010,0x118,0x070,0x002,0x08c,0x038), // 64x64
163 array(0x048,0x048,0x040,0x040,0x012,0x012,0x010,0x010,0x004,0x004,0x010,0x170,0x090,0x004,0x05c,0x024), // 72x72
164 array(0x050,0x050,0x048,0x048,0x014,0x014,0x012,0x012,0x004,0x004,0x010,0x1c8,0x0c0,0x004,0x072,0x030), // 80x80
165 array(0x058,0x058,0x050,0x050,0x016,0x016,0x014,0x014,0x004,0x004,0x010,0x240,0x0e0,0x004,0x090,0x038), // 88x88
166 array(0x060,0x060,0x058,0x058,0x018,0x018,0x016,0x016,0x004,0x004,0x010,0x2b8,0x110,0x004,0x0ae,0x044), // 96x96
167 array(0x068,0x068,0x060,0x060,0x01a,0x01a,0x018,0x018,0x004,0x004,0x010,0x330,0x150,0x006,0x088,0x038), // 104x104
168 array(0x078,0x078,0x06c,0x06c,0x014,0x014,0x012,0x012,0x006,0x006,0x024,0x41a,0x198,0x006,0x0af,0x044), // 120x120
169 array(0x084,0x084,0x078,0x078,0x016,0x016,0x014,0x014,0x006,0x006,0x024,0x518,0x1f0,0x008,0x0a3,0x03e), // 132x132
170 array(0x090,0x090,0x084,0x084,0x018,0x018,0x016,0x016,0x006,0x006,0x024,0x616,0x26c,0x00a,0x09c,0x03e), // 144x144
171 // rectangular form (currently unused) ---------------------------------------------------------------------------
172 array(0x008,0x012,0x006,0x010,0x008,0x012,0x006,0x010,0x001,0x001,0x001,0x005,0x007,0x001,0x005,0x007), // 8x18
173 array(0x008,0x020,0x006,0x01c,0x008,0x010,0x006,0x00e,0x001,0x002,0x002,0x00a,0x00b,0x001,0x00a,0x00b), // 8x32
174 array(0x00c,0x01a,0x00a,0x018,0x00c,0x01a,0x00a,0x018,0x001,0x001,0x001,0x010,0x00e,0x001,0x010,0x00e), // 12x26
175 array(0x00c,0x024,0x00a,0x020,0x00c,0x012,0x00a,0x010,0x001,0x002,0x002,0x00c,0x012,0x001,0x00c,0x012), // 12x36
176 array(0x010,0x024,0x00e,0x020,0x010,0x012,0x00e,0x010,0x001,0x002,0x002,0x020,0x018,0x001,0x020,0x018), // 16x36
177 array(0x010,0x030,0x00e,0x02c,0x010,0x018,0x00e,0x016,0x001,0x002,0x002,0x031,0x01c,0x001,0x031,0x01c) // 16x48
178 );
179
180 /**
181 * Map encodation modes whit character sets.
182 * @protected
183 */
184 protected $chset_id = array(ENC_C40 => 'C40', ENC_TXT => 'TXT', ENC_X12 =>'X12');
185
186 /**
187 * Basic set of characters for each encodation mode.
188 * @protected
189 */
190 protected $chset = array(
191 'C40' => array( // Basic set for C40 ----------------------------------------------------------------------------
192 'S1'=>0x00,'S2'=>0x01,'S3'=>0x02,0x20=>0x03,0x30=>0x04,0x31=>0x05,0x32=>0x06,0x33=>0x07,0x34=>0x08,0x35=>0x09, //
193 0x36=>0x0a,0x37=>0x0b,0x38=>0x0c,0x39=>0x0d,0x41=>0x0e,0x42=>0x0f,0x43=>0x10,0x44=>0x11,0x45=>0x12,0x46=>0x13, //
194 0x47=>0x14,0x48=>0x15,0x49=>0x16,0x4a=>0x17,0x4b=>0x18,0x4c=>0x19,0x4d=>0x1a,0x4e=>0x1b,0x4f=>0x1c,0x50=>0x1d, //
195 0x51=>0x1e,0x52=>0x1f,0x53=>0x20,0x54=>0x21,0x55=>0x22,0x56=>0x23,0x57=>0x24,0x58=>0x25,0x59=>0x26,0x5a=>0x27),//
196 'TXT' => array( // Basic set for TEXT ---------------------------------------------------------------------------
197 'S1'=>0x00,'S2'=>0x01,'S3'=>0x02,0x20=>0x03,0x30=>0x04,0x31=>0x05,0x32=>0x06,0x33=>0x07,0x34=>0x08,0x35=>0x09, //
198 0x36=>0x0a,0x37=>0x0b,0x38=>0x0c,0x39=>0x0d,0x61=>0x0e,0x62=>0x0f,0x63=>0x10,0x64=>0x11,0x65=>0x12,0x66=>0x13, //
199 0x67=>0x14,0x68=>0x15,0x69=>0x16,0x6a=>0x17,0x6b=>0x18,0x6c=>0x19,0x6d=>0x1a,0x6e=>0x1b,0x6f=>0x1c,0x70=>0x1d, //
200 0x71=>0x1e,0x72=>0x1f,0x73=>0x20,0x74=>0x21,0x75=>0x22,0x76=>0x23,0x77=>0x24,0x78=>0x25,0x79=>0x26,0x7a=>0x27),//
201 'SH1' => array( // Shift 1 set ----------------------------------------------------------------------------------
202 0x00=>0x00,0x01=>0x01,0x02=>0x02,0x03=>0x03,0x04=>0x04,0x05=>0x05,0x06=>0x06,0x07=>0x07,0x08=>0x08,0x09=>0x09, //
203 0x0a=>0x0a,0x0b=>0x0b,0x0c=>0x0c,0x0d=>0x0d,0x0e=>0x0e,0x0f=>0x0f,0x10=>0x10,0x11=>0x11,0x12=>0x12,0x13=>0x13, //
204 0x14=>0x14,0x15=>0x15,0x16=>0x16,0x17=>0x17,0x18=>0x18,0x19=>0x19,0x1a=>0x1a,0x1b=>0x1b,0x1c=>0x1c,0x1d=>0x1d, //
205 0x1e=>0x1e,0x1f=>0x1f), //
206 'SH2' => array( // Shift 2 set ----------------------------------------------------------------------------------
207 0x21=>0x00,0x22=>0x01,0x23=>0x02,0x24=>0x03,0x25=>0x04,0x26=>0x05,0x27=>0x06,0x28=>0x07,0x29=>0x08,0x2a=>0x09, //
208 0x2b=>0x0a,0x2c=>0x0b,0x2d=>0x0c,0x2e=>0x0d,0x2f=>0x0e,0x3a=>0x0f,0x3b=>0x10,0x3c=>0x11,0x3d=>0x12,0x3e=>0x13, //
209 0x3f=>0x14,0x40=>0x15,0x5b=>0x16,0x5c=>0x17,0x5d=>0x18,0x5e=>0x19,0x5f=>0x1a,'F1'=>0x1b,'US'=>0x1e), //
210 'S3C' => array( // Shift 3 set for C40 --------------------------------------------------------------------------
211 0x60=>0x00,0x61=>0x01,0x62=>0x02,0x63=>0x03,0x64=>0x04,0x65=>0x05,0x66=>0x06,0x67=>0x07,0x68=>0x08,0x69=>0x09, //
212 0x6a=>0x0a,0x6b=>0x0b,0x6c=>0x0c,0x6d=>0x0d,0x6e=>0x0e,0x6f=>0x0f,0x70=>0x10,0x71=>0x11,0x72=>0x12,0x73=>0x13, //
213 0x74=>0x14,0x75=>0x15,0x76=>0x16,0x77=>0x17,0x78=>0x18,0x79=>0x19,0x7a=>0x1a,0x7b=>0x1b,0x7c=>0x1c,0x7d=>0x1d, //
214 0x7e=>0x1e,0x7f=>0x1f),
215 'S3T' => array( // Shift 3 set for TEXT -------------------------------------------------------------------------
216 0x60=>0x00,0x41=>0x01,0x42=>0x02,0x43=>0x03,0x44=>0x04,0x45=>0x05,0x46=>0x06,0x47=>0x07,0x48=>0x08,0x49=>0x09, //
217 0x4a=>0x0a,0x4b=>0x0b,0x4c=>0x0c,0x4d=>0x0d,0x4e=>0x0e,0x4f=>0x0f,0x50=>0x10,0x51=>0x11,0x52=>0x12,0x53=>0x13, //
218 0x54=>0x14,0x55=>0x15,0x56=>0x16,0x57=>0x17,0x58=>0x18,0x59=>0x19,0x5a=>0x1a,0x7b=>0x1b,0x7c=>0x1c,0x7d=>0x1d, //
219 0x7e=>0x1e,0x7f=>0x1f), //
220 'X12' => array( // Set for X12 ----------------------------------------------------------------------------------
221 0x0d=>0x00,0x2a=>0x01,0x3e=>0x02,0x20=>0x03,0x30=>0x04,0x31=>0x05,0x32=>0x06,0x33=>0x07,0x34=>0x08,0x35=>0x09, //
222 0x36=>0x0a,0x37=>0x0b,0x38=>0x0c,0x39=>0x0d,0x41=>0x0e,0x42=>0x0f,0x43=>0x10,0x44=>0x11,0x45=>0x12,0x46=>0x13, //
223 0x47=>0x14,0x48=>0x15,0x49=>0x16,0x4a=>0x17,0x4b=>0x18,0x4c=>0x19,0x4d=>0x1a,0x4e=>0x1b,0x4f=>0x1c,0x50=>0x1d, //
224 0x51=>0x1e,0x52=>0x1f,0x53=>0x20,0x54=>0x21,0x55=>0x22,0x56=>0x23,0x57=>0x24,0x58=>0x25,0x59=>0x26,0x5a=>0x27) //
225 );
226
227// -----------------------------------------------------------------------------
228
229 /**
230 * This is the class constructor.
231 * Creates a datamatrix object
232 * @param $code (string) Code to represent using Datamatrix.
233 * @public
234 */
235 public function __construct($code) {
236 $barcode_array = array();
237 if ((is_null($code)) OR ($code == '\0') OR ($code == '')) {
238 return false;
239 }
240 // get data codewords
241 $cw = $this->getHighLevelEncoding($code);
242 // number of data codewords
243 $nd = count($cw);
244 // check size
245 if ($nd > 1558) {
246 return false;
247 }
248 // get minimum required matrix size.
249 foreach ($this->symbattr as $params) {
250 if ($params[11] >= $nd) {
251 break;
252 }
253 }
254 if ($params[11] < $nd) {
255 // too much data
256 return false;
257 } elseif ($params[11] > $nd) {
258 // add padding
259 if ((($params[11] - $nd) > 1) AND ($cw[($nd - 1)] != 254)) {
260 if ($this->last_enc == ENC_EDF) {
261 // switch to ASCII encoding
262 $cw[] = 124;
263 ++$nd;
264 } elseif (($this->last_enc != ENC_ASCII) AND ($this->last_enc != ENC_BASE256)) {
265 // switch to ASCII encoding
266 $cw[] = 254;
267 ++$nd;
268 }
269 }
270 if ($params[11] > $nd) {
271 // add first pad
272 $cw[] = 129;
273 ++$nd;
274 // add remaining pads
275 for ($i = $nd; $i < $params[11]; ++$i) {
276 $cw[] = $this->get253StateCodeword(129, $i);
277 }
278 }
279 }
280 // add error correction codewords
281 $cw = $this->getErrorCorrection($cw, $params[13], $params[14], $params[15]);
282 // initialize empty arrays
283 $grid = array_fill(0, ($params[2] * $params[3]), 0);
284 // get placement map
285 $places = $this->getPlacementMap($params[2], $params[3]);
286 // fill the grid with data
287 $grid = array();
288 $i = 0;
289 // region data row max index
290 $rdri = ($params[4] - 1);
291 // region data column max index
292 $rdci = ($params[5] - 1);
293 // for each vertical region
294 for ($vr = 0; $vr < $params[9]; ++$vr) {
295 // for each row on region
296 for ($r = 0; $r < $params[4]; ++$r) {
297 // get row
298 $row = (($vr * $params[4]) + $r);
299 // for each horizontal region
300 for ($hr = 0; $hr < $params[8]; ++$hr) {
301 // for each column on region
302 for ($c = 0; $c < $params[5]; ++$c) {
303 // get column
304 $col = (($hr * $params[5]) + $c);
305 // braw bits by case
306 if ($r == 0) {
307 // top finder pattern
308 if ($c % 2) {
309 $grid[$row][$col] = 0;
310 } else {
311 $grid[$row][$col] = 1;
312 }
313 } elseif ($r == $rdri) {
314 // bottom finder pattern
315 $grid[$row][$col] = 1;
316 } elseif ($c == 0) {
317 // left finder pattern
318 $grid[$row][$col] = 1;
319 } elseif ($c == $rdci) {
320 // right finder pattern
321 if ($r % 2) {
322 $grid[$row][$col] = 1;
323 } else {
324 $grid[$row][$col] = 0;
325 }
326 } else { // data bit
327 if ($places[$i] < 2) {
328 $grid[$row][$col] = $places[$i];
329 } else {
330 // codeword ID
331 $cw_id = (floor($places[$i] / 10) - 1);
332 // codeword BIT mask
333 $cw_bit = pow(2, (8 - ($places[$i] % 10)));
334 $grid[$row][$col] = (($cw[$cw_id] & $cw_bit) == 0) ? 0 : 1;
335 }
336 ++$i;
337 }
338 }
339 }
340 }
341 }
342 $this->barcode_array['num_rows'] = $params[0];
343 $this->barcode_array['num_cols'] = $params[1];
344 $this->barcode_array['bcode'] = $grid;
345 }
346
347 /**
348 * Returns a barcode array which is readable by TCPDF
349 * @return array barcode array readable by TCPDF;
350 * @public
351 */
352 public function getBarcodeArray() {
353 return $this->barcode_array;
354 }
355
356 /**
357 * Product of two numbers in a Power-of-Two Galois Field
358 * @param $a (int) first number to multiply.
359 * @param $b (int) second number to multiply.
360 * @param $log (array) Log table.
361 * @param $alog (array) Anti-Log table.
362 * @param $gf (array) Number of Factors of the Reed-Solomon polynomial.
363 * @return int product
364 * @protected
365 */
366 protected function getGFProduct($a, $b, $log, $alog, $gf) {
367 if (($a == 0) OR ($b == 0)) {
368 return 0;
369 }
370 return ($alog[($log[$a] + $log[$b]) % ($gf - 1)]);
371 }
372
373 /**
374 * Add error correction codewords to data codewords array (ANNEX E).
375 * @param $wd (array) Array of datacodewords.
376 * @param $nb (int) Number of blocks.
377 * @param $nd (int) Number of data codewords per block.
378 * @param $nc (int) Number of correction codewords per block.
379 * @param $gf (int) numner of fields on log/antilog table (power of 2).
380 * @param $pp (int) The value of its prime modulus polynomial (301 for ECC200).
381 * @return array data codewords + error codewords
382 * @protected
383 */
384 protected function getErrorCorrection($wd, $nb, $nd, $nc, $gf=256, $pp=301) {
385 // generate the log ($log) and antilog ($alog) tables
386 $log[0] = 0;
387 $alog[0] = 1;
388 for ($i = 1; $i < $gf; ++$i) {
389 $alog[$i] = ($alog[($i - 1)] * 2);
390 if ($alog[$i] >= $gf) {
391 $alog[$i] ^= $pp;
392 }
393 $log[$alog[$i]] = $i;
394 }
395 ksort($log);
396 // generate the polynomial coefficients (c)
397 $c = array_fill(0, ($nc + 1), 0);
398 $c[0] = 1;
399 for ($i = 1; $i <= $nc; ++$i) {
400 $c[$i] = $c[($i-1)];
401 for ($j = ($i - 1); $j >= 1; --$j) {
402 $c[$j] = $c[($j - 1)] ^ $this->getGFProduct($c[$j], $alog[$i], $log, $alog, $gf);
403 }
404 $c[0] = $this->getGFProduct($c[0], $alog[$i], $log, $alog, $gf);
405 }
406 ksort($c);
407 // total number of data codewords
408 $num_wd = ($nb * $nd);
409 // total number of error codewords
410 $num_we = ($nb * $nc);
411 // for each block
412 for ($b = 0; $b < $nb; ++$b) {
413 // create interleaved data block
414 $block = array();
415 for ($n = $b; $n < $num_wd; $n += $nb) {
416 $block[] = $wd[$n];
417 }
418 // initialize error codewords
419 $we = array_fill(0, ($nc + 1), 0);
420 // calculate error correction codewords for this block
421 for ($i = 0; $i < $nd; ++$i) {
422 $k = ($we[0] ^ $block[$i]);
423 for ($j = 0; $j < $nc; ++$j) {
424 $we[$j] = ($we[($j + 1)] ^ $this->getGFProduct($k, $c[($nc - $j - 1)], $log, $alog, $gf));
425 }
426 }
427 // add error codewords at the end of data codewords
428 $j = 0;
429 for ($i = $b; $i < $num_we; $i += $nb) {
430 $wd[($num_wd + $i)] = $we[$j];
431 ++$j;
432 }
433 }
434 // reorder codewords
435 ksort($wd);
436 return $wd;
437 }
438
439 /**
440 * Return the 253-state codeword
441 * @param $cwpad (int) Pad codeword.
442 * @param $cwpos (int) Number of data codewords from the beginning of encoded data.
443 * @return pad codeword
444 * @protected
445 */
446 protected function get253StateCodeword($cwpad, $cwpos) {
447 $pad = ($cwpad + (((149 * $cwpos) % 253) + 1));
448 if ($pad > 254) {
449 $pad -= 254;
450 }
451 return $pad;
452 }
453
454 /**
455 * Return the 255-state codeword
456 * @param $cwpad (int) Pad codeword.
457 * @param $cwpos (int) Number of data codewords from the beginning of encoded data.
458 * @return pad codeword
459 * @protected
460 */
461 protected function get255StateCodeword($cwpad, $cwpos) {
462 $pad = ($cwpad + (((149 * $cwpos) % 255) + 1));
463 if ($pad > 255) {
464 $pad -= 256;
465 }
466 return $pad;
467 }
468
469 /**
470 * Returns true if the char belongs to the selected mode
471 * @param $chr (int) Character (byte) to check.
472 * @param $mode (int) Current encoding mode.
473 * @return boolean true if the char is of the selected mode.
474 * @protected
475 */
476 protected function isCharMode($chr, $mode) {
477 $status = false;
478 switch ($mode) {
479 case ENC_ASCII: { // ASCII character 0 to 127
480 $status = (($chr >= 0) AND ($chr <= 127));
481 break;
482 }
483 case ENC_C40: { // Upper-case alphanumeric
484 $status = (($chr == 32) OR (($chr >= 48) AND ($chr <= 57)) OR (($chr >= 65) AND ($chr <= 90)));
485 break;
486 }
487 case ENC_TXT: { // Lower-case alphanumeric
488 $status = (($chr == 32) OR (($chr >= 48) AND ($chr <= 57)) OR (($chr >= 97) AND ($chr <= 122)));
489 break;
490 }
491 case ENC_X12: { // ANSI X12
492 $status = (($chr == 13) OR ($chr == 42) OR ($chr == 62));
493 break;
494 }
495 case ENC_EDF: { // ASCII character 32 to 94
496 $status = (($chr >= 32) AND ($chr <= 94));
497 break;
498 }
499 case ENC_BASE256: { // Function character (FNC1, Structured Append, Reader Program, or Code Page)
500 $status = (($chr == 232) OR ($chr == 233) OR ($chr == 234) OR ($chr == 241));
501 break;
502 }
503 case ENC_ASCII_EXT: { // ASCII character 128 to 255
504 $status = (($chr >= 128) AND ($chr <= 255));
505 break;
506 }
507 case ENC_ASCII_NUM: { // ASCII digits
508 $status = (($chr >= 48) AND ($chr <= 57));
509 break;
510 }
511 }
512 return $status;
513 }
514
515 /**
516 * The look-ahead test scans the data to be encoded to find the best mode (Annex P - steps from J to S).
517 * @param $data (string) data to encode
518 * @param $pos (int) current position
519 * @param $mode (int) current encoding mode
520 * @return int encoding mode
521 * @protected
522 */
523 protected function lookAheadTest($data, $pos, $mode) {
524 $data_length = strlen($data);
525 if ($pos >= $data_length) {
526 return $mode;
527 }
528 $charscount = 0; // count processed chars
529 // STEP J
530 if ($mode == ENC_ASCII) {
531 $numch = array(0, 1, 1, 1, 1, 1.25);
532 } else {
533 $numch = array(1, 2, 2, 2, 2, 2.25);
534 $numch[$mode] = 0;
535 }
536 while (true) {
537 // STEP K
538 if (($pos + $charscount) == $data_length) {
539 if ($numch[ENC_ASCII] <= ceil(min($numch[ENC_C40], $numch[ENC_TXT], $numch[ENC_X12], $numch[ENC_EDF], $numch[ENC_BASE256]))) {
540 return ENC_ASCII;
541 }
542 if ($numch[ENC_BASE256] < ceil(min($numch[ENC_ASCII], $numch[ENC_C40], $numch[ENC_TXT], $numch[ENC_X12], $numch[ENC_EDF]))) {
543 return ENC_BASE256;
544 }
545 if ($numch[ENC_EDF] < ceil(min($numch[ENC_ASCII], $numch[ENC_C40], $numch[ENC_TXT], $numch[ENC_X12], $numch[ENC_BASE256]))) {
546 return ENC_EDF;
547 }
548 if ($numch[ENC_TXT] < ceil(min($numch[ENC_ASCII], $numch[ENC_C40], $numch[ENC_X12], $numch[ENC_EDF], $numch[ENC_BASE256]))) {
549 return ENC_TXT;
550 }
551 if ($numch[ENC_X12] < ceil(min($numch[ENC_ASCII], $numch[ENC_C40], $numch[ENC_TXT], $numch[ENC_EDF], $numch[ENC_BASE256]))) {
552 return ENC_X12;
553 }
554 return ENC_C40;
555 }
556 // get char
557 $chr = ord($data[$pos + $charscount]);
558 $charscount++;
559 // STEP L
560 if ($this->isCharMode($chr, ENC_ASCII_NUM)) {
561 $numch[ENC_ASCII] += (1 / 2);
562 } elseif ($this->isCharMode($chr, ENC_ASCII_EXT)) {
563 $numch[ENC_ASCII] = ceil($numch[ENC_ASCII]);
564 $numch[ENC_ASCII] += 2;
565 } else {
566 $numch[ENC_ASCII] = ceil($numch[ENC_ASCII]);
567 $numch[ENC_ASCII] += 1;
568 }
569 // STEP M
570 if ($this->isCharMode($chr, ENC_C40)) {
571 $numch[ENC_C40] += (2 / 3);
572 } elseif ($this->isCharMode($chr, ENC_ASCII_EXT)) {
573 $numch[ENC_C40] += (8 / 3);
574 } else {
575 $numch[ENC_C40] += (4 / 3);
576 }
577 // STEP N
578 if ($this->isCharMode($chr, ENC_TXT)) {
579 $numch[ENC_TXT] += (2 / 3);
580 } elseif ($this->isCharMode($chr, ENC_ASCII_EXT)) {
581 $numch[ENC_TXT] += (8 / 3);
582 } else {
583 $numch[ENC_TXT] += (4 / 3);
584 }
585 // STEP O
586 if ($this->isCharMode($chr, ENC_X12) OR $this->isCharMode($chr, ENC_C40)) {
587 $numch[ENC_X12] += (2 / 3);
588 } elseif ($this->isCharMode($chr, ENC_ASCII_EXT)) {
589 $numch[ENC_X12] += (13 / 3);
590 } else {
591 $numch[ENC_X12] += (10 / 3);
592 }
593 // STEP P
594 if ($this->isCharMode($chr, ENC_EDF)) {
595 $numch[ENC_EDF] += (3 / 4);
596 } elseif ($this->isCharMode($chr, ENC_ASCII_EXT)) {
597 $numch[ENC_EDF] += (17 / 4);
598 } else {
599 $numch[ENC_EDF] += (13 / 4);
600 }
601 // STEP Q
602 if ($this->isCharMode($chr, ENC_BASE256)) {
603 $numch[ENC_BASE256] += 4;
604 } else {
605 $numch[ENC_BASE256] += 1;
606 }
607 // STEP R
608 if ($charscount >= 4) {
609 if (($numch[ENC_ASCII] + 1) <= min($numch[ENC_C40], $numch[ENC_TXT], $numch[ENC_X12], $numch[ENC_EDF], $numch[ENC_BASE256])) {
610 return ENC_ASCII;
611 }
612 if ((($numch[ENC_BASE256] + 1) <= $numch[ENC_ASCII])
613 OR (($numch[ENC_BASE256] + 1) < min($numch[ENC_C40], $numch[ENC_TXT], $numch[ENC_X12], $numch[ENC_EDF]))) {
614 return ENC_BASE256;
615 }
616 if (($numch[ENC_EDF] + 1) < min($numch[ENC_ASCII], $numch[ENC_C40], $numch[ENC_TXT], $numch[ENC_X12], $numch[ENC_BASE256])) {
617 return ENC_EDF;
618 }
619 if (($numch[ENC_TXT] + 1) < min($numch[ENC_ASCII], $numch[ENC_C40], $numch[ENC_X12], $numch[ENC_EDF], $numch[ENC_BASE256])) {
620 return ENC_TXT;
621 }
622 if (($numch[ENC_X12] + 1) < min($numch[ENC_ASCII], $numch[ENC_C40], $numch[ENC_TXT], $numch[ENC_EDF], $numch[ENC_BASE256])) {
623 return ENC_X12;
624 }
625 if (($numch[ENC_C40] + 1) < min($numch[ENC_ASCII], $numch[ENC_TXT], $numch[ENC_EDF], $numch[ENC_BASE256])) {
626 if ($numch[ENC_C40] < $numch[ENC_X12]) {
627 return ENC_C40;
628 }
629 if ($numch[ENC_C40] == $numch[ENC_X12]) {
630 $k = ($pos + $charscount + 1);
631 while ($k < $data_length) {
632 $tmpchr = ord($data{$k});
633 if ($this->isCharMode($tmpchr, ENC_X12)) {
634 return ENC_X12;
635 } elseif (!($this->isCharMode($tmpchr, ENC_X12) OR $this->isCharMode($tmpchr, ENC_C40))) {
636 break;
637 }
638 ++$k;
639 }
640 return ENC_C40;
641 }
642 }
643 }
644 } // end of while
645 }
646
647 /**
648 * Get the switching codeword to a new encoding mode (latch codeword)
649 * @param $mode (int) New encoding mode.
650 * @return (int) Switch codeword.
651 * @protected
652 */
653 protected function getSwitchEncodingCodeword($mode) {
654 switch ($mode) {
655 case ENC_ASCII: { // ASCII character 0 to 127
656 $cw = 254;
657 if ($this->last_enc == ENC_EDF) {
658 $cw = 124;
659 }
660 break;
661 }
662 case ENC_C40: { // Upper-case alphanumeric
663 $cw = 230;
664 break;
665 }
666 case ENC_TXT: { // Lower-case alphanumeric
667 $cw = 239;
668 break;
669 }
670 case ENC_X12: { // ANSI X12
671 $cw = 238;
672 break;
673 }
674 case ENC_EDF: { // ASCII character 32 to 94
675 $cw = 240;
676 break;
677 }
678 case ENC_BASE256: { // Function character (FNC1, Structured Append, Reader Program, or Code Page)
679 $cw = 231;
680 break;
681 }
682 }
683 return $cw;
684 }
685
686 /**
687 * Choose the minimum matrix size and return the max number of data codewords.
688 * @param $numcw (int) Number of current codewords.
689 * @return number of data codewords in matrix
690 * @protected
691 */
692 protected function getMaxDataCodewords($numcw) {
693 foreach ($this->symbattr as $key => $matrix) {
694 if ($matrix[11] >= $numcw) {
695 return $matrix[11];
696 }
697 }
698 return 0;
699 }
700
701 /**
702 * Get high level encoding using the minimum symbol data characters for ECC 200
703 * @param $data (string) data to encode
704 * @return array of codewords
705 * @protected
706 */
707 protected function getHighLevelEncoding($data) {
708 // STEP A. Start in ASCII encodation.
709 $enc = ENC_ASCII; // current encoding mode
710 $pos = 0; // current position
711 $cw = array(); // array of codewords to be returned
712 $cw_num = 0; // number of data codewords
713 $data_lenght = strlen($data); // number of chars
714 while ($pos < $data_lenght) {
715 // set last used encoding
716 $this->last_enc = $enc;
717 switch ($enc) {
718 case ENC_ASCII: { // STEP B. While in ASCII encodation
719 if (($data_lenght > 1) AND ($pos < ($data_lenght - 1)) AND ($this->isCharMode(ord($data[$pos]), ENC_ASCII_NUM) AND $this->isCharMode(ord($data[$pos + 1]), ENC_ASCII_NUM))) {
720 // 1. If the next data sequence is at least 2 consecutive digits, encode the next two digits as a double digit in ASCII mode.
721 $cw[] = (intval(substr($data, $pos, 2)) + 130);
722 ++$cw_num;
723 $pos += 2;
724 } else {
725 // 2. If the look-ahead test (starting at step J) indicates another mode, switch to that mode.
726 $newenc = $this->lookAheadTest($data, $pos, $enc);
727 if ($newenc != $enc) {
728 // switch to new encoding
729 $enc = $newenc;
730 $cw[] = $this->getSwitchEncodingCodeword($enc);
731 ++$cw_num;
732 } else {
733 // get new byte
734 $chr = ord($data[$pos]);
735 ++$pos;
736 if ($this->isCharMode($chr, ENC_ASCII_EXT)) {
737 // 3. If the next data character is extended ASCII (greater than 127) encode it in ASCII mode first using the Upper Shift (value 235) character.
738 $cw[] = 235;
739 $cw[] = ($chr - 127);
740 $cw_num += 2;
741 } else {
742 // 4. Otherwise process the next data character in ASCII encodation.
743 $cw[] = ($chr + 1);
744 ++$cw_num;
745 }
746 }
747 }
748 break;
749 }
750 case ENC_C40 : // Upper-case alphanumeric
751 case ENC_TXT : // Lower-case alphanumeric
752 case ENC_X12 : { // ANSI X12
753 $temp_cw = array();
754 $p = 0;
755 $epos = $pos;
756 // get charset ID
757 $set_id = $this->chset_id[$enc];
758 // get basic charset for current encoding
759 $charset = $this->chset[$set_id];
760 do {
761 // 2. process the next character in C40 encodation.
762 $chr = ord($data[$epos]);
763 ++$epos;
764 // check for extended character
765 if ($chr & 0x80) {
766 if ($enc == ENC_X12) {
767 return false;
768 }
769 $chr = ($chr & 0x7f);
770 $temp_cw[] = 1; // shift 2
771 $temp_cw[] = 30; // upper shift
772 $p += 2;
773 }
774 if (isset($charset[$chr])) {
775 $temp_cw[] = $charset[$chr];
776 ++$p;
777 } else {
778 if (isset($this->chset['SH1'][$chr])) {
779 $temp_cw[] = 0; // shift 1
780 $shiftset = $this->chset['SH1'];
781 } elseif (isset($chr, $this->chset['SH2'][$chr])) {
782 $temp_cw[] = 1; // shift 2
783 $shiftset = $this->chset['SH2'];
784 } elseif (($enc == ENC_C40) AND isset($this->chset['S3C'][$chr])) {
785 $temp_cw[] = 2; // shift 3
786 $shiftset = $this->chset['S3C'];
787 } elseif (($enc == ENC_TXT) AND isset($this->chset['S3T'][$chr])) {
788 $temp_cw[] = 2; // shift 3
789 $shiftset = $this->chset['S3T'];
790 } else {
791 return false;
792 }
793 $temp_cw[] = $shiftset[$chr];
794 $p += 2;
795 }
796 if ($p >= 3) {
797 $c1 = array_shift($temp_cw);
798 $c2 = array_shift($temp_cw);
799 $c3 = array_shift($temp_cw);
800 $p -= 3;
801 $tmp = ((1600 * $c1) + (40 * $c2) + $c3 + 1);
802 $cw[] = ($tmp >> 8);
803 $cw[] = ($tmp % 256);
804 $cw_num += 2;
805 $pos = $epos;
806 // 1. If the C40 encoding is at the point of starting a new double symbol character and if the look-ahead test (starting at step J) indicates another mode, switch to that mode.
807 $newenc = $this->lookAheadTest($data, $pos, $enc);
808 if ($newenc != $enc) {
809 // switch to new encoding
810 $enc = $newenc;
811 if ($enc != ENC_ASCII) {
812 // set unlatch character
813 $cw[] = $this->getSwitchEncodingCodeword(ENC_ASCII);
814 ++$cw_num;
815 }
816 $cw[] = $this->getSwitchEncodingCodeword($enc);
817 ++$cw_num;
818 $pos -= $p;
819 $p = 0;
820 break;
821 }
822 }
823 } while (($p > 0) AND ($epos < $data_lenght));
824 // process last data (if any)
825 if ($p > 0) {
826 // get remaining number of data symbols
827 $cwr = ($this->getMaxDataCodewords($cw_num) - $cw_num);
828 if (($cwr == 1) AND ($p == 1)) {
829 // d. If one symbol character remains and one C40 value (data character) remains to be encoded
830 $c1 = array_shift($temp_cw);
831 --$p;
832 $cw[] = ($chr + 1);
833 ++$cw_num;
834 $pos = $epos;
835 $enc = ENC_ASCII;
836 $this->last_enc = $enc;
837 } elseif (($cwr == 2) AND ($p == 1)) {
838 // c. If two symbol characters remain and only one C40 value (data character) remains to be encoded
839 $c1 = array_shift($temp_cw);
840 --$p;
841 $cw[] = 254;
842 $cw[] = ($chr + 1);
843 $cw_num += 2;
844 $pos = $epos;
845 $enc = ENC_ASCII;
846 $this->last_enc = $enc;
847 } elseif (($cwr == 2) AND ($p == 2)) {
848 // b. If two symbol characters remain and two C40 values remain to be encoded
849 $c1 = array_shift($temp_cw);
850 $c2 = array_shift($temp_cw);
851 $p -= 2;
852 $tmp = ((1600 * $c1) + (40 * $c2) + 1);
853 $cw[] = ($tmp >> 8);
854 $cw[] = ($tmp % 256);
855 $cw_num += 2;
856 $pos = $epos;
857 $enc = ENC_ASCII;
858 $this->last_enc = $enc;
859 } else {
860 // switch to ASCII encoding
861 if ($enc != ENC_ASCII) {
862 $enc = ENC_ASCII;
863 $this->last_enc = $enc;
864 $cw[] = $this->getSwitchEncodingCodeword($enc);
865 ++$cw_num;
866 $pos = ($epos - $p);
867 }
868 }
869 }
870 break;
871 }
872 case ENC_EDF: { // F. While in EDIFACT (EDF) encodation
873 // initialize temporary array with 0 lenght
874 $temp_cw = array();
875 $epos = $pos;
876 $field_lenght = 0;
877 $newenc = $enc;
878 do {
879 // 2. process the next character in EDIFACT encodation.
880 $chr = ord($data[$epos]);
881 if ($this->isCharMode($chr, ENC_EDF)) {
882 ++$epos;
883 $temp_cw[] = $chr;
884 ++$field_lenght;
885 }
886 if (($field_lenght == 4) OR ($epos == $data_lenght) OR !$this->isCharMode($chr, ENC_EDF)) {
887 if (($epos == $data_lenght) AND ($field_lenght < 3)) {
888 $enc = ENC_ASCII;
889 $cw[] = $this->getSwitchEncodingCodeword($enc);
890 ++$cw_num;
891 break;
892 }
893 if ($field_lenght < 4) {
894 // set unlatch character
895 $temp_cw[] = 0x1f;
896 ++$field_lenght;
897 // fill empty characters
898 for ($i = $field_lenght; $i < 4; ++$i) {
899 $temp_cw[] = 0;
900 }
901 $enc = ENC_ASCII;
902 $this->last_enc = $enc;
903 }
904 // encodes four data characters in three codewords
905 $tcw = (($temp_cw[0] & 0x3F) << 2) + (($temp_cw[1] & 0x30) >> 4);
906 if ($tcw > 0) {
907 $cw[] = $tcw;
908 $cw_num++;
909 }
910 $tcw= (($temp_cw[1] & 0x0F) << 4) + (($temp_cw[2] & 0x3C) >> 2);
911 if ($tcw > 0) {
912 $cw[] = $tcw;
913 $cw_num++;
914 }
915 $tcw = (($temp_cw[2] & 0x03) << 6) + ($temp_cw[3] & 0x3F);
916 if ($tcw > 0) {
917 $cw[] = $tcw;
918 $cw_num++;
919 }
920 $temp_cw = array();
921 $pos = $epos;
922 $field_lenght = 0;
923 if ($enc == ENC_ASCII) {
924 break; // exit from EDIFACT mode
925 }
926 }
927 } while ($epos < $data_lenght);
928 break;
929 }
930 case ENC_BASE256: { // G. While in Base 256 (B256) encodation
931 // initialize temporary array with 0 lenght
932 $temp_cw = array();
933 $field_lenght = 0;
934 while (($pos < $data_lenght) AND ($field_lenght <= 1555)) {
935 $newenc = $this->lookAheadTest($data, $pos, $enc);
936 if ($newenc != $enc) {
937 // 1. If the look-ahead test (starting at step J) indicates another mode, switch to that mode.
938 $enc = $newenc;
939 break; // exit from B256 mode
940 } else {
941 // 2. Otherwise, process the next character in Base 256 encodation.
942 $chr = ord($data[$pos]);
943 ++$pos;
944 $temp_cw[] = $chr;
945 ++$field_lenght;
946 }
947 }
948 // set field lenght
949 if ($field_lenght <= 249) {
950 $cw[] = $this->get255StateCodeword($field_lenght, ($cw_num + 1));
951 ++$cw_num;
952 } else {
953 $cw[] = $this->get255StateCodeword((floor($field_lenght / 250) + 249), ($cw_num + 1));
954 $cw[] = $this->get255StateCodeword(($field_lenght % 250), ($cw_num + 2));
955 $cw_num += 2;
956 }
957 if (!empty($temp_cw)) {
958 // add B256 field
959 foreach ($temp_cw as $p => $cht) {
960 $cw[] = $this->get255StateCodeword($cht, ($cw_num + $p + 1));
961 }
962 }
963 break;
964 }
965 } // end of switch enc
966 } // end of while
967 return $cw;
968 }
969
970 /**
971 * Places "chr+bit" with appropriate wrapping within array[].
972 * (Annex F - ECC 200 symbol character placement)
973 * @param $marr (array) Array of symbols.
974 * @param $nrow (int) Number of rows.
975 * @param $ncol (int) Number of columns.
976 * @param $row (int) Row number.
977 * @param $col (int) Column number.
978 * @param $chr (int) Char byte.
979 * @param $bit (int) Bit.
980 * @return array
981 * @protected
982 */
983 protected function placeModule($marr, $nrow, $ncol, $row, $col, $chr, $bit) {
984 if ($row < 0) {
985 $row += $nrow;
986 $col += (4 - (($nrow + 4) % 8));
987 }
988 if ($col < 0) {
989 $col += $ncol;
990 $row += (4 - (($ncol + 4) % 8));
991 }
992 $marr[(($row * $ncol) + $col)] = ((10 * $chr) + $bit);
993 return $marr;
994 }
995
996 /**
997 * Places the 8 bits of a utah-shaped symbol character.
998 * (Annex F - ECC 200 symbol character placement)
999 * @param $marr (array) Array of symbols.
1000 * @param $nrow (int) Number of rows.
1001 * @param $ncol (int) Number of columns.
1002 * @param $row (int) Row number.
1003 * @param $col (int) Column number.
1004 * @param $chr (int) Char byte.
1005 * @return array
1006 * @protected
1007 */
1008 protected function placeUtah($marr, $nrow, $ncol, $row, $col, $chr) {
1009 $marr = $this->placeModule($marr, $nrow, $ncol, $row-2, $col-2, $chr, 1);
1010 $marr = $this->placeModule($marr, $nrow, $ncol, $row-2, $col-1, $chr, 2);
1011 $marr = $this->placeModule($marr, $nrow, $ncol, $row-1, $col-2, $chr, 3);
1012 $marr = $this->placeModule($marr, $nrow, $ncol, $row-1, $col-1, $chr, 4);
1013 $marr = $this->placeModule($marr, $nrow, $ncol, $row-1, $col, $chr, 5);
1014 $marr = $this->placeModule($marr, $nrow, $ncol, $row, $col-2, $chr, 6);
1015 $marr = $this->placeModule($marr, $nrow, $ncol, $row, $col-1, $chr, 7);
1016 $marr = $this->placeModule($marr, $nrow, $ncol, $row, $col, $chr, 8);
1017 return $marr;
1018 }
1019
1020 /**
1021 * Places the 8 bits of the first special corner case.
1022 * (Annex F - ECC 200 symbol character placement)
1023 * @param $marr (array) Array of symbols.
1024 * @param $nrow (int) Number of rows.
1025 * @param $ncol (int) Number of columns.
1026 * @param $chr (int) Char byte.
1027 * @return array
1028 * @protected
1029 */
1030 protected function placeCornerA($marr, $nrow, $ncol, $chr) {
1031 $marr = $this->placeModule($marr, $nrow, $ncol, $nrow-1, 0, $chr, 1);
1032 $marr = $this->placeModule($marr, $nrow, $ncol, $nrow-1, 1, $chr, 2);
1033 $marr = $this->placeModule($marr, $nrow, $ncol, $nrow-1, 2, $chr, 3);
1034 $marr = $this->placeModule($marr, $nrow, $ncol, 0, $ncol-2, $chr, 4);
1035 $marr = $this->placeModule($marr, $nrow, $ncol, 0, $ncol-1, $chr, 5);
1036 $marr = $this->placeModule($marr, $nrow, $ncol, 1, $ncol-1, $chr, 6);
1037 $marr = $this->placeModule($marr, $nrow, $ncol, 2, $ncol-1, $chr, 7);
1038 $marr = $this->placeModule($marr, $nrow, $ncol, 3, $ncol-1, $chr, 8);
1039 return $marr;
1040 }
1041
1042 /**
1043 * Places the 8 bits of the second special corner case.
1044 * (Annex F - ECC 200 symbol character placement)
1045 * @param $marr (array) Array of symbols.
1046 * @param $nrow (int) Number of rows.
1047 * @param $ncol (int) Number of columns.
1048 * @param $chr (int) Char byte.
1049 * @return array
1050 * @protected
1051 */
1052 protected function placeCornerB($marr, $nrow, $ncol, $chr) {
1053 $marr = $this->placeModule($marr, $nrow, $ncol, $nrow-3, 0, $chr, 1);
1054 $marr = $this->placeModule($marr, $nrow, $ncol, $nrow-2, 0, $chr, 2);
1055 $marr = $this->placeModule($marr, $nrow, $ncol, $nrow-1, 0, $chr, 3);
1056 $marr = $this->placeModule($marr, $nrow, $ncol, 0, $ncol-4, $chr, 4);
1057 $marr = $this->placeModule($marr, $nrow, $ncol, 0, $ncol-3, $chr, 5);
1058 $marr = $this->placeModule($marr, $nrow, $ncol, 0, $ncol-2, $chr, 6);
1059 $marr = $this->placeModule($marr, $nrow, $ncol, 0, $ncol-1, $chr, 7);
1060 $marr = $this->placeModule($marr, $nrow, $ncol, 1, $ncol-1, $chr, 8);
1061 return $marr;
1062 }
1063
1064 /**
1065 * Places the 8 bits of the third special corner case.
1066 * (Annex F - ECC 200 symbol character placement)
1067 * @param $marr (array) Array of symbols.
1068 * @param $nrow (int) Number of rows.
1069 * @param $ncol (int) Number of columns.
1070 * @param $chr (int) Char byte.
1071 * @return array
1072 * @protected
1073 */
1074 protected function placeCornerC($marr, $nrow, $ncol, $chr) {
1075 $marr = $this->placeModule($marr, $nrow, $ncol, $nrow-3, 0, $chr, 1);
1076 $marr = $this->placeModule($marr, $nrow, $ncol, $nrow-2, 0, $chr, 2);
1077 $marr = $this->placeModule($marr, $nrow, $ncol, $nrow-1, 0, $chr, 3);
1078 $marr = $this->placeModule($marr, $nrow, $ncol, 0, $ncol-2, $chr, 4);
1079 $marr = $this->placeModule($marr, $nrow, $ncol, 0, $ncol-1, $chr, 5);
1080 $marr = $this->placeModule($marr, $nrow, $ncol, 1, $ncol-1, $chr, 6);
1081 $marr = $this->placeModule($marr, $nrow, $ncol, 2, $ncol-1, $chr, 7);
1082 $marr = $this->placeModule($marr, $nrow, $ncol, 3, $ncol-1, $chr, 8);
1083 return $marr;
1084 }
1085
1086 /**
1087 * Places the 8 bits of the fourth special corner case.
1088 * (Annex F - ECC 200 symbol character placement)
1089 * @param $marr (array) Array of symbols.
1090 * @param $nrow (int) Number of rows.
1091 * @param $ncol (int) Number of columns.
1092 * @param $chr (int) Char byte.
1093 * @return array
1094 * @protected
1095 */
1096 protected function placeCornerD($marr, $nrow, $ncol, $chr) {
1097 $marr = $this->placeModule($marr, $nrow, $ncol, $nrow-1, 0, $chr, 1);
1098 $marr = $this->placeModule($marr, $nrow, $ncol, $nrow-1, $ncol-1, $chr, 2);
1099 $marr = $this->placeModule($marr, $nrow, $ncol, 0, $ncol-3, $chr, 3);
1100 $marr = $this->placeModule($marr, $nrow, $ncol, 0, $ncol-2, $chr, 4);
1101 $marr = $this->placeModule($marr, $nrow, $ncol, 0, $ncol-1, $chr, 5);
1102 $marr = $this->placeModule($marr, $nrow, $ncol, 1, $ncol-3, $chr, 6);
1103 $marr = $this->placeModule($marr, $nrow, $ncol, 1, $ncol-2, $chr, 7);
1104 $marr = $this->placeModule($marr, $nrow, $ncol, 1, $ncol-1, $chr, 8);
1105 return $marr;
1106 }
1107
1108 /**
1109 * Build a placement map.
1110 * (Annex F - ECC 200 symbol character placement)
1111 * @param $nrow (int) Number of rows.
1112 * @param $ncol (int) Number of columns.
1113 * @return array
1114 * @protected
1115 */
1116 protected function getPlacementMap($nrow, $ncol) {
1117 // initialize array with zeros
1118 $marr = array_fill(0, ($nrow * $ncol), 0);
1119 // set starting values
1120 $chr = 1;
1121 $row = 4;
1122 $col = 0;
1123 do {
1124 // repeatedly first check for one of the special corner cases, then
1125 if (($row == $nrow) AND ($col == 0)) {
1126 $marr = $this->placeCornerA($marr, $nrow, $ncol, $chr);
1127 ++$chr;
1128 }
1129 if (($row == ($nrow - 2)) AND ($col == 0) AND ($ncol % 4)) {
1130 $marr = $this->placeCornerB($marr, $nrow, $ncol, $chr);
1131 ++$chr;
1132 }
1133 if (($row == ($nrow - 2)) AND ($col == 0) AND (($ncol % 8) == 4)) {
1134 $marr = $this->placeCornerC($marr, $nrow, $ncol, $chr);
1135 ++$chr;
1136 }
1137 if (($row == ($nrow + 4)) AND ($col == 2) AND (!($ncol % 8))) {
1138 $marr = $this->placeCornerD($marr, $nrow, $ncol, $chr);
1139 ++$chr;
1140 }
1141 // sweep upward diagonally, inserting successive characters,
1142 do {
1143 if (($row < $nrow) AND ($col >= 0) AND (!$marr[(($row * $ncol) + $col)])) {
1144 $marr = $this->placeUtah($marr, $nrow, $ncol, $row, $col, $chr);
1145 ++$chr;
1146 }
1147 $row -= 2;
1148 $col += 2;
1149 } while (($row >= 0) AND ($col < $ncol));
1150 ++$row;
1151 $col += 3;
1152 // & then sweep downward diagonally, inserting successive characters,...
1153 do {
1154 if (($row >= 0) AND ($col < $ncol) AND (!$marr[(($row * $ncol) + $col)])) {
1155 $marr = $this->placeUtah($marr, $nrow, $ncol, $row, $col, $chr);
1156 ++$chr;
1157 }
1158 $row += 2;
1159 $col -= 2;
1160 } while (($row < $nrow) AND ($col >= 0));
1161 $row += 3;
1162 ++$col;
1163 // ... until the entire array is scanned
1164 } while (($row < $nrow) OR ($col < $ncol));
1165 // lastly, if the lower righthand corner is untouched, fill in fixed pattern
1166 if (!$marr[(($nrow * $ncol) - 1)]) {
1167 $marr[(($nrow * $ncol) - 1)] = 1;
1168 $marr[(($nrow * $ncol) - $ncol - 2)] = 1;
1169 }
1170 return $marr;
1171 }
1172
1173} // end DataMatrix class
1174//============================================================+
1175// END OF FILE
1176//============================================================+
diff --git a/inc/3rdparty/libraries/tcpdf/include/barcodes/pdf417.php b/inc/3rdparty/libraries/tcpdf/include/barcodes/pdf417.php
new file mode 100644
index 00000000..07b36b90
--- /dev/null
+++ b/inc/3rdparty/libraries/tcpdf/include/barcodes/pdf417.php
@@ -0,0 +1,996 @@
1<?php
2//============================================================+
3// File name : pdf417.php
4// Version : 1.0.005
5// Begin : 2010-06-03
6// Last Update : 2014-04-25
7// Author : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
8// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
9// -------------------------------------------------------------------
10// Copyright (C) 2010-2013 Nicola Asuni - Tecnick.com LTD
11//
12// This file is part of TCPDF software library.
13//
14// TCPDF is free software: you can redistribute it and/or modify it
15// under the terms of the GNU Lesser General Public License as
16// published by the Free Software Foundation, either version 3 of the
17// License, or (at your option) any later version.
18//
19// TCPDF is distributed in the hope that it will be useful, but
20// WITHOUT ANY WARRANTY; without even the implied warranty of
21// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
22// See the GNU Lesser General Public License for more details.
23//
24// You should have received a copy of the GNU Lesser General Public License
25// along with TCPDF. If not, see <http://www.gnu.org/licenses/>.
26//
27// See LICENSE.TXT file for more information.
28// -------------------------------------------------------------------
29//
30// DESCRIPTION :
31//
32// Class to create PDF417 barcode arrays for TCPDF class.
33// PDF417 (ISO/IEC 15438:2006) is a 2-dimensional stacked bar code created by Symbol Technologies in 1991.
34// It is one of the most popular 2D codes because of its ability to be read with slightly modified handheld laser or linear CCD scanners.
35// TECHNICAL DATA / FEATURES OF PDF417:
36// Encodable Character Set: All 128 ASCII Characters (including extended)
37// Code Type: Continuous, Multi-Row
38// Symbol Height: 3 - 90 Rows
39// Symbol Width: 90X - 583X
40// Bidirectional Decoding: Yes
41// Error Correction Characters: 2 - 512
42// Maximum Data Characters: 1850 text, 2710 digits, 1108 bytes
43//
44//============================================================+
45
46/**
47 * @file
48 * Class to create PDF417 barcode arrays for TCPDF class.
49 * PDF417 (ISO/IEC 15438:2006) is a 2-dimensional stacked bar code created by Symbol Technologies in 1991.
50 * (requires PHP bcmath extension)
51 * @package com.tecnick.tcpdf
52 * @author Nicola Asuni
53 * @version 1.0.005
54 */
55
56// definitions
57if (!defined('PDF417DEFS')) {
58
59 /**
60 * Indicate that definitions for this class are set
61 */
62 define('PDF417DEFS', true);
63
64 // -----------------------------------------------------
65
66 /**
67 * Row height respect X dimension of single module
68 */
69 define('ROWHEIGHT', 4);
70
71 /**
72 * Horizontal quiet zone in modules
73 */
74 define('QUIETH', 2);
75
76 /**
77 * Vertical quiet zone in modules
78 */
79 define('QUIETV', 2);
80
81} // end of definitions
82
83// #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#
84
85/**
86 * @class PDF417
87 * Class to create PDF417 barcode arrays for TCPDF class.
88 * PDF417 (ISO/IEC 15438:2006) is a 2-dimensional stacked bar code created by Symbol Technologies in 1991.
89 * @package com.tecnick.tcpdf
90 * @author Nicola Asuni
91 * @version 1.0.003
92 */
93class PDF417 {
94
95 /**
96 * Barcode array to be returned which is readable by TCPDF.
97 * @protected
98 */
99 protected $barcode_array = array();
100
101 /**
102 * Start pattern.
103 * @protected
104 */
105 protected $start_pattern = '11111111010101000';
106
107 /**
108 * Stop pattern.
109 * @protected
110 */
111 protected $stop_pattern = '111111101000101001';
112
113 /**
114 * Array of text Compaction Sub-Modes (values 0xFB - 0xFF are used for submode changers).
115 * @protected
116 */
117 protected $textsubmodes = array(
118 array(0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x20,0xFD,0xFE,0xFF), // Alpha
119 array(0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x20,0xFD,0xFE,0xFF), // Lower
120 array(0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x26,0x0d,0x09,0x2c,0x3a,0x23,0x2d,0x2e,0x24,0x2f,0x2b,0x25,0x2a,0x3d,0x5e,0xFB,0x20,0xFD,0xFE,0xFF), // Mixed
121 array(0x3b,0x3c,0x3e,0x40,0x5b,0x5c,0x5d,0x5f,0x60,0x7e,0x21,0x0d,0x09,0x2c,0x3a,0x0a,0x2d,0x2e,0x24,0x2f,0x22,0x7c,0x2a,0x28,0x29,0x3f,0x7b,0x7d,0x27,0xFF) // Puntuaction
122 );
123
124 /**
125 * Array of switching codes for Text Compaction Sub-Modes.
126 * @protected
127 */
128 protected $textlatch = array(
129 '01' => array(27), '02' => array(28), '03' => array(28,25), //
130 '10' => array(28,28), '12' => array(28), '13' => array(28,25), //
131 '20' => array(28), '21' => array(27), '23' => array(25), //
132 '30' => array(29), '31' => array(29,27), '32' => array(29,28) //
133 );
134
135 /**
136 * Clusters of codewords (0, 3, 6)<br/>
137 * Values are hex equivalents of binary representation of bars (1 = bar, 0 = space).<br/>
138 * The codewords numbered from 900 to 928 have special meaning, some enable to switch between modes in order to optimise the code:<ul>
139 * <li>900 : Switch to "Text" mode</li>
140 * <li>901 : Switch to "Byte" mode</li>
141 * <li>902 : Switch to "Numeric" mode</li>
142 * <li>903 - 912 : Reserved</li>
143 * <li>913 : Switch to "Octet" only for the next codeword</li>
144 * <li>914 - 920 : Reserved</li>
145 * <li>921 : Initialization</li>
146 * <li>922 : Terminator codeword for Macro PDF control block</li>
147 * <li>923 : Sequence tag to identify the beginning of optional fields in the Macro PDF control block</li>
148 * <li>924 : Switch to "Byte" mode (If the total number of byte is multiple of 6)</li>
149 * <li>925 : Identifier for a user defined Extended Channel Interpretation (ECI)</li>
150 * <li>926 : Identifier for a general purpose ECI format</li>
151 * <li>927 : Identifier for an ECI of a character set or code page</li>
152 * <li>928 : Macro marker codeword to indicate the beginning of a Macro PDF Control Block</li>
153 * </ul>
154 * @protected
155 */
156 protected $clusters = array(
157 array( // cluster 0 -----------------------------------------------------------------------
158 0x1d5c0,0x1eaf0,0x1f57c,0x1d4e0,0x1ea78,0x1f53e,0x1a8c0,0x1d470,0x1a860,0x15040, // 10
159 0x1a830,0x15020,0x1adc0,0x1d6f0,0x1eb7c,0x1ace0,0x1d678,0x1eb3e,0x158c0,0x1ac70, // 20
160 0x15860,0x15dc0,0x1aef0,0x1d77c,0x15ce0,0x1ae78,0x1d73e,0x15c70,0x1ae3c,0x15ef0, // 30
161 0x1af7c,0x15e78,0x1af3e,0x15f7c,0x1f5fa,0x1d2e0,0x1e978,0x1f4be,0x1a4c0,0x1d270, // 40
162 0x1e93c,0x1a460,0x1d238,0x14840,0x1a430,0x1d21c,0x14820,0x1a418,0x14810,0x1a6e0, // 50
163 0x1d378,0x1e9be,0x14cc0,0x1a670,0x1d33c,0x14c60,0x1a638,0x1d31e,0x14c30,0x1a61c, // 60
164 0x14ee0,0x1a778,0x1d3be,0x14e70,0x1a73c,0x14e38,0x1a71e,0x14f78,0x1a7be,0x14f3c, // 70
165 0x14f1e,0x1a2c0,0x1d170,0x1e8bc,0x1a260,0x1d138,0x1e89e,0x14440,0x1a230,0x1d11c, // 80
166 0x14420,0x1a218,0x14410,0x14408,0x146c0,0x1a370,0x1d1bc,0x14660,0x1a338,0x1d19e, // 90
167 0x14630,0x1a31c,0x14618,0x1460c,0x14770,0x1a3bc,0x14738,0x1a39e,0x1471c,0x147bc, // 100
168 0x1a160,0x1d0b8,0x1e85e,0x14240,0x1a130,0x1d09c,0x14220,0x1a118,0x1d08e,0x14210, // 110
169 0x1a10c,0x14208,0x1a106,0x14360,0x1a1b8,0x1d0de,0x14330,0x1a19c,0x14318,0x1a18e, // 120
170 0x1430c,0x14306,0x1a1de,0x1438e,0x14140,0x1a0b0,0x1d05c,0x14120,0x1a098,0x1d04e, // 130
171 0x14110,0x1a08c,0x14108,0x1a086,0x14104,0x141b0,0x14198,0x1418c,0x140a0,0x1d02e, // 140
172 0x1a04c,0x1a046,0x14082,0x1cae0,0x1e578,0x1f2be,0x194c0,0x1ca70,0x1e53c,0x19460, // 150
173 0x1ca38,0x1e51e,0x12840,0x19430,0x12820,0x196e0,0x1cb78,0x1e5be,0x12cc0,0x19670, // 160
174 0x1cb3c,0x12c60,0x19638,0x12c30,0x12c18,0x12ee0,0x19778,0x1cbbe,0x12e70,0x1973c, // 170
175 0x12e38,0x12e1c,0x12f78,0x197be,0x12f3c,0x12fbe,0x1dac0,0x1ed70,0x1f6bc,0x1da60, // 180
176 0x1ed38,0x1f69e,0x1b440,0x1da30,0x1ed1c,0x1b420,0x1da18,0x1ed0e,0x1b410,0x1da0c, // 190
177 0x192c0,0x1c970,0x1e4bc,0x1b6c0,0x19260,0x1c938,0x1e49e,0x1b660,0x1db38,0x1ed9e, // 200
178 0x16c40,0x12420,0x19218,0x1c90e,0x16c20,0x1b618,0x16c10,0x126c0,0x19370,0x1c9bc, // 210
179 0x16ec0,0x12660,0x19338,0x1c99e,0x16e60,0x1b738,0x1db9e,0x16e30,0x12618,0x16e18, // 220
180 0x12770,0x193bc,0x16f70,0x12738,0x1939e,0x16f38,0x1b79e,0x16f1c,0x127bc,0x16fbc, // 230
181 0x1279e,0x16f9e,0x1d960,0x1ecb8,0x1f65e,0x1b240,0x1d930,0x1ec9c,0x1b220,0x1d918, // 240
182 0x1ec8e,0x1b210,0x1d90c,0x1b208,0x1b204,0x19160,0x1c8b8,0x1e45e,0x1b360,0x19130, // 250
183 0x1c89c,0x16640,0x12220,0x1d99c,0x1c88e,0x16620,0x12210,0x1910c,0x16610,0x1b30c, // 260
184 0x19106,0x12204,0x12360,0x191b8,0x1c8de,0x16760,0x12330,0x1919c,0x16730,0x1b39c, // 270
185 0x1918e,0x16718,0x1230c,0x12306,0x123b8,0x191de,0x167b8,0x1239c,0x1679c,0x1238e, // 280
186 0x1678e,0x167de,0x1b140,0x1d8b0,0x1ec5c,0x1b120,0x1d898,0x1ec4e,0x1b110,0x1d88c, // 290
187 0x1b108,0x1d886,0x1b104,0x1b102,0x12140,0x190b0,0x1c85c,0x16340,0x12120,0x19098, // 300
188 0x1c84e,0x16320,0x1b198,0x1d8ce,0x16310,0x12108,0x19086,0x16308,0x1b186,0x16304, // 310
189 0x121b0,0x190dc,0x163b0,0x12198,0x190ce,0x16398,0x1b1ce,0x1638c,0x12186,0x16386, // 320
190 0x163dc,0x163ce,0x1b0a0,0x1d858,0x1ec2e,0x1b090,0x1d84c,0x1b088,0x1d846,0x1b084, // 330
191 0x1b082,0x120a0,0x19058,0x1c82e,0x161a0,0x12090,0x1904c,0x16190,0x1b0cc,0x19046, // 340
192 0x16188,0x12084,0x16184,0x12082,0x120d8,0x161d8,0x161cc,0x161c6,0x1d82c,0x1d826, // 350
193 0x1b042,0x1902c,0x12048,0x160c8,0x160c4,0x160c2,0x18ac0,0x1c570,0x1e2bc,0x18a60, // 360
194 0x1c538,0x11440,0x18a30,0x1c51c,0x11420,0x18a18,0x11410,0x11408,0x116c0,0x18b70, // 370
195 0x1c5bc,0x11660,0x18b38,0x1c59e,0x11630,0x18b1c,0x11618,0x1160c,0x11770,0x18bbc, // 380
196 0x11738,0x18b9e,0x1171c,0x117bc,0x1179e,0x1cd60,0x1e6b8,0x1f35e,0x19a40,0x1cd30, // 390
197 0x1e69c,0x19a20,0x1cd18,0x1e68e,0x19a10,0x1cd0c,0x19a08,0x1cd06,0x18960,0x1c4b8, // 400
198 0x1e25e,0x19b60,0x18930,0x1c49c,0x13640,0x11220,0x1cd9c,0x1c48e,0x13620,0x19b18, // 410
199 0x1890c,0x13610,0x11208,0x13608,0x11360,0x189b8,0x1c4de,0x13760,0x11330,0x1cdde, // 420
200 0x13730,0x19b9c,0x1898e,0x13718,0x1130c,0x1370c,0x113b8,0x189de,0x137b8,0x1139c, // 430
201 0x1379c,0x1138e,0x113de,0x137de,0x1dd40,0x1eeb0,0x1f75c,0x1dd20,0x1ee98,0x1f74e, // 440
202 0x1dd10,0x1ee8c,0x1dd08,0x1ee86,0x1dd04,0x19940,0x1ccb0,0x1e65c,0x1bb40,0x19920, // 450
203 0x1eedc,0x1e64e,0x1bb20,0x1dd98,0x1eece,0x1bb10,0x19908,0x1cc86,0x1bb08,0x1dd86, // 460
204 0x19902,0x11140,0x188b0,0x1c45c,0x13340,0x11120,0x18898,0x1c44e,0x17740,0x13320, // 470
205 0x19998,0x1ccce,0x17720,0x1bb98,0x1ddce,0x18886,0x17710,0x13308,0x19986,0x17708, // 480
206 0x11102,0x111b0,0x188dc,0x133b0,0x11198,0x188ce,0x177b0,0x13398,0x199ce,0x17798, // 490
207 0x1bbce,0x11186,0x13386,0x111dc,0x133dc,0x111ce,0x177dc,0x133ce,0x1dca0,0x1ee58, // 500
208 0x1f72e,0x1dc90,0x1ee4c,0x1dc88,0x1ee46,0x1dc84,0x1dc82,0x198a0,0x1cc58,0x1e62e, // 510
209 0x1b9a0,0x19890,0x1ee6e,0x1b990,0x1dccc,0x1cc46,0x1b988,0x19884,0x1b984,0x19882, // 520
210 0x1b982,0x110a0,0x18858,0x1c42e,0x131a0,0x11090,0x1884c,0x173a0,0x13190,0x198cc, // 530
211 0x18846,0x17390,0x1b9cc,0x11084,0x17388,0x13184,0x11082,0x13182,0x110d8,0x1886e, // 540
212 0x131d8,0x110cc,0x173d8,0x131cc,0x110c6,0x173cc,0x131c6,0x110ee,0x173ee,0x1dc50, // 550
213 0x1ee2c,0x1dc48,0x1ee26,0x1dc44,0x1dc42,0x19850,0x1cc2c,0x1b8d0,0x19848,0x1cc26, // 560
214 0x1b8c8,0x1dc66,0x1b8c4,0x19842,0x1b8c2,0x11050,0x1882c,0x130d0,0x11048,0x18826, // 570
215 0x171d0,0x130c8,0x19866,0x171c8,0x1b8e6,0x11042,0x171c4,0x130c2,0x171c2,0x130ec, // 580
216 0x171ec,0x171e6,0x1ee16,0x1dc22,0x1cc16,0x19824,0x19822,0x11028,0x13068,0x170e8, // 590
217 0x11022,0x13062,0x18560,0x10a40,0x18530,0x10a20,0x18518,0x1c28e,0x10a10,0x1850c, // 600
218 0x10a08,0x18506,0x10b60,0x185b8,0x1c2de,0x10b30,0x1859c,0x10b18,0x1858e,0x10b0c, // 610
219 0x10b06,0x10bb8,0x185de,0x10b9c,0x10b8e,0x10bde,0x18d40,0x1c6b0,0x1e35c,0x18d20, // 620
220 0x1c698,0x18d10,0x1c68c,0x18d08,0x1c686,0x18d04,0x10940,0x184b0,0x1c25c,0x11b40, // 630
221 0x10920,0x1c6dc,0x1c24e,0x11b20,0x18d98,0x1c6ce,0x11b10,0x10908,0x18486,0x11b08, // 640
222 0x18d86,0x10902,0x109b0,0x184dc,0x11bb0,0x10998,0x184ce,0x11b98,0x18dce,0x11b8c, // 650
223 0x10986,0x109dc,0x11bdc,0x109ce,0x11bce,0x1cea0,0x1e758,0x1f3ae,0x1ce90,0x1e74c, // 660
224 0x1ce88,0x1e746,0x1ce84,0x1ce82,0x18ca0,0x1c658,0x19da0,0x18c90,0x1c64c,0x19d90, // 670
225 0x1cecc,0x1c646,0x19d88,0x18c84,0x19d84,0x18c82,0x19d82,0x108a0,0x18458,0x119a0, // 680
226 0x10890,0x1c66e,0x13ba0,0x11990,0x18ccc,0x18446,0x13b90,0x19dcc,0x10884,0x13b88, // 690
227 0x11984,0x10882,0x11982,0x108d8,0x1846e,0x119d8,0x108cc,0x13bd8,0x119cc,0x108c6, // 700
228 0x13bcc,0x119c6,0x108ee,0x119ee,0x13bee,0x1ef50,0x1f7ac,0x1ef48,0x1f7a6,0x1ef44, // 710
229 0x1ef42,0x1ce50,0x1e72c,0x1ded0,0x1ef6c,0x1e726,0x1dec8,0x1ef66,0x1dec4,0x1ce42, // 720
230 0x1dec2,0x18c50,0x1c62c,0x19cd0,0x18c48,0x1c626,0x1bdd0,0x19cc8,0x1ce66,0x1bdc8, // 730
231 0x1dee6,0x18c42,0x1bdc4,0x19cc2,0x1bdc2,0x10850,0x1842c,0x118d0,0x10848,0x18426, // 740
232 0x139d0,0x118c8,0x18c66,0x17bd0,0x139c8,0x19ce6,0x10842,0x17bc8,0x1bde6,0x118c2, // 750
233 0x17bc4,0x1086c,0x118ec,0x10866,0x139ec,0x118e6,0x17bec,0x139e6,0x17be6,0x1ef28, // 760
234 0x1f796,0x1ef24,0x1ef22,0x1ce28,0x1e716,0x1de68,0x1ef36,0x1de64,0x1ce22,0x1de62, // 770
235 0x18c28,0x1c616,0x19c68,0x18c24,0x1bce8,0x19c64,0x18c22,0x1bce4,0x19c62,0x1bce2, // 780
236 0x10828,0x18416,0x11868,0x18c36,0x138e8,0x11864,0x10822,0x179e8,0x138e4,0x11862, // 790
237 0x179e4,0x138e2,0x179e2,0x11876,0x179f6,0x1ef12,0x1de34,0x1de32,0x19c34,0x1bc74, // 800
238 0x1bc72,0x11834,0x13874,0x178f4,0x178f2,0x10540,0x10520,0x18298,0x10510,0x10508, // 810
239 0x10504,0x105b0,0x10598,0x1058c,0x10586,0x105dc,0x105ce,0x186a0,0x18690,0x1c34c, // 820
240 0x18688,0x1c346,0x18684,0x18682,0x104a0,0x18258,0x10da0,0x186d8,0x1824c,0x10d90, // 830
241 0x186cc,0x10d88,0x186c6,0x10d84,0x10482,0x10d82,0x104d8,0x1826e,0x10dd8,0x186ee, // 840
242 0x10dcc,0x104c6,0x10dc6,0x104ee,0x10dee,0x1c750,0x1c748,0x1c744,0x1c742,0x18650, // 850
243 0x18ed0,0x1c76c,0x1c326,0x18ec8,0x1c766,0x18ec4,0x18642,0x18ec2,0x10450,0x10cd0, // 860
244 0x10448,0x18226,0x11dd0,0x10cc8,0x10444,0x11dc8,0x10cc4,0x10442,0x11dc4,0x10cc2, // 870
245 0x1046c,0x10cec,0x10466,0x11dec,0x10ce6,0x11de6,0x1e7a8,0x1e7a4,0x1e7a2,0x1c728, // 880
246 0x1cf68,0x1e7b6,0x1cf64,0x1c722,0x1cf62,0x18628,0x1c316,0x18e68,0x1c736,0x19ee8, // 890
247 0x18e64,0x18622,0x19ee4,0x18e62,0x19ee2,0x10428,0x18216,0x10c68,0x18636,0x11ce8, // 900
248 0x10c64,0x10422,0x13de8,0x11ce4,0x10c62,0x13de4,0x11ce2,0x10436,0x10c76,0x11cf6, // 910
249 0x13df6,0x1f7d4,0x1f7d2,0x1e794,0x1efb4,0x1e792,0x1efb2,0x1c714,0x1cf34,0x1c712, // 920
250 0x1df74,0x1cf32,0x1df72,0x18614,0x18e34,0x18612,0x19e74,0x18e32,0x1bef4), // 929
251 array( // cluster 3 -----------------------------------------------------------------------
252 0x1f560,0x1fab8,0x1ea40,0x1f530,0x1fa9c,0x1ea20,0x1f518,0x1fa8e,0x1ea10,0x1f50c, // 10
253 0x1ea08,0x1f506,0x1ea04,0x1eb60,0x1f5b8,0x1fade,0x1d640,0x1eb30,0x1f59c,0x1d620, // 20
254 0x1eb18,0x1f58e,0x1d610,0x1eb0c,0x1d608,0x1eb06,0x1d604,0x1d760,0x1ebb8,0x1f5de, // 30
255 0x1ae40,0x1d730,0x1eb9c,0x1ae20,0x1d718,0x1eb8e,0x1ae10,0x1d70c,0x1ae08,0x1d706, // 40
256 0x1ae04,0x1af60,0x1d7b8,0x1ebde,0x15e40,0x1af30,0x1d79c,0x15e20,0x1af18,0x1d78e, // 50
257 0x15e10,0x1af0c,0x15e08,0x1af06,0x15f60,0x1afb8,0x1d7de,0x15f30,0x1af9c,0x15f18, // 60
258 0x1af8e,0x15f0c,0x15fb8,0x1afde,0x15f9c,0x15f8e,0x1e940,0x1f4b0,0x1fa5c,0x1e920, // 70
259 0x1f498,0x1fa4e,0x1e910,0x1f48c,0x1e908,0x1f486,0x1e904,0x1e902,0x1d340,0x1e9b0, // 80
260 0x1f4dc,0x1d320,0x1e998,0x1f4ce,0x1d310,0x1e98c,0x1d308,0x1e986,0x1d304,0x1d302, // 90
261 0x1a740,0x1d3b0,0x1e9dc,0x1a720,0x1d398,0x1e9ce,0x1a710,0x1d38c,0x1a708,0x1d386, // 100
262 0x1a704,0x1a702,0x14f40,0x1a7b0,0x1d3dc,0x14f20,0x1a798,0x1d3ce,0x14f10,0x1a78c, // 110
263 0x14f08,0x1a786,0x14f04,0x14fb0,0x1a7dc,0x14f98,0x1a7ce,0x14f8c,0x14f86,0x14fdc, // 120
264 0x14fce,0x1e8a0,0x1f458,0x1fa2e,0x1e890,0x1f44c,0x1e888,0x1f446,0x1e884,0x1e882, // 130
265 0x1d1a0,0x1e8d8,0x1f46e,0x1d190,0x1e8cc,0x1d188,0x1e8c6,0x1d184,0x1d182,0x1a3a0, // 140
266 0x1d1d8,0x1e8ee,0x1a390,0x1d1cc,0x1a388,0x1d1c6,0x1a384,0x1a382,0x147a0,0x1a3d8, // 150
267 0x1d1ee,0x14790,0x1a3cc,0x14788,0x1a3c6,0x14784,0x14782,0x147d8,0x1a3ee,0x147cc, // 160
268 0x147c6,0x147ee,0x1e850,0x1f42c,0x1e848,0x1f426,0x1e844,0x1e842,0x1d0d0,0x1e86c, // 170
269 0x1d0c8,0x1e866,0x1d0c4,0x1d0c2,0x1a1d0,0x1d0ec,0x1a1c8,0x1d0e6,0x1a1c4,0x1a1c2, // 180
270 0x143d0,0x1a1ec,0x143c8,0x1a1e6,0x143c4,0x143c2,0x143ec,0x143e6,0x1e828,0x1f416, // 190
271 0x1e824,0x1e822,0x1d068,0x1e836,0x1d064,0x1d062,0x1a0e8,0x1d076,0x1a0e4,0x1a0e2, // 200
272 0x141e8,0x1a0f6,0x141e4,0x141e2,0x1e814,0x1e812,0x1d034,0x1d032,0x1a074,0x1a072, // 210
273 0x1e540,0x1f2b0,0x1f95c,0x1e520,0x1f298,0x1f94e,0x1e510,0x1f28c,0x1e508,0x1f286, // 220
274 0x1e504,0x1e502,0x1cb40,0x1e5b0,0x1f2dc,0x1cb20,0x1e598,0x1f2ce,0x1cb10,0x1e58c, // 230
275 0x1cb08,0x1e586,0x1cb04,0x1cb02,0x19740,0x1cbb0,0x1e5dc,0x19720,0x1cb98,0x1e5ce, // 240
276 0x19710,0x1cb8c,0x19708,0x1cb86,0x19704,0x19702,0x12f40,0x197b0,0x1cbdc,0x12f20, // 250
277 0x19798,0x1cbce,0x12f10,0x1978c,0x12f08,0x19786,0x12f04,0x12fb0,0x197dc,0x12f98, // 260
278 0x197ce,0x12f8c,0x12f86,0x12fdc,0x12fce,0x1f6a0,0x1fb58,0x16bf0,0x1f690,0x1fb4c, // 270
279 0x169f8,0x1f688,0x1fb46,0x168fc,0x1f684,0x1f682,0x1e4a0,0x1f258,0x1f92e,0x1eda0, // 280
280 0x1e490,0x1fb6e,0x1ed90,0x1f6cc,0x1f246,0x1ed88,0x1e484,0x1ed84,0x1e482,0x1ed82, // 290
281 0x1c9a0,0x1e4d8,0x1f26e,0x1dba0,0x1c990,0x1e4cc,0x1db90,0x1edcc,0x1e4c6,0x1db88, // 300
282 0x1c984,0x1db84,0x1c982,0x1db82,0x193a0,0x1c9d8,0x1e4ee,0x1b7a0,0x19390,0x1c9cc, // 310
283 0x1b790,0x1dbcc,0x1c9c6,0x1b788,0x19384,0x1b784,0x19382,0x1b782,0x127a0,0x193d8, // 320
284 0x1c9ee,0x16fa0,0x12790,0x193cc,0x16f90,0x1b7cc,0x193c6,0x16f88,0x12784,0x16f84, // 330
285 0x12782,0x127d8,0x193ee,0x16fd8,0x127cc,0x16fcc,0x127c6,0x16fc6,0x127ee,0x1f650, // 340
286 0x1fb2c,0x165f8,0x1f648,0x1fb26,0x164fc,0x1f644,0x1647e,0x1f642,0x1e450,0x1f22c, // 350
287 0x1ecd0,0x1e448,0x1f226,0x1ecc8,0x1f666,0x1ecc4,0x1e442,0x1ecc2,0x1c8d0,0x1e46c, // 360
288 0x1d9d0,0x1c8c8,0x1e466,0x1d9c8,0x1ece6,0x1d9c4,0x1c8c2,0x1d9c2,0x191d0,0x1c8ec, // 370
289 0x1b3d0,0x191c8,0x1c8e6,0x1b3c8,0x1d9e6,0x1b3c4,0x191c2,0x1b3c2,0x123d0,0x191ec, // 380
290 0x167d0,0x123c8,0x191e6,0x167c8,0x1b3e6,0x167c4,0x123c2,0x167c2,0x123ec,0x167ec, // 390
291 0x123e6,0x167e6,0x1f628,0x1fb16,0x162fc,0x1f624,0x1627e,0x1f622,0x1e428,0x1f216, // 400
292 0x1ec68,0x1f636,0x1ec64,0x1e422,0x1ec62,0x1c868,0x1e436,0x1d8e8,0x1c864,0x1d8e4, // 410
293 0x1c862,0x1d8e2,0x190e8,0x1c876,0x1b1e8,0x1d8f6,0x1b1e4,0x190e2,0x1b1e2,0x121e8, // 420
294 0x190f6,0x163e8,0x121e4,0x163e4,0x121e2,0x163e2,0x121f6,0x163f6,0x1f614,0x1617e, // 430
295 0x1f612,0x1e414,0x1ec34,0x1e412,0x1ec32,0x1c834,0x1d874,0x1c832,0x1d872,0x19074, // 440
296 0x1b0f4,0x19072,0x1b0f2,0x120f4,0x161f4,0x120f2,0x161f2,0x1f60a,0x1e40a,0x1ec1a, // 450
297 0x1c81a,0x1d83a,0x1903a,0x1b07a,0x1e2a0,0x1f158,0x1f8ae,0x1e290,0x1f14c,0x1e288, // 460
298 0x1f146,0x1e284,0x1e282,0x1c5a0,0x1e2d8,0x1f16e,0x1c590,0x1e2cc,0x1c588,0x1e2c6, // 470
299 0x1c584,0x1c582,0x18ba0,0x1c5d8,0x1e2ee,0x18b90,0x1c5cc,0x18b88,0x1c5c6,0x18b84, // 480
300 0x18b82,0x117a0,0x18bd8,0x1c5ee,0x11790,0x18bcc,0x11788,0x18bc6,0x11784,0x11782, // 490
301 0x117d8,0x18bee,0x117cc,0x117c6,0x117ee,0x1f350,0x1f9ac,0x135f8,0x1f348,0x1f9a6, // 500
302 0x134fc,0x1f344,0x1347e,0x1f342,0x1e250,0x1f12c,0x1e6d0,0x1e248,0x1f126,0x1e6c8, // 510
303 0x1f366,0x1e6c4,0x1e242,0x1e6c2,0x1c4d0,0x1e26c,0x1cdd0,0x1c4c8,0x1e266,0x1cdc8, // 520
304 0x1e6e6,0x1cdc4,0x1c4c2,0x1cdc2,0x189d0,0x1c4ec,0x19bd0,0x189c8,0x1c4e6,0x19bc8, // 530
305 0x1cde6,0x19bc4,0x189c2,0x19bc2,0x113d0,0x189ec,0x137d0,0x113c8,0x189e6,0x137c8, // 540
306 0x19be6,0x137c4,0x113c2,0x137c2,0x113ec,0x137ec,0x113e6,0x137e6,0x1fba8,0x175f0, // 550
307 0x1bafc,0x1fba4,0x174f8,0x1ba7e,0x1fba2,0x1747c,0x1743e,0x1f328,0x1f996,0x132fc, // 560
308 0x1f768,0x1fbb6,0x176fc,0x1327e,0x1f764,0x1f322,0x1767e,0x1f762,0x1e228,0x1f116, // 570
309 0x1e668,0x1e224,0x1eee8,0x1f776,0x1e222,0x1eee4,0x1e662,0x1eee2,0x1c468,0x1e236, // 580
310 0x1cce8,0x1c464,0x1dde8,0x1cce4,0x1c462,0x1dde4,0x1cce2,0x1dde2,0x188e8,0x1c476, // 590
311 0x199e8,0x188e4,0x1bbe8,0x199e4,0x188e2,0x1bbe4,0x199e2,0x1bbe2,0x111e8,0x188f6, // 600
312 0x133e8,0x111e4,0x177e8,0x133e4,0x111e2,0x177e4,0x133e2,0x177e2,0x111f6,0x133f6, // 610
313 0x1fb94,0x172f8,0x1b97e,0x1fb92,0x1727c,0x1723e,0x1f314,0x1317e,0x1f734,0x1f312, // 620
314 0x1737e,0x1f732,0x1e214,0x1e634,0x1e212,0x1ee74,0x1e632,0x1ee72,0x1c434,0x1cc74, // 630
315 0x1c432,0x1dcf4,0x1cc72,0x1dcf2,0x18874,0x198f4,0x18872,0x1b9f4,0x198f2,0x1b9f2, // 640
316 0x110f4,0x131f4,0x110f2,0x173f4,0x131f2,0x173f2,0x1fb8a,0x1717c,0x1713e,0x1f30a, // 650
317 0x1f71a,0x1e20a,0x1e61a,0x1ee3a,0x1c41a,0x1cc3a,0x1dc7a,0x1883a,0x1987a,0x1b8fa, // 660
318 0x1107a,0x130fa,0x171fa,0x170be,0x1e150,0x1f0ac,0x1e148,0x1f0a6,0x1e144,0x1e142, // 670
319 0x1c2d0,0x1e16c,0x1c2c8,0x1e166,0x1c2c4,0x1c2c2,0x185d0,0x1c2ec,0x185c8,0x1c2e6, // 680
320 0x185c4,0x185c2,0x10bd0,0x185ec,0x10bc8,0x185e6,0x10bc4,0x10bc2,0x10bec,0x10be6, // 690
321 0x1f1a8,0x1f8d6,0x11afc,0x1f1a4,0x11a7e,0x1f1a2,0x1e128,0x1f096,0x1e368,0x1e124, // 700
322 0x1e364,0x1e122,0x1e362,0x1c268,0x1e136,0x1c6e8,0x1c264,0x1c6e4,0x1c262,0x1c6e2, // 710
323 0x184e8,0x1c276,0x18de8,0x184e4,0x18de4,0x184e2,0x18de2,0x109e8,0x184f6,0x11be8, // 720
324 0x109e4,0x11be4,0x109e2,0x11be2,0x109f6,0x11bf6,0x1f9d4,0x13af8,0x19d7e,0x1f9d2, // 730
325 0x13a7c,0x13a3e,0x1f194,0x1197e,0x1f3b4,0x1f192,0x13b7e,0x1f3b2,0x1e114,0x1e334, // 740
326 0x1e112,0x1e774,0x1e332,0x1e772,0x1c234,0x1c674,0x1c232,0x1cef4,0x1c672,0x1cef2, // 750
327 0x18474,0x18cf4,0x18472,0x19df4,0x18cf2,0x19df2,0x108f4,0x119f4,0x108f2,0x13bf4, // 760
328 0x119f2,0x13bf2,0x17af0,0x1bd7c,0x17a78,0x1bd3e,0x17a3c,0x17a1e,0x1f9ca,0x1397c, // 770
329 0x1fbda,0x17b7c,0x1393e,0x17b3e,0x1f18a,0x1f39a,0x1f7ba,0x1e10a,0x1e31a,0x1e73a, // 780
330 0x1ef7a,0x1c21a,0x1c63a,0x1ce7a,0x1defa,0x1843a,0x18c7a,0x19cfa,0x1bdfa,0x1087a, // 790
331 0x118fa,0x139fa,0x17978,0x1bcbe,0x1793c,0x1791e,0x138be,0x179be,0x178bc,0x1789e, // 800
332 0x1785e,0x1e0a8,0x1e0a4,0x1e0a2,0x1c168,0x1e0b6,0x1c164,0x1c162,0x182e8,0x1c176, // 810
333 0x182e4,0x182e2,0x105e8,0x182f6,0x105e4,0x105e2,0x105f6,0x1f0d4,0x10d7e,0x1f0d2, // 820
334 0x1e094,0x1e1b4,0x1e092,0x1e1b2,0x1c134,0x1c374,0x1c132,0x1c372,0x18274,0x186f4, // 830
335 0x18272,0x186f2,0x104f4,0x10df4,0x104f2,0x10df2,0x1f8ea,0x11d7c,0x11d3e,0x1f0ca, // 840
336 0x1f1da,0x1e08a,0x1e19a,0x1e3ba,0x1c11a,0x1c33a,0x1c77a,0x1823a,0x1867a,0x18efa, // 850
337 0x1047a,0x10cfa,0x11dfa,0x13d78,0x19ebe,0x13d3c,0x13d1e,0x11cbe,0x13dbe,0x17d70, // 860
338 0x1bebc,0x17d38,0x1be9e,0x17d1c,0x17d0e,0x13cbc,0x17dbc,0x13c9e,0x17d9e,0x17cb8, // 870
339 0x1be5e,0x17c9c,0x17c8e,0x13c5e,0x17cde,0x17c5c,0x17c4e,0x17c2e,0x1c0b4,0x1c0b2, // 880
340 0x18174,0x18172,0x102f4,0x102f2,0x1e0da,0x1c09a,0x1c1ba,0x1813a,0x1837a,0x1027a, // 890
341 0x106fa,0x10ebe,0x11ebc,0x11e9e,0x13eb8,0x19f5e,0x13e9c,0x13e8e,0x11e5e,0x13ede, // 900
342 0x17eb0,0x1bf5c,0x17e98,0x1bf4e,0x17e8c,0x17e86,0x13e5c,0x17edc,0x13e4e,0x17ece, // 910
343 0x17e58,0x1bf2e,0x17e4c,0x17e46,0x13e2e,0x17e6e,0x17e2c,0x17e26,0x10f5e,0x11f5c, // 920
344 0x11f4e,0x13f58,0x19fae,0x13f4c,0x13f46,0x11f2e,0x13f6e,0x13f2c,0x13f26), // 929
345 array( // cluster 6 -----------------------------------------------------------------------
346 0x1abe0,0x1d5f8,0x153c0,0x1a9f0,0x1d4fc,0x151e0,0x1a8f8,0x1d47e,0x150f0,0x1a87c, // 10
347 0x15078,0x1fad0,0x15be0,0x1adf8,0x1fac8,0x159f0,0x1acfc,0x1fac4,0x158f8,0x1ac7e, // 20
348 0x1fac2,0x1587c,0x1f5d0,0x1faec,0x15df8,0x1f5c8,0x1fae6,0x15cfc,0x1f5c4,0x15c7e, // 30
349 0x1f5c2,0x1ebd0,0x1f5ec,0x1ebc8,0x1f5e6,0x1ebc4,0x1ebc2,0x1d7d0,0x1ebec,0x1d7c8, // 40
350 0x1ebe6,0x1d7c4,0x1d7c2,0x1afd0,0x1d7ec,0x1afc8,0x1d7e6,0x1afc4,0x14bc0,0x1a5f0, // 50
351 0x1d2fc,0x149e0,0x1a4f8,0x1d27e,0x148f0,0x1a47c,0x14878,0x1a43e,0x1483c,0x1fa68, // 60
352 0x14df0,0x1a6fc,0x1fa64,0x14cf8,0x1a67e,0x1fa62,0x14c7c,0x14c3e,0x1f4e8,0x1fa76, // 70
353 0x14efc,0x1f4e4,0x14e7e,0x1f4e2,0x1e9e8,0x1f4f6,0x1e9e4,0x1e9e2,0x1d3e8,0x1e9f6, // 80
354 0x1d3e4,0x1d3e2,0x1a7e8,0x1d3f6,0x1a7e4,0x1a7e2,0x145e0,0x1a2f8,0x1d17e,0x144f0, // 90
355 0x1a27c,0x14478,0x1a23e,0x1443c,0x1441e,0x1fa34,0x146f8,0x1a37e,0x1fa32,0x1467c, // 100
356 0x1463e,0x1f474,0x1477e,0x1f472,0x1e8f4,0x1e8f2,0x1d1f4,0x1d1f2,0x1a3f4,0x1a3f2, // 110
357 0x142f0,0x1a17c,0x14278,0x1a13e,0x1423c,0x1421e,0x1fa1a,0x1437c,0x1433e,0x1f43a, // 120
358 0x1e87a,0x1d0fa,0x14178,0x1a0be,0x1413c,0x1411e,0x141be,0x140bc,0x1409e,0x12bc0, // 130
359 0x195f0,0x1cafc,0x129e0,0x194f8,0x1ca7e,0x128f0,0x1947c,0x12878,0x1943e,0x1283c, // 140
360 0x1f968,0x12df0,0x196fc,0x1f964,0x12cf8,0x1967e,0x1f962,0x12c7c,0x12c3e,0x1f2e8, // 150
361 0x1f976,0x12efc,0x1f2e4,0x12e7e,0x1f2e2,0x1e5e8,0x1f2f6,0x1e5e4,0x1e5e2,0x1cbe8, // 160
362 0x1e5f6,0x1cbe4,0x1cbe2,0x197e8,0x1cbf6,0x197e4,0x197e2,0x1b5e0,0x1daf8,0x1ed7e, // 170
363 0x169c0,0x1b4f0,0x1da7c,0x168e0,0x1b478,0x1da3e,0x16870,0x1b43c,0x16838,0x1b41e, // 180
364 0x1681c,0x125e0,0x192f8,0x1c97e,0x16de0,0x124f0,0x1927c,0x16cf0,0x1b67c,0x1923e, // 190
365 0x16c78,0x1243c,0x16c3c,0x1241e,0x16c1e,0x1f934,0x126f8,0x1937e,0x1fb74,0x1f932, // 200
366 0x16ef8,0x1267c,0x1fb72,0x16e7c,0x1263e,0x16e3e,0x1f274,0x1277e,0x1f6f4,0x1f272, // 210
367 0x16f7e,0x1f6f2,0x1e4f4,0x1edf4,0x1e4f2,0x1edf2,0x1c9f4,0x1dbf4,0x1c9f2,0x1dbf2, // 220
368 0x193f4,0x193f2,0x165c0,0x1b2f0,0x1d97c,0x164e0,0x1b278,0x1d93e,0x16470,0x1b23c, // 230
369 0x16438,0x1b21e,0x1641c,0x1640e,0x122f0,0x1917c,0x166f0,0x12278,0x1913e,0x16678, // 240
370 0x1b33e,0x1663c,0x1221e,0x1661e,0x1f91a,0x1237c,0x1fb3a,0x1677c,0x1233e,0x1673e, // 250
371 0x1f23a,0x1f67a,0x1e47a,0x1ecfa,0x1c8fa,0x1d9fa,0x191fa,0x162e0,0x1b178,0x1d8be, // 260
372 0x16270,0x1b13c,0x16238,0x1b11e,0x1621c,0x1620e,0x12178,0x190be,0x16378,0x1213c, // 270
373 0x1633c,0x1211e,0x1631e,0x121be,0x163be,0x16170,0x1b0bc,0x16138,0x1b09e,0x1611c, // 280
374 0x1610e,0x120bc,0x161bc,0x1209e,0x1619e,0x160b8,0x1b05e,0x1609c,0x1608e,0x1205e, // 290
375 0x160de,0x1605c,0x1604e,0x115e0,0x18af8,0x1c57e,0x114f0,0x18a7c,0x11478,0x18a3e, // 300
376 0x1143c,0x1141e,0x1f8b4,0x116f8,0x18b7e,0x1f8b2,0x1167c,0x1163e,0x1f174,0x1177e, // 310
377 0x1f172,0x1e2f4,0x1e2f2,0x1c5f4,0x1c5f2,0x18bf4,0x18bf2,0x135c0,0x19af0,0x1cd7c, // 320
378 0x134e0,0x19a78,0x1cd3e,0x13470,0x19a3c,0x13438,0x19a1e,0x1341c,0x1340e,0x112f0, // 330
379 0x1897c,0x136f0,0x11278,0x1893e,0x13678,0x19b3e,0x1363c,0x1121e,0x1361e,0x1f89a, // 340
380 0x1137c,0x1f9ba,0x1377c,0x1133e,0x1373e,0x1f13a,0x1f37a,0x1e27a,0x1e6fa,0x1c4fa, // 350
381 0x1cdfa,0x189fa,0x1bae0,0x1dd78,0x1eebe,0x174c0,0x1ba70,0x1dd3c,0x17460,0x1ba38, // 360
382 0x1dd1e,0x17430,0x1ba1c,0x17418,0x1ba0e,0x1740c,0x132e0,0x19978,0x1ccbe,0x176e0, // 370
383 0x13270,0x1993c,0x17670,0x1bb3c,0x1991e,0x17638,0x1321c,0x1761c,0x1320e,0x1760e, // 380
384 0x11178,0x188be,0x13378,0x1113c,0x17778,0x1333c,0x1111e,0x1773c,0x1331e,0x1771e, // 390
385 0x111be,0x133be,0x177be,0x172c0,0x1b970,0x1dcbc,0x17260,0x1b938,0x1dc9e,0x17230, // 400
386 0x1b91c,0x17218,0x1b90e,0x1720c,0x17206,0x13170,0x198bc,0x17370,0x13138,0x1989e, // 410
387 0x17338,0x1b99e,0x1731c,0x1310e,0x1730e,0x110bc,0x131bc,0x1109e,0x173bc,0x1319e, // 420
388 0x1739e,0x17160,0x1b8b8,0x1dc5e,0x17130,0x1b89c,0x17118,0x1b88e,0x1710c,0x17106, // 430
389 0x130b8,0x1985e,0x171b8,0x1309c,0x1719c,0x1308e,0x1718e,0x1105e,0x130de,0x171de, // 440
390 0x170b0,0x1b85c,0x17098,0x1b84e,0x1708c,0x17086,0x1305c,0x170dc,0x1304e,0x170ce, // 450
391 0x17058,0x1b82e,0x1704c,0x17046,0x1302e,0x1706e,0x1702c,0x17026,0x10af0,0x1857c, // 460
392 0x10a78,0x1853e,0x10a3c,0x10a1e,0x10b7c,0x10b3e,0x1f0ba,0x1e17a,0x1c2fa,0x185fa, // 470
393 0x11ae0,0x18d78,0x1c6be,0x11a70,0x18d3c,0x11a38,0x18d1e,0x11a1c,0x11a0e,0x10978, // 480
394 0x184be,0x11b78,0x1093c,0x11b3c,0x1091e,0x11b1e,0x109be,0x11bbe,0x13ac0,0x19d70, // 490
395 0x1cebc,0x13a60,0x19d38,0x1ce9e,0x13a30,0x19d1c,0x13a18,0x19d0e,0x13a0c,0x13a06, // 500
396 0x11970,0x18cbc,0x13b70,0x11938,0x18c9e,0x13b38,0x1191c,0x13b1c,0x1190e,0x13b0e, // 510
397 0x108bc,0x119bc,0x1089e,0x13bbc,0x1199e,0x13b9e,0x1bd60,0x1deb8,0x1ef5e,0x17a40, // 520
398 0x1bd30,0x1de9c,0x17a20,0x1bd18,0x1de8e,0x17a10,0x1bd0c,0x17a08,0x1bd06,0x17a04, // 530
399 0x13960,0x19cb8,0x1ce5e,0x17b60,0x13930,0x19c9c,0x17b30,0x1bd9c,0x19c8e,0x17b18, // 540
400 0x1390c,0x17b0c,0x13906,0x17b06,0x118b8,0x18c5e,0x139b8,0x1189c,0x17bb8,0x1399c, // 550
401 0x1188e,0x17b9c,0x1398e,0x17b8e,0x1085e,0x118de,0x139de,0x17bde,0x17940,0x1bcb0, // 560
402 0x1de5c,0x17920,0x1bc98,0x1de4e,0x17910,0x1bc8c,0x17908,0x1bc86,0x17904,0x17902, // 570
403 0x138b0,0x19c5c,0x179b0,0x13898,0x19c4e,0x17998,0x1bcce,0x1798c,0x13886,0x17986, // 580
404 0x1185c,0x138dc,0x1184e,0x179dc,0x138ce,0x179ce,0x178a0,0x1bc58,0x1de2e,0x17890, // 590
405 0x1bc4c,0x17888,0x1bc46,0x17884,0x17882,0x13858,0x19c2e,0x178d8,0x1384c,0x178cc, // 600
406 0x13846,0x178c6,0x1182e,0x1386e,0x178ee,0x17850,0x1bc2c,0x17848,0x1bc26,0x17844, // 610
407 0x17842,0x1382c,0x1786c,0x13826,0x17866,0x17828,0x1bc16,0x17824,0x17822,0x13816, // 620
408 0x17836,0x10578,0x182be,0x1053c,0x1051e,0x105be,0x10d70,0x186bc,0x10d38,0x1869e, // 630
409 0x10d1c,0x10d0e,0x104bc,0x10dbc,0x1049e,0x10d9e,0x11d60,0x18eb8,0x1c75e,0x11d30, // 640
410 0x18e9c,0x11d18,0x18e8e,0x11d0c,0x11d06,0x10cb8,0x1865e,0x11db8,0x10c9c,0x11d9c, // 650
411 0x10c8e,0x11d8e,0x1045e,0x10cde,0x11dde,0x13d40,0x19eb0,0x1cf5c,0x13d20,0x19e98, // 660
412 0x1cf4e,0x13d10,0x19e8c,0x13d08,0x19e86,0x13d04,0x13d02,0x11cb0,0x18e5c,0x13db0, // 670
413 0x11c98,0x18e4e,0x13d98,0x19ece,0x13d8c,0x11c86,0x13d86,0x10c5c,0x11cdc,0x10c4e, // 680
414 0x13ddc,0x11cce,0x13dce,0x1bea0,0x1df58,0x1efae,0x1be90,0x1df4c,0x1be88,0x1df46, // 690
415 0x1be84,0x1be82,0x13ca0,0x19e58,0x1cf2e,0x17da0,0x13c90,0x19e4c,0x17d90,0x1becc, // 700
416 0x19e46,0x17d88,0x13c84,0x17d84,0x13c82,0x17d82,0x11c58,0x18e2e,0x13cd8,0x11c4c, // 710
417 0x17dd8,0x13ccc,0x11c46,0x17dcc,0x13cc6,0x17dc6,0x10c2e,0x11c6e,0x13cee,0x17dee, // 720
418 0x1be50,0x1df2c,0x1be48,0x1df26,0x1be44,0x1be42,0x13c50,0x19e2c,0x17cd0,0x13c48, // 730
419 0x19e26,0x17cc8,0x1be66,0x17cc4,0x13c42,0x17cc2,0x11c2c,0x13c6c,0x11c26,0x17cec, // 740
420 0x13c66,0x17ce6,0x1be28,0x1df16,0x1be24,0x1be22,0x13c28,0x19e16,0x17c68,0x13c24, // 750
421 0x17c64,0x13c22,0x17c62,0x11c16,0x13c36,0x17c76,0x1be14,0x1be12,0x13c14,0x17c34, // 760
422 0x13c12,0x17c32,0x102bc,0x1029e,0x106b8,0x1835e,0x1069c,0x1068e,0x1025e,0x106de, // 770
423 0x10eb0,0x1875c,0x10e98,0x1874e,0x10e8c,0x10e86,0x1065c,0x10edc,0x1064e,0x10ece, // 780
424 0x11ea0,0x18f58,0x1c7ae,0x11e90,0x18f4c,0x11e88,0x18f46,0x11e84,0x11e82,0x10e58, // 790
425 0x1872e,0x11ed8,0x18f6e,0x11ecc,0x10e46,0x11ec6,0x1062e,0x10e6e,0x11eee,0x19f50, // 800
426 0x1cfac,0x19f48,0x1cfa6,0x19f44,0x19f42,0x11e50,0x18f2c,0x13ed0,0x19f6c,0x18f26, // 810
427 0x13ec8,0x11e44,0x13ec4,0x11e42,0x13ec2,0x10e2c,0x11e6c,0x10e26,0x13eec,0x11e66, // 820
428 0x13ee6,0x1dfa8,0x1efd6,0x1dfa4,0x1dfa2,0x19f28,0x1cf96,0x1bf68,0x19f24,0x1bf64, // 830
429 0x19f22,0x1bf62,0x11e28,0x18f16,0x13e68,0x11e24,0x17ee8,0x13e64,0x11e22,0x17ee4, // 840
430 0x13e62,0x17ee2,0x10e16,0x11e36,0x13e76,0x17ef6,0x1df94,0x1df92,0x19f14,0x1bf34, // 850
431 0x19f12,0x1bf32,0x11e14,0x13e34,0x11e12,0x17e74,0x13e32,0x17e72,0x1df8a,0x19f0a, // 860
432 0x1bf1a,0x11e0a,0x13e1a,0x17e3a,0x1035c,0x1034e,0x10758,0x183ae,0x1074c,0x10746, // 870
433 0x1032e,0x1076e,0x10f50,0x187ac,0x10f48,0x187a6,0x10f44,0x10f42,0x1072c,0x10f6c, // 880
434 0x10726,0x10f66,0x18fa8,0x1c7d6,0x18fa4,0x18fa2,0x10f28,0x18796,0x11f68,0x18fb6, // 890
435 0x11f64,0x10f22,0x11f62,0x10716,0x10f36,0x11f76,0x1cfd4,0x1cfd2,0x18f94,0x19fb4, // 900
436 0x18f92,0x19fb2,0x10f14,0x11f34,0x10f12,0x13f74,0x11f32,0x13f72,0x1cfca,0x18f8a, // 910
437 0x19f9a,0x10f0a,0x11f1a,0x13f3a,0x103ac,0x103a6,0x107a8,0x183d6,0x107a4,0x107a2, // 920
438 0x10396,0x107b6,0x187d4,0x187d2,0x10794,0x10fb4,0x10792,0x10fb2,0x1c7ea) // 929
439 ); // end of $clusters array
440
441 /**
442 * Array of factors of the Reed-Solomon polynomial equations used for error correction; one sub array for each correction level (0-8).
443 * @protected
444 */
445 protected $rsfactors = array(
446 array( // ECL 0 (2 factors) -------------------------------------------------------------------------------
447 0x01b,0x395), // 2
448 array( // ECL 1 (4 factors) -------------------------------------------------------------------------------
449 0x20a,0x238,0x2d3,0x329), // 4
450 array( // ECL 2 (8 factors) -------------------------------------------------------------------------------
451 0x0ed,0x134,0x1b4,0x11c,0x286,0x28d,0x1ac,0x17b), // 8
452 array( // ECL 3 (16 factors) ------------------------------------------------------------------------------
453 0x112,0x232,0x0e8,0x2f3,0x257,0x20c,0x321,0x084,0x127,0x074,0x1ba,0x1ac,0x127,0x02a,0x0b0,0x041),// 16
454 array( // ECL 4 (32 factors) ------------------------------------------------------------------------------
455 0x169,0x23f,0x39a,0x20d,0x0b0,0x24a,0x280,0x141,0x218,0x2e6,0x2a5,0x2e6,0x2af,0x11c,0x0c1,0x205, // 16
456 0x111,0x1ee,0x107,0x093,0x251,0x320,0x23b,0x140,0x323,0x085,0x0e7,0x186,0x2ad,0x14a,0x03f,0x19a),// 32
457 array( // ECL 5 (64 factors) ------------------------------------------------------------------------------
458 0x21b,0x1a6,0x006,0x05d,0x35e,0x303,0x1c5,0x06a,0x262,0x11f,0x06b,0x1f9,0x2dd,0x36d,0x17d,0x264, // 16
459 0x2d3,0x1dc,0x1ce,0x0ac,0x1ae,0x261,0x35a,0x336,0x21f,0x178,0x1ff,0x190,0x2a0,0x2fa,0x11b,0x0b8, // 32
460 0x1b8,0x023,0x207,0x01f,0x1cc,0x252,0x0e1,0x217,0x205,0x160,0x25d,0x09e,0x28b,0x0c9,0x1e8,0x1f6, // 48
461 0x288,0x2dd,0x2cd,0x053,0x194,0x061,0x118,0x303,0x348,0x275,0x004,0x17d,0x34b,0x26f,0x108,0x21f),// 64
462 array( // ECL 6 (128 factors) -----------------------------------------------------------------------------
463 0x209,0x136,0x360,0x223,0x35a,0x244,0x128,0x17b,0x035,0x30b,0x381,0x1bc,0x190,0x39d,0x2ed,0x19f, // 16
464 0x336,0x05d,0x0d9,0x0d0,0x3a0,0x0f4,0x247,0x26c,0x0f6,0x094,0x1bf,0x277,0x124,0x38c,0x1ea,0x2c0, // 32
465 0x204,0x102,0x1c9,0x38b,0x252,0x2d3,0x2a2,0x124,0x110,0x060,0x2ac,0x1b0,0x2ae,0x25e,0x35c,0x239, // 48
466 0x0c1,0x0db,0x081,0x0ba,0x0ec,0x11f,0x0c0,0x307,0x116,0x0ad,0x028,0x17b,0x2c8,0x1cf,0x286,0x308, // 64
467 0x0ab,0x1eb,0x129,0x2fb,0x09c,0x2dc,0x05f,0x10e,0x1bf,0x05a,0x1fb,0x030,0x0e4,0x335,0x328,0x382, // 80
468 0x310,0x297,0x273,0x17a,0x17e,0x106,0x17c,0x25a,0x2f2,0x150,0x059,0x266,0x057,0x1b0,0x29e,0x268, // 96
469 0x09d,0x176,0x0f2,0x2d6,0x258,0x10d,0x177,0x382,0x34d,0x1c6,0x162,0x082,0x32e,0x24b,0x324,0x022, // 112
470 0x0d3,0x14a,0x21b,0x129,0x33b,0x361,0x025,0x205,0x342,0x13b,0x226,0x056,0x321,0x004,0x06c,0x21b),// 128
471 array( // ECL 7 (256 factors) -----------------------------------------------------------------------------
472 0x20c,0x37e,0x04b,0x2fe,0x372,0x359,0x04a,0x0cc,0x052,0x24a,0x2c4,0x0fa,0x389,0x312,0x08a,0x2d0, // 16
473 0x35a,0x0c2,0x137,0x391,0x113,0x0be,0x177,0x352,0x1b6,0x2dd,0x0c2,0x118,0x0c9,0x118,0x33c,0x2f5, // 32
474 0x2c6,0x32e,0x397,0x059,0x044,0x239,0x00b,0x0cc,0x31c,0x25d,0x21c,0x391,0x321,0x2bc,0x31f,0x089, // 48
475 0x1b7,0x1a2,0x250,0x29c,0x161,0x35b,0x172,0x2b6,0x145,0x0f0,0x0d8,0x101,0x11c,0x225,0x0d1,0x374, // 64
476 0x13b,0x046,0x149,0x319,0x1ea,0x112,0x36d,0x0a2,0x2ed,0x32c,0x2ac,0x1cd,0x14e,0x178,0x351,0x209, // 80
477 0x133,0x123,0x323,0x2c8,0x013,0x166,0x18f,0x38c,0x067,0x1ff,0x033,0x008,0x205,0x0e1,0x121,0x1d6, // 96
478 0x27d,0x2db,0x042,0x0ff,0x395,0x10d,0x1cf,0x33e,0x2da,0x1b1,0x350,0x249,0x088,0x21a,0x38a,0x05a, // 112
479 0x002,0x122,0x2e7,0x0c7,0x28f,0x387,0x149,0x031,0x322,0x244,0x163,0x24c,0x0bc,0x1ce,0x00a,0x086, // 128
480 0x274,0x140,0x1df,0x082,0x2e3,0x047,0x107,0x13e,0x176,0x259,0x0c0,0x25d,0x08e,0x2a1,0x2af,0x0ea, // 144
481 0x2d2,0x180,0x0b1,0x2f0,0x25f,0x280,0x1c7,0x0c1,0x2b1,0x2c3,0x325,0x281,0x030,0x03c,0x2dc,0x26d, // 160
482 0x37f,0x220,0x105,0x354,0x28f,0x135,0x2b9,0x2f3,0x2f4,0x03c,0x0e7,0x305,0x1b2,0x1a5,0x2d6,0x210, // 176
483 0x1f7,0x076,0x031,0x31b,0x020,0x090,0x1f4,0x0ee,0x344,0x18a,0x118,0x236,0x13f,0x009,0x287,0x226, // 192
484 0x049,0x392,0x156,0x07e,0x020,0x2a9,0x14b,0x318,0x26c,0x03c,0x261,0x1b9,0x0b4,0x317,0x37d,0x2f2, // 208
485 0x25d,0x17f,0x0e4,0x2ed,0x2f8,0x0d5,0x036,0x129,0x086,0x036,0x342,0x12b,0x39a,0x0bf,0x38e,0x214, // 224
486 0x261,0x33d,0x0bd,0x014,0x0a7,0x01d,0x368,0x1c1,0x053,0x192,0x029,0x290,0x1f9,0x243,0x1e1,0x0ad, // 240
487 0x194,0x0fb,0x2b0,0x05f,0x1f1,0x22b,0x282,0x21f,0x133,0x09f,0x39c,0x22e,0x288,0x037,0x1f1,0x00a),// 256
488 array( // ECL 8 (512 factors) -----------------------------------------------------------------------------
489 0x160,0x04d,0x175,0x1f8,0x023,0x257,0x1ac,0x0cf,0x199,0x23e,0x076,0x1f2,0x11d,0x17c,0x15e,0x1ec, // 16
490 0x0c5,0x109,0x398,0x09b,0x392,0x12b,0x0e5,0x283,0x126,0x367,0x132,0x058,0x057,0x0c1,0x160,0x30d, // 32
491 0x34e,0x04b,0x147,0x208,0x1b3,0x21f,0x0cb,0x29a,0x0f9,0x15a,0x30d,0x26d,0x280,0x10c,0x31a,0x216, // 48
492 0x21b,0x30d,0x198,0x186,0x284,0x066,0x1dc,0x1f3,0x122,0x278,0x221,0x025,0x35a,0x394,0x228,0x029, // 64
493 0x21e,0x121,0x07a,0x110,0x17f,0x320,0x1e5,0x062,0x2f0,0x1d8,0x2f9,0x06b,0x310,0x35c,0x292,0x2e5, // 80
494 0x122,0x0cc,0x2a9,0x197,0x357,0x055,0x063,0x03e,0x1e2,0x0b4,0x014,0x129,0x1c3,0x251,0x391,0x08e, // 96
495 0x328,0x2ac,0x11f,0x218,0x231,0x04c,0x28d,0x383,0x2d9,0x237,0x2e8,0x186,0x201,0x0c0,0x204,0x102, // 112
496 0x0f0,0x206,0x31a,0x18b,0x300,0x350,0x033,0x262,0x180,0x0a8,0x0be,0x33a,0x148,0x254,0x312,0x12f, // 128
497 0x23a,0x17d,0x19f,0x281,0x09c,0x0ed,0x097,0x1ad,0x213,0x0cf,0x2a4,0x2c6,0x059,0x0a8,0x130,0x192, // 144
498 0x028,0x2c4,0x23f,0x0a2,0x360,0x0e5,0x041,0x35d,0x349,0x200,0x0a4,0x1dd,0x0dd,0x05c,0x166,0x311, // 160
499 0x120,0x165,0x352,0x344,0x33b,0x2e0,0x2c3,0x05e,0x008,0x1ee,0x072,0x209,0x002,0x1f3,0x353,0x21f, // 176
500 0x098,0x2d9,0x303,0x05f,0x0f8,0x169,0x242,0x143,0x358,0x31d,0x121,0x033,0x2ac,0x1d2,0x215,0x334, // 192
501 0x29d,0x02d,0x386,0x1c4,0x0a7,0x156,0x0f4,0x0ad,0x023,0x1cf,0x28b,0x033,0x2bb,0x24f,0x1c4,0x242, // 208
502 0x025,0x07c,0x12a,0x14c,0x228,0x02b,0x1ab,0x077,0x296,0x309,0x1db,0x352,0x2fc,0x16c,0x242,0x38f, // 224
503 0x11b,0x2c7,0x1d8,0x1a4,0x0f5,0x120,0x252,0x18a,0x1ff,0x147,0x24d,0x309,0x2bb,0x2b0,0x02b,0x198, // 240
504 0x34a,0x17f,0x2d1,0x209,0x230,0x284,0x2ca,0x22f,0x03e,0x091,0x369,0x297,0x2c9,0x09f,0x2a0,0x2d9, // 256
505 0x270,0x03b,0x0c1,0x1a1,0x09e,0x0d1,0x233,0x234,0x157,0x2b5,0x06d,0x260,0x233,0x16d,0x0b5,0x304, // 272
506 0x2a5,0x136,0x0f8,0x161,0x2c4,0x19a,0x243,0x366,0x269,0x349,0x278,0x35c,0x121,0x218,0x023,0x309, // 288
507 0x26a,0x24a,0x1a8,0x341,0x04d,0x255,0x15a,0x10d,0x2f5,0x278,0x2b7,0x2ef,0x14b,0x0f7,0x0b8,0x02d, // 304
508 0x313,0x2a8,0x012,0x042,0x197,0x171,0x036,0x1ec,0x0e4,0x265,0x33e,0x39a,0x1b5,0x207,0x284,0x389, // 320
509 0x315,0x1a4,0x131,0x1b9,0x0cf,0x12c,0x37c,0x33b,0x08d,0x219,0x17d,0x296,0x201,0x038,0x0fc,0x155, // 336
510 0x0f2,0x31d,0x346,0x345,0x2d0,0x0e0,0x133,0x277,0x03d,0x057,0x230,0x136,0x2f4,0x299,0x18d,0x328, // 352
511 0x353,0x135,0x1d9,0x31b,0x17a,0x01f,0x287,0x393,0x1cb,0x326,0x24e,0x2db,0x1a9,0x0d8,0x224,0x0f9, // 368
512 0x141,0x371,0x2bb,0x217,0x2a1,0x30e,0x0d2,0x32f,0x389,0x12f,0x34b,0x39a,0x119,0x049,0x1d5,0x317, // 384
513 0x294,0x0a2,0x1f2,0x134,0x09b,0x1a6,0x38b,0x331,0x0bb,0x03e,0x010,0x1a9,0x217,0x150,0x11e,0x1b5, // 400
514 0x177,0x111,0x262,0x128,0x0b7,0x39b,0x074,0x29b,0x2ef,0x161,0x03e,0x16e,0x2b3,0x17b,0x2af,0x34a, // 416
515 0x025,0x165,0x2d0,0x2e6,0x14a,0x005,0x027,0x39b,0x137,0x1a8,0x0f2,0x2ed,0x141,0x036,0x29d,0x13c, // 432
516 0x156,0x12b,0x216,0x069,0x29b,0x1e8,0x280,0x2a0,0x240,0x21c,0x13c,0x1e6,0x2d1,0x262,0x02e,0x290, // 448
517 0x1bf,0x0ab,0x268,0x1d0,0x0be,0x213,0x129,0x141,0x2fa,0x2f0,0x215,0x0af,0x086,0x00e,0x17d,0x1b1, // 464
518 0x2cd,0x02d,0x06f,0x014,0x254,0x11c,0x2e0,0x08a,0x286,0x19b,0x36d,0x29d,0x08d,0x397,0x02d,0x30c, // 480
519 0x197,0x0a4,0x14c,0x383,0x0a5,0x2d6,0x258,0x145,0x1f2,0x28f,0x165,0x2f0,0x300,0x0df,0x351,0x287, // 496
520 0x03f,0x136,0x35f,0x0fb,0x16e,0x130,0x11a,0x2e2,0x2a3,0x19a,0x185,0x0f4,0x01f,0x079,0x12f,0x107) // 512
521 );
522
523 /**
524 * This is the class constructor.
525 * Creates a PDF417 object
526 * @param $code (string) code to represent using PDF417
527 * @param $ecl (int) error correction level (0-8); default -1 = automatic correction level
528 * @param $aspectratio (float) the width to height of the symbol (excluding quiet zones)
529 * @param $macro (array) information for macro block
530 * @public
531 */
532 public function __construct($code, $ecl=-1, $aspectratio=2, $macro=array()) {
533 $barcode_array = array();
534 if ((is_null($code)) OR ($code == '\0') OR ($code == '')) {
535 return false;
536 }
537 // get the input sequence array
538 $sequence = $this->getInputSequences($code);
539 $codewords = array(); // array of code-words
540 foreach($sequence as $seq) {
541 $cw = $this->getCompaction($seq[0], $seq[1], true);
542 $codewords = array_merge($codewords, $cw);
543 }
544 if ($codewords[0] == 900) {
545 // Text Alpha is the default mode, so remove the first code
546 array_shift($codewords);
547 }
548 // count number of codewords
549 $numcw = count($codewords);
550 if ($numcw > 925) {
551 // reached maximum data codeword capacity
552 return false;
553 }
554 // build macro control block codewords
555 if (!empty($macro)) {
556 $macrocw = array();
557 // beginning of macro control block
558 $macrocw[] = 928;
559 // segment index
560 $cw = $this->getCompaction(902, sprintf('%05d', $macro['segment_index']), false);
561 $macrocw = array_merge($macrocw, $cw);
562 // file ID
563 $cw = $this->getCompaction(900, $macro['file_id'], false);
564 $macrocw = array_merge($macrocw, $cw);
565 // optional fields
566 $optmodes = array(900,902,902,900,900,902,902);
567 $optsize = array(-1,2,4,-1,-1,-1,2);
568 foreach ($optmodes as $k => $omode) {
569 if (isset($macro['option_'.$k])) {
570 $macrocw[] = 923;
571 $macrocw[] = $k;
572 if ($optsize[$k] == 2) {
573 $macro['option_'.$k] = sprintf('%05d', $macro['option_'.$k]);
574 } elseif ($optsize[$k] == 4) {
575 $macro['option_'.$k] = sprintf('%010d', $macro['option_'.$k]);
576 }
577 $cw = $this->getCompaction($omode, $macro['option_'.$k], false);
578 $macrocw = array_merge($macrocw, $cw);
579 }
580 }
581 if ($macro['segment_index'] == ($macro['segment_total'] - 1)) {
582 // end of control block
583 $macrocw[] = 922;
584 }
585 // update total codewords
586 $numcw += count($macrocw);
587 }
588 // set error correction level
589 $ecl = $this->getErrorCorrectionLevel($ecl, $numcw);
590 // number of codewords for error correction
591 $errsize = (2 << $ecl);
592 // calculate number of columns (number of codewords per row) and rows
593 $nce = ($numcw + $errsize + 1);
594 $cols = round((sqrt(4761 + (68 * $aspectratio * ROWHEIGHT * $nce)) - 69) / 34);
595 // adjust cols
596 if ($cols < 1) {
597 $cols = 1;
598 } elseif ($cols > 30) {
599 $cols = 30;
600 }
601 $rows = ceil($nce / $cols);
602 $size = ($cols * $rows);
603 // adjust rows
604 if (($rows < 3) OR ($rows > 90)) {
605 if ($rows < 3) {
606 $rows = 3;
607 } elseif ($rows > 90) {
608 $rows = 90;
609 }
610 $cols = ceil($size / $rows);
611 $size = ($cols * $rows);
612 }
613 if ($size > 928) {
614 // set dimensions to get maximum capacity
615 if (abs($aspectratio - (17 * 29 / 32)) < abs($aspectratio - (17 * 16 / 58))) {
616 $cols = 29;
617 $rows = 32;
618 } else {
619 $cols = 16;
620 $rows = 58;
621 }
622 $size = 928;
623 }
624 // calculate padding
625 $pad = ($size - $nce);
626 if ($pad > 0) {
627 if (($size - $rows) == $nce) {
628 --$rows;
629 $size -= $rows;
630 } else {
631 // add pading
632 $codewords = array_merge($codewords, array_fill(0, $pad, 900));
633 }
634 }
635 if (!empty($macro)) {
636 // add macro section
637 $codewords = array_merge($codewords, $macrocw);
638 }
639 // Symbol Lenght Descriptor (number of data codewords including Symbol Lenght Descriptor and pad codewords)
640 $sld = $size - $errsize;
641 // add symbol length description
642 array_unshift($codewords, $sld);
643 // calculate error correction
644 $ecw = $this->getErrorCorrection($codewords, $ecl);
645 // add error correction codewords
646 $codewords = array_merge($codewords, $ecw);
647 // add horizontal quiet zones to start and stop patterns
648 $pstart = str_repeat('0', QUIETH).$this->start_pattern;
649 $pstop = $this->stop_pattern.str_repeat('0', QUIETH);
650 $barcode_array['num_rows'] = ($rows * ROWHEIGHT) + (2 * QUIETV);
651 $barcode_array['num_cols'] = (($cols + 2) * 17) + 35 + (2 * QUIETH);
652 $barcode_array['bcode'] = array();
653 // build rows for vertical quiet zone
654 if (QUIETV > 0) {
655 $empty_row = array_fill(0, $barcode_array['num_cols'], 0);
656 for ($i = 0; $i < QUIETV; ++$i) {
657 // add vertical quiet rows
658 $barcode_array['bcode'][] = $empty_row;
659 }
660 }
661 $k = 0; // codeword index
662 $cid = 0; // initial cluster
663 // for each row
664 for ($r = 0; $r < $rows; ++$r) {
665 // row start code
666 $row = $pstart;
667 switch ($cid) {
668 case 0: {
669 $L = ((30 * intval($r / 3)) + intval(($rows - 1) / 3));
670 break;
671 }
672 case 1: {
673 $L = ((30 * intval($r / 3)) + ($ecl * 3) + (($rows - 1) % 3));
674 break;
675 }
676 case 2: {
677 $L = ((30 * intval($r / 3)) + ($cols - 1));
678 break;
679 }
680 }
681 // left row indicator
682 $row .= sprintf('%17b', $this->clusters[$cid][$L]);
683 // for each column
684 for ($c = 0; $c < $cols; ++$c) {
685 $row .= sprintf('%17b', $this->clusters[$cid][$codewords[$k]]);
686 ++$k;
687 }
688 switch ($cid) {
689 case 0: {
690 $L = ((30 * intval($r / 3)) + ($cols - 1));
691 break;
692 }
693 case 1: {
694 $L = ((30 * intval($r / 3)) + intval(($rows - 1) / 3));
695 break;
696 }
697 case 2: {
698 $L = ((30 * intval($r / 3)) + ($ecl * 3) + (($rows - 1) % 3));
699 break;
700 }
701 }
702 // right row indicator
703 $row .= sprintf('%17b', $this->clusters[$cid][$L]);
704 // row stop code
705 $row .= $pstop;
706 // convert the string to array
707 $arow = preg_split('//', $row, -1, PREG_SPLIT_NO_EMPTY);
708 // duplicate row to get the desired height
709 for ($h = 0; $h < ROWHEIGHT; ++$h) {
710 $barcode_array['bcode'][] = $arow;
711 }
712 ++$cid;
713 if ($cid > 2) {
714 $cid = 0;
715 }
716 }
717 if (QUIETV > 0) {
718 for ($i = 0; $i < QUIETV; ++$i) {
719 // add vertical quiet rows
720 $barcode_array['bcode'][] = $empty_row;
721 }
722 }
723 $this->barcode_array = $barcode_array;
724 }
725
726 /**
727 * Returns a barcode array which is readable by TCPDF
728 * @return array barcode array readable by TCPDF;
729 * @public
730 */
731 public function getBarcodeArray() {
732 return $this->barcode_array;
733 }
734
735 /**
736 * Returns the error correction level (0-8) to be used
737 * @param $ecl (int) error correction level
738 * @param $numcw (int) number of data codewords
739 * @return int error correction level
740 * @protected
741 */
742 protected function getErrorCorrectionLevel($ecl, $numcw) {
743 // get maximum correction level
744 $maxecl = 8; // starting error level
745 $maxerrsize = (928 - $numcw); // available codewords for error
746 while ($maxecl > 0) {
747 $errsize = (2 << $ecl);
748 if ($maxerrsize >= $errsize) {
749 break;
750 }
751 --$maxecl;
752 }
753 // check for automatic levels
754 if (($ecl < 0) OR ($ecl > 8)) {
755 if ($numcw < 41) {
756 $ecl = 2;
757 } elseif ($numcw < 161) {
758 $ecl = 3;
759 } elseif ($numcw < 321) {
760 $ecl = 4;
761 } elseif ($numcw < 864) {
762 $ecl = 5;
763 } else {
764 $ecl = $maxecl;
765 }
766 }
767 if ($ecl > $maxecl) {
768 $ecl = $maxecl;
769 }
770 return $ecl;
771 }
772
773 /**
774 * Returns the error correction codewords
775 * @param $cw (array) array of codewords including Symbol Lenght Descriptor and pad
776 * @param $ecl (int) error correction level 0-8
777 * @return array of error correction codewords
778 * @protected
779 */
780 protected function getErrorCorrection($cw, $ecl) {
781 // get error correction coefficients
782 $ecc = $this->rsfactors[$ecl];
783 // number of error correction factors
784 $eclsize = (2 << $ecl);
785 // maximum index for $rsfactors[$ecl]
786 $eclmaxid = ($eclsize - 1);
787 // initialize array of error correction codewords
788 $ecw = array_fill(0, $eclsize, 0);
789 // for each data codeword
790 foreach($cw as $k => $d) {
791 $t1 = ($d + $ecw[$eclmaxid]) % 929;
792 for ($j = $eclmaxid; $j > 0; --$j) {
793 $t2 = ($t1 * $ecc[$j]) % 929;
794 $t3 = 929 - $t2;
795 $ecw[$j] = ($ecw[($j - 1)] + $t3) % 929;
796 }
797 $t2 = ($t1 * $ecc[0]) % 929;
798 $t3 = 929 - $t2;
799 $ecw[0] = $t3 % 929;
800 }
801 foreach($ecw as $j => $e) {
802 if ($e != 0) {
803 $ecw[$j] = 929 - $e;
804 }
805 }
806 $ecw = array_reverse($ecw);
807 return $ecw;
808 }
809
810 /**
811 * Create array of sequences from input
812 * @param $code (string) code
813 * @return bidimensional array containing characters and classification
814 * @protected
815 */
816 protected function getInputSequences($code) {
817 $sequence_array = array(); // array to be returned
818 $numseq = array();
819 // get numeric sequences
820 preg_match_all('/([0-9]{13,44})/', $code, $numseq, PREG_OFFSET_CAPTURE);
821 $numseq[1][] = array('', strlen($code));
822 $offset = 0;
823 foreach($numseq[1] as $seq) {
824 $seqlen = strlen($seq[0]);
825 if ($seq[1] > 0) {
826 // extract text sequence before the number sequence
827 $prevseq = substr($code, $offset, ($seq[1] - $offset));
828 $textseq = array();
829 // get text sequences
830 preg_match_all('/([\x09\x0a\x0d\x20-\x7e]{5,})/', $prevseq, $textseq, PREG_OFFSET_CAPTURE);
831 $textseq[1][] = array('', strlen($prevseq));
832 $txtoffset = 0;
833 foreach($textseq[1] as $txtseq) {
834 $txtseqlen = strlen($txtseq[0]);
835 if ($txtseq[1] > 0) {
836 // extract byte sequence before the text sequence
837 $prevtxtseq = substr($prevseq, $txtoffset, ($txtseq[1] - $txtoffset));
838 if (strlen($prevtxtseq) > 0) {
839 // add BYTE sequence
840 if ((strlen($prevtxtseq) == 1) AND ((count($sequence_array) > 0) AND ($sequence_array[(count($sequence_array) - 1)][0] == 900))) {
841 $sequence_array[] = array(913, $prevtxtseq);
842 } elseif ((strlen($prevtxtseq) % 6) == 0) {
843 $sequence_array[] = array(924, $prevtxtseq);
844 } else {
845 $sequence_array[] = array(901, $prevtxtseq);
846 }
847 }
848 }
849 if ($txtseqlen > 0) {
850 // add numeric sequence
851 $sequence_array[] = array(900, $txtseq[0]);
852 }
853 $txtoffset = $txtseq[1] + $txtseqlen;
854 }
855 }
856 if ($seqlen > 0) {
857 // add numeric sequence
858 $sequence_array[] = array(902, $seq[0]);
859 }
860 $offset = $seq[1] + $seqlen;
861 }
862 return $sequence_array;
863 }
864
865 /**
866 * Compact data by mode.
867 * @param $mode (int) compaction mode number
868 * @param $code (string) data to compact
869 * @param $addmode (boolean) if true add the mode codeword at first position
870 * @return array of codewords
871 * @protected
872 */
873 protected function getCompaction($mode, $code, $addmode=true) {
874 $cw = array(); // array of codewords to return
875 switch($mode) {
876 case 900: { // Text Compaction mode latch
877 $submode = 0; // default Alpha sub-mode
878 $txtarr = array(); // array of characters and sub-mode switching characters
879 $codelen = strlen($code);
880 for ($i = 0; $i < $codelen; ++$i) {
881 $chval = ord($code{$i});
882 if (($k = array_search($chval, $this->textsubmodes[$submode])) !== false) {
883 // we are on the same sub-mode
884 $txtarr[] = $k;
885 } else {
886 // the sub-mode is changed
887 for ($s = 0; $s < 4; ++$s) {
888 // search new sub-mode
889 if (($s != $submode) AND (($k = array_search($chval, $this->textsubmodes[$s])) !== false)) {
890 // $s is the new submode
891 if (((($i + 1) == $codelen) OR ((($i + 1) < $codelen) AND (array_search(ord($code{($i + 1)}), $this->textsubmodes[$submode]) !== false))) AND (($s == 3) OR (($s == 0) AND ($submode == 1)))) {
892 // shift (temporary change only for this char)
893 if ($s == 3) {
894 // shift to puntuaction
895 $txtarr[] = 29;
896 } else {
897 // shift from lower to alpha
898 $txtarr[] = 27;
899 }
900 } else {
901 // latch
902 $txtarr = array_merge($txtarr, $this->textlatch[''.$submode.$s]);
903 // set new submode
904 $submode = $s;
905 }
906 // add characted code to array
907 $txtarr[] = $k;
908 break;
909 }
910 }
911 }
912 }
913 $txtarrlen = count($txtarr);
914 if (($txtarrlen % 2) != 0) {
915 // add padding
916 $txtarr[] = 29;
917 ++$txtarrlen;
918 }
919 // calculate codewords
920 for ($i = 0; $i < $txtarrlen; $i += 2) {
921 $cw[] = (30 * $txtarr[$i]) + $txtarr[($i + 1)];
922 }
923 break;
924 }
925 case 901:
926 case 924: { // Byte Compaction mode latch
927 while (($codelen = strlen($code)) > 0) {
928 if ($codelen > 6) {
929 $rest = substr($code, 6);
930 $code = substr($code, 0, 6);
931 $sublen = 6;
932 } else {
933 $rest = '';
934 $sublen = strlen($code);
935 }
936 if ($sublen == 6) {
937 $t = bcmul(''.ord($code[0]), '1099511627776');
938 $t = bcadd($t, bcmul(''.ord($code[1]), '4294967296'));
939 $t = bcadd($t, bcmul(''.ord($code[2]), '16777216'));
940 $t = bcadd($t, bcmul(''.ord($code[3]), '65536'));
941 $t = bcadd($t, bcmul(''.ord($code[4]), '256'));
942 $t = bcadd($t, ''.ord($code[5]));
943 // tmp array for the 6 bytes block
944 $cw6 = array();
945 do {
946 $d = bcmod($t, '900');
947 $t = bcdiv($t, '900');
948 // prepend the value to the beginning of the array
949 array_unshift($cw6, $d);
950 } while ($t != '0');
951 // append the result array at the end
952 $cw = array_merge($cw, $cw6);
953 } else {
954 for ($i = 0; $i < $sublen; ++$i) {
955 $cw[] = ord($code{$i});
956 }
957 }
958 $code = $rest;
959 }
960 break;
961 }
962 case 902: { // Numeric Compaction mode latch
963 while (($codelen = strlen($code)) > 0) {
964 if ($codelen > 44) {
965 $rest = substr($code, 44);
966 $code = substr($code, 0, 44);
967 } else {
968 $rest = '';
969 }
970 $t = '1'.$code;
971 do {
972 $d = bcmod($t, '900');
973 $t = bcdiv($t, '900');
974 array_unshift($cw, $d);
975 } while ($t != '0');
976 $code = $rest;
977 }
978 break;
979 }
980 case 913: { // Byte Compaction mode shift
981 $cw[] = ord($code);
982 break;
983 }
984 }
985 if ($addmode) {
986 // add the compaction mode codeword at the beginning
987 array_unshift($cw, $mode);
988 }
989 return $cw;
990 }
991
992} // end PDF417 class
993
994//============================================================+
995// END OF FILE
996//============================================================+
diff --git a/inc/3rdparty/libraries/tcpdf/include/barcodes/qrcode.php b/inc/3rdparty/libraries/tcpdf/include/barcodes/qrcode.php
new file mode 100644
index 00000000..3127fe68
--- /dev/null
+++ b/inc/3rdparty/libraries/tcpdf/include/barcodes/qrcode.php
@@ -0,0 +1,2866 @@
1<?php
2//============================================================+
3// File name : qrcode.php
4// Version : 1.0.010
5// Begin : 2010-03-22
6// Last Update : 2012-07-25
7// Author : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
8// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
9// -------------------------------------------------------------------
10// Copyright (C) 2010-2012 Nicola Asuni - Tecnick.com LTD
11//
12// This file is part of TCPDF software library.
13//
14// TCPDF is free software: you can redistribute it and/or modify it
15// under the terms of the GNU Lesser General Public License as
16// published by the Free Software Foundation, either version 3 of the
17// License, or (at your option) any later version.
18//
19// TCPDF is distributed in the hope that it will be useful, but
20// WITHOUT ANY WARRANTY; without even the implied warranty of
21// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
22// See the GNU Lesser General Public License for more details.
23//
24// You should have received a copy of the GNU Lesser General Public License
25// along with TCPDF. If not, see <http://www.gnu.org/licenses/>.
26//
27// See LICENSE.TXT file for more information.
28// -------------------------------------------------------------------
29//
30// DESCRIPTION :
31//
32// Class to create QR-code arrays for TCPDF class.
33// QR Code symbol is a 2D barcode that can be scanned by
34// handy terminals such as a mobile phone with CCD.
35// The capacity of QR Code is up to 7000 digits or 4000
36// characters, and has high robustness.
37// This class supports QR Code model 2, described in
38// JIS (Japanese Industrial Standards) X0510:2004
39// or ISO/IEC 18004.
40// Currently the following features are not supported:
41// ECI and FNC1 mode, Micro QR Code, QR Code model 1,
42// Structured mode.
43//
44// This class is derived from the following projects:
45// ---------------------------------------------------------
46// "PHP QR Code encoder"
47// License: GNU-LGPLv3
48// Copyright (C) 2010 by Dominik Dzienia <deltalab at poczta dot fm>
49// http://phpqrcode.sourceforge.net/
50// https://sourceforge.net/projects/phpqrcode/
51//
52// The "PHP QR Code encoder" is based on
53// "C libqrencode library" (ver. 3.1.1)
54// License: GNU-LGPL 2.1
55// Copyright (C) 2006-2010 by Kentaro Fukuchi
56// http://megaui.net/fukuchi/works/qrencode/index.en.html
57//
58// Reed-Solomon code encoder is written by Phil Karn, KA9Q.
59// Copyright (C) 2002-2006 Phil Karn, KA9Q
60//
61// QR Code is registered trademark of DENSO WAVE INCORPORATED
62// http://www.denso-wave.com/qrcode/index-e.html
63// ---------------------------------------------------------
64//============================================================+
65
66/**
67 * @file
68 * Class to create QR-code arrays for TCPDF class.
69 * QR Code symbol is a 2D barcode that can be scanned by handy terminals such as a mobile phone with CCD.
70 * The capacity of QR Code is up to 7000 digits or 4000 characters, and has high robustness.
71 * This class supports QR Code model 2, described in JIS (Japanese Industrial Standards) X0510:2004 or ISO/IEC 18004.
72 * Currently the following features are not supported: ECI and FNC1 mode, Micro QR Code, QR Code model 1, Structured mode.
73 *
74 * 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).
75 * Please read comments on this class source file for full copyright and license information.
76 *
77 * @package com.tecnick.tcpdf
78 * @author Nicola Asuni
79 * @version 1.0.010
80 */
81
82// definitions
83if (!defined('QRCODEDEFS')) {
84
85 /**
86 * Indicate that definitions for this class are set
87 */
88 define('QRCODEDEFS', true);
89
90 // -----------------------------------------------------
91
92 // Encoding modes (characters which can be encoded in QRcode)
93
94 /**
95 * Encoding mode
96 */
97 define('QR_MODE_NL', -1);
98
99 /**
100 * Encoding mode numeric (0-9). 3 characters are encoded to 10bit length. In theory, 7089 characters or less can be stored in a QRcode.
101 */
102 define('QR_MODE_NM', 0);
103
104 /**
105 * 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.
106 */
107 define('QR_MODE_AN', 1);
108
109 /**
110 * Encoding mode 8bit byte data. In theory, 2953 characters or less can be stored in a QRcode.
111 */
112 define('QR_MODE_8B', 2);
113
114 /**
115 * 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.
116 */
117 define('QR_MODE_KJ', 3);
118
119 /**
120 * Encoding mode STRUCTURED (currently unsupported)
121 */
122 define('QR_MODE_ST', 4);
123
124 // -----------------------------------------------------
125
126 // Levels of error correction.
127 // QRcode has a function of an error correcting for miss reading that white is black.
128 // Error correcting is defined in 4 level as below.
129
130 /**
131 * Error correction level L : About 7% or less errors can be corrected.
132 */
133 define('QR_ECLEVEL_L', 0);
134
135 /**
136 * Error correction level M : About 15% or less errors can be corrected.
137 */
138 define('QR_ECLEVEL_M', 1);
139
140 /**
141 * Error correction level Q : About 25% or less errors can be corrected.
142 */
143 define('QR_ECLEVEL_Q', 2);
144
145 /**
146 * Error correction level H : About 30% or less errors can be corrected.
147 */
148 define('QR_ECLEVEL_H', 3);
149
150 // -----------------------------------------------------
151
152 // Version. Size of QRcode is defined as version.
153 // Version is from 1 to 40.
154 // Version 1 is 21*21 matrix. And 4 modules increases whenever 1 version increases.
155 // So version 40 is 177*177 matrix.
156
157 /**
158 * Maximum QR Code version.
159 */
160 define('QRSPEC_VERSION_MAX', 40);
161
162 /**
163 * Maximum matrix size for maximum version (version 40 is 177*177 matrix).
164 */
165 define('QRSPEC_WIDTH_MAX', 177);
166
167 // -----------------------------------------------------
168
169 /**
170 * Matrix index to get width from $capacity array.
171 */
172 define('QRCAP_WIDTH', 0);
173
174 /**
175 * Matrix index to get number of words from $capacity array.
176 */
177 define('QRCAP_WORDS', 1);
178
179 /**
180 * Matrix index to get remainder from $capacity array.
181 */
182 define('QRCAP_REMINDER', 2);
183
184 /**
185 * Matrix index to get error correction level from $capacity array.
186 */
187 define('QRCAP_EC', 3);
188
189 // -----------------------------------------------------
190
191 // Structure (currently usupported)
192
193 /**
194 * Number of header bits for structured mode
195 */
196 define('STRUCTURE_HEADER_BITS', 20);
197
198 /**
199 * Max number of symbols for structured mode
200 */
201 define('MAX_STRUCTURED_SYMBOLS', 16);
202
203 // -----------------------------------------------------
204
205 // Masks
206
207 /**
208 * Down point base value for case 1 mask pattern (concatenation of same color in a line or a column)
209 */
210 define('N1', 3);
211
212 /**
213 * Down point base value for case 2 mask pattern (module block of same color)
214 */
215 define('N2', 3);
216
217 /**
218 * 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)
219 */
220 define('N3', 40);
221
222 /**
223 * Down point base value for case 4 mask pattern (ration of dark modules in whole)
224 */
225 define('N4', 10);
226
227 // -----------------------------------------------------
228
229 // Optimization settings
230
231 /**
232 * if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code
233 */
234 define('QR_FIND_BEST_MASK', true);
235
236 /**
237 * if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly
238 */
239 define('QR_FIND_FROM_RANDOM', 2);
240
241 /**
242 * when QR_FIND_BEST_MASK === false
243 */
244 define('QR_DEFAULT_MASK', 2);
245
246 // -----------------------------------------------------
247
248} // end of definitions
249
250// #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#
251
252// for compatibility with PHP4
253if (!function_exists('str_split')) {
254 /**
255 * Convert a string to an array (needed for PHP4 compatibility)
256 * @param $string (string) The input string.
257 * @param $split_length (int) Maximum length of the chunk.
258 * @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.
259 */
260 function str_split($string, $split_length=1) {
261 if ((strlen($string) > $split_length) OR (!$split_length)) {
262 do {
263 $c = strlen($string);
264 $parts[] = substr($string, 0, $split_length);
265 $string = substr($string, $split_length);
266 } while ($string !== false);
267 } else {
268 $parts = array($string);
269 }
270 return $parts;
271 }
272}
273
274// #####################################################
275
276/**
277 * @class QRcode
278 * Class to create QR-code arrays for TCPDF class.
279 * QR Code symbol is a 2D barcode that can be scanned by handy terminals such as a mobile phone with CCD.
280 * The capacity of QR Code is up to 7000 digits or 4000 characters, and has high robustness.
281 * This class supports QR Code model 2, described in JIS (Japanese Industrial Standards) X0510:2004 or ISO/IEC 18004.
282 * Currently the following features are not supported: ECI and FNC1 mode, Micro QR Code, QR Code model 1, Structured mode.
283 *
284 * 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).
285 * Please read comments on this class source file for full copyright and license information.
286 *
287 * @package com.tecnick.tcpdf
288 * @author Nicola Asuni
289 * @version 1.0.010
290 */
291class QRcode {
292
293 /**
294 * Barcode array to be returned which is readable by TCPDF.
295 * @protected
296 */
297 protected $barcode_array = array();
298
299 /**
300 * 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.
301 * @protected
302 */
303 protected $version = 0;
304
305 /**
306 * Levels of error correction. See definitions for possible values.
307 * @protected
308 */
309 protected $level = QR_ECLEVEL_L;
310
311 /**
312 * Encoding mode.
313 * @protected
314 */
315 protected $hint = QR_MODE_8B;
316
317 /**
318 * Boolean flag, if true the input string will be converted to uppercase.
319 * @protected
320 */
321 protected $casesensitive = true;
322
323 /**
324 * Structured QR code (not supported yet).
325 * @protected
326 */
327 protected $structured = 0;
328
329 /**
330 * Mask data.
331 * @protected
332 */
333 protected $data;
334
335 // FrameFiller
336
337 /**
338 * Width.
339 * @protected
340 */
341 protected $width;
342
343 /**
344 * Frame.
345 * @protected
346 */
347 protected $frame;
348
349 /**
350 * X position of bit.
351 * @protected
352 */
353 protected $x;
354
355 /**
356 * Y position of bit.
357 * @protected
358 */
359 protected $y;
360
361 /**
362 * Direction.
363 * @protected
364 */
365 protected $dir;
366
367 /**
368 * Single bit value.
369 * @protected
370 */
371 protected $bit;
372
373 // ---- QRrawcode ----
374
375 /**
376 * Data code.
377 * @protected
378 */
379 protected $datacode = array();
380
381 /**
382 * Error correction code.
383 * @protected
384 */
385 protected $ecccode = array();
386
387 /**
388 * Blocks.
389 * @protected
390 */
391 protected $blocks;
392
393 /**
394 * Reed-Solomon blocks.
395 * @protected
396 */
397 protected $rsblocks = array(); //of RSblock
398
399 /**
400 * Counter.
401 * @protected
402 */
403 protected $count;
404
405 /**
406 * Data length.
407 * @protected
408 */
409 protected $dataLength;
410
411 /**
412 * Error correction length.
413 * @protected
414 */
415 protected $eccLength;
416
417 /**
418 * Value b1.
419 * @protected
420 */
421 protected $b1;
422
423 // ---- QRmask ----
424
425 /**
426 * Run length.
427 * @protected
428 */
429 protected $runLength = array();
430
431 // ---- QRsplit ----
432
433 /**
434 * Input data string.
435 * @protected
436 */
437 protected $dataStr = '';
438
439 /**
440 * Input items.
441 * @protected
442 */
443 protected $items;
444
445 // Reed-Solomon items
446
447 /**
448 * Reed-Solomon items.
449 * @protected
450 */
451 protected $rsitems = array();
452
453 /**
454 * Array of frames.
455 * @protected
456 */
457 protected $frames = array();
458
459 /**
460 * Alphabet-numeric convesion table.
461 * @protected
462 */
463 protected $anTable = array(
464 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //
465 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //
466 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, //
467 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, //
468 -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, //
469 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, //
470 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //
471 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 //
472 );
473
474 /**
475 * Array Table of the capacity of symbols.
476 * See Table 1 (pp.13) and Table 12-16 (pp.30-36), JIS X0510:2004.
477 * @protected
478 */
479 protected $capacity = array(
480 array( 0, 0, 0, array( 0, 0, 0, 0)), //
481 array( 21, 26, 0, array( 7, 10, 13, 17)), // 1
482 array( 25, 44, 7, array( 10, 16, 22, 28)), //
483 array( 29, 70, 7, array( 15, 26, 36, 44)), //
484 array( 33, 100, 7, array( 20, 36, 52, 64)), //
485 array( 37, 134, 7, array( 26, 48, 72, 88)), // 5
486 array( 41, 172, 7, array( 36, 64, 96, 112)), //
487 array( 45, 196, 0, array( 40, 72, 108, 130)), //
488 array( 49, 242, 0, array( 48, 88, 132, 156)), //
489 array( 53, 292, 0, array( 60, 110, 160, 192)), //
490 array( 57, 346, 0, array( 72, 130, 192, 224)), // 10
491 array( 61, 404, 0, array( 80, 150, 224, 264)), //
492 array( 65, 466, 0, array( 96, 176, 260, 308)), //
493 array( 69, 532, 0, array( 104, 198, 288, 352)), //
494 array( 73, 581, 3, array( 120, 216, 320, 384)), //
495 array( 77, 655, 3, array( 132, 240, 360, 432)), // 15
496 array( 81, 733, 3, array( 144, 280, 408, 480)), //
497 array( 85, 815, 3, array( 168, 308, 448, 532)), //
498 array( 89, 901, 3, array( 180, 338, 504, 588)), //
499 array( 93, 991, 3, array( 196, 364, 546, 650)), //
500 array( 97, 1085, 3, array( 224, 416, 600, 700)), // 20
501 array(101, 1156, 4, array( 224, 442, 644, 750)), //
502 array(105, 1258, 4, array( 252, 476, 690, 816)), //
503 array(109, 1364, 4, array( 270, 504, 750, 900)), //
504 array(113, 1474, 4, array( 300, 560, 810, 960)), //
505 array(117, 1588, 4, array( 312, 588, 870, 1050)), // 25
506 array(121, 1706, 4, array( 336, 644, 952, 1110)), //
507 array(125, 1828, 4, array( 360, 700, 1020, 1200)), //
508 array(129, 1921, 3, array( 390, 728, 1050, 1260)), //
509 array(133, 2051, 3, array( 420, 784, 1140, 1350)), //
510 array(137, 2185, 3, array( 450, 812, 1200, 1440)), // 30
511 array(141, 2323, 3, array( 480, 868, 1290, 1530)), //
512 array(145, 2465, 3, array( 510, 924, 1350, 1620)), //
513 array(149, 2611, 3, array( 540, 980, 1440, 1710)), //
514 array(153, 2761, 3, array( 570, 1036, 1530, 1800)), //
515 array(157, 2876, 0, array( 570, 1064, 1590, 1890)), // 35
516 array(161, 3034, 0, array( 600, 1120, 1680, 1980)), //
517 array(165, 3196, 0, array( 630, 1204, 1770, 2100)), //
518 array(169, 3362, 0, array( 660, 1260, 1860, 2220)), //
519 array(173, 3532, 0, array( 720, 1316, 1950, 2310)), //
520 array(177, 3706, 0, array( 750, 1372, 2040, 2430)) // 40
521 );
522
523 /**
524 * Array Length indicator.
525 * @protected
526 */
527 protected $lengthTableBits = array(
528 array(10, 12, 14),
529 array( 9, 11, 13),
530 array( 8, 16, 16),
531 array( 8, 10, 12)
532 );
533
534 /**
535 * Array Table of the error correction code (Reed-Solomon block).
536 * See Table 12-16 (pp.30-36), JIS X0510:2004.
537 * @protected
538 */
539 protected $eccTable = array(
540 array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)), //
541 array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1
542 array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), //
543 array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)), //
544 array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)), //
545 array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5
546 array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)), //
547 array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)), //
548 array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)), //
549 array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)), //
550 array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), // 10
551 array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)), //
552 array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)), //
553 array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)), //
554 array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)), //
555 array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), // 15
556 array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)), //
557 array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)), //
558 array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)), //
559 array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)), //
560 array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), // 20
561 array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)), //
562 array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)), //
563 array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)), //
564 array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)), //
565 array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), // 25
566 array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)), //
567 array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)), //
568 array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)), //
569 array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)), //
570 array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), // 30
571 array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)), //
572 array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)), //
573 array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)), //
574 array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)), //
575 array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), // 35
576 array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)), //
577 array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)), //
578 array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)), //
579 array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)), //
580 array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)) // 40
581 );
582
583 /**
584 * Array Positions of alignment patterns.
585 * 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.
586 * See Table 1 in Appendix E (pp.71) of JIS X0510:2004.
587 * @protected
588 */
589 protected $alignmentPattern = array(
590 array( 0, 0),
591 array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5
592 array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10
593 array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), // 11-15
594 array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), // 16-20
595 array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), // 21-25
596 array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), // 26-30
597 array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), // 31-35
598 array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58) // 35-40
599 );
600
601 /**
602 * Array Version information pattern (BCH coded).
603 * See Table 1 in Appendix D (pp.68) of JIS X0510:2004.
604 * size: [QRSPEC_VERSION_MAX - 6]
605 * @protected
606 */
607 protected $versionPattern = array(
608 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, //
609 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, //
610 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, //
611 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64, //
612 0x27541, 0x28c69
613 );
614
615 /**
616 * Array Format information
617 * @protected
618 */
619 protected $formatInfo = array(
620 array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976), //
621 array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0), //
622 array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed), //
623 array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b) //
624 );
625
626
627 // -------------------------------------------------
628 // -------------------------------------------------
629
630
631 /**
632 * This is the class constructor.
633 * Creates a QRcode object
634 * @param $code (string) code to represent using QRcode
635 * @param $eclevel (string) error level: <ul><li>L : About 7% or less errors can be corrected.</li><li>M : About 15% or less errors can be corrected.</li><li>Q : About 25% or less errors can be corrected.</li><li>H : About 30% or less errors can be corrected.</li></ul>
636 * @public
637 * @since 1.0.000
638 */
639 public function __construct($code, $eclevel = 'L') {
640 $barcode_array = array();
641 if ((is_null($code)) OR ($code == '\0') OR ($code == '')) {
642 return false;
643 }
644 // set error correction level
645 $this->level = array_search($eclevel, array('L', 'M', 'Q', 'H'));
646 if ($this->level === false) {
647 $this->level = QR_ECLEVEL_L;
648 }
649 if (($this->hint != QR_MODE_8B) AND ($this->hint != QR_MODE_KJ)) {
650 return false;
651 }
652 if (($this->version < 0) OR ($this->version > QRSPEC_VERSION_MAX)) {
653 return false;
654 }
655 $this->items = array();
656 $this->encodeString($code);
657 if (is_null($this->data)) {
658 return false;
659 }
660 $qrTab = $this->binarize($this->data);
661 $size = count($qrTab);
662 $barcode_array['num_rows'] = $size;
663 $barcode_array['num_cols'] = $size;
664 $barcode_array['bcode'] = array();
665 foreach ($qrTab as $line) {
666 $arrAdd = array();
667 foreach (str_split($line) as $char) {
668 $arrAdd[] = ($char=='1')?1:0;
669 }
670 $barcode_array['bcode'][] = $arrAdd;
671 }
672 $this->barcode_array = $barcode_array;
673 }
674
675 /**
676 * Returns a barcode array which is readable by TCPDF
677 * @return array barcode array readable by TCPDF;
678 * @public
679 */
680 public function getBarcodeArray() {
681 return $this->barcode_array;
682 }
683
684 /**
685 * Convert the frame in binary form
686 * @param $frame (array) array to binarize
687 * @return array frame in binary form
688 */
689 protected function binarize($frame) {
690 $len = count($frame);
691 // the frame is square (width = height)
692 foreach ($frame as &$frameLine) {
693 for ($i=0; $i<$len; $i++) {
694 $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0';
695 }
696 }
697 return $frame;
698 }
699
700 /**
701 * Encode the input string to QR code
702 * @param $string (string) input string to encode
703 */
704 protected function encodeString($string) {
705 $this->dataStr = $string;
706 if (!$this->casesensitive) {
707 $this->toUpper();
708 }
709 $ret = $this->splitString();
710 if ($ret < 0) {
711 return NULL;
712 }
713 $this->encodeMask(-1);
714 }
715
716 /**
717 * Encode mask
718 * @param $mask (int) masking mode
719 */
720 protected function encodeMask($mask) {
721 $spec = array(0, 0, 0, 0, 0);
722 $this->datacode = $this->getByteStream($this->items);
723 if (is_null($this->datacode)) {
724 return NULL;
725 }
726 $spec = $this->getEccSpec($this->version, $this->level, $spec);
727 $this->b1 = $this->rsBlockNum1($spec);
728 $this->dataLength = $this->rsDataLength($spec);
729 $this->eccLength = $this->rsEccLength($spec);
730 $this->ecccode = array_fill(0, $this->eccLength, 0);
731 $this->blocks = $this->rsBlockNum($spec);
732 $ret = $this->init($spec);
733 if ($ret < 0) {
734 return NULL;
735 }
736 $this->count = 0;
737 $this->width = $this->getWidth($this->version);
738 $this->frame = $this->newFrame($this->version);
739 $this->x = $this->width - 1;
740 $this->y = $this->width - 1;
741 $this->dir = -1;
742 $this->bit = -1;
743 // inteleaved data and ecc codes
744 for ($i=0; $i < ($this->dataLength + $this->eccLength); $i++) {
745 $code = $this->getCode();
746 $bit = 0x80;
747 for ($j=0; $j<8; $j++) {
748 $addr = $this->getNextPosition();
749 $this->setFrameAt($addr, 0x02 | (($bit & $code) != 0));
750 $bit = $bit >> 1;
751 }
752 }
753 // remainder bits
754 $j = $this->getRemainder($this->version);
755 for ($i=0; $i<$j; $i++) {
756 $addr = $this->getNextPosition();
757 $this->setFrameAt($addr, 0x02);
758 }
759 // masking
760 $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0);
761 if ($mask < 0) {
762 if (QR_FIND_BEST_MASK) {
763 $masked = $this->mask($this->width, $this->frame, $this->level);
764 } else {
765 $masked = $this->makeMask($this->width, $this->frame, (intval(QR_DEFAULT_MASK) % 8), $this->level);
766 }
767 } else {
768 $masked = $this->makeMask($this->width, $this->frame, $mask, $this->level);
769 }
770 if ($masked == NULL) {
771 return NULL;
772 }
773 $this->data = $masked;
774 }
775
776 // - - - - - - - - - - - - - - - - - - - - - - - - -
777
778 // FrameFiller
779
780 /**
781 * Set frame value at specified position
782 * @param $at (array) x,y position
783 * @param $val (int) value of the character to set
784 */
785 protected function setFrameAt($at, $val) {
786 $this->frame[$at['y']][$at['x']] = chr($val);
787 }
788
789 /**
790 * Get frame value at specified position
791 * @param $at (array) x,y position
792 * @return value at specified position
793 */
794 protected function getFrameAt($at) {
795 return ord($this->frame[$at['y']][$at['x']]);
796 }
797
798 /**
799 * Return the next frame position
800 * @return array of x,y coordinates
801 */
802 protected function getNextPosition() {
803 do {
804 if ($this->bit == -1) {
805 $this->bit = 0;
806 return array('x'=>$this->x, 'y'=>$this->y);
807 }
808 $x = $this->x;
809 $y = $this->y;
810 $w = $this->width;
811 if ($this->bit == 0) {
812 $x--;
813 $this->bit++;
814 } else {
815 $x++;
816 $y += $this->dir;
817 $this->bit--;
818 }
819 if ($this->dir < 0) {
820 if ($y < 0) {
821 $y = 0;
822 $x -= 2;
823 $this->dir = 1;
824 if ($x == 6) {
825 $x--;
826 $y = 9;
827 }
828 }
829 } else {
830 if ($y == $w) {
831 $y = $w - 1;
832 $x -= 2;
833 $this->dir = -1;
834 if ($x == 6) {
835 $x--;
836 $y -= 8;
837 }
838 }
839 }
840 if (($x < 0) OR ($y < 0)) {
841 return NULL;
842 }
843 $this->x = $x;
844 $this->y = $y;
845 } while(ord($this->frame[$y][$x]) & 0x80);
846 return array('x'=>$x, 'y'=>$y);
847 }
848
849 // - - - - - - - - - - - - - - - - - - - - - - - - -
850
851 // QRrawcode
852
853 /**
854 * Initialize code.
855 * @param $spec (array) array of ECC specification
856 * @return 0 in case of success, -1 in case of error
857 */
858 protected function init($spec) {
859 $dl = $this->rsDataCodes1($spec);
860 $el = $this->rsEccCodes1($spec);
861 $rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
862 $blockNo = 0;
863 $dataPos = 0;
864 $eccPos = 0;
865 $endfor = $this->rsBlockNum1($spec);
866 for ($i=0; $i < $endfor; ++$i) {
867 $ecc = array_slice($this->ecccode, $eccPos);
868 $this->rsblocks[$blockNo] = array();
869 $this->rsblocks[$blockNo]['dataLength'] = $dl;
870 $this->rsblocks[$blockNo]['data'] = array_slice($this->datacode, $dataPos);
871 $this->rsblocks[$blockNo]['eccLength'] = $el;
872 $ecc = $this->encode_rs_char($rs, $this->rsblocks[$blockNo]['data'], $ecc);
873 $this->rsblocks[$blockNo]['ecc'] = $ecc;
874 $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);
875 $dataPos += $dl;
876 $eccPos += $el;
877 $blockNo++;
878 }
879 if ($this->rsBlockNum2($spec) == 0) {
880 return 0;
881 }
882 $dl = $this->rsDataCodes2($spec);
883 $el = $this->rsEccCodes2($spec);
884 $rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
885 if ($rs == NULL) {
886 return -1;
887 }
888 $endfor = $this->rsBlockNum2($spec);
889 for ($i=0; $i < $endfor; ++$i) {
890 $ecc = array_slice($this->ecccode, $eccPos);
891 $this->rsblocks[$blockNo] = array();
892 $this->rsblocks[$blockNo]['dataLength'] = $dl;
893 $this->rsblocks[$blockNo]['data'] = array_slice($this->datacode, $dataPos);
894 $this->rsblocks[$blockNo]['eccLength'] = $el;
895 $ecc = $this->encode_rs_char($rs, $this->rsblocks[$blockNo]['data'], $ecc);
896 $this->rsblocks[$blockNo]['ecc'] = $ecc;
897 $this->ecccode = array_merge(array_slice($this->ecccode, 0, $eccPos), $ecc);
898 $dataPos += $dl;
899 $eccPos += $el;
900 $blockNo++;
901 }
902 return 0;
903 }
904
905 /**
906 * Return Reed-Solomon block code.
907 * @return array rsblocks
908 */
909 protected function getCode() {
910 if ($this->count < $this->dataLength) {
911 $row = $this->count % $this->blocks;
912 $col = $this->count / $this->blocks;
913 if ($col >= $this->rsblocks[0]['dataLength']) {
914 $row += $this->b1;
915 }
916 $ret = $this->rsblocks[$row]['data'][$col];
917 } elseif ($this->count < $this->dataLength + $this->eccLength) {
918 $row = ($this->count - $this->dataLength) % $this->blocks;
919 $col = ($this->count - $this->dataLength) / $this->blocks;
920 $ret = $this->rsblocks[$row]['ecc'][$col];
921 } else {
922 return 0;
923 }
924 $this->count++;
925 return $ret;
926 }
927
928 // - - - - - - - - - - - - - - - - - - - - - - - - -
929
930 // QRmask
931
932 /**
933 * Write Format Information on frame and returns the number of black bits
934 * @param $width (int) frame width
935 * @param $frame (array) frame
936 * @param $mask (array) masking mode
937 * @param $level (int) error correction level
938 * @return int blacks
939 */
940 protected function writeFormatInformation($width, &$frame, $mask, $level) {
941 $blacks = 0;
942 $format = $this->getFormatInfo($mask, $level);
943 for ($i=0; $i<8; ++$i) {
944 if ($format & 1) {
945 $blacks += 2;
946 $v = 0x85;
947 } else {
948 $v = 0x84;
949 }
950 $frame[8][$width - 1 - $i] = chr($v);
951 if ($i < 6) {
952 $frame[$i][8] = chr($v);
953 } else {
954 $frame[$i + 1][8] = chr($v);
955 }
956 $format = $format >> 1;
957 }
958 for ($i=0; $i<7; ++$i) {
959 if ($format & 1) {
960 $blacks += 2;
961 $v = 0x85;
962 } else {
963 $v = 0x84;
964 }
965 $frame[$width - 7 + $i][8] = chr($v);
966 if ($i == 0) {
967 $frame[8][7] = chr($v);
968 } else {
969 $frame[8][6 - $i] = chr($v);
970 }
971 $format = $format >> 1;
972 }
973 return $blacks;
974 }
975
976 /**
977 * mask0
978 * @param $x (int) X position
979 * @param $y (int) Y position
980 * @return int mask
981 */
982 protected function mask0($x, $y) {
983 return ($x + $y) & 1;
984 }
985
986 /**
987 * mask1
988 * @param $x (int) X position
989 * @param $y (int) Y position
990 * @return int mask
991 */
992 protected function mask1($x, $y) {
993 return ($y & 1);
994 }
995
996 /**
997 * mask2
998 * @param $x (int) X position
999 * @param $y (int) Y position
1000 * @return int mask
1001 */
1002 protected function mask2($x, $y) {
1003 return ($x % 3);
1004 }
1005
1006 /**
1007 * mask3
1008 * @param $x (int) X position
1009 * @param $y (int) Y position
1010 * @return int mask
1011 */
1012 protected function mask3($x, $y) {
1013 return ($x + $y) % 3;
1014 }
1015
1016 /**
1017 * mask4
1018 * @param $x (int) X position
1019 * @param $y (int) Y position
1020 * @return int mask
1021 */
1022 protected function mask4($x, $y) {
1023 return (((int)($y / 2)) + ((int)($x / 3))) & 1;
1024 }
1025
1026 /**
1027 * mask5
1028 * @param $x (int) X position
1029 * @param $y (int) Y position
1030 * @return int mask
1031 */
1032 protected function mask5($x, $y) {
1033 return (($x * $y) & 1) + ($x * $y) % 3;
1034 }
1035
1036 /**
1037 * mask6
1038 * @param $x (int) X position
1039 * @param $y (int) Y position
1040 * @return int mask
1041 */
1042 protected function mask6($x, $y) {
1043 return ((($x * $y) & 1) + ($x * $y) % 3) & 1;
1044 }
1045
1046 /**
1047 * mask7
1048 * @param $x (int) X position
1049 * @param $y (int) Y position
1050 * @return int mask
1051 */
1052 protected function mask7($x, $y) {
1053 return ((($x * $y) % 3) + (($x + $y) & 1)) & 1;
1054 }
1055
1056 /**
1057 * Return bitmask
1058 * @param $maskNo (int) mask number
1059 * @param $width (int) width
1060 * @param $frame (array) frame
1061 * @return array bitmask
1062 */
1063 protected function generateMaskNo($maskNo, $width, $frame) {
1064 $bitMask = array_fill(0, $width, array_fill(0, $width, 0));
1065 for ($y=0; $y<$width; ++$y) {
1066 for ($x=0; $x<$width; ++$x) {
1067 if (ord($frame[$y][$x]) & 0x80) {
1068 $bitMask[$y][$x] = 0;
1069 } else {
1070 $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y);
1071 $bitMask[$y][$x] = ($maskFunc == 0)?1:0;
1072 }
1073 }
1074 }
1075 return $bitMask;
1076 }
1077
1078 /**
1079 * makeMaskNo
1080 * @param $maskNo (int)
1081 * @param $width (int)
1082 * @param $s (int)
1083 * @param $d (int)
1084 * @param $maskGenOnly (boolean)
1085 * @return int b
1086 */
1087 protected function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly=false) {
1088 $b = 0;
1089 $bitMask = array();
1090 $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);
1091 if ($maskGenOnly) {
1092 return;
1093 }
1094 $d = $s;
1095 for ($y=0; $y<$width; ++$y) {
1096 for ($x=0; $x<$width; ++$x) {
1097 if ($bitMask[$y][$x] == 1) {
1098 $d[$y][$x] = chr(ord($s[$y][$x]) ^ ((int)($bitMask[$y][$x])));
1099 }
1100 $b += (int)(ord($d[$y][$x]) & 1);
1101 }
1102 }
1103 return $b;
1104 }
1105
1106 /**
1107 * makeMask
1108 * @param $width (int)
1109 * @param $frame (array)
1110 * @param $maskNo (int)
1111 * @param $level (int)
1112 * @return array mask
1113 */
1114 protected function makeMask($width, $frame, $maskNo, $level) {
1115 $masked = array_fill(0, $width, str_repeat("\0", $width));
1116 $this->makeMaskNo($maskNo, $width, $frame, $masked);
1117 $this->writeFormatInformation($width, $masked, $maskNo, $level);
1118 return $masked;
1119 }
1120
1121 /**
1122 * calcN1N3
1123 * @param $length (int)
1124 * @return int demerit
1125 */
1126 protected function calcN1N3($length) {
1127 $demerit = 0;
1128 for ($i=0; $i<$length; ++$i) {
1129 if ($this->runLength[$i] >= 5) {
1130 $demerit += (N1 + ($this->runLength[$i] - 5));
1131 }
1132 if ($i & 1) {
1133 if (($i >= 3) AND ($i < ($length-2)) AND ($this->runLength[$i] % 3 == 0)) {
1134 $fact = (int)($this->runLength[$i] / 3);
1135 if (($this->runLength[$i-2] == $fact)
1136 AND ($this->runLength[$i-1] == $fact)
1137 AND ($this->runLength[$i+1] == $fact)
1138 AND ($this->runLength[$i+2] == $fact)) {
1139 if (($this->runLength[$i-3] < 0) OR ($this->runLength[$i-3] >= (4 * $fact))) {
1140 $demerit += N3;
1141 } elseif ((($i+3) >= $length) OR ($this->runLength[$i+3] >= (4 * $fact))) {
1142 $demerit += N3;
1143 }
1144 }
1145 }
1146 }
1147 }
1148 return $demerit;
1149 }
1150
1151 /**
1152 * evaluateSymbol
1153 * @param $width (int)
1154 * @param $frame (array)
1155 * @return int demerit
1156 */
1157 protected function evaluateSymbol($width, $frame) {
1158 $head = 0;
1159 $demerit = 0;
1160 for ($y=0; $y<$width; ++$y) {
1161 $head = 0;
1162 $this->runLength[0] = 1;
1163 $frameY = $frame[$y];
1164 if ($y > 0) {
1165 $frameYM = $frame[$y-1];
1166 }
1167 for ($x=0; $x<$width; ++$x) {
1168 if (($x > 0) AND ($y > 0)) {
1169 $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]);
1170 $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]);
1171 if (($b22 | ($w22 ^ 1)) & 1) {
1172 $demerit += N2;
1173 }
1174 }
1175 if (($x == 0) AND (ord($frameY[$x]) & 1)) {
1176 $this->runLength[0] = -1;
1177 $head = 1;
1178 $this->runLength[$head] = 1;
1179 } elseif ($x > 0) {
1180 if ((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) {
1181 $head++;
1182 $this->runLength[$head] = 1;
1183 } else {
1184 $this->runLength[$head]++;
1185 }
1186 }
1187 }
1188 $demerit += $this->calcN1N3($head+1);
1189 }
1190 for ($x=0; $x<$width; ++$x) {
1191 $head = 0;
1192 $this->runLength[0] = 1;
1193 for ($y=0; $y<$width; ++$y) {
1194 if (($y == 0) AND (ord($frame[$y][$x]) & 1)) {
1195 $this->runLength[0] = -1;
1196 $head = 1;
1197 $this->runLength[$head] = 1;
1198 } elseif ($y > 0) {
1199 if ((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) {
1200 $head++;
1201 $this->runLength[$head] = 1;
1202 } else {
1203 $this->runLength[$head]++;
1204 }
1205 }
1206 }
1207 $demerit += $this->calcN1N3($head+1);
1208 }
1209 return $demerit;
1210 }
1211
1212 /**
1213 * mask
1214 * @param $width (int)
1215 * @param $frame (array)
1216 * @param $level (int)
1217 * @return array best mask
1218 */
1219 protected function mask($width, $frame, $level) {
1220 $minDemerit = PHP_INT_MAX;
1221 $bestMaskNum = 0;
1222 $bestMask = array();
1223 $checked_masks = array(0, 1, 2, 3, 4, 5, 6, 7);
1224 if (QR_FIND_FROM_RANDOM !== false) {
1225 $howManuOut = 8 - (QR_FIND_FROM_RANDOM % 9);
1226 for ($i = 0; $i < $howManuOut; ++$i) {
1227 $remPos = rand (0, count($checked_masks)-1);
1228 unset($checked_masks[$remPos]);
1229 $checked_masks = array_values($checked_masks);
1230 }
1231 }
1232 $bestMask = $frame;
1233 foreach ($checked_masks as $i) {
1234 $mask = array_fill(0, $width, str_repeat("\0", $width));
1235 $demerit = 0;
1236 $blacks = 0;
1237 $blacks = $this->makeMaskNo($i, $width, $frame, $mask);
1238 $blacks += $this->writeFormatInformation($width, $mask, $i, $level);
1239 $blacks = (int)(100 * $blacks / ($width * $width));
1240 $demerit = (int)((int)(abs($blacks - 50) / 5) * N4);
1241 $demerit += $this->evaluateSymbol($width, $mask);
1242 if ($demerit < $minDemerit) {
1243 $minDemerit = $demerit;
1244 $bestMask = $mask;
1245 $bestMaskNum = $i;
1246 }
1247 }
1248 return $bestMask;
1249 }
1250
1251 // - - - - - - - - - - - - - - - - - - - - - - - - -
1252
1253 // QRsplit
1254
1255 /**
1256 * Return true if the character at specified position is a number
1257 * @param $str (string) string
1258 * @param $pos (int) characted position
1259 * @return boolean true of false
1260 */
1261 protected function isdigitat($str, $pos) {
1262 if ($pos >= strlen($str)) {
1263 return false;
1264 }
1265 return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9')));
1266 }
1267
1268 /**
1269 * Return true if the character at specified position is an alphanumeric character
1270 * @param $str (string) string
1271 * @param $pos (int) characted position
1272 * @return boolean true of false
1273 */
1274 protected function isalnumat($str, $pos) {
1275 if ($pos >= strlen($str)) {
1276 return false;
1277 }
1278 return ($this->lookAnTable(ord($str[$pos])) >= 0);
1279 }
1280
1281 /**
1282 * identifyMode
1283 * @param $pos (int)
1284 * @return int mode
1285 */
1286 protected function identifyMode($pos) {
1287 if ($pos >= strlen($this->dataStr)) {
1288 return QR_MODE_NL;
1289 }
1290 $c = $this->dataStr[$pos];
1291 if ($this->isdigitat($this->dataStr, $pos)) {
1292 return QR_MODE_NM;
1293 } elseif ($this->isalnumat($this->dataStr, $pos)) {
1294 return QR_MODE_AN;
1295 } elseif ($this->hint == QR_MODE_KJ) {
1296 if ($pos+1 < strlen($this->dataStr)) {
1297 $d = $this->dataStr[$pos+1];
1298 $word = (ord($c) << 8) | ord($d);
1299 if (($word >= 0x8140 && $word <= 0x9ffc) OR ($word >= 0xe040 && $word <= 0xebbf)) {
1300 return QR_MODE_KJ;
1301 }
1302 }
1303 }
1304 return QR_MODE_8B;
1305 }
1306
1307 /**
1308 * eatNum
1309 * @return int run
1310 */
1311 protected function eatNum() {
1312 $ln = $this->lengthIndicator(QR_MODE_NM, $this->version);
1313 $p = 0;
1314 while($this->isdigitat($this->dataStr, $p)) {
1315 $p++;
1316 }
1317 $run = $p;
1318 $mode = $this->identifyMode($p);
1319 if ($mode == QR_MODE_8B) {
1320 $dif = $this->estimateBitsModeNum($run) + 4 + $ln
1321 + $this->estimateBitsMode8(1) // + 4 + l8
1322 - $this->estimateBitsMode8($run + 1); // - 4 - l8
1323 if ($dif > 0) {
1324 return $this->eat8();
1325 }
1326 }
1327 if ($mode == QR_MODE_AN) {
1328 $dif = $this->estimateBitsModeNum($run) + 4 + $ln
1329 + $this->estimateBitsModeAn(1) // + 4 + la
1330 - $this->estimateBitsModeAn($run + 1);// - 4 - la
1331 if ($dif > 0) {
1332 return $this->eatAn();
1333 }
1334 }
1335 $this->items = $this->appendNewInputItem($this->items, QR_MODE_NM, $run, str_split($this->dataStr));
1336 return $run;
1337 }
1338
1339 /**
1340 * eatAn
1341 * @return int run
1342 */
1343 protected function eatAn() {
1344 $la = $this->lengthIndicator(QR_MODE_AN, $this->version);
1345 $ln = $this->lengthIndicator(QR_MODE_NM, $this->version);
1346 $p =1 ;
1347 while($this->isalnumat($this->dataStr, $p)) {
1348 if ($this->isdigitat($this->dataStr, $p)) {
1349 $q = $p;
1350 while($this->isdigitat($this->dataStr, $q)) {
1351 $q++;
1352 }
1353 $dif = $this->estimateBitsModeAn($p) // + 4 + la
1354 + $this->estimateBitsModeNum($q - $p) + 4 + $ln
1355 - $this->estimateBitsModeAn($q); // - 4 - la
1356 if ($dif < 0) {
1357 break;
1358 } else {
1359 $p = $q;
1360 }
1361 } else {
1362 $p++;
1363 }
1364 }
1365 $run = $p;
1366 if (!$this->isalnumat($this->dataStr, $p)) {
1367 $dif = $this->estimateBitsModeAn($run) + 4 + $la
1368 + $this->estimateBitsMode8(1) // + 4 + l8
1369 - $this->estimateBitsMode8($run + 1); // - 4 - l8
1370 if ($dif > 0) {
1371 return $this->eat8();
1372 }
1373 }
1374 $this->items = $this->appendNewInputItem($this->items, QR_MODE_AN, $run, str_split($this->dataStr));
1375 return $run;
1376 }
1377
1378 /**
1379 * eatKanji
1380 * @return int run
1381 */
1382 protected function eatKanji() {
1383 $p = 0;
1384 while($this->identifyMode($p) == QR_MODE_KJ) {
1385 $p += 2;
1386 }
1387 $this->items = $this->appendNewInputItem($this->items, QR_MODE_KJ, $p, str_split($this->dataStr));
1388 return $run;
1389 }
1390
1391 /**
1392 * eat8
1393 * @return int run
1394 */
1395 protected function eat8() {
1396 $la = $this->lengthIndicator(QR_MODE_AN, $this->version);
1397 $ln = $this->lengthIndicator(QR_MODE_NM, $this->version);
1398 $p = 1;
1399 $dataStrLen = strlen($this->dataStr);
1400 while($p < $dataStrLen) {
1401 $mode = $this->identifyMode($p);
1402 if ($mode == QR_MODE_KJ) {
1403 break;
1404 }
1405 if ($mode == QR_MODE_NM) {
1406 $q = $p;
1407 while($this->isdigitat($this->dataStr, $q)) {
1408 $q++;
1409 }
1410 $dif = $this->estimateBitsMode8($p) // + 4 + l8
1411 + $this->estimateBitsModeNum($q - $p) + 4 + $ln
1412 - $this->estimateBitsMode8($q); // - 4 - l8
1413 if ($dif < 0) {
1414 break;
1415 } else {
1416 $p = $q;
1417 }
1418 } elseif ($mode == QR_MODE_AN) {
1419 $q = $p;
1420 while($this->isalnumat($this->dataStr, $q)) {
1421 $q++;
1422 }
1423 $dif = $this->estimateBitsMode8($p) // + 4 + l8
1424 + $this->estimateBitsModeAn($q - $p) + 4 + $la
1425 - $this->estimateBitsMode8($q); // - 4 - l8
1426 if ($dif < 0) {
1427 break;
1428 } else {
1429 $p = $q;
1430 }
1431 } else {
1432 $p++;
1433 }
1434 }
1435 $run = $p;
1436 $this->items = $this->appendNewInputItem($this->items, QR_MODE_8B, $run, str_split($this->dataStr));
1437 return $run;
1438 }
1439
1440 /**
1441 * splitString
1442 * @return (int)
1443 */
1444 protected function splitString() {
1445 while (strlen($this->dataStr) > 0) {
1446 $mode = $this->identifyMode(0);
1447 switch ($mode) {
1448 case QR_MODE_NM: {
1449 $length = $this->eatNum();
1450 break;
1451 }
1452 case QR_MODE_AN: {
1453 $length = $this->eatAn();
1454 break;
1455 }
1456 case QR_MODE_KJ: {
1457 if ($hint == QR_MODE_KJ) {
1458 $length = $this->eatKanji();
1459 } else {
1460 $length = $this->eat8();
1461 }
1462 break;
1463 }
1464 default: {
1465 $length = $this->eat8();
1466 break;
1467 }
1468 }
1469 if ($length == 0) {
1470 return 0;
1471 }
1472 if ($length < 0) {
1473 return -1;
1474 }
1475 $this->dataStr = substr($this->dataStr, $length);
1476 }
1477 return 0;
1478 }
1479
1480 /**
1481 * toUpper
1482 */
1483 protected function toUpper() {
1484 $stringLen = strlen($this->dataStr);
1485 $p = 0;
1486 while ($p < $stringLen) {
1487 $mode = $this->identifyMode(substr($this->dataStr, $p), $this->hint);
1488 if ($mode == QR_MODE_KJ) {
1489 $p += 2;
1490 } else {
1491 if ((ord($this->dataStr[$p]) >= ord('a')) AND (ord($this->dataStr[$p]) <= ord('z'))) {
1492 $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32);
1493 }
1494 $p++;
1495 }
1496 }
1497 return $this->dataStr;
1498 }
1499
1500 // - - - - - - - - - - - - - - - - - - - - - - - - -
1501
1502 // QRinputItem
1503
1504 /**
1505 * newInputItem
1506 * @param $mode (int)
1507 * @param $size (int)
1508 * @param $data (array)
1509 * @param $bstream (array)
1510 * @return array input item
1511 */
1512 protected function newInputItem($mode, $size, $data, $bstream=null) {
1513 $setData = array_slice($data, 0, $size);
1514 if (count($setData) < $size) {
1515 $setData = array_merge($setData, array_fill(0, ($size - count($setData)), 0));
1516 }
1517 if (!$this->check($mode, $size, $setData)) {
1518 return NULL;
1519 }
1520 $inputitem = array();
1521 $inputitem['mode'] = $mode;
1522 $inputitem['size'] = $size;
1523 $inputitem['data'] = $setData;
1524 $inputitem['bstream'] = $bstream;
1525 return $inputitem;
1526 }
1527
1528 /**
1529 * encodeModeNum
1530 * @param $inputitem (array)
1531 * @param $version (int)
1532 * @return array input item
1533 */
1534 protected function encodeModeNum($inputitem, $version) {
1535 $words = (int)($inputitem['size'] / 3);
1536 $inputitem['bstream'] = array();
1537 $val = 0x1;
1538 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, $val);
1539 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_NM, $version), $inputitem['size']);
1540 for ($i=0; $i < $words; ++$i) {
1541 $val = (ord($inputitem['data'][$i*3 ]) - ord('0')) * 100;
1542 $val += (ord($inputitem['data'][$i*3+1]) - ord('0')) * 10;
1543 $val += (ord($inputitem['data'][$i*3+2]) - ord('0'));
1544 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 10, $val);
1545 }
1546 if ($inputitem['size'] - $words * 3 == 1) {
1547 $val = ord($inputitem['data'][$words*3]) - ord('0');
1548 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, $val);
1549 } elseif (($inputitem['size'] - ($words * 3)) == 2) {
1550 $val = (ord($inputitem['data'][$words*3 ]) - ord('0')) * 10;
1551 $val += (ord($inputitem['data'][$words*3+1]) - ord('0'));
1552 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 7, $val);
1553 }
1554 return $inputitem;
1555 }
1556
1557 /**
1558 * encodeModeAn
1559 * @param $inputitem (array)
1560 * @param $version (int)
1561 * @return array input item
1562 */
1563 protected function encodeModeAn($inputitem, $version) {
1564 $words = (int)($inputitem['size'] / 2);
1565 $inputitem['bstream'] = array();
1566 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x02);
1567 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_AN, $version), $inputitem['size']);
1568 for ($i=0; $i < $words; ++$i) {
1569 $val = (int)($this->lookAnTable(ord($inputitem['data'][$i*2])) * 45);
1570 $val += (int)($this->lookAnTable(ord($inputitem['data'][($i*2)+1])));
1571 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 11, $val);
1572 }
1573 if ($inputitem['size'] & 1) {
1574 $val = $this->lookAnTable(ord($inputitem['data'][($words * 2)]));
1575 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 6, $val);
1576 }
1577 return $inputitem;
1578 }
1579
1580 /**
1581 * encodeMode8
1582 * @param $inputitem (array)
1583 * @param $version (int)
1584 * @return array input item
1585 */
1586 protected function encodeMode8($inputitem, $version) {
1587 $inputitem['bstream'] = array();
1588 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x4);
1589 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_8B, $version), $inputitem['size']);
1590 for ($i=0; $i < $inputitem['size']; ++$i) {
1591 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 8, ord($inputitem['data'][$i]));
1592 }
1593 return $inputitem;
1594 }
1595
1596 /**
1597 * encodeModeKanji
1598 * @param $inputitem (array)
1599 * @param $version (int)
1600 * @return array input item
1601 */
1602 protected function encodeModeKanji($inputitem, $version) {
1603 $inputitem['bstream'] = array();
1604 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x8);
1605 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_KJ, $version), (int)($inputitem['size'] / 2));
1606 for ($i=0; $i<$inputitem['size']; $i+=2) {
1607 $val = (ord($inputitem['data'][$i]) << 8) | ord($inputitem['data'][$i+1]);
1608 if ($val <= 0x9ffc) {
1609 $val -= 0x8140;
1610 } else {
1611 $val -= 0xc140;
1612 }
1613 $h = ($val >> 8) * 0xc0;
1614 $val = ($val & 0xff) + $h;
1615 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 13, $val);
1616 }
1617 return $inputitem;
1618 }
1619
1620 /**
1621 * encodeModeStructure
1622 * @param $inputitem (array)
1623 * @return array input item
1624 */
1625 protected function encodeModeStructure($inputitem) {
1626 $inputitem['bstream'] = array();
1627 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x03);
1628 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, ord($inputitem['data'][1]) - 1);
1629 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, ord($inputitem['data'][0]) - 1);
1630 $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 8, ord($inputitem['data'][2]));
1631 return $inputitem;
1632 }
1633
1634 /**
1635 * encodeBitStream
1636 * @param $inputitem (array)
1637 * @param $version (int)
1638 * @return array input item
1639 */
1640 protected function encodeBitStream($inputitem, $version) {
1641 $inputitem['bstream'] = array();
1642 $words = $this->maximumWords($inputitem['mode'], $version);
1643 if ($inputitem['size'] > $words) {
1644 $st1 = $this->newInputItem($inputitem['mode'], $words, $inputitem['data']);
1645 $st2 = $this->newInputItem($inputitem['mode'], $inputitem['size'] - $words, array_slice($inputitem['data'], $words));
1646 $st1 = $this->encodeBitStream($st1, $version);
1647 $st2 = $this->encodeBitStream($st2, $version);
1648 $inputitem['bstream'] = array();
1649 $inputitem['bstream'] = $this->appendBitstream($inputitem['bstream'], $st1['bstream']);
1650 $inputitem['bstream'] = $this->appendBitstream($inputitem['bstream'], $st2['bstream']);
1651 } else {
1652 switch($inputitem['mode']) {
1653 case QR_MODE_NM: {
1654 $inputitem = $this->encodeModeNum($inputitem, $version);
1655 break;
1656 }
1657 case QR_MODE_AN: {
1658 $inputitem = $this->encodeModeAn($inputitem, $version);
1659 break;
1660 }
1661 case QR_MODE_8B: {
1662 $inputitem = $this->encodeMode8($inputitem, $version);
1663 break;
1664 }
1665 case QR_MODE_KJ: {
1666 $inputitem = $this->encodeModeKanji($inputitem, $version);
1667 break;
1668 }
1669 case QR_MODE_ST: {
1670 $inputitem = $this->encodeModeStructure($inputitem);
1671 break;
1672 }
1673 default: {
1674 break;
1675 }
1676 }
1677 }
1678 return $inputitem;
1679 }
1680
1681 // - - - - - - - - - - - - - - - - - - - - - - - - -
1682
1683 // QRinput
1684
1685 /**
1686 * Append data to an input object.
1687 * The data is copied and appended to the input object.
1688 * @param $items (arrray) input items
1689 * @param $mode (int) encoding mode.
1690 * @param $size (int) size of data (byte).
1691 * @param $data (array) array of input data.
1692 * @return items
1693 *
1694 */
1695 protected function appendNewInputItem($items, $mode, $size, $data) {
1696 $newitem = $this->newInputItem($mode, $size, $data);
1697 if (!empty($newitem)) {
1698 $items[] = $newitem;
1699 }
1700 return $items;
1701 }
1702
1703 /**
1704 * insertStructuredAppendHeader
1705 * @param $items (array)
1706 * @param $size (int)
1707 * @param $index (int)
1708 * @param $parity (int)
1709 * @return array items
1710 */
1711 protected function insertStructuredAppendHeader($items, $size, $index, $parity) {
1712 if ($size > MAX_STRUCTURED_SYMBOLS) {
1713 return -1;
1714 }
1715 if (($index <= 0) OR ($index > MAX_STRUCTURED_SYMBOLS)) {
1716 return -1;
1717 }
1718 $buf = array($size, $index, $parity);
1719 $entry = $this->newInputItem(QR_MODE_ST, 3, buf);
1720 array_unshift($items, $entry);
1721 return $items;
1722 }
1723
1724 /**
1725 * calcParity
1726 * @param $items (array)
1727 * @return int parity
1728 */
1729 protected function calcParity($items) {
1730 $parity = 0;
1731 foreach ($items as $item) {
1732 if ($item['mode'] != QR_MODE_ST) {
1733 for ($i=$item['size']-1; $i>=0; --$i) {
1734 $parity ^= $item['data'][$i];
1735 }
1736 }
1737 }
1738 return $parity;
1739 }
1740
1741 /**
1742 * checkModeNum
1743 * @param $size (int)
1744 * @param $data (array)
1745 * @return boolean true or false
1746 */
1747 protected function checkModeNum($size, $data) {
1748 for ($i=0; $i<$size; ++$i) {
1749 if ((ord($data[$i]) < ord('0')) OR (ord($data[$i]) > ord('9'))){
1750 return false;
1751 }
1752 }
1753 return true;
1754 }
1755
1756 /**
1757 * Look up the alphabet-numeric convesion table (see JIS X0510:2004, pp.19).
1758 * @param $c (int) character value
1759 * @return value
1760 */
1761 protected function lookAnTable($c) {
1762 return (($c > 127)?-1:$this->anTable[$c]);
1763 }
1764
1765 /**
1766 * checkModeAn
1767 * @param $size (int)
1768 * @param $data (array)
1769 * @return boolean true or false
1770 */
1771 protected function checkModeAn($size, $data) {
1772 for ($i=0; $i<$size; ++$i) {
1773 if ($this->lookAnTable(ord($data[$i])) == -1) {
1774 return false;
1775 }
1776 }
1777 return true;
1778 }
1779
1780 /**
1781 * estimateBitsModeNum
1782 * @param $size (int)
1783 * @return int number of bits
1784 */
1785 protected function estimateBitsModeNum($size) {
1786 $w = (int)($size / 3);
1787 $bits = ($w * 10);
1788 switch($size - ($w * 3)) {
1789 case 1: {
1790 $bits += 4;
1791 break;
1792 }
1793 case 2: {
1794 $bits += 7;
1795 break;
1796 }
1797 }
1798 return $bits;
1799 }
1800
1801 /**
1802 * estimateBitsModeAn
1803 * @param $size (int)
1804 * @return int number of bits
1805 */
1806 protected function estimateBitsModeAn($size) {
1807 $bits = (int)($size * 5.5); // (size / 2 ) * 11
1808 if ($size & 1) {
1809 $bits += 6;
1810 }
1811 return $bits;
1812 }
1813
1814 /**
1815 * estimateBitsMode8
1816 * @param $size (int)
1817 * @return int number of bits
1818 */
1819 protected function estimateBitsMode8($size) {
1820 return (int)($size * 8);
1821 }
1822
1823 /**
1824 * estimateBitsModeKanji
1825 * @param $size (int)
1826 * @return int number of bits
1827 */
1828 protected function estimateBitsModeKanji($size) {
1829 return (int)($size * 6.5); // (size / 2 ) * 13
1830 }
1831
1832 /**
1833 * checkModeKanji
1834 * @param $size (int)
1835 * @param $data (array)
1836 * @return boolean true or false
1837 */
1838 protected function checkModeKanji($size, $data) {
1839 if ($size & 1) {
1840 return false;
1841 }
1842 for ($i=0; $i<$size; $i+=2) {
1843 $val = (ord($data[$i]) << 8) | ord($data[$i+1]);
1844 if (($val < 0x8140) OR (($val > 0x9ffc) AND ($val < 0xe040)) OR ($val > 0xebbf)) {
1845 return false;
1846 }
1847 }
1848 return true;
1849 }
1850
1851 /**
1852 * Validate the input data.
1853 * @param $mode (int) encoding mode.
1854 * @param $size (int) size of data (byte).
1855 * @param $data (array) data to validate
1856 * @return boolean true in case of valid data, false otherwise
1857 */
1858 protected function check($mode, $size, $data) {
1859 if ($size <= 0) {
1860 return false;
1861 }
1862 switch($mode) {
1863 case QR_MODE_NM: {
1864 return $this->checkModeNum($size, $data);
1865 }
1866 case QR_MODE_AN: {
1867 return $this->checkModeAn($size, $data);
1868 }
1869 case QR_MODE_KJ: {
1870 return $this->checkModeKanji($size, $data);
1871 }
1872 case QR_MODE_8B: {
1873 return true;
1874 }
1875 case QR_MODE_ST: {
1876 return true;
1877 }
1878 default: {
1879 break;
1880 }
1881 }
1882 return false;
1883 }
1884
1885 /**
1886 * estimateBitStreamSize
1887 * @param $items (array)
1888 * @param $version (int)
1889 * @return int bits
1890 */
1891 protected function estimateBitStreamSize($items, $version) {
1892 $bits = 0;
1893 if ($version == 0) {
1894 $version = 1;
1895 }
1896 foreach ($items as $item) {
1897 switch($item['mode']) {
1898 case QR_MODE_NM: {
1899 $bits = $this->estimateBitsModeNum($item['size']);
1900 break;
1901 }
1902 case QR_MODE_AN: {
1903 $bits = $this->estimateBitsModeAn($item['size']);
1904 break;
1905 }
1906 case QR_MODE_8B: {
1907 $bits = $this->estimateBitsMode8($item['size']);
1908 break;
1909 }
1910 case QR_MODE_KJ: {
1911 $bits = $this->estimateBitsModeKanji($item['size']);
1912 break;
1913 }
1914 case QR_MODE_ST: {
1915 return STRUCTURE_HEADER_BITS;
1916 }
1917 default: {
1918 return 0;
1919 }
1920 }
1921 $l = $this->lengthIndicator($item['mode'], $version);
1922 $m = 1 << $l;
1923 $num = (int)(($item['size'] + $m - 1) / $m);
1924 $bits += $num * (4 + $l);
1925 }
1926 return $bits;
1927 }
1928
1929 /**
1930 * estimateVersion
1931 * @param $items (array)
1932 * @return int version
1933 */
1934 protected function estimateVersion($items) {
1935 $version = 0;
1936 $prev = 0;
1937 do {
1938 $prev = $version;
1939 $bits = $this->estimateBitStreamSize($items, $prev);
1940 $version = $this->getMinimumVersion((int)(($bits + 7) / 8), $this->level);
1941 if ($version < 0) {
1942 return -1;
1943 }
1944 } while ($version > $prev);
1945 return $version;
1946 }
1947
1948 /**
1949 * lengthOfCode
1950 * @param $mode (int)
1951 * @param $version (int)
1952 * @param $bits (int)
1953 * @return int size
1954 */
1955 protected function lengthOfCode($mode, $version, $bits) {
1956 $payload = $bits - 4 - $this->lengthIndicator($mode, $version);
1957 switch($mode) {
1958 case QR_MODE_NM: {
1959 $chunks = (int)($payload / 10);
1960 $remain = $payload - $chunks * 10;
1961 $size = $chunks * 3;
1962 if ($remain >= 7) {
1963 $size += 2;
1964 } elseif ($remain >= 4) {
1965 $size += 1;
1966 }
1967 break;
1968 }
1969 case QR_MODE_AN: {
1970 $chunks = (int)($payload / 11);
1971 $remain = $payload - $chunks * 11;
1972 $size = $chunks * 2;
1973 if ($remain >= 6) {
1974 ++$size;
1975 }
1976 break;
1977 }
1978 case QR_MODE_8B: {
1979 $size = (int)($payload / 8);
1980 break;
1981 }
1982 case QR_MODE_KJ: {
1983 $size = (int)(($payload / 13) * 2);
1984 break;
1985 }
1986 case QR_MODE_ST: {
1987 $size = (int)($payload / 8);
1988 break;
1989 }
1990 default: {
1991 $size = 0;
1992 break;
1993 }
1994 }
1995 $maxsize = $this->maximumWords($mode, $version);
1996 if ($size < 0) {
1997 $size = 0;
1998 }
1999 if ($size > $maxsize) {
2000 $size = $maxsize;
2001 }
2002 return $size;
2003 }
2004
2005 /**
2006 * createBitStream
2007 * @param $items (array)
2008 * @return array of items and total bits
2009 */
2010 protected function createBitStream($items) {
2011 $total = 0;
2012 foreach ($items as $key => $item) {
2013 $items[$key] = $this->encodeBitStream($item, $this->version);
2014 $bits = count($items[$key]['bstream']);
2015 $total += $bits;
2016 }
2017 return array($items, $total);
2018 }
2019
2020 /**
2021 * convertData
2022 * @param $items (array)
2023 * @return array items
2024 */
2025 protected function convertData($items) {
2026 $ver = $this->estimateVersion($items);
2027 if ($ver > $this->version) {
2028 $this->version = $ver;
2029 }
2030 while (true) {
2031 $cbs = $this->createBitStream($items);
2032 $items = $cbs[0];
2033 $bits = $cbs[1];
2034 if ($bits < 0) {
2035 return -1;
2036 }
2037 $ver = $this->getMinimumVersion((int)(($bits + 7) / 8), $this->level);
2038 if ($ver < 0) {
2039 return -1;
2040 } elseif ($ver > $this->version) {
2041 $this->version = $ver;
2042 } else {
2043 break;
2044 }
2045 }
2046 return $items;
2047 }
2048
2049 /**
2050 * Append Padding Bit to bitstream
2051 * @param $bstream (array)
2052 * @return array bitstream
2053 */
2054 protected function appendPaddingBit($bstream) {
2055 if (is_null($bstream)) {
2056 return null;
2057 }
2058 $bits = count($bstream);
2059 $maxwords = $this->getDataLength($this->version, $this->level);
2060 $maxbits = $maxwords * 8;
2061 if ($maxbits == $bits) {
2062 return $bstream;
2063 }
2064 if ($maxbits - $bits < 5) {
2065 return $this->appendNum($bstream, $maxbits - $bits, 0);
2066 }
2067 $bits += 4;
2068 $words = (int)(($bits + 7) / 8);
2069 $padding = array();
2070 $padding = $this->appendNum($padding, $words * 8 - $bits + 4, 0);
2071 $padlen = $maxwords - $words;
2072 if ($padlen > 0) {
2073 $padbuf = array();
2074 for ($i=0; $i<$padlen; ++$i) {
2075 $padbuf[$i] = ($i&1)?0x11:0xec;
2076 }
2077 $padding = $this->appendBytes($padding, $padlen, $padbuf);
2078 }
2079 return $this->appendBitstream($bstream, $padding);
2080 }
2081
2082 /**
2083 * mergeBitStream
2084 * @param $items (array) items
2085 * @return array bitstream
2086 */
2087 protected function mergeBitStream($items) {
2088 $items = $this->convertData($items);
2089 if (!is_array($items)) {
2090 return null;
2091 }
2092 $bstream = array();
2093 foreach ($items as $item) {
2094 $bstream = $this->appendBitstream($bstream, $item['bstream']);
2095 }
2096 return $bstream;
2097 }
2098
2099 /**
2100 * Returns a stream of bits.
2101 * @param $items (int)
2102 * @return array padded merged byte stream
2103 */
2104 protected function getBitStream($items) {
2105 $bstream = $this->mergeBitStream($items);
2106 return $this->appendPaddingBit($bstream);
2107 }
2108
2109 /**
2110 * Pack all bit streams padding bits into a byte array.
2111 * @param $items (int)
2112 * @return array padded merged byte stream
2113 */
2114 protected function getByteStream($items) {
2115 $bstream = $this->getBitStream($items);
2116 return $this->bitstreamToByte($bstream);
2117 }
2118
2119 // - - - - - - - - - - - - - - - - - - - - - - - - -
2120
2121 // QRbitstream
2122
2123 /**
2124 * Return an array with zeros
2125 * @param $setLength (int) array size
2126 * @return array
2127 */
2128 protected function allocate($setLength) {
2129 return array_fill(0, $setLength, 0);
2130 }
2131
2132 /**
2133 * Return new bitstream from number
2134 * @param $bits (int) number of bits
2135 * @param $num (int) number
2136 * @return array bitstream
2137 */
2138 protected function newFromNum($bits, $num) {
2139 $bstream = $this->allocate($bits);
2140 $mask = 1 << ($bits - 1);
2141 for ($i=0; $i<$bits; ++$i) {
2142 if ($num & $mask) {
2143 $bstream[$i] = 1;
2144 } else {
2145 $bstream[$i] = 0;
2146 }
2147 $mask = $mask >> 1;
2148 }
2149 return $bstream;
2150 }
2151
2152 /**
2153 * Return new bitstream from bytes
2154 * @param $size (int) size
2155 * @param $data (array) bytes
2156 * @return array bitstream
2157 */
2158 protected function newFromBytes($size, $data) {
2159 $bstream = $this->allocate($size * 8);
2160 $p=0;
2161 for ($i=0; $i<$size; ++$i) {
2162 $mask = 0x80;
2163 for ($j=0; $j<8; ++$j) {
2164 if ($data[$i] & $mask) {
2165 $bstream[$p] = 1;
2166 } else {
2167 $bstream[$p] = 0;
2168 }
2169 $p++;
2170 $mask = $mask >> 1;
2171 }
2172 }
2173 return $bstream;
2174 }
2175
2176 /**
2177 * Append one bitstream to another
2178 * @param $bitstream (array) original bitstream
2179 * @param $append (array) bitstream to append
2180 * @return array bitstream
2181 */
2182 protected function appendBitstream($bitstream, $append) {
2183 if ((!is_array($append)) OR (count($append) == 0)) {
2184 return $bitstream;
2185 }
2186 if (count($bitstream) == 0) {
2187 return $append;
2188 }
2189 return array_values(array_merge($bitstream, $append));
2190 }
2191
2192 /**
2193 * Append one bitstream created from number to another
2194 * @param $bitstream (array) original bitstream
2195 * @param $bits (int) number of bits
2196 * @param $num (int) number
2197 * @return array bitstream
2198 */
2199 protected function appendNum($bitstream, $bits, $num) {
2200 if ($bits == 0) {
2201 return 0;
2202 }
2203 $b = $this->newFromNum($bits, $num);
2204 return $this->appendBitstream($bitstream, $b);
2205 }
2206
2207 /**
2208 * Append one bitstream created from bytes to another
2209 * @param $bitstream (array) original bitstream
2210 * @param $size (int) size
2211 * @param $data (array) bytes
2212 * @return array bitstream
2213 */
2214 protected function appendBytes($bitstream, $size, $data) {
2215 if ($size == 0) {
2216 return 0;
2217 }
2218 $b = $this->newFromBytes($size, $data);
2219 return $this->appendBitstream($bitstream, $b);
2220 }
2221
2222 /**
2223 * Convert bitstream to bytes
2224 * @param $bstream (array) original bitstream
2225 * @return array of bytes
2226 */
2227 protected function bitstreamToByte($bstream) {
2228 if (is_null($bstream)) {
2229 return null;
2230 }
2231 $size = count($bstream);
2232 if ($size == 0) {
2233 return array();
2234 }
2235 $data = array_fill(0, (int)(($size + 7) / 8), 0);
2236 $bytes = (int)($size / 8);
2237 $p = 0;
2238 for ($i=0; $i<$bytes; $i++) {
2239 $v = 0;
2240 for ($j=0; $j<8; $j++) {
2241 $v = $v << 1;
2242 $v |= $bstream[$p];
2243 $p++;
2244 }
2245 $data[$i] = $v;
2246 }
2247 if ($size & 7) {
2248 $v = 0;
2249 for ($j=0; $j<($size & 7); $j++) {
2250 $v = $v << 1;
2251 $v |= $bstream[$p];
2252 $p++;
2253 }
2254 $data[$bytes] = $v;
2255 }
2256 return $data;
2257 }
2258
2259 // - - - - - - - - - - - - - - - - - - - - - - - - -
2260
2261 // QRspec
2262
2263 /**
2264 * Replace a value on the array at the specified position
2265 * @param $srctab (array)
2266 * @param $x (int) X position
2267 * @param $y (int) Y position
2268 * @param $repl (string) value to replace
2269 * @param $replLen (int) length of the repl string
2270 * @return array srctab
2271 */
2272 protected function qrstrset($srctab, $x, $y, $repl, $replLen=false) {
2273 $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl));
2274 return $srctab;
2275 }
2276
2277 /**
2278 * Return maximum data code length (bytes) for the version.
2279 * @param $version (int) version
2280 * @param $level (int) error correction level
2281 * @return int maximum size (bytes)
2282 */
2283 protected function getDataLength($version, $level) {
2284 return $this->capacity[$version][QRCAP_WORDS] - $this->capacity[$version][QRCAP_EC][$level];
2285 }
2286
2287 /**
2288 * Return maximum error correction code length (bytes) for the version.
2289 * @param $version (int) version
2290 * @param $level (int) error correction level
2291 * @return int ECC size (bytes)
2292 */
2293 protected function getECCLength($version, $level){
2294 return $this->capacity[$version][QRCAP_EC][$level];
2295 }
2296
2297 /**
2298 * Return the width of the symbol for the version.
2299 * @param $version (int) version
2300 * @return int width
2301 */
2302 protected function getWidth($version) {
2303 return $this->capacity[$version][QRCAP_WIDTH];
2304 }
2305
2306 /**
2307 * Return the numer of remainder bits.
2308 * @param $version (int) version
2309 * @return int number of remainder bits
2310 */
2311 protected function getRemainder($version) {
2312 return $this->capacity[$version][QRCAP_REMINDER];
2313 }
2314
2315 /**
2316 * Return a version number that satisfies the input code length.
2317 * @param $size (int) input code length (bytes)
2318 * @param $level (int) error correction level
2319 * @return int version number
2320 */
2321 protected function getMinimumVersion($size, $level) {
2322 for ($i = 1; $i <= QRSPEC_VERSION_MAX; ++$i) {
2323 $words = ($this->capacity[$i][QRCAP_WORDS] - $this->capacity[$i][QRCAP_EC][$level]);
2324 if ($words >= $size) {
2325 return $i;
2326 }
2327 }
2328 // the size of input data is greater than QR capacity, try to lover the error correction mode
2329 return -1;
2330 }
2331
2332 /**
2333 * Return the size of length indicator for the mode and version.
2334 * @param $mode (int) encoding mode
2335 * @param $version (int) version
2336 * @return int the size of the appropriate length indicator (bits).
2337 */
2338 protected function lengthIndicator($mode, $version) {
2339 if ($mode == QR_MODE_ST) {
2340 return 0;
2341 }
2342 if ($version <= 9) {
2343 $l = 0;
2344 } elseif ($version <= 26) {
2345 $l = 1;
2346 } else {
2347 $l = 2;
2348 }
2349 return $this->lengthTableBits[$mode][$l];
2350 }
2351
2352 /**
2353 * Return the maximum length for the mode and version.
2354 * @param $mode (int) encoding mode
2355 * @param $version (int) version
2356 * @return int the maximum length (bytes)
2357 */
2358 protected function maximumWords($mode, $version) {
2359 if ($mode == QR_MODE_ST) {
2360 return 3;
2361 }
2362 if ($version <= 9) {
2363 $l = 0;
2364 } else if ($version <= 26) {
2365 $l = 1;
2366 } else {
2367 $l = 2;
2368 }
2369 $bits = $this->lengthTableBits[$mode][$l];
2370 $words = (1 << $bits) - 1;
2371 if ($mode == QR_MODE_KJ) {
2372 $words *= 2; // the number of bytes is required
2373 }
2374 return $words;
2375 }
2376
2377 /**
2378 * Return an array of ECC specification.
2379 * @param $version (int) version
2380 * @param $level (int) error correction level
2381 * @param $spec (array) an array of ECC specification contains as following: {# of type1 blocks, # of data code, # of ecc code, # of type2 blocks, # of data code}
2382 * @return array spec
2383 */
2384 protected function getEccSpec($version, $level, $spec) {
2385 if (count($spec) < 5) {
2386 $spec = array(0, 0, 0, 0, 0);
2387 }
2388 $b1 = $this->eccTable[$version][$level][0];
2389 $b2 = $this->eccTable[$version][$level][1];
2390 $data = $this->getDataLength($version, $level);
2391 $ecc = $this->getECCLength($version, $level);
2392 if ($b2 == 0) {
2393 $spec[0] = $b1;
2394 $spec[1] = (int)($data / $b1);
2395 $spec[2] = (int)($ecc / $b1);
2396 $spec[3] = 0;
2397 $spec[4] = 0;
2398 } else {
2399 $spec[0] = $b1;
2400 $spec[1] = (int)($data / ($b1 + $b2));
2401 $spec[2] = (int)($ecc / ($b1 + $b2));
2402 $spec[3] = $b2;
2403 $spec[4] = $spec[1] + 1;
2404 }
2405 return $spec;
2406 }
2407
2408 /**
2409 * Put an alignment marker.
2410 * @param $frame (array) frame
2411 * @param $ox (int) X center coordinate of the pattern
2412 * @param $oy (int) Y center coordinate of the pattern
2413 * @return array frame
2414 */
2415 protected function putAlignmentMarker($frame, $ox, $oy) {
2416 $finder = array(
2417 "\xa1\xa1\xa1\xa1\xa1",
2418 "\xa1\xa0\xa0\xa0\xa1",
2419 "\xa1\xa0\xa1\xa0\xa1",
2420 "\xa1\xa0\xa0\xa0\xa1",
2421 "\xa1\xa1\xa1\xa1\xa1"
2422 );
2423 $yStart = $oy - 2;
2424 $xStart = $ox - 2;
2425 for ($y=0; $y < 5; $y++) {
2426 $frame = $this->qrstrset($frame, $xStart, $yStart+$y, $finder[$y]);
2427 }
2428 return $frame;
2429 }
2430
2431 /**
2432 * Put an alignment pattern.
2433 * @param $version (int) version
2434 * @param $frame (array) frame
2435 * @param $width (int) width
2436 * @return array frame
2437 */
2438 protected function putAlignmentPattern($version, $frame, $width) {
2439 if ($version < 2) {
2440 return $frame;
2441 }
2442 $d = $this->alignmentPattern[$version][1] - $this->alignmentPattern[$version][0];
2443 if ($d < 0) {
2444 $w = 2;
2445 } else {
2446 $w = (int)(($width - $this->alignmentPattern[$version][0]) / $d + 2);
2447 }
2448 if ($w * $w - 3 == 1) {
2449 $x = $this->alignmentPattern[$version][0];
2450 $y = $this->alignmentPattern[$version][0];
2451 $frame = $this->putAlignmentMarker($frame, $x, $y);
2452 return $frame;
2453 }
2454 $cx = $this->alignmentPattern[$version][0];
2455 $wo = $w - 1;
2456 for ($x=1; $x < $wo; ++$x) {
2457 $frame = $this->putAlignmentMarker($frame, 6, $cx);
2458 $frame = $this->putAlignmentMarker($frame, $cx, 6);
2459 $cx += $d;
2460 }
2461 $cy = $this->alignmentPattern[$version][0];
2462 for ($y=0; $y < $wo; ++$y) {
2463 $cx = $this->alignmentPattern[$version][0];
2464 for ($x=0; $x < $wo; ++$x) {
2465 $frame = $this->putAlignmentMarker($frame, $cx, $cy);
2466 $cx += $d;
2467 }
2468 $cy += $d;
2469 }
2470 return $frame;
2471 }
2472
2473 /**
2474 * Return BCH encoded version information pattern that is used for the symbol of version 7 or greater. Use lower 18 bits.
2475 * @param $version (int) version
2476 * @return BCH encoded version information pattern
2477 */
2478 protected function getVersionPattern($version) {
2479 if (($version < 7) OR ($version > QRSPEC_VERSION_MAX)) {
2480 return 0;
2481 }
2482 return $this->versionPattern[($version - 7)];
2483 }
2484
2485 /**
2486 * Return BCH encoded format information pattern.
2487 * @param $mask (array)
2488 * @param $level (int) error correction level
2489 * @return BCH encoded format information pattern
2490 */
2491 protected function getFormatInfo($mask, $level) {
2492 if (($mask < 0) OR ($mask > 7)) {
2493 return 0;
2494 }
2495 if (($level < 0) OR ($level > 3)) {
2496 return 0;
2497 }
2498 return $this->formatInfo[$level][$mask];
2499 }
2500
2501 /**
2502 * Put a finder pattern.
2503 * @param $frame (array) frame
2504 * @param $ox (int) X center coordinate of the pattern
2505 * @param $oy (int) Y center coordinate of the pattern
2506 * @return array frame
2507 */
2508 protected function putFinderPattern($frame, $ox, $oy) {
2509 $finder = array(
2510 "\xc1\xc1\xc1\xc1\xc1\xc1\xc1",
2511 "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
2512 "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
2513 "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
2514 "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
2515 "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
2516 "\xc1\xc1\xc1\xc1\xc1\xc1\xc1"
2517 );
2518 for ($y=0; $y < 7; $y++) {
2519 $frame = $this->qrstrset($frame, $ox, ($oy + $y), $finder[$y]);
2520 }
2521 return $frame;
2522 }
2523
2524 /**
2525 * Return a copy of initialized frame.
2526 * @param $version (int) version
2527 * @return Array of unsigned char.
2528 */
2529 protected function createFrame($version) {
2530 $width = $this->capacity[$version][QRCAP_WIDTH];
2531 $frameLine = str_repeat ("\0", $width);
2532 $frame = array_fill(0, $width, $frameLine);
2533 // Finder pattern
2534 $frame = $this->putFinderPattern($frame, 0, 0);
2535 $frame = $this->putFinderPattern($frame, $width - 7, 0);
2536 $frame = $this->putFinderPattern($frame, 0, $width - 7);
2537 // Separator
2538 $yOffset = $width - 7;
2539 for ($y=0; $y < 7; ++$y) {
2540 $frame[$y][7] = "\xc0";
2541 $frame[$y][$width - 8] = "\xc0";
2542 $frame[$yOffset][7] = "\xc0";
2543 ++$yOffset;
2544 }
2545 $setPattern = str_repeat("\xc0", 8);
2546 $frame = $this->qrstrset($frame, 0, 7, $setPattern);
2547 $frame = $this->qrstrset($frame, $width-8, 7, $setPattern);
2548 $frame = $this->qrstrset($frame, 0, $width - 8, $setPattern);
2549 // Format info
2550 $setPattern = str_repeat("\x84", 9);
2551 $frame = $this->qrstrset($frame, 0, 8, $setPattern);
2552 $frame = $this->qrstrset($frame, $width - 8, 8, $setPattern, 8);
2553 $yOffset = $width - 8;
2554 for ($y=0; $y < 8; ++$y,++$yOffset) {
2555 $frame[$y][8] = "\x84";
2556 $frame[$yOffset][8] = "\x84";
2557 }
2558 // Timing pattern
2559 $wo = $width - 15;
2560 for ($i=1; $i < $wo; ++$i) {
2561 $frame[6][7+$i] = chr(0x90 | ($i & 1));
2562 $frame[7+$i][6] = chr(0x90 | ($i & 1));
2563 }
2564 // Alignment pattern
2565 $frame = $this->putAlignmentPattern($version, $frame, $width);
2566 // Version information
2567 if ($version >= 7) {
2568 $vinf = $this->getVersionPattern($version);
2569 $v = $vinf;
2570 for ($x=0; $x<6; ++$x) {
2571 for ($y=0; $y<3; ++$y) {
2572 $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1));
2573 $v = $v >> 1;
2574 }
2575 }
2576 $v = $vinf;
2577 for ($y=0; $y<6; ++$y) {
2578 for ($x=0; $x<3; ++$x) {
2579 $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1));
2580 $v = $v >> 1;
2581 }
2582 }
2583 }
2584 // and a little bit...
2585 $frame[$width - 8][8] = "\x81";
2586 return $frame;
2587 }
2588
2589 /**
2590 * Set new frame for the specified version.
2591 * @param $version (int) version
2592 * @return Array of unsigned char.
2593 */
2594 protected function newFrame($version) {
2595 if (($version < 1) OR ($version > QRSPEC_VERSION_MAX)) {
2596 return NULL;
2597 }
2598 if (!isset($this->frames[$version])) {
2599 $this->frames[$version] = $this->createFrame($version);
2600 }
2601 if (is_null($this->frames[$version])) {
2602 return NULL;
2603 }
2604 return $this->frames[$version];
2605 }
2606
2607 /**
2608 * Return block number 0
2609 * @param $spec (array)
2610 * @return int value
2611 */
2612 protected function rsBlockNum($spec) {
2613 return ($spec[0] + $spec[3]);
2614 }
2615
2616 /**
2617 * Return block number 1
2618 * @param $spec (array)
2619 * @return int value
2620 */
2621 protected function rsBlockNum1($spec) {
2622 return $spec[0];
2623 }
2624
2625 /**
2626 * Return data codes 1
2627 * @param $spec (array)
2628 * @return int value
2629 */
2630 protected function rsDataCodes1($spec) {
2631 return $spec[1];
2632 }
2633
2634 /**
2635 * Return ecc codes 1
2636 * @param $spec (array)
2637 * @return int value
2638 */
2639 protected function rsEccCodes1($spec) {
2640 return $spec[2];
2641 }
2642
2643 /**
2644 * Return block number 2
2645 * @param $spec (array)
2646 * @return int value
2647 */
2648 protected function rsBlockNum2($spec) {
2649 return $spec[3];
2650 }
2651
2652 /**
2653 * Return data codes 2
2654 * @param $spec (array)
2655 * @return int value
2656 */
2657 protected function rsDataCodes2($spec) {
2658 return $spec[4];
2659 }
2660
2661 /**
2662 * Return ecc codes 2
2663 * @param $spec (array)
2664 * @return int value
2665 */
2666 protected function rsEccCodes2($spec) {
2667 return $spec[2];
2668 }
2669
2670 /**
2671 * Return data length
2672 * @param $spec (array)
2673 * @return int value
2674 */
2675 protected function rsDataLength($spec) {
2676 return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]);
2677 }
2678
2679 /**
2680 * Return ecc length
2681 * @param $spec (array)
2682 * @return int value
2683 */
2684 protected function rsEccLength($spec) {
2685 return ($spec[0] + $spec[3]) * $spec[2];
2686 }
2687
2688 // - - - - - - - - - - - - - - - - - - - - - - - - -
2689
2690 // QRrs
2691
2692 /**
2693 * Initialize a Reed-Solomon codec and add it to existing rsitems
2694 * @param $symsize (int) symbol size, bits
2695 * @param $gfpoly (int) Field generator polynomial coefficients
2696 * @param $fcr (int) first root of RS code generator polynomial, index form
2697 * @param $prim (int) primitive element to generate polynomial roots
2698 * @param $nroots (int) RS code generator polynomial degree (number of roots)
2699 * @param $pad (int) padding bytes at front of shortened block
2700 * @return array Array of RS values:<ul><li>mm = Bits per symbol;</li><li>nn = Symbols per block;</li><li>alpha_to = log lookup table array;</li><li>index_of = Antilog lookup table array;</li><li>genpoly = Generator polynomial array;</li><li>nroots = Number of generator;</li><li>roots = number of parity symbols;</li><li>fcr = First consecutive root, index form;</li><li>prim = Primitive element, index form;</li><li>iprim = prim-th root of 1, index form;</li><li>pad = Padding bytes in shortened block;</li><li>gfpoly</ul>.
2701 */
2702 protected function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) {
2703 foreach ($this->rsitems as $rs) {
2704 if (($rs['pad'] != $pad) OR ($rs['nroots'] != $nroots) OR ($rs['mm'] != $symsize)
2705 OR ($rs['gfpoly'] != $gfpoly) OR ($rs['fcr'] != $fcr) OR ($rs['prim'] != $prim)) {
2706 continue;
2707 }
2708 return $rs;
2709 }
2710 $rs = $this->init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad);
2711 array_unshift($this->rsitems, $rs);
2712 return $rs;
2713 }
2714
2715 // - - - - - - - - - - - - - - - - - - - - - - - - -
2716
2717 // QRrsItem
2718
2719 /**
2720 * modnn
2721 * @param $rs (array) RS values
2722 * @param $x (int) X position
2723 * @return int X osition
2724 */
2725 protected function modnn($rs, $x) {
2726 while ($x >= $rs['nn']) {
2727 $x -= $rs['nn'];
2728 $x = ($x >> $rs['mm']) + ($x & $rs['nn']);
2729 }
2730 return $x;
2731 }
2732
2733 /**
2734 * Initialize a Reed-Solomon codec and returns an array of values.
2735 * @param $symsize (int) symbol size, bits
2736 * @param $gfpoly (int) Field generator polynomial coefficients
2737 * @param $fcr (int) first root of RS code generator polynomial, index form
2738 * @param $prim (int) primitive element to generate polynomial roots
2739 * @param $nroots (int) RS code generator polynomial degree (number of roots)
2740 * @param $pad (int) padding bytes at front of shortened block
2741 * @return array Array of RS values:<ul><li>mm = Bits per symbol;</li><li>nn = Symbols per block;</li><li>alpha_to = log lookup table array;</li><li>index_of = Antilog lookup table array;</li><li>genpoly = Generator polynomial array;</li><li>nroots = Number of generator;</li><li>roots = number of parity symbols;</li><li>fcr = First consecutive root, index form;</li><li>prim = Primitive element, index form;</li><li>iprim = prim-th root of 1, index form;</li><li>pad = Padding bytes in shortened block;</li><li>gfpoly</ul>.
2742 */
2743 protected function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) {
2744 // Based on Reed solomon encoder by Phil Karn, KA9Q (GNU-LGPLv2)
2745 $rs = null;
2746 // Check parameter ranges
2747 if (($symsize < 0) OR ($symsize > 8)) {
2748 return $rs;
2749 }
2750 if (($fcr < 0) OR ($fcr >= (1<<$symsize))) {
2751 return $rs;
2752 }
2753 if (($prim <= 0) OR ($prim >= (1<<$symsize))) {
2754 return $rs;
2755 }
2756 if (($nroots < 0) OR ($nroots >= (1<<$symsize))) {
2757 return $rs;
2758 }
2759 if (($pad < 0) OR ($pad >= ((1<<$symsize) -1 - $nroots))) {
2760 return $rs;
2761 }
2762 $rs = array();
2763 $rs['mm'] = $symsize;
2764 $rs['nn'] = (1 << $symsize) - 1;
2765 $rs['pad'] = $pad;
2766 $rs['alpha_to'] = array_fill(0, ($rs['nn'] + 1), 0);
2767 $rs['index_of'] = array_fill(0, ($rs['nn'] + 1), 0);
2768 // PHP style macro replacement ;)
2769 $NN =& $rs['nn'];
2770 $A0 =& $NN;
2771 // Generate Galois field lookup tables
2772 $rs['index_of'][0] = $A0; // log(zero) = -inf
2773 $rs['alpha_to'][$A0] = 0; // alpha**-inf = 0
2774 $sr = 1;
2775 for ($i=0; $i<$rs['nn']; ++$i) {
2776 $rs['index_of'][$sr] = $i;
2777 $rs['alpha_to'][$i] = $sr;
2778 $sr <<= 1;
2779 if ($sr & (1 << $symsize)) {
2780 $sr ^= $gfpoly;
2781 }
2782 $sr &= $rs['nn'];
2783 }
2784 if ($sr != 1) {
2785 // field generator polynomial is not primitive!
2786 return NULL;
2787 }
2788 // Form RS code generator polynomial from its roots
2789 $rs['genpoly'] = array_fill(0, ($nroots + 1), 0);
2790 $rs['fcr'] = $fcr;
2791 $rs['prim'] = $prim;
2792 $rs['nroots'] = $nroots;
2793 $rs['gfpoly'] = $gfpoly;
2794 // Find prim-th root of 1, used in decoding
2795 for ($iprim=1; ($iprim % $prim) != 0; $iprim += $rs['nn']) {
2796 ; // intentional empty-body loop!
2797 }
2798 $rs['iprim'] = (int)($iprim / $prim);
2799 $rs['genpoly'][0] = 1;
2800 for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) {
2801 $rs['genpoly'][$i+1] = 1;
2802 // Multiply rs->genpoly[] by @**(root + x)
2803 for ($j = $i; $j > 0; --$j) {
2804 if ($rs['genpoly'][$j] != 0) {
2805 $rs['genpoly'][$j] = $rs['genpoly'][$j-1] ^ $rs['alpha_to'][$this->modnn($rs, $rs['index_of'][$rs['genpoly'][$j]] + $root)];
2806 } else {
2807 $rs['genpoly'][$j] = $rs['genpoly'][$j-1];
2808 }
2809 }
2810 // rs->genpoly[0] can never be zero
2811 $rs['genpoly'][0] = $rs['alpha_to'][$this->modnn($rs, $rs['index_of'][$rs['genpoly'][0]] + $root)];
2812 }
2813 // convert rs->genpoly[] to index form for quicker encoding
2814 for ($i = 0; $i <= $nroots; ++$i) {
2815 $rs['genpoly'][$i] = $rs['index_of'][$rs['genpoly'][$i]];
2816 }
2817 return $rs;
2818 }
2819
2820 /**
2821 * Encode a Reed-Solomon codec and returns the parity array
2822 * @param $rs (array) RS values
2823 * @param $data (array) data
2824 * @param $parity (array) parity
2825 * @return parity array
2826 */
2827 protected function encode_rs_char($rs, $data, $parity) {
2828 $MM =& $rs['mm']; // bits per symbol
2829 $NN =& $rs['nn']; // the total number of symbols in a RS block
2830 $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
2831 $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
2832 $GENPOLY =& $rs['genpoly']; // an array of NROOTS+1 elements containing the generator polynomial in index form
2833 $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
2834 $FCR =& $rs['fcr']; // first consecutive root, index form
2835 $PRIM =& $rs['prim']; // primitive element, index form
2836 $IPRIM =& $rs['iprim']; // prim-th root of 1, index form
2837 $PAD =& $rs['pad']; // the number of pad symbols in a block
2838 $A0 =& $NN;
2839 $parity = array_fill(0, $NROOTS, 0);
2840 for ($i=0; $i < ($NN - $NROOTS - $PAD); $i++) {
2841 $feedback = $INDEX_OF[$data[$i] ^ $parity[0]];
2842 if ($feedback != $A0) {
2843 // feedback term is non-zero
2844 // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must
2845 // always be for the polynomials constructed by init_rs()
2846 $feedback = $this->modnn($rs, $NN - $GENPOLY[$NROOTS] + $feedback);
2847 for ($j=1; $j < $NROOTS; ++$j) {
2848 $parity[$j] ^= $ALPHA_TO[$this->modnn($rs, $feedback + $GENPOLY[($NROOTS - $j)])];
2849 }
2850 }
2851 // Shift
2852 array_shift($parity);
2853 if ($feedback != $A0) {
2854 array_push($parity, $ALPHA_TO[$this->modnn($rs, $feedback + $GENPOLY[0])]);
2855 } else {
2856 array_push($parity, 0);
2857 }
2858 }
2859 return $parity;
2860 }
2861
2862} // end QRcode class
2863
2864//============================================================+
2865// END OF FILE
2866//============================================================+
diff --git a/inc/3rdparty/libraries/tcpdf/include/sRGB.icc b/inc/3rdparty/libraries/tcpdf/include/sRGB.icc
new file mode 100644
index 00000000..1d8f7419
--- /dev/null
+++ b/inc/3rdparty/libraries/tcpdf/include/sRGB.icc
Binary files differ
diff --git a/inc/3rdparty/libraries/tcpdf/include/tcpdf_colors.php b/inc/3rdparty/libraries/tcpdf/include/tcpdf_colors.php
new file mode 100644
index 00000000..77f1c4cc
--- /dev/null
+++ b/inc/3rdparty/libraries/tcpdf/include/tcpdf_colors.php
@@ -0,0 +1,462 @@
1<?php
2//============================================================+
3// File name : tcpdf_colors.php
4// Version : 1.0.004
5// Begin : 2002-04-09
6// Last Update : 2014-04-25
7// Author : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
8// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
9// -------------------------------------------------------------------
10// Copyright (C) 2002-2013 Nicola Asuni - Tecnick.com LTD
11//
12// This file is part of TCPDF software library.
13//
14// TCPDF is free software: you can redistribute it and/or modify it
15// under the terms of the GNU Lesser General Public License as
16// published by the Free Software Foundation, either version 3 of the
17// License, or (at your option) any later version.
18//
19// TCPDF is distributed in the hope that it will be useful, but
20// WITHOUT ANY WARRANTY; without even the implied warranty of
21// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
22// See the GNU Lesser General Public License for more details.
23//
24// You should have received a copy of the GNU Lesser General Public License
25// along with TCPDF. If not, see <http://www.gnu.org/licenses/>.
26//
27// See LICENSE.TXT file for more information.
28// -------------------------------------------------------------------
29//
30// Description : Array of WEB safe colors
31//
32//============================================================+
33
34/**
35 * @file
36 * PHP color class for TCPDF
37 * @author Nicola Asuni
38 * @package com.tecnick.tcpdf
39 */
40
41/**
42 * @class TCPDF_COLORS
43 * PHP color class for TCPDF
44 * @package com.tecnick.tcpdf
45 * @version 1.0.004
46 * @author Nicola Asuni - info@tecnick.com
47 */
48class TCPDF_COLORS {
49
50 /**
51 * Array of WEB safe colors
52 * @public static
53 */
54 public static $webcolor = array (
55 'aliceblue' => 'f0f8ff',
56 'antiquewhite' => 'faebd7',
57 'aqua' => '00ffff',
58 'aquamarine' => '7fffd4',
59 'azure' => 'f0ffff',
60 'beige' => 'f5f5dc',
61 'bisque' => 'ffe4c4',
62 'black' => '000000',
63 'blanchedalmond' => 'ffebcd',
64 'blue' => '0000ff',
65 'blueviolet' => '8a2be2',
66 'brown' => 'a52a2a',
67 'burlywood' => 'deb887',
68 'cadetblue' => '5f9ea0',
69 'chartreuse' => '7fff00',
70 'chocolate' => 'd2691e',
71 'coral' => 'ff7f50',
72 'cornflowerblue' => '6495ed',
73 'cornsilk' => 'fff8dc',
74 'crimson' => 'dc143c',
75 'cyan' => '00ffff',
76 'darkblue' => '00008b',
77 'darkcyan' => '008b8b',
78 'darkgoldenrod' => 'b8860b',
79 'dkgray' => 'a9a9a9',
80 'darkgray' => 'a9a9a9',
81 'darkgrey' => 'a9a9a9',
82 'darkgreen' => '006400',
83 'darkkhaki' => 'bdb76b',
84 'darkmagenta' => '8b008b',
85 'darkolivegreen' => '556b2f',
86 'darkorange' => 'ff8c00',
87 'darkorchid' => '9932cc',
88 'darkred' => '8b0000',
89 'darksalmon' => 'e9967a',
90 'darkseagreen' => '8fbc8f',
91 'darkslateblue' => '483d8b',
92 'darkslategray' => '2f4f4f',
93 'darkslategrey' => '2f4f4f',
94 'darkturquoise' => '00ced1',
95 'darkviolet' => '9400d3',
96 'deeppink' => 'ff1493',
97 'deepskyblue' => '00bfff',
98 'dimgray' => '696969',
99 'dimgrey' => '696969',
100 'dodgerblue' => '1e90ff',
101 'firebrick' => 'b22222',
102 'floralwhite' => 'fffaf0',
103 'forestgreen' => '228b22',
104 'fuchsia' => 'ff00ff',
105 'gainsboro' => 'dcdcdc',
106 'ghostwhite' => 'f8f8ff',
107 'gold' => 'ffd700',
108 'goldenrod' => 'daa520',
109 'gray' => '808080',
110 'grey' => '808080',
111 'green' => '008000',
112 'greenyellow' => 'adff2f',
113 'honeydew' => 'f0fff0',
114 'hotpink' => 'ff69b4',
115 'indianred' => 'cd5c5c',
116 'indigo' => '4b0082',
117 'ivory' => 'fffff0',
118 'khaki' => 'f0e68c',
119 'lavender' => 'e6e6fa',
120 'lavenderblush' => 'fff0f5',
121 'lawngreen' => '7cfc00',
122 'lemonchiffon' => 'fffacd',
123 'lightblue' => 'add8e6',
124 'lightcoral' => 'f08080',
125 'lightcyan' => 'e0ffff',
126 'lightgoldenrodyellow' => 'fafad2',
127 'ltgray' => 'd3d3d3',
128 'lightgray' => 'd3d3d3',
129 'lightgrey' => 'd3d3d3',
130 'lightgreen' => '90ee90',
131 'lightpink' => 'ffb6c1',
132 'lightsalmon' => 'ffa07a',
133 'lightseagreen' => '20b2aa',
134 'lightskyblue' => '87cefa',
135 'lightslategray' => '778899',
136 'lightslategrey' => '778899',
137 'lightsteelblue' => 'b0c4de',
138 'lightyellow' => 'ffffe0',
139 'lime' => '00ff00',
140 'limegreen' => '32cd32',
141 'linen' => 'faf0e6',
142 'magenta' => 'ff00ff',
143 'maroon' => '800000',
144 'mediumaquamarine' => '66cdaa',
145 'mediumblue' => '0000cd',
146 'mediumorchid' => 'ba55d3',
147 'mediumpurple' => '9370d8',
148 'mediumseagreen' => '3cb371',
149 'mediumslateblue' => '7b68ee',
150 'mediumspringgreen' => '00fa9a',
151 'mediumturquoise' => '48d1cc',
152 'mediumvioletred' => 'c71585',
153 'midnightblue' => '191970',
154 'mintcream' => 'f5fffa',
155 'mistyrose' => 'ffe4e1',
156 'moccasin' => 'ffe4b5',
157 'navajowhite' => 'ffdead',
158 'navy' => '000080',
159 'oldlace' => 'fdf5e6',
160 'olive' => '808000',
161 'olivedrab' => '6b8e23',
162 'orange' => 'ffa500',
163 'orangered' => 'ff4500',
164 'orchid' => 'da70d6',
165 'palegoldenrod' => 'eee8aa',
166 'palegreen' => '98fb98',
167 'paleturquoise' => 'afeeee',
168 'palevioletred' => 'd87093',
169 'papayawhip' => 'ffefd5',
170 'peachpuff' => 'ffdab9',
171 'peru' => 'cd853f',
172 'pink' => 'ffc0cb',
173 'plum' => 'dda0dd',
174 'powderblue' => 'b0e0e6',
175 'purple' => '800080',
176 'red' => 'ff0000',
177 'rosybrown' => 'bc8f8f',
178 'royalblue' => '4169e1',
179 'saddlebrown' => '8b4513',
180 'salmon' => 'fa8072',
181 'sandybrown' => 'f4a460',
182 'seagreen' => '2e8b57',
183 'seashell' => 'fff5ee',
184 'sienna' => 'a0522d',
185 'silver' => 'c0c0c0',
186 'skyblue' => '87ceeb',
187 'slateblue' => '6a5acd',
188 'slategray' => '708090',
189 'slategrey' => '708090',
190 'snow' => 'fffafa',
191 'springgreen' => '00ff7f',
192 'steelblue' => '4682b4',
193 'tan' => 'd2b48c',
194 'teal' => '008080',
195 'thistle' => 'd8bfd8',
196 'tomato' => 'ff6347',
197 'turquoise' => '40e0d0',
198 'violet' => 'ee82ee',
199 'wheat' => 'f5deb3',
200 'white' => 'ffffff',
201 'whitesmoke' => 'f5f5f5',
202 'yellow' => 'ffff00',
203 'yellowgreen' => '9acd32'
204 ); // end of web colors
205
206 /**
207 * Array of valid JavaScript color names
208 * @public static
209 */
210 public static $jscolor = array ('transparent', 'black', 'white', 'red', 'green', 'blue', 'cyan', 'magenta', 'yellow', 'dkGray', 'gray', 'ltGray');
211
212 /**
213 * Array of Spot colors (C,M,Y,K,name)
214 * Color keys must be in lowercase and without spaces.
215 * As long as no open standard for spot colours exists, you have to buy a colour book by one of the colour manufacturers and insert the values and names of spot colours directly.
216 * Common industry standard spot colors are: ANPA-COLOR, DIC, FOCOLTONE, GCMI, HKS, PANTONE, TOYO, TRUMATCH.
217 * @public static
218 */
219 public static $spotcolor = array (
220 // special registration colors
221 'none' => array( 0, 0, 0, 0, 'None'),
222 'all' => array(100, 100, 100, 100, 'All'),
223 // standard CMYK colors
224 'cyan' => array(100, 0, 0, 0, 'Cyan'),
225 'magenta' => array( 0, 100, 0, 0, 'Magenta'),
226 'yellow' => array( 0, 0, 100, 0, 'Yellow'),
227 'key' => array( 0, 0, 0, 100, 'Key'),
228 // alias
229 'white' => array( 0, 0, 0, 0, 'White'),
230 'black' => array( 0, 0, 0, 100, 'Black'),
231 // standard RGB colors
232 'red' => array( 0, 100, 100, 0, 'Red'),
233 'green' => array(100, 0, 100, 0, 'Green'),
234 'blue' => array(100, 100, 0, 0, 'Blue'),
235 // Add here standard spot colors or dynamically define them with AddSpotColor()
236 // ...
237 ); // end of spot colors
238
239 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
240
241 /**
242 * Return the Spot color array.
243 * @param $name (string) Name of the spot color.
244 * @param $spotc (array) Reference to an array of spot colors.
245 * @return (array) Spot color array or false if not defined.
246 * @since 5.9.125 (2011-10-03)
247 * @public static
248 */
249 public static function getSpotColor($name, &$spotc) {
250 if (isset($spotc[$name])) {
251 return $spotc[$name];
252 }
253 $color = preg_replace('/[\s]*/', '', $name); // remove extra spaces
254 $color = strtolower($color);
255 if (isset(self::$spotcolor[$color])) {
256 if (!isset($spotc[$name])) {
257 $i = (1 + count($spotc));
258 $spotc[$name] = array('C' => self::$spotcolor[$color][0], 'M' => self::$spotcolor[$color][1], 'Y' => self::$spotcolor[$color][2], 'K' => self::$spotcolor[$color][3], 'name' => self::$spotcolor[$color][4], 'i' => $i);
259 }
260 return $spotc[self::$spotcolor[$color][4]];
261 }
262 return false;
263 }
264
265 /**
266 * Returns an array (RGB or CMYK) from an html color name, or a six-digit (i.e. #3FE5AA), or three-digit (i.e. #7FF) hexadecimal color, or a javascript color array, or javascript color name.
267 * @param $hcolor (string) HTML color.
268 * @param $spotc (array) Reference to an array of spot colors.
269 * @param $defcol (array) Color to return in case of error.
270 * @return array RGB or CMYK color, or false in case of error.
271 * @public static
272 */
273 public static function convertHTMLColorToDec($hcolor, &$spotc, $defcol=array('R'=>128,'G'=>128,'B'=>128)) {
274 $color = preg_replace('/[\s]*/', '', $hcolor); // remove extra spaces
275 $color = strtolower($color);
276 // check for javascript color array syntax
277 if (strpos($color, '[') !== false) {
278 if (preg_match('/[\[][\"\'](t|g|rgb|cmyk)[\"\'][\,]?([0-9\.]*)[\,]?([0-9\.]*)[\,]?([0-9\.]*)[\,]?([0-9\.]*)[\]]/', $color, $m) > 0) {
279 $returncolor = array();
280 switch ($m[1]) {
281 case 'cmyk': {
282 // RGB
283 $returncolor['C'] = max(0, min(100, (floatval($m[2]) * 100)));
284 $returncolor['M'] = max(0, min(100, (floatval($m[3]) * 100)));
285 $returncolor['Y'] = max(0, min(100, (floatval($m[4]) * 100)));
286 $returncolor['K'] = max(0, min(100, (floatval($m[5]) * 100)));
287 break;
288 }
289 case 'rgb': {
290 // RGB
291 $returncolor['R'] = max(0, min(255, (floatval($m[2]) * 255)));
292 $returncolor['G'] = max(0, min(255, (floatval($m[3]) * 255)));
293 $returncolor['B'] = max(0, min(255, (floatval($m[4]) * 255)));
294 break;
295 }
296 case 'g': {
297 // grayscale
298 $returncolor['G'] = max(0, min(255, (floatval($m[2]) * 255)));
299 break;
300 }
301 case 't':
302 default: {
303 // transparent (empty array)
304 break;
305 }
306 }
307 return $returncolor;
308 }
309 } elseif ((substr($color, 0, 4) != 'cmyk') AND (substr($color, 0, 3) != 'rgb') AND (($dotpos = strpos($color, '.')) !== false)) {
310 // remove class parent (i.e.: color.red)
311 $color = substr($color, ($dotpos + 1));
312 if ($color == 'transparent') {
313 // transparent (empty array)
314 return array();
315 }
316 }
317 if (strlen($color) == 0) {
318 return $defcol;
319 }
320 // RGB ARRAY
321 if (substr($color, 0, 3) == 'rgb') {
322 $codes = substr($color, 4);
323 $codes = str_replace(')', '', $codes);
324 $returncolor = explode(',', $codes);
325 foreach ($returncolor as $key => $val) {
326 if (strpos($val, '%') > 0) {
327 // percentage
328 $returncolor[$key] = (255 * intval($val) / 100);
329 } else {
330 $returncolor[$key] = intval($val);
331 }
332 // normalize value
333 $returncolor[$key] = max(0, min(255, $returncolor[$key]));
334 }
335 return $returncolor;
336 }
337 // CMYK ARRAY
338 if (substr($color, 0, 4) == 'cmyk') {
339 $codes = substr($color, 5);
340 $codes = str_replace(')', '', $codes);
341 $returncolor = explode(',', $codes);
342 foreach ($returncolor as $key => $val) {
343 if (strpos($val, '%') !== false) {
344 // percentage
345 $returncolor[$key] = (100 * intval($val) / 100);
346 } else {
347 $returncolor[$key] = intval($val);
348 }
349 // normalize value
350 $returncolor[$key] = max(0, min(100, $returncolor[$key]));
351 }
352 return $returncolor;
353 }
354 if ($color[0] != '#') {
355 // COLOR NAME
356 if (isset(self::$webcolor[$color])) {
357 // web color
358 $color_code = self::$webcolor[$color];
359 } else {
360 // spot color
361 $returncolor = self::getSpotColor($color, $spotc);
362 if ($returncolor === false) {
363 $returncolor = $defcol;
364 }
365 return $returncolor;
366 }
367 } else {
368 $color_code = substr($color, 1);
369 }
370 // HEXADECIMAL REPRESENTATION
371 switch (strlen($color_code)) {
372 case 3: {
373 // 3-digit RGB hexadecimal representation
374 $r = substr($color_code, 0, 1);
375 $g = substr($color_code, 1, 1);
376 $b = substr($color_code, 2, 1);
377 $returncolor = array();
378 $returncolor['R'] = max(0, min(255, hexdec($r.$r)));
379 $returncolor['G'] = max(0, min(255, hexdec($g.$g)));
380 $returncolor['B'] = max(0, min(255, hexdec($b.$b)));
381 break;
382 }
383 case 6: {
384 // 6-digit RGB hexadecimal representation
385 $returncolor = array();
386 $returncolor['R'] = max(0, min(255, hexdec(substr($color_code, 0, 2))));
387 $returncolor['G'] = max(0, min(255, hexdec(substr($color_code, 2, 2))));
388 $returncolor['B'] = max(0, min(255, hexdec(substr($color_code, 4, 2))));
389 break;
390 }
391 case 8: {
392 // 8-digit CMYK hexadecimal representation
393 $returncolor = array();
394 $returncolor['C'] = max(0, min(100, round(hexdec(substr($color_code, 0, 2)) / 2.55)));
395 $returncolor['M'] = max(0, min(100, round(hexdec(substr($color_code, 2, 2)) / 2.55)));
396 $returncolor['Y'] = max(0, min(100, round(hexdec(substr($color_code, 4, 2)) / 2.55)));
397 $returncolor['K'] = max(0, min(100, round(hexdec(substr($color_code, 6, 2)) / 2.55)));
398 break;
399 }
400 default: {
401 $returncolor = $defcol;
402 break;
403 }
404 }
405 return $returncolor;
406 }
407
408 /**
409 * Convert a color array into a string representation.
410 * @param $c (array) Array of colors.
411 * @return (string) The color array representation.
412 * @since 5.9.137 (2011-12-01)
413 * @public static
414 */
415 public static function getColorStringFromArray($c) {
416 $c = array_values($c);
417 $color = '[';
418 switch (count($c)) {
419 case 4: {
420 // CMYK
421 $color .= sprintf('%F %F %F %F', (max(0, min(100, floatval($c[0]))) / 100), (max(0, min(100, floatval($c[1]))) / 100), (max(0, min(100, floatval($c[2]))) / 100), (max(0, min(100, floatval($c[3]))) / 100));
422 break;
423 }
424 case 3: {
425 // RGB
426 $color .= sprintf('%F %F %F', (max(0, min(255, floatval($c[0]))) / 255), (max(0, min(255, floatval($c[1]))) / 255), (max(0, min(255, floatval($c[2]))) / 255));
427 break;
428 }
429 case 1: {
430 // grayscale
431 $color .= sprintf('%F', (max(0, min(255, floatval($c[0]))) / 255));
432 break;
433 }
434 }
435 $color .= ']';
436 return $color;
437 }
438
439 /**
440 * Convert color to javascript color.
441 * @param $color (string) color name or "#RRGGBB"
442 * @protected
443 * @since 2.1.002 (2008-02-12)
444 * @public static
445 */
446 public static function _JScolor($color) {
447 if (substr($color, 0, 1) == '#') {
448 return sprintf("['RGB',%F,%F,%F]", (hexdec(substr($color, 1, 2)) / 255), (hexdec(substr($color, 3, 2)) / 255), (hexdec(substr($color, 5, 2)) / 255));
449 }
450 if (!in_array($color, self::$jscolor)) {
451 // default transparent color
452 $color = $jscolor[0];
453 }
454 return 'color.'.$color;
455 }
456
457
458} // END OF TCPDF_COLORS CLASS
459
460//============================================================+
461// END OF FILE
462//============================================================+
diff --git a/inc/3rdparty/libraries/tcpdf/include/tcpdf_filters.php b/inc/3rdparty/libraries/tcpdf/include/tcpdf_filters.php
new file mode 100644
index 00000000..96584db5
--- /dev/null
+++ b/inc/3rdparty/libraries/tcpdf/include/tcpdf_filters.php
@@ -0,0 +1,481 @@
1<?php
2//============================================================+
3// File name : tcpdf_filters.php
4// Version : 1.0.001
5// Begin : 2011-05-23
6// Last Update : 2014-04-25
7// Author : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
8// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
9// -------------------------------------------------------------------
10// Copyright (C) 2011-2013 Nicola Asuni - Tecnick.com LTD
11//
12// This file is part of TCPDF software library.
13//
14// TCPDF is free software: you can redistribute it and/or modify it
15// under the terms of the GNU Lesser General Public License as
16// published by the Free Software Foundation, either version 3 of the
17// License, or (at your option) any later version.
18//
19// TCPDF is distributed in the hope that it will be useful, but
20// WITHOUT ANY WARRANTY; without even the implied warranty of
21// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
22// See the GNU Lesser General Public License for more details.
23//
24// You should have received a copy of the License
25// along with TCPDF. If not, see
26// <http://www.tecnick.com/pagefiles/tcpdf/LICENSE.TXT>.
27//
28// See LICENSE.TXT file for more information.
29// -------------------------------------------------------------------
30//
31// Description : This is a PHP class for decoding common PDF filters (PDF 32000-2008 - 7.4 Filters).
32//
33//============================================================+
34
35/**
36 * @file
37 * This is a PHP class for decoding common PDF filters (PDF 32000-2008 - 7.4 Filters).<br>
38 * @package com.tecnick.tcpdf
39 * @author Nicola Asuni
40 * @version 1.0.001
41 */
42
43/**
44 * @class TCPDF_FILTERS
45 * This is a PHP class for decoding common PDF filters (PDF 32000-2008 - 7.4 Filters).<br>
46 * @package com.tecnick.tcpdf
47 * @brief This is a PHP class for decoding common PDF filters.
48 * @version 1.0.001
49 * @author Nicola Asuni - info@tecnick.com
50 */
51class TCPDF_FILTERS {
52
53 /**
54 * Define a list of available filter decoders.
55 * @private static
56 */
57 private static $available_filters = array('ASCIIHexDecode', 'ASCII85Decode', 'LZWDecode', 'FlateDecode', 'RunLengthDecode');
58
59// -----------------------------------------------------------------------------
60
61 /**
62 * Get a list of available decoding filters.
63 * @return (array) Array of available filter decoders.
64 * @since 1.0.000 (2011-05-23)
65 * @public static
66 */
67 public static function getAvailableFilters() {
68 return self::$available_filters;
69 }
70
71 /**
72 * Decode data using the specified filter type.
73 * @param $filter (string) Filter name.
74 * @param $data (string) Data to decode.
75 * @return Decoded data string.
76 * @since 1.0.000 (2011-05-23)
77 * @public static
78 */
79 public static function decodeFilter($filter, $data) {
80 switch ($filter) {
81 case 'ASCIIHexDecode': {
82 return self::decodeFilterASCIIHexDecode($data);
83 break;
84 }
85 case 'ASCII85Decode': {
86 return self::decodeFilterASCII85Decode($data);
87 break;
88 }
89 case 'LZWDecode': {
90 return self::decodeFilterLZWDecode($data);
91 break;
92 }
93 case 'FlateDecode': {
94 return self::decodeFilterFlateDecode($data);
95 break;
96 }
97 case 'RunLengthDecode': {
98 return self::decodeFilterRunLengthDecode($data);
99 break;
100 }
101 case 'CCITTFaxDecode': {
102 return self::decodeFilterCCITTFaxDecode($data);
103 break;
104 }
105 case 'JBIG2Decode': {
106 return self::decodeFilterJBIG2Decode($data);
107 break;
108 }
109 case 'DCTDecode': {
110 return self::decodeFilterDCTDecode($data);
111 break;
112 }
113 case 'JPXDecode': {
114 return self::decodeFilterJPXDecode($data);
115 break;
116 }
117 case 'Crypt': {
118 return self::decodeFilterCrypt($data);
119 break;
120 }
121 default: {
122 return self::decodeFilterStandard($data);
123 break;
124 }
125 }
126 }
127
128 // --- FILTERS (PDF 32000-2008 - 7.4 Filters) ------------------------------
129
130 /**
131 * Standard
132 * Default decoding filter (leaves data unchanged).
133 * @param $data (string) Data to decode.
134 * @return Decoded data string.
135 * @since 1.0.000 (2011-05-23)
136 * @public static
137 */
138 public static function decodeFilterStandard($data) {
139 return $data;
140 }
141
142 /**
143 * ASCIIHexDecode
144 * Decodes data encoded in an ASCII hexadecimal representation, reproducing the original binary data.
145 * @param $data (string) Data to decode.
146 * @return Decoded data string.
147 * @since 1.0.000 (2011-05-23)
148 * @public static
149 */
150 public static function decodeFilterASCIIHexDecode($data) {
151 // intialize string to return
152 $decoded = '';
153 // all white-space characters shall be ignored
154 $data = preg_replace('/[\s]/', '', $data);
155 // check for EOD character: GREATER-THAN SIGN (3Eh)
156 $eod = strpos($data, '>');
157 if ($eod !== false) {
158 // remove EOD and extra data (if any)
159 $data = substr($data, 0, $eod);
160 $eod = true;
161 }
162 // get data length
163 $data_length = strlen($data);
164 if (($data_length % 2) != 0) {
165 // odd number of hexadecimal digits
166 if ($eod) {
167 // EOD shall behave as if a 0 (zero) followed the last digit
168 $data = substr($data, 0, -1).'0'.substr($data, -1);
169 } else {
170 self::Error('decodeFilterASCIIHexDecode: invalid code');
171 }
172 }
173 // check for invalid characters
174 if (preg_match('/[^a-fA-F\d]/', $data) > 0) {
175 self::Error('decodeFilterASCIIHexDecode: invalid code');
176 }
177 // get one byte of binary data for each pair of ASCII hexadecimal digits
178 $decoded = pack('H*', $data);
179 return $decoded;
180 }
181
182 /**
183 * ASCII85Decode
184 * Decodes data encoded in an ASCII base-85 representation, reproducing the original binary data.
185 * @param $data (string) Data to decode.
186 * @return Decoded data string.
187 * @since 1.0.000 (2011-05-23)
188 * @public static
189 */
190 public static function decodeFilterASCII85Decode($data) {
191 // intialize string to return
192 $decoded = '';
193 // all white-space characters shall be ignored
194 $data = preg_replace('/[\s]/', '', $data);
195 // remove start sequence 2-character sequence <~ (3Ch)(7Eh)
196 if (strpos($data, '<~') !== false) {
197 // remove EOD and extra data (if any)
198 $data = substr($data, 2);
199 }
200 // check for EOD: 2-character sequence ~> (7Eh)(3Eh)
201 $eod = strpos($data, '~>');
202 if ($eod !== false) {
203 // remove EOD and extra data (if any)
204 $data = substr($data, 0, $eod);
205 }
206 // data length
207 $data_length = strlen($data);
208 // check for invalid characters
209 if (preg_match('/[^\x21-\x75,\x74]/', $data) > 0) {
210 self::Error('decodeFilterASCII85Decode: invalid code');
211 }
212 // z sequence
213 $zseq = chr(0).chr(0).chr(0).chr(0);
214 // position inside a group of 4 bytes (0-3)
215 $group_pos = 0;
216 $tuple = 0;
217 $pow85 = array((85*85*85*85), (85*85*85), (85*85), 85, 1);
218 $last_pos = ($data_length - 1);
219 // for each byte
220 for ($i = 0; $i < $data_length; ++$i) {
221 // get char value
222 $char = ord($data[$i]);
223 if ($char == 122) { // 'z'
224 if ($group_pos == 0) {
225 $decoded .= $zseq;
226 } else {
227 self::Error('decodeFilterASCII85Decode: invalid code');
228 }
229 } else {
230 // the value represented by a group of 5 characters should never be greater than 2^32 - 1
231 $tuple += (($char - 33) * $pow85[$group_pos]);
232 if ($group_pos == 4) {
233 $decoded .= chr($tuple >> 24).chr($tuple >> 16).chr($tuple >> 8).chr($tuple);
234 $tuple = 0;
235 $group_pos = 0;
236 } else {
237 ++$group_pos;
238 }
239 }
240 }
241 if ($group_pos > 1) {
242 $tuple += $pow85[($group_pos - 1)];
243 }
244 // last tuple (if any)
245 switch ($group_pos) {
246 case 4: {
247 $decoded .= chr($tuple >> 24).chr($tuple >> 16).chr($tuple >> 8);
248 break;
249 }
250 case 3: {
251 $decoded .= chr($tuple >> 24).chr($tuple >> 16);
252 break;
253 }
254 case 2: {
255 $decoded .= chr($tuple >> 24);
256 break;
257 }
258 case 1: {
259 self::Error('decodeFilterASCII85Decode: invalid code');
260 break;
261 }
262 }
263 return $decoded;
264 }
265
266 /**
267 * LZWDecode
268 * Decompresses data encoded using the LZW (Lempel-Ziv-Welch) adaptive compression method, reproducing the original text or binary data.
269 * @param $data (string) Data to decode.
270 * @return Decoded data string.
271 * @since 1.0.000 (2011-05-23)
272 * @public static
273 */
274 public static function decodeFilterLZWDecode($data) {
275 // intialize string to return
276 $decoded = '';
277 // data length
278 $data_length = strlen($data);
279 // convert string to binary string
280 $bitstring = '';
281 for ($i = 0; $i < $data_length; ++$i) {
282 $bitstring .= sprintf('%08b', ord($data{$i}));
283 }
284 // get the number of bits
285 $data_length = strlen($bitstring);
286 // initialize code length in bits
287 $bitlen = 9;
288 // initialize dictionary index
289 $dix = 258;
290 // initialize the dictionary (with the first 256 entries).
291 $dictionary = array();
292 for ($i = 0; $i < 256; ++$i) {
293 $dictionary[$i] = chr($i);
294 }
295 // previous val
296 $prev_index = 0;
297 // while we encounter EOD marker (257), read code_length bits
298 while (($data_length > 0) AND (($index = bindec(substr($bitstring, 0, $bitlen))) != 257)) {
299 // remove read bits from string
300 $bitstring = substr($bitstring, $bitlen);
301 // update number of bits
302 $data_length -= $bitlen;
303 if ($index == 256) { // clear-table marker
304 // reset code length in bits
305 $bitlen = 9;
306 // reset dictionary index
307 $dix = 258;
308 $prev_index = 256;
309 // reset the dictionary (with the first 256 entries).
310 $dictionary = array();
311 for ($i = 0; $i < 256; ++$i) {
312 $dictionary[$i] = chr($i);
313 }
314 } elseif ($prev_index == 256) {
315 // first entry
316 $decoded .= $dictionary[$index];
317 $prev_index = $index;
318 } else {
319 // check if index exist in the dictionary
320 if ($index < $dix) {
321 // index exist on dictionary
322 $decoded .= $dictionary[$index];
323 $dic_val = $dictionary[$prev_index].$dictionary[$index][0];
324 // store current index
325 $prev_index = $index;
326 } else {
327 // index do not exist on dictionary
328 $dic_val = $dictionary[$prev_index].$dictionary[$prev_index][0];
329 $decoded .= $dic_val;
330 }
331 // update dictionary
332 $dictionary[$dix] = $dic_val;
333 ++$dix;
334 // change bit length by case
335 if ($dix == 2047) {
336 $bitlen = 12;
337 } elseif ($dix == 1023) {
338 $bitlen = 11;
339 } elseif ($dix == 511) {
340 $bitlen = 10;
341 }
342 }
343 }
344 return $decoded;
345 }
346
347 /**
348 * FlateDecode
349 * Decompresses data encoded using the zlib/deflate compression method, reproducing the original text or binary data.
350 * @param $data (string) Data to decode.
351 * @return Decoded data string.
352 * @since 1.0.000 (2011-05-23)
353 * @public static
354 */
355 public static function decodeFilterFlateDecode($data) {
356 // intialize string to return
357 $decoded = @gzuncompress($data);
358 if ($decoded === false) {
359 self::Error('decodeFilterFlateDecode: invalid code');
360 }
361 return $decoded;
362 }
363
364 /**
365 * RunLengthDecode
366 * Decompresses data encoded using a byte-oriented run-length encoding algorithm.
367 * @param $data (string) Data to decode.
368 * @since 1.0.000 (2011-05-23)
369 * @public static
370 */
371 public static function decodeFilterRunLengthDecode($data) {
372 // intialize string to return
373 $decoded = '';
374 // data length
375 $data_length = strlen($data);
376 $i = 0;
377 while($i < $data_length) {
378 // get current byte value
379 $byte = ord($data{$i});
380 if ($byte == 128) {
381 // a length value of 128 denote EOD
382 break;
383 } elseif ($byte < 128) {
384 // if the length byte is in the range 0 to 127
385 // the following length + 1 (1 to 128) bytes shall be copied literally during decompression
386 $decoded .= substr($data, ($i + 1), ($byte + 1));
387 // move to next block
388 $i += ($byte + 2);
389 } else {
390 // if length is in the range 129 to 255,
391 // the following single byte shall be copied 257 - length (2 to 128) times during decompression
392 $decoded .= str_repeat($data{($i + 1)}, (257 - $byte));
393 // move to next block
394 $i += 2;
395 }
396 }
397 return $decoded;
398 }
399
400 /**
401 * CCITTFaxDecode (NOT IMPLEMETED - RETURN AN EXCEPTION)
402 * Decompresses data encoded using the CCITT facsimile standard, reproducing the original data (typically monochrome image data at 1 bit per pixel).
403 * @param $data (string) Data to decode.
404 * @return Decoded data string.
405 * @since 1.0.000 (2011-05-23)
406 * @public static
407 */
408 public static function decodeFilterCCITTFaxDecode($data) {
409 self::Error('~decodeFilterCCITTFaxDecode: this method has not been yet implemented');
410 //return $data;
411 }
412
413 /**
414 * JBIG2Decode (NOT IMPLEMETED - RETURN AN EXCEPTION)
415 * Decompresses data encoded using the JBIG2 standard, reproducing the original monochrome (1 bit per pixel) image data (or an approximation of that data).
416 * @param $data (string) Data to decode.
417 * @return Decoded data string.
418 * @since 1.0.000 (2011-05-23)
419 * @public static
420 */
421 public static function decodeFilterJBIG2Decode($data) {
422 self::Error('~decodeFilterJBIG2Decode: this method has not been yet implemented');
423 //return $data;
424 }
425
426 /**
427 * DCTDecode (NOT IMPLEMETED - RETURN AN EXCEPTION)
428 * Decompresses data encoded using a DCT (discrete cosine transform) technique based on the JPEG standard, reproducing image sample data that approximates the original data.
429 * @param $data (string) Data to decode.
430 * @return Decoded data string.
431 * @since 1.0.000 (2011-05-23)
432 * @public static
433 */
434 public static function decodeFilterDCTDecode($data) {
435 self::Error('~decodeFilterDCTDecode: this method has not been yet implemented');
436 //return $data;
437 }
438
439 /**
440 * JPXDecode (NOT IMPLEMETED - RETURN AN EXCEPTION)
441 * Decompresses data encoded using the wavelet-based JPEG2000 standard, reproducing the original image data.
442 * @param $data (string) Data to decode.
443 * @return Decoded data string.
444 * @since 1.0.000 (2011-05-23)
445 * @public static
446 */
447 public static function decodeFilterJPXDecode($data) {
448 self::Error('~decodeFilterJPXDecode: this method has not been yet implemented');
449 //return $data;
450 }
451
452 /**
453 * Crypt (NOT IMPLEMETED - RETURN AN EXCEPTION)
454 * Decrypts data encrypted by a security handler, reproducing the data as it was before encryption.
455 * @param $data (string) Data to decode.
456 * @return Decoded data string.
457 * @since 1.0.000 (2011-05-23)
458 * @public static
459 */
460 public static function decodeFilterCrypt($data) {
461 self::Error('~decodeFilterCrypt: this method has not been yet implemented');
462 //return $data;
463 }
464
465 // --- END FILTERS SECTION -------------------------------------------------
466
467 /**
468 * Throw an exception.
469 * @param $msg (string) The error message
470 * @since 1.0.000 (2011-05-23)
471 * @public static
472 */
473 public static function Error($msg) {
474 throw new Exception('TCPDF_PARSER ERROR: '.$msg);
475 }
476
477} // END OF TCPDF_FILTERS CLASS
478
479//============================================================+
480// END OF FILE
481//============================================================+
diff --git a/inc/3rdparty/libraries/tcpdf/include/tcpdf_font_data.php b/inc/3rdparty/libraries/tcpdf/include/tcpdf_font_data.php
new file mode 100644
index 00000000..974e72ec
--- /dev/null
+++ b/inc/3rdparty/libraries/tcpdf/include/tcpdf_font_data.php
@@ -0,0 +1,18447 @@
1<?php
2//============================================================+
3// File name : tcpdf_font_data.php
4// Version : 1.0.001
5// Begin : 2008-01-01
6// Last Update : 2013-04-01
7// Author : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
8// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
9// -------------------------------------------------------------------
10// Copyright (C) 2008-2013 Nicola Asuni - Tecnick.com LTD
11//
12// This file is part of TCPDF software library.
13//
14// TCPDF is free software: you can redistribute it and/or modify it
15// under the terms of the GNU Lesser General Public License as
16// published by the Free Software Foundation, either version 3 of the
17// License, or (at your option) any later version.
18//
19// TCPDF is distributed in the hope that it will be useful, but
20// WITHOUT ANY WARRANTY; without even the implied warranty of
21// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
22// See the GNU Lesser General Public License for more details.
23//
24// You should have received a copy of the GNU Lesser General Public License
25// along with TCPDF. If not, see <http://www.gnu.org/licenses/>.
26//
27// See LICENSE.TXT file for more information.
28// -------------------------------------------------------------------
29//
30// Description : Unicode data and encoding maps for TCPDF.
31//
32//============================================================+
33
34/**
35 * @file
36 * Unicode data and encoding maps for TCPDF.
37 * @author Nicola Asuni
38 * @package com.tecnick.tcpdf
39 */
40
41/**
42 * @class TCPDF_FONT_DATA
43 * Unicode data and encoding maps for TCPDF.
44 * @package com.tecnick.tcpdf
45 * @version 1.0.001
46 * @author Nicola Asuni - info@tecnick.com
47 */
48class TCPDF_FONT_DATA {
49
50/**
51 * Unicode code for Left-to-Right Mark.
52 * @public
53 */
54public static $uni_LRM = 8206;
55
56/**
57 * Unicode code for Right-to-Left Mark.
58 * @public
59 */
60public static $uni_RLM = 8207;
61
62/**
63 * Unicode code for Left-to-Right Embedding.
64 * @public
65 */
66public static $uni_LRE = 8234;
67
68/**
69 * Unicode code for Right-to-Left Embedding.
70 * @public
71 */
72public static $uni_RLE = 8235;
73
74/**
75 * Unicode code for Pop Directional Format.
76 * @public
77 */
78public static $uni_PDF = 8236;
79
80/**
81 * Unicode code for Left-to-Right Override.
82 * @public
83 */
84public static $uni_LRO = 8237;
85
86/**
87 * Unicode code for Right-to-Left Override.
88 * @public
89 */
90public static $uni_RLO = 8238;
91
92/**
93 * Pattern to test RTL (Righ-To-Left) strings using regular expressions.
94 * @public
95 */
96public static $uni_RE_PATTERN_RTL = "/(
97 \xD6\xBE # R
98 | \xD7[\x80\x83\x86\x90-\xAA\xB0-\xB4] # R
99 | \xDF[\x80-\xAA\xB4\xB5\xBA] # R
100 | \xE2\x80\x8F # R
101 | \xEF\xAC[\x9D\x9F\xA0-\xA8\xAA-\xB6\xB8-\xBC\xBE] # R
102 | \xEF\xAD[\x80\x81\x83\x84\x86-\x8F] # R
103 | \xF0\x90\xA0[\x80-\x85\x88\x8A-\xB5\xB7\xB8\xBC\xBF] # R
104 | \xF0\x90\xA4[\x80-\x99] # R
105 | \xF0\x90\xA8[\x80\x90-\x93\x95-\x97\x99-\xB3] # R
106 | \xF0\x90\xA9[\x80-\x87\x90-\x98] # R
107 | \xE2\x80[\xAB\xAE] # RLE & RLO
108 )/x";
109
110/**
111 * Pattern to test Arabic strings using regular expressions. Source: http://www.w3.org/International/questions/qa-forms-utf-8
112 * @public
113 */
114public static $uni_RE_PATTERN_ARABIC = "/(
115 \xD8[\x80-\x83\x8B\x8D\x9B\x9E\x9F\xA1-\xBA] # AL
116 | \xD9[\x80-\x8A\xAD-\xAF\xB1-\xBF] # AL
117 | \xDA[\x80-\xBF] # AL
118 | \xDB[\x80-\x95\x9D\xA5\xA6\xAE\xAF\xBA-\xBF] # AL
119 | \xDC[\x80-\x8D\x90\x92-\xAF] # AL
120 | \xDD[\x8D-\xAD] # AL
121 | \xDE[\x80-\xA5\xB1] # AL
122 | \xEF\xAD[\x90-\xBF] # AL
123 | \xEF\xAE[\x80-\xB1] # AL
124 | \xEF\xAF[\x93-\xBF] # AL
125 | \xEF[\xB0-\xB3][\x80-\xBF] # AL
126 | \xEF\xB4[\x80-\xBD] # AL
127 | \xEF\xB5[\x90-\xBF] # AL
128 | \xEF\xB6[\x80-\x8F\x92-\xBF] # AL
129 | \xEF\xB7[\x80-\x87\xB0-\xBC] # AL
130 | \xEF\xB9[\xB0-\xB4\xB6-\xBF] # AL
131 | \xEF\xBA[\x80-\xBF] # AL
132 | \xEF\xBB[\x80-\xBC] # AL
133 | \xD9[\xA0-\xA9\xAB\xAC] # AN
134 )/x";
135
136/**
137 * Array of Unicode types.
138 * @public
139 */
140public static $uni_type = array(
1410=>'BN',
1421=>'BN',
1432=>'BN',
1443=>'BN',
1454=>'BN',
1465=>'BN',
1476=>'BN',
1487=>'BN',
1498=>'BN',
1509=>'S',
15110=>'B',
15211=>'S',
15312=>'WS',
15413=>'B',
15514=>'BN',
15615=>'BN',
15716=>'BN',
15817=>'BN',
15918=>'BN',
16019=>'BN',
16120=>'BN',
16221=>'BN',
16322=>'BN',
16423=>'BN',
16524=>'BN',
16625=>'BN',
16726=>'BN',
16827=>'BN',
16928=>'B',
17029=>'B',
17130=>'B',
17231=>'S',
17332=>'WS',
17433=>'ON',
17534=>'ON',
17635=>'ET',
17736=>'ET',
17837=>'ET',
17938=>'ON',
18039=>'ON',
18140=>'ON',
18241=>'ON',
18342=>'ON',
18443=>'ES',
18544=>'CS',
18645=>'ES',
18746=>'CS',
18847=>'CS',
18948=>'EN',
19049=>'EN',
19150=>'EN',
19251=>'EN',
19352=>'EN',
19453=>'EN',
19554=>'EN',
19655=>'EN',
19756=>'EN',
19857=>'EN',
19958=>'CS',
20059=>'ON',
20160=>'ON',
20261=>'ON',
20362=>'ON',
20463=>'ON',
20564=>'ON',
20665=>'L',
20766=>'L',
20867=>'L',
20968=>'L',
21069=>'L',
21170=>'L',
21271=>'L',
21372=>'L',
21473=>'L',
21574=>'L',
21675=>'L',
21776=>'L',
21877=>'L',
21978=>'L',
22079=>'L',
22180=>'L',
22281=>'L',
22382=>'L',
22483=>'L',
22584=>'L',
22685=>'L',
22786=>'L',
22887=>'L',
22988=>'L',
23089=>'L',
23190=>'L',
23291=>'ON',
23392=>'ON',
23493=>'ON',
23594=>'ON',
23695=>'ON',
23796=>'ON',
23897=>'L',
23998=>'L',
24099=>'L',
241100=>'L',
242101=>'L',
243102=>'L',
244103=>'L',
245104=>'L',
246105=>'L',
247106=>'L',
248107=>'L',
249108=>'L',
250109=>'L',
251110=>'L',
252111=>'L',
253112=>'L',
254113=>'L',
255114=>'L',
256115=>'L',
257116=>'L',
258117=>'L',
259118=>'L',
260119=>'L',
261120=>'L',
262121=>'L',
263122=>'L',
264123=>'ON',
265124=>'ON',
266125=>'ON',
267126=>'ON',
268127=>'BN',
269128=>'BN',
270129=>'BN',
271130=>'BN',
272131=>'BN',
273132=>'BN',
274133=>'B',
275134=>'BN',
276135=>'BN',
277136=>'BN',
278137=>'BN',
279138=>'BN',
280139=>'BN',
281140=>'BN',
282141=>'BN',
283142=>'BN',
284143=>'BN',
285144=>'BN',
286145=>'BN',
287146=>'BN',
288147=>'BN',
289148=>'BN',
290149=>'BN',
291150=>'BN',
292151=>'BN',
293152=>'BN',
294153=>'BN',
295154=>'BN',
296155=>'BN',
297156=>'BN',
298157=>'BN',
299158=>'BN',
300159=>'BN',
301160=>'CS',
302161=>'ON',
303162=>'ET',
304163=>'ET',
305164=>'ET',
306165=>'ET',
307166=>'ON',
308167=>'ON',
309168=>'ON',
310169=>'ON',
311170=>'L',
312171=>'ON',
313172=>'ON',
314173=>'BN',
315174=>'ON',
316175=>'ON',
317176=>'ET',
318177=>'ET',
319178=>'EN',
320179=>'EN',
321180=>'ON',
322181=>'L',
323182=>'ON',
324183=>'ON',
325184=>'ON',
326185=>'EN',
327186=>'L',
328187=>'ON',
329188=>'ON',
330189=>'ON',
331190=>'ON',
332191=>'ON',
333192=>'L',
334193=>'L',
335194=>'L',
336195=>'L',
337196=>'L',
338197=>'L',
339198=>'L',
340199=>'L',
341200=>'L',
342201=>'L',
343202=>'L',
344203=>'L',
345204=>'L',
346205=>'L',
347206=>'L',
348207=>'L',
349208=>'L',
350209=>'L',
351210=>'L',
352211=>'L',
353212=>'L',
354213=>'L',
355214=>'L',
356215=>'ON',
357216=>'L',
358217=>'L',
359218=>'L',
360219=>'L',
361220=>'L',
362221=>'L',
363222=>'L',
364223=>'L',
365224=>'L',
366225=>'L',
367226=>'L',
368227=>'L',
369228=>'L',
370229=>'L',
371230=>'L',
372231=>'L',
373232=>'L',
374233=>'L',
375234=>'L',
376235=>'L',
377236=>'L',
378237=>'L',
379238=>'L',
380239=>'L',
381240=>'L',
382241=>'L',
383242=>'L',
384243=>'L',
385244=>'L',
386245=>'L',
387246=>'L',
388247=>'ON',
389248=>'L',
390249=>'L',
391250=>'L',
392251=>'L',
393252=>'L',
394253=>'L',
395254=>'L',
396255=>'L',
397256=>'L',
398257=>'L',
399258=>'L',
400259=>'L',
401260=>'L',
402261=>'L',
403262=>'L',
404263=>'L',
405264=>'L',
406265=>'L',
407266=>'L',
408267=>'L',
409268=>'L',
410269=>'L',
411270=>'L',
412271=>'L',
413272=>'L',
414273=>'L',
415274=>'L',
416275=>'L',
417276=>'L',
418277=>'L',
419278=>'L',
420279=>'L',
421280=>'L',
422281=>'L',
423282=>'L',
424283=>'L',
425284=>'L',
426285=>'L',
427286=>'L',
428287=>'L',
429288=>'L',
430289=>'L',
431290=>'L',
432291=>'L',
433292=>'L',
434293=>'L',
435294=>'L',
436295=>'L',
437296=>'L',
438297=>'L',
439298=>'L',
440299=>'L',
441300=>'L',
442301=>'L',
443302=>'L',
444303=>'L',
445304=>'L',
446305=>'L',
447306=>'L',
448307=>'L',
449308=>'L',
450309=>'L',
451310=>'L',
452311=>'L',
453312=>'L',
454313=>'L',
455314=>'L',
456315=>'L',
457316=>'L',
458317=>'L',
459318=>'L',
460319=>'L',
461320=>'L',
462321=>'L',
463322=>'L',
464323=>'L',
465324=>'L',
466325=>'L',
467326=>'L',
468327=>'L',
469328=>'L',
470329=>'L',
471330=>'L',
472331=>'L',
473332=>'L',
474333=>'L',
475334=>'L',
476335=>'L',
477336=>'L',
478337=>'L',
479338=>'L',
480339=>'L',
481340=>'L',
482341=>'L',
483342=>'L',
484343=>'L',
485344=>'L',
486345=>'L',
487346=>'L',
488347=>'L',
489348=>'L',
490349=>'L',
491350=>'L',
492351=>'L',
493352=>'L',
494353=>'L',
495354=>'L',
496355=>'L',
497356=>'L',
498357=>'L',
499358=>'L',
500359=>'L',
501360=>'L',
502361=>'L',
503362=>'L',
504363=>'L',
505364=>'L',
506365=>'L',
507366=>'L',
508367=>'L',
509368=>'L',
510369=>'L',
511370=>'L',
512371=>'L',
513372=>'L',
514373=>'L',
515374=>'L',
516375=>'L',
517376=>'L',
518377=>'L',
519378=>'L',
520379=>'L',
521380=>'L',
522381=>'L',
523382=>'L',
524383=>'L',
525384=>'L',
526385=>'L',
527386=>'L',
528387=>'L',
529388=>'L',
530389=>'L',
531390=>'L',
532391=>'L',
533392=>'L',
534393=>'L',
535394=>'L',
536395=>'L',
537396=>'L',
538397=>'L',
539398=>'L',
540399=>'L',
541400=>'L',
542401=>'L',
543402=>'L',
544403=>'L',
545404=>'L',
546405=>'L',
547406=>'L',
548407=>'L',
549408=>'L',
550409=>'L',
551410=>'L',
552411=>'L',
553412=>'L',
554413=>'L',
555414=>'L',
556415=>'L',
557416=>'L',
558417=>'L',
559418=>'L',
560419=>'L',
561420=>'L',
562421=>'L',
563422=>'L',
564423=>'L',
565424=>'L',
566425=>'L',
567426=>'L',
568427=>'L',
569428=>'L',
570429=>'L',
571430=>'L',
572431=>'L',
573432=>'L',
574433=>'L',
575434=>'L',
576435=>'L',
577436=>'L',
578437=>'L',
579438=>'L',
580439=>'L',
581440=>'L',
582441=>'L',
583442=>'L',
584443=>'L',
585444=>'L',
586445=>'L',
587446=>'L',
588447=>'L',
589448=>'L',
590449=>'L',
591450=>'L',
592451=>'L',
593452=>'L',
594453=>'L',
595454=>'L',
596455=>'L',
597456=>'L',
598457=>'L',
599458=>'L',
600459=>'L',
601460=>'L',
602461=>'L',
603462=>'L',
604463=>'L',
605464=>'L',
606465=>'L',
607466=>'L',
608467=>'L',
609468=>'L',
610469=>'L',
611470=>'L',
612471=>'L',
613472=>'L',
614473=>'L',
615474=>'L',
616475=>'L',
617476=>'L',
618477=>'L',
619478=>'L',
620479=>'L',
621480=>'L',
622481=>'L',
623482=>'L',
624483=>'L',
625484=>'L',
626485=>'L',
627486=>'L',
628487=>'L',
629488=>'L',
630489=>'L',
631490=>'L',
632491=>'L',
633492=>'L',
634493=>'L',
635494=>'L',
636495=>'L',
637496=>'L',
638497=>'L',
639498=>'L',
640499=>'L',
641500=>'L',
642501=>'L',
643502=>'L',
644503=>'L',
645504=>'L',
646505=>'L',
647506=>'L',
648507=>'L',
649508=>'L',
650509=>'L',
651510=>'L',
652511=>'L',
653512=>'L',
654513=>'L',
655514=>'L',
656515=>'L',
657516=>'L',
658517=>'L',
659518=>'L',
660519=>'L',
661520=>'L',
662521=>'L',
663522=>'L',
664523=>'L',
665524=>'L',
666525=>'L',
667526=>'L',
668527=>'L',
669528=>'L',
670529=>'L',
671530=>'L',
672531=>'L',
673532=>'L',
674533=>'L',
675534=>'L',
676535=>'L',
677536=>'L',
678537=>'L',
679538=>'L',
680539=>'L',
681540=>'L',
682541=>'L',
683542=>'L',
684543=>'L',
685544=>'L',
686545=>'L',
687546=>'L',
688547=>'L',
689548=>'L',
690549=>'L',
691550=>'L',
692551=>'L',
693552=>'L',
694553=>'L',
695554=>'L',
696555=>'L',
697556=>'L',
698557=>'L',
699558=>'L',
700559=>'L',
701560=>'L',
702561=>'L',
703562=>'L',
704563=>'L',
705564=>'L',
706565=>'L',
707566=>'L',
708567=>'L',
709568=>'L',
710569=>'L',
711570=>'L',
712571=>'L',
713572=>'L',
714573=>'L',
715574=>'L',
716575=>'L',
717576=>'L',
718577=>'L',
719578=>'L',
720579=>'L',
721580=>'L',
722581=>'L',
723582=>'L',
724583=>'L',
725584=>'L',
726585=>'L',
727586=>'L',
728587=>'L',
729588=>'L',
730589=>'L',
731590=>'L',
732591=>'L',
733592=>'L',
734593=>'L',
735594=>'L',
736595=>'L',
737596=>'L',
738597=>'L',
739598=>'L',
740599=>'L',
741600=>'L',
742601=>'L',
743602=>'L',
744603=>'L',
745604=>'L',
746605=>'L',
747606=>'L',
748607=>'L',
749608=>'L',
750609=>'L',
751610=>'L',
752611=>'L',
753612=>'L',
754613=>'L',
755614=>'L',
756615=>'L',
757616=>'L',
758617=>'L',
759618=>'L',
760619=>'L',
761620=>'L',
762621=>'L',
763622=>'L',
764623=>'L',
765624=>'L',
766625=>'L',
767626=>'L',
768627=>'L',
769628=>'L',
770629=>'L',
771630=>'L',
772631=>'L',
773632=>'L',
774633=>'L',
775634=>'L',
776635=>'L',
777636=>'L',
778637=>'L',
779638=>'L',
780639=>'L',
781640=>'L',
782641=>'L',
783642=>'L',
784643=>'L',
785644=>'L',
786645=>'L',
787646=>'L',
788647=>'L',
789648=>'L',
790649=>'L',
791650=>'L',
792651=>'L',
793652=>'L',
794653=>'L',
795654=>'L',
796655=>'L',
797656=>'L',
798657=>'L',
799658=>'L',
800659=>'L',
801660=>'L',
802661=>'L',
803662=>'L',
804663=>'L',
805664=>'L',
806665=>'L',
807666=>'L',
808667=>'L',
809668=>'L',
810669=>'L',
811670=>'L',
812671=>'L',
813672=>'L',
814673=>'L',
815674=>'L',
816675=>'L',
817676=>'L',
818677=>'L',
819678=>'L',
820679=>'L',
821680=>'L',
822681=>'L',
823682=>'L',
824683=>'L',
825684=>'L',
826685=>'L',
827686=>'L',
828687=>'L',
829688=>'L',
830689=>'L',
831690=>'L',
832691=>'L',
833692=>'L',
834693=>'L',
835694=>'L',
836695=>'L',
837696=>'L',
838697=>'ON',
839698=>'ON',
840699=>'L',
841700=>'L',
842701=>'L',
843702=>'L',
844703=>'L',
845704=>'L',
846705=>'L',
847706=>'ON',
848707=>'ON',
849708=>'ON',
850709=>'ON',
851710=>'ON',
852711=>'ON',
853712=>'ON',
854713=>'ON',
855714=>'ON',
856715=>'ON',
857716=>'ON',
858717=>'ON',
859718=>'ON',
860719=>'ON',
861720=>'L',
862721=>'L',
863722=>'ON',
864723=>'ON',
865724=>'ON',
866725=>'ON',
867726=>'ON',
868727=>'ON',
869728=>'ON',
870729=>'ON',
871730=>'ON',
872731=>'ON',
873732=>'ON',
874733=>'ON',
875734=>'ON',
876735=>'ON',
877736=>'L',
878737=>'L',
879738=>'L',
880739=>'L',
881740=>'L',
882741=>'ON',
883742=>'ON',
884743=>'ON',
885744=>'ON',
886745=>'ON',
887746=>'ON',
888747=>'ON',
889748=>'ON',
890749=>'ON',
891750=>'L',
892751=>'ON',
893752=>'ON',
894753=>'ON',
895754=>'ON',
896755=>'ON',
897756=>'ON',
898757=>'ON',
899758=>'ON',
900759=>'ON',
901760=>'ON',
902761=>'ON',
903762=>'ON',
904763=>'ON',
905764=>'ON',
906765=>'ON',
907766=>'ON',
908767=>'ON',
909768=>'NSM',
910769=>'NSM',
911770=>'NSM',
912771=>'NSM',
913772=>'NSM',
914773=>'NSM',
915774=>'NSM',
916775=>'NSM',
917776=>'NSM',
918777=>'NSM',
919778=>'NSM',
920779=>'NSM',
921780=>'NSM',
922781=>'NSM',
923782=>'NSM',
924783=>'NSM',
925784=>'NSM',
926785=>'NSM',
927786=>'NSM',
928787=>'NSM',
929788=>'NSM',
930789=>'NSM',
931790=>'NSM',
932791=>'NSM',
933792=>'NSM',
934793=>'NSM',
935794=>'NSM',
936795=>'NSM',
937796=>'NSM',
938797=>'NSM',
939798=>'NSM',
940799=>'NSM',
941800=>'NSM',
942801=>'NSM',
943802=>'NSM',
944803=>'NSM',
945804=>'NSM',
946805=>'NSM',
947806=>'NSM',
948807=>'NSM',
949808=>'NSM',
950809=>'NSM',
951810=>'NSM',
952811=>'NSM',
953812=>'NSM',
954813=>'NSM',
955814=>'NSM',
956815=>'NSM',
957816=>'NSM',
958817=>'NSM',
959818=>'NSM',
960819=>'NSM',
961820=>'NSM',
962821=>'NSM',
963822=>'NSM',
964823=>'NSM',
965824=>'NSM',
966825=>'NSM',
967826=>'NSM',
968827=>'NSM',
969828=>'NSM',
970829=>'NSM',
971830=>'NSM',
972831=>'NSM',
973832=>'NSM',
974833=>'NSM',
975834=>'NSM',
976835=>'NSM',
977836=>'NSM',
978837=>'NSM',
979838=>'NSM',
980839=>'NSM',
981840=>'NSM',
982841=>'NSM',
983842=>'NSM',
984843=>'NSM',
985844=>'NSM',
986845=>'NSM',
987846=>'NSM',
988847=>'NSM',
989848=>'NSM',
990849=>'NSM',
991850=>'NSM',
992851=>'NSM',
993852=>'NSM',
994853=>'NSM',
995854=>'NSM',
996855=>'NSM',
997856=>'NSM',
998857=>'NSM',
999858=>'NSM',
1000859=>'NSM',
1001860=>'NSM',
1002861=>'NSM',
1003862=>'NSM',
1004863=>'NSM',
1005864=>'NSM',
1006865=>'NSM',
1007866=>'NSM',
1008867=>'NSM',
1009868=>'NSM',
1010869=>'NSM',
1011870=>'NSM',
1012871=>'NSM',
1013872=>'NSM',
1014873=>'NSM',
1015874=>'NSM',
1016875=>'NSM',
1017876=>'NSM',
1018877=>'NSM',
1019878=>'NSM',
1020879=>'NSM',
1021884=>'ON',
1022885=>'ON',
1023890=>'L',
1024891=>'L',
1025892=>'L',
1026893=>'L',
1027894=>'ON',
1028900=>'ON',
1029901=>'ON',
1030902=>'L',
1031903=>'ON',
1032904=>'L',
1033905=>'L',
1034906=>'L',
1035908=>'L',
1036910=>'L',
1037911=>'L',
1038912=>'L',
1039913=>'L',
1040914=>'L',
1041915=>'L',
1042916=>'L',
1043917=>'L',
1044918=>'L',
1045919=>'L',
1046920=>'L',
1047921=>'L',
1048922=>'L',
1049923=>'L',
1050924=>'L',
1051925=>'L',
1052926=>'L',
1053927=>'L',
1054928=>'L',
1055929=>'L',
1056931=>'L',
1057932=>'L',
1058933=>'L',
1059934=>'L',
1060935=>'L',
1061936=>'L',
1062937=>'L',
1063938=>'L',
1064939=>'L',
1065940=>'L',
1066941=>'L',
1067942=>'L',
1068943=>'L',
1069944=>'L',
1070945=>'L',
1071946=>'L',
1072947=>'L',
1073948=>'L',
1074949=>'L',
1075950=>'L',
1076951=>'L',
1077952=>'L',
1078953=>'L',
1079954=>'L',
1080955=>'L',
1081956=>'L',
1082957=>'L',
1083958=>'L',
1084959=>'L',
1085960=>'L',
1086961=>'L',
1087962=>'L',
1088963=>'L',
1089964=>'L',
1090965=>'L',
1091966=>'L',
1092967=>'L',
1093968=>'L',
1094969=>'L',
1095970=>'L',
1096971=>'L',
1097972=>'L',
1098973=>'L',
1099974=>'L',
1100976=>'L',
1101977=>'L',
1102978=>'L',
1103979=>'L',
1104980=>'L',
1105981=>'L',
1106982=>'L',
1107983=>'L',
1108984=>'L',
1109985=>'L',
1110986=>'L',
1111987=>'L',
1112988=>'L',
1113989=>'L',
1114990=>'L',
1115991=>'L',
1116992=>'L',
1117993=>'L',
1118994=>'L',
1119995=>'L',
1120996=>'L',
1121997=>'L',
1122998=>'L',
1123999=>'L',
11241000=>'L',
11251001=>'L',
11261002=>'L',
11271003=>'L',
11281004=>'L',
11291005=>'L',
11301006=>'L',
11311007=>'L',
11321008=>'L',
11331009=>'L',
11341010=>'L',
11351011=>'L',
11361012=>'L',
11371013=>'L',
11381014=>'ON',
11391015=>'L',
11401016=>'L',
11411017=>'L',
11421018=>'L',
11431019=>'L',
11441020=>'L',
11451021=>'L',
11461022=>'L',
11471023=>'L',
11481024=>'L',
11491025=>'L',
11501026=>'L',
11511027=>'L',
11521028=>'L',
11531029=>'L',
11541030=>'L',
11551031=>'L',
11561032=>'L',
11571033=>'L',
11581034=>'L',
11591035=>'L',
11601036=>'L',
11611037=>'L',
11621038=>'L',
11631039=>'L',
11641040=>'L',
11651041=>'L',
11661042=>'L',
11671043=>'L',
11681044=>'L',
11691045=>'L',
11701046=>'L',
11711047=>'L',
11721048=>'L',
11731049=>'L',
11741050=>'L',
11751051=>'L',
11761052=>'L',
11771053=>'L',
11781054=>'L',
11791055=>'L',
11801056=>'L',
11811057=>'L',
11821058=>'L',
11831059=>'L',
11841060=>'L',
11851061=>'L',
11861062=>'L',
11871063=>'L',
11881064=>'L',
11891065=>'L',
11901066=>'L',
11911067=>'L',
11921068=>'L',
11931069=>'L',
11941070=>'L',
11951071=>'L',
11961072=>'L',
11971073=>'L',
11981074=>'L',
11991075=>'L',
12001076=>'L',
12011077=>'L',
12021078=>'L',
12031079=>'L',
12041080=>'L',
12051081=>'L',
12061082=>'L',
12071083=>'L',
12081084=>'L',
12091085=>'L',
12101086=>'L',
12111087=>'L',
12121088=>'L',
12131089=>'L',
12141090=>'L',
12151091=>'L',
12161092=>'L',
12171093=>'L',
12181094=>'L',
12191095=>'L',
12201096=>'L',
12211097=>'L',
12221098=>'L',
12231099=>'L',
12241100=>'L',
12251101=>'L',
12261102=>'L',
12271103=>'L',
12281104=>'L',
12291105=>'L',
12301106=>'L',
12311107=>'L',
12321108=>'L',
12331109=>'L',
12341110=>'L',
12351111=>'L',
12361112=>'L',
12371113=>'L',
12381114=>'L',
12391115=>'L',
12401116=>'L',
12411117=>'L',
12421118=>'L',
12431119=>'L',
12441120=>'L',
12451121=>'L',
12461122=>'L',
12471123=>'L',
12481124=>'L',
12491125=>'L',
12501126=>'L',
12511127=>'L',
12521128=>'L',
12531129=>'L',
12541130=>'L',
12551131=>'L',
12561132=>'L',
12571133=>'L',
12581134=>'L',
12591135=>'L',
12601136=>'L',
12611137=>'L',
12621138=>'L',
12631139=>'L',
12641140=>'L',
12651141=>'L',
12661142=>'L',
12671143=>'L',
12681144=>'L',
12691145=>'L',
12701146=>'L',
12711147=>'L',
12721148=>'L',
12731149=>'L',
12741150=>'L',
12751151=>'L',
12761152=>'L',
12771153=>'L',
12781154=>'L',
12791155=>'NSM',
12801156=>'NSM',
12811157=>'NSM',
12821158=>'NSM',
12831160=>'NSM',
12841161=>'NSM',
12851162=>'L',
12861163=>'L',
12871164=>'L',
12881165=>'L',
12891166=>'L',
12901167=>'L',
12911168=>'L',
12921169=>'L',
12931170=>'L',
12941171=>'L',
12951172=>'L',
12961173=>'L',
12971174=>'L',
12981175=>'L',
12991176=>'L',
13001177=>'L',
13011178=>'L',
13021179=>'L',
13031180=>'L',
13041181=>'L',
13051182=>'L',
13061183=>'L',
13071184=>'L',
13081185=>'L',
13091186=>'L',
13101187=>'L',
13111188=>'L',
13121189=>'L',
13131190=>'L',
13141191=>'L',
13151192=>'L',
13161193=>'L',
13171194=>'L',
13181195=>'L',
13191196=>'L',
13201197=>'L',
13211198=>'L',
13221199=>'L',
13231200=>'L',
13241201=>'L',
13251202=>'L',
13261203=>'L',
13271204=>'L',
13281205=>'L',
13291206=>'L',
13301207=>'L',
13311208=>'L',
13321209=>'L',
13331210=>'L',
13341211=>'L',
13351212=>'L',
13361213=>'L',
13371214=>'L',
13381215=>'L',
13391216=>'L',
13401217=>'L',
13411218=>'L',
13421219=>'L',
13431220=>'L',
13441221=>'L',
13451222=>'L',
13461223=>'L',
13471224=>'L',
13481225=>'L',
13491226=>'L',
13501227=>'L',
13511228=>'L',
13521229=>'L',
13531230=>'L',
13541231=>'L',
13551232=>'L',
13561233=>'L',
13571234=>'L',
13581235=>'L',
13591236=>'L',
13601237=>'L',
13611238=>'L',
13621239=>'L',
13631240=>'L',
13641241=>'L',
13651242=>'L',
13661243=>'L',
13671244=>'L',
13681245=>'L',
13691246=>'L',
13701247=>'L',
13711248=>'L',
13721249=>'L',
13731250=>'L',
13741251=>'L',
13751252=>'L',
13761253=>'L',
13771254=>'L',
13781255=>'L',
13791256=>'L',
13801257=>'L',
13811258=>'L',
13821259=>'L',
13831260=>'L',
13841261=>'L',
13851262=>'L',
13861263=>'L',
13871264=>'L',
13881265=>'L',
13891266=>'L',
13901267=>'L',
13911268=>'L',
13921269=>'L',
13931270=>'L',
13941271=>'L',
13951272=>'L',
13961273=>'L',
13971274=>'L',
13981275=>'L',
13991276=>'L',
14001277=>'L',
14011278=>'L',
14021279=>'L',
14031280=>'L',
14041281=>'L',
14051282=>'L',
14061283=>'L',
14071284=>'L',
14081285=>'L',
14091286=>'L',
14101287=>'L',
14111288=>'L',
14121289=>'L',
14131290=>'L',
14141291=>'L',
14151292=>'L',
14161293=>'L',
14171294=>'L',
14181295=>'L',
14191296=>'L',
14201297=>'L',
14211298=>'L',
14221299=>'L',
14231329=>'L',
14241330=>'L',
14251331=>'L',
14261332=>'L',
14271333=>'L',
14281334=>'L',
14291335=>'L',
14301336=>'L',
14311337=>'L',
14321338=>'L',
14331339=>'L',
14341340=>'L',
14351341=>'L',
14361342=>'L',
14371343=>'L',
14381344=>'L',
14391345=>'L',
14401346=>'L',
14411347=>'L',
14421348=>'L',
14431349=>'L',
14441350=>'L',
14451351=>'L',
14461352=>'L',
14471353=>'L',
14481354=>'L',
14491355=>'L',
14501356=>'L',
14511357=>'L',
14521358=>'L',
14531359=>'L',
14541360=>'L',
14551361=>'L',
14561362=>'L',
14571363=>'L',
14581364=>'L',
14591365=>'L',
14601366=>'L',
14611369=>'L',
14621370=>'L',
14631371=>'L',
14641372=>'L',
14651373=>'L',
14661374=>'L',
14671375=>'L',
14681377=>'L',
14691378=>'L',
14701379=>'L',
14711380=>'L',
14721381=>'L',
14731382=>'L',
14741383=>'L',
14751384=>'L',
14761385=>'L',
14771386=>'L',
14781387=>'L',
14791388=>'L',
14801389=>'L',
14811390=>'L',
14821391=>'L',
14831392=>'L',
14841393=>'L',
14851394=>'L',
14861395=>'L',
14871396=>'L',
14881397=>'L',
14891398=>'L',
14901399=>'L',
14911400=>'L',
14921401=>'L',
14931402=>'L',
14941403=>'L',
14951404=>'L',
14961405=>'L',
14971406=>'L',
14981407=>'L',
14991408=>'L',
15001409=>'L',
15011410=>'L',
15021411=>'L',
15031412=>'L',
15041413=>'L',
15051414=>'L',
15061415=>'L',
15071417=>'L',
15081418=>'ON',
15091425=>'NSM',
15101426=>'NSM',
15111427=>'NSM',
15121428=>'NSM',
15131429=>'NSM',
15141430=>'NSM',
15151431=>'NSM',
15161432=>'NSM',
15171433=>'NSM',
15181434=>'NSM',
15191435=>'NSM',
15201436=>'NSM',
15211437=>'NSM',
15221438=>'NSM',
15231439=>'NSM',
15241440=>'NSM',
15251441=>'NSM',
15261442=>'NSM',
15271443=>'NSM',
15281444=>'NSM',
15291445=>'NSM',
15301446=>'NSM',
15311447=>'NSM',
15321448=>'NSM',
15331449=>'NSM',
15341450=>'NSM',
15351451=>'NSM',
15361452=>'NSM',
15371453=>'NSM',
15381454=>'NSM',
15391455=>'NSM',
15401456=>'NSM',
15411457=>'NSM',
15421458=>'NSM',
15431459=>'NSM',
15441460=>'NSM',
15451461=>'NSM',
15461462=>'NSM',
15471463=>'NSM',
15481464=>'NSM',
15491465=>'NSM',
15501466=>'NSM',
15511467=>'NSM',
15521468=>'NSM',
15531469=>'NSM',
15541470=>'R',
15551471=>'NSM',
15561472=>'R',
15571473=>'NSM',
15581474=>'NSM',
15591475=>'R',
15601476=>'NSM',
15611477=>'NSM',
15621478=>'R',
15631479=>'NSM',
15641488=>'R',
15651489=>'R',
15661490=>'R',
15671491=>'R',
15681492=>'R',
15691493=>'R',
15701494=>'R',
15711495=>'R',
15721496=>'R',
15731497=>'R',
15741498=>'R',
15751499=>'R',
15761500=>'R',
15771501=>'R',
15781502=>'R',
15791503=>'R',
15801504=>'R',
15811505=>'R',
15821506=>'R',
15831507=>'R',
15841508=>'R',
15851509=>'R',
15861510=>'R',
15871511=>'R',
15881512=>'R',
15891513=>'R',
15901514=>'R',
15911520=>'R',
15921521=>'R',
15931522=>'R',
15941523=>'R',
15951524=>'R',
15961536=>'AL',
15971537=>'AL',
15981538=>'AL',
15991539=>'AL',
16001547=>'AL',
16011548=>'CS',
16021549=>'AL',
16031550=>'ON',
16041551=>'ON',
16051552=>'NSM',
16061553=>'NSM',
16071554=>'NSM',
16081555=>'NSM',
16091556=>'NSM',
16101557=>'NSM',
16111563=>'AL',
16121566=>'AL',
16131567=>'AL',
16141569=>'AL',
16151570=>'AL',
16161571=>'AL',
16171572=>'AL',
16181573=>'AL',
16191574=>'AL',
16201575=>'AL',
16211576=>'AL',
16221577=>'AL',
16231578=>'AL',
16241579=>'AL',
16251580=>'AL',
16261581=>'AL',
16271582=>'AL',
16281583=>'AL',
16291584=>'AL',
16301585=>'AL',
16311586=>'AL',
16321587=>'AL',
16331588=>'AL',
16341589=>'AL',
16351590=>'AL',
16361591=>'AL',
16371592=>'AL',
16381593=>'AL',
16391594=>'AL',
16401600=>'AL',
16411601=>'AL',
16421602=>'AL',
16431603=>'AL',
16441604=>'AL',
16451605=>'AL',
16461606=>'AL',
16471607=>'AL',
16481608=>'AL',
16491609=>'AL',
16501610=>'AL',
16511611=>'NSM',
16521612=>'NSM',
16531613=>'NSM',
16541614=>'NSM',
16551615=>'NSM',
16561616=>'NSM',
16571617=>'NSM',
16581618=>'NSM',
16591619=>'NSM',
16601620=>'NSM',
16611621=>'NSM',
16621622=>'NSM',
16631623=>'NSM',
16641624=>'NSM',
16651625=>'NSM',
16661626=>'NSM',
16671627=>'NSM',
16681628=>'NSM',
16691629=>'NSM',
16701630=>'NSM',
16711632=>'AN',
16721633=>'AN',
16731634=>'AN',
16741635=>'AN',
16751636=>'AN',
16761637=>'AN',
16771638=>'AN',
16781639=>'AN',
16791640=>'AN',
16801641=>'AN',
16811642=>'ET',
16821643=>'AN',
16831644=>'AN',
16841645=>'AL',
16851646=>'AL',
16861647=>'AL',
16871648=>'NSM',
16881649=>'AL',
16891650=>'AL',
16901651=>'AL',
16911652=>'AL',
16921653=>'AL',
16931654=>'AL',
16941655=>'AL',
16951656=>'AL',
16961657=>'AL',
16971658=>'AL',
16981659=>'AL',
16991660=>'AL',
17001661=>'AL',
17011662=>'AL',
17021663=>'AL',
17031664=>'AL',
17041665=>'AL',
17051666=>'AL',
17061667=>'AL',
17071668=>'AL',
17081669=>'AL',
17091670=>'AL',
17101671=>'AL',
17111672=>'AL',
17121673=>'AL',
17131674=>'AL',
17141675=>'AL',
17151676=>'AL',
17161677=>'AL',
17171678=>'AL',
17181679=>'AL',
17191680=>'AL',
17201681=>'AL',
17211682=>'AL',
17221683=>'AL',
17231684=>'AL',
17241685=>'AL',
17251686=>'AL',
17261687=>'AL',
17271688=>'AL',
17281689=>'AL',
17291690=>'AL',
17301691=>'AL',
17311692=>'AL',
17321693=>'AL',
17331694=>'AL',
17341695=>'AL',
17351696=>'AL',
17361697=>'AL',
17371698=>'AL',
17381699=>'AL',
17391700=>'AL',
17401701=>'AL',
17411702=>'AL',
17421703=>'AL',
17431704=>'AL',
17441705=>'AL',
17451706=>'AL',
17461707=>'AL',
17471708=>'AL',
17481709=>'AL',
17491710=>'AL',
17501711=>'AL',
17511712=>'AL',
17521713=>'AL',
17531714=>'AL',
17541715=>'AL',
17551716=>'AL',
17561717=>'AL',
17571718=>'AL',
17581719=>'AL',
17591720=>'AL',
17601721=>'AL',
17611722=>'AL',
17621723=>'AL',
17631724=>'AL',
17641725=>'AL',
17651726=>'AL',
17661727=>'AL',
17671728=>'AL',
17681729=>'AL',
17691730=>'AL',
17701731=>'AL',
17711732=>'AL',
17721733=>'AL',
17731734=>'AL',
17741735=>'AL',
17751736=>'AL',
17761737=>'AL',
17771738=>'AL',
17781739=>'AL',
17791740=>'AL',
17801741=>'AL',
17811742=>'AL',
17821743=>'AL',
17831744=>'AL',
17841745=>'AL',
17851746=>'AL',
17861747=>'AL',
17871748=>'AL',
17881749=>'AL',
17891750=>'NSM',
17901751=>'NSM',
17911752=>'NSM',
17921753=>'NSM',
17931754=>'NSM',
17941755=>'NSM',
17951756=>'NSM',
17961757=>'AL',
17971758=>'NSM',
17981759=>'NSM',
17991760=>'NSM',
18001761=>'NSM',
18011762=>'NSM',
18021763=>'NSM',
18031764=>'NSM',
18041765=>'AL',
18051766=>'AL',
18061767=>'NSM',
18071768=>'NSM',
18081769=>'ON',
18091770=>'NSM',
18101771=>'NSM',
18111772=>'NSM',
18121773=>'NSM',
18131774=>'AL',
18141775=>'AL',
18151776=>'EN',
18161777=>'EN',
18171778=>'EN',
18181779=>'EN',
18191780=>'EN',
18201781=>'EN',
18211782=>'EN',
18221783=>'EN',
18231784=>'EN',
18241785=>'EN',
18251786=>'AL',
18261787=>'AL',
18271788=>'AL',
18281789=>'AL',
18291790=>'AL',
18301791=>'AL',
18311792=>'AL',
18321793=>'AL',
18331794=>'AL',
18341795=>'AL',
18351796=>'AL',
18361797=>'AL',
18371798=>'AL',
18381799=>'AL',
18391800=>'AL',
18401801=>'AL',
18411802=>'AL',
18421803=>'AL',
18431804=>'AL',
18441805=>'AL',
18451807=>'BN',
18461808=>'AL',
18471809=>'NSM',
18481810=>'AL',
18491811=>'AL',
18501812=>'AL',
18511813=>'AL',
18521814=>'AL',
18531815=>'AL',
18541816=>'AL',
18551817=>'AL',
18561818=>'AL',
18571819=>'AL',
18581820=>'AL',
18591821=>'AL',
18601822=>'AL',
18611823=>'AL',
18621824=>'AL',
18631825=>'AL',
18641826=>'AL',
18651827=>'AL',
18661828=>'AL',
18671829=>'AL',
18681830=>'AL',
18691831=>'AL',
18701832=>'AL',
18711833=>'AL',
18721834=>'AL',
18731835=>'AL',
18741836=>'AL',
18751837=>'AL',
18761838=>'AL',
18771839=>'AL',
18781840=>'NSM',
18791841=>'NSM',
18801842=>'NSM',
18811843=>'NSM',
18821844=>'NSM',
18831845=>'NSM',
18841846=>'NSM',
18851847=>'NSM',
18861848=>'NSM',
18871849=>'NSM',
18881850=>'NSM',
18891851=>'NSM',
18901852=>'NSM',
18911853=>'NSM',
18921854=>'NSM',
18931855=>'NSM',
18941856=>'NSM',
18951857=>'NSM',
18961858=>'NSM',
18971859=>'NSM',
18981860=>'NSM',
18991861=>'NSM',
19001862=>'NSM',
19011863=>'NSM',
19021864=>'NSM',
19031865=>'NSM',
19041866=>'NSM',
19051869=>'AL',
19061870=>'AL',
19071871=>'AL',
19081872=>'AL',
19091873=>'AL',
19101874=>'AL',
19111875=>'AL',
19121876=>'AL',
19131877=>'AL',
19141878=>'AL',
19151879=>'AL',
19161880=>'AL',
19171881=>'AL',
19181882=>'AL',
19191883=>'AL',
19201884=>'AL',
19211885=>'AL',
19221886=>'AL',
19231887=>'AL',
19241888=>'AL',
19251889=>'AL',
19261890=>'AL',
19271891=>'AL',
19281892=>'AL',
19291893=>'AL',
19301894=>'AL',
19311895=>'AL',
19321896=>'AL',
19331897=>'AL',
19341898=>'AL',
19351899=>'AL',
19361900=>'AL',
19371901=>'AL',
19381920=>'AL',
19391921=>'AL',
19401922=>'AL',
19411923=>'AL',
19421924=>'AL',
19431925=>'AL',
19441926=>'AL',
19451927=>'AL',
19461928=>'AL',
19471929=>'AL',
19481930=>'AL',
19491931=>'AL',
19501932=>'AL',
19511933=>'AL',
19521934=>'AL',
19531935=>'AL',
19541936=>'AL',
19551937=>'AL',
19561938=>'AL',
19571939=>'AL',
19581940=>'AL',
19591941=>'AL',
19601942=>'AL',
19611943=>'AL',
19621944=>'AL',
19631945=>'AL',
19641946=>'AL',
19651947=>'AL',
19661948=>'AL',
19671949=>'AL',
19681950=>'AL',
19691951=>'AL',
19701952=>'AL',
19711953=>'AL',
19721954=>'AL',
19731955=>'AL',
19741956=>'AL',
19751957=>'AL',
19761958=>'NSM',
19771959=>'NSM',
19781960=>'NSM',
19791961=>'NSM',
19801962=>'NSM',
19811963=>'NSM',
19821964=>'NSM',
19831965=>'NSM',
19841966=>'NSM',
19851967=>'NSM',
19861968=>'NSM',
19871969=>'AL',
19881984=>'R',
19891985=>'R',
19901986=>'R',
19911987=>'R',
19921988=>'R',
19931989=>'R',
19941990=>'R',
19951991=>'R',
19961992=>'R',
19971993=>'R',
19981994=>'R',
19991995=>'R',
20001996=>'R',
20011997=>'R',
20021998=>'R',
20031999=>'R',
20042000=>'R',
20052001=>'R',
20062002=>'R',
20072003=>'R',
20082004=>'R',
20092005=>'R',
20102006=>'R',
20112007=>'R',
20122008=>'R',
20132009=>'R',
20142010=>'R',
20152011=>'R',
20162012=>'R',
20172013=>'R',
20182014=>'R',
20192015=>'R',
20202016=>'R',
20212017=>'R',
20222018=>'R',
20232019=>'R',
20242020=>'R',
20252021=>'R',
20262022=>'R',
20272023=>'R',
20282024=>'R',
20292025=>'R',
20302026=>'R',
20312027=>'NSM',
20322028=>'NSM',
20332029=>'NSM',
20342030=>'NSM',
20352031=>'NSM',
20362032=>'NSM',
20372033=>'NSM',
20382034=>'NSM',
20392035=>'NSM',
20402036=>'R',
20412037=>'R',
20422038=>'ON',
20432039=>'ON',
20442040=>'ON',
20452041=>'ON',
20462042=>'R',
20472305=>'NSM',
20482306=>'NSM',
20492307=>'L',
20502308=>'L',
20512309=>'L',
20522310=>'L',
20532311=>'L',
20542312=>'L',
20552313=>'L',
20562314=>'L',
20572315=>'L',
20582316=>'L',
20592317=>'L',
20602318=>'L',
20612319=>'L',
20622320=>'L',
20632321=>'L',
20642322=>'L',
20652323=>'L',
20662324=>'L',
20672325=>'L',
20682326=>'L',
20692327=>'L',
20702328=>'L',
20712329=>'L',
20722330=>'L',
20732331=>'L',
20742332=>'L',
20752333=>'L',
20762334=>'L',
20772335=>'L',
20782336=>'L',
20792337=>'L',
20802338=>'L',
20812339=>'L',
20822340=>'L',
20832341=>'L',
20842342=>'L',
20852343=>'L',
20862344=>'L',
20872345=>'L',
20882346=>'L',
20892347=>'L',
20902348=>'L',
20912349=>'L',
20922350=>'L',
20932351=>'L',
20942352=>'L',
20952353=>'L',
20962354=>'L',
20972355=>'L',
20982356=>'L',
20992357=>'L',
21002358=>'L',
21012359=>'L',
21022360=>'L',
21032361=>'L',
21042364=>'NSM',
21052365=>'L',
21062366=>'L',
21072367=>'L',
21082368=>'L',
21092369=>'NSM',
21102370=>'NSM',
21112371=>'NSM',
21122372=>'NSM',
21132373=>'NSM',
21142374=>'NSM',
21152375=>'NSM',
21162376=>'NSM',
21172377=>'L',
21182378=>'L',
21192379=>'L',
21202380=>'L',
21212381=>'NSM',
21222384=>'L',
21232385=>'NSM',
21242386=>'NSM',
21252387=>'NSM',
21262388=>'NSM',
21272392=>'L',
21282393=>'L',
21292394=>'L',
21302395=>'L',
21312396=>'L',
21322397=>'L',
21332398=>'L',
21342399=>'L',
21352400=>'L',
21362401=>'L',
21372402=>'NSM',
21382403=>'NSM',
21392404=>'L',
21402405=>'L',
21412406=>'L',
21422407=>'L',
21432408=>'L',
21442409=>'L',
21452410=>'L',
21462411=>'L',
21472412=>'L',
21482413=>'L',
21492414=>'L',
21502415=>'L',
21512416=>'L',
21522427=>'L',
21532428=>'L',
21542429=>'L',
21552430=>'L',
21562431=>'L',
21572433=>'NSM',
21582434=>'L',
21592435=>'L',
21602437=>'L',
21612438=>'L',
21622439=>'L',
21632440=>'L',
21642441=>'L',
21652442=>'L',
21662443=>'L',
21672444=>'L',
21682447=>'L',
21692448=>'L',
21702451=>'L',
21712452=>'L',
21722453=>'L',
21732454=>'L',
21742455=>'L',
21752456=>'L',
21762457=>'L',
21772458=>'L',
21782459=>'L',
21792460=>'L',
21802461=>'L',
21812462=>'L',
21822463=>'L',
21832464=>'L',
21842465=>'L',
21852466=>'L',
21862467=>'L',
21872468=>'L',
21882469=>'L',
21892470=>'L',
21902471=>'L',
21912472=>'L',
21922474=>'L',
21932475=>'L',
21942476=>'L',
21952477=>'L',
21962478=>'L',
21972479=>'L',
21982480=>'L',
21992482=>'L',
22002486=>'L',
22012487=>'L',
22022488=>'L',
22032489=>'L',
22042492=>'NSM',
22052493=>'L',
22062494=>'L',
22072495=>'L',
22082496=>'L',
22092497=>'NSM',
22102498=>'NSM',
22112499=>'NSM',
22122500=>'NSM',
22132503=>'L',
22142504=>'L',
22152507=>'L',
22162508=>'L',
22172509=>'NSM',
22182510=>'L',
22192519=>'L',
22202524=>'L',
22212525=>'L',
22222527=>'L',
22232528=>'L',
22242529=>'L',
22252530=>'NSM',
22262531=>'NSM',
22272534=>'L',
22282535=>'L',
22292536=>'L',
22302537=>'L',
22312538=>'L',
22322539=>'L',
22332540=>'L',
22342541=>'L',
22352542=>'L',
22362543=>'L',
22372544=>'L',
22382545=>'L',
22392546=>'ET',
22402547=>'ET',
22412548=>'L',
22422549=>'L',
22432550=>'L',
22442551=>'L',
22452552=>'L',
22462553=>'L',
22472554=>'L',
22482561=>'NSM',
22492562=>'NSM',
22502563=>'L',
22512565=>'L',
22522566=>'L',
22532567=>'L',
22542568=>'L',
22552569=>'L',
22562570=>'L',
22572575=>'L',
22582576=>'L',
22592579=>'L',
22602580=>'L',
22612581=>'L',
22622582=>'L',
22632583=>'L',
22642584=>'L',
22652585=>'L',
22662586=>'L',
22672587=>'L',
22682588=>'L',
22692589=>'L',
22702590=>'L',
22712591=>'L',
22722592=>'L',
22732593=>'L',
22742594=>'L',
22752595=>'L',
22762596=>'L',
22772597=>'L',
22782598=>'L',
22792599=>'L',
22802600=>'L',
22812602=>'L',
22822603=>'L',
22832604=>'L',
22842605=>'L',
22852606=>'L',
22862607=>'L',
22872608=>'L',
22882610=>'L',
22892611=>'L',
22902613=>'L',
22912614=>'L',
22922616=>'L',
22932617=>'L',
22942620=>'NSM',
22952622=>'L',
22962623=>'L',
22972624=>'L',
22982625=>'NSM',
22992626=>'NSM',
23002631=>'NSM',
23012632=>'NSM',
23022635=>'NSM',
23032636=>'NSM',
23042637=>'NSM',
23052649=>'L',
23062650=>'L',
23072651=>'L',
23082652=>'L',
23092654=>'L',
23102662=>'L',
23112663=>'L',
23122664=>'L',
23132665=>'L',
23142666=>'L',
23152667=>'L',
23162668=>'L',
23172669=>'L',
23182670=>'L',
23192671=>'L',
23202672=>'NSM',
23212673=>'NSM',
23222674=>'L',
23232675=>'L',
23242676=>'L',
23252689=>'NSM',
23262690=>'NSM',
23272691=>'L',
23282693=>'L',
23292694=>'L',
23302695=>'L',
23312696=>'L',
23322697=>'L',
23332698=>'L',
23342699=>'L',
23352700=>'L',
23362701=>'L',
23372703=>'L',
23382704=>'L',
23392705=>'L',
23402707=>'L',
23412708=>'L',
23422709=>'L',
23432710=>'L',
23442711=>'L',
23452712=>'L',
23462713=>'L',
23472714=>'L',
23482715=>'L',
23492716=>'L',
23502717=>'L',
23512718=>'L',
23522719=>'L',
23532720=>'L',
23542721=>'L',
23552722=>'L',
23562723=>'L',
23572724=>'L',
23582725=>'L',
23592726=>'L',
23602727=>'L',
23612728=>'L',
23622730=>'L',
23632731=>'L',
23642732=>'L',
23652733=>'L',
23662734=>'L',
23672735=>'L',
23682736=>'L',
23692738=>'L',
23702739=>'L',
23712741=>'L',
23722742=>'L',
23732743=>'L',
23742744=>'L',
23752745=>'L',
23762748=>'NSM',
23772749=>'L',
23782750=>'L',
23792751=>'L',
23802752=>'L',
23812753=>'NSM',
23822754=>'NSM',
23832755=>'NSM',
23842756=>'NSM',
23852757=>'NSM',
23862759=>'NSM',
23872760=>'NSM',
23882761=>'L',
23892763=>'L',
23902764=>'L',
23912765=>'NSM',
23922768=>'L',
23932784=>'L',
23942785=>'L',
23952786=>'NSM',
23962787=>'NSM',
23972790=>'L',
23982791=>'L',
23992792=>'L',
24002793=>'L',
24012794=>'L',
24022795=>'L',
24032796=>'L',
24042797=>'L',
24052798=>'L',
24062799=>'L',
24072801=>'ET',
24082817=>'NSM',
24092818=>'L',
24102819=>'L',
24112821=>'L',
24122822=>'L',
24132823=>'L',
24142824=>'L',
24152825=>'L',
24162826=>'L',
24172827=>'L',
24182828=>'L',
24192831=>'L',
24202832=>'L',
24212835=>'L',
24222836=>'L',
24232837=>'L',
24242838=>'L',
24252839=>'L',
24262840=>'L',
24272841=>'L',
24282842=>'L',
24292843=>'L',
24302844=>'L',
24312845=>'L',
24322846=>'L',
24332847=>'L',
24342848=>'L',
24352849=>'L',
24362850=>'L',
24372851=>'L',
24382852=>'L',
24392853=>'L',
24402854=>'L',
24412855=>'L',
24422856=>'L',
24432858=>'L',
24442859=>'L',
24452860=>'L',
24462861=>'L',
24472862=>'L',
24482863=>'L',
24492864=>'L',
24502866=>'L',
24512867=>'L',
24522869=>'L',
24532870=>'L',
24542871=>'L',
24552872=>'L',
24562873=>'L',
24572876=>'NSM',
24582877=>'L',
24592878=>'L',
24602879=>'NSM',
24612880=>'L',
24622881=>'NSM',
24632882=>'NSM',
24642883=>'NSM',
24652887=>'L',
24662888=>'L',
24672891=>'L',
24682892=>'L',
24692893=>'NSM',
24702902=>'NSM',
24712903=>'L',
24722908=>'L',
24732909=>'L',
24742911=>'L',
24752912=>'L',
24762913=>'L',
24772918=>'L',
24782919=>'L',
24792920=>'L',
24802921=>'L',
24812922=>'L',
24822923=>'L',
24832924=>'L',
24842925=>'L',
24852926=>'L',
24862927=>'L',
24872928=>'L',
24882929=>'L',
24892946=>'NSM',
24902947=>'L',
24912949=>'L',
24922950=>'L',
24932951=>'L',
24942952=>'L',
24952953=>'L',
24962954=>'L',
24972958=>'L',
24982959=>'L',
24992960=>'L',
25002962=>'L',
25012963=>'L',
25022964=>'L',
25032965=>'L',
25042969=>'L',
25052970=>'L',
25062972=>'L',
25072974=>'L',
25082975=>'L',
25092979=>'L',
25102980=>'L',
25112984=>'L',
25122985=>'L',
25132986=>'L',
25142990=>'L',
25152991=>'L',
25162992=>'L',
25172993=>'L',
25182994=>'L',
25192995=>'L',
25202996=>'L',
25212997=>'L',
25222998=>'L',
25232999=>'L',
25243000=>'L',
25253001=>'L',
25263006=>'L',
25273007=>'L',
25283008=>'NSM',
25293009=>'L',
25303010=>'L',
25313014=>'L',
25323015=>'L',
25333016=>'L',
25343018=>'L',
25353019=>'L',
25363020=>'L',
25373021=>'NSM',
25383031=>'L',
25393046=>'L',
25403047=>'L',
25413048=>'L',
25423049=>'L',
25433050=>'L',
25443051=>'L',
25453052=>'L',
25463053=>'L',
25473054=>'L',
25483055=>'L',
25493056=>'L',
25503057=>'L',
25513058=>'L',
25523059=>'ON',
25533060=>'ON',
25543061=>'ON',
25553062=>'ON',
25563063=>'ON',
25573064=>'ON',
25583065=>'ET',
25593066=>'ON',
25603073=>'L',
25613074=>'L',
25623075=>'L',
25633077=>'L',
25643078=>'L',
25653079=>'L',
25663080=>'L',
25673081=>'L',
25683082=>'L',
25693083=>'L',
25703084=>'L',
25713086=>'L',
25723087=>'L',
25733088=>'L',
25743090=>'L',
25753091=>'L',
25763092=>'L',
25773093=>'L',
25783094=>'L',
25793095=>'L',
25803096=>'L',
25813097=>'L',
25823098=>'L',
25833099=>'L',
25843100=>'L',
25853101=>'L',
25863102=>'L',
25873103=>'L',
25883104=>'L',
25893105=>'L',
25903106=>'L',
25913107=>'L',
25923108=>'L',
25933109=>'L',
25943110=>'L',
25953111=>'L',
25963112=>'L',
25973114=>'L',
25983115=>'L',
25993116=>'L',
26003117=>'L',
26013118=>'L',
26023119=>'L',
26033120=>'L',
26043121=>'L',
26053122=>'L',
26063123=>'L',
26073125=>'L',
26083126=>'L',
26093127=>'L',
26103128=>'L',
26113129=>'L',
26123134=>'NSM',
26133135=>'NSM',
26143136=>'NSM',
26153137=>'L',
26163138=>'L',
26173139=>'L',
26183140=>'L',
26193142=>'NSM',
26203143=>'NSM',
26213144=>'NSM',
26223146=>'NSM',
26233147=>'NSM',
26243148=>'NSM',
26253149=>'NSM',
26263157=>'NSM',
26273158=>'NSM',
26283168=>'L',
26293169=>'L',
26303174=>'L',
26313175=>'L',
26323176=>'L',
26333177=>'L',
26343178=>'L',
26353179=>'L',
26363180=>'L',
26373181=>'L',
26383182=>'L',
26393183=>'L',
26403202=>'L',
26413203=>'L',
26423205=>'L',
26433206=>'L',
26443207=>'L',
26453208=>'L',
26463209=>'L',
26473210=>'L',
26483211=>'L',
26493212=>'L',
26503214=>'L',
26513215=>'L',
26523216=>'L',
26533218=>'L',
26543219=>'L',
26553220=>'L',
26563221=>'L',
26573222=>'L',
26583223=>'L',
26593224=>'L',
26603225=>'L',
26613226=>'L',
26623227=>'L',
26633228=>'L',
26643229=>'L',
26653230=>'L',
26663231=>'L',
26673232=>'L',
26683233=>'L',
26693234=>'L',
26703235=>'L',
26713236=>'L',
26723237=>'L',
26733238=>'L',
26743239=>'L',
26753240=>'L',
26763242=>'L',
26773243=>'L',
26783244=>'L',
26793245=>'L',
26803246=>'L',
26813247=>'L',
26823248=>'L',
26833249=>'L',
26843250=>'L',
26853251=>'L',
26863253=>'L',
26873254=>'L',
26883255=>'L',
26893256=>'L',
26903257=>'L',
26913260=>'NSM',
26923261=>'L',
26933262=>'L',
26943263=>'L',
26953264=>'L',
26963265=>'L',
26973266=>'L',
26983267=>'L',
26993268=>'L',
27003270=>'L',
27013271=>'L',
27023272=>'L',
27033274=>'L',
27043275=>'L',
27053276=>'NSM',
27063277=>'NSM',
27073285=>'L',
27083286=>'L',
27093294=>'L',
27103296=>'L',
27113297=>'L',
27123298=>'NSM',
27133299=>'NSM',
27143302=>'L',
27153303=>'L',
27163304=>'L',
27173305=>'L',
27183306=>'L',
27193307=>'L',
27203308=>'L',
27213309=>'L',
27223310=>'L',
27233311=>'L',
27243313=>'ON',
27253314=>'ON',
27263330=>'L',
27273331=>'L',
27283333=>'L',
27293334=>'L',
27303335=>'L',
27313336=>'L',
27323337=>'L',
27333338=>'L',
27343339=>'L',
27353340=>'L',
27363342=>'L',
27373343=>'L',
27383344=>'L',
27393346=>'L',
27403347=>'L',
27413348=>'L',
27423349=>'L',
27433350=>'L',
27443351=>'L',
27453352=>'L',
27463353=>'L',
27473354=>'L',
27483355=>'L',
27493356=>'L',
27503357=>'L',
27513358=>'L',
27523359=>'L',
27533360=>'L',
27543361=>'L',
27553362=>'L',
27563363=>'L',
27573364=>'L',
27583365=>'L',
27593366=>'L',
27603367=>'L',
27613368=>'L',
27623370=>'L',
27633371=>'L',
27643372=>'L',
27653373=>'L',
27663374=>'L',
27673375=>'L',
27683376=>'L',
27693377=>'L',
27703378=>'L',
27713379=>'L',
27723380=>'L',
27733381=>'L',
27743382=>'L',
27753383=>'L',
27763384=>'L',
27773385=>'L',
27783390=>'L',
27793391=>'L',
27803392=>'L',
27813393=>'NSM',
27823394=>'NSM',
27833395=>'NSM',
27843398=>'L',
27853399=>'L',
27863400=>'L',
27873402=>'L',
27883403=>'L',
27893404=>'L',
27903405=>'NSM',
27913415=>'L',
27923424=>'L',
27933425=>'L',
27943430=>'L',
27953431=>'L',
27963432=>'L',
27973433=>'L',
27983434=>'L',
27993435=>'L',
28003436=>'L',
28013437=>'L',
28023438=>'L',
28033439=>'L',
28043458=>'L',
28053459=>'L',
28063461=>'L',
28073462=>'L',
28083463=>'L',
28093464=>'L',
28103465=>'L',
28113466=>'L',
28123467=>'L',
28133468=>'L',
28143469=>'L',
28153470=>'L',
28163471=>'L',
28173472=>'L',
28183473=>'L',
28193474=>'L',
28203475=>'L',
28213476=>'L',
28223477=>'L',
28233478=>'L',
28243482=>'L',
28253483=>'L',
28263484=>'L',
28273485=>'L',
28283486=>'L',
28293487=>'L',
28303488=>'L',
28313489=>'L',
28323490=>'L',
28333491=>'L',
28343492=>'L',
28353493=>'L',
28363494=>'L',
28373495=>'L',
28383496=>'L',
28393497=>'L',
28403498=>'L',
28413499=>'L',
28423500=>'L',
28433501=>'L',
28443502=>'L',
28453503=>'L',
28463504=>'L',
28473505=>'L',
28483507=>'L',
28493508=>'L',
28503509=>'L',
28513510=>'L',
28523511=>'L',
28533512=>'L',
28543513=>'L',
28553514=>'L',
28563515=>'L',
28573517=>'L',
28583520=>'L',
28593521=>'L',
28603522=>'L',
28613523=>'L',
28623524=>'L',
28633525=>'L',
28643526=>'L',
28653530=>'NSM',
28663535=>'L',
28673536=>'L',
28683537=>'L',
28693538=>'NSM',
28703539=>'NSM',
28713540=>'NSM',
28723542=>'NSM',
28733544=>'L',
28743545=>'L',
28753546=>'L',
28763547=>'L',
28773548=>'L',
28783549=>'L',
28793550=>'L',
28803551=>'L',
28813570=>'L',
28823571=>'L',
28833572=>'L',
28843585=>'L',
28853586=>'L',
28863587=>'L',
28873588=>'L',
28883589=>'L',
28893590=>'L',
28903591=>'L',
28913592=>'L',
28923593=>'L',
28933594=>'L',
28943595=>'L',
28953596=>'L',
28963597=>'L',
28973598=>'L',
28983599=>'L',
28993600=>'L',
29003601=>'L',
29013602=>'L',
29023603=>'L',
29033604=>'L',
29043605=>'L',
29053606=>'L',
29063607=>'L',
29073608=>'L',
29083609=>'L',
29093610=>'L',
29103611=>'L',
29113612=>'L',
29123613=>'L',
29133614=>'L',
29143615=>'L',
29153616=>'L',
29163617=>'L',
29173618=>'L',
29183619=>'L',
29193620=>'L',
29203621=>'L',
29213622=>'L',
29223623=>'L',
29233624=>'L',
29243625=>'L',
29253626=>'L',
29263627=>'L',
29273628=>'L',
29283629=>'L',
29293630=>'L',
29303631=>'L',
29313632=>'L',
29323633=>'NSM',
29333634=>'L',
29343635=>'L',
29353636=>'NSM',
29363637=>'NSM',
29373638=>'NSM',
29383639=>'NSM',
29393640=>'NSM',
29403641=>'NSM',
29413642=>'NSM',
29423647=>'ET',
29433648=>'L',
29443649=>'L',
29453650=>'L',
29463651=>'L',
29473652=>'L',
29483653=>'L',
29493654=>'L',
29503655=>'NSM',
29513656=>'NSM',
29523657=>'NSM',
29533658=>'NSM',
29543659=>'NSM',
29553660=>'NSM',
29563661=>'NSM',
29573662=>'NSM',
29583663=>'L',
29593664=>'L',
29603665=>'L',
29613666=>'L',
29623667=>'L',
29633668=>'L',
29643669=>'L',
29653670=>'L',
29663671=>'L',
29673672=>'L',
29683673=>'L',
29693674=>'L',
29703675=>'L',
29713713=>'L',
29723714=>'L',
29733716=>'L',
29743719=>'L',
29753720=>'L',
29763722=>'L',
29773725=>'L',
29783732=>'L',
29793733=>'L',
29803734=>'L',
29813735=>'L',
29823737=>'L',
29833738=>'L',
29843739=>'L',
29853740=>'L',
29863741=>'L',
29873742=>'L',
29883743=>'L',
29893745=>'L',
29903746=>'L',
29913747=>'L',
29923749=>'L',
29933751=>'L',
29943754=>'L',
29953755=>'L',
29963757=>'L',
29973758=>'L',
29983759=>'L',
29993760=>'L',
30003761=>'NSM',
30013762=>'L',
30023763=>'L',
30033764=>'NSM',
30043765=>'NSM',
30053766=>'NSM',
30063767=>'NSM',
30073768=>'NSM',
30083769=>'NSM',
30093771=>'NSM',
30103772=>'NSM',
30113773=>'L',
30123776=>'L',
30133777=>'L',
30143778=>'L',
30153779=>'L',
30163780=>'L',
30173782=>'L',
30183784=>'NSM',
30193785=>'NSM',
30203786=>'NSM',
30213787=>'NSM',
30223788=>'NSM',
30233789=>'NSM',
30243792=>'L',
30253793=>'L',
30263794=>'L',
30273795=>'L',
30283796=>'L',
30293797=>'L',
30303798=>'L',
30313799=>'L',
30323800=>'L',
30333801=>'L',
30343804=>'L',
30353805=>'L',
30363840=>'L',
30373841=>'L',
30383842=>'L',
30393843=>'L',
30403844=>'L',
30413845=>'L',
30423846=>'L',
30433847=>'L',
30443848=>'L',
30453849=>'L',
30463850=>'L',
30473851=>'L',
30483852=>'L',
30493853=>'L',
30503854=>'L',
30513855=>'L',
30523856=>'L',
30533857=>'L',
30543858=>'L',
30553859=>'L',
30563860=>'L',
30573861=>'L',
30583862=>'L',
30593863=>'L',
30603864=>'NSM',
30613865=>'NSM',
30623866=>'L',
30633867=>'L',
30643868=>'L',
30653869=>'L',
30663870=>'L',
30673871=>'L',
30683872=>'L',
30693873=>'L',
30703874=>'L',
30713875=>'L',
30723876=>'L',
30733877=>'L',
30743878=>'L',
30753879=>'L',
30763880=>'L',
30773881=>'L',
30783882=>'L',
30793883=>'L',
30803884=>'L',
30813885=>'L',
30823886=>'L',
30833887=>'L',
30843888=>'L',
30853889=>'L',
30863890=>'L',
30873891=>'L',
30883892=>'L',
30893893=>'NSM',
30903894=>'L',
30913895=>'NSM',
30923896=>'L',
30933897=>'NSM',
30943898=>'ON',
30953899=>'ON',
30963900=>'ON',
30973901=>'ON',
30983902=>'L',
30993903=>'L',
31003904=>'L',
31013905=>'L',
31023906=>'L',
31033907=>'L',
31043908=>'L',
31053909=>'L',
31063910=>'L',
31073911=>'L',
31083913=>'L',
31093914=>'L',
31103915=>'L',
31113916=>'L',
31123917=>'L',
31133918=>'L',
31143919=>'L',
31153920=>'L',
31163921=>'L',
31173922=>'L',
31183923=>'L',
31193924=>'L',
31203925=>'L',
31213926=>'L',
31223927=>'L',
31233928=>'L',
31243929=>'L',
31253930=>'L',
31263931=>'L',
31273932=>'L',
31283933=>'L',
31293934=>'L',
31303935=>'L',
31313936=>'L',
31323937=>'L',
31333938=>'L',
31343939=>'L',
31353940=>'L',
31363941=>'L',
31373942=>'L',
31383943=>'L',
31393944=>'L',
31403945=>'L',
31413946=>'L',
31423953=>'NSM',
31433954=>'NSM',
31443955=>'NSM',
31453956=>'NSM',
31463957=>'NSM',
31473958=>'NSM',
31483959=>'NSM',
31493960=>'NSM',
31503961=>'NSM',
31513962=>'NSM',
31523963=>'NSM',
31533964=>'NSM',
31543965=>'NSM',
31553966=>'NSM',
31563967=>'L',
31573968=>'NSM',
31583969=>'NSM',
31593970=>'NSM',
31603971=>'NSM',
31613972=>'NSM',
31623973=>'L',
31633974=>'NSM',
31643975=>'NSM',
31653976=>'L',
31663977=>'L',
31673978=>'L',
31683979=>'L',
31693984=>'NSM',
31703985=>'NSM',
31713986=>'NSM',
31723987=>'NSM',
31733988=>'NSM',
31743989=>'NSM',
31753990=>'NSM',
31763991=>'NSM',
31773993=>'NSM',
31783994=>'NSM',
31793995=>'NSM',
31803996=>'NSM',
31813997=>'NSM',
31823998=>'NSM',
31833999=>'NSM',
31844000=>'NSM',
31854001=>'NSM',
31864002=>'NSM',
31874003=>'NSM',
31884004=>'NSM',
31894005=>'NSM',
31904006=>'NSM',
31914007=>'NSM',
31924008=>'NSM',
31934009=>'NSM',
31944010=>'NSM',
31954011=>'NSM',
31964012=>'NSM',
31974013=>'NSM',
31984014=>'NSM',
31994015=>'NSM',
32004016=>'NSM',
32014017=>'NSM',
32024018=>'NSM',
32034019=>'NSM',
32044020=>'NSM',
32054021=>'NSM',
32064022=>'NSM',
32074023=>'NSM',
32084024=>'NSM',
32094025=>'NSM',
32104026=>'NSM',
32114027=>'NSM',
32124028=>'NSM',
32134030=>'L',
32144031=>'L',
32154032=>'L',
32164033=>'L',
32174034=>'L',
32184035=>'L',
32194036=>'L',
32204037=>'L',
32214038=>'NSM',
32224039=>'L',
32234040=>'L',
32244041=>'L',
32254042=>'L',
32264043=>'L',
32274044=>'L',
32284047=>'L',
32294048=>'L',
32304049=>'L',
32314096=>'L',
32324097=>'L',
32334098=>'L',
32344099=>'L',
32354100=>'L',
32364101=>'L',
32374102=>'L',
32384103=>'L',
32394104=>'L',
32404105=>'L',
32414106=>'L',
32424107=>'L',
32434108=>'L',
32444109=>'L',
32454110=>'L',
32464111=>'L',
32474112=>'L',
32484113=>'L',
32494114=>'L',
32504115=>'L',
32514116=>'L',
32524117=>'L',
32534118=>'L',
32544119=>'L',
32554120=>'L',
32564121=>'L',
32574122=>'L',
32584123=>'L',
32594124=>'L',
32604125=>'L',
32614126=>'L',
32624127=>'L',
32634128=>'L',
32644129=>'L',
32654131=>'L',
32664132=>'L',
32674133=>'L',
32684134=>'L',
32694135=>'L',
32704137=>'L',
32714138=>'L',
32724140=>'L',
32734141=>'NSM',
32744142=>'NSM',
32754143=>'NSM',
32764144=>'NSM',
32774145=>'L',
32784146=>'NSM',
32794150=>'NSM',
32804151=>'NSM',
32814152=>'L',
32824153=>'NSM',
32834160=>'L',
32844161=>'L',
32854162=>'L',
32864163=>'L',
32874164=>'L',
32884165=>'L',
32894166=>'L',
32904167=>'L',
32914168=>'L',
32924169=>'L',
32934170=>'L',
32944171=>'L',
32954172=>'L',
32964173=>'L',
32974174=>'L',
32984175=>'L',
32994176=>'L',
33004177=>'L',
33014178=>'L',
33024179=>'L',
33034180=>'L',
33044181=>'L',
33054182=>'L',
33064183=>'L',
33074184=>'NSM',
33084185=>'NSM',
33094256=>'L',
33104257=>'L',
33114258=>'L',
33124259=>'L',
33134260=>'L',
33144261=>'L',
33154262=>'L',
33164263=>'L',
33174264=>'L',
33184265=>'L',
33194266=>'L',
33204267=>'L',
33214268=>'L',
33224269=>'L',
33234270=>'L',
33244271=>'L',
33254272=>'L',
33264273=>'L',
33274274=>'L',
33284275=>'L',
33294276=>'L',
33304277=>'L',
33314278=>'L',
33324279=>'L',
33334280=>'L',
33344281=>'L',
33354282=>'L',
33364283=>'L',
33374284=>'L',
33384285=>'L',
33394286=>'L',
33404287=>'L',
33414288=>'L',
33424289=>'L',
33434290=>'L',
33444291=>'L',
33454292=>'L',
33464293=>'L',
33474304=>'L',
33484305=>'L',
33494306=>'L',
33504307=>'L',
33514308=>'L',
33524309=>'L',
33534310=>'L',
33544311=>'L',
33554312=>'L',
33564313=>'L',
33574314=>'L',
33584315=>'L',
33594316=>'L',
33604317=>'L',
33614318=>'L',
33624319=>'L',
33634320=>'L',
33644321=>'L',
33654322=>'L',
33664323=>'L',
33674324=>'L',
33684325=>'L',
33694326=>'L',
33704327=>'L',
33714328=>'L',
33724329=>'L',
33734330=>'L',
33744331=>'L',
33754332=>'L',
33764333=>'L',
33774334=>'L',
33784335=>'L',
33794336=>'L',
33804337=>'L',
33814338=>'L',
33824339=>'L',
33834340=>'L',
33844341=>'L',
33854342=>'L',
33864343=>'L',
33874344=>'L',
33884345=>'L',
33894346=>'L',
33904347=>'L',
33914348=>'L',
33924352=>'L',
33934353=>'L',
33944354=>'L',
33954355=>'L',
33964356=>'L',
33974357=>'L',
33984358=>'L',
33994359=>'L',
34004360=>'L',
34014361=>'L',
34024362=>'L',
34034363=>'L',
34044364=>'L',
34054365=>'L',
34064366=>'L',
34074367=>'L',
34084368=>'L',
34094369=>'L',
34104370=>'L',
34114371=>'L',
34124372=>'L',
34134373=>'L',
34144374=>'L',
34154375=>'L',
34164376=>'L',
34174377=>'L',
34184378=>'L',
34194379=>'L',
34204380=>'L',
34214381=>'L',
34224382=>'L',
34234383=>'L',
34244384=>'L',
34254385=>'L',
34264386=>'L',
34274387=>'L',
34284388=>'L',
34294389=>'L',
34304390=>'L',
34314391=>'L',
34324392=>'L',
34334393=>'L',
34344394=>'L',
34354395=>'L',
34364396=>'L',
34374397=>'L',
34384398=>'L',
34394399=>'L',
34404400=>'L',
34414401=>'L',
34424402=>'L',
34434403=>'L',
34444404=>'L',
34454405=>'L',
34464406=>'L',
34474407=>'L',
34484408=>'L',
34494409=>'L',
34504410=>'L',
34514411=>'L',
34524412=>'L',
34534413=>'L',
34544414=>'L',
34554415=>'L',
34564416=>'L',
34574417=>'L',
34584418=>'L',
34594419=>'L',
34604420=>'L',
34614421=>'L',
34624422=>'L',
34634423=>'L',
34644424=>'L',
34654425=>'L',
34664426=>'L',
34674427=>'L',
34684428=>'L',
34694429=>'L',
34704430=>'L',
34714431=>'L',
34724432=>'L',
34734433=>'L',
34744434=>'L',
34754435=>'L',
34764436=>'L',
34774437=>'L',
34784438=>'L',
34794439=>'L',
34804440=>'L',
34814441=>'L',
34824447=>'L',
34834448=>'L',
34844449=>'L',
34854450=>'L',
34864451=>'L',
34874452=>'L',
34884453=>'L',
34894454=>'L',
34904455=>'L',
34914456=>'L',
34924457=>'L',
34934458=>'L',
34944459=>'L',
34954460=>'L',
34964461=>'L',
34974462=>'L',
34984463=>'L',
34994464=>'L',
35004465=>'L',
35014466=>'L',
35024467=>'L',
35034468=>'L',
35044469=>'L',
35054470=>'L',
35064471=>'L',
35074472=>'L',
35084473=>'L',
35094474=>'L',
35104475=>'L',
35114476=>'L',
35124477=>'L',
35134478=>'L',
35144479=>'L',
35154480=>'L',
35164481=>'L',
35174482=>'L',
35184483=>'L',
35194484=>'L',
35204485=>'L',
35214486=>'L',
35224487=>'L',
35234488=>'L',
35244489=>'L',
35254490=>'L',
35264491=>'L',
35274492=>'L',
35284493=>'L',
35294494=>'L',
35304495=>'L',
35314496=>'L',
35324497=>'L',
35334498=>'L',
35344499=>'L',
35354500=>'L',
35364501=>'L',
35374502=>'L',
35384503=>'L',
35394504=>'L',
35404505=>'L',
35414506=>'L',
35424507=>'L',
35434508=>'L',
35444509=>'L',
35454510=>'L',
35464511=>'L',
35474512=>'L',
35484513=>'L',
35494514=>'L',
35504520=>'L',
35514521=>'L',
35524522=>'L',
35534523=>'L',
35544524=>'L',
35554525=>'L',
35564526=>'L',
35574527=>'L',
35584528=>'L',
35594529=>'L',
35604530=>'L',
35614531=>'L',
35624532=>'L',
35634533=>'L',
35644534=>'L',
35654535=>'L',
35664536=>'L',
35674537=>'L',
35684538=>'L',
35694539=>'L',
35704540=>'L',
35714541=>'L',
35724542=>'L',
35734543=>'L',
35744544=>'L',
35754545=>'L',
35764546=>'L',
35774547=>'L',
35784548=>'L',
35794549=>'L',
35804550=>'L',
35814551=>'L',
35824552=>'L',
35834553=>'L',
35844554=>'L',
35854555=>'L',
35864556=>'L',
35874557=>'L',
35884558=>'L',
35894559=>'L',
35904560=>'L',
35914561=>'L',
35924562=>'L',
35934563=>'L',
35944564=>'L',
35954565=>'L',
35964566=>'L',
35974567=>'L',
35984568=>'L',
35994569=>'L',
36004570=>'L',
36014571=>'L',
36024572=>'L',
36034573=>'L',
36044574=>'L',
36054575=>'L',
36064576=>'L',
36074577=>'L',
36084578=>'L',
36094579=>'L',
36104580=>'L',
36114581=>'L',
36124582=>'L',
36134583=>'L',
36144584=>'L',
36154585=>'L',
36164586=>'L',
36174587=>'L',
36184588=>'L',
36194589=>'L',
36204590=>'L',
36214591=>'L',
36224592=>'L',
36234593=>'L',
36244594=>'L',
36254595=>'L',
36264596=>'L',
36274597=>'L',
36284598=>'L',
36294599=>'L',
36304600=>'L',
36314601=>'L',
36324608=>'L',
36334609=>'L',
36344610=>'L',
36354611=>'L',
36364612=>'L',
36374613=>'L',
36384614=>'L',
36394615=>'L',
36404616=>'L',
36414617=>'L',
36424618=>'L',
36434619=>'L',
36444620=>'L',
36454621=>'L',
36464622=>'L',
36474623=>'L',
36484624=>'L',
36494625=>'L',
36504626=>'L',
36514627=>'L',
36524628=>'L',
36534629=>'L',
36544630=>'L',
36554631=>'L',
36564632=>'L',
36574633=>'L',
36584634=>'L',
36594635=>'L',
36604636=>'L',
36614637=>'L',
36624638=>'L',
36634639=>'L',
36644640=>'L',
36654641=>'L',
36664642=>'L',
36674643=>'L',
36684644=>'L',
36694645=>'L',
36704646=>'L',
36714647=>'L',
36724648=>'L',
36734649=>'L',
36744650=>'L',
36754651=>'L',
36764652=>'L',
36774653=>'L',
36784654=>'L',
36794655=>'L',
36804656=>'L',
36814657=>'L',
36824658=>'L',
36834659=>'L',
36844660=>'L',
36854661=>'L',
36864662=>'L',
36874663=>'L',
36884664=>'L',
36894665=>'L',
36904666=>'L',
36914667=>'L',
36924668=>'L',
36934669=>'L',
36944670=>'L',
36954671=>'L',
36964672=>'L',
36974673=>'L',
36984674=>'L',
36994675=>'L',
37004676=>'L',
37014677=>'L',
37024678=>'L',
37034679=>'L',
37044680=>'L',
37054682=>'L',
37064683=>'L',
37074684=>'L',
37084685=>'L',
37094688=>'L',
37104689=>'L',
37114690=>'L',
37124691=>'L',
37134692=>'L',
37144693=>'L',
37154694=>'L',
37164696=>'L',
37174698=>'L',
37184699=>'L',
37194700=>'L',
37204701=>'L',
37214704=>'L',
37224705=>'L',
37234706=>'L',
37244707=>'L',
37254708=>'L',
37264709=>'L',
37274710=>'L',
37284711=>'L',
37294712=>'L',
37304713=>'L',
37314714=>'L',
37324715=>'L',
37334716=>'L',
37344717=>'L',
37354718=>'L',
37364719=>'L',
37374720=>'L',
37384721=>'L',
37394722=>'L',
37404723=>'L',
37414724=>'L',
37424725=>'L',
37434726=>'L',
37444727=>'L',
37454728=>'L',
37464729=>'L',
37474730=>'L',
37484731=>'L',
37494732=>'L',
37504733=>'L',
37514734=>'L',
37524735=>'L',
37534736=>'L',
37544737=>'L',
37554738=>'L',
37564739=>'L',
37574740=>'L',
37584741=>'L',
37594742=>'L',
37604743=>'L',
37614744=>'L',
37624746=>'L',
37634747=>'L',
37644748=>'L',
37654749=>'L',
37664752=>'L',
37674753=>'L',
37684754=>'L',
37694755=>'L',
37704756=>'L',
37714757=>'L',
37724758=>'L',
37734759=>'L',
37744760=>'L',
37754761=>'L',
37764762=>'L',
37774763=>'L',
37784764=>'L',
37794765=>'L',
37804766=>'L',
37814767=>'L',
37824768=>'L',
37834769=>'L',
37844770=>'L',
37854771=>'L',
37864772=>'L',
37874773=>'L',
37884774=>'L',
37894775=>'L',
37904776=>'L',
37914777=>'L',
37924778=>'L',
37934779=>'L',
37944780=>'L',
37954781=>'L',
37964782=>'L',
37974783=>'L',
37984784=>'L',
37994786=>'L',
38004787=>'L',
38014788=>'L',
38024789=>'L',
38034792=>'L',
38044793=>'L',
38054794=>'L',
38064795=>'L',
38074796=>'L',
38084797=>'L',
38094798=>'L',
38104800=>'L',
38114802=>'L',
38124803=>'L',
38134804=>'L',
38144805=>'L',
38154808=>'L',
38164809=>'L',
38174810=>'L',
38184811=>'L',
38194812=>'L',
38204813=>'L',
38214814=>'L',
38224815=>'L',
38234816=>'L',
38244817=>'L',
38254818=>'L',
38264819=>'L',
38274820=>'L',
38284821=>'L',
38294822=>'L',
38304824=>'L',
38314825=>'L',
38324826=>'L',
38334827=>'L',
38344828=>'L',
38354829=>'L',
38364830=>'L',
38374831=>'L',
38384832=>'L',
38394833=>'L',
38404834=>'L',
38414835=>'L',
38424836=>'L',
38434837=>'L',
38444838=>'L',
38454839=>'L',
38464840=>'L',
38474841=>'L',
38484842=>'L',
38494843=>'L',
38504844=>'L',
38514845=>'L',
38524846=>'L',
38534847=>'L',
38544848=>'L',
38554849=>'L',
38564850=>'L',
38574851=>'L',
38584852=>'L',
38594853=>'L',
38604854=>'L',
38614855=>'L',
38624856=>'L',
38634857=>'L',
38644858=>'L',
38654859=>'L',
38664860=>'L',
38674861=>'L',
38684862=>'L',
38694863=>'L',
38704864=>'L',
38714865=>'L',
38724866=>'L',
38734867=>'L',
38744868=>'L',
38754869=>'L',
38764870=>'L',
38774871=>'L',
38784872=>'L',
38794873=>'L',
38804874=>'L',
38814875=>'L',
38824876=>'L',
38834877=>'L',
38844878=>'L',
38854879=>'L',
38864880=>'L',
38874882=>'L',
38884883=>'L',
38894884=>'L',
38904885=>'L',
38914888=>'L',
38924889=>'L',
38934890=>'L',
38944891=>'L',
38954892=>'L',
38964893=>'L',
38974894=>'L',
38984895=>'L',
38994896=>'L',
39004897=>'L',
39014898=>'L',
39024899=>'L',
39034900=>'L',
39044901=>'L',
39054902=>'L',
39064903=>'L',
39074904=>'L',
39084905=>'L',
39094906=>'L',
39104907=>'L',
39114908=>'L',
39124909=>'L',
39134910=>'L',
39144911=>'L',
39154912=>'L',
39164913=>'L',
39174914=>'L',
39184915=>'L',
39194916=>'L',
39204917=>'L',
39214918=>'L',
39224919=>'L',
39234920=>'L',
39244921=>'L',
39254922=>'L',
39264923=>'L',
39274924=>'L',
39284925=>'L',
39294926=>'L',
39304927=>'L',
39314928=>'L',
39324929=>'L',
39334930=>'L',
39344931=>'L',
39354932=>'L',
39364933=>'L',
39374934=>'L',
39384935=>'L',
39394936=>'L',
39404937=>'L',
39414938=>'L',
39424939=>'L',
39434940=>'L',
39444941=>'L',
39454942=>'L',
39464943=>'L',
39474944=>'L',
39484945=>'L',
39494946=>'L',
39504947=>'L',
39514948=>'L',
39524949=>'L',
39534950=>'L',
39544951=>'L',
39554952=>'L',
39564953=>'L',
39574954=>'L',
39584959=>'NSM',
39594960=>'L',
39604961=>'L',
39614962=>'L',
39624963=>'L',
39634964=>'L',
39644965=>'L',
39654966=>'L',
39664967=>'L',
39674968=>'L',
39684969=>'L',
39694970=>'L',
39704971=>'L',
39714972=>'L',
39724973=>'L',
39734974=>'L',
39744975=>'L',
39754976=>'L',
39764977=>'L',
39774978=>'L',
39784979=>'L',
39794980=>'L',
39804981=>'L',
39814982=>'L',
39824983=>'L',
39834984=>'L',
39844985=>'L',
39854986=>'L',
39864987=>'L',
39874988=>'L',
39884992=>'L',
39894993=>'L',
39904994=>'L',
39914995=>'L',
39924996=>'L',
39934997=>'L',
39944998=>'L',
39954999=>'L',
39965000=>'L',
39975001=>'L',
39985002=>'L',
39995003=>'L',
40005004=>'L',
40015005=>'L',
40025006=>'L',
40035007=>'L',
40045008=>'ON',
40055009=>'ON',
40065010=>'ON',
40075011=>'ON',
40085012=>'ON',
40095013=>'ON',
40105014=>'ON',
40115015=>'ON',
40125016=>'ON',
40135017=>'ON',
40145024=>'L',
40155025=>'L',
40165026=>'L',
40175027=>'L',
40185028=>'L',
40195029=>'L',
40205030=>'L',
40215031=>'L',
40225032=>'L',
40235033=>'L',
40245034=>'L',
40255035=>'L',
40265036=>'L',
40275037=>'L',
40285038=>'L',
40295039=>'L',
40305040=>'L',
40315041=>'L',
40325042=>'L',
40335043=>'L',
40345044=>'L',
40355045=>'L',
40365046=>'L',
40375047=>'L',
40385048=>'L',
40395049=>'L',
40405050=>'L',
40415051=>'L',
40425052=>'L',
40435053=>'L',
40445054=>'L',
40455055=>'L',
40465056=>'L',
40475057=>'L',
40485058=>'L',
40495059=>'L',
40505060=>'L',
40515061=>'L',
40525062=>'L',
40535063=>'L',
40545064=>'L',
40555065=>'L',
40565066=>'L',
40575067=>'L',
40585068=>'L',
40595069=>'L',
40605070=>'L',
40615071=>'L',
40625072=>'L',
40635073=>'L',
40645074=>'L',
40655075=>'L',
40665076=>'L',
40675077=>'L',
40685078=>'L',
40695079=>'L',
40705080=>'L',
40715081=>'L',
40725082=>'L',
40735083=>'L',
40745084=>'L',
40755085=>'L',
40765086=>'L',
40775087=>'L',
40785088=>'L',
40795089=>'L',
40805090=>'L',
40815091=>'L',
40825092=>'L',
40835093=>'L',
40845094=>'L',
40855095=>'L',
40865096=>'L',
40875097=>'L',
40885098=>'L',
40895099=>'L',
40905100=>'L',
40915101=>'L',
40925102=>'L',
40935103=>'L',
40945104=>'L',
40955105=>'L',
40965106=>'L',
40975107=>'L',
40985108=>'L',
40995121=>'L',
41005122=>'L',
41015123=>'L',
41025124=>'L',
41035125=>'L',
41045126=>'L',
41055127=>'L',
41065128=>'L',
41075129=>'L',
41085130=>'L',
41095131=>'L',
41105132=>'L',
41115133=>'L',
41125134=>'L',
41135135=>'L',
41145136=>'L',
41155137=>'L',
41165138=>'L',
41175139=>'L',
41185140=>'L',
41195141=>'L',
41205142=>'L',
41215143=>'L',
41225144=>'L',
41235145=>'L',
41245146=>'L',
41255147=>'L',
41265148=>'L',
41275149=>'L',
41285150=>'L',
41295151=>'L',
41305152=>'L',
41315153=>'L',
41325154=>'L',
41335155=>'L',
41345156=>'L',
41355157=>'L',
41365158=>'L',
41375159=>'L',
41385160=>'L',
41395161=>'L',
41405162=>'L',
41415163=>'L',
41425164=>'L',
41435165=>'L',
41445166=>'L',
41455167=>'L',
41465168=>'L',
41475169=>'L',
41485170=>'L',
41495171=>'L',
41505172=>'L',
41515173=>'L',
41525174=>'L',
41535175=>'L',
41545176=>'L',
41555177=>'L',
41565178=>'L',
41575179=>'L',
41585180=>'L',
41595181=>'L',
41605182=>'L',
41615183=>'L',
41625184=>'L',
41635185=>'L',
41645186=>'L',
41655187=>'L',
41665188=>'L',
41675189=>'L',
41685190=>'L',
41695191=>'L',
41705192=>'L',
41715193=>'L',
41725194=>'L',
41735195=>'L',
41745196=>'L',
41755197=>'L',
41765198=>'L',
41775199=>'L',
41785200=>'L',
41795201=>'L',
41805202=>'L',
41815203=>'L',
41825204=>'L',
41835205=>'L',
41845206=>'L',
41855207=>'L',
41865208=>'L',
41875209=>'L',
41885210=>'L',
41895211=>'L',
41905212=>'L',
41915213=>'L',
41925214=>'L',
41935215=>'L',
41945216=>'L',
41955217=>'L',
41965218=>'L',
41975219=>'L',
41985220=>'L',
41995221=>'L',
42005222=>'L',
42015223=>'L',
42025224=>'L',
42035225=>'L',
42045226=>'L',
42055227=>'L',
42065228=>'L',
42075229=>'L',
42085230=>'L',
42095231=>'L',
42105232=>'L',
42115233=>'L',
42125234=>'L',
42135235=>'L',
42145236=>'L',
42155237=>'L',
42165238=>'L',
42175239=>'L',
42185240=>'L',
42195241=>'L',
42205242=>'L',
42215243=>'L',
42225244=>'L',
42235245=>'L',
42245246=>'L',
42255247=>'L',
42265248=>'L',
42275249=>'L',
42285250=>'L',
42295251=>'L',
42305252=>'L',
42315253=>'L',
42325254=>'L',
42335255=>'L',
42345256=>'L',
42355257=>'L',
42365258=>'L',
42375259=>'L',
42385260=>'L',
42395261=>'L',
42405262=>'L',
42415263=>'L',
42425264=>'L',
42435265=>'L',
42445266=>'L',
42455267=>'L',
42465268=>'L',
42475269=>'L',
42485270=>'L',
42495271=>'L',
42505272=>'L',
42515273=>'L',
42525274=>'L',
42535275=>'L',
42545276=>'L',
42555277=>'L',
42565278=>'L',
42575279=>'L',
42585280=>'L',
42595281=>'L',
42605282=>'L',
42615283=>'L',
42625284=>'L',
42635285=>'L',
42645286=>'L',
42655287=>'L',
42665288=>'L',
42675289=>'L',
42685290=>'L',
42695291=>'L',
42705292=>'L',
42715293=>'L',
42725294=>'L',
42735295=>'L',
42745296=>'L',
42755297=>'L',
42765298=>'L',
42775299=>'L',
42785300=>'L',
42795301=>'L',
42805302=>'L',
42815303=>'L',
42825304=>'L',
42835305=>'L',
42845306=>'L',
42855307=>'L',
42865308=>'L',
42875309=>'L',
42885310=>'L',
42895311=>'L',
42905312=>'L',
42915313=>'L',
42925314=>'L',
42935315=>'L',
42945316=>'L',
42955317=>'L',
42965318=>'L',
42975319=>'L',
42985320=>'L',
42995321=>'L',
43005322=>'L',
43015323=>'L',
43025324=>'L',
43035325=>'L',
43045326=>'L',
43055327=>'L',
43065328=>'L',
43075329=>'L',
43085330=>'L',
43095331=>'L',
43105332=>'L',
43115333=>'L',
43125334=>'L',
43135335=>'L',
43145336=>'L',
43155337=>'L',
43165338=>'L',
43175339=>'L',
43185340=>'L',
43195341=>'L',
43205342=>'L',
43215343=>'L',
43225344=>'L',
43235345=>'L',
43245346=>'L',
43255347=>'L',
43265348=>'L',
43275349=>'L',
43285350=>'L',
43295351=>'L',
43305352=>'L',
43315353=>'L',
43325354=>'L',
43335355=>'L',
43345356=>'L',
43355357=>'L',
43365358=>'L',
43375359=>'L',
43385360=>'L',
43395361=>'L',
43405362=>'L',
43415363=>'L',
43425364=>'L',
43435365=>'L',
43445366=>'L',
43455367=>'L',
43465368=>'L',
43475369=>'L',
43485370=>'L',
43495371=>'L',
43505372=>'L',
43515373=>'L',
43525374=>'L',
43535375=>'L',
43545376=>'L',
43555377=>'L',
43565378=>'L',
43575379=>'L',
43585380=>'L',
43595381=>'L',
43605382=>'L',
43615383=>'L',
43625384=>'L',
43635385=>'L',
43645386=>'L',
43655387=>'L',
43665388=>'L',
43675389=>'L',
43685390=>'L',
43695391=>'L',
43705392=>'L',
43715393=>'L',
43725394=>'L',
43735395=>'L',
43745396=>'L',
43755397=>'L',
43765398=>'L',
43775399=>'L',
43785400=>'L',
43795401=>'L',
43805402=>'L',
43815403=>'L',
43825404=>'L',
43835405=>'L',
43845406=>'L',
43855407=>'L',
43865408=>'L',
43875409=>'L',
43885410=>'L',
43895411=>'L',
43905412=>'L',
43915413=>'L',
43925414=>'L',
43935415=>'L',
43945416=>'L',
43955417=>'L',
43965418=>'L',
43975419=>'L',
43985420=>'L',
43995421=>'L',
44005422=>'L',
44015423=>'L',
44025424=>'L',
44035425=>'L',
44045426=>'L',
44055427=>'L',
44065428=>'L',
44075429=>'L',
44085430=>'L',
44095431=>'L',
44105432=>'L',
44115433=>'L',
44125434=>'L',
44135435=>'L',
44145436=>'L',
44155437=>'L',
44165438=>'L',
44175439=>'L',
44185440=>'L',
44195441=>'L',
44205442=>'L',
44215443=>'L',
44225444=>'L',
44235445=>'L',
44245446=>'L',
44255447=>'L',
44265448=>'L',
44275449=>'L',
44285450=>'L',
44295451=>'L',
44305452=>'L',
44315453=>'L',
44325454=>'L',
44335455=>'L',
44345456=>'L',
44355457=>'L',
44365458=>'L',
44375459=>'L',
44385460=>'L',
44395461=>'L',
44405462=>'L',
44415463=>'L',
44425464=>'L',
44435465=>'L',
44445466=>'L',
44455467=>'L',
44465468=>'L',
44475469=>'L',
44485470=>'L',
44495471=>'L',
44505472=>'L',
44515473=>'L',
44525474=>'L',
44535475=>'L',
44545476=>'L',
44555477=>'L',
44565478=>'L',
44575479=>'L',
44585480=>'L',
44595481=>'L',
44605482=>'L',
44615483=>'L',
44625484=>'L',
44635485=>'L',
44645486=>'L',
44655487=>'L',
44665488=>'L',
44675489=>'L',
44685490=>'L',
44695491=>'L',
44705492=>'L',
44715493=>'L',
44725494=>'L',
44735495=>'L',
44745496=>'L',
44755497=>'L',
44765498=>'L',
44775499=>'L',
44785500=>'L',
44795501=>'L',
44805502=>'L',
44815503=>'L',
44825504=>'L',
44835505=>'L',
44845506=>'L',
44855507=>'L',
44865508=>'L',
44875509=>'L',
44885510=>'L',
44895511=>'L',
44905512=>'L',
44915513=>'L',
44925514=>'L',
44935515=>'L',
44945516=>'L',
44955517=>'L',
44965518=>'L',
44975519=>'L',
44985520=>'L',
44995521=>'L',
45005522=>'L',
45015523=>'L',
45025524=>'L',
45035525=>'L',
45045526=>'L',
45055527=>'L',
45065528=>'L',
45075529=>'L',
45085530=>'L',
45095531=>'L',
45105532=>'L',
45115533=>'L',
45125534=>'L',
45135535=>'L',
45145536=>'L',
45155537=>'L',
45165538=>'L',
45175539=>'L',
45185540=>'L',
45195541=>'L',
45205542=>'L',
45215543=>'L',
45225544=>'L',
45235545=>'L',
45245546=>'L',
45255547=>'L',
45265548=>'L',
45275549=>'L',
45285550=>'L',
45295551=>'L',
45305552=>'L',
45315553=>'L',
45325554=>'L',
45335555=>'L',
45345556=>'L',
45355557=>'L',
45365558=>'L',
45375559=>'L',
45385560=>'L',
45395561=>'L',
45405562=>'L',
45415563=>'L',
45425564=>'L',
45435565=>'L',
45445566=>'L',
45455567=>'L',
45465568=>'L',
45475569=>'L',
45485570=>'L',
45495571=>'L',
45505572=>'L',
45515573=>'L',
45525574=>'L',
45535575=>'L',
45545576=>'L',
45555577=>'L',
45565578=>'L',
45575579=>'L',
45585580=>'L',
45595581=>'L',
45605582=>'L',
45615583=>'L',
45625584=>'L',
45635585=>'L',
45645586=>'L',
45655587=>'L',
45665588=>'L',
45675589=>'L',
45685590=>'L',
45695591=>'L',
45705592=>'L',
45715593=>'L',
45725594=>'L',
45735595=>'L',
45745596=>'L',
45755597=>'L',
45765598=>'L',
45775599=>'L',
45785600=>'L',
45795601=>'L',
45805602=>'L',
45815603=>'L',
45825604=>'L',
45835605=>'L',
45845606=>'L',
45855607=>'L',
45865608=>'L',
45875609=>'L',
45885610=>'L',
45895611=>'L',
45905612=>'L',
45915613=>'L',
45925614=>'L',
45935615=>'L',
45945616=>'L',
45955617=>'L',
45965618=>'L',
45975619=>'L',
45985620=>'L',
45995621=>'L',
46005622=>'L',
46015623=>'L',
46025624=>'L',
46035625=>'L',
46045626=>'L',
46055627=>'L',
46065628=>'L',
46075629=>'L',
46085630=>'L',
46095631=>'L',
46105632=>'L',
46115633=>'L',
46125634=>'L',
46135635=>'L',
46145636=>'L',
46155637=>'L',
46165638=>'L',
46175639=>'L',
46185640=>'L',
46195641=>'L',
46205642=>'L',
46215643=>'L',
46225644=>'L',
46235645=>'L',
46245646=>'L',
46255647=>'L',
46265648=>'L',
46275649=>'L',
46285650=>'L',
46295651=>'L',
46305652=>'L',
46315653=>'L',
46325654=>'L',
46335655=>'L',
46345656=>'L',
46355657=>'L',
46365658=>'L',
46375659=>'L',
46385660=>'L',
46395661=>'L',
46405662=>'L',
46415663=>'L',
46425664=>'L',
46435665=>'L',
46445666=>'L',
46455667=>'L',
46465668=>'L',
46475669=>'L',
46485670=>'L',
46495671=>'L',
46505672=>'L',
46515673=>'L',
46525674=>'L',
46535675=>'L',
46545676=>'L',
46555677=>'L',
46565678=>'L',
46575679=>'L',
46585680=>'L',
46595681=>'L',
46605682=>'L',
46615683=>'L',
46625684=>'L',
46635685=>'L',
46645686=>'L',
46655687=>'L',
46665688=>'L',
46675689=>'L',
46685690=>'L',
46695691=>'L',
46705692=>'L',
46715693=>'L',
46725694=>'L',
46735695=>'L',
46745696=>'L',
46755697=>'L',
46765698=>'L',
46775699=>'L',
46785700=>'L',
46795701=>'L',
46805702=>'L',
46815703=>'L',
46825704=>'L',
46835705=>'L',
46845706=>'L',
46855707=>'L',
46865708=>'L',
46875709=>'L',
46885710=>'L',
46895711=>'L',
46905712=>'L',
46915713=>'L',
46925714=>'L',
46935715=>'L',
46945716=>'L',
46955717=>'L',
46965718=>'L',
46975719=>'L',
46985720=>'L',
46995721=>'L',
47005722=>'L',
47015723=>'L',
47025724=>'L',
47035725=>'L',
47045726=>'L',
47055727=>'L',
47065728=>'L',
47075729=>'L',
47085730=>'L',
47095731=>'L',
47105732=>'L',
47115733=>'L',
47125734=>'L',
47135735=>'L',
47145736=>'L',
47155737=>'L',
47165738=>'L',
47175739=>'L',
47185740=>'L',
47195741=>'L',
47205742=>'L',
47215743=>'L',
47225744=>'L',
47235745=>'L',
47245746=>'L',
47255747=>'L',
47265748=>'L',
47275749=>'L',
47285750=>'L',
47295760=>'WS',
47305761=>'L',
47315762=>'L',
47325763=>'L',
47335764=>'L',
47345765=>'L',
47355766=>'L',
47365767=>'L',
47375768=>'L',
47385769=>'L',
47395770=>'L',
47405771=>'L',
47415772=>'L',
47425773=>'L',
47435774=>'L',
47445775=>'L',
47455776=>'L',
47465777=>'L',
47475778=>'L',
47485779=>'L',
47495780=>'L',
47505781=>'L',
47515782=>'L',
47525783=>'L',
47535784=>'L',
47545785=>'L',
47555786=>'L',
47565787=>'ON',
47575788=>'ON',
47585792=>'L',
47595793=>'L',
47605794=>'L',
47615795=>'L',
47625796=>'L',
47635797=>'L',
47645798=>'L',
47655799=>'L',
47665800=>'L',
47675801=>'L',
47685802=>'L',
47695803=>'L',
47705804=>'L',
47715805=>'L',
47725806=>'L',
47735807=>'L',
47745808=>'L',
47755809=>'L',
47765810=>'L',
47775811=>'L',
47785812=>'L',
47795813=>'L',
47805814=>'L',
47815815=>'L',
47825816=>'L',
47835817=>'L',
47845818=>'L',
47855819=>'L',
47865820=>'L',
47875821=>'L',
47885822=>'L',
47895823=>'L',
47905824=>'L',
47915825=>'L',
47925826=>'L',
47935827=>'L',
47945828=>'L',
47955829=>'L',
47965830=>'L',
47975831=>'L',
47985832=>'L',
47995833=>'L',
48005834=>'L',
48015835=>'L',
48025836=>'L',
48035837=>'L',
48045838=>'L',
48055839=>'L',
48065840=>'L',
48075841=>'L',
48085842=>'L',
48095843=>'L',
48105844=>'L',
48115845=>'L',
48125846=>'L',
48135847=>'L',
48145848=>'L',
48155849=>'L',
48165850=>'L',
48175851=>'L',
48185852=>'L',
48195853=>'L',
48205854=>'L',
48215855=>'L',
48225856=>'L',
48235857=>'L',
48245858=>'L',
48255859=>'L',
48265860=>'L',
48275861=>'L',
48285862=>'L',
48295863=>'L',
48305864=>'L',
48315865=>'L',
48325866=>'L',
48335867=>'L',
48345868=>'L',
48355869=>'L',
48365870=>'L',
48375871=>'L',
48385872=>'L',
48395888=>'L',
48405889=>'L',
48415890=>'L',
48425891=>'L',
48435892=>'L',
48445893=>'L',
48455894=>'L',
48465895=>'L',
48475896=>'L',
48485897=>'L',
48495898=>'L',
48505899=>'L',
48515900=>'L',
48525902=>'L',
48535903=>'L',
48545904=>'L',
48555905=>'L',
48565906=>'NSM',
48575907=>'NSM',
48585908=>'NSM',
48595920=>'L',
48605921=>'L',
48615922=>'L',
48625923=>'L',
48635924=>'L',
48645925=>'L',
48655926=>'L',
48665927=>'L',
48675928=>'L',
48685929=>'L',
48695930=>'L',
48705931=>'L',
48715932=>'L',
48725933=>'L',
48735934=>'L',
48745935=>'L',
48755936=>'L',
48765937=>'L',
48775938=>'NSM',
48785939=>'NSM',
48795940=>'NSM',
48805941=>'L',
48815942=>'L',
48825952=>'L',
48835953=>'L',
48845954=>'L',
48855955=>'L',
48865956=>'L',
48875957=>'L',
48885958=>'L',
48895959=>'L',
48905960=>'L',
48915961=>'L',
48925962=>'L',
48935963=>'L',
48945964=>'L',
48955965=>'L',
48965966=>'L',
48975967=>'L',
48985968=>'L',
48995969=>'L',
49005970=>'NSM',
49015971=>'NSM',
49025984=>'L',
49035985=>'L',
49045986=>'L',
49055987=>'L',
49065988=>'L',
49075989=>'L',
49085990=>'L',
49095991=>'L',
49105992=>'L',
49115993=>'L',
49125994=>'L',
49135995=>'L',
49145996=>'L',
49155998=>'L',
49165999=>'L',
49176000=>'L',
49186002=>'NSM',
49196003=>'NSM',
49206016=>'L',
49216017=>'L',
49226018=>'L',
49236019=>'L',
49246020=>'L',
49256021=>'L',
49266022=>'L',
49276023=>'L',
49286024=>'L',
49296025=>'L',
49306026=>'L',
49316027=>'L',
49326028=>'L',
49336029=>'L',
49346030=>'L',
49356031=>'L',
49366032=>'L',
49376033=>'L',
49386034=>'L',
49396035=>'L',
49406036=>'L',
49416037=>'L',
49426038=>'L',
49436039=>'L',
49446040=>'L',
49456041=>'L',
49466042=>'L',
49476043=>'L',
49486044=>'L',
49496045=>'L',
49506046=>'L',
49516047=>'L',
49526048=>'L',
49536049=>'L',
49546050=>'L',
49556051=>'L',
49566052=>'L',
49576053=>'L',
49586054=>'L',
49596055=>'L',
49606056=>'L',
49616057=>'L',
49626058=>'L',
49636059=>'L',
49646060=>'L',
49656061=>'L',
49666062=>'L',
49676063=>'L',
49686064=>'L',
49696065=>'L',
49706066=>'L',
49716067=>'L',
49726068=>'L',
49736069=>'L',
49746070=>'L',
49756071=>'NSM',
49766072=>'NSM',
49776073=>'NSM',
49786074=>'NSM',
49796075=>'NSM',
49806076=>'NSM',
49816077=>'NSM',
49826078=>'L',
49836079=>'L',
49846080=>'L',
49856081=>'L',
49866082=>'L',
49876083=>'L',
49886084=>'L',
49896085=>'L',
49906086=>'NSM',
49916087=>'L',
49926088=>'L',
49936089=>'NSM',
49946090=>'NSM',
49956091=>'NSM',
49966092=>'NSM',
49976093=>'NSM',
49986094=>'NSM',
49996095=>'NSM',
50006096=>'NSM',
50016097=>'NSM',
50026098=>'NSM',
50036099=>'NSM',
50046100=>'L',
50056101=>'L',
50066102=>'L',
50076103=>'L',
50086104=>'L',
50096105=>'L',
50106106=>'L',
50116107=>'ET',
50126108=>'L',
50136109=>'NSM',
50146112=>'L',
50156113=>'L',
50166114=>'L',
50176115=>'L',
50186116=>'L',
50196117=>'L',
50206118=>'L',
50216119=>'L',
50226120=>'L',
50236121=>'L',
50246128=>'ON',
50256129=>'ON',
50266130=>'ON',
50276131=>'ON',
50286132=>'ON',
50296133=>'ON',
50306134=>'ON',
50316135=>'ON',
50326136=>'ON',
50336137=>'ON',
50346144=>'ON',
50356145=>'ON',
50366146=>'ON',
50376147=>'ON',
50386148=>'ON',
50396149=>'ON',
50406150=>'ON',
50416151=>'ON',
50426152=>'ON',
50436153=>'ON',
50446154=>'ON',
50456155=>'NSM',
50466156=>'NSM',
50476157=>'NSM',
50486158=>'WS',
50496160=>'L',
50506161=>'L',
50516162=>'L',
50526163=>'L',
50536164=>'L',
50546165=>'L',
50556166=>'L',
50566167=>'L',
50576168=>'L',
50586169=>'L',
50596176=>'L',
50606177=>'L',
50616178=>'L',
50626179=>'L',
50636180=>'L',
50646181=>'L',
50656182=>'L',
50666183=>'L',
50676184=>'L',
50686185=>'L',
50696186=>'L',
50706187=>'L',
50716188=>'L',
50726189=>'L',
50736190=>'L',
50746191=>'L',
50756192=>'L',
50766193=>'L',
50776194=>'L',
50786195=>'L',
50796196=>'L',
50806197=>'L',
50816198=>'L',
50826199=>'L',
50836200=>'L',
50846201=>'L',
50856202=>'L',
50866203=>'L',
50876204=>'L',
50886205=>'L',
50896206=>'L',
50906207=>'L',
50916208=>'L',
50926209=>'L',
50936210=>'L',
50946211=>'L',
50956212=>'L',
50966213=>'L',
50976214=>'L',
50986215=>'L',
50996216=>'L',
51006217=>'L',
51016218=>'L',
51026219=>'L',
51036220=>'L',
51046221=>'L',
51056222=>'L',
51066223=>'L',
51076224=>'L',
51086225=>'L',
51096226=>'L',
51106227=>'L',
51116228=>'L',
51126229=>'L',
51136230=>'L',
51146231=>'L',
51156232=>'L',
51166233=>'L',
51176234=>'L',
51186235=>'L',
51196236=>'L',
51206237=>'L',
51216238=>'L',
51226239=>'L',
51236240=>'L',
51246241=>'L',
51256242=>'L',
51266243=>'L',
51276244=>'L',
51286245=>'L',
51296246=>'L',
51306247=>'L',
51316248=>'L',
51326249=>'L',
51336250=>'L',
51346251=>'L',
51356252=>'L',
51366253=>'L',
51376254=>'L',
51386255=>'L',
51396256=>'L',
51406257=>'L',
51416258=>'L',
51426259=>'L',
51436260=>'L',
51446261=>'L',
51456262=>'L',
51466263=>'L',
51476272=>'L',
51486273=>'L',
51496274=>'L',
51506275=>'L',
51516276=>'L',
51526277=>'L',
51536278=>'L',
51546279=>'L',
51556280=>'L',
51566281=>'L',
51576282=>'L',
51586283=>'L',
51596284=>'L',
51606285=>'L',
51616286=>'L',
51626287=>'L',
51636288=>'L',
51646289=>'L',
51656290=>'L',
51666291=>'L',
51676292=>'L',
51686293=>'L',
51696294=>'L',
51706295=>'L',
51716296=>'L',
51726297=>'L',
51736298=>'L',
51746299=>'L',
51756300=>'L',
51766301=>'L',
51776302=>'L',
51786303=>'L',
51796304=>'L',
51806305=>'L',
51816306=>'L',
51826307=>'L',
51836308=>'L',
51846309=>'L',
51856310=>'L',
51866311=>'L',
51876312=>'L',
51886313=>'NSM',
51896400=>'L',
51906401=>'L',
51916402=>'L',
51926403=>'L',
51936404=>'L',
51946405=>'L',
51956406=>'L',
51966407=>'L',
51976408=>'L',
51986409=>'L',
51996410=>'L',
52006411=>'L',
52016412=>'L',
52026413=>'L',
52036414=>'L',
52046415=>'L',
52056416=>'L',
52066417=>'L',
52076418=>'L',
52086419=>'L',
52096420=>'L',
52106421=>'L',
52116422=>'L',
52126423=>'L',
52136424=>'L',
52146425=>'L',
52156426=>'L',
52166427=>'L',
52176428=>'L',
52186432=>'NSM',
52196433=>'NSM',
52206434=>'NSM',
52216435=>'L',
52226436=>'L',
52236437=>'L',
52246438=>'L',
52256439=>'NSM',
52266440=>'NSM',
52276441=>'NSM',
52286442=>'NSM',
52296443=>'NSM',
52306448=>'L',
52316449=>'L',
52326450=>'NSM',
52336451=>'L',
52346452=>'L',
52356453=>'L',
52366454=>'L',
52376455=>'L',
52386456=>'L',
52396457=>'NSM',
52406458=>'NSM',
52416459=>'NSM',
52426464=>'ON',
52436468=>'ON',
52446469=>'ON',
52456470=>'L',
52466471=>'L',
52476472=>'L',
52486473=>'L',
52496474=>'L',
52506475=>'L',
52516476=>'L',
52526477=>'L',
52536478=>'L',
52546479=>'L',
52556480=>'L',
52566481=>'L',
52576482=>'L',
52586483=>'L',
52596484=>'L',
52606485=>'L',
52616486=>'L',
52626487=>'L',
52636488=>'L',
52646489=>'L',
52656490=>'L',
52666491=>'L',
52676492=>'L',
52686493=>'L',
52696494=>'L',
52706495=>'L',
52716496=>'L',
52726497=>'L',
52736498=>'L',
52746499=>'L',
52756500=>'L',
52766501=>'L',
52776502=>'L',
52786503=>'L',
52796504=>'L',
52806505=>'L',
52816506=>'L',
52826507=>'L',
52836508=>'L',
52846509=>'L',
52856512=>'L',
52866513=>'L',
52876514=>'L',
52886515=>'L',
52896516=>'L',
52906528=>'L',
52916529=>'L',
52926530=>'L',
52936531=>'L',
52946532=>'L',
52956533=>'L',
52966534=>'L',
52976535=>'L',
52986536=>'L',
52996537=>'L',
53006538=>'L',
53016539=>'L',
53026540=>'L',
53036541=>'L',
53046542=>'L',
53056543=>'L',
53066544=>'L',
53076545=>'L',
53086546=>'L',
53096547=>'L',
53106548=>'L',
53116549=>'L',
53126550=>'L',
53136551=>'L',
53146552=>'L',
53156553=>'L',
53166554=>'L',
53176555=>'L',
53186556=>'L',
53196557=>'L',
53206558=>'L',
53216559=>'L',
53226560=>'L',
53236561=>'L',
53246562=>'L',
53256563=>'L',
53266564=>'L',
53276565=>'L',
53286566=>'L',
53296567=>'L',
53306568=>'L',
53316569=>'L',
53326576=>'L',
53336577=>'L',
53346578=>'L',
53356579=>'L',
53366580=>'L',
53376581=>'L',
53386582=>'L',
53396583=>'L',
53406584=>'L',
53416585=>'L',
53426586=>'L',
53436587=>'L',
53446588=>'L',
53456589=>'L',
53466590=>'L',
53476591=>'L',
53486592=>'L',
53496593=>'L',
53506594=>'L',
53516595=>'L',
53526596=>'L',
53536597=>'L',
53546598=>'L',
53556599=>'L',
53566600=>'L',
53576601=>'L',
53586608=>'L',
53596609=>'L',
53606610=>'L',
53616611=>'L',
53626612=>'L',
53636613=>'L',
53646614=>'L',
53656615=>'L',
53666616=>'L',
53676617=>'L',
53686622=>'ON',
53696623=>'ON',
53706624=>'ON',
53716625=>'ON',
53726626=>'ON',
53736627=>'ON',
53746628=>'ON',
53756629=>'ON',
53766630=>'ON',
53776631=>'ON',
53786632=>'ON',
53796633=>'ON',
53806634=>'ON',
53816635=>'ON',
53826636=>'ON',
53836637=>'ON',
53846638=>'ON',
53856639=>'ON',
53866640=>'ON',
53876641=>'ON',
53886642=>'ON',
53896643=>'ON',
53906644=>'ON',
53916645=>'ON',
53926646=>'ON',
53936647=>'ON',
53946648=>'ON',
53956649=>'ON',
53966650=>'ON',
53976651=>'ON',
53986652=>'ON',
53996653=>'ON',
54006654=>'ON',
54016655=>'ON',
54026656=>'L',
54036657=>'L',
54046658=>'L',
54056659=>'L',
54066660=>'L',
54076661=>'L',
54086662=>'L',
54096663=>'L',
54106664=>'L',
54116665=>'L',
54126666=>'L',
54136667=>'L',
54146668=>'L',
54156669=>'L',
54166670=>'L',
54176671=>'L',
54186672=>'L',
54196673=>'L',
54206674=>'L',
54216675=>'L',
54226676=>'L',
54236677=>'L',
54246678=>'L',
54256679=>'NSM',
54266680=>'NSM',
54276681=>'L',
54286682=>'L',
54296683=>'L',
54306686=>'L',
54316687=>'L',
54326912=>'NSM',
54336913=>'NSM',
54346914=>'NSM',
54356915=>'NSM',
54366916=>'L',
54376917=>'L',
54386918=>'L',
54396919=>'L',
54406920=>'L',
54416921=>'L',
54426922=>'L',
54436923=>'L',
54446924=>'L',
54456925=>'L',
54466926=>'L',
54476927=>'L',
54486928=>'L',
54496929=>'L',
54506930=>'L',
54516931=>'L',
54526932=>'L',
54536933=>'L',
54546934=>'L',
54556935=>'L',
54566936=>'L',
54576937=>'L',
54586938=>'L',
54596939=>'L',
54606940=>'L',
54616941=>'L',
54626942=>'L',
54636943=>'L',
54646944=>'L',
54656945=>'L',
54666946=>'L',
54676947=>'L',
54686948=>'L',
54696949=>'L',
54706950=>'L',
54716951=>'L',
54726952=>'L',
54736953=>'L',
54746954=>'L',
54756955=>'L',
54766956=>'L',
54776957=>'L',
54786958=>'L',
54796959=>'L',
54806960=>'L',
54816961=>'L',
54826962=>'L',
54836963=>'L',
54846964=>'NSM',
54856965=>'L',
54866966=>'NSM',
54876967=>'NSM',
54886968=>'NSM',
54896969=>'NSM',
54906970=>'NSM',
54916971=>'L',
54926972=>'NSM',
54936973=>'L',
54946974=>'L',
54956975=>'L',
54966976=>'L',
54976977=>'L',
54986978=>'NSM',
54996979=>'L',
55006980=>'L',
55016981=>'L',
55026982=>'L',
55036983=>'L',
55046984=>'L',
55056985=>'L',
55066986=>'L',
55076987=>'L',
55086992=>'L',
55096993=>'L',
55106994=>'L',
55116995=>'L',
55126996=>'L',
55136997=>'L',
55146998=>'L',
55156999=>'L',
55167000=>'L',
55177001=>'L',
55187002=>'L',
55197003=>'L',
55207004=>'L',
55217005=>'L',
55227006=>'L',
55237007=>'L',
55247008=>'L',
55257009=>'L',
55267010=>'L',
55277011=>'L',
55287012=>'L',
55297013=>'L',
55307014=>'L',
55317015=>'L',
55327016=>'L',
55337017=>'L',
55347018=>'L',
55357019=>'NSM',
55367020=>'NSM',
55377021=>'NSM',
55387022=>'NSM',
55397023=>'NSM',
55407024=>'NSM',
55417025=>'NSM',
55427026=>'NSM',
55437027=>'NSM',
55447028=>'L',
55457029=>'L',
55467030=>'L',
55477031=>'L',
55487032=>'L',
55497033=>'L',
55507034=>'L',
55517035=>'L',
55527036=>'L',
55537424=>'L',
55547425=>'L',
55557426=>'L',
55567427=>'L',
55577428=>'L',
55587429=>'L',
55597430=>'L',
55607431=>'L',
55617432=>'L',
55627433=>'L',
55637434=>'L',
55647435=>'L',
55657436=>'L',
55667437=>'L',
55677438=>'L',
55687439=>'L',
55697440=>'L',
55707441=>'L',
55717442=>'L',
55727443=>'L',
55737444=>'L',
55747445=>'L',
55757446=>'L',
55767447=>'L',
55777448=>'L',
55787449=>'L',
55797450=>'L',
55807451=>'L',
55817452=>'L',
55827453=>'L',
55837454=>'L',
55847455=>'L',
55857456=>'L',
55867457=>'L',
55877458=>'L',
55887459=>'L',
55897460=>'L',
55907461=>'L',
55917462=>'L',
55927463=>'L',
55937464=>'L',
55947465=>'L',
55957466=>'L',
55967467=>'L',
55977468=>'L',
55987469=>'L',
55997470=>'L',
56007471=>'L',
56017472=>'L',
56027473=>'L',
56037474=>'L',
56047475=>'L',
56057476=>'L',
56067477=>'L',
56077478=>'L',
56087479=>'L',
56097480=>'L',
56107481=>'L',
56117482=>'L',
56127483=>'L',
56137484=>'L',
56147485=>'L',
56157486=>'L',
56167487=>'L',
56177488=>'L',
56187489=>'L',
56197490=>'L',
56207491=>'L',
56217492=>'L',
56227493=>'L',
56237494=>'L',
56247495=>'L',
56257496=>'L',
56267497=>'L',
56277498=>'L',
56287499=>'L',
56297500=>'L',
56307501=>'L',
56317502=>'L',
56327503=>'L',
56337504=>'L',
56347505=>'L',
56357506=>'L',
56367507=>'L',
56377508=>'L',
56387509=>'L',
56397510=>'L',
56407511=>'L',
56417512=>'L',
56427513=>'L',
56437514=>'L',
56447515=>'L',
56457516=>'L',
56467517=>'L',
56477518=>'L',
56487519=>'L',
56497520=>'L',
56507521=>'L',
56517522=>'L',
56527523=>'L',
56537524=>'L',
56547525=>'L',
56557526=>'L',
56567527=>'L',
56577528=>'L',
56587529=>'L',
56597530=>'L',
56607531=>'L',
56617532=>'L',
56627533=>'L',
56637534=>'L',
56647535=>'L',
56657536=>'L',
56667537=>'L',
56677538=>'L',
56687539=>'L',
56697540=>'L',
56707541=>'L',
56717542=>'L',
56727543=>'L',
56737544=>'L',
56747545=>'L',
56757546=>'L',
56767547=>'L',
56777548=>'L',
56787549=>'L',
56797550=>'L',
56807551=>'L',
56817552=>'L',
56827553=>'L',
56837554=>'L',
56847555=>'L',
56857556=>'L',
56867557=>'L',
56877558=>'L',
56887559=>'L',
56897560=>'L',
56907561=>'L',
56917562=>'L',
56927563=>'L',
56937564=>'L',
56947565=>'L',
56957566=>'L',
56967567=>'L',
56977568=>'L',
56987569=>'L',
56997570=>'L',
57007571=>'L',
57017572=>'L',
57027573=>'L',
57037574=>'L',
57047575=>'L',
57057576=>'L',
57067577=>'L',
57077578=>'L',
57087579=>'L',
57097580=>'L',
57107581=>'L',
57117582=>'L',
57127583=>'L',
57137584=>'L',
57147585=>'L',
57157586=>'L',
57167587=>'L',
57177588=>'L',
57187589=>'L',
57197590=>'L',
57207591=>'L',
57217592=>'L',
57227593=>'L',
57237594=>'L',
57247595=>'L',
57257596=>'L',
57267597=>'L',
57277598=>'L',
57287599=>'L',
57297600=>'L',
57307601=>'L',
57317602=>'L',
57327603=>'L',
57337604=>'L',
57347605=>'L',
57357606=>'L',
57367607=>'L',
57377608=>'L',
57387609=>'L',
57397610=>'L',
57407611=>'L',
57417612=>'L',
57427613=>'L',
57437614=>'L',
57447615=>'L',
57457616=>'NSM',
57467617=>'NSM',
57477618=>'NSM',
57487619=>'NSM',
57497620=>'NSM',
57507621=>'NSM',
57517622=>'NSM',
57527623=>'NSM',
57537624=>'NSM',
57547625=>'NSM',
57557626=>'NSM',
57567678=>'NSM',
57577679=>'NSM',
57587680=>'L',
57597681=>'L',
57607682=>'L',
57617683=>'L',
57627684=>'L',
57637685=>'L',
57647686=>'L',
57657687=>'L',
57667688=>'L',
57677689=>'L',
57687690=>'L',
57697691=>'L',
57707692=>'L',
57717693=>'L',
57727694=>'L',
57737695=>'L',
57747696=>'L',
57757697=>'L',
57767698=>'L',
57777699=>'L',
57787700=>'L',
57797701=>'L',
57807702=>'L',
57817703=>'L',
57827704=>'L',
57837705=>'L',
57847706=>'L',
57857707=>'L',
57867708=>'L',
57877709=>'L',
57887710=>'L',
57897711=>'L',
57907712=>'L',
57917713=>'L',
57927714=>'L',
57937715=>'L',
57947716=>'L',
57957717=>'L',
57967718=>'L',
57977719=>'L',
57987720=>'L',
57997721=>'L',
58007722=>'L',
58017723=>'L',
58027724=>'L',
58037725=>'L',
58047726=>'L',
58057727=>'L',
58067728=>'L',
58077729=>'L',
58087730=>'L',
58097731=>'L',
58107732=>'L',
58117733=>'L',
58127734=>'L',
58137735=>'L',
58147736=>'L',
58157737=>'L',
58167738=>'L',
58177739=>'L',
58187740=>'L',
58197741=>'L',
58207742=>'L',
58217743=>'L',
58227744=>'L',
58237745=>'L',
58247746=>'L',
58257747=>'L',
58267748=>'L',
58277749=>'L',
58287750=>'L',
58297751=>'L',
58307752=>'L',
58317753=>'L',
58327754=>'L',
58337755=>'L',
58347756=>'L',
58357757=>'L',
58367758=>'L',
58377759=>'L',
58387760=>'L',
58397761=>'L',
58407762=>'L',
58417763=>'L',
58427764=>'L',
58437765=>'L',
58447766=>'L',
58457767=>'L',
58467768=>'L',
58477769=>'L',
58487770=>'L',
58497771=>'L',
58507772=>'L',
58517773=>'L',
58527774=>'L',
58537775=>'L',
58547776=>'L',
58557777=>'L',
58567778=>'L',
58577779=>'L',
58587780=>'L',
58597781=>'L',
58607782=>'L',
58617783=>'L',
58627784=>'L',
58637785=>'L',
58647786=>'L',
58657787=>'L',
58667788=>'L',
58677789=>'L',
58687790=>'L',
58697791=>'L',
58707792=>'L',
58717793=>'L',
58727794=>'L',
58737795=>'L',
58747796=>'L',
58757797=>'L',
58767798=>'L',
58777799=>'L',
58787800=>'L',
58797801=>'L',
58807802=>'L',
58817803=>'L',
58827804=>'L',
58837805=>'L',
58847806=>'L',
58857807=>'L',
58867808=>'L',
58877809=>'L',
58887810=>'L',
58897811=>'L',
58907812=>'L',
58917813=>'L',
58927814=>'L',
58937815=>'L',
58947816=>'L',
58957817=>'L',
58967818=>'L',
58977819=>'L',
58987820=>'L',
58997821=>'L',
59007822=>'L',
59017823=>'L',
59027824=>'L',
59037825=>'L',
59047826=>'L',
59057827=>'L',
59067828=>'L',
59077829=>'L',
59087830=>'L',
59097831=>'L',
59107832=>'L',
59117833=>'L',
59127834=>'L',
59137835=>'L',
59147840=>'L',
59157841=>'L',
59167842=>'L',
59177843=>'L',
59187844=>'L',
59197845=>'L',
59207846=>'L',
59217847=>'L',
59227848=>'L',
59237849=>'L',
59247850=>'L',
59257851=>'L',
59267852=>'L',
59277853=>'L',
59287854=>'L',
59297855=>'L',
59307856=>'L',
59317857=>'L',
59327858=>'L',
59337859=>'L',
59347860=>'L',
59357861=>'L',
59367862=>'L',
59377863=>'L',
59387864=>'L',
59397865=>'L',
59407866=>'L',
59417867=>'L',
59427868=>'L',
59437869=>'L',
59447870=>'L',
59457871=>'L',
59467872=>'L',
59477873=>'L',
59487874=>'L',
59497875=>'L',
59507876=>'L',
59517877=>'L',
59527878=>'L',
59537879=>'L',
59547880=>'L',
59557881=>'L',
59567882=>'L',
59577883=>'L',
59587884=>'L',
59597885=>'L',
59607886=>'L',
59617887=>'L',
59627888=>'L',
59637889=>'L',
59647890=>'L',
59657891=>'L',
59667892=>'L',
59677893=>'L',
59687894=>'L',
59697895=>'L',
59707896=>'L',
59717897=>'L',
59727898=>'L',
59737899=>'L',
59747900=>'L',
59757901=>'L',
59767902=>'L',
59777903=>'L',
59787904=>'L',
59797905=>'L',
59807906=>'L',
59817907=>'L',
59827908=>'L',
59837909=>'L',
59847910=>'L',
59857911=>'L',
59867912=>'L',
59877913=>'L',
59887914=>'L',
59897915=>'L',
59907916=>'L',
59917917=>'L',
59927918=>'L',
59937919=>'L',
59947920=>'L',
59957921=>'L',
59967922=>'L',
59977923=>'L',
59987924=>'L',
59997925=>'L',
60007926=>'L',
60017927=>'L',
60027928=>'L',
60037929=>'L',
60047936=>'L',
60057937=>'L',
60067938=>'L',
60077939=>'L',
60087940=>'L',
60097941=>'L',
60107942=>'L',
60117943=>'L',
60127944=>'L',
60137945=>'L',
60147946=>'L',
60157947=>'L',
60167948=>'L',
60177949=>'L',
60187950=>'L',
60197951=>'L',
60207952=>'L',
60217953=>'L',
60227954=>'L',
60237955=>'L',
60247956=>'L',
60257957=>'L',
60267960=>'L',
60277961=>'L',
60287962=>'L',
60297963=>'L',
60307964=>'L',
60317965=>'L',
60327968=>'L',
60337969=>'L',
60347970=>'L',
60357971=>'L',
60367972=>'L',
60377973=>'L',
60387974=>'L',
60397975=>'L',
60407976=>'L',
60417977=>'L',
60427978=>'L',
60437979=>'L',
60447980=>'L',
60457981=>'L',
60467982=>'L',
60477983=>'L',
60487984=>'L',
60497985=>'L',
60507986=>'L',
60517987=>'L',
60527988=>'L',
60537989=>'L',
60547990=>'L',
60557991=>'L',
60567992=>'L',
60577993=>'L',
60587994=>'L',
60597995=>'L',
60607996=>'L',
60617997=>'L',
60627998=>'L',
60637999=>'L',
60648000=>'L',
60658001=>'L',
60668002=>'L',
60678003=>'L',
60688004=>'L',
60698005=>'L',
60708008=>'L',
60718009=>'L',
60728010=>'L',
60738011=>'L',
60748012=>'L',
60758013=>'L',
60768016=>'L',
60778017=>'L',
60788018=>'L',
60798019=>'L',
60808020=>'L',
60818021=>'L',
60828022=>'L',
60838023=>'L',
60848025=>'L',
60858027=>'L',
60868029=>'L',
60878031=>'L',
60888032=>'L',
60898033=>'L',
60908034=>'L',
60918035=>'L',
60928036=>'L',
60938037=>'L',
60948038=>'L',
60958039=>'L',
60968040=>'L',
60978041=>'L',
60988042=>'L',
60998043=>'L',
61008044=>'L',
61018045=>'L',
61028046=>'L',
61038047=>'L',
61048048=>'L',
61058049=>'L',
61068050=>'L',
61078051=>'L',
61088052=>'L',
61098053=>'L',
61108054=>'L',
61118055=>'L',
61128056=>'L',
61138057=>'L',
61148058=>'L',
61158059=>'L',
61168060=>'L',
61178061=>'L',
61188064=>'L',
61198065=>'L',
61208066=>'L',
61218067=>'L',
61228068=>'L',
61238069=>'L',
61248070=>'L',
61258071=>'L',
61268072=>'L',
61278073=>'L',
61288074=>'L',
61298075=>'L',
61308076=>'L',
61318077=>'L',
61328078=>'L',
61338079=>'L',
61348080=>'L',
61358081=>'L',
61368082=>'L',
61378083=>'L',
61388084=>'L',
61398085=>'L',
61408086=>'L',
61418087=>'L',
61428088=>'L',
61438089=>'L',
61448090=>'L',
61458091=>'L',
61468092=>'L',
61478093=>'L',
61488094=>'L',
61498095=>'L',
61508096=>'L',
61518097=>'L',
61528098=>'L',
61538099=>'L',
61548100=>'L',
61558101=>'L',
61568102=>'L',
61578103=>'L',
61588104=>'L',
61598105=>'L',
61608106=>'L',
61618107=>'L',
61628108=>'L',
61638109=>'L',
61648110=>'L',
61658111=>'L',
61668112=>'L',
61678113=>'L',
61688114=>'L',
61698115=>'L',
61708116=>'L',
61718118=>'L',
61728119=>'L',
61738120=>'L',
61748121=>'L',
61758122=>'L',
61768123=>'L',
61778124=>'L',
61788125=>'ON',
61798126=>'L',
61808127=>'ON',
61818128=>'ON',
61828129=>'ON',
61838130=>'L',
61848131=>'L',
61858132=>'L',
61868134=>'L',
61878135=>'L',
61888136=>'L',
61898137=>'L',
61908138=>'L',
61918139=>'L',
61928140=>'L',
61938141=>'ON',
61948142=>'ON',
61958143=>'ON',
61968144=>'L',
61978145=>'L',
61988146=>'L',
61998147=>'L',
62008150=>'L',
62018151=>'L',
62028152=>'L',
62038153=>'L',
62048154=>'L',
62058155=>'L',
62068157=>'ON',
62078158=>'ON',
62088159=>'ON',
62098160=>'L',
62108161=>'L',
62118162=>'L',
62128163=>'L',
62138164=>'L',
62148165=>'L',
62158166=>'L',
62168167=>'L',
62178168=>'L',
62188169=>'L',
62198170=>'L',
62208171=>'L',
62218172=>'L',
62228173=>'ON',
62238174=>'ON',
62248175=>'ON',
62258178=>'L',
62268179=>'L',
62278180=>'L',
62288182=>'L',
62298183=>'L',
62308184=>'L',
62318185=>'L',
62328186=>'L',
62338187=>'L',
62348188=>'L',
62358189=>'ON',
62368190=>'ON',
62378192=>'WS',
62388193=>'WS',
62398194=>'WS',
62408195=>'WS',
62418196=>'WS',
62428197=>'WS',
62438198=>'WS',
62448199=>'WS',
62458200=>'WS',
62468201=>'WS',
62478202=>'WS',
62488203=>'BN',
62498204=>'BN',
62508205=>'BN',
62518206=>'L',
62528207=>'R',
62538208=>'ON',
62548209=>'ON',
62558210=>'ON',
62568211=>'ON',
62578212=>'ON',
62588213=>'ON',
62598214=>'ON',
62608215=>'ON',
62618216=>'ON',
62628217=>'ON',
62638218=>'ON',
62648219=>'ON',
62658220=>'ON',
62668221=>'ON',
62678222=>'ON',
62688223=>'ON',
62698224=>'ON',
62708225=>'ON',
62718226=>'ON',
62728227=>'ON',
62738228=>'ON',
62748229=>'ON',
62758230=>'ON',
62768231=>'ON',
62778232=>'WS',
62788233=>'B',
62798234=>'LRE',
62808235=>'RLE',
62818236=>'PDF',
62828237=>'LRO',
62838238=>'RLO',
62848239=>'CS',
62858240=>'ET',
62868241=>'ET',
62878242=>'ET',
62888243=>'ET',
62898244=>'ET',
62908245=>'ON',
62918246=>'ON',
62928247=>'ON',
62938248=>'ON',
62948249=>'ON',
62958250=>'ON',
62968251=>'ON',
62978252=>'ON',
62988253=>'ON',
62998254=>'ON',
63008255=>'ON',
63018256=>'ON',
63028257=>'ON',
63038258=>'ON',
63048259=>'ON',
63058260=>'CS',
63068261=>'ON',
63078262=>'ON',
63088263=>'ON',
63098264=>'ON',
63108265=>'ON',
63118266=>'ON',
63128267=>'ON',
63138268=>'ON',
63148269=>'ON',
63158270=>'ON',
63168271=>'ON',
63178272=>'ON',
63188273=>'ON',
63198274=>'ON',
63208275=>'ON',
63218276=>'ON',
63228277=>'ON',
63238278=>'ON',
63248279=>'ON',
63258280=>'ON',
63268281=>'ON',
63278282=>'ON',
63288283=>'ON',
63298284=>'ON',
63308285=>'ON',
63318286=>'ON',
63328287=>'WS',
63338288=>'BN',
63348289=>'BN',
63358290=>'BN',
63368291=>'BN',
63378298=>'BN',
63388299=>'BN',
63398300=>'BN',
63408301=>'BN',
63418302=>'BN',
63428303=>'BN',
63438304=>'EN',
63448305=>'L',
63458308=>'EN',
63468309=>'EN',
63478310=>'EN',
63488311=>'EN',
63498312=>'EN',
63508313=>'EN',
63518314=>'ES',
63528315=>'ES',
63538316=>'ON',
63548317=>'ON',
63558318=>'ON',
63568319=>'L',
63578320=>'EN',
63588321=>'EN',
63598322=>'EN',
63608323=>'EN',
63618324=>'EN',
63628325=>'EN',
63638326=>'EN',
63648327=>'EN',
63658328=>'EN',
63668329=>'EN',
63678330=>'ES',
63688331=>'ES',
63698332=>'ON',
63708333=>'ON',
63718334=>'ON',
63728336=>'L',
63738337=>'L',
63748338=>'L',
63758339=>'L',
63768340=>'L',
63778352=>'ET',
63788353=>'ET',
63798354=>'ET',
63808355=>'ET',
63818356=>'ET',
63828357=>'ET',
63838358=>'ET',
63848359=>'ET',
63858360=>'ET',
63868361=>'ET',
63878362=>'ET',
63888363=>'ET',
63898364=>'ET',
63908365=>'ET',
63918366=>'ET',
63928367=>'ET',
63938368=>'ET',
63948369=>'ET',
63958370=>'ET',
63968371=>'ET',
63978372=>'ET',
63988373=>'ET',
63998400=>'NSM',
64008401=>'NSM',
64018402=>'NSM',
64028403=>'NSM',
64038404=>'NSM',
64048405=>'NSM',
64058406=>'NSM',
64068407=>'NSM',
64078408=>'NSM',
64088409=>'NSM',
64098410=>'NSM',
64108411=>'NSM',
64118412=>'NSM',
64128413=>'NSM',
64138414=>'NSM',
64148415=>'NSM',
64158416=>'NSM',
64168417=>'NSM',
64178418=>'NSM',
64188419=>'NSM',
64198420=>'NSM',
64208421=>'NSM',
64218422=>'NSM',
64228423=>'NSM',
64238424=>'NSM',
64248425=>'NSM',
64258426=>'NSM',
64268427=>'NSM',
64278428=>'NSM',
64288429=>'NSM',
64298430=>'NSM',
64308431=>'NSM',
64318448=>'ON',
64328449=>'ON',
64338450=>'L',
64348451=>'ON',
64358452=>'ON',
64368453=>'ON',
64378454=>'ON',
64388455=>'L',
64398456=>'ON',
64408457=>'ON',
64418458=>'L',
64428459=>'L',
64438460=>'L',
64448461=>'L',
64458462=>'L',
64468463=>'L',
64478464=>'L',
64488465=>'L',
64498466=>'L',
64508467=>'L',
64518468=>'ON',
64528469=>'L',
64538470=>'ON',
64548471=>'ON',
64558472=>'ON',
64568473=>'L',
64578474=>'L',
64588475=>'L',
64598476=>'L',
64608477=>'L',
64618478=>'ON',
64628479=>'ON',
64638480=>'ON',
64648481=>'ON',
64658482=>'ON',
64668483=>'ON',
64678484=>'L',
64688485=>'ON',
64698486=>'L',
64708487=>'ON',
64718488=>'L',
64728489=>'ON',
64738490=>'L',
64748491=>'L',
64758492=>'L',
64768493=>'L',
64778494=>'ET',
64788495=>'L',
64798496=>'L',
64808497=>'L',
64818498=>'L',
64828499=>'L',
64838500=>'L',
64848501=>'L',
64858502=>'L',
64868503=>'L',
64878504=>'L',
64888505=>'L',
64898506=>'ON',
64908507=>'ON',
64918508=>'L',
64928509=>'L',
64938510=>'L',
64948511=>'L',
64958512=>'ON',
64968513=>'ON',
64978514=>'ON',
64988515=>'ON',
64998516=>'ON',
65008517=>'L',
65018518=>'L',
65028519=>'L',
65038520=>'L',
65048521=>'L',
65058522=>'ON',
65068523=>'ON',
65078524=>'ON',
65088525=>'ON',
65098526=>'L',
65108531=>'ON',
65118532=>'ON',
65128533=>'ON',
65138534=>'ON',
65148535=>'ON',
65158536=>'ON',
65168537=>'ON',
65178538=>'ON',
65188539=>'ON',
65198540=>'ON',
65208541=>'ON',
65218542=>'ON',
65228543=>'ON',
65238544=>'L',
65248545=>'L',
65258546=>'L',
65268547=>'L',
65278548=>'L',
65288549=>'L',
65298550=>'L',
65308551=>'L',
65318552=>'L',
65328553=>'L',
65338554=>'L',
65348555=>'L',
65358556=>'L',
65368557=>'L',
65378558=>'L',
65388559=>'L',
65398560=>'L',
65408561=>'L',
65418562=>'L',
65428563=>'L',
65438564=>'L',
65448565=>'L',
65458566=>'L',
65468567=>'L',
65478568=>'L',
65488569=>'L',
65498570=>'L',
65508571=>'L',
65518572=>'L',
65528573=>'L',
65538574=>'L',
65548575=>'L',
65558576=>'L',
65568577=>'L',
65578578=>'L',
65588579=>'L',
65598580=>'L',
65608592=>'ON',
65618593=>'ON',
65628594=>'ON',
65638595=>'ON',
65648596=>'ON',
65658597=>'ON',
65668598=>'ON',
65678599=>'ON',
65688600=>'ON',
65698601=>'ON',
65708602=>'ON',
65718603=>'ON',
65728604=>'ON',
65738605=>'ON',
65748606=>'ON',
65758607=>'ON',
65768608=>'ON',
65778609=>'ON',
65788610=>'ON',
65798611=>'ON',
65808612=>'ON',
65818613=>'ON',
65828614=>'ON',
65838615=>'ON',
65848616=>'ON',
65858617=>'ON',
65868618=>'ON',
65878619=>'ON',
65888620=>'ON',
65898621=>'ON',
65908622=>'ON',
65918623=>'ON',
65928624=>'ON',
65938625=>'ON',
65948626=>'ON',
65958627=>'ON',
65968628=>'ON',
65978629=>'ON',
65988630=>'ON',
65998631=>'ON',
66008632=>'ON',
66018633=>'ON',
66028634=>'ON',
66038635=>'ON',
66048636=>'ON',
66058637=>'ON',
66068638=>'ON',
66078639=>'ON',
66088640=>'ON',
66098641=>'ON',
66108642=>'ON',
66118643=>'ON',
66128644=>'ON',
66138645=>'ON',
66148646=>'ON',
66158647=>'ON',
66168648=>'ON',
66178649=>'ON',
66188650=>'ON',
66198651=>'ON',
66208652=>'ON',
66218653=>'ON',
66228654=>'ON',
66238655=>'ON',
66248656=>'ON',
66258657=>'ON',
66268658=>'ON',
66278659=>'ON',
66288660=>'ON',
66298661=>'ON',
66308662=>'ON',
66318663=>'ON',
66328664=>'ON',
66338665=>'ON',
66348666=>'ON',
66358667=>'ON',
66368668=>'ON',
66378669=>'ON',
66388670=>'ON',
66398671=>'ON',
66408672=>'ON',
66418673=>'ON',
66428674=>'ON',
66438675=>'ON',
66448676=>'ON',
66458677=>'ON',
66468678=>'ON',
66478679=>'ON',
66488680=>'ON',
66498681=>'ON',
66508682=>'ON',
66518683=>'ON',
66528684=>'ON',
66538685=>'ON',
66548686=>'ON',
66558687=>'ON',
66568688=>'ON',
66578689=>'ON',
66588690=>'ON',
66598691=>'ON',
66608692=>'ON',
66618693=>'ON',
66628694=>'ON',
66638695=>'ON',
66648696=>'ON',
66658697=>'ON',
66668698=>'ON',
66678699=>'ON',
66688700=>'ON',
66698701=>'ON',
66708702=>'ON',
66718703=>'ON',
66728704=>'ON',
66738705=>'ON',
66748706=>'ON',
66758707=>'ON',
66768708=>'ON',
66778709=>'ON',
66788710=>'ON',
66798711=>'ON',
66808712=>'ON',
66818713=>'ON',
66828714=>'ON',
66838715=>'ON',
66848716=>'ON',
66858717=>'ON',
66868718=>'ON',
66878719=>'ON',
66888720=>'ON',
66898721=>'ON',
66908722=>'ES',
66918723=>'ET',
66928724=>'ON',
66938725=>'ON',
66948726=>'ON',
66958727=>'ON',
66968728=>'ON',
66978729=>'ON',
66988730=>'ON',
66998731=>'ON',
67008732=>'ON',
67018733=>'ON',
67028734=>'ON',
67038735=>'ON',
67048736=>'ON',
67058737=>'ON',
67068738=>'ON',
67078739=>'ON',
67088740=>'ON',
67098741=>'ON',
67108742=>'ON',
67118743=>'ON',
67128744=>'ON',
67138745=>'ON',
67148746=>'ON',
67158747=>'ON',
67168748=>'ON',
67178749=>'ON',
67188750=>'ON',
67198751=>'ON',
67208752=>'ON',
67218753=>'ON',
67228754=>'ON',
67238755=>'ON',
67248756=>'ON',
67258757=>'ON',
67268758=>'ON',
67278759=>'ON',
67288760=>'ON',
67298761=>'ON',
67308762=>'ON',
67318763=>'ON',
67328764=>'ON',
67338765=>'ON',
67348766=>'ON',
67358767=>'ON',
67368768=>'ON',
67378769=>'ON',
67388770=>'ON',
67398771=>'ON',
67408772=>'ON',
67418773=>'ON',
67428774=>'ON',
67438775=>'ON',
67448776=>'ON',
67458777=>'ON',
67468778=>'ON',
67478779=>'ON',
67488780=>'ON',
67498781=>'ON',
67508782=>'ON',
67518783=>'ON',
67528784=>'ON',
67538785=>'ON',
67548786=>'ON',
67558787=>'ON',
67568788=>'ON',
67578789=>'ON',
67588790=>'ON',
67598791=>'ON',
67608792=>'ON',
67618793=>'ON',
67628794=>'ON',
67638795=>'ON',
67648796=>'ON',
67658797=>'ON',
67668798=>'ON',
67678799=>'ON',
67688800=>'ON',
67698801=>'ON',
67708802=>'ON',
67718803=>'ON',
67728804=>'ON',
67738805=>'ON',
67748806=>'ON',
67758807=>'ON',
67768808=>'ON',
67778809=>'ON',
67788810=>'ON',
67798811=>'ON',
67808812=>'ON',
67818813=>'ON',
67828814=>'ON',
67838815=>'ON',
67848816=>'ON',
67858817=>'ON',
67868818=>'ON',
67878819=>'ON',
67888820=>'ON',
67898821=>'ON',
67908822=>'ON',
67918823=>'ON',
67928824=>'ON',
67938825=>'ON',
67948826=>'ON',
67958827=>'ON',
67968828=>'ON',
67978829=>'ON',
67988830=>'ON',
67998831=>'ON',
68008832=>'ON',
68018833=>'ON',
68028834=>'ON',
68038835=>'ON',
68048836=>'ON',
68058837=>'ON',
68068838=>'ON',
68078839=>'ON',
68088840=>'ON',
68098841=>'ON',
68108842=>'ON',
68118843=>'ON',
68128844=>'ON',
68138845=>'ON',
68148846=>'ON',
68158847=>'ON',
68168848=>'ON',
68178849=>'ON',
68188850=>'ON',
68198851=>'ON',
68208852=>'ON',
68218853=>'ON',
68228854=>'ON',
68238855=>'ON',
68248856=>'ON',
68258857=>'ON',
68268858=>'ON',
68278859=>'ON',
68288860=>'ON',
68298861=>'ON',
68308862=>'ON',
68318863=>'ON',
68328864=>'ON',
68338865=>'ON',
68348866=>'ON',
68358867=>'ON',
68368868=>'ON',
68378869=>'ON',
68388870=>'ON',
68398871=>'ON',
68408872=>'ON',
68418873=>'ON',
68428874=>'ON',
68438875=>'ON',
68448876=>'ON',
68458877=>'ON',
68468878=>'ON',
68478879=>'ON',
68488880=>'ON',
68498881=>'ON',
68508882=>'ON',
68518883=>'ON',
68528884=>'ON',
68538885=>'ON',
68548886=>'ON',
68558887=>'ON',
68568888=>'ON',
68578889=>'ON',
68588890=>'ON',
68598891=>'ON',
68608892=>'ON',
68618893=>'ON',
68628894=>'ON',
68638895=>'ON',
68648896=>'ON',
68658897=>'ON',
68668898=>'ON',
68678899=>'ON',
68688900=>'ON',
68698901=>'ON',
68708902=>'ON',
68718903=>'ON',
68728904=>'ON',
68738905=>'ON',
68748906=>'ON',
68758907=>'ON',
68768908=>'ON',
68778909=>'ON',
68788910=>'ON',
68798911=>'ON',
68808912=>'ON',
68818913=>'ON',
68828914=>'ON',
68838915=>'ON',
68848916=>'ON',
68858917=>'ON',
68868918=>'ON',
68878919=>'ON',
68888920=>'ON',
68898921=>'ON',
68908922=>'ON',
68918923=>'ON',
68928924=>'ON',
68938925=>'ON',
68948926=>'ON',
68958927=>'ON',
68968928=>'ON',
68978929=>'ON',
68988930=>'ON',
68998931=>'ON',
69008932=>'ON',
69018933=>'ON',
69028934=>'ON',
69038935=>'ON',
69048936=>'ON',
69058937=>'ON',
69068938=>'ON',
69078939=>'ON',
69088940=>'ON',
69098941=>'ON',
69108942=>'ON',
69118943=>'ON',
69128944=>'ON',
69138945=>'ON',
69148946=>'ON',
69158947=>'ON',
69168948=>'ON',
69178949=>'ON',
69188950=>'ON',
69198951=>'ON',
69208952=>'ON',
69218953=>'ON',
69228954=>'ON',
69238955=>'ON',
69248956=>'ON',
69258957=>'ON',
69268958=>'ON',
69278959=>'ON',
69288960=>'ON',
69298961=>'ON',
69308962=>'ON',
69318963=>'ON',
69328964=>'ON',
69338965=>'ON',
69348966=>'ON',
69358967=>'ON',
69368968=>'ON',
69378969=>'ON',
69388970=>'ON',
69398971=>'ON',
69408972=>'ON',
69418973=>'ON',
69428974=>'ON',
69438975=>'ON',
69448976=>'ON',
69458977=>'ON',
69468978=>'ON',
69478979=>'ON',
69488980=>'ON',
69498981=>'ON',
69508982=>'ON',
69518983=>'ON',
69528984=>'ON',
69538985=>'ON',
69548986=>'ON',
69558987=>'ON',
69568988=>'ON',
69578989=>'ON',
69588990=>'ON',
69598991=>'ON',
69608992=>'ON',
69618993=>'ON',
69628994=>'ON',
69638995=>'ON',
69648996=>'ON',
69658997=>'ON',
69668998=>'ON',
69678999=>'ON',
69689000=>'ON',
69699001=>'ON',
69709002=>'ON',
69719003=>'ON',
69729004=>'ON',
69739005=>'ON',
69749006=>'ON',
69759007=>'ON',
69769008=>'ON',
69779009=>'ON',
69789010=>'ON',
69799011=>'ON',
69809012=>'ON',
69819013=>'ON',
69829014=>'L',
69839015=>'L',
69849016=>'L',
69859017=>'L',
69869018=>'L',
69879019=>'L',
69889020=>'L',
69899021=>'L',
69909022=>'L',
69919023=>'L',
69929024=>'L',
69939025=>'L',
69949026=>'L',
69959027=>'L',
69969028=>'L',
69979029=>'L',
69989030=>'L',
69999031=>'L',
70009032=>'L',
70019033=>'L',
70029034=>'L',
70039035=>'L',
70049036=>'L',
70059037=>'L',
70069038=>'L',
70079039=>'L',
70089040=>'L',
70099041=>'L',
70109042=>'L',
70119043=>'L',
70129044=>'L',
70139045=>'L',
70149046=>'L',
70159047=>'L',
70169048=>'L',
70179049=>'L',
70189050=>'L',
70199051=>'L',
70209052=>'L',
70219053=>'L',
70229054=>'L',
70239055=>'L',
70249056=>'L',
70259057=>'L',
70269058=>'L',
70279059=>'L',
70289060=>'L',
70299061=>'L',
70309062=>'L',
70319063=>'L',
70329064=>'L',
70339065=>'L',
70349066=>'L',
70359067=>'L',
70369068=>'L',
70379069=>'L',
70389070=>'L',
70399071=>'L',
70409072=>'L',
70419073=>'L',
70429074=>'L',
70439075=>'L',
70449076=>'L',
70459077=>'L',
70469078=>'L',
70479079=>'L',
70489080=>'L',
70499081=>'L',
70509082=>'L',
70519083=>'ON',
70529084=>'ON',
70539085=>'ON',
70549086=>'ON',
70559087=>'ON',
70569088=>'ON',
70579089=>'ON',
70589090=>'ON',
70599091=>'ON',
70609092=>'ON',
70619093=>'ON',
70629094=>'ON',
70639095=>'ON',
70649096=>'ON',
70659097=>'ON',
70669098=>'ON',
70679099=>'ON',
70689100=>'ON',
70699101=>'ON',
70709102=>'ON',
70719103=>'ON',
70729104=>'ON',
70739105=>'ON',
70749106=>'ON',
70759107=>'ON',
70769108=>'ON',
70779109=>'L',
70789110=>'ON',
70799111=>'ON',
70809112=>'ON',
70819113=>'ON',
70829114=>'ON',
70839115=>'ON',
70849116=>'ON',
70859117=>'ON',
70869118=>'ON',
70879119=>'ON',
70889120=>'ON',
70899121=>'ON',
70909122=>'ON',
70919123=>'ON',
70929124=>'ON',
70939125=>'ON',
70949126=>'ON',
70959127=>'ON',
70969128=>'ON',
70979129=>'ON',
70989130=>'ON',
70999131=>'ON',
71009132=>'ON',
71019133=>'ON',
71029134=>'ON',
71039135=>'ON',
71049136=>'ON',
71059137=>'ON',
71069138=>'ON',
71079139=>'ON',
71089140=>'ON',
71099141=>'ON',
71109142=>'ON',
71119143=>'ON',
71129144=>'ON',
71139145=>'ON',
71149146=>'ON',
71159147=>'ON',
71169148=>'ON',
71179149=>'ON',
71189150=>'ON',
71199151=>'ON',
71209152=>'ON',
71219153=>'ON',
71229154=>'ON',
71239155=>'ON',
71249156=>'ON',
71259157=>'ON',
71269158=>'ON',
71279159=>'ON',
71289160=>'ON',
71299161=>'ON',
71309162=>'ON',
71319163=>'ON',
71329164=>'ON',
71339165=>'ON',
71349166=>'ON',
71359167=>'ON',
71369168=>'ON',
71379169=>'ON',
71389170=>'ON',
71399171=>'ON',
71409172=>'ON',
71419173=>'ON',
71429174=>'ON',
71439175=>'ON',
71449176=>'ON',
71459177=>'ON',
71469178=>'ON',
71479179=>'ON',
71489180=>'ON',
71499181=>'ON',
71509182=>'ON',
71519183=>'ON',
71529184=>'ON',
71539185=>'ON',
71549186=>'ON',
71559187=>'ON',
71569188=>'ON',
71579189=>'ON',
71589190=>'ON',
71599191=>'ON',
71609216=>'ON',
71619217=>'ON',
71629218=>'ON',
71639219=>'ON',
71649220=>'ON',
71659221=>'ON',
71669222=>'ON',
71679223=>'ON',
71689224=>'ON',
71699225=>'ON',
71709226=>'ON',
71719227=>'ON',
71729228=>'ON',
71739229=>'ON',
71749230=>'ON',
71759231=>'ON',
71769232=>'ON',
71779233=>'ON',
71789234=>'ON',
71799235=>'ON',
71809236=>'ON',
71819237=>'ON',
71829238=>'ON',
71839239=>'ON',
71849240=>'ON',
71859241=>'ON',
71869242=>'ON',
71879243=>'ON',
71889244=>'ON',
71899245=>'ON',
71909246=>'ON',
71919247=>'ON',
71929248=>'ON',
71939249=>'ON',
71949250=>'ON',
71959251=>'ON',
71969252=>'ON',
71979253=>'ON',
71989254=>'ON',
71999280=>'ON',
72009281=>'ON',
72019282=>'ON',
72029283=>'ON',
72039284=>'ON',
72049285=>'ON',
72059286=>'ON',
72069287=>'ON',
72079288=>'ON',
72089289=>'ON',
72099290=>'ON',
72109312=>'ON',
72119313=>'ON',
72129314=>'ON',
72139315=>'ON',
72149316=>'ON',
72159317=>'ON',
72169318=>'ON',
72179319=>'ON',
72189320=>'ON',
72199321=>'ON',
72209322=>'ON',
72219323=>'ON',
72229324=>'ON',
72239325=>'ON',
72249326=>'ON',
72259327=>'ON',
72269328=>'ON',
72279329=>'ON',
72289330=>'ON',
72299331=>'ON',
72309332=>'ON',
72319333=>'ON',
72329334=>'ON',
72339335=>'ON',
72349336=>'ON',
72359337=>'ON',
72369338=>'ON',
72379339=>'ON',
72389340=>'ON',
72399341=>'ON',
72409342=>'ON',
72419343=>'ON',
72429344=>'ON',
72439345=>'ON',
72449346=>'ON',
72459347=>'ON',
72469348=>'ON',
72479349=>'ON',
72489350=>'ON',
72499351=>'ON',
72509352=>'EN',
72519353=>'EN',
72529354=>'EN',
72539355=>'EN',
72549356=>'EN',
72559357=>'EN',
72569358=>'EN',
72579359=>'EN',
72589360=>'EN',
72599361=>'EN',
72609362=>'EN',
72619363=>'EN',
72629364=>'EN',
72639365=>'EN',
72649366=>'EN',
72659367=>'EN',
72669368=>'EN',
72679369=>'EN',
72689370=>'EN',
72699371=>'EN',
72709372=>'L',
72719373=>'L',
72729374=>'L',
72739375=>'L',
72749376=>'L',
72759377=>'L',
72769378=>'L',
72779379=>'L',
72789380=>'L',
72799381=>'L',
72809382=>'L',
72819383=>'L',
72829384=>'L',
72839385=>'L',
72849386=>'L',
72859387=>'L',
72869388=>'L',
72879389=>'L',
72889390=>'L',
72899391=>'L',
72909392=>'L',
72919393=>'L',
72929394=>'L',
72939395=>'L',
72949396=>'L',
72959397=>'L',
72969398=>'L',
72979399=>'L',
72989400=>'L',
72999401=>'L',
73009402=>'L',
73019403=>'L',
73029404=>'L',
73039405=>'L',
73049406=>'L',
73059407=>'L',
73069408=>'L',
73079409=>'L',
73089410=>'L',
73099411=>'L',
73109412=>'L',
73119413=>'L',
73129414=>'L',
73139415=>'L',
73149416=>'L',
73159417=>'L',
73169418=>'L',
73179419=>'L',
73189420=>'L',
73199421=>'L',
73209422=>'L',
73219423=>'L',
73229424=>'L',
73239425=>'L',
73249426=>'L',
73259427=>'L',
73269428=>'L',
73279429=>'L',
73289430=>'L',
73299431=>'L',
73309432=>'L',
73319433=>'L',
73329434=>'L',
73339435=>'L',
73349436=>'L',
73359437=>'L',
73369438=>'L',
73379439=>'L',
73389440=>'L',
73399441=>'L',
73409442=>'L',
73419443=>'L',
73429444=>'L',
73439445=>'L',
73449446=>'L',
73459447=>'L',
73469448=>'L',
73479449=>'L',
73489450=>'ON',
73499451=>'ON',
73509452=>'ON',
73519453=>'ON',
73529454=>'ON',
73539455=>'ON',
73549456=>'ON',
73559457=>'ON',
73569458=>'ON',
73579459=>'ON',
73589460=>'ON',
73599461=>'ON',
73609462=>'ON',
73619463=>'ON',
73629464=>'ON',
73639465=>'ON',
73649466=>'ON',
73659467=>'ON',
73669468=>'ON',
73679469=>'ON',
73689470=>'ON',
73699471=>'ON',
73709472=>'ON',
73719473=>'ON',
73729474=>'ON',
73739475=>'ON',
73749476=>'ON',
73759477=>'ON',
73769478=>'ON',
73779479=>'ON',
73789480=>'ON',
73799481=>'ON',
73809482=>'ON',
73819483=>'ON',
73829484=>'ON',
73839485=>'ON',
73849486=>'ON',
73859487=>'ON',
73869488=>'ON',
73879489=>'ON',
73889490=>'ON',
73899491=>'ON',
73909492=>'ON',
73919493=>'ON',
73929494=>'ON',
73939495=>'ON',
73949496=>'ON',
73959497=>'ON',
73969498=>'ON',
73979499=>'ON',
73989500=>'ON',
73999501=>'ON',
74009502=>'ON',
74019503=>'ON',
74029504=>'ON',
74039505=>'ON',
74049506=>'ON',
74059507=>'ON',
74069508=>'ON',
74079509=>'ON',
74089510=>'ON',
74099511=>'ON',
74109512=>'ON',
74119513=>'ON',
74129514=>'ON',
74139515=>'ON',
74149516=>'ON',
74159517=>'ON',
74169518=>'ON',
74179519=>'ON',
74189520=>'ON',
74199521=>'ON',
74209522=>'ON',
74219523=>'ON',
74229524=>'ON',
74239525=>'ON',
74249526=>'ON',
74259527=>'ON',
74269528=>'ON',
74279529=>'ON',
74289530=>'ON',
74299531=>'ON',
74309532=>'ON',
74319533=>'ON',
74329534=>'ON',
74339535=>'ON',
74349536=>'ON',
74359537=>'ON',
74369538=>'ON',
74379539=>'ON',
74389540=>'ON',
74399541=>'ON',
74409542=>'ON',
74419543=>'ON',
74429544=>'ON',
74439545=>'ON',
74449546=>'ON',
74459547=>'ON',
74469548=>'ON',
74479549=>'ON',
74489550=>'ON',
74499551=>'ON',
74509552=>'ON',
74519553=>'ON',
74529554=>'ON',
74539555=>'ON',
74549556=>'ON',
74559557=>'ON',
74569558=>'ON',
74579559=>'ON',
74589560=>'ON',
74599561=>'ON',
74609562=>'ON',
74619563=>'ON',
74629564=>'ON',
74639565=>'ON',
74649566=>'ON',
74659567=>'ON',
74669568=>'ON',
74679569=>'ON',
74689570=>'ON',
74699571=>'ON',
74709572=>'ON',
74719573=>'ON',
74729574=>'ON',
74739575=>'ON',
74749576=>'ON',
74759577=>'ON',
74769578=>'ON',
74779579=>'ON',
74789580=>'ON',
74799581=>'ON',
74809582=>'ON',
74819583=>'ON',
74829584=>'ON',
74839585=>'ON',
74849586=>'ON',
74859587=>'ON',
74869588=>'ON',
74879589=>'ON',
74889590=>'ON',
74899591=>'ON',
74909592=>'ON',
74919593=>'ON',
74929594=>'ON',
74939595=>'ON',
74949596=>'ON',
74959597=>'ON',
74969598=>'ON',
74979599=>'ON',
74989600=>'ON',
74999601=>'ON',
75009602=>'ON',
75019603=>'ON',
75029604=>'ON',
75039605=>'ON',
75049606=>'ON',
75059607=>'ON',
75069608=>'ON',
75079609=>'ON',
75089610=>'ON',
75099611=>'ON',
75109612=>'ON',
75119613=>'ON',
75129614=>'ON',
75139615=>'ON',
75149616=>'ON',
75159617=>'ON',
75169618=>'ON',
75179619=>'ON',
75189620=>'ON',
75199621=>'ON',
75209622=>'ON',
75219623=>'ON',
75229624=>'ON',
75239625=>'ON',
75249626=>'ON',
75259627=>'ON',
75269628=>'ON',
75279629=>'ON',
75289630=>'ON',
75299631=>'ON',
75309632=>'ON',
75319633=>'ON',
75329634=>'ON',
75339635=>'ON',
75349636=>'ON',
75359637=>'ON',
75369638=>'ON',
75379639=>'ON',
75389640=>'ON',
75399641=>'ON',
75409642=>'ON',
75419643=>'ON',
75429644=>'ON',
75439645=>'ON',
75449646=>'ON',
75459647=>'ON',
75469648=>'ON',
75479649=>'ON',
75489650=>'ON',
75499651=>'ON',
75509652=>'ON',
75519653=>'ON',
75529654=>'ON',
75539655=>'ON',
75549656=>'ON',
75559657=>'ON',
75569658=>'ON',
75579659=>'ON',
75589660=>'ON',
75599661=>'ON',
75609662=>'ON',
75619663=>'ON',
75629664=>'ON',
75639665=>'ON',
75649666=>'ON',
75659667=>'ON',
75669668=>'ON',
75679669=>'ON',
75689670=>'ON',
75699671=>'ON',
75709672=>'ON',
75719673=>'ON',
75729674=>'ON',
75739675=>'ON',
75749676=>'ON',
75759677=>'ON',
75769678=>'ON',
75779679=>'ON',
75789680=>'ON',
75799681=>'ON',
75809682=>'ON',
75819683=>'ON',
75829684=>'ON',
75839685=>'ON',
75849686=>'ON',
75859687=>'ON',
75869688=>'ON',
75879689=>'ON',
75889690=>'ON',
75899691=>'ON',
75909692=>'ON',
75919693=>'ON',
75929694=>'ON',
75939695=>'ON',
75949696=>'ON',
75959697=>'ON',
75969698=>'ON',
75979699=>'ON',
75989700=>'ON',
75999701=>'ON',
76009702=>'ON',
76019703=>'ON',
76029704=>'ON',
76039705=>'ON',
76049706=>'ON',
76059707=>'ON',
76069708=>'ON',
76079709=>'ON',
76089710=>'ON',
76099711=>'ON',
76109712=>'ON',
76119713=>'ON',
76129714=>'ON',
76139715=>'ON',
76149716=>'ON',
76159717=>'ON',
76169718=>'ON',
76179719=>'ON',
76189720=>'ON',
76199721=>'ON',
76209722=>'ON',
76219723=>'ON',
76229724=>'ON',
76239725=>'ON',
76249726=>'ON',
76259727=>'ON',
76269728=>'ON',
76279729=>'ON',
76289730=>'ON',
76299731=>'ON',
76309732=>'ON',
76319733=>'ON',
76329734=>'ON',
76339735=>'ON',
76349736=>'ON',
76359737=>'ON',
76369738=>'ON',
76379739=>'ON',
76389740=>'ON',
76399741=>'ON',
76409742=>'ON',
76419743=>'ON',
76429744=>'ON',
76439745=>'ON',
76449746=>'ON',
76459747=>'ON',
76469748=>'ON',
76479749=>'ON',
76489750=>'ON',
76499751=>'ON',
76509752=>'ON',
76519753=>'ON',
76529754=>'ON',
76539755=>'ON',
76549756=>'ON',
76559757=>'ON',
76569758=>'ON',
76579759=>'ON',
76589760=>'ON',
76599761=>'ON',
76609762=>'ON',
76619763=>'ON',
76629764=>'ON',
76639765=>'ON',
76649766=>'ON',
76659767=>'ON',
76669768=>'ON',
76679769=>'ON',
76689770=>'ON',
76699771=>'ON',
76709772=>'ON',
76719773=>'ON',
76729774=>'ON',
76739775=>'ON',
76749776=>'ON',
76759777=>'ON',
76769778=>'ON',
76779779=>'ON',
76789780=>'ON',
76799781=>'ON',
76809782=>'ON',
76819783=>'ON',
76829784=>'ON',
76839785=>'ON',
76849786=>'ON',
76859787=>'ON',
76869788=>'ON',
76879789=>'ON',
76889790=>'ON',
76899791=>'ON',
76909792=>'ON',
76919793=>'ON',
76929794=>'ON',
76939795=>'ON',
76949796=>'ON',
76959797=>'ON',
76969798=>'ON',
76979799=>'ON',
76989800=>'ON',
76999801=>'ON',
77009802=>'ON',
77019803=>'ON',
77029804=>'ON',
77039805=>'ON',
77049806=>'ON',
77059807=>'ON',
77069808=>'ON',
77079809=>'ON',
77089810=>'ON',
77099811=>'ON',
77109812=>'ON',
77119813=>'ON',
77129814=>'ON',
77139815=>'ON',
77149816=>'ON',
77159817=>'ON',
77169818=>'ON',
77179819=>'ON',
77189820=>'ON',
77199821=>'ON',
77209822=>'ON',
77219823=>'ON',
77229824=>'ON',
77239825=>'ON',
77249826=>'ON',
77259827=>'ON',
77269828=>'ON',
77279829=>'ON',
77289830=>'ON',
77299831=>'ON',
77309832=>'ON',
77319833=>'ON',
77329834=>'ON',
77339835=>'ON',
77349836=>'ON',
77359837=>'ON',
77369838=>'ON',
77379839=>'ON',
77389840=>'ON',
77399841=>'ON',
77409842=>'ON',
77419843=>'ON',
77429844=>'ON',
77439845=>'ON',
77449846=>'ON',
77459847=>'ON',
77469848=>'ON',
77479849=>'ON',
77489850=>'ON',
77499851=>'ON',
77509852=>'ON',
77519853=>'ON',
77529854=>'ON',
77539855=>'ON',
77549856=>'ON',
77559857=>'ON',
77569858=>'ON',
77579859=>'ON',
77589860=>'ON',
77599861=>'ON',
77609862=>'ON',
77619863=>'ON',
77629864=>'ON',
77639865=>'ON',
77649866=>'ON',
77659867=>'ON',
77669868=>'ON',
77679869=>'ON',
77689870=>'ON',
77699871=>'ON',
77709872=>'ON',
77719873=>'ON',
77729874=>'ON',
77739875=>'ON',
77749876=>'ON',
77759877=>'ON',
77769878=>'ON',
77779879=>'ON',
77789880=>'ON',
77799881=>'ON',
77809882=>'ON',
77819883=>'ON',
77829884=>'ON',
77839888=>'ON',
77849889=>'ON',
77859890=>'ON',
77869891=>'ON',
77879892=>'ON',
77889893=>'ON',
77899894=>'ON',
77909895=>'ON',
77919896=>'ON',
77929897=>'ON',
77939898=>'ON',
77949899=>'ON',
77959900=>'L',
77969901=>'ON',
77979902=>'ON',
77989903=>'ON',
77999904=>'ON',
78009905=>'ON',
78019906=>'ON',
78029985=>'ON',
78039986=>'ON',
78049987=>'ON',
78059988=>'ON',
78069990=>'ON',
78079991=>'ON',
78089992=>'ON',
78099993=>'ON',
78109996=>'ON',
78119997=>'ON',
78129998=>'ON',
78139999=>'ON',
781410000=>'ON',
781510001=>'ON',
781610002=>'ON',
781710003=>'ON',
781810004=>'ON',
781910005=>'ON',
782010006=>'ON',
782110007=>'ON',
782210008=>'ON',
782310009=>'ON',
782410010=>'ON',
782510011=>'ON',
782610012=>'ON',
782710013=>'ON',
782810014=>'ON',
782910015=>'ON',
783010016=>'ON',
783110017=>'ON',
783210018=>'ON',
783310019=>'ON',
783410020=>'ON',
783510021=>'ON',
783610022=>'ON',
783710023=>'ON',
783810025=>'ON',
783910026=>'ON',
784010027=>'ON',
784110028=>'ON',
784210029=>'ON',
784310030=>'ON',
784410031=>'ON',
784510032=>'ON',
784610033=>'ON',
784710034=>'ON',
784810035=>'ON',
784910036=>'ON',
785010037=>'ON',
785110038=>'ON',
785210039=>'ON',
785310040=>'ON',
785410041=>'ON',
785510042=>'ON',
785610043=>'ON',
785710044=>'ON',
785810045=>'ON',
785910046=>'ON',
786010047=>'ON',
786110048=>'ON',
786210049=>'ON',
786310050=>'ON',
786410051=>'ON',
786510052=>'ON',
786610053=>'ON',
786710054=>'ON',
786810055=>'ON',
786910056=>'ON',
787010057=>'ON',
787110058=>'ON',
787210059=>'ON',
787310061=>'ON',
787410063=>'ON',
787510064=>'ON',
787610065=>'ON',
787710066=>'ON',
787810070=>'ON',
787910072=>'ON',
788010073=>'ON',
788110074=>'ON',
788210075=>'ON',
788310076=>'ON',
788410077=>'ON',
788510078=>'ON',
788610081=>'ON',
788710082=>'ON',
788810083=>'ON',
788910084=>'ON',
789010085=>'ON',
789110086=>'ON',
789210087=>'ON',
789310088=>'ON',
789410089=>'ON',
789510090=>'ON',
789610091=>'ON',
789710092=>'ON',
789810093=>'ON',
789910094=>'ON',
790010095=>'ON',
790110096=>'ON',
790210097=>'ON',
790310098=>'ON',
790410099=>'ON',
790510100=>'ON',
790610101=>'ON',
790710102=>'ON',
790810103=>'ON',
790910104=>'ON',
791010105=>'ON',
791110106=>'ON',
791210107=>'ON',
791310108=>'ON',
791410109=>'ON',
791510110=>'ON',
791610111=>'ON',
791710112=>'ON',
791810113=>'ON',
791910114=>'ON',
792010115=>'ON',
792110116=>'ON',
792210117=>'ON',
792310118=>'ON',
792410119=>'ON',
792510120=>'ON',
792610121=>'ON',
792710122=>'ON',
792810123=>'ON',
792910124=>'ON',
793010125=>'ON',
793110126=>'ON',
793210127=>'ON',
793310128=>'ON',
793410129=>'ON',
793510130=>'ON',
793610131=>'ON',
793710132=>'ON',
793810136=>'ON',
793910137=>'ON',
794010138=>'ON',
794110139=>'ON',
794210140=>'ON',
794310141=>'ON',
794410142=>'ON',
794510143=>'ON',
794610144=>'ON',
794710145=>'ON',
794810146=>'ON',
794910147=>'ON',
795010148=>'ON',
795110149=>'ON',
795210150=>'ON',
795310151=>'ON',
795410152=>'ON',
795510153=>'ON',
795610154=>'ON',
795710155=>'ON',
795810156=>'ON',
795910157=>'ON',
796010158=>'ON',
796110159=>'ON',
796210161=>'ON',
796310162=>'ON',
796410163=>'ON',
796510164=>'ON',
796610165=>'ON',
796710166=>'ON',
796810167=>'ON',
796910168=>'ON',
797010169=>'ON',
797110170=>'ON',
797210171=>'ON',
797310172=>'ON',
797410173=>'ON',
797510174=>'ON',
797610176=>'ON',
797710177=>'ON',
797810178=>'ON',
797910179=>'ON',
798010180=>'ON',
798110181=>'ON',
798210182=>'ON',
798310183=>'ON',
798410184=>'ON',
798510185=>'ON',
798610186=>'ON',
798710192=>'ON',
798810193=>'ON',
798910194=>'ON',
799010195=>'ON',
799110196=>'ON',
799210197=>'ON',
799310198=>'ON',
799410199=>'ON',
799510200=>'ON',
799610201=>'ON',
799710202=>'ON',
799810203=>'ON',
799910204=>'ON',
800010205=>'ON',
800110206=>'ON',
800210207=>'ON',
800310208=>'ON',
800410209=>'ON',
800510210=>'ON',
800610211=>'ON',
800710212=>'ON',
800810213=>'ON',
800910214=>'ON',
801010215=>'ON',
801110216=>'ON',
801210217=>'ON',
801310218=>'ON',
801410219=>'ON',
801510224=>'ON',
801610225=>'ON',
801710226=>'ON',
801810227=>'ON',
801910228=>'ON',
802010229=>'ON',
802110230=>'ON',
802210231=>'ON',
802310232=>'ON',
802410233=>'ON',
802510234=>'ON',
802610235=>'ON',
802710236=>'ON',
802810237=>'ON',
802910238=>'ON',
803010239=>'ON',
803110240=>'L',
803210241=>'L',
803310242=>'L',
803410243=>'L',
803510244=>'L',
803610245=>'L',
803710246=>'L',
803810247=>'L',
803910248=>'L',
804010249=>'L',
804110250=>'L',
804210251=>'L',
804310252=>'L',
804410253=>'L',
804510254=>'L',
804610255=>'L',
804710256=>'L',
804810257=>'L',
804910258=>'L',
805010259=>'L',
805110260=>'L',
805210261=>'L',
805310262=>'L',
805410263=>'L',
805510264=>'L',
805610265=>'L',
805710266=>'L',
805810267=>'L',
805910268=>'L',
806010269=>'L',
806110270=>'L',
806210271=>'L',
806310272=>'L',
806410273=>'L',
806510274=>'L',
806610275=>'L',
806710276=>'L',
806810277=>'L',
806910278=>'L',
807010279=>'L',
807110280=>'L',
807210281=>'L',
807310282=>'L',
807410283=>'L',
807510284=>'L',
807610285=>'L',
807710286=>'L',
807810287=>'L',
807910288=>'L',
808010289=>'L',
808110290=>'L',
808210291=>'L',
808310292=>'L',
808410293=>'L',
808510294=>'L',
808610295=>'L',
808710296=>'L',
808810297=>'L',
808910298=>'L',
809010299=>'L',
809110300=>'L',
809210301=>'L',
809310302=>'L',
809410303=>'L',
809510304=>'L',
809610305=>'L',
809710306=>'L',
809810307=>'L',
809910308=>'L',
810010309=>'L',
810110310=>'L',
810210311=>'L',
810310312=>'L',
810410313=>'L',
810510314=>'L',
810610315=>'L',
810710316=>'L',
810810317=>'L',
810910318=>'L',
811010319=>'L',
811110320=>'L',
811210321=>'L',
811310322=>'L',
811410323=>'L',
811510324=>'L',
811610325=>'L',
811710326=>'L',
811810327=>'L',
811910328=>'L',
812010329=>'L',
812110330=>'L',
812210331=>'L',
812310332=>'L',
812410333=>'L',
812510334=>'L',
812610335=>'L',
812710336=>'L',
812810337=>'L',
812910338=>'L',
813010339=>'L',
813110340=>'L',
813210341=>'L',
813310342=>'L',
813410343=>'L',
813510344=>'L',
813610345=>'L',
813710346=>'L',
813810347=>'L',
813910348=>'L',
814010349=>'L',
814110350=>'L',
814210351=>'L',
814310352=>'L',
814410353=>'L',
814510354=>'L',
814610355=>'L',
814710356=>'L',
814810357=>'L',
814910358=>'L',
815010359=>'L',
815110360=>'L',
815210361=>'L',
815310362=>'L',
815410363=>'L',
815510364=>'L',
815610365=>'L',
815710366=>'L',
815810367=>'L',
815910368=>'L',
816010369=>'L',
816110370=>'L',
816210371=>'L',
816310372=>'L',
816410373=>'L',
816510374=>'L',
816610375=>'L',
816710376=>'L',
816810377=>'L',
816910378=>'L',
817010379=>'L',
817110380=>'L',
817210381=>'L',
817310382=>'L',
817410383=>'L',
817510384=>'L',
817610385=>'L',
817710386=>'L',
817810387=>'L',
817910388=>'L',
818010389=>'L',
818110390=>'L',
818210391=>'L',
818310392=>'L',
818410393=>'L',
818510394=>'L',
818610395=>'L',
818710396=>'L',
818810397=>'L',
818910398=>'L',
819010399=>'L',
819110400=>'L',
819210401=>'L',
819310402=>'L',
819410403=>'L',
819510404=>'L',
819610405=>'L',
819710406=>'L',
819810407=>'L',
819910408=>'L',
820010409=>'L',
820110410=>'L',
820210411=>'L',
820310412=>'L',
820410413=>'L',
820510414=>'L',
820610415=>'L',
820710416=>'L',
820810417=>'L',
820910418=>'L',
821010419=>'L',
821110420=>'L',
821210421=>'L',
821310422=>'L',
821410423=>'L',
821510424=>'L',
821610425=>'L',
821710426=>'L',
821810427=>'L',
821910428=>'L',
822010429=>'L',
822110430=>'L',
822210431=>'L',
822310432=>'L',
822410433=>'L',
822510434=>'L',
822610435=>'L',
822710436=>'L',
822810437=>'L',
822910438=>'L',
823010439=>'L',
823110440=>'L',
823210441=>'L',
823310442=>'L',
823410443=>'L',
823510444=>'L',
823610445=>'L',
823710446=>'L',
823810447=>'L',
823910448=>'L',
824010449=>'L',
824110450=>'L',
824210451=>'L',
824310452=>'L',
824410453=>'L',
824510454=>'L',
824610455=>'L',
824710456=>'L',
824810457=>'L',
824910458=>'L',
825010459=>'L',
825110460=>'L',
825210461=>'L',
825310462=>'L',
825410463=>'L',
825510464=>'L',
825610465=>'L',
825710466=>'L',
825810467=>'L',
825910468=>'L',
826010469=>'L',
826110470=>'L',
826210471=>'L',
826310472=>'L',
826410473=>'L',
826510474=>'L',
826610475=>'L',
826710476=>'L',
826810477=>'L',
826910478=>'L',
827010479=>'L',
827110480=>'L',
827210481=>'L',
827310482=>'L',
827410483=>'L',
827510484=>'L',
827610485=>'L',
827710486=>'L',
827810487=>'L',
827910488=>'L',
828010489=>'L',
828110490=>'L',
828210491=>'L',
828310492=>'L',
828410493=>'L',
828510494=>'L',
828610495=>'L',
828710496=>'ON',
828810497=>'ON',
828910498=>'ON',
829010499=>'ON',
829110500=>'ON',
829210501=>'ON',
829310502=>'ON',
829410503=>'ON',
829510504=>'ON',
829610505=>'ON',
829710506=>'ON',
829810507=>'ON',
829910508=>'ON',
830010509=>'ON',
830110510=>'ON',
830210511=>'ON',
830310512=>'ON',
830410513=>'ON',
830510514=>'ON',
830610515=>'ON',
830710516=>'ON',
830810517=>'ON',
830910518=>'ON',
831010519=>'ON',
831110520=>'ON',
831210521=>'ON',
831310522=>'ON',
831410523=>'ON',
831510524=>'ON',
831610525=>'ON',
831710526=>'ON',
831810527=>'ON',
831910528=>'ON',
832010529=>'ON',
832110530=>'ON',
832210531=>'ON',
832310532=>'ON',
832410533=>'ON',
832510534=>'ON',
832610535=>'ON',
832710536=>'ON',
832810537=>'ON',
832910538=>'ON',
833010539=>'ON',
833110540=>'ON',
833210541=>'ON',
833310542=>'ON',
833410543=>'ON',
833510544=>'ON',
833610545=>'ON',
833710546=>'ON',
833810547=>'ON',
833910548=>'ON',
834010549=>'ON',
834110550=>'ON',
834210551=>'ON',
834310552=>'ON',
834410553=>'ON',
834510554=>'ON',
834610555=>'ON',
834710556=>'ON',
834810557=>'ON',
834910558=>'ON',
835010559=>'ON',
835110560=>'ON',
835210561=>'ON',
835310562=>'ON',
835410563=>'ON',
835510564=>'ON',
835610565=>'ON',
835710566=>'ON',
835810567=>'ON',
835910568=>'ON',
836010569=>'ON',
836110570=>'ON',
836210571=>'ON',
836310572=>'ON',
836410573=>'ON',
836510574=>'ON',
836610575=>'ON',
836710576=>'ON',
836810577=>'ON',
836910578=>'ON',
837010579=>'ON',
837110580=>'ON',
837210581=>'ON',
837310582=>'ON',
837410583=>'ON',
837510584=>'ON',
837610585=>'ON',
837710586=>'ON',
837810587=>'ON',
837910588=>'ON',
838010589=>'ON',
838110590=>'ON',
838210591=>'ON',
838310592=>'ON',
838410593=>'ON',
838510594=>'ON',
838610595=>'ON',
838710596=>'ON',
838810597=>'ON',
838910598=>'ON',
839010599=>'ON',
839110600=>'ON',
839210601=>'ON',
839310602=>'ON',
839410603=>'ON',
839510604=>'ON',
839610605=>'ON',
839710606=>'ON',
839810607=>'ON',
839910608=>'ON',
840010609=>'ON',
840110610=>'ON',
840210611=>'ON',
840310612=>'ON',
840410613=>'ON',
840510614=>'ON',
840610615=>'ON',
840710616=>'ON',
840810617=>'ON',
840910618=>'ON',
841010619=>'ON',
841110620=>'ON',
841210621=>'ON',
841310622=>'ON',
841410623=>'ON',
841510624=>'ON',
841610625=>'ON',
841710626=>'ON',
841810627=>'ON',
841910628=>'ON',
842010629=>'ON',
842110630=>'ON',
842210631=>'ON',
842310632=>'ON',
842410633=>'ON',
842510634=>'ON',
842610635=>'ON',
842710636=>'ON',
842810637=>'ON',
842910638=>'ON',
843010639=>'ON',
843110640=>'ON',
843210641=>'ON',
843310642=>'ON',
843410643=>'ON',
843510644=>'ON',
843610645=>'ON',
843710646=>'ON',
843810647=>'ON',
843910648=>'ON',
844010649=>'ON',
844110650=>'ON',
844210651=>'ON',
844310652=>'ON',
844410653=>'ON',
844510654=>'ON',
844610655=>'ON',
844710656=>'ON',
844810657=>'ON',
844910658=>'ON',
845010659=>'ON',
845110660=>'ON',
845210661=>'ON',
845310662=>'ON',
845410663=>'ON',
845510664=>'ON',
845610665=>'ON',
845710666=>'ON',
845810667=>'ON',
845910668=>'ON',
846010669=>'ON',
846110670=>'ON',
846210671=>'ON',
846310672=>'ON',
846410673=>'ON',
846510674=>'ON',
846610675=>'ON',
846710676=>'ON',
846810677=>'ON',
846910678=>'ON',
847010679=>'ON',
847110680=>'ON',
847210681=>'ON',
847310682=>'ON',
847410683=>'ON',
847510684=>'ON',
847610685=>'ON',
847710686=>'ON',
847810687=>'ON',
847910688=>'ON',
848010689=>'ON',
848110690=>'ON',
848210691=>'ON',
848310692=>'ON',
848410693=>'ON',
848510694=>'ON',
848610695=>'ON',
848710696=>'ON',
848810697=>'ON',
848910698=>'ON',
849010699=>'ON',
849110700=>'ON',
849210701=>'ON',
849310702=>'ON',
849410703=>'ON',
849510704=>'ON',
849610705=>'ON',
849710706=>'ON',
849810707=>'ON',
849910708=>'ON',
850010709=>'ON',
850110710=>'ON',
850210711=>'ON',
850310712=>'ON',
850410713=>'ON',
850510714=>'ON',
850610715=>'ON',
850710716=>'ON',
850810717=>'ON',
850910718=>'ON',
851010719=>'ON',
851110720=>'ON',
851210721=>'ON',
851310722=>'ON',
851410723=>'ON',
851510724=>'ON',
851610725=>'ON',
851710726=>'ON',
851810727=>'ON',
851910728=>'ON',
852010729=>'ON',
852110730=>'ON',
852210731=>'ON',
852310732=>'ON',
852410733=>'ON',
852510734=>'ON',
852610735=>'ON',
852710736=>'ON',
852810737=>'ON',
852910738=>'ON',
853010739=>'ON',
853110740=>'ON',
853210741=>'ON',
853310742=>'ON',
853410743=>'ON',
853510744=>'ON',
853610745=>'ON',
853710746=>'ON',
853810747=>'ON',
853910748=>'ON',
854010749=>'ON',
854110750=>'ON',
854210751=>'ON',
854310752=>'ON',
854410753=>'ON',
854510754=>'ON',
854610755=>'ON',
854710756=>'ON',
854810757=>'ON',
854910758=>'ON',
855010759=>'ON',
855110760=>'ON',
855210761=>'ON',
855310762=>'ON',
855410763=>'ON',
855510764=>'ON',
855610765=>'ON',
855710766=>'ON',
855810767=>'ON',
855910768=>'ON',
856010769=>'ON',
856110770=>'ON',
856210771=>'ON',
856310772=>'ON',
856410773=>'ON',
856510774=>'ON',
856610775=>'ON',
856710776=>'ON',
856810777=>'ON',
856910778=>'ON',
857010779=>'ON',
857110780=>'ON',
857210781=>'ON',
857310782=>'ON',
857410783=>'ON',
857510784=>'ON',
857610785=>'ON',
857710786=>'ON',
857810787=>'ON',
857910788=>'ON',
858010789=>'ON',
858110790=>'ON',
858210791=>'ON',
858310792=>'ON',
858410793=>'ON',
858510794=>'ON',
858610795=>'ON',
858710796=>'ON',
858810797=>'ON',
858910798=>'ON',
859010799=>'ON',
859110800=>'ON',
859210801=>'ON',
859310802=>'ON',
859410803=>'ON',
859510804=>'ON',
859610805=>'ON',
859710806=>'ON',
859810807=>'ON',
859910808=>'ON',
860010809=>'ON',
860110810=>'ON',
860210811=>'ON',
860310812=>'ON',
860410813=>'ON',
860510814=>'ON',
860610815=>'ON',
860710816=>'ON',
860810817=>'ON',
860910818=>'ON',
861010819=>'ON',
861110820=>'ON',
861210821=>'ON',
861310822=>'ON',
861410823=>'ON',
861510824=>'ON',
861610825=>'ON',
861710826=>'ON',
861810827=>'ON',
861910828=>'ON',
862010829=>'ON',
862110830=>'ON',
862210831=>'ON',
862310832=>'ON',
862410833=>'ON',
862510834=>'ON',
862610835=>'ON',
862710836=>'ON',
862810837=>'ON',
862910838=>'ON',
863010839=>'ON',
863110840=>'ON',
863210841=>'ON',
863310842=>'ON',
863410843=>'ON',
863510844=>'ON',
863610845=>'ON',
863710846=>'ON',
863810847=>'ON',
863910848=>'ON',
864010849=>'ON',
864110850=>'ON',
864210851=>'ON',
864310852=>'ON',
864410853=>'ON',
864510854=>'ON',
864610855=>'ON',
864710856=>'ON',
864810857=>'ON',
864910858=>'ON',
865010859=>'ON',
865110860=>'ON',
865210861=>'ON',
865310862=>'ON',
865410863=>'ON',
865510864=>'ON',
865610865=>'ON',
865710866=>'ON',
865810867=>'ON',
865910868=>'ON',
866010869=>'ON',
866110870=>'ON',
866210871=>'ON',
866310872=>'ON',
866410873=>'ON',
866510874=>'ON',
866610875=>'ON',
866710876=>'ON',
866810877=>'ON',
866910878=>'ON',
867010879=>'ON',
867110880=>'ON',
867210881=>'ON',
867310882=>'ON',
867410883=>'ON',
867510884=>'ON',
867610885=>'ON',
867710886=>'ON',
867810887=>'ON',
867910888=>'ON',
868010889=>'ON',
868110890=>'ON',
868210891=>'ON',
868310892=>'ON',
868410893=>'ON',
868510894=>'ON',
868610895=>'ON',
868710896=>'ON',
868810897=>'ON',
868910898=>'ON',
869010899=>'ON',
869110900=>'ON',
869210901=>'ON',
869310902=>'ON',
869410903=>'ON',
869510904=>'ON',
869610905=>'ON',
869710906=>'ON',
869810907=>'ON',
869910908=>'ON',
870010909=>'ON',
870110910=>'ON',
870210911=>'ON',
870310912=>'ON',
870410913=>'ON',
870510914=>'ON',
870610915=>'ON',
870710916=>'ON',
870810917=>'ON',
870910918=>'ON',
871010919=>'ON',
871110920=>'ON',
871210921=>'ON',
871310922=>'ON',
871410923=>'ON',
871510924=>'ON',
871610925=>'ON',
871710926=>'ON',
871810927=>'ON',
871910928=>'ON',
872010929=>'ON',
872110930=>'ON',
872210931=>'ON',
872310932=>'ON',
872410933=>'ON',
872510934=>'ON',
872610935=>'ON',
872710936=>'ON',
872810937=>'ON',
872910938=>'ON',
873010939=>'ON',
873110940=>'ON',
873210941=>'ON',
873310942=>'ON',
873410943=>'ON',
873510944=>'ON',
873610945=>'ON',
873710946=>'ON',
873810947=>'ON',
873910948=>'ON',
874010949=>'ON',
874110950=>'ON',
874210951=>'ON',
874310952=>'ON',
874410953=>'ON',
874510954=>'ON',
874610955=>'ON',
874710956=>'ON',
874810957=>'ON',
874910958=>'ON',
875010959=>'ON',
875110960=>'ON',
875210961=>'ON',
875310962=>'ON',
875410963=>'ON',
875510964=>'ON',
875610965=>'ON',
875710966=>'ON',
875810967=>'ON',
875910968=>'ON',
876010969=>'ON',
876110970=>'ON',
876210971=>'ON',
876310972=>'ON',
876410973=>'ON',
876510974=>'ON',
876610975=>'ON',
876710976=>'ON',
876810977=>'ON',
876910978=>'ON',
877010979=>'ON',
877110980=>'ON',
877210981=>'ON',
877310982=>'ON',
877410983=>'ON',
877510984=>'ON',
877610985=>'ON',
877710986=>'ON',
877810987=>'ON',
877910988=>'ON',
878010989=>'ON',
878110990=>'ON',
878210991=>'ON',
878310992=>'ON',
878410993=>'ON',
878510994=>'ON',
878610995=>'ON',
878710996=>'ON',
878810997=>'ON',
878910998=>'ON',
879010999=>'ON',
879111000=>'ON',
879211001=>'ON',
879311002=>'ON',
879411003=>'ON',
879511004=>'ON',
879611005=>'ON',
879711006=>'ON',
879811007=>'ON',
879911008=>'ON',
880011009=>'ON',
880111010=>'ON',
880211011=>'ON',
880311012=>'ON',
880411013=>'ON',
880511014=>'ON',
880611015=>'ON',
880711016=>'ON',
880811017=>'ON',
880911018=>'ON',
881011019=>'ON',
881111020=>'ON',
881211021=>'ON',
881311022=>'ON',
881411023=>'ON',
881511024=>'ON',
881611025=>'ON',
881711026=>'ON',
881811027=>'ON',
881911028=>'ON',
882011029=>'ON',
882111030=>'ON',
882211031=>'ON',
882311032=>'ON',
882411033=>'ON',
882511034=>'ON',
882611040=>'ON',
882711041=>'ON',
882811042=>'ON',
882911043=>'ON',
883011264=>'L',
883111265=>'L',
883211266=>'L',
883311267=>'L',
883411268=>'L',
883511269=>'L',
883611270=>'L',
883711271=>'L',
883811272=>'L',
883911273=>'L',
884011274=>'L',
884111275=>'L',
884211276=>'L',
884311277=>'L',
884411278=>'L',
884511279=>'L',
884611280=>'L',
884711281=>'L',
884811282=>'L',
884911283=>'L',
885011284=>'L',
885111285=>'L',
885211286=>'L',
885311287=>'L',
885411288=>'L',
885511289=>'L',
885611290=>'L',
885711291=>'L',
885811292=>'L',
885911293=>'L',
886011294=>'L',
886111295=>'L',
886211296=>'L',
886311297=>'L',
886411298=>'L',
886511299=>'L',
886611300=>'L',
886711301=>'L',
886811302=>'L',
886911303=>'L',
887011304=>'L',
887111305=>'L',
887211306=>'L',
887311307=>'L',
887411308=>'L',
887511309=>'L',
887611310=>'L',
887711312=>'L',
887811313=>'L',
887911314=>'L',
888011315=>'L',
888111316=>'L',
888211317=>'L',
888311318=>'L',
888411319=>'L',
888511320=>'L',
888611321=>'L',
888711322=>'L',
888811323=>'L',
888911324=>'L',
889011325=>'L',
889111326=>'L',
889211327=>'L',
889311328=>'L',
889411329=>'L',
889511330=>'L',
889611331=>'L',
889711332=>'L',
889811333=>'L',
889911334=>'L',
890011335=>'L',
890111336=>'L',
890211337=>'L',
890311338=>'L',
890411339=>'L',
890511340=>'L',
890611341=>'L',
890711342=>'L',
890811343=>'L',
890911344=>'L',
891011345=>'L',
891111346=>'L',
891211347=>'L',
891311348=>'L',
891411349=>'L',
891511350=>'L',
891611351=>'L',
891711352=>'L',
891811353=>'L',
891911354=>'L',
892011355=>'L',
892111356=>'L',
892211357=>'L',
892311358=>'L',
892411360=>'L',
892511361=>'L',
892611362=>'L',
892711363=>'L',
892811364=>'L',
892911365=>'L',
893011366=>'L',
893111367=>'L',
893211368=>'L',
893311369=>'L',
893411370=>'L',
893511371=>'L',
893611372=>'L',
893711380=>'L',
893811381=>'L',
893911382=>'L',
894011383=>'L',
894111392=>'L',
894211393=>'L',
894311394=>'L',
894411395=>'L',
894511396=>'L',
894611397=>'L',
894711398=>'L',
894811399=>'L',
894911400=>'L',
895011401=>'L',
895111402=>'L',
895211403=>'L',
895311404=>'L',
895411405=>'L',
895511406=>'L',
895611407=>'L',
895711408=>'L',
895811409=>'L',
895911410=>'L',
896011411=>'L',
896111412=>'L',
896211413=>'L',
896311414=>'L',
896411415=>'L',
896511416=>'L',
896611417=>'L',
896711418=>'L',
896811419=>'L',
896911420=>'L',
897011421=>'L',
897111422=>'L',
897211423=>'L',
897311424=>'L',
897411425=>'L',
897511426=>'L',
897611427=>'L',
897711428=>'L',
897811429=>'L',
897911430=>'L',
898011431=>'L',
898111432=>'L',
898211433=>'L',
898311434=>'L',
898411435=>'L',
898511436=>'L',
898611437=>'L',
898711438=>'L',
898811439=>'L',
898911440=>'L',
899011441=>'L',
899111442=>'L',
899211443=>'L',
899311444=>'L',
899411445=>'L',
899511446=>'L',
899611447=>'L',
899711448=>'L',
899811449=>'L',
899911450=>'L',
900011451=>'L',
900111452=>'L',
900211453=>'L',
900311454=>'L',
900411455=>'L',
900511456=>'L',
900611457=>'L',
900711458=>'L',
900811459=>'L',
900911460=>'L',
901011461=>'L',
901111462=>'L',
901211463=>'L',
901311464=>'L',
901411465=>'L',
901511466=>'L',
901611467=>'L',
901711468=>'L',
901811469=>'L',
901911470=>'L',
902011471=>'L',
902111472=>'L',
902211473=>'L',
902311474=>'L',
902411475=>'L',
902511476=>'L',
902611477=>'L',
902711478=>'L',
902811479=>'L',
902911480=>'L',
903011481=>'L',
903111482=>'L',
903211483=>'L',
903311484=>'L',
903411485=>'L',
903511486=>'L',
903611487=>'L',
903711488=>'L',
903811489=>'L',
903911490=>'L',
904011491=>'L',
904111492=>'L',
904211493=>'ON',
904311494=>'ON',
904411495=>'ON',
904511496=>'ON',
904611497=>'ON',
904711498=>'ON',
904811513=>'ON',
904911514=>'ON',
905011515=>'ON',
905111516=>'ON',
905211517=>'ON',
905311518=>'ON',
905411519=>'ON',
905511520=>'L',
905611521=>'L',
905711522=>'L',
905811523=>'L',
905911524=>'L',
906011525=>'L',
906111526=>'L',
906211527=>'L',
906311528=>'L',
906411529=>'L',
906511530=>'L',
906611531=>'L',
906711532=>'L',
906811533=>'L',
906911534=>'L',
907011535=>'L',
907111536=>'L',
907211537=>'L',
907311538=>'L',
907411539=>'L',
907511540=>'L',
907611541=>'L',
907711542=>'L',
907811543=>'L',
907911544=>'L',
908011545=>'L',
908111546=>'L',
908211547=>'L',
908311548=>'L',
908411549=>'L',
908511550=>'L',
908611551=>'L',
908711552=>'L',
908811553=>'L',
908911554=>'L',
909011555=>'L',
909111556=>'L',
909211557=>'L',
909311568=>'L',
909411569=>'L',
909511570=>'L',
909611571=>'L',
909711572=>'L',
909811573=>'L',
909911574=>'L',
910011575=>'L',
910111576=>'L',
910211577=>'L',
910311578=>'L',
910411579=>'L',
910511580=>'L',
910611581=>'L',
910711582=>'L',
910811583=>'L',
910911584=>'L',
911011585=>'L',
911111586=>'L',
911211587=>'L',
911311588=>'L',
911411589=>'L',
911511590=>'L',
911611591=>'L',
911711592=>'L',
911811593=>'L',
911911594=>'L',
912011595=>'L',
912111596=>'L',
912211597=>'L',
912311598=>'L',
912411599=>'L',
912511600=>'L',
912611601=>'L',
912711602=>'L',
912811603=>'L',
912911604=>'L',
913011605=>'L',
913111606=>'L',
913211607=>'L',
913311608=>'L',
913411609=>'L',
913511610=>'L',
913611611=>'L',
913711612=>'L',
913811613=>'L',
913911614=>'L',
914011615=>'L',
914111616=>'L',
914211617=>'L',
914311618=>'L',
914411619=>'L',
914511620=>'L',
914611621=>'L',
914711631=>'L',
914811648=>'L',
914911649=>'L',
915011650=>'L',
915111651=>'L',
915211652=>'L',
915311653=>'L',
915411654=>'L',
915511655=>'L',
915611656=>'L',
915711657=>'L',
915811658=>'L',
915911659=>'L',
916011660=>'L',
916111661=>'L',
916211662=>'L',
916311663=>'L',
916411664=>'L',
916511665=>'L',
916611666=>'L',
916711667=>'L',
916811668=>'L',
916911669=>'L',
917011670=>'L',
917111680=>'L',
917211681=>'L',
917311682=>'L',
917411683=>'L',
917511684=>'L',
917611685=>'L',
917711686=>'L',
917811688=>'L',
917911689=>'L',
918011690=>'L',
918111691=>'L',
918211692=>'L',
918311693=>'L',
918411694=>'L',
918511696=>'L',
918611697=>'L',
918711698=>'L',
918811699=>'L',
918911700=>'L',
919011701=>'L',
919111702=>'L',
919211704=>'L',
919311705=>'L',
919411706=>'L',
919511707=>'L',
919611708=>'L',
919711709=>'L',
919811710=>'L',
919911712=>'L',
920011713=>'L',
920111714=>'L',
920211715=>'L',
920311716=>'L',
920411717=>'L',
920511718=>'L',
920611720=>'L',
920711721=>'L',
920811722=>'L',
920911723=>'L',
921011724=>'L',
921111725=>'L',
921211726=>'L',
921311728=>'L',
921411729=>'L',
921511730=>'L',
921611731=>'L',
921711732=>'L',
921811733=>'L',
921911734=>'L',
922011736=>'L',
922111737=>'L',
922211738=>'L',
922311739=>'L',
922411740=>'L',
922511741=>'L',
922611742=>'L',
922711776=>'ON',
922811777=>'ON',
922911778=>'ON',
923011779=>'ON',
923111780=>'ON',
923211781=>'ON',
923311782=>'ON',
923411783=>'ON',
923511784=>'ON',
923611785=>'ON',
923711786=>'ON',
923811787=>'ON',
923911788=>'ON',
924011789=>'ON',
924111790=>'ON',
924211791=>'ON',
924311792=>'ON',
924411793=>'ON',
924511794=>'ON',
924611795=>'ON',
924711796=>'ON',
924811797=>'ON',
924911798=>'ON',
925011799=>'ON',
925111804=>'ON',
925211805=>'ON',
925311904=>'ON',
925411905=>'ON',
925511906=>'ON',
925611907=>'ON',
925711908=>'ON',
925811909=>'ON',
925911910=>'ON',
926011911=>'ON',
926111912=>'ON',
926211913=>'ON',
926311914=>'ON',
926411915=>'ON',
926511916=>'ON',
926611917=>'ON',
926711918=>'ON',
926811919=>'ON',
926911920=>'ON',
927011921=>'ON',
927111922=>'ON',
927211923=>'ON',
927311924=>'ON',
927411925=>'ON',
927511926=>'ON',
927611927=>'ON',
927711928=>'ON',
927811929=>'ON',
927911931=>'ON',
928011932=>'ON',
928111933=>'ON',
928211934=>'ON',
928311935=>'ON',
928411936=>'ON',
928511937=>'ON',
928611938=>'ON',
928711939=>'ON',
928811940=>'ON',
928911941=>'ON',
929011942=>'ON',
929111943=>'ON',
929211944=>'ON',
929311945=>'ON',
929411946=>'ON',
929511947=>'ON',
929611948=>'ON',
929711949=>'ON',
929811950=>'ON',
929911951=>'ON',
930011952=>'ON',
930111953=>'ON',
930211954=>'ON',
930311955=>'ON',
930411956=>'ON',
930511957=>'ON',
930611958=>'ON',
930711959=>'ON',
930811960=>'ON',
930911961=>'ON',
931011962=>'ON',
931111963=>'ON',
931211964=>'ON',
931311965=>'ON',
931411966=>'ON',
931511967=>'ON',
931611968=>'ON',
931711969=>'ON',
931811970=>'ON',
931911971=>'ON',
932011972=>'ON',
932111973=>'ON',
932211974=>'ON',
932311975=>'ON',
932411976=>'ON',
932511977=>'ON',
932611978=>'ON',
932711979=>'ON',
932811980=>'ON',
932911981=>'ON',
933011982=>'ON',
933111983=>'ON',
933211984=>'ON',
933311985=>'ON',
933411986=>'ON',
933511987=>'ON',
933611988=>'ON',
933711989=>'ON',
933811990=>'ON',
933911991=>'ON',
934011992=>'ON',
934111993=>'ON',
934211994=>'ON',
934311995=>'ON',
934411996=>'ON',
934511997=>'ON',
934611998=>'ON',
934711999=>'ON',
934812000=>'ON',
934912001=>'ON',
935012002=>'ON',
935112003=>'ON',
935212004=>'ON',
935312005=>'ON',
935412006=>'ON',
935512007=>'ON',
935612008=>'ON',
935712009=>'ON',
935812010=>'ON',
935912011=>'ON',
936012012=>'ON',
936112013=>'ON',
936212014=>'ON',
936312015=>'ON',
936412016=>'ON',
936512017=>'ON',
936612018=>'ON',
936712019=>'ON',
936812032=>'ON',
936912033=>'ON',
937012034=>'ON',
937112035=>'ON',
937212036=>'ON',
937312037=>'ON',
937412038=>'ON',
937512039=>'ON',
937612040=>'ON',
937712041=>'ON',
937812042=>'ON',
937912043=>'ON',
938012044=>'ON',
938112045=>'ON',
938212046=>'ON',
938312047=>'ON',
938412048=>'ON',
938512049=>'ON',
938612050=>'ON',
938712051=>'ON',
938812052=>'ON',
938912053=>'ON',
939012054=>'ON',
939112055=>'ON',
939212056=>'ON',
939312057=>'ON',
939412058=>'ON',
939512059=>'ON',
939612060=>'ON',
939712061=>'ON',
939812062=>'ON',
939912063=>'ON',
940012064=>'ON',
940112065=>'ON',
940212066=>'ON',
940312067=>'ON',
940412068=>'ON',
940512069=>'ON',
940612070=>'ON',
940712071=>'ON',
940812072=>'ON',
940912073=>'ON',
941012074=>'ON',
941112075=>'ON',
941212076=>'ON',
941312077=>'ON',
941412078=>'ON',
941512079=>'ON',
941612080=>'ON',
941712081=>'ON',
941812082=>'ON',
941912083=>'ON',
942012084=>'ON',
942112085=>'ON',
942212086=>'ON',
942312087=>'ON',
942412088=>'ON',
942512089=>'ON',
942612090=>'ON',
942712091=>'ON',
942812092=>'ON',
942912093=>'ON',
943012094=>'ON',
943112095=>'ON',
943212096=>'ON',
943312097=>'ON',
943412098=>'ON',
943512099=>'ON',
943612100=>'ON',
943712101=>'ON',
943812102=>'ON',
943912103=>'ON',
944012104=>'ON',
944112105=>'ON',
944212106=>'ON',
944312107=>'ON',
944412108=>'ON',
944512109=>'ON',
944612110=>'ON',
944712111=>'ON',
944812112=>'ON',
944912113=>'ON',
945012114=>'ON',
945112115=>'ON',
945212116=>'ON',
945312117=>'ON',
945412118=>'ON',
945512119=>'ON',
945612120=>'ON',
945712121=>'ON',
945812122=>'ON',
945912123=>'ON',
946012124=>'ON',
946112125=>'ON',
946212126=>'ON',
946312127=>'ON',
946412128=>'ON',
946512129=>'ON',
946612130=>'ON',
946712131=>'ON',
946812132=>'ON',
946912133=>'ON',
947012134=>'ON',
947112135=>'ON',
947212136=>'ON',
947312137=>'ON',
947412138=>'ON',
947512139=>'ON',
947612140=>'ON',
947712141=>'ON',
947812142=>'ON',
947912143=>'ON',
948012144=>'ON',
948112145=>'ON',
948212146=>'ON',
948312147=>'ON',
948412148=>'ON',
948512149=>'ON',
948612150=>'ON',
948712151=>'ON',
948812152=>'ON',
948912153=>'ON',
949012154=>'ON',
949112155=>'ON',
949212156=>'ON',
949312157=>'ON',
949412158=>'ON',
949512159=>'ON',
949612160=>'ON',
949712161=>'ON',
949812162=>'ON',
949912163=>'ON',
950012164=>'ON',
950112165=>'ON',
950212166=>'ON',
950312167=>'ON',
950412168=>'ON',
950512169=>'ON',
950612170=>'ON',
950712171=>'ON',
950812172=>'ON',
950912173=>'ON',
951012174=>'ON',
951112175=>'ON',
951212176=>'ON',
951312177=>'ON',
951412178=>'ON',
951512179=>'ON',
951612180=>'ON',
951712181=>'ON',
951812182=>'ON',
951912183=>'ON',
952012184=>'ON',
952112185=>'ON',
952212186=>'ON',
952312187=>'ON',
952412188=>'ON',
952512189=>'ON',
952612190=>'ON',
952712191=>'ON',
952812192=>'ON',
952912193=>'ON',
953012194=>'ON',
953112195=>'ON',
953212196=>'ON',
953312197=>'ON',
953412198=>'ON',
953512199=>'ON',
953612200=>'ON',
953712201=>'ON',
953812202=>'ON',
953912203=>'ON',
954012204=>'ON',
954112205=>'ON',
954212206=>'ON',
954312207=>'ON',
954412208=>'ON',
954512209=>'ON',
954612210=>'ON',
954712211=>'ON',
954812212=>'ON',
954912213=>'ON',
955012214=>'ON',
955112215=>'ON',
955212216=>'ON',
955312217=>'ON',
955412218=>'ON',
955512219=>'ON',
955612220=>'ON',
955712221=>'ON',
955812222=>'ON',
955912223=>'ON',
956012224=>'ON',
956112225=>'ON',
956212226=>'ON',
956312227=>'ON',
956412228=>'ON',
956512229=>'ON',
956612230=>'ON',
956712231=>'ON',
956812232=>'ON',
956912233=>'ON',
957012234=>'ON',
957112235=>'ON',
957212236=>'ON',
957312237=>'ON',
957412238=>'ON',
957512239=>'ON',
957612240=>'ON',
957712241=>'ON',
957812242=>'ON',
957912243=>'ON',
958012244=>'ON',
958112245=>'ON',
958212272=>'ON',
958312273=>'ON',
958412274=>'ON',
958512275=>'ON',
958612276=>'ON',
958712277=>'ON',
958812278=>'ON',
958912279=>'ON',
959012280=>'ON',
959112281=>'ON',
959212282=>'ON',
959312283=>'ON',
959412288=>'WS',
959512289=>'ON',
959612290=>'ON',
959712291=>'ON',
959812292=>'ON',
959912293=>'L',
960012294=>'L',
960112295=>'L',
960212296=>'ON',
960312297=>'ON',
960412298=>'ON',
960512299=>'ON',
960612300=>'ON',
960712301=>'ON',
960812302=>'ON',
960912303=>'ON',
961012304=>'ON',
961112305=>'ON',
961212306=>'ON',
961312307=>'ON',
961412308=>'ON',
961512309=>'ON',
961612310=>'ON',
961712311=>'ON',
961812312=>'ON',
961912313=>'ON',
962012314=>'ON',
962112315=>'ON',
962212316=>'ON',
962312317=>'ON',
962412318=>'ON',
962512319=>'ON',
962612320=>'ON',
962712321=>'L',
962812322=>'L',
962912323=>'L',
963012324=>'L',
963112325=>'L',
963212326=>'L',
963312327=>'L',
963412328=>'L',
963512329=>'L',
963612330=>'NSM',
963712331=>'NSM',
963812332=>'NSM',
963912333=>'NSM',
964012334=>'NSM',
964112335=>'NSM',
964212336=>'ON',
964312337=>'L',
964412338=>'L',
964512339=>'L',
964612340=>'L',
964712341=>'L',
964812342=>'ON',
964912343=>'ON',
965012344=>'L',
965112345=>'L',
965212346=>'L',
965312347=>'L',
965412348=>'L',
965512349=>'ON',
965612350=>'ON',
965712351=>'ON',
965812353=>'L',
965912354=>'L',
966012355=>'L',
966112356=>'L',
966212357=>'L',
966312358=>'L',
966412359=>'L',
966512360=>'L',
966612361=>'L',
966712362=>'L',
966812363=>'L',
966912364=>'L',
967012365=>'L',
967112366=>'L',
967212367=>'L',
967312368=>'L',
967412369=>'L',
967512370=>'L',
967612371=>'L',
967712372=>'L',
967812373=>'L',
967912374=>'L',
968012375=>'L',
968112376=>'L',
968212377=>'L',
968312378=>'L',
968412379=>'L',
968512380=>'L',
968612381=>'L',
968712382=>'L',
968812383=>'L',
968912384=>'L',
969012385=>'L',
969112386=>'L',
969212387=>'L',
969312388=>'L',
969412389=>'L',
969512390=>'L',
969612391=>'L',
969712392=>'L',
969812393=>'L',
969912394=>'L',
970012395=>'L',
970112396=>'L',
970212397=>'L',
970312398=>'L',
970412399=>'L',
970512400=>'L',
970612401=>'L',
970712402=>'L',
970812403=>'L',
970912404=>'L',
971012405=>'L',
971112406=>'L',
971212407=>'L',
971312408=>'L',
971412409=>'L',
971512410=>'L',
971612411=>'L',
971712412=>'L',
971812413=>'L',
971912414=>'L',
972012415=>'L',
972112416=>'L',
972212417=>'L',
972312418=>'L',
972412419=>'L',
972512420=>'L',
972612421=>'L',
972712422=>'L',
972812423=>'L',
972912424=>'L',
973012425=>'L',
973112426=>'L',
973212427=>'L',
973312428=>'L',
973412429=>'L',
973512430=>'L',
973612431=>'L',
973712432=>'L',
973812433=>'L',
973912434=>'L',
974012435=>'L',
974112436=>'L',
974212437=>'L',
974312438=>'L',
974412441=>'NSM',
974512442=>'NSM',
974612443=>'ON',
974712444=>'ON',
974812445=>'L',
974912446=>'L',
975012447=>'L',
975112448=>'ON',
975212449=>'L',
975312450=>'L',
975412451=>'L',
975512452=>'L',
975612453=>'L',
975712454=>'L',
975812455=>'L',
975912456=>'L',
976012457=>'L',
976112458=>'L',
976212459=>'L',
976312460=>'L',
976412461=>'L',
976512462=>'L',
976612463=>'L',
976712464=>'L',
976812465=>'L',
976912466=>'L',
977012467=>'L',
977112468=>'L',
977212469=>'L',
977312470=>'L',
977412471=>'L',
977512472=>'L',
977612473=>'L',
977712474=>'L',
977812475=>'L',
977912476=>'L',
978012477=>'L',
978112478=>'L',
978212479=>'L',
978312480=>'L',
978412481=>'L',
978512482=>'L',
978612483=>'L',
978712484=>'L',
978812485=>'L',
978912486=>'L',
979012487=>'L',
979112488=>'L',
979212489=>'L',
979312490=>'L',
979412491=>'L',
979512492=>'L',
979612493=>'L',
979712494=>'L',
979812495=>'L',
979912496=>'L',
980012497=>'L',
980112498=>'L',
980212499=>'L',
980312500=>'L',
980412501=>'L',
980512502=>'L',
980612503=>'L',
980712504=>'L',
980812505=>'L',
980912506=>'L',
981012507=>'L',
981112508=>'L',
981212509=>'L',
981312510=>'L',
981412511=>'L',
981512512=>'L',
981612513=>'L',
981712514=>'L',
981812515=>'L',
981912516=>'L',
982012517=>'L',
982112518=>'L',
982212519=>'L',
982312520=>'L',
982412521=>'L',
982512522=>'L',
982612523=>'L',
982712524=>'L',
982812525=>'L',
982912526=>'L',
983012527=>'L',
983112528=>'L',
983212529=>'L',
983312530=>'L',
983412531=>'L',
983512532=>'L',
983612533=>'L',
983712534=>'L',
983812535=>'L',
983912536=>'L',
984012537=>'L',
984112538=>'L',
984212539=>'ON',
984312540=>'L',
984412541=>'L',
984512542=>'L',
984612543=>'L',
984712549=>'L',
984812550=>'L',
984912551=>'L',
985012552=>'L',
985112553=>'L',
985212554=>'L',
985312555=>'L',
985412556=>'L',
985512557=>'L',
985612558=>'L',
985712559=>'L',
985812560=>'L',
985912561=>'L',
986012562=>'L',
986112563=>'L',
986212564=>'L',
986312565=>'L',
986412566=>'L',
986512567=>'L',
986612568=>'L',
986712569=>'L',
986812570=>'L',
986912571=>'L',
987012572=>'L',
987112573=>'L',
987212574=>'L',
987312575=>'L',
987412576=>'L',
987512577=>'L',
987612578=>'L',
987712579=>'L',
987812580=>'L',
987912581=>'L',
988012582=>'L',
988112583=>'L',
988212584=>'L',
988312585=>'L',
988412586=>'L',
988512587=>'L',
988612588=>'L',
988712593=>'L',
988812594=>'L',
988912595=>'L',
989012596=>'L',
989112597=>'L',
989212598=>'L',
989312599=>'L',
989412600=>'L',
989512601=>'L',
989612602=>'L',
989712603=>'L',
989812604=>'L',
989912605=>'L',
990012606=>'L',
990112607=>'L',
990212608=>'L',
990312609=>'L',
990412610=>'L',
990512611=>'L',
990612612=>'L',
990712613=>'L',
990812614=>'L',
990912615=>'L',
991012616=>'L',
991112617=>'L',
991212618=>'L',
991312619=>'L',
991412620=>'L',
991512621=>'L',
991612622=>'L',
991712623=>'L',
991812624=>'L',
991912625=>'L',
992012626=>'L',
992112627=>'L',
992212628=>'L',
992312629=>'L',
992412630=>'L',
992512631=>'L',
992612632=>'L',
992712633=>'L',
992812634=>'L',
992912635=>'L',
993012636=>'L',
993112637=>'L',
993212638=>'L',
993312639=>'L',
993412640=>'L',
993512641=>'L',
993612642=>'L',
993712643=>'L',
993812644=>'L',
993912645=>'L',
994012646=>'L',
994112647=>'L',
994212648=>'L',
994312649=>'L',
994412650=>'L',
994512651=>'L',
994612652=>'L',
994712653=>'L',
994812654=>'L',
994912655=>'L',
995012656=>'L',
995112657=>'L',
995212658=>'L',
995312659=>'L',
995412660=>'L',
995512661=>'L',
995612662=>'L',
995712663=>'L',
995812664=>'L',
995912665=>'L',
996012666=>'L',
996112667=>'L',
996212668=>'L',
996312669=>'L',
996412670=>'L',
996512671=>'L',
996612672=>'L',
996712673=>'L',
996812674=>'L',
996912675=>'L',
997012676=>'L',
997112677=>'L',
997212678=>'L',
997312679=>'L',
997412680=>'L',
997512681=>'L',
997612682=>'L',
997712683=>'L',
997812684=>'L',
997912685=>'L',
998012686=>'L',
998112688=>'L',
998212689=>'L',
998312690=>'L',
998412691=>'L',
998512692=>'L',
998612693=>'L',
998712694=>'L',
998812695=>'L',
998912696=>'L',
999012697=>'L',
999112698=>'L',
999212699=>'L',
999312700=>'L',
999412701=>'L',
999512702=>'L',
999612703=>'L',
999712704=>'L',
999812705=>'L',
999912706=>'L',
1000012707=>'L',
1000112708=>'L',
1000212709=>'L',
1000312710=>'L',
1000412711=>'L',
1000512712=>'L',
1000612713=>'L',
1000712714=>'L',
1000812715=>'L',
1000912716=>'L',
1001012717=>'L',
1001112718=>'L',
1001212719=>'L',
1001312720=>'L',
1001412721=>'L',
1001512722=>'L',
1001612723=>'L',
1001712724=>'L',
1001812725=>'L',
1001912726=>'L',
1002012727=>'L',
1002112736=>'ON',
1002212737=>'ON',
1002312738=>'ON',
1002412739=>'ON',
1002512740=>'ON',
1002612741=>'ON',
1002712742=>'ON',
1002812743=>'ON',
1002912744=>'ON',
1003012745=>'ON',
1003112746=>'ON',
1003212747=>'ON',
1003312748=>'ON',
1003412749=>'ON',
1003512750=>'ON',
1003612751=>'ON',
1003712784=>'L',
1003812785=>'L',
1003912786=>'L',
1004012787=>'L',
1004112788=>'L',
1004212789=>'L',
1004312790=>'L',
1004412791=>'L',
1004512792=>'L',
1004612793=>'L',
1004712794=>'L',
1004812795=>'L',
1004912796=>'L',
1005012797=>'L',
1005112798=>'L',
1005212799=>'L',
1005312800=>'L',
1005412801=>'L',
1005512802=>'L',
1005612803=>'L',
1005712804=>'L',
1005812805=>'L',
1005912806=>'L',
1006012807=>'L',
1006112808=>'L',
1006212809=>'L',
1006312810=>'L',
1006412811=>'L',
1006512812=>'L',
1006612813=>'L',
1006712814=>'L',
1006812815=>'L',
1006912816=>'L',
1007012817=>'L',
1007112818=>'L',
1007212819=>'L',
1007312820=>'L',
1007412821=>'L',
1007512822=>'L',
1007612823=>'L',
1007712824=>'L',
1007812825=>'L',
1007912826=>'L',
1008012827=>'L',
1008112828=>'L',
1008212829=>'ON',
1008312830=>'ON',
1008412832=>'L',
1008512833=>'L',
1008612834=>'L',
1008712835=>'L',
1008812836=>'L',
1008912837=>'L',
1009012838=>'L',
1009112839=>'L',
1009212840=>'L',
1009312841=>'L',
1009412842=>'L',
1009512843=>'L',
1009612844=>'L',
1009712845=>'L',
1009812846=>'L',
1009912847=>'L',
1010012848=>'L',
1010112849=>'L',
1010212850=>'L',
1010312851=>'L',
1010412852=>'L',
1010512853=>'L',
1010612854=>'L',
1010712855=>'L',
1010812856=>'L',
1010912857=>'L',
1011012858=>'L',
1011112859=>'L',
1011212860=>'L',
1011312861=>'L',
1011412862=>'L',
1011512863=>'L',
1011612864=>'L',
1011712865=>'L',
1011812866=>'L',
1011912867=>'L',
1012012880=>'ON',
1012112881=>'ON',
1012212882=>'ON',
1012312883=>'ON',
1012412884=>'ON',
1012512885=>'ON',
1012612886=>'ON',
1012712887=>'ON',
1012812888=>'ON',
1012912889=>'ON',
1013012890=>'ON',
1013112891=>'ON',
1013212892=>'ON',
1013312893=>'ON',
1013412894=>'ON',
1013512895=>'ON',
1013612896=>'L',
1013712897=>'L',
1013812898=>'L',
1013912899=>'L',
1014012900=>'L',
1014112901=>'L',
1014212902=>'L',
1014312903=>'L',
1014412904=>'L',
1014512905=>'L',
1014612906=>'L',
1014712907=>'L',
1014812908=>'L',
1014912909=>'L',
1015012910=>'L',
1015112911=>'L',
1015212912=>'L',
1015312913=>'L',
1015412914=>'L',
1015512915=>'L',
1015612916=>'L',
1015712917=>'L',
1015812918=>'L',
1015912919=>'L',
1016012920=>'L',
1016112921=>'L',
1016212922=>'L',
1016312923=>'L',
1016412924=>'ON',
1016512925=>'ON',
1016612926=>'ON',
1016712927=>'L',
1016812928=>'L',
1016912929=>'L',
1017012930=>'L',
1017112931=>'L',
1017212932=>'L',
1017312933=>'L',
1017412934=>'L',
1017512935=>'L',
1017612936=>'L',
1017712937=>'L',
1017812938=>'L',
1017912939=>'L',
1018012940=>'L',
1018112941=>'L',
1018212942=>'L',
1018312943=>'L',
1018412944=>'L',
1018512945=>'L',
1018612946=>'L',
1018712947=>'L',
1018812948=>'L',
1018912949=>'L',
1019012950=>'L',
1019112951=>'L',
1019212952=>'L',
1019312953=>'L',
1019412954=>'L',
1019512955=>'L',
1019612956=>'L',
1019712957=>'L',
1019812958=>'L',
1019912959=>'L',
1020012960=>'L',
1020112961=>'L',
1020212962=>'L',
1020312963=>'L',
1020412964=>'L',
1020512965=>'L',
1020612966=>'L',
1020712967=>'L',
1020812968=>'L',
1020912969=>'L',
1021012970=>'L',
1021112971=>'L',
1021212972=>'L',
1021312973=>'L',
1021412974=>'L',
1021512975=>'L',
1021612976=>'L',
1021712977=>'ON',
1021812978=>'ON',
1021912979=>'ON',
1022012980=>'ON',
1022112981=>'ON',
1022212982=>'ON',
1022312983=>'ON',
1022412984=>'ON',
1022512985=>'ON',
1022612986=>'ON',
1022712987=>'ON',
1022812988=>'ON',
1022912989=>'ON',
1023012990=>'ON',
1023112991=>'ON',
1023212992=>'L',
1023312993=>'L',
1023412994=>'L',
1023512995=>'L',
1023612996=>'L',
1023712997=>'L',
1023812998=>'L',
1023912999=>'L',
1024013000=>'L',
1024113001=>'L',
1024213002=>'L',
1024313003=>'L',
1024413004=>'ON',
1024513005=>'ON',
1024613006=>'ON',
1024713007=>'ON',
1024813008=>'L',
1024913009=>'L',
1025013010=>'L',
1025113011=>'L',
1025213012=>'L',
1025313013=>'L',
1025413014=>'L',
1025513015=>'L',
1025613016=>'L',
1025713017=>'L',
1025813018=>'L',
1025913019=>'L',
1026013020=>'L',
1026113021=>'L',
1026213022=>'L',
1026313023=>'L',
1026413024=>'L',
1026513025=>'L',
1026613026=>'L',
1026713027=>'L',
1026813028=>'L',
1026913029=>'L',
1027013030=>'L',
1027113031=>'L',
1027213032=>'L',
1027313033=>'L',
1027413034=>'L',
1027513035=>'L',
1027613036=>'L',
1027713037=>'L',
1027813038=>'L',
1027913039=>'L',
1028013040=>'L',
1028113041=>'L',
1028213042=>'L',
1028313043=>'L',
1028413044=>'L',
1028513045=>'L',
1028613046=>'L',
1028713047=>'L',
1028813048=>'L',
1028913049=>'L',
1029013050=>'L',
1029113051=>'L',
1029213052=>'L',
1029313053=>'L',
1029413054=>'L',
1029513056=>'L',
1029613057=>'L',
1029713058=>'L',
1029813059=>'L',
1029913060=>'L',
1030013061=>'L',
1030113062=>'L',
1030213063=>'L',
1030313064=>'L',
1030413065=>'L',
1030513066=>'L',
1030613067=>'L',
1030713068=>'L',
1030813069=>'L',
1030913070=>'L',
1031013071=>'L',
1031113072=>'L',
1031213073=>'L',
1031313074=>'L',
1031413075=>'L',
1031513076=>'L',
1031613077=>'L',
1031713078=>'L',
1031813079=>'L',
1031913080=>'L',
1032013081=>'L',
1032113082=>'L',
1032213083=>'L',
1032313084=>'L',
1032413085=>'L',
1032513086=>'L',
1032613087=>'L',
1032713088=>'L',
1032813089=>'L',
1032913090=>'L',
1033013091=>'L',
1033113092=>'L',
1033213093=>'L',
1033313094=>'L',
1033413095=>'L',
1033513096=>'L',
1033613097=>'L',
1033713098=>'L',
1033813099=>'L',
1033913100=>'L',
1034013101=>'L',
1034113102=>'L',
1034213103=>'L',
1034313104=>'L',
1034413105=>'L',
1034513106=>'L',
1034613107=>'L',
1034713108=>'L',
1034813109=>'L',
1034913110=>'L',
1035013111=>'L',
1035113112=>'L',
1035213113=>'L',
1035313114=>'L',
1035413115=>'L',
1035513116=>'L',
1035613117=>'L',
1035713118=>'L',
1035813119=>'L',
1035913120=>'L',
1036013121=>'L',
1036113122=>'L',
1036213123=>'L',
1036313124=>'L',
1036413125=>'L',
1036513126=>'L',
1036613127=>'L',
1036713128=>'L',
1036813129=>'L',
1036913130=>'L',
1037013131=>'L',
1037113132=>'L',
1037213133=>'L',
1037313134=>'L',
1037413135=>'L',
1037513136=>'L',
1037613137=>'L',
1037713138=>'L',
1037813139=>'L',
1037913140=>'L',
1038013141=>'L',
1038113142=>'L',
1038213143=>'L',
1038313144=>'L',
1038413145=>'L',
1038513146=>'L',
1038613147=>'L',
1038713148=>'L',
1038813149=>'L',
1038913150=>'L',
1039013151=>'L',
1039113152=>'L',
1039213153=>'L',
1039313154=>'L',
1039413155=>'L',
1039513156=>'L',
1039613157=>'L',
1039713158=>'L',
1039813159=>'L',
1039913160=>'L',
1040013161=>'L',
1040113162=>'L',
1040213163=>'L',
1040313164=>'L',
1040413165=>'L',
1040513166=>'L',
1040613167=>'L',
1040713168=>'L',
1040813169=>'L',
1040913170=>'L',
1041013171=>'L',
1041113172=>'L',
1041213173=>'L',
1041313174=>'L',
1041413175=>'ON',
1041513176=>'ON',
1041613177=>'ON',
1041713178=>'ON',
1041813179=>'L',
1041913180=>'L',
1042013181=>'L',
1042113182=>'L',
1042213183=>'L',
1042313184=>'L',
1042413185=>'L',
1042513186=>'L',
1042613187=>'L',
1042713188=>'L',
1042813189=>'L',
1042913190=>'L',
1043013191=>'L',
1043113192=>'L',
1043213193=>'L',
1043313194=>'L',
1043413195=>'L',
1043513196=>'L',
1043613197=>'L',
1043713198=>'L',
1043813199=>'L',
1043913200=>'L',
1044013201=>'L',
1044113202=>'L',
1044213203=>'L',
1044313204=>'L',
1044413205=>'L',
1044513206=>'L',
1044613207=>'L',
1044713208=>'L',
1044813209=>'L',
1044913210=>'L',
1045013211=>'L',
1045113212=>'L',
1045213213=>'L',
1045313214=>'L',
1045413215=>'L',
1045513216=>'L',
1045613217=>'L',
1045713218=>'L',
1045813219=>'L',
1045913220=>'L',
1046013221=>'L',
1046113222=>'L',
1046213223=>'L',
1046313224=>'L',
1046413225=>'L',
1046513226=>'L',
1046613227=>'L',
1046713228=>'L',
1046813229=>'L',
1046913230=>'L',
1047013231=>'L',
1047113232=>'L',
1047213233=>'L',
1047313234=>'L',
1047413235=>'L',
1047513236=>'L',
1047613237=>'L',
1047713238=>'L',
1047813239=>'L',
1047913240=>'L',
1048013241=>'L',
1048113242=>'L',
1048213243=>'L',
1048313244=>'L',
1048413245=>'L',
1048513246=>'L',
1048613247=>'L',
1048713248=>'L',
1048813249=>'L',
1048913250=>'L',
1049013251=>'L',
1049113252=>'L',
1049213253=>'L',
1049313254=>'L',
1049413255=>'L',
1049513256=>'L',
1049613257=>'L',
1049713258=>'L',
1049813259=>'L',
1049913260=>'L',
1050013261=>'L',
1050113262=>'L',
1050213263=>'L',
1050313264=>'L',
1050413265=>'L',
1050513266=>'L',
1050613267=>'L',
1050713268=>'L',
1050813269=>'L',
1050913270=>'L',
1051013271=>'L',
1051113272=>'L',
1051213273=>'L',
1051313274=>'L',
1051413275=>'L',
1051513276=>'L',
1051613277=>'L',
1051713278=>'ON',
1051813279=>'ON',
1051913280=>'L',
1052013281=>'L',
1052113282=>'L',
1052213283=>'L',
1052313284=>'L',
1052413285=>'L',
1052513286=>'L',
1052613287=>'L',
1052713288=>'L',
1052813289=>'L',
1052913290=>'L',
1053013291=>'L',
1053113292=>'L',
1053213293=>'L',
1053313294=>'L',
1053413295=>'L',
1053513296=>'L',
1053613297=>'L',
1053713298=>'L',
1053813299=>'L',
1053913300=>'L',
1054013301=>'L',
1054113302=>'L',
1054213303=>'L',
1054313304=>'L',
1054413305=>'L',
1054513306=>'L',
1054613307=>'L',
1054713308=>'L',
1054813309=>'L',
1054913310=>'L',
1055013311=>'ON',
1055113312=>'L',
1055219893=>'L',
1055319904=>'ON',
1055419905=>'ON',
1055519906=>'ON',
1055619907=>'ON',
1055719908=>'ON',
1055819909=>'ON',
1055919910=>'ON',
1056019911=>'ON',
1056119912=>'ON',
1056219913=>'ON',
1056319914=>'ON',
1056419915=>'ON',
1056519916=>'ON',
1056619917=>'ON',
1056719918=>'ON',
1056819919=>'ON',
1056919920=>'ON',
1057019921=>'ON',
1057119922=>'ON',
1057219923=>'ON',
1057319924=>'ON',
1057419925=>'ON',
1057519926=>'ON',
1057619927=>'ON',
1057719928=>'ON',
1057819929=>'ON',
1057919930=>'ON',
1058019931=>'ON',
1058119932=>'ON',
1058219933=>'ON',
1058319934=>'ON',
1058419935=>'ON',
1058519936=>'ON',
1058619937=>'ON',
1058719938=>'ON',
1058819939=>'ON',
1058919940=>'ON',
1059019941=>'ON',
1059119942=>'ON',
1059219943=>'ON',
1059319944=>'ON',
1059419945=>'ON',
1059519946=>'ON',
1059619947=>'ON',
1059719948=>'ON',
1059819949=>'ON',
1059919950=>'ON',
1060019951=>'ON',
1060119952=>'ON',
1060219953=>'ON',
1060319954=>'ON',
1060419955=>'ON',
1060519956=>'ON',
1060619957=>'ON',
1060719958=>'ON',
1060819959=>'ON',
1060919960=>'ON',
1061019961=>'ON',
1061119962=>'ON',
1061219963=>'ON',
1061319964=>'ON',
1061419965=>'ON',
1061519966=>'ON',
1061619967=>'ON',
1061719968=>'L',
1061840891=>'L',
1061940960=>'L',
1062040961=>'L',
1062140962=>'L',
1062240963=>'L',
1062340964=>'L',
1062440965=>'L',
1062540966=>'L',
1062640967=>'L',
1062740968=>'L',
1062840969=>'L',
1062940970=>'L',
1063040971=>'L',
1063140972=>'L',
1063240973=>'L',
1063340974=>'L',
1063440975=>'L',
1063540976=>'L',
1063640977=>'L',
1063740978=>'L',
1063840979=>'L',
1063940980=>'L',
1064040981=>'L',
1064140982=>'L',
1064240983=>'L',
1064340984=>'L',
1064440985=>'L',
1064540986=>'L',
1064640987=>'L',
1064740988=>'L',
1064840989=>'L',
1064940990=>'L',
1065040991=>'L',
1065140992=>'L',
1065240993=>'L',
1065340994=>'L',
1065440995=>'L',
1065540996=>'L',
1065640997=>'L',
1065740998=>'L',
1065840999=>'L',
1065941000=>'L',
1066041001=>'L',
1066141002=>'L',
1066241003=>'L',
1066341004=>'L',
1066441005=>'L',
1066541006=>'L',
1066641007=>'L',
1066741008=>'L',
1066841009=>'L',
1066941010=>'L',
1067041011=>'L',
1067141012=>'L',
1067241013=>'L',
1067341014=>'L',
1067441015=>'L',
1067541016=>'L',
1067641017=>'L',
1067741018=>'L',
1067841019=>'L',
1067941020=>'L',
1068041021=>'L',
1068141022=>'L',
1068241023=>'L',
1068341024=>'L',
1068441025=>'L',
1068541026=>'L',
1068641027=>'L',
1068741028=>'L',
1068841029=>'L',
1068941030=>'L',
1069041031=>'L',
1069141032=>'L',
1069241033=>'L',
1069341034=>'L',
1069441035=>'L',
1069541036=>'L',
1069641037=>'L',
1069741038=>'L',
1069841039=>'L',
1069941040=>'L',
1070041041=>'L',
1070141042=>'L',
1070241043=>'L',
1070341044=>'L',
1070441045=>'L',
1070541046=>'L',
1070641047=>'L',
1070741048=>'L',
1070841049=>'L',
1070941050=>'L',
1071041051=>'L',
1071141052=>'L',
1071241053=>'L',
1071341054=>'L',
1071441055=>'L',
1071541056=>'L',
1071641057=>'L',
1071741058=>'L',
1071841059=>'L',
1071941060=>'L',
1072041061=>'L',
1072141062=>'L',
1072241063=>'L',
1072341064=>'L',
1072441065=>'L',
1072541066=>'L',
1072641067=>'L',
1072741068=>'L',
1072841069=>'L',
1072941070=>'L',
1073041071=>'L',
1073141072=>'L',
1073241073=>'L',
1073341074=>'L',
1073441075=>'L',
1073541076=>'L',
1073641077=>'L',
1073741078=>'L',
1073841079=>'L',
1073941080=>'L',
1074041081=>'L',
1074141082=>'L',
1074241083=>'L',
1074341084=>'L',
1074441085=>'L',
1074541086=>'L',
1074641087=>'L',
1074741088=>'L',
1074841089=>'L',
1074941090=>'L',
1075041091=>'L',
1075141092=>'L',
1075241093=>'L',
1075341094=>'L',
1075441095=>'L',
1075541096=>'L',
1075641097=>'L',
1075741098=>'L',
1075841099=>'L',
1075941100=>'L',
1076041101=>'L',
1076141102=>'L',
1076241103=>'L',
1076341104=>'L',
1076441105=>'L',
1076541106=>'L',
1076641107=>'L',
1076741108=>'L',
1076841109=>'L',
1076941110=>'L',
1077041111=>'L',
1077141112=>'L',
1077241113=>'L',
1077341114=>'L',
1077441115=>'L',
1077541116=>'L',
1077641117=>'L',
1077741118=>'L',
1077841119=>'L',
1077941120=>'L',
1078041121=>'L',
1078141122=>'L',
1078241123=>'L',
1078341124=>'L',
1078441125=>'L',
1078541126=>'L',
1078641127=>'L',
1078741128=>'L',
1078841129=>'L',
1078941130=>'L',
1079041131=>'L',
1079141132=>'L',
1079241133=>'L',
1079341134=>'L',
1079441135=>'L',
1079541136=>'L',
1079641137=>'L',
1079741138=>'L',
1079841139=>'L',
1079941140=>'L',
1080041141=>'L',
1080141142=>'L',
1080241143=>'L',
1080341144=>'L',
1080441145=>'L',
1080541146=>'L',
1080641147=>'L',
1080741148=>'L',
1080841149=>'L',
1080941150=>'L',
1081041151=>'L',
1081141152=>'L',
1081241153=>'L',
1081341154=>'L',
1081441155=>'L',
1081541156=>'L',
1081641157=>'L',
1081741158=>'L',
1081841159=>'L',
1081941160=>'L',
1082041161=>'L',
1082141162=>'L',
1082241163=>'L',
1082341164=>'L',
1082441165=>'L',
1082541166=>'L',
1082641167=>'L',
1082741168=>'L',
1082841169=>'L',
1082941170=>'L',
1083041171=>'L',
1083141172=>'L',
1083241173=>'L',
1083341174=>'L',
1083441175=>'L',
1083541176=>'L',
1083641177=>'L',
1083741178=>'L',
1083841179=>'L',
1083941180=>'L',
1084041181=>'L',
1084141182=>'L',
1084241183=>'L',
1084341184=>'L',
1084441185=>'L',
1084541186=>'L',
1084641187=>'L',
1084741188=>'L',
1084841189=>'L',
1084941190=>'L',
1085041191=>'L',
1085141192=>'L',
1085241193=>'L',
1085341194=>'L',
1085441195=>'L',
1085541196=>'L',
1085641197=>'L',
1085741198=>'L',
1085841199=>'L',
1085941200=>'L',
1086041201=>'L',
1086141202=>'L',
1086241203=>'L',
1086341204=>'L',
1086441205=>'L',
1086541206=>'L',
1086641207=>'L',
1086741208=>'L',
1086841209=>'L',
1086941210=>'L',
1087041211=>'L',
1087141212=>'L',
1087241213=>'L',
1087341214=>'L',
1087441215=>'L',
1087541216=>'L',
1087641217=>'L',
1087741218=>'L',
1087841219=>'L',
1087941220=>'L',
1088041221=>'L',
1088141222=>'L',
1088241223=>'L',
1088341224=>'L',
1088441225=>'L',
1088541226=>'L',
1088641227=>'L',
1088741228=>'L',
1088841229=>'L',
1088941230=>'L',
1089041231=>'L',
1089141232=>'L',
1089241233=>'L',
1089341234=>'L',
1089441235=>'L',
1089541236=>'L',
1089641237=>'L',
1089741238=>'L',
1089841239=>'L',
1089941240=>'L',
1090041241=>'L',
1090141242=>'L',
1090241243=>'L',
1090341244=>'L',
1090441245=>'L',
1090541246=>'L',
1090641247=>'L',
1090741248=>'L',
1090841249=>'L',
1090941250=>'L',
1091041251=>'L',
1091141252=>'L',
1091241253=>'L',
1091341254=>'L',
1091441255=>'L',
1091541256=>'L',
1091641257=>'L',
1091741258=>'L',
1091841259=>'L',
1091941260=>'L',
1092041261=>'L',
1092141262=>'L',
1092241263=>'L',
1092341264=>'L',
1092441265=>'L',
1092541266=>'L',
1092641267=>'L',
1092741268=>'L',
1092841269=>'L',
1092941270=>'L',
1093041271=>'L',
1093141272=>'L',
1093241273=>'L',
1093341274=>'L',
1093441275=>'L',
1093541276=>'L',
1093641277=>'L',
1093741278=>'L',
1093841279=>'L',
1093941280=>'L',
1094041281=>'L',
1094141282=>'L',
1094241283=>'L',
1094341284=>'L',
1094441285=>'L',
1094541286=>'L',
1094641287=>'L',
1094741288=>'L',
1094841289=>'L',
1094941290=>'L',
1095041291=>'L',
1095141292=>'L',
1095241293=>'L',
1095341294=>'L',
1095441295=>'L',
1095541296=>'L',
1095641297=>'L',
1095741298=>'L',
1095841299=>'L',
1095941300=>'L',
1096041301=>'L',
1096141302=>'L',
1096241303=>'L',
1096341304=>'L',
1096441305=>'L',
1096541306=>'L',
1096641307=>'L',
1096741308=>'L',
1096841309=>'L',
1096941310=>'L',
1097041311=>'L',
1097141312=>'L',
1097241313=>'L',
1097341314=>'L',
1097441315=>'L',
1097541316=>'L',
1097641317=>'L',
1097741318=>'L',
1097841319=>'L',
1097941320=>'L',
1098041321=>'L',
1098141322=>'L',
1098241323=>'L',
1098341324=>'L',
1098441325=>'L',
1098541326=>'L',
1098641327=>'L',
1098741328=>'L',
1098841329=>'L',
1098941330=>'L',
1099041331=>'L',
1099141332=>'L',
1099241333=>'L',
1099341334=>'L',
1099441335=>'L',
1099541336=>'L',
1099641337=>'L',
1099741338=>'L',
1099841339=>'L',
1099941340=>'L',
1100041341=>'L',
1100141342=>'L',
1100241343=>'L',
1100341344=>'L',
1100441345=>'L',
1100541346=>'L',
1100641347=>'L',
1100741348=>'L',
1100841349=>'L',
1100941350=>'L',
1101041351=>'L',
1101141352=>'L',
1101241353=>'L',
1101341354=>'L',
1101441355=>'L',
1101541356=>'L',
1101641357=>'L',
1101741358=>'L',
1101841359=>'L',
1101941360=>'L',
1102041361=>'L',
1102141362=>'L',
1102241363=>'L',
1102341364=>'L',
1102441365=>'L',
1102541366=>'L',
1102641367=>'L',
1102741368=>'L',
1102841369=>'L',
1102941370=>'L',
1103041371=>'L',
1103141372=>'L',
1103241373=>'L',
1103341374=>'L',
1103441375=>'L',
1103541376=>'L',
1103641377=>'L',
1103741378=>'L',
1103841379=>'L',
1103941380=>'L',
1104041381=>'L',
1104141382=>'L',
1104241383=>'L',
1104341384=>'L',
1104441385=>'L',
1104541386=>'L',
1104641387=>'L',
1104741388=>'L',
1104841389=>'L',
1104941390=>'L',
1105041391=>'L',
1105141392=>'L',
1105241393=>'L',
1105341394=>'L',
1105441395=>'L',
1105541396=>'L',
1105641397=>'L',
1105741398=>'L',
1105841399=>'L',
1105941400=>'L',
1106041401=>'L',
1106141402=>'L',
1106241403=>'L',
1106341404=>'L',
1106441405=>'L',
1106541406=>'L',
1106641407=>'L',
1106741408=>'L',
1106841409=>'L',
1106941410=>'L',
1107041411=>'L',
1107141412=>'L',
1107241413=>'L',
1107341414=>'L',
1107441415=>'L',
1107541416=>'L',
1107641417=>'L',
1107741418=>'L',
1107841419=>'L',
1107941420=>'L',
1108041421=>'L',
1108141422=>'L',
1108241423=>'L',
1108341424=>'L',
1108441425=>'L',
1108541426=>'L',
1108641427=>'L',
1108741428=>'L',
1108841429=>'L',
1108941430=>'L',
1109041431=>'L',
1109141432=>'L',
1109241433=>'L',
1109341434=>'L',
1109441435=>'L',
1109541436=>'L',
1109641437=>'L',
1109741438=>'L',
1109841439=>'L',
1109941440=>'L',
1110041441=>'L',
1110141442=>'L',
1110241443=>'L',
1110341444=>'L',
1110441445=>'L',
1110541446=>'L',
1110641447=>'L',
1110741448=>'L',
1110841449=>'L',
1110941450=>'L',
1111041451=>'L',
1111141452=>'L',
1111241453=>'L',
1111341454=>'L',
1111441455=>'L',
1111541456=>'L',
1111641457=>'L',
1111741458=>'L',
1111841459=>'L',
1111941460=>'L',
1112041461=>'L',
1112141462=>'L',
1112241463=>'L',
1112341464=>'L',
1112441465=>'L',
1112541466=>'L',
1112641467=>'L',
1112741468=>'L',
1112841469=>'L',
1112941470=>'L',
1113041471=>'L',
1113141472=>'L',
1113241473=>'L',
1113341474=>'L',
1113441475=>'L',
1113541476=>'L',
1113641477=>'L',
1113741478=>'L',
1113841479=>'L',
1113941480=>'L',
1114041481=>'L',
1114141482=>'L',
1114241483=>'L',
1114341484=>'L',
1114441485=>'L',
1114541486=>'L',
1114641487=>'L',
1114741488=>'L',
1114841489=>'L',
1114941490=>'L',
1115041491=>'L',
1115141492=>'L',
1115241493=>'L',
1115341494=>'L',
1115441495=>'L',
1115541496=>'L',
1115641497=>'L',
1115741498=>'L',
1115841499=>'L',
1115941500=>'L',
1116041501=>'L',
1116141502=>'L',
1116241503=>'L',
1116341504=>'L',
1116441505=>'L',
1116541506=>'L',
1116641507=>'L',
1116741508=>'L',
1116841509=>'L',
1116941510=>'L',
1117041511=>'L',
1117141512=>'L',
1117241513=>'L',
1117341514=>'L',
1117441515=>'L',
1117541516=>'L',
1117641517=>'L',
1117741518=>'L',
1117841519=>'L',
1117941520=>'L',
1118041521=>'L',
1118141522=>'L',
1118241523=>'L',
1118341524=>'L',
1118441525=>'L',
1118541526=>'L',
1118641527=>'L',
1118741528=>'L',
1118841529=>'L',
1118941530=>'L',
1119041531=>'L',
1119141532=>'L',
1119241533=>'L',
1119341534=>'L',
1119441535=>'L',
1119541536=>'L',
1119641537=>'L',
1119741538=>'L',
1119841539=>'L',
1119941540=>'L',
1120041541=>'L',
1120141542=>'L',
1120241543=>'L',
1120341544=>'L',
1120441545=>'L',
1120541546=>'L',
1120641547=>'L',
1120741548=>'L',
1120841549=>'L',
1120941550=>'L',
1121041551=>'L',
1121141552=>'L',
1121241553=>'L',
1121341554=>'L',
1121441555=>'L',
1121541556=>'L',
1121641557=>'L',
1121741558=>'L',
1121841559=>'L',
1121941560=>'L',
1122041561=>'L',
1122141562=>'L',
1122241563=>'L',
1122341564=>'L',
1122441565=>'L',
1122541566=>'L',
1122641567=>'L',
1122741568=>'L',
1122841569=>'L',
1122941570=>'L',
1123041571=>'L',
1123141572=>'L',
1123241573=>'L',
1123341574=>'L',
1123441575=>'L',
1123541576=>'L',
1123641577=>'L',
1123741578=>'L',
1123841579=>'L',
1123941580=>'L',
1124041581=>'L',
1124141582=>'L',
1124241583=>'L',
1124341584=>'L',
1124441585=>'L',
1124541586=>'L',
1124641587=>'L',
1124741588=>'L',
1124841589=>'L',
1124941590=>'L',
1125041591=>'L',
1125141592=>'L',
1125241593=>'L',
1125341594=>'L',
1125441595=>'L',
1125541596=>'L',
1125641597=>'L',
1125741598=>'L',
1125841599=>'L',
1125941600=>'L',
1126041601=>'L',
1126141602=>'L',
1126241603=>'L',
1126341604=>'L',
1126441605=>'L',
1126541606=>'L',
1126641607=>'L',
1126741608=>'L',
1126841609=>'L',
1126941610=>'L',
1127041611=>'L',
1127141612=>'L',
1127241613=>'L',
1127341614=>'L',
1127441615=>'L',
1127541616=>'L',
1127641617=>'L',
1127741618=>'L',
1127841619=>'L',
1127941620=>'L',
1128041621=>'L',
1128141622=>'L',
1128241623=>'L',
1128341624=>'L',
1128441625=>'L',
1128541626=>'L',
1128641627=>'L',
1128741628=>'L',
1128841629=>'L',
1128941630=>'L',
1129041631=>'L',
1129141632=>'L',
1129241633=>'L',
1129341634=>'L',
1129441635=>'L',
1129541636=>'L',
1129641637=>'L',
1129741638=>'L',
1129841639=>'L',
1129941640=>'L',
1130041641=>'L',
1130141642=>'L',
1130241643=>'L',
1130341644=>'L',
1130441645=>'L',
1130541646=>'L',
1130641647=>'L',
1130741648=>'L',
1130841649=>'L',
1130941650=>'L',
1131041651=>'L',
1131141652=>'L',
1131241653=>'L',
1131341654=>'L',
1131441655=>'L',
1131541656=>'L',
1131641657=>'L',
1131741658=>'L',
1131841659=>'L',
1131941660=>'L',
1132041661=>'L',
1132141662=>'L',
1132241663=>'L',
1132341664=>'L',
1132441665=>'L',
1132541666=>'L',
1132641667=>'L',
1132741668=>'L',
1132841669=>'L',
1132941670=>'L',
1133041671=>'L',
1133141672=>'L',
1133241673=>'L',
1133341674=>'L',
1133441675=>'L',
1133541676=>'L',
1133641677=>'L',
1133741678=>'L',
1133841679=>'L',
1133941680=>'L',
1134041681=>'L',
1134141682=>'L',
1134241683=>'L',
1134341684=>'L',
1134441685=>'L',
1134541686=>'L',
1134641687=>'L',
1134741688=>'L',
1134841689=>'L',
1134941690=>'L',
1135041691=>'L',
1135141692=>'L',
1135241693=>'L',
1135341694=>'L',
1135441695=>'L',
1135541696=>'L',
1135641697=>'L',
1135741698=>'L',
1135841699=>'L',
1135941700=>'L',
1136041701=>'L',
1136141702=>'L',
1136241703=>'L',
1136341704=>'L',
1136441705=>'L',
1136541706=>'L',
1136641707=>'L',
1136741708=>'L',
1136841709=>'L',
1136941710=>'L',
1137041711=>'L',
1137141712=>'L',
1137241713=>'L',
1137341714=>'L',
1137441715=>'L',
1137541716=>'L',
1137641717=>'L',
1137741718=>'L',
1137841719=>'L',
1137941720=>'L',
1138041721=>'L',
1138141722=>'L',
1138241723=>'L',
1138341724=>'L',
1138441725=>'L',
1138541726=>'L',
1138641727=>'L',
1138741728=>'L',
1138841729=>'L',
1138941730=>'L',
1139041731=>'L',
1139141732=>'L',
1139241733=>'L',
1139341734=>'L',
1139441735=>'L',
1139541736=>'L',
1139641737=>'L',
1139741738=>'L',
1139841739=>'L',
1139941740=>'L',
1140041741=>'L',
1140141742=>'L',
1140241743=>'L',
1140341744=>'L',
1140441745=>'L',
1140541746=>'L',
1140641747=>'L',
1140741748=>'L',
1140841749=>'L',
1140941750=>'L',
1141041751=>'L',
1141141752=>'L',
1141241753=>'L',
1141341754=>'L',
1141441755=>'L',
1141541756=>'L',
1141641757=>'L',
1141741758=>'L',
1141841759=>'L',
1141941760=>'L',
1142041761=>'L',
1142141762=>'L',
1142241763=>'L',
1142341764=>'L',
1142441765=>'L',
1142541766=>'L',
1142641767=>'L',
1142741768=>'L',
1142841769=>'L',
1142941770=>'L',
1143041771=>'L',
1143141772=>'L',
1143241773=>'L',
1143341774=>'L',
1143441775=>'L',
1143541776=>'L',
1143641777=>'L',
1143741778=>'L',
1143841779=>'L',
1143941780=>'L',
1144041781=>'L',
1144141782=>'L',
1144241783=>'L',
1144341784=>'L',
1144441785=>'L',
1144541786=>'L',
1144641787=>'L',
1144741788=>'L',
1144841789=>'L',
1144941790=>'L',
1145041791=>'L',
1145141792=>'L',
1145241793=>'L',
1145341794=>'L',
1145441795=>'L',
1145541796=>'L',
1145641797=>'L',
1145741798=>'L',
1145841799=>'L',
1145941800=>'L',
1146041801=>'L',
1146141802=>'L',
1146241803=>'L',
1146341804=>'L',
1146441805=>'L',
1146541806=>'L',
1146641807=>'L',
1146741808=>'L',
1146841809=>'L',
1146941810=>'L',
1147041811=>'L',
1147141812=>'L',
1147241813=>'L',
1147341814=>'L',
1147441815=>'L',
1147541816=>'L',
1147641817=>'L',
1147741818=>'L',
1147841819=>'L',
1147941820=>'L',
1148041821=>'L',
1148141822=>'L',
1148241823=>'L',
1148341824=>'L',
1148441825=>'L',
1148541826=>'L',
1148641827=>'L',
1148741828=>'L',
1148841829=>'L',
1148941830=>'L',
1149041831=>'L',
1149141832=>'L',
1149241833=>'L',
1149341834=>'L',
1149441835=>'L',
1149541836=>'L',
1149641837=>'L',
1149741838=>'L',
1149841839=>'L',
1149941840=>'L',
1150041841=>'L',
1150141842=>'L',
1150241843=>'L',
1150341844=>'L',
1150441845=>'L',
1150541846=>'L',
1150641847=>'L',
1150741848=>'L',
1150841849=>'L',
1150941850=>'L',
1151041851=>'L',
1151141852=>'L',
1151241853=>'L',
1151341854=>'L',
1151441855=>'L',
1151541856=>'L',
1151641857=>'L',
1151741858=>'L',
1151841859=>'L',
1151941860=>'L',
1152041861=>'L',
1152141862=>'L',
1152241863=>'L',
1152341864=>'L',
1152441865=>'L',
1152541866=>'L',
1152641867=>'L',
1152741868=>'L',
1152841869=>'L',
1152941870=>'L',
1153041871=>'L',
1153141872=>'L',
1153241873=>'L',
1153341874=>'L',
1153441875=>'L',
1153541876=>'L',
1153641877=>'L',
1153741878=>'L',
1153841879=>'L',
1153941880=>'L',
1154041881=>'L',
1154141882=>'L',
1154241883=>'L',
1154341884=>'L',
1154441885=>'L',
1154541886=>'L',
1154641887=>'L',
1154741888=>'L',
1154841889=>'L',
1154941890=>'L',
1155041891=>'L',
1155141892=>'L',
1155241893=>'L',
1155341894=>'L',
1155441895=>'L',
1155541896=>'L',
1155641897=>'L',
1155741898=>'L',
1155841899=>'L',
1155941900=>'L',
1156041901=>'L',
1156141902=>'L',
1156241903=>'L',
1156341904=>'L',
1156441905=>'L',
1156541906=>'L',
1156641907=>'L',
1156741908=>'L',
1156841909=>'L',
1156941910=>'L',
1157041911=>'L',
1157141912=>'L',
1157241913=>'L',
1157341914=>'L',
1157441915=>'L',
1157541916=>'L',
1157641917=>'L',
1157741918=>'L',
1157841919=>'L',
1157941920=>'L',
1158041921=>'L',
1158141922=>'L',
1158241923=>'L',
1158341924=>'L',
1158441925=>'L',
1158541926=>'L',
1158641927=>'L',
1158741928=>'L',
1158841929=>'L',
1158941930=>'L',
1159041931=>'L',
1159141932=>'L',
1159241933=>'L',
1159341934=>'L',
1159441935=>'L',
1159541936=>'L',
1159641937=>'L',
1159741938=>'L',
1159841939=>'L',
1159941940=>'L',
1160041941=>'L',
1160141942=>'L',
1160241943=>'L',
1160341944=>'L',
1160441945=>'L',
1160541946=>'L',
1160641947=>'L',
1160741948=>'L',
1160841949=>'L',
1160941950=>'L',
1161041951=>'L',
1161141952=>'L',
1161241953=>'L',
1161341954=>'L',
1161441955=>'L',
1161541956=>'L',
1161641957=>'L',
1161741958=>'L',
1161841959=>'L',
1161941960=>'L',
1162041961=>'L',
1162141962=>'L',
1162241963=>'L',
1162341964=>'L',
1162441965=>'L',
1162541966=>'L',
1162641967=>'L',
1162741968=>'L',
1162841969=>'L',
1162941970=>'L',
1163041971=>'L',
1163141972=>'L',
1163241973=>'L',
1163341974=>'L',
1163441975=>'L',
1163541976=>'L',
1163641977=>'L',
1163741978=>'L',
1163841979=>'L',
1163941980=>'L',
1164041981=>'L',
1164141982=>'L',
1164241983=>'L',
1164341984=>'L',
1164441985=>'L',
1164541986=>'L',
1164641987=>'L',
1164741988=>'L',
1164841989=>'L',
1164941990=>'L',
1165041991=>'L',
1165141992=>'L',
1165241993=>'L',
1165341994=>'L',
1165441995=>'L',
1165541996=>'L',
1165641997=>'L',
1165741998=>'L',
1165841999=>'L',
1165942000=>'L',
1166042001=>'L',
1166142002=>'L',
1166242003=>'L',
1166342004=>'L',
1166442005=>'L',
1166542006=>'L',
1166642007=>'L',
1166742008=>'L',
1166842009=>'L',
1166942010=>'L',
1167042011=>'L',
1167142012=>'L',
1167242013=>'L',
1167342014=>'L',
1167442015=>'L',
1167542016=>'L',
1167642017=>'L',
1167742018=>'L',
1167842019=>'L',
1167942020=>'L',
1168042021=>'L',
1168142022=>'L',
1168242023=>'L',
1168342024=>'L',
1168442025=>'L',
1168542026=>'L',
1168642027=>'L',
1168742028=>'L',
1168842029=>'L',
1168942030=>'L',
1169042031=>'L',
1169142032=>'L',
1169242033=>'L',
1169342034=>'L',
1169442035=>'L',
1169542036=>'L',
1169642037=>'L',
1169742038=>'L',
1169842039=>'L',
1169942040=>'L',
1170042041=>'L',
1170142042=>'L',
1170242043=>'L',
1170342044=>'L',
1170442045=>'L',
1170542046=>'L',
1170642047=>'L',
1170742048=>'L',
1170842049=>'L',
1170942050=>'L',
1171042051=>'L',
1171142052=>'L',
1171242053=>'L',
1171342054=>'L',
1171442055=>'L',
1171542056=>'L',
1171642057=>'L',
1171742058=>'L',
1171842059=>'L',
1171942060=>'L',
1172042061=>'L',
1172142062=>'L',
1172242063=>'L',
1172342064=>'L',
1172442065=>'L',
1172542066=>'L',
1172642067=>'L',
1172742068=>'L',
1172842069=>'L',
1172942070=>'L',
1173042071=>'L',
1173142072=>'L',
1173242073=>'L',
1173342074=>'L',
1173442075=>'L',
1173542076=>'L',
1173642077=>'L',
1173742078=>'L',
1173842079=>'L',
1173942080=>'L',
1174042081=>'L',
1174142082=>'L',
1174242083=>'L',
1174342084=>'L',
1174442085=>'L',
1174542086=>'L',
1174642087=>'L',
1174742088=>'L',
1174842089=>'L',
1174942090=>'L',
1175042091=>'L',
1175142092=>'L',
1175242093=>'L',
1175342094=>'L',
1175442095=>'L',
1175542096=>'L',
1175642097=>'L',
1175742098=>'L',
1175842099=>'L',
1175942100=>'L',
1176042101=>'L',
1176142102=>'L',
1176242103=>'L',
1176342104=>'L',
1176442105=>'L',
1176542106=>'L',
1176642107=>'L',
1176742108=>'L',
1176842109=>'L',
1176942110=>'L',
1177042111=>'L',
1177142112=>'L',
1177242113=>'L',
1177342114=>'L',
1177442115=>'L',
1177542116=>'L',
1177642117=>'L',
1177742118=>'L',
1177842119=>'L',
1177942120=>'L',
1178042121=>'L',
1178142122=>'L',
1178242123=>'L',
1178342124=>'L',
1178442128=>'ON',
1178542129=>'ON',
1178642130=>'ON',
1178742131=>'ON',
1178842132=>'ON',
1178942133=>'ON',
1179042134=>'ON',
1179142135=>'ON',
1179242136=>'ON',
1179342137=>'ON',
1179442138=>'ON',
1179542139=>'ON',
1179642140=>'ON',
1179742141=>'ON',
1179842142=>'ON',
1179942143=>'ON',
1180042144=>'ON',
1180142145=>'ON',
1180242146=>'ON',
1180342147=>'ON',
1180442148=>'ON',
1180542149=>'ON',
1180642150=>'ON',
1180742151=>'ON',
1180842152=>'ON',
1180942153=>'ON',
1181042154=>'ON',
1181142155=>'ON',
1181242156=>'ON',
1181342157=>'ON',
1181442158=>'ON',
1181542159=>'ON',
1181642160=>'ON',
1181742161=>'ON',
1181842162=>'ON',
1181942163=>'ON',
1182042164=>'ON',
1182142165=>'ON',
1182242166=>'ON',
1182342167=>'ON',
1182442168=>'ON',
1182542169=>'ON',
1182642170=>'ON',
1182742171=>'ON',
1182842172=>'ON',
1182942173=>'ON',
1183042174=>'ON',
1183142175=>'ON',
1183242176=>'ON',
1183342177=>'ON',
1183442178=>'ON',
1183542179=>'ON',
1183642180=>'ON',
1183742181=>'ON',
1183842182=>'ON',
1183942752=>'ON',
1184042753=>'ON',
1184142754=>'ON',
1184242755=>'ON',
1184342756=>'ON',
1184442757=>'ON',
1184542758=>'ON',
1184642759=>'ON',
1184742760=>'ON',
1184842761=>'ON',
1184942762=>'ON',
1185042763=>'ON',
1185142764=>'ON',
1185242765=>'ON',
1185342766=>'ON',
1185442767=>'ON',
1185542768=>'ON',
1185642769=>'ON',
1185742770=>'ON',
1185842771=>'ON',
1185942772=>'ON',
1186042773=>'ON',
1186142774=>'ON',
1186242775=>'ON',
1186342776=>'ON',
1186442777=>'ON',
1186542778=>'ON',
1186642784=>'ON',
1186742785=>'ON',
1186843008=>'L',
1186943009=>'L',
1187043010=>'NSM',
1187143011=>'L',
1187243012=>'L',
1187343013=>'L',
1187443014=>'NSM',
1187543015=>'L',
1187643016=>'L',
1187743017=>'L',
1187843018=>'L',
1187943019=>'NSM',
1188043020=>'L',
1188143021=>'L',
1188243022=>'L',
1188343023=>'L',
1188443024=>'L',
1188543025=>'L',
1188643026=>'L',
1188743027=>'L',
1188843028=>'L',
1188943029=>'L',
1189043030=>'L',
1189143031=>'L',
1189243032=>'L',
1189343033=>'L',
1189443034=>'L',
1189543035=>'L',
1189643036=>'L',
1189743037=>'L',
1189843038=>'L',
1189943039=>'L',
1190043040=>'L',
1190143041=>'L',
1190243042=>'L',
1190343043=>'L',
1190443044=>'L',
1190543045=>'NSM',
1190643046=>'NSM',
1190743047=>'L',
1190843048=>'ON',
1190943049=>'ON',
1191043050=>'ON',
1191143051=>'ON',
1191243072=>'L',
1191343073=>'L',
1191443074=>'L',
1191543075=>'L',
1191643076=>'L',
1191743077=>'L',
1191843078=>'L',
1191943079=>'L',
1192043080=>'L',
1192143081=>'L',
1192243082=>'L',
1192343083=>'L',
1192443084=>'L',
1192543085=>'L',
1192643086=>'L',
1192743087=>'L',
1192843088=>'L',
1192943089=>'L',
1193043090=>'L',
1193143091=>'L',
1193243092=>'L',
1193343093=>'L',
1193443094=>'L',
1193543095=>'L',
1193643096=>'L',
1193743097=>'L',
1193843098=>'L',
1193943099=>'L',
1194043100=>'L',
1194143101=>'L',
1194243102=>'L',
1194343103=>'L',
1194443104=>'L',
1194543105=>'L',
1194643106=>'L',
1194743107=>'L',
1194843108=>'L',
1194943109=>'L',
1195043110=>'L',
1195143111=>'L',
1195243112=>'L',
1195343113=>'L',
1195443114=>'L',
1195543115=>'L',
1195643116=>'L',
1195743117=>'L',
1195843118=>'L',
1195943119=>'L',
1196043120=>'L',
1196143121=>'L',
1196243122=>'L',
1196343123=>'L',
1196443124=>'ON',
1196543125=>'ON',
1196643126=>'ON',
1196743127=>'ON',
1196844032=>'L',
1196955203=>'L',
1197055296=>'L',
1197156191=>'L',
1197256192=>'L',
1197356319=>'L',
1197456320=>'L',
1197557343=>'L',
1197657344=>'L',
1197763743=>'L',
1197863744=>'L',
1197963745=>'L',
1198063746=>'L',
1198163747=>'L',
1198263748=>'L',
1198363749=>'L',
1198463750=>'L',
1198563751=>'L',
1198663752=>'L',
1198763753=>'L',
1198863754=>'L',
1198963755=>'L',
1199063756=>'L',
1199163757=>'L',
1199263758=>'L',
1199363759=>'L',
1199463760=>'L',
1199563761=>'L',
1199663762=>'L',
1199763763=>'L',
1199863764=>'L',
1199963765=>'L',
1200063766=>'L',
1200163767=>'L',
1200263768=>'L',
1200363769=>'L',
1200463770=>'L',
1200563771=>'L',
1200663772=>'L',
1200763773=>'L',
1200863774=>'L',
1200963775=>'L',
1201063776=>'L',
1201163777=>'L',
1201263778=>'L',
1201363779=>'L',
1201463780=>'L',
1201563781=>'L',
1201663782=>'L',
1201763783=>'L',
1201863784=>'L',
1201963785=>'L',
1202063786=>'L',
1202163787=>'L',
1202263788=>'L',
1202363789=>'L',
1202463790=>'L',
1202563791=>'L',
1202663792=>'L',
1202763793=>'L',
1202863794=>'L',
1202963795=>'L',
1203063796=>'L',
1203163797=>'L',
1203263798=>'L',
1203363799=>'L',
1203463800=>'L',
1203563801=>'L',
1203663802=>'L',
1203763803=>'L',
1203863804=>'L',
1203963805=>'L',
1204063806=>'L',
1204163807=>'L',
1204263808=>'L',
1204363809=>'L',
1204463810=>'L',
1204563811=>'L',
1204663812=>'L',
1204763813=>'L',
1204863814=>'L',
1204963815=>'L',
1205063816=>'L',
1205163817=>'L',
1205263818=>'L',
1205363819=>'L',
1205463820=>'L',
1205563821=>'L',
1205663822=>'L',
1205763823=>'L',
1205863824=>'L',
1205963825=>'L',
1206063826=>'L',
1206163827=>'L',
1206263828=>'L',
1206363829=>'L',
1206463830=>'L',
1206563831=>'L',
1206663832=>'L',
1206763833=>'L',
1206863834=>'L',
1206963835=>'L',
1207063836=>'L',
1207163837=>'L',
1207263838=>'L',
1207363839=>'L',
1207463840=>'L',
1207563841=>'L',
1207663842=>'L',
1207763843=>'L',
1207863844=>'L',
1207963845=>'L',
1208063846=>'L',
1208163847=>'L',
1208263848=>'L',
1208363849=>'L',
1208463850=>'L',
1208563851=>'L',
1208663852=>'L',
1208763853=>'L',
1208863854=>'L',
1208963855=>'L',
1209063856=>'L',
1209163857=>'L',
1209263858=>'L',
1209363859=>'L',
1209463860=>'L',
1209563861=>'L',
1209663862=>'L',
1209763863=>'L',
1209863864=>'L',
1209963865=>'L',
1210063866=>'L',
1210163867=>'L',
1210263868=>'L',
1210363869=>'L',
1210463870=>'L',
1210563871=>'L',
1210663872=>'L',
1210763873=>'L',
1210863874=>'L',
1210963875=>'L',
1211063876=>'L',
1211163877=>'L',
1211263878=>'L',
1211363879=>'L',
1211463880=>'L',
1211563881=>'L',
1211663882=>'L',
1211763883=>'L',
1211863884=>'L',
1211963885=>'L',
1212063886=>'L',
1212163887=>'L',
1212263888=>'L',
1212363889=>'L',
1212463890=>'L',
1212563891=>'L',
1212663892=>'L',
1212763893=>'L',
1212863894=>'L',
1212963895=>'L',
1213063896=>'L',
1213163897=>'L',
1213263898=>'L',
1213363899=>'L',
1213463900=>'L',
1213563901=>'L',
1213663902=>'L',
1213763903=>'L',
1213863904=>'L',
1213963905=>'L',
1214063906=>'L',
1214163907=>'L',
1214263908=>'L',
1214363909=>'L',
1214463910=>'L',
1214563911=>'L',
1214663912=>'L',
1214763913=>'L',
1214863914=>'L',
1214963915=>'L',
1215063916=>'L',
1215163917=>'L',
1215263918=>'L',
1215363919=>'L',
1215463920=>'L',
1215563921=>'L',
1215663922=>'L',
1215763923=>'L',
1215863924=>'L',
1215963925=>'L',
1216063926=>'L',
1216163927=>'L',
1216263928=>'L',
1216363929=>'L',
1216463930=>'L',
1216563931=>'L',
1216663932=>'L',
1216763933=>'L',
1216863934=>'L',
1216963935=>'L',
1217063936=>'L',
1217163937=>'L',
1217263938=>'L',
1217363939=>'L',
1217463940=>'L',
1217563941=>'L',
1217663942=>'L',
1217763943=>'L',
1217863944=>'L',
1217963945=>'L',
1218063946=>'L',
1218163947=>'L',
1218263948=>'L',
1218363949=>'L',
1218463950=>'L',
1218563951=>'L',
1218663952=>'L',
1218763953=>'L',
1218863954=>'L',
1218963955=>'L',
1219063956=>'L',
1219163957=>'L',
1219263958=>'L',
1219363959=>'L',
1219463960=>'L',
1219563961=>'L',
1219663962=>'L',
1219763963=>'L',
1219863964=>'L',
1219963965=>'L',
1220063966=>'L',
1220163967=>'L',
1220263968=>'L',
1220363969=>'L',
1220463970=>'L',
1220563971=>'L',
1220663972=>'L',
1220763973=>'L',
1220863974=>'L',
1220963975=>'L',
1221063976=>'L',
1221163977=>'L',
1221263978=>'L',
1221363979=>'L',
1221463980=>'L',
1221563981=>'L',
1221663982=>'L',
1221763983=>'L',
1221863984=>'L',
1221963985=>'L',
1222063986=>'L',
1222163987=>'L',
1222263988=>'L',
1222363989=>'L',
1222463990=>'L',
1222563991=>'L',
1222663992=>'L',
1222763993=>'L',
1222863994=>'L',
1222963995=>'L',
1223063996=>'L',
1223163997=>'L',
1223263998=>'L',
1223363999=>'L',
1223464000=>'L',
1223564001=>'L',
1223664002=>'L',
1223764003=>'L',
1223864004=>'L',
1223964005=>'L',
1224064006=>'L',
1224164007=>'L',
1224264008=>'L',
1224364009=>'L',
1224464010=>'L',
1224564011=>'L',
1224664012=>'L',
1224764013=>'L',
1224864014=>'L',
1224964015=>'L',
1225064016=>'L',
1225164017=>'L',
1225264018=>'L',
1225364019=>'L',
1225464020=>'L',
1225564021=>'L',
1225664022=>'L',
1225764023=>'L',
1225864024=>'L',
1225964025=>'L',
1226064026=>'L',
1226164027=>'L',
1226264028=>'L',
1226364029=>'L',
1226464030=>'L',
1226564031=>'L',
1226664032=>'L',
1226764033=>'L',
1226864034=>'L',
1226964035=>'L',
1227064036=>'L',
1227164037=>'L',
1227264038=>'L',
1227364039=>'L',
1227464040=>'L',
1227564041=>'L',
1227664042=>'L',
1227764043=>'L',
1227864044=>'L',
1227964045=>'L',
1228064048=>'L',
1228164049=>'L',
1228264050=>'L',
1228364051=>'L',
1228464052=>'L',
1228564053=>'L',
1228664054=>'L',
1228764055=>'L',
1228864056=>'L',
1228964057=>'L',
1229064058=>'L',
1229164059=>'L',
1229264060=>'L',
1229364061=>'L',
1229464062=>'L',
1229564063=>'L',
1229664064=>'L',
1229764065=>'L',
1229864066=>'L',
1229964067=>'L',
1230064068=>'L',
1230164069=>'L',
1230264070=>'L',
1230364071=>'L',
1230464072=>'L',
1230564073=>'L',
1230664074=>'L',
1230764075=>'L',
1230864076=>'L',
1230964077=>'L',
1231064078=>'L',
1231164079=>'L',
1231264080=>'L',
1231364081=>'L',
1231464082=>'L',
1231564083=>'L',
1231664084=>'L',
1231764085=>'L',
1231864086=>'L',
1231964087=>'L',
1232064088=>'L',
1232164089=>'L',
1232264090=>'L',
1232364091=>'L',
1232464092=>'L',
1232564093=>'L',
1232664094=>'L',
1232764095=>'L',
1232864096=>'L',
1232964097=>'L',
1233064098=>'L',
1233164099=>'L',
1233264100=>'L',
1233364101=>'L',
1233464102=>'L',
1233564103=>'L',
1233664104=>'L',
1233764105=>'L',
1233864106=>'L',
1233964112=>'L',
1234064113=>'L',
1234164114=>'L',
1234264115=>'L',
1234364116=>'L',
1234464117=>'L',
1234564118=>'L',
1234664119=>'L',
1234764120=>'L',
1234864121=>'L',
1234964122=>'L',
1235064123=>'L',
1235164124=>'L',
1235264125=>'L',
1235364126=>'L',
1235464127=>'L',
1235564128=>'L',
1235664129=>'L',
1235764130=>'L',
1235864131=>'L',
1235964132=>'L',
1236064133=>'L',
1236164134=>'L',
1236264135=>'L',
1236364136=>'L',
1236464137=>'L',
1236564138=>'L',
1236664139=>'L',
1236764140=>'L',
1236864141=>'L',
1236964142=>'L',
1237064143=>'L',
1237164144=>'L',
1237264145=>'L',
1237364146=>'L',
1237464147=>'L',
1237564148=>'L',
1237664149=>'L',
1237764150=>'L',
1237864151=>'L',
1237964152=>'L',
1238064153=>'L',
1238164154=>'L',
1238264155=>'L',
1238364156=>'L',
1238464157=>'L',
1238564158=>'L',
1238664159=>'L',
1238764160=>'L',
1238864161=>'L',
1238964162=>'L',
1239064163=>'L',
1239164164=>'L',
1239264165=>'L',
1239364166=>'L',
1239464167=>'L',
1239564168=>'L',
1239664169=>'L',
1239764170=>'L',
1239864171=>'L',
1239964172=>'L',
1240064173=>'L',
1240164174=>'L',
1240264175=>'L',
1240364176=>'L',
1240464177=>'L',
1240564178=>'L',
1240664179=>'L',
1240764180=>'L',
1240864181=>'L',
1240964182=>'L',
1241064183=>'L',
1241164184=>'L',
1241264185=>'L',
1241364186=>'L',
1241464187=>'L',
1241564188=>'L',
1241664189=>'L',
1241764190=>'L',
1241864191=>'L',
1241964192=>'L',
1242064193=>'L',
1242164194=>'L',
1242264195=>'L',
1242364196=>'L',
1242464197=>'L',
1242564198=>'L',
1242664199=>'L',
1242764200=>'L',
1242864201=>'L',
1242964202=>'L',
1243064203=>'L',
1243164204=>'L',
1243264205=>'L',
1243364206=>'L',
1243464207=>'L',
1243564208=>'L',
1243664209=>'L',
1243764210=>'L',
1243864211=>'L',
1243964212=>'L',
1244064213=>'L',
1244164214=>'L',
1244264215=>'L',
1244364216=>'L',
1244464217=>'L',
1244564256=>'L',
1244664257=>'L',
1244764258=>'L',
1244864259=>'L',
1244964260=>'L',
1245064261=>'L',
1245164262=>'L',
1245264275=>'L',
1245364276=>'L',
1245464277=>'L',
1245564278=>'L',
1245664279=>'L',
1245764285=>'R',
1245864286=>'NSM',
1245964287=>'R',
1246064288=>'R',
1246164289=>'R',
1246264290=>'R',
1246364291=>'R',
1246464292=>'R',
1246564293=>'R',
1246664294=>'R',
1246764295=>'R',
1246864296=>'R',
1246964297=>'ES',
1247064298=>'R',
1247164299=>'R',
1247264300=>'R',
1247364301=>'R',
1247464302=>'R',
1247564303=>'R',
1247664304=>'R',
1247764305=>'R',
1247864306=>'R',
1247964307=>'R',
1248064308=>'R',
1248164309=>'R',
1248264310=>'R',
1248364312=>'R',
1248464313=>'R',
1248564314=>'R',
1248664315=>'R',
1248764316=>'R',
1248864318=>'R',
1248964320=>'R',
1249064321=>'R',
1249164323=>'R',
1249264324=>'R',
1249364326=>'R',
1249464327=>'R',
1249564328=>'R',
1249664329=>'R',
1249764330=>'R',
1249864331=>'R',
1249964332=>'R',
1250064333=>'R',
1250164334=>'R',
1250264335=>'R',
1250364336=>'AL',
1250464337=>'AL',
1250564338=>'AL',
1250664339=>'AL',
1250764340=>'AL',
1250864341=>'AL',
1250964342=>'AL',
1251064343=>'AL',
1251164344=>'AL',
1251264345=>'AL',
1251364346=>'AL',
1251464347=>'AL',
1251564348=>'AL',
1251664349=>'AL',
1251764350=>'AL',
1251864351=>'AL',
1251964352=>'AL',
1252064353=>'AL',
1252164354=>'AL',
1252264355=>'AL',
1252364356=>'AL',
1252464357=>'AL',
1252564358=>'AL',
1252664359=>'AL',
1252764360=>'AL',
1252864361=>'AL',
1252964362=>'AL',
1253064363=>'AL',
1253164364=>'AL',
1253264365=>'AL',
1253364366=>'AL',
1253464367=>'AL',
1253564368=>'AL',
1253664369=>'AL',
1253764370=>'AL',
1253864371=>'AL',
1253964372=>'AL',
1254064373=>'AL',
1254164374=>'AL',
1254264375=>'AL',
1254364376=>'AL',
1254464377=>'AL',
1254564378=>'AL',
1254664379=>'AL',
1254764380=>'AL',
1254864381=>'AL',
1254964382=>'AL',
1255064383=>'AL',
1255164384=>'AL',
1255264385=>'AL',
1255364386=>'AL',
1255464387=>'AL',
1255564388=>'AL',
1255664389=>'AL',
1255764390=>'AL',
1255864391=>'AL',
1255964392=>'AL',
1256064393=>'AL',
1256164394=>'AL',
1256264395=>'AL',
1256364396=>'AL',
1256464397=>'AL',
1256564398=>'AL',
1256664399=>'AL',
1256764400=>'AL',
1256864401=>'AL',
1256964402=>'AL',
1257064403=>'AL',
1257164404=>'AL',
1257264405=>'AL',
1257364406=>'AL',
1257464407=>'AL',
1257564408=>'AL',
1257664409=>'AL',
1257764410=>'AL',
1257864411=>'AL',
1257964412=>'AL',
1258064413=>'AL',
1258164414=>'AL',
1258264415=>'AL',
1258364416=>'AL',
1258464417=>'AL',
1258564418=>'AL',
1258664419=>'AL',
1258764420=>'AL',
1258864421=>'AL',
1258964422=>'AL',
1259064423=>'AL',
1259164424=>'AL',
1259264425=>'AL',
1259364426=>'AL',
1259464427=>'AL',
1259564428=>'AL',
1259664429=>'AL',
1259764430=>'AL',
1259864431=>'AL',
1259964432=>'AL',
1260064433=>'AL',
1260164467=>'AL',
1260264468=>'AL',
1260364469=>'AL',
1260464470=>'AL',
1260564471=>'AL',
1260664472=>'AL',
1260764473=>'AL',
1260864474=>'AL',
1260964475=>'AL',
1261064476=>'AL',
1261164477=>'AL',
1261264478=>'AL',
1261364479=>'AL',
1261464480=>'AL',
1261564481=>'AL',
1261664482=>'AL',
1261764483=>'AL',
1261864484=>'AL',
1261964485=>'AL',
1262064486=>'AL',
1262164487=>'AL',
1262264488=>'AL',
1262364489=>'AL',
1262464490=>'AL',
1262564491=>'AL',
1262664492=>'AL',
1262764493=>'AL',
1262864494=>'AL',
1262964495=>'AL',
1263064496=>'AL',
1263164497=>'AL',
1263264498=>'AL',
1263364499=>'AL',
1263464500=>'AL',
1263564501=>'AL',
1263664502=>'AL',
1263764503=>'AL',
1263864504=>'AL',
1263964505=>'AL',
1264064506=>'AL',
1264164507=>'AL',
1264264508=>'AL',
1264364509=>'AL',
1264464510=>'AL',
1264564511=>'AL',
1264664512=>'AL',
1264764513=>'AL',
1264864514=>'AL',
1264964515=>'AL',
1265064516=>'AL',
1265164517=>'AL',
1265264518=>'AL',
1265364519=>'AL',
1265464520=>'AL',
1265564521=>'AL',
1265664522=>'AL',
1265764523=>'AL',
1265864524=>'AL',
1265964525=>'AL',
1266064526=>'AL',
1266164527=>'AL',
1266264528=>'AL',
1266364529=>'AL',
1266464530=>'AL',
1266564531=>'AL',
1266664532=>'AL',
1266764533=>'AL',
1266864534=>'AL',
1266964535=>'AL',
1267064536=>'AL',
1267164537=>'AL',
1267264538=>'AL',
1267364539=>'AL',
1267464540=>'AL',
1267564541=>'AL',
1267664542=>'AL',
1267764543=>'AL',
1267864544=>'AL',
1267964545=>'AL',
1268064546=>'AL',
1268164547=>'AL',
1268264548=>'AL',
1268364549=>'AL',
1268464550=>'AL',
1268564551=>'AL',
1268664552=>'AL',
1268764553=>'AL',
1268864554=>'AL',
1268964555=>'AL',
1269064556=>'AL',
1269164557=>'AL',
1269264558=>'AL',
1269364559=>'AL',
1269464560=>'AL',
1269564561=>'AL',
1269664562=>'AL',
1269764563=>'AL',
1269864564=>'AL',
1269964565=>'AL',
1270064566=>'AL',
1270164567=>'AL',
1270264568=>'AL',
1270364569=>'AL',
1270464570=>'AL',
1270564571=>'AL',
1270664572=>'AL',
1270764573=>'AL',
1270864574=>'AL',
1270964575=>'AL',
1271064576=>'AL',
1271164577=>'AL',
1271264578=>'AL',
1271364579=>'AL',
1271464580=>'AL',
1271564581=>'AL',
1271664582=>'AL',
1271764583=>'AL',
1271864584=>'AL',
1271964585=>'AL',
1272064586=>'AL',
1272164587=>'AL',
1272264588=>'AL',
1272364589=>'AL',
1272464590=>'AL',
1272564591=>'AL',
1272664592=>'AL',
1272764593=>'AL',
1272864594=>'AL',
1272964595=>'AL',
1273064596=>'AL',
1273164597=>'AL',
1273264598=>'AL',
1273364599=>'AL',
1273464600=>'AL',
1273564601=>'AL',
1273664602=>'AL',
1273764603=>'AL',
1273864604=>'AL',
1273964605=>'AL',
1274064606=>'AL',
1274164607=>'AL',
1274264608=>'AL',
1274364609=>'AL',
1274464610=>'AL',
1274564611=>'AL',
1274664612=>'AL',
1274764613=>'AL',
1274864614=>'AL',
1274964615=>'AL',
1275064616=>'AL',
1275164617=>'AL',
1275264618=>'AL',
1275364619=>'AL',
1275464620=>'AL',
1275564621=>'AL',
1275664622=>'AL',
1275764623=>'AL',
1275864624=>'AL',
1275964625=>'AL',
1276064626=>'AL',
1276164627=>'AL',
1276264628=>'AL',
1276364629=>'AL',
1276464630=>'AL',
1276564631=>'AL',
1276664632=>'AL',
1276764633=>'AL',
1276864634=>'AL',
1276964635=>'AL',
1277064636=>'AL',
1277164637=>'AL',
1277264638=>'AL',
1277364639=>'AL',
1277464640=>'AL',
1277564641=>'AL',
1277664642=>'AL',
1277764643=>'AL',
1277864644=>'AL',
1277964645=>'AL',
1278064646=>'AL',
1278164647=>'AL',
1278264648=>'AL',
1278364649=>'AL',
1278464650=>'AL',
1278564651=>'AL',
1278664652=>'AL',
1278764653=>'AL',
1278864654=>'AL',
1278964655=>'AL',
1279064656=>'AL',
1279164657=>'AL',
1279264658=>'AL',
1279364659=>'AL',
1279464660=>'AL',
1279564661=>'AL',
1279664662=>'AL',
1279764663=>'AL',
1279864664=>'AL',
1279964665=>'AL',
1280064666=>'AL',
1280164667=>'AL',
1280264668=>'AL',
1280364669=>'AL',
1280464670=>'AL',
1280564671=>'AL',
1280664672=>'AL',
1280764673=>'AL',
1280864674=>'AL',
1280964675=>'AL',
1281064676=>'AL',
1281164677=>'AL',
1281264678=>'AL',
1281364679=>'AL',
1281464680=>'AL',
1281564681=>'AL',
1281664682=>'AL',
1281764683=>'AL',
1281864684=>'AL',
1281964685=>'AL',
1282064686=>'AL',
1282164687=>'AL',
1282264688=>'AL',
1282364689=>'AL',
1282464690=>'AL',
1282564691=>'AL',
1282664692=>'AL',
1282764693=>'AL',
1282864694=>'AL',
1282964695=>'AL',
1283064696=>'AL',
1283164697=>'AL',
1283264698=>'AL',
1283364699=>'AL',
1283464700=>'AL',
1283564701=>'AL',
1283664702=>'AL',
1283764703=>'AL',
1283864704=>'AL',
1283964705=>'AL',
1284064706=>'AL',
1284164707=>'AL',
1284264708=>'AL',
1284364709=>'AL',
1284464710=>'AL',
1284564711=>'AL',
1284664712=>'AL',
1284764713=>'AL',
1284864714=>'AL',
1284964715=>'AL',
1285064716=>'AL',
1285164717=>'AL',
1285264718=>'AL',
1285364719=>'AL',
1285464720=>'AL',
1285564721=>'AL',
1285664722=>'AL',
1285764723=>'AL',
1285864724=>'AL',
1285964725=>'AL',
1286064726=>'AL',
1286164727=>'AL',
1286264728=>'AL',
1286364729=>'AL',
1286464730=>'AL',
1286564731=>'AL',
1286664732=>'AL',
1286764733=>'AL',
1286864734=>'AL',
1286964735=>'AL',
1287064736=>'AL',
1287164737=>'AL',
1287264738=>'AL',
1287364739=>'AL',
1287464740=>'AL',
1287564741=>'AL',
1287664742=>'AL',
1287764743=>'AL',
1287864744=>'AL',
1287964745=>'AL',
1288064746=>'AL',
1288164747=>'AL',
1288264748=>'AL',
1288364749=>'AL',
1288464750=>'AL',
1288564751=>'AL',
1288664752=>'AL',
1288764753=>'AL',
1288864754=>'AL',
1288964755=>'AL',
1289064756=>'AL',
1289164757=>'AL',
1289264758=>'AL',
1289364759=>'AL',
1289464760=>'AL',
1289564761=>'AL',
1289664762=>'AL',
1289764763=>'AL',
1289864764=>'AL',
1289964765=>'AL',
1290064766=>'AL',
1290164767=>'AL',
1290264768=>'AL',
1290364769=>'AL',
1290464770=>'AL',
1290564771=>'AL',
1290664772=>'AL',
1290764773=>'AL',
1290864774=>'AL',
1290964775=>'AL',
1291064776=>'AL',
1291164777=>'AL',
1291264778=>'AL',
1291364779=>'AL',
1291464780=>'AL',
1291564781=>'AL',
1291664782=>'AL',
1291764783=>'AL',
1291864784=>'AL',
1291964785=>'AL',
1292064786=>'AL',
1292164787=>'AL',
1292264788=>'AL',
1292364789=>'AL',
1292464790=>'AL',
1292564791=>'AL',
1292664792=>'AL',
1292764793=>'AL',
1292864794=>'AL',
1292964795=>'AL',
1293064796=>'AL',
1293164797=>'AL',
1293264798=>'AL',
1293364799=>'AL',
1293464800=>'AL',
1293564801=>'AL',
1293664802=>'AL',
1293764803=>'AL',
1293864804=>'AL',
1293964805=>'AL',
1294064806=>'AL',
1294164807=>'AL',
1294264808=>'AL',
1294364809=>'AL',
1294464810=>'AL',
1294564811=>'AL',
1294664812=>'AL',
1294764813=>'AL',
1294864814=>'AL',
1294964815=>'AL',
1295064816=>'AL',
1295164817=>'AL',
1295264818=>'AL',
1295364819=>'AL',
1295464820=>'AL',
1295564821=>'AL',
1295664822=>'AL',
1295764823=>'AL',
1295864824=>'AL',
1295964825=>'AL',
1296064826=>'AL',
1296164827=>'AL',
1296264828=>'AL',
1296364829=>'AL',
1296464830=>'ON',
1296564831=>'ON',
1296664848=>'AL',
1296764849=>'AL',
1296864850=>'AL',
1296964851=>'AL',
1297064852=>'AL',
1297164853=>'AL',
1297264854=>'AL',
1297364855=>'AL',
1297464856=>'AL',
1297564857=>'AL',
1297664858=>'AL',
1297764859=>'AL',
1297864860=>'AL',
1297964861=>'AL',
1298064862=>'AL',
1298164863=>'AL',
1298264864=>'AL',
1298364865=>'AL',
1298464866=>'AL',
1298564867=>'AL',
1298664868=>'AL',
1298764869=>'AL',
1298864870=>'AL',
1298964871=>'AL',
1299064872=>'AL',
1299164873=>'AL',
1299264874=>'AL',
1299364875=>'AL',
1299464876=>'AL',
1299564877=>'AL',
1299664878=>'AL',
1299764879=>'AL',
1299864880=>'AL',
1299964881=>'AL',
1300064882=>'AL',
1300164883=>'AL',
1300264884=>'AL',
1300364885=>'AL',
1300464886=>'AL',
1300564887=>'AL',
1300664888=>'AL',
1300764889=>'AL',
1300864890=>'AL',
1300964891=>'AL',
1301064892=>'AL',
1301164893=>'AL',
1301264894=>'AL',
1301364895=>'AL',
1301464896=>'AL',
1301564897=>'AL',
1301664898=>'AL',
1301764899=>'AL',
1301864900=>'AL',
1301964901=>'AL',
1302064902=>'AL',
1302164903=>'AL',
1302264904=>'AL',
1302364905=>'AL',
1302464906=>'AL',
1302564907=>'AL',
1302664908=>'AL',
1302764909=>'AL',
1302864910=>'AL',
1302964911=>'AL',
1303064914=>'AL',
1303164915=>'AL',
1303264916=>'AL',
1303364917=>'AL',
1303464918=>'AL',
1303564919=>'AL',
1303664920=>'AL',
1303764921=>'AL',
1303864922=>'AL',
1303964923=>'AL',
1304064924=>'AL',
1304164925=>'AL',
1304264926=>'AL',
1304364927=>'AL',
1304464928=>'AL',
1304564929=>'AL',
1304664930=>'AL',
1304764931=>'AL',
1304864932=>'AL',
1304964933=>'AL',
1305064934=>'AL',
1305164935=>'AL',
1305264936=>'AL',
1305364937=>'AL',
1305464938=>'AL',
1305564939=>'AL',
1305664940=>'AL',
1305764941=>'AL',
1305864942=>'AL',
1305964943=>'AL',
1306064944=>'AL',
1306164945=>'AL',
1306264946=>'AL',
1306364947=>'AL',
1306464948=>'AL',
1306564949=>'AL',
1306664950=>'AL',
1306764951=>'AL',
1306864952=>'AL',
1306964953=>'AL',
1307064954=>'AL',
1307164955=>'AL',
1307264956=>'AL',
1307364957=>'AL',
1307464958=>'AL',
1307564959=>'AL',
1307664960=>'AL',
1307764961=>'AL',
1307864962=>'AL',
1307964963=>'AL',
1308064964=>'AL',
1308164965=>'AL',
1308264966=>'AL',
1308364967=>'AL',
1308465008=>'AL',
1308565009=>'AL',
1308665010=>'AL',
1308765011=>'AL',
1308865012=>'AL',
1308965013=>'AL',
1309065014=>'AL',
1309165015=>'AL',
1309265016=>'AL',
1309365017=>'AL',
1309465018=>'AL',
1309565019=>'AL',
1309665020=>'AL',
1309765021=>'ON',
1309865024=>'NSM',
1309965025=>'NSM',
1310065026=>'NSM',
1310165027=>'NSM',
1310265028=>'NSM',
1310365029=>'NSM',
1310465030=>'NSM',
1310565031=>'NSM',
1310665032=>'NSM',
1310765033=>'NSM',
1310865034=>'NSM',
1310965035=>'NSM',
1311065036=>'NSM',
1311165037=>'NSM',
1311265038=>'NSM',
1311365039=>'NSM',
1311465040=>'ON',
1311565041=>'ON',
1311665042=>'ON',
1311765043=>'ON',
1311865044=>'ON',
1311965045=>'ON',
1312065046=>'ON',
1312165047=>'ON',
1312265048=>'ON',
1312365049=>'ON',
1312465056=>'NSM',
1312565057=>'NSM',
1312665058=>'NSM',
1312765059=>'NSM',
1312865072=>'ON',
1312965073=>'ON',
1313065074=>'ON',
1313165075=>'ON',
1313265076=>'ON',
1313365077=>'ON',
1313465078=>'ON',
1313565079=>'ON',
1313665080=>'ON',
1313765081=>'ON',
1313865082=>'ON',
1313965083=>'ON',
1314065084=>'ON',
1314165085=>'ON',
1314265086=>'ON',
1314365087=>'ON',
1314465088=>'ON',
1314565089=>'ON',
1314665090=>'ON',
1314765091=>'ON',
1314865092=>'ON',
1314965093=>'ON',
1315065094=>'ON',
1315165095=>'ON',
1315265096=>'ON',
1315365097=>'ON',
1315465098=>'ON',
1315565099=>'ON',
1315665100=>'ON',
1315765101=>'ON',
1315865102=>'ON',
1315965103=>'ON',
1316065104=>'CS',
1316165105=>'ON',
1316265106=>'CS',
1316365108=>'ON',
1316465109=>'CS',
1316565110=>'ON',
1316665111=>'ON',
1316765112=>'ON',
1316865113=>'ON',
1316965114=>'ON',
1317065115=>'ON',
1317165116=>'ON',
1317265117=>'ON',
1317365118=>'ON',
1317465119=>'ET',
1317565120=>'ON',
1317665121=>'ON',
1317765122=>'ES',
1317865123=>'ES',
1317965124=>'ON',
1318065125=>'ON',
1318165126=>'ON',
1318265128=>'ON',
1318365129=>'ET',
1318465130=>'ET',
1318565131=>'ON',
1318665136=>'AL',
1318765137=>'AL',
1318865138=>'AL',
1318965139=>'AL',
1319065140=>'AL',
1319165142=>'AL',
1319265143=>'AL',
1319365144=>'AL',
1319465145=>'AL',
1319565146=>'AL',
1319665147=>'AL',
1319765148=>'AL',
1319865149=>'AL',
1319965150=>'AL',
1320065151=>'AL',
1320165152=>'AL',
1320265153=>'AL',
1320365154=>'AL',
1320465155=>'AL',
1320565156=>'AL',
1320665157=>'AL',
1320765158=>'AL',
1320865159=>'AL',
1320965160=>'AL',
1321065161=>'AL',
1321165162=>'AL',
1321265163=>'AL',
1321365164=>'AL',
1321465165=>'AL',
1321565166=>'AL',
1321665167=>'AL',
1321765168=>'AL',
1321865169=>'AL',
1321965170=>'AL',
1322065171=>'AL',
1322165172=>'AL',
1322265173=>'AL',
1322365174=>'AL',
1322465175=>'AL',
1322565176=>'AL',
1322665177=>'AL',
1322765178=>'AL',
1322865179=>'AL',
1322965180=>'AL',
1323065181=>'AL',
1323165182=>'AL',
1323265183=>'AL',
1323365184=>'AL',
1323465185=>'AL',
1323565186=>'AL',
1323665187=>'AL',
1323765188=>'AL',
1323865189=>'AL',
1323965190=>'AL',
1324065191=>'AL',
1324165192=>'AL',
1324265193=>'AL',
1324365194=>'AL',
1324465195=>'AL',
1324565196=>'AL',
1324665197=>'AL',
1324765198=>'AL',
1324865199=>'AL',
1324965200=>'AL',
1325065201=>'AL',
1325165202=>'AL',
1325265203=>'AL',
1325365204=>'AL',
1325465205=>'AL',
1325565206=>'AL',
1325665207=>'AL',
1325765208=>'AL',
1325865209=>'AL',
1325965210=>'AL',
1326065211=>'AL',
1326165212=>'AL',
1326265213=>'AL',
1326365214=>'AL',
1326465215=>'AL',
1326565216=>'AL',
1326665217=>'AL',
1326765218=>'AL',
1326865219=>'AL',
1326965220=>'AL',
1327065221=>'AL',
1327165222=>'AL',
1327265223=>'AL',
1327365224=>'AL',
1327465225=>'AL',
1327565226=>'AL',
1327665227=>'AL',
1327765228=>'AL',
1327865229=>'AL',
1327965230=>'AL',
1328065231=>'AL',
1328165232=>'AL',
1328265233=>'AL',
1328365234=>'AL',
1328465235=>'AL',
1328565236=>'AL',
1328665237=>'AL',
1328765238=>'AL',
1328865239=>'AL',
1328965240=>'AL',
1329065241=>'AL',
1329165242=>'AL',
1329265243=>'AL',
1329365244=>'AL',
1329465245=>'AL',
1329565246=>'AL',
1329665247=>'AL',
1329765248=>'AL',
1329865249=>'AL',
1329965250=>'AL',
1330065251=>'AL',
1330165252=>'AL',
1330265253=>'AL',
1330365254=>'AL',
1330465255=>'AL',
1330565256=>'AL',
1330665257=>'AL',
1330765258=>'AL',
1330865259=>'AL',
1330965260=>'AL',
1331065261=>'AL',
1331165262=>'AL',
1331265263=>'AL',
1331365264=>'AL',
1331465265=>'AL',
1331565266=>'AL',
1331665267=>'AL',
1331765268=>'AL',
1331865269=>'AL',
1331965270=>'AL',
1332065271=>'AL',
1332165272=>'AL',
1332265273=>'AL',
1332365274=>'AL',
1332465275=>'AL',
1332565276=>'AL',
1332665279=>'BN',
1332765281=>'ON',
1332865282=>'ON',
1332965283=>'ET',
1333065284=>'ET',
1333165285=>'ET',
1333265286=>'ON',
1333365287=>'ON',
1333465288=>'ON',
1333565289=>'ON',
1333665290=>'ON',
1333765291=>'ES',
1333865292=>'CS',
1333965293=>'ES',
1334065294=>'CS',
1334165295=>'CS',
1334265296=>'EN',
1334365297=>'EN',
1334465298=>'EN',
1334565299=>'EN',
1334665300=>'EN',
1334765301=>'EN',
1334865302=>'EN',
1334965303=>'EN',
1335065304=>'EN',
1335165305=>'EN',
1335265306=>'CS',
1335365307=>'ON',
1335465308=>'ON',
1335565309=>'ON',
1335665310=>'ON',
1335765311=>'ON',
1335865312=>'ON',
1335965313=>'L',
1336065314=>'L',
1336165315=>'L',
1336265316=>'L',
1336365317=>'L',
1336465318=>'L',
1336565319=>'L',
1336665320=>'L',
1336765321=>'L',
1336865322=>'L',
1336965323=>'L',
1337065324=>'L',
1337165325=>'L',
1337265326=>'L',
1337365327=>'L',
1337465328=>'L',
1337565329=>'L',
1337665330=>'L',
1337765331=>'L',
1337865332=>'L',
1337965333=>'L',
1338065334=>'L',
1338165335=>'L',
1338265336=>'L',
1338365337=>'L',
1338465338=>'L',
1338565339=>'ON',
1338665340=>'ON',
1338765341=>'ON',
1338865342=>'ON',
1338965343=>'ON',
1339065344=>'ON',
1339165345=>'L',
1339265346=>'L',
1339365347=>'L',
1339465348=>'L',
1339565349=>'L',
1339665350=>'L',
1339765351=>'L',
1339865352=>'L',
1339965353=>'L',
1340065354=>'L',
1340165355=>'L',
1340265356=>'L',
1340365357=>'L',
1340465358=>'L',
1340565359=>'L',
1340665360=>'L',
1340765361=>'L',
1340865362=>'L',
1340965363=>'L',
1341065364=>'L',
1341165365=>'L',
1341265366=>'L',
1341365367=>'L',
1341465368=>'L',
1341565369=>'L',
1341665370=>'L',
1341765371=>'ON',
1341865372=>'ON',
1341965373=>'ON',
1342065374=>'ON',
1342165375=>'ON',
1342265376=>'ON',
1342365377=>'ON',
1342465378=>'ON',
1342565379=>'ON',
1342665380=>'ON',
1342765381=>'ON',
1342865382=>'L',
1342965383=>'L',
1343065384=>'L',
1343165385=>'L',
1343265386=>'L',
1343365387=>'L',
1343465388=>'L',
1343565389=>'L',
1343665390=>'L',
1343765391=>'L',
1343865392=>'L',
1343965393=>'L',
1344065394=>'L',
1344165395=>'L',
1344265396=>'L',
1344365397=>'L',
1344465398=>'L',
1344565399=>'L',
1344665400=>'L',
1344765401=>'L',
1344865402=>'L',
1344965403=>'L',
1345065404=>'L',
1345165405=>'L',
1345265406=>'L',
1345365407=>'L',
1345465408=>'L',
1345565409=>'L',
1345665410=>'L',
1345765411=>'L',
1345865412=>'L',
1345965413=>'L',
1346065414=>'L',
1346165415=>'L',
1346265416=>'L',
1346365417=>'L',
1346465418=>'L',
1346565419=>'L',
1346665420=>'L',
1346765421=>'L',
1346865422=>'L',
1346965423=>'L',
1347065424=>'L',
1347165425=>'L',
1347265426=>'L',
1347365427=>'L',
1347465428=>'L',
1347565429=>'L',
1347665430=>'L',
1347765431=>'L',
1347865432=>'L',
1347965433=>'L',
1348065434=>'L',
1348165435=>'L',
1348265436=>'L',
1348365437=>'L',
1348465438=>'L',
1348565439=>'L',
1348665440=>'L',
1348765441=>'L',
1348865442=>'L',
1348965443=>'L',
1349065444=>'L',
1349165445=>'L',
1349265446=>'L',
1349365447=>'L',
1349465448=>'L',
1349565449=>'L',
1349665450=>'L',
1349765451=>'L',
1349865452=>'L',
1349965453=>'L',
1350065454=>'L',
1350165455=>'L',
1350265456=>'L',
1350365457=>'L',
1350465458=>'L',
1350565459=>'L',
1350665460=>'L',
1350765461=>'L',
1350865462=>'L',
1350965463=>'L',
1351065464=>'L',
1351165465=>'L',
1351265466=>'L',
1351365467=>'L',
1351465468=>'L',
1351565469=>'L',
1351665470=>'L',
1351765474=>'L',
1351865475=>'L',
1351965476=>'L',
1352065477=>'L',
1352165478=>'L',
1352265479=>'L',
1352365482=>'L',
1352465483=>'L',
1352565484=>'L',
1352665485=>'L',
1352765486=>'L',
1352865487=>'L',
1352965490=>'L',
1353065491=>'L',
1353165492=>'L',
1353265493=>'L',
1353365494=>'L',
1353465495=>'L',
1353565498=>'L',
1353665499=>'L',
1353765500=>'L',
1353865504=>'ET',
1353965505=>'ET',
1354065506=>'ON',
1354165507=>'ON',
1354265508=>'ON',
1354365509=>'ET',
1354465510=>'ET',
1354565512=>'ON',
1354665513=>'ON',
1354765514=>'ON',
1354865515=>'ON',
1354965516=>'ON',
1355065517=>'ON',
1355165518=>'ON',
1355265529=>'ON',
1355365530=>'ON',
1355465531=>'ON',
1355565532=>'ON',
1355665533=>'ON',
1355765536=>'L',
1355865537=>'L',
1355965538=>'L',
1356065539=>'L',
1356165540=>'L',
1356265541=>'L',
1356365542=>'L',
1356465543=>'L',
1356565544=>'L',
1356665545=>'L',
1356765546=>'L',
1356865547=>'L',
1356965549=>'L',
1357065550=>'L',
1357165551=>'L',
1357265552=>'L',
1357365553=>'L',
1357465554=>'L',
1357565555=>'L',
1357665556=>'L',
1357765557=>'L',
1357865558=>'L',
1357965559=>'L',
1358065560=>'L',
1358165561=>'L',
1358265562=>'L',
1358365563=>'L',
1358465564=>'L',
1358565565=>'L',
1358665566=>'L',
1358765567=>'L',
1358865568=>'L',
1358965569=>'L',
1359065570=>'L',
1359165571=>'L',
1359265572=>'L',
1359365573=>'L',
1359465574=>'L',
1359565576=>'L',
1359665577=>'L',
1359765578=>'L',
1359865579=>'L',
1359965580=>'L',
1360065581=>'L',
1360165582=>'L',
1360265583=>'L',
1360365584=>'L',
1360465585=>'L',
1360565586=>'L',
1360665587=>'L',
1360765588=>'L',
1360865589=>'L',
1360965590=>'L',
1361065591=>'L',
1361165592=>'L',
1361265593=>'L',
1361365594=>'L',
1361465596=>'L',
1361565597=>'L',
1361665599=>'L',
1361765600=>'L',
1361865601=>'L',
1361965602=>'L',
1362065603=>'L',
1362165604=>'L',
1362265605=>'L',
1362365606=>'L',
1362465607=>'L',
1362565608=>'L',
1362665609=>'L',
1362765610=>'L',
1362865611=>'L',
1362965612=>'L',
1363065613=>'L',
1363165616=>'L',
1363265617=>'L',
1363365618=>'L',
1363465619=>'L',
1363565620=>'L',
1363665621=>'L',
1363765622=>'L',
1363865623=>'L',
1363965624=>'L',
1364065625=>'L',
1364165626=>'L',
1364265627=>'L',
1364365628=>'L',
1364465629=>'L',
1364565664=>'L',
1364665665=>'L',
1364765666=>'L',
1364865667=>'L',
1364965668=>'L',
1365065669=>'L',
1365165670=>'L',
1365265671=>'L',
1365365672=>'L',
1365465673=>'L',
1365565674=>'L',
1365665675=>'L',
1365765676=>'L',
1365865677=>'L',
1365965678=>'L',
1366065679=>'L',
1366165680=>'L',
1366265681=>'L',
1366365682=>'L',
1366465683=>'L',
1366565684=>'L',
1366665685=>'L',
1366765686=>'L',
1366865687=>'L',
1366965688=>'L',
1367065689=>'L',
1367165690=>'L',
1367265691=>'L',
1367365692=>'L',
1367465693=>'L',
1367565694=>'L',
1367665695=>'L',
1367765696=>'L',
1367865697=>'L',
1367965698=>'L',
1368065699=>'L',
1368165700=>'L',
1368265701=>'L',
1368365702=>'L',
1368465703=>'L',
1368565704=>'L',
1368665705=>'L',
1368765706=>'L',
1368865707=>'L',
1368965708=>'L',
1369065709=>'L',
1369165710=>'L',
1369265711=>'L',
1369365712=>'L',
1369465713=>'L',
1369565714=>'L',
1369665715=>'L',
1369765716=>'L',
1369865717=>'L',
1369965718=>'L',
1370065719=>'L',
1370165720=>'L',
1370265721=>'L',
1370365722=>'L',
1370465723=>'L',
1370565724=>'L',
1370665725=>'L',
1370765726=>'L',
1370865727=>'L',
1370965728=>'L',
1371065729=>'L',
1371165730=>'L',
1371265731=>'L',
1371365732=>'L',
1371465733=>'L',
1371565734=>'L',
1371665735=>'L',
1371765736=>'L',
1371865737=>'L',
1371965738=>'L',
1372065739=>'L',
1372165740=>'L',
1372265741=>'L',
1372365742=>'L',
1372465743=>'L',
1372565744=>'L',
1372665745=>'L',
1372765746=>'L',
1372865747=>'L',
1372965748=>'L',
1373065749=>'L',
1373165750=>'L',
1373265751=>'L',
1373365752=>'L',
1373465753=>'L',
1373565754=>'L',
1373665755=>'L',
1373765756=>'L',
1373865757=>'L',
1373965758=>'L',
1374065759=>'L',
1374165760=>'L',
1374265761=>'L',
1374365762=>'L',
1374465763=>'L',
1374565764=>'L',
1374665765=>'L',
1374765766=>'L',
1374865767=>'L',
1374965768=>'L',
1375065769=>'L',
1375165770=>'L',
1375265771=>'L',
1375365772=>'L',
1375465773=>'L',
1375565774=>'L',
1375665775=>'L',
1375765776=>'L',
1375865777=>'L',
1375965778=>'L',
1376065779=>'L',
1376165780=>'L',
1376265781=>'L',
1376365782=>'L',
1376465783=>'L',
1376565784=>'L',
1376665785=>'L',
1376765786=>'L',
1376865792=>'L',
1376965793=>'ON',
1377065794=>'L',
1377165799=>'L',
1377265800=>'L',
1377365801=>'L',
1377465802=>'L',
1377565803=>'L',
1377665804=>'L',
1377765805=>'L',
1377865806=>'L',
1377965807=>'L',
1378065808=>'L',
1378165809=>'L',
1378265810=>'L',
1378365811=>'L',
1378465812=>'L',
1378565813=>'L',
1378665814=>'L',
1378765815=>'L',
1378865816=>'L',
1378965817=>'L',
1379065818=>'L',
1379165819=>'L',
1379265820=>'L',
1379365821=>'L',
1379465822=>'L',
1379565823=>'L',
1379665824=>'L',
1379765825=>'L',
1379865826=>'L',
1379965827=>'L',
1380065828=>'L',
1380165829=>'L',
1380265830=>'L',
1380365831=>'L',
1380465832=>'L',
1380565833=>'L',
1380665834=>'L',
1380765835=>'L',
1380865836=>'L',
1380965837=>'L',
1381065838=>'L',
1381165839=>'L',
1381265840=>'L',
1381365841=>'L',
1381465842=>'L',
1381565843=>'L',
1381665847=>'L',
1381765848=>'L',
1381865849=>'L',
1381965850=>'L',
1382065851=>'L',
1382165852=>'L',
1382265853=>'L',
1382365854=>'L',
1382465855=>'L',
1382565856=>'ON',
1382665857=>'ON',
1382765858=>'ON',
1382865859=>'ON',
1382965860=>'ON',
1383065861=>'ON',
1383165862=>'ON',
1383265863=>'ON',
1383365864=>'ON',
1383465865=>'ON',
1383565866=>'ON',
1383665867=>'ON',
1383765868=>'ON',
1383865869=>'ON',
1383965870=>'ON',
1384065871=>'ON',
1384165872=>'ON',
1384265873=>'ON',
1384365874=>'ON',
1384465875=>'ON',
1384565876=>'ON',
1384665877=>'ON',
1384765878=>'ON',
1384865879=>'ON',
1384965880=>'ON',
1385065881=>'ON',
1385165882=>'ON',
1385265883=>'ON',
1385365884=>'ON',
1385465885=>'ON',
1385565886=>'ON',
1385665887=>'ON',
1385765888=>'ON',
1385865889=>'ON',
1385965890=>'ON',
1386065891=>'ON',
1386165892=>'ON',
1386265893=>'ON',
1386365894=>'ON',
1386465895=>'ON',
1386565896=>'ON',
1386665897=>'ON',
1386765898=>'ON',
1386865899=>'ON',
1386965900=>'ON',
1387065901=>'ON',
1387165902=>'ON',
1387265903=>'ON',
1387365904=>'ON',
1387465905=>'ON',
1387565906=>'ON',
1387665907=>'ON',
1387765908=>'ON',
1387865909=>'ON',
1387965910=>'ON',
1388065911=>'ON',
1388165912=>'ON',
1388265913=>'ON',
1388365914=>'ON',
1388465915=>'ON',
1388565916=>'ON',
1388665917=>'ON',
1388765918=>'ON',
1388865919=>'ON',
1388965920=>'ON',
1389065921=>'ON',
1389165922=>'ON',
1389265923=>'ON',
1389365924=>'ON',
1389465925=>'ON',
1389565926=>'ON',
1389665927=>'ON',
1389765928=>'ON',
1389865929=>'ON',
1389965930=>'ON',
1390066304=>'L',
1390166305=>'L',
1390266306=>'L',
1390366307=>'L',
1390466308=>'L',
1390566309=>'L',
1390666310=>'L',
1390766311=>'L',
1390866312=>'L',
1390966313=>'L',
1391066314=>'L',
1391166315=>'L',
1391266316=>'L',
1391366317=>'L',
1391466318=>'L',
1391566319=>'L',
1391666320=>'L',
1391766321=>'L',
1391866322=>'L',
1391966323=>'L',
1392066324=>'L',
1392166325=>'L',
1392266326=>'L',
1392366327=>'L',
1392466328=>'L',
1392566329=>'L',
1392666330=>'L',
1392766331=>'L',
1392866332=>'L',
1392966333=>'L',
1393066334=>'L',
1393166336=>'L',
1393266337=>'L',
1393366338=>'L',
1393466339=>'L',
1393566352=>'L',
1393666353=>'L',
1393766354=>'L',
1393866355=>'L',
1393966356=>'L',
1394066357=>'L',
1394166358=>'L',
1394266359=>'L',
1394366360=>'L',
1394466361=>'L',
1394566362=>'L',
1394666363=>'L',
1394766364=>'L',
1394866365=>'L',
1394966366=>'L',
1395066367=>'L',
1395166368=>'L',
1395266369=>'L',
1395366370=>'L',
1395466371=>'L',
1395566372=>'L',
1395666373=>'L',
1395766374=>'L',
1395866375=>'L',
1395966376=>'L',
1396066377=>'L',
1396166378=>'L',
1396266432=>'L',
1396366433=>'L',
1396466434=>'L',
1396566435=>'L',
1396666436=>'L',
1396766437=>'L',
1396866438=>'L',
1396966439=>'L',
1397066440=>'L',
1397166441=>'L',
1397266442=>'L',
1397366443=>'L',
1397466444=>'L',
1397566445=>'L',
1397666446=>'L',
1397766447=>'L',
1397866448=>'L',
1397966449=>'L',
1398066450=>'L',
1398166451=>'L',
1398266452=>'L',
1398366453=>'L',
1398466454=>'L',
1398566455=>'L',
1398666456=>'L',
1398766457=>'L',
1398866458=>'L',
1398966459=>'L',
1399066460=>'L',
1399166461=>'L',
1399266463=>'L',
1399366464=>'L',
1399466465=>'L',
1399566466=>'L',
1399666467=>'L',
1399766468=>'L',
1399866469=>'L',
1399966470=>'L',
1400066471=>'L',
1400166472=>'L',
1400266473=>'L',
1400366474=>'L',
1400466475=>'L',
1400566476=>'L',
1400666477=>'L',
1400766478=>'L',
1400866479=>'L',
1400966480=>'L',
1401066481=>'L',
1401166482=>'L',
1401266483=>'L',
1401366484=>'L',
1401466485=>'L',
1401566486=>'L',
1401666487=>'L',
1401766488=>'L',
1401866489=>'L',
1401966490=>'L',
1402066491=>'L',
1402166492=>'L',
1402266493=>'L',
1402366494=>'L',
1402466495=>'L',
1402566496=>'L',
1402666497=>'L',
1402766498=>'L',
1402866499=>'L',
1402966504=>'L',
1403066505=>'L',
1403166506=>'L',
1403266507=>'L',
1403366508=>'L',
1403466509=>'L',
1403566510=>'L',
1403666511=>'L',
1403766512=>'L',
1403866513=>'L',
1403966514=>'L',
1404066515=>'L',
1404166516=>'L',
1404266517=>'L',
1404366560=>'L',
1404466561=>'L',
1404566562=>'L',
1404666563=>'L',
1404766564=>'L',
1404866565=>'L',
1404966566=>'L',
1405066567=>'L',
1405166568=>'L',
1405266569=>'L',
1405366570=>'L',
1405466571=>'L',
1405566572=>'L',
1405666573=>'L',
1405766574=>'L',
1405866575=>'L',
1405966576=>'L',
1406066577=>'L',
1406166578=>'L',
1406266579=>'L',
1406366580=>'L',
1406466581=>'L',
1406566582=>'L',
1406666583=>'L',
1406766584=>'L',
1406866585=>'L',
1406966586=>'L',
1407066587=>'L',
1407166588=>'L',
1407266589=>'L',
1407366590=>'L',
1407466591=>'L',
1407566592=>'L',
1407666593=>'L',
1407766594=>'L',
1407866595=>'L',
1407966596=>'L',
1408066597=>'L',
1408166598=>'L',
1408266599=>'L',
1408366600=>'L',
1408466601=>'L',
1408566602=>'L',
1408666603=>'L',
1408766604=>'L',
1408866605=>'L',
1408966606=>'L',
1409066607=>'L',
1409166608=>'L',
1409266609=>'L',
1409366610=>'L',
1409466611=>'L',
1409566612=>'L',
1409666613=>'L',
1409766614=>'L',
1409866615=>'L',
1409966616=>'L',
1410066617=>'L',
1410166618=>'L',
1410266619=>'L',
1410366620=>'L',
1410466621=>'L',
1410566622=>'L',
1410666623=>'L',
1410766624=>'L',
1410866625=>'L',
1410966626=>'L',
1411066627=>'L',
1411166628=>'L',
1411266629=>'L',
1411366630=>'L',
1411466631=>'L',
1411566632=>'L',
1411666633=>'L',
1411766634=>'L',
1411866635=>'L',
1411966636=>'L',
1412066637=>'L',
1412166638=>'L',
1412266639=>'L',
1412366640=>'L',
1412466641=>'L',
1412566642=>'L',
1412666643=>'L',
1412766644=>'L',
1412866645=>'L',
1412966646=>'L',
1413066647=>'L',
1413166648=>'L',
1413266649=>'L',
1413366650=>'L',
1413466651=>'L',
1413566652=>'L',
1413666653=>'L',
1413766654=>'L',
1413866655=>'L',
1413966656=>'L',
1414066657=>'L',
1414166658=>'L',
1414266659=>'L',
1414366660=>'L',
1414466661=>'L',
1414566662=>'L',
1414666663=>'L',
1414766664=>'L',
1414866665=>'L',
1414966666=>'L',
1415066667=>'L',
1415166668=>'L',
1415266669=>'L',
1415366670=>'L',
1415466671=>'L',
1415566672=>'L',
1415666673=>'L',
1415766674=>'L',
1415866675=>'L',
1415966676=>'L',
1416066677=>'L',
1416166678=>'L',
1416266679=>'L',
1416366680=>'L',
1416466681=>'L',
1416566682=>'L',
1416666683=>'L',
1416766684=>'L',
1416866685=>'L',
1416966686=>'L',
1417066687=>'L',
1417166688=>'L',
1417266689=>'L',
1417366690=>'L',
1417466691=>'L',
1417566692=>'L',
1417666693=>'L',
1417766694=>'L',
1417866695=>'L',
1417966696=>'L',
1418066697=>'L',
1418166698=>'L',
1418266699=>'L',
1418366700=>'L',
1418466701=>'L',
1418566702=>'L',
1418666703=>'L',
1418766704=>'L',
1418866705=>'L',
1418966706=>'L',
1419066707=>'L',
1419166708=>'L',
1419266709=>'L',
1419366710=>'L',
1419466711=>'L',
1419566712=>'L',
1419666713=>'L',
1419766714=>'L',
1419866715=>'L',
1419966716=>'L',
1420066717=>'L',
1420166720=>'L',
1420266721=>'L',
1420366722=>'L',
1420466723=>'L',
1420566724=>'L',
1420666725=>'L',
1420766726=>'L',
1420866727=>'L',
1420966728=>'L',
1421066729=>'L',
1421167584=>'R',
1421267585=>'R',
1421367586=>'R',
1421467587=>'R',
1421567588=>'R',
1421667589=>'R',
1421767592=>'R',
1421867594=>'R',
1421967595=>'R',
1422067596=>'R',
1422167597=>'R',
1422267598=>'R',
1422367599=>'R',
1422467600=>'R',
1422567601=>'R',
1422667602=>'R',
1422767603=>'R',
1422867604=>'R',
1422967605=>'R',
1423067606=>'R',
1423167607=>'R',
1423267608=>'R',
1423367609=>'R',
1423467610=>'R',
1423567611=>'R',
1423667612=>'R',
1423767613=>'R',
1423867614=>'R',
1423967615=>'R',
1424067616=>'R',
1424167617=>'R',
1424267618=>'R',
1424367619=>'R',
1424467620=>'R',
1424567621=>'R',
1424667622=>'R',
1424767623=>'R',
1424867624=>'R',
1424967625=>'R',
1425067626=>'R',
1425167627=>'R',
1425267628=>'R',
1425367629=>'R',
1425467630=>'R',
1425567631=>'R',
1425667632=>'R',
1425767633=>'R',
1425867634=>'R',
1425967635=>'R',
1426067636=>'R',
1426167637=>'R',
1426267639=>'R',
1426367640=>'R',
1426467644=>'R',
1426567647=>'R',
1426667840=>'R',
1426767841=>'R',
1426867842=>'R',
1426967843=>'R',
1427067844=>'R',
1427167845=>'R',
1427267846=>'R',
1427367847=>'R',
1427467848=>'R',
1427567849=>'R',
1427667850=>'R',
1427767851=>'R',
1427867852=>'R',
1427967853=>'R',
1428067854=>'R',
1428167855=>'R',
1428267856=>'R',
1428367857=>'R',
1428467858=>'R',
1428567859=>'R',
1428667860=>'R',
1428767861=>'R',
1428867862=>'R',
1428967863=>'R',
1429067864=>'R',
1429167865=>'R',
1429267871=>'ON',
1429368096=>'R',
1429468097=>'NSM',
1429568098=>'NSM',
1429668099=>'NSM',
1429768101=>'NSM',
1429868102=>'NSM',
1429968108=>'NSM',
1430068109=>'NSM',
1430168110=>'NSM',
1430268111=>'NSM',
1430368112=>'R',
1430468113=>'R',
1430568114=>'R',
1430668115=>'R',
1430768117=>'R',
1430868118=>'R',
1430968119=>'R',
1431068121=>'R',
1431168122=>'R',
1431268123=>'R',
1431368124=>'R',
1431468125=>'R',
1431568126=>'R',
1431668127=>'R',
1431768128=>'R',
1431868129=>'R',
1431968130=>'R',
1432068131=>'R',
1432168132=>'R',
1432268133=>'R',
1432368134=>'R',
1432468135=>'R',
1432568136=>'R',
1432668137=>'R',
1432768138=>'R',
1432868139=>'R',
1432968140=>'R',
1433068141=>'R',
1433168142=>'R',
1433268143=>'R',
1433368144=>'R',
1433468145=>'R',
1433568146=>'R',
1433668147=>'R',
1433768152=>'NSM',
1433868153=>'NSM',
1433968154=>'NSM',
1434068159=>'NSM',
1434168160=>'R',
1434268161=>'R',
1434368162=>'R',
1434468163=>'R',
1434568164=>'R',
1434668165=>'R',
1434768166=>'R',
1434868167=>'R',
1434968176=>'R',
1435068177=>'R',
1435168178=>'R',
1435268179=>'R',
1435368180=>'R',
1435468181=>'R',
1435568182=>'R',
1435668183=>'R',
1435768184=>'R',
1435873728=>'L',
1435973729=>'L',
1436073730=>'L',
1436173731=>'L',
1436273732=>'L',
1436373733=>'L',
1436473734=>'L',
1436573735=>'L',
1436673736=>'L',
1436773737=>'L',
1436873738=>'L',
1436973739=>'L',
1437073740=>'L',
1437173741=>'L',
1437273742=>'L',
1437373743=>'L',
1437473744=>'L',
1437573745=>'L',
1437673746=>'L',
1437773747=>'L',
1437873748=>'L',
1437973749=>'L',
1438073750=>'L',
1438173751=>'L',
1438273752=>'L',
1438373753=>'L',
1438473754=>'L',
1438573755=>'L',
1438673756=>'L',
1438773757=>'L',
1438873758=>'L',
1438973759=>'L',
1439073760=>'L',
1439173761=>'L',
1439273762=>'L',
1439373763=>'L',
1439473764=>'L',
1439573765=>'L',
1439673766=>'L',
1439773767=>'L',
1439873768=>'L',
1439973769=>'L',
1440073770=>'L',
1440173771=>'L',
1440273772=>'L',
1440373773=>'L',
1440473774=>'L',
1440573775=>'L',
1440673776=>'L',
1440773777=>'L',
1440873778=>'L',
1440973779=>'L',
1441073780=>'L',
1441173781=>'L',
1441273782=>'L',
1441373783=>'L',
1441473784=>'L',
1441573785=>'L',
1441673786=>'L',
1441773787=>'L',
1441873788=>'L',
1441973789=>'L',
1442073790=>'L',
1442173791=>'L',
1442273792=>'L',
1442373793=>'L',
1442473794=>'L',
1442573795=>'L',
1442673796=>'L',
1442773797=>'L',
1442873798=>'L',
1442973799=>'L',
1443073800=>'L',
1443173801=>'L',
1443273802=>'L',
1443373803=>'L',
1443473804=>'L',
1443573805=>'L',
1443673806=>'L',
1443773807=>'L',
1443873808=>'L',
1443973809=>'L',
1444073810=>'L',
1444173811=>'L',
1444273812=>'L',
1444373813=>'L',
1444473814=>'L',
1444573815=>'L',
1444673816=>'L',
1444773817=>'L',
1444873818=>'L',
1444973819=>'L',
1445073820=>'L',
1445173821=>'L',
1445273822=>'L',
1445373823=>'L',
1445473824=>'L',
1445573825=>'L',
1445673826=>'L',
1445773827=>'L',
1445873828=>'L',
1445973829=>'L',
1446073830=>'L',
1446173831=>'L',
1446273832=>'L',
1446373833=>'L',
1446473834=>'L',
1446573835=>'L',
1446673836=>'L',
1446773837=>'L',
1446873838=>'L',
1446973839=>'L',
1447073840=>'L',
1447173841=>'L',
1447273842=>'L',
1447373843=>'L',
1447473844=>'L',
1447573845=>'L',
1447673846=>'L',
1447773847=>'L',
1447873848=>'L',
1447973849=>'L',
1448073850=>'L',
1448173851=>'L',
1448273852=>'L',
1448373853=>'L',
1448473854=>'L',
1448573855=>'L',
1448673856=>'L',
1448773857=>'L',
1448873858=>'L',
1448973859=>'L',
1449073860=>'L',
1449173861=>'L',
1449273862=>'L',
1449373863=>'L',
1449473864=>'L',
1449573865=>'L',
1449673866=>'L',
1449773867=>'L',
1449873868=>'L',
1449973869=>'L',
1450073870=>'L',
1450173871=>'L',
1450273872=>'L',
1450373873=>'L',
1450473874=>'L',
1450573875=>'L',
1450673876=>'L',
1450773877=>'L',
1450873878=>'L',
1450973879=>'L',
1451073880=>'L',
1451173881=>'L',
1451273882=>'L',
1451373883=>'L',
1451473884=>'L',
1451573885=>'L',
1451673886=>'L',
1451773887=>'L',
1451873888=>'L',
1451973889=>'L',
1452073890=>'L',
1452173891=>'L',
1452273892=>'L',
1452373893=>'L',
1452473894=>'L',
1452573895=>'L',
1452673896=>'L',
1452773897=>'L',
1452873898=>'L',
1452973899=>'L',
1453073900=>'L',
1453173901=>'L',
1453273902=>'L',
1453373903=>'L',
1453473904=>'L',
1453573905=>'L',
1453673906=>'L',
1453773907=>'L',
1453873908=>'L',
1453973909=>'L',
1454073910=>'L',
1454173911=>'L',
1454273912=>'L',
1454373913=>'L',
1454473914=>'L',
1454573915=>'L',
1454673916=>'L',
1454773917=>'L',
1454873918=>'L',
1454973919=>'L',
1455073920=>'L',
1455173921=>'L',
1455273922=>'L',
1455373923=>'L',
1455473924=>'L',
1455573925=>'L',
1455673926=>'L',
1455773927=>'L',
1455873928=>'L',
1455973929=>'L',
1456073930=>'L',
1456173931=>'L',
1456273932=>'L',
1456373933=>'L',
1456473934=>'L',
1456573935=>'L',
1456673936=>'L',
1456773937=>'L',
1456873938=>'L',
1456973939=>'L',
1457073940=>'L',
1457173941=>'L',
1457273942=>'L',
1457373943=>'L',
1457473944=>'L',
1457573945=>'L',
1457673946=>'L',
1457773947=>'L',
1457873948=>'L',
1457973949=>'L',
1458073950=>'L',
1458173951=>'L',
1458273952=>'L',
1458373953=>'L',
1458473954=>'L',
1458573955=>'L',
1458673956=>'L',
1458773957=>'L',
1458873958=>'L',
1458973959=>'L',
1459073960=>'L',
1459173961=>'L',
1459273962=>'L',
1459373963=>'L',
1459473964=>'L',
1459573965=>'L',
1459673966=>'L',
1459773967=>'L',
1459873968=>'L',
1459973969=>'L',
1460073970=>'L',
1460173971=>'L',
1460273972=>'L',
1460373973=>'L',
1460473974=>'L',
1460573975=>'L',
1460673976=>'L',
1460773977=>'L',
1460873978=>'L',
1460973979=>'L',
1461073980=>'L',
1461173981=>'L',
1461273982=>'L',
1461373983=>'L',
1461473984=>'L',
1461573985=>'L',
1461673986=>'L',
1461773987=>'L',
1461873988=>'L',
1461973989=>'L',
1462073990=>'L',
1462173991=>'L',
1462273992=>'L',
1462373993=>'L',
1462473994=>'L',
1462573995=>'L',
1462673996=>'L',
1462773997=>'L',
1462873998=>'L',
1462973999=>'L',
1463074000=>'L',
1463174001=>'L',
1463274002=>'L',
1463374003=>'L',
1463474004=>'L',
1463574005=>'L',
1463674006=>'L',
1463774007=>'L',
1463874008=>'L',
1463974009=>'L',
1464074010=>'L',
1464174011=>'L',
1464274012=>'L',
1464374013=>'L',
1464474014=>'L',
1464574015=>'L',
1464674016=>'L',
1464774017=>'L',
1464874018=>'L',
1464974019=>'L',
1465074020=>'L',
1465174021=>'L',
1465274022=>'L',
1465374023=>'L',
1465474024=>'L',
1465574025=>'L',
1465674026=>'L',
1465774027=>'L',
1465874028=>'L',
1465974029=>'L',
1466074030=>'L',
1466174031=>'L',
1466274032=>'L',
1466374033=>'L',
1466474034=>'L',
1466574035=>'L',
1466674036=>'L',
1466774037=>'L',
1466874038=>'L',
1466974039=>'L',
1467074040=>'L',
1467174041=>'L',
1467274042=>'L',
1467374043=>'L',
1467474044=>'L',
1467574045=>'L',
1467674046=>'L',
1467774047=>'L',
1467874048=>'L',
1467974049=>'L',
1468074050=>'L',
1468174051=>'L',
1468274052=>'L',
1468374053=>'L',
1468474054=>'L',
1468574055=>'L',
1468674056=>'L',
1468774057=>'L',
1468874058=>'L',
1468974059=>'L',
1469074060=>'L',
1469174061=>'L',
1469274062=>'L',
1469374063=>'L',
1469474064=>'L',
1469574065=>'L',
1469674066=>'L',
1469774067=>'L',
1469874068=>'L',
1469974069=>'L',
1470074070=>'L',
1470174071=>'L',
1470274072=>'L',
1470374073=>'L',
1470474074=>'L',
1470574075=>'L',
1470674076=>'L',
1470774077=>'L',
1470874078=>'L',
1470974079=>'L',
1471074080=>'L',
1471174081=>'L',
1471274082=>'L',
1471374083=>'L',
1471474084=>'L',
1471574085=>'L',
1471674086=>'L',
1471774087=>'L',
1471874088=>'L',
1471974089=>'L',
1472074090=>'L',
1472174091=>'L',
1472274092=>'L',
1472374093=>'L',
1472474094=>'L',
1472574095=>'L',
1472674096=>'L',
1472774097=>'L',
1472874098=>'L',
1472974099=>'L',
1473074100=>'L',
1473174101=>'L',
1473274102=>'L',
1473374103=>'L',
1473474104=>'L',
1473574105=>'L',
1473674106=>'L',
1473774107=>'L',
1473874108=>'L',
1473974109=>'L',
1474074110=>'L',
1474174111=>'L',
1474274112=>'L',
1474374113=>'L',
1474474114=>'L',
1474574115=>'L',
1474674116=>'L',
1474774117=>'L',
1474874118=>'L',
1474974119=>'L',
1475074120=>'L',
1475174121=>'L',
1475274122=>'L',
1475374123=>'L',
1475474124=>'L',
1475574125=>'L',
1475674126=>'L',
1475774127=>'L',
1475874128=>'L',
1475974129=>'L',
1476074130=>'L',
1476174131=>'L',
1476274132=>'L',
1476374133=>'L',
1476474134=>'L',
1476574135=>'L',
1476674136=>'L',
1476774137=>'L',
1476874138=>'L',
1476974139=>'L',
1477074140=>'L',
1477174141=>'L',
1477274142=>'L',
1477374143=>'L',
1477474144=>'L',
1477574145=>'L',
1477674146=>'L',
1477774147=>'L',
1477874148=>'L',
1477974149=>'L',
1478074150=>'L',
1478174151=>'L',
1478274152=>'L',
1478374153=>'L',
1478474154=>'L',
1478574155=>'L',
1478674156=>'L',
1478774157=>'L',
1478874158=>'L',
1478974159=>'L',
1479074160=>'L',
1479174161=>'L',
1479274162=>'L',
1479374163=>'L',
1479474164=>'L',
1479574165=>'L',
1479674166=>'L',
1479774167=>'L',
1479874168=>'L',
1479974169=>'L',
1480074170=>'L',
1480174171=>'L',
1480274172=>'L',
1480374173=>'L',
1480474174=>'L',
1480574175=>'L',
1480674176=>'L',
1480774177=>'L',
1480874178=>'L',
1480974179=>'L',
1481074180=>'L',
1481174181=>'L',
1481274182=>'L',
1481374183=>'L',
1481474184=>'L',
1481574185=>'L',
1481674186=>'L',
1481774187=>'L',
1481874188=>'L',
1481974189=>'L',
1482074190=>'L',
1482174191=>'L',
1482274192=>'L',
1482374193=>'L',
1482474194=>'L',
1482574195=>'L',
1482674196=>'L',
1482774197=>'L',
1482874198=>'L',
1482974199=>'L',
1483074200=>'L',
1483174201=>'L',
1483274202=>'L',
1483374203=>'L',
1483474204=>'L',
1483574205=>'L',
1483674206=>'L',
1483774207=>'L',
1483874208=>'L',
1483974209=>'L',
1484074210=>'L',
1484174211=>'L',
1484274212=>'L',
1484374213=>'L',
1484474214=>'L',
1484574215=>'L',
1484674216=>'L',
1484774217=>'L',
1484874218=>'L',
1484974219=>'L',
1485074220=>'L',
1485174221=>'L',
1485274222=>'L',
1485374223=>'L',
1485474224=>'L',
1485574225=>'L',
1485674226=>'L',
1485774227=>'L',
1485874228=>'L',
1485974229=>'L',
1486074230=>'L',
1486174231=>'L',
1486274232=>'L',
1486374233=>'L',
1486474234=>'L',
1486574235=>'L',
1486674236=>'L',
1486774237=>'L',
1486874238=>'L',
1486974239=>'L',
1487074240=>'L',
1487174241=>'L',
1487274242=>'L',
1487374243=>'L',
1487474244=>'L',
1487574245=>'L',
1487674246=>'L',
1487774247=>'L',
1487874248=>'L',
1487974249=>'L',
1488074250=>'L',
1488174251=>'L',
1488274252=>'L',
1488374253=>'L',
1488474254=>'L',
1488574255=>'L',
1488674256=>'L',
1488774257=>'L',
1488874258=>'L',
1488974259=>'L',
1489074260=>'L',
1489174261=>'L',
1489274262=>'L',
1489374263=>'L',
1489474264=>'L',
1489574265=>'L',
1489674266=>'L',
1489774267=>'L',
1489874268=>'L',
1489974269=>'L',
1490074270=>'L',
1490174271=>'L',
1490274272=>'L',
1490374273=>'L',
1490474274=>'L',
1490574275=>'L',
1490674276=>'L',
1490774277=>'L',
1490874278=>'L',
1490974279=>'L',
1491074280=>'L',
1491174281=>'L',
1491274282=>'L',
1491374283=>'L',
1491474284=>'L',
1491574285=>'L',
1491674286=>'L',
1491774287=>'L',
1491874288=>'L',
1491974289=>'L',
1492074290=>'L',
1492174291=>'L',
1492274292=>'L',
1492374293=>'L',
1492474294=>'L',
1492574295=>'L',
1492674296=>'L',
1492774297=>'L',
1492874298=>'L',
1492974299=>'L',
1493074300=>'L',
1493174301=>'L',
1493274302=>'L',
1493374303=>'L',
1493474304=>'L',
1493574305=>'L',
1493674306=>'L',
1493774307=>'L',
1493874308=>'L',
1493974309=>'L',
1494074310=>'L',
1494174311=>'L',
1494274312=>'L',
1494374313=>'L',
1494474314=>'L',
1494574315=>'L',
1494674316=>'L',
1494774317=>'L',
1494874318=>'L',
1494974319=>'L',
1495074320=>'L',
1495174321=>'L',
1495274322=>'L',
1495374323=>'L',
1495474324=>'L',
1495574325=>'L',
1495674326=>'L',
1495774327=>'L',
1495874328=>'L',
1495974329=>'L',
1496074330=>'L',
1496174331=>'L',
1496274332=>'L',
1496374333=>'L',
1496474334=>'L',
1496574335=>'L',
1496674336=>'L',
1496774337=>'L',
1496874338=>'L',
1496974339=>'L',
1497074340=>'L',
1497174341=>'L',
1497274342=>'L',
1497374343=>'L',
1497474344=>'L',
1497574345=>'L',
1497674346=>'L',
1497774347=>'L',
1497874348=>'L',
1497974349=>'L',
1498074350=>'L',
1498174351=>'L',
1498274352=>'L',
1498374353=>'L',
1498474354=>'L',
1498574355=>'L',
1498674356=>'L',
1498774357=>'L',
1498874358=>'L',
1498974359=>'L',
1499074360=>'L',
1499174361=>'L',
1499274362=>'L',
1499374363=>'L',
1499474364=>'L',
1499574365=>'L',
1499674366=>'L',
1499774367=>'L',
1499874368=>'L',
1499974369=>'L',
1500074370=>'L',
1500174371=>'L',
1500274372=>'L',
1500374373=>'L',
1500474374=>'L',
1500574375=>'L',
1500674376=>'L',
1500774377=>'L',
1500874378=>'L',
1500974379=>'L',
1501074380=>'L',
1501174381=>'L',
1501274382=>'L',
1501374383=>'L',
1501474384=>'L',
1501574385=>'L',
1501674386=>'L',
1501774387=>'L',
1501874388=>'L',
1501974389=>'L',
1502074390=>'L',
1502174391=>'L',
1502274392=>'L',
1502374393=>'L',
1502474394=>'L',
1502574395=>'L',
1502674396=>'L',
1502774397=>'L',
1502874398=>'L',
1502974399=>'L',
1503074400=>'L',
1503174401=>'L',
1503274402=>'L',
1503374403=>'L',
1503474404=>'L',
1503574405=>'L',
1503674406=>'L',
1503774407=>'L',
1503874408=>'L',
1503974409=>'L',
1504074410=>'L',
1504174411=>'L',
1504274412=>'L',
1504374413=>'L',
1504474414=>'L',
1504574415=>'L',
1504674416=>'L',
1504774417=>'L',
1504874418=>'L',
1504974419=>'L',
1505074420=>'L',
1505174421=>'L',
1505274422=>'L',
1505374423=>'L',
1505474424=>'L',
1505574425=>'L',
1505674426=>'L',
1505774427=>'L',
1505874428=>'L',
1505974429=>'L',
1506074430=>'L',
1506174431=>'L',
1506274432=>'L',
1506374433=>'L',
1506474434=>'L',
1506574435=>'L',
1506674436=>'L',
1506774437=>'L',
1506874438=>'L',
1506974439=>'L',
1507074440=>'L',
1507174441=>'L',
1507274442=>'L',
1507374443=>'L',
1507474444=>'L',
1507574445=>'L',
1507674446=>'L',
1507774447=>'L',
1507874448=>'L',
1507974449=>'L',
1508074450=>'L',
1508174451=>'L',
1508274452=>'L',
1508374453=>'L',
1508474454=>'L',
1508574455=>'L',
1508674456=>'L',
1508774457=>'L',
1508874458=>'L',
1508974459=>'L',
1509074460=>'L',
1509174461=>'L',
1509274462=>'L',
1509374463=>'L',
1509474464=>'L',
1509574465=>'L',
1509674466=>'L',
1509774467=>'L',
1509874468=>'L',
1509974469=>'L',
1510074470=>'L',
1510174471=>'L',
1510274472=>'L',
1510374473=>'L',
1510474474=>'L',
1510574475=>'L',
1510674476=>'L',
1510774477=>'L',
1510874478=>'L',
1510974479=>'L',
1511074480=>'L',
1511174481=>'L',
1511274482=>'L',
1511374483=>'L',
1511474484=>'L',
1511574485=>'L',
1511674486=>'L',
1511774487=>'L',
1511874488=>'L',
1511974489=>'L',
1512074490=>'L',
1512174491=>'L',
1512274492=>'L',
1512374493=>'L',
1512474494=>'L',
1512574495=>'L',
1512674496=>'L',
1512774497=>'L',
1512874498=>'L',
1512974499=>'L',
1513074500=>'L',
1513174501=>'L',
1513274502=>'L',
1513374503=>'L',
1513474504=>'L',
1513574505=>'L',
1513674506=>'L',
1513774507=>'L',
1513874508=>'L',
1513974509=>'L',
1514074510=>'L',
1514174511=>'L',
1514274512=>'L',
1514374513=>'L',
1514474514=>'L',
1514574515=>'L',
1514674516=>'L',
1514774517=>'L',
1514874518=>'L',
1514974519=>'L',
1515074520=>'L',
1515174521=>'L',
1515274522=>'L',
1515374523=>'L',
1515474524=>'L',
1515574525=>'L',
1515674526=>'L',
1515774527=>'L',
1515874528=>'L',
1515974529=>'L',
1516074530=>'L',
1516174531=>'L',
1516274532=>'L',
1516374533=>'L',
1516474534=>'L',
1516574535=>'L',
1516674536=>'L',
1516774537=>'L',
1516874538=>'L',
1516974539=>'L',
1517074540=>'L',
1517174541=>'L',
1517274542=>'L',
1517374543=>'L',
1517474544=>'L',
1517574545=>'L',
1517674546=>'L',
1517774547=>'L',
1517874548=>'L',
1517974549=>'L',
1518074550=>'L',
1518174551=>'L',
1518274552=>'L',
1518374553=>'L',
1518474554=>'L',
1518574555=>'L',
1518674556=>'L',
1518774557=>'L',
1518874558=>'L',
1518974559=>'L',
1519074560=>'L',
1519174561=>'L',
1519274562=>'L',
1519374563=>'L',
1519474564=>'L',
1519574565=>'L',
1519674566=>'L',
1519774567=>'L',
1519874568=>'L',
1519974569=>'L',
1520074570=>'L',
1520174571=>'L',
1520274572=>'L',
1520374573=>'L',
1520474574=>'L',
1520574575=>'L',
1520674576=>'L',
1520774577=>'L',
1520874578=>'L',
1520974579=>'L',
1521074580=>'L',
1521174581=>'L',
1521274582=>'L',
1521374583=>'L',
1521474584=>'L',
1521574585=>'L',
1521674586=>'L',
1521774587=>'L',
1521874588=>'L',
1521974589=>'L',
1522074590=>'L',
1522174591=>'L',
1522274592=>'L',
1522374593=>'L',
1522474594=>'L',
1522574595=>'L',
1522674596=>'L',
1522774597=>'L',
1522874598=>'L',
1522974599=>'L',
1523074600=>'L',
1523174601=>'L',
1523274602=>'L',
1523374603=>'L',
1523474604=>'L',
1523574605=>'L',
1523674606=>'L',
1523774752=>'L',
1523874753=>'L',
1523974754=>'L',
1524074755=>'L',
1524174756=>'L',
1524274757=>'L',
1524374758=>'L',
1524474759=>'L',
1524574760=>'L',
1524674761=>'L',
1524774762=>'L',
1524874763=>'L',
1524974764=>'L',
1525074765=>'L',
1525174766=>'L',
1525274767=>'L',
1525374768=>'L',
1525474769=>'L',
1525574770=>'L',
1525674771=>'L',
1525774772=>'L',
1525874773=>'L',
1525974774=>'L',
1526074775=>'L',
1526174776=>'L',
1526274777=>'L',
1526374778=>'L',
1526474779=>'L',
1526574780=>'L',
1526674781=>'L',
1526774782=>'L',
1526874783=>'L',
1526974784=>'L',
1527074785=>'L',
1527174786=>'L',
1527274787=>'L',
1527374788=>'L',
1527474789=>'L',
1527574790=>'L',
1527674791=>'L',
1527774792=>'L',
1527874793=>'L',
1527974794=>'L',
1528074795=>'L',
1528174796=>'L',
1528274797=>'L',
1528374798=>'L',
1528474799=>'L',
1528574800=>'L',
1528674801=>'L',
1528774802=>'L',
1528874803=>'L',
1528974804=>'L',
1529074805=>'L',
1529174806=>'L',
1529274807=>'L',
1529374808=>'L',
1529474809=>'L',
1529574810=>'L',
1529674811=>'L',
1529774812=>'L',
1529874813=>'L',
1529974814=>'L',
1530074815=>'L',
1530174816=>'L',
1530274817=>'L',
1530374818=>'L',
1530474819=>'L',
1530574820=>'L',
1530674821=>'L',
1530774822=>'L',
1530874823=>'L',
1530974824=>'L',
1531074825=>'L',
1531174826=>'L',
1531274827=>'L',
1531374828=>'L',
1531474829=>'L',
1531574830=>'L',
1531674831=>'L',
1531774832=>'L',
1531874833=>'L',
1531974834=>'L',
1532074835=>'L',
1532174836=>'L',
1532274837=>'L',
1532374838=>'L',
1532474839=>'L',
1532574840=>'L',
1532674841=>'L',
1532774842=>'L',
1532874843=>'L',
1532974844=>'L',
1533074845=>'L',
1533174846=>'L',
1533274847=>'L',
1533374848=>'L',
1533474849=>'L',
1533574850=>'L',
1533674864=>'L',
1533774865=>'L',
1533874866=>'L',
1533974867=>'L',
15340118784=>'L',
15341118785=>'L',
15342118786=>'L',
15343118787=>'L',
15344118788=>'L',
15345118789=>'L',
15346118790=>'L',
15347118791=>'L',
15348118792=>'L',
15349118793=>'L',
15350118794=>'L',
15351118795=>'L',
15352118796=>'L',
15353118797=>'L',
15354118798=>'L',
15355118799=>'L',
15356118800=>'L',
15357118801=>'L',
15358118802=>'L',
15359118803=>'L',
15360118804=>'L',
15361118805=>'L',
15362118806=>'L',
15363118807=>'L',
15364118808=>'L',
15365118809=>'L',
15366118810=>'L',
15367118811=>'L',
15368118812=>'L',
15369118813=>'L',
15370118814=>'L',
15371118815=>'L',
15372118816=>'L',
15373118817=>'L',
15374118818=>'L',
15375118819=>'L',
15376118820=>'L',
15377118821=>'L',
15378118822=>'L',
15379118823=>'L',
15380118824=>'L',
15381118825=>'L',
15382118826=>'L',
15383118827=>'L',
15384118828=>'L',
15385118829=>'L',
15386118830=>'L',
15387118831=>'L',
15388118832=>'L',
15389118833=>'L',
15390118834=>'L',
15391118835=>'L',
15392118836=>'L',
15393118837=>'L',
15394118838=>'L',
15395118839=>'L',
15396118840=>'L',
15397118841=>'L',
15398118842=>'L',
15399118843=>'L',
15400118844=>'L',
15401118845=>'L',
15402118846=>'L',
15403118847=>'L',
15404118848=>'L',
15405118849=>'L',
15406118850=>'L',
15407118851=>'L',
15408118852=>'L',
15409118853=>'L',
15410118854=>'L',
15411118855=>'L',
15412118856=>'L',
15413118857=>'L',
15414118858=>'L',
15415118859=>'L',
15416118860=>'L',
15417118861=>'L',
15418118862=>'L',
15419118863=>'L',
15420118864=>'L',
15421118865=>'L',
15422118866=>'L',
15423118867=>'L',
15424118868=>'L',
15425118869=>'L',
15426118870=>'L',
15427118871=>'L',
15428118872=>'L',
15429118873=>'L',
15430118874=>'L',
15431118875=>'L',
15432118876=>'L',
15433118877=>'L',
15434118878=>'L',
15435118879=>'L',
15436118880=>'L',
15437118881=>'L',
15438118882=>'L',
15439118883=>'L',
15440118884=>'L',
15441118885=>'L',
15442118886=>'L',
15443118887=>'L',
15444118888=>'L',
15445118889=>'L',
15446118890=>'L',
15447118891=>'L',
15448118892=>'L',
15449118893=>'L',
15450118894=>'L',
15451118895=>'L',
15452118896=>'L',
15453118897=>'L',
15454118898=>'L',
15455118899=>'L',
15456118900=>'L',
15457118901=>'L',
15458118902=>'L',
15459118903=>'L',
15460118904=>'L',
15461118905=>'L',
15462118906=>'L',
15463118907=>'L',
15464118908=>'L',
15465118909=>'L',
15466118910=>'L',
15467118911=>'L',
15468118912=>'L',
15469118913=>'L',
15470118914=>'L',
15471118915=>'L',
15472118916=>'L',
15473118917=>'L',
15474118918=>'L',
15475118919=>'L',
15476118920=>'L',
15477118921=>'L',
15478118922=>'L',
15479118923=>'L',
15480118924=>'L',
15481118925=>'L',
15482118926=>'L',
15483118927=>'L',
15484118928=>'L',
15485118929=>'L',
15486118930=>'L',
15487118931=>'L',
15488118932=>'L',
15489118933=>'L',
15490118934=>'L',
15491118935=>'L',
15492118936=>'L',
15493118937=>'L',
15494118938=>'L',
15495118939=>'L',
15496118940=>'L',
15497118941=>'L',
15498118942=>'L',
15499118943=>'L',
15500118944=>'L',
15501118945=>'L',
15502118946=>'L',
15503118947=>'L',
15504118948=>'L',
15505118949=>'L',
15506118950=>'L',
15507118951=>'L',
15508118952=>'L',
15509118953=>'L',
15510118954=>'L',
15511118955=>'L',
15512118956=>'L',
15513118957=>'L',
15514118958=>'L',
15515118959=>'L',
15516118960=>'L',
15517118961=>'L',
15518118962=>'L',
15519118963=>'L',
15520118964=>'L',
15521118965=>'L',
15522118966=>'L',
15523118967=>'L',
15524118968=>'L',
15525118969=>'L',
15526118970=>'L',
15527118971=>'L',
15528118972=>'L',
15529118973=>'L',
15530118974=>'L',
15531118975=>'L',
15532118976=>'L',
15533118977=>'L',
15534118978=>'L',
15535118979=>'L',
15536118980=>'L',
15537118981=>'L',
15538118982=>'L',
15539118983=>'L',
15540118984=>'L',
15541118985=>'L',
15542118986=>'L',
15543118987=>'L',
15544118988=>'L',
15545118989=>'L',
15546118990=>'L',
15547118991=>'L',
15548118992=>'L',
15549118993=>'L',
15550118994=>'L',
15551118995=>'L',
15552118996=>'L',
15553118997=>'L',
15554118998=>'L',
15555118999=>'L',
15556119000=>'L',
15557119001=>'L',
15558119002=>'L',
15559119003=>'L',
15560119004=>'L',
15561119005=>'L',
15562119006=>'L',
15563119007=>'L',
15564119008=>'L',
15565119009=>'L',
15566119010=>'L',
15567119011=>'L',
15568119012=>'L',
15569119013=>'L',
15570119014=>'L',
15571119015=>'L',
15572119016=>'L',
15573119017=>'L',
15574119018=>'L',
15575119019=>'L',
15576119020=>'L',
15577119021=>'L',
15578119022=>'L',
15579119023=>'L',
15580119024=>'L',
15581119025=>'L',
15582119026=>'L',
15583119027=>'L',
15584119028=>'L',
15585119029=>'L',
15586119040=>'L',
15587119041=>'L',
15588119042=>'L',
15589119043=>'L',
15590119044=>'L',
15591119045=>'L',
15592119046=>'L',
15593119047=>'L',
15594119048=>'L',
15595119049=>'L',
15596119050=>'L',
15597119051=>'L',
15598119052=>'L',
15599119053=>'L',
15600119054=>'L',
15601119055=>'L',
15602119056=>'L',
15603119057=>'L',
15604119058=>'L',
15605119059=>'L',
15606119060=>'L',
15607119061=>'L',
15608119062=>'L',
15609119063=>'L',
15610119064=>'L',
15611119065=>'L',
15612119066=>'L',
15613119067=>'L',
15614119068=>'L',
15615119069=>'L',
15616119070=>'L',
15617119071=>'L',
15618119072=>'L',
15619119073=>'L',
15620119074=>'L',
15621119075=>'L',
15622119076=>'L',
15623119077=>'L',
15624119078=>'L',
15625119082=>'L',
15626119083=>'L',
15627119084=>'L',
15628119085=>'L',
15629119086=>'L',
15630119087=>'L',
15631119088=>'L',
15632119089=>'L',
15633119090=>'L',
15634119091=>'L',
15635119092=>'L',
15636119093=>'L',
15637119094=>'L',
15638119095=>'L',
15639119096=>'L',
15640119097=>'L',
15641119098=>'L',
15642119099=>'L',
15643119100=>'L',
15644119101=>'L',
15645119102=>'L',
15646119103=>'L',
15647119104=>'L',
15648119105=>'L',
15649119106=>'L',
15650119107=>'L',
15651119108=>'L',
15652119109=>'L',
15653119110=>'L',
15654119111=>'L',
15655119112=>'L',
15656119113=>'L',
15657119114=>'L',
15658119115=>'L',
15659119116=>'L',
15660119117=>'L',
15661119118=>'L',
15662119119=>'L',
15663119120=>'L',
15664119121=>'L',
15665119122=>'L',
15666119123=>'L',
15667119124=>'L',
15668119125=>'L',
15669119126=>'L',
15670119127=>'L',
15671119128=>'L',
15672119129=>'L',
15673119130=>'L',
15674119131=>'L',
15675119132=>'L',
15676119133=>'L',
15677119134=>'L',
15678119135=>'L',
15679119136=>'L',
15680119137=>'L',
15681119138=>'L',
15682119139=>'L',
15683119140=>'L',
15684119141=>'L',
15685119142=>'L',
15686119143=>'NSM',
15687119144=>'NSM',
15688119145=>'NSM',
15689119146=>'L',
15690119147=>'L',
15691119148=>'L',
15692119149=>'L',
15693119150=>'L',
15694119151=>'L',
15695119152=>'L',
15696119153=>'L',
15697119154=>'L',
15698119155=>'BN',
15699119156=>'BN',
15700119157=>'BN',
15701119158=>'BN',
15702119159=>'BN',
15703119160=>'BN',
15704119161=>'BN',
15705119162=>'BN',
15706119163=>'NSM',
15707119164=>'NSM',
15708119165=>'NSM',
15709119166=>'NSM',
15710119167=>'NSM',
15711119168=>'NSM',
15712119169=>'NSM',
15713119170=>'NSM',
15714119171=>'L',
15715119172=>'L',
15716119173=>'NSM',
15717119174=>'NSM',
15718119175=>'NSM',
15719119176=>'NSM',
15720119177=>'NSM',
15721119178=>'NSM',
15722119179=>'NSM',
15723119180=>'L',
15724119181=>'L',
15725119182=>'L',
15726119183=>'L',
15727119184=>'L',
15728119185=>'L',
15729119186=>'L',
15730119187=>'L',
15731119188=>'L',
15732119189=>'L',
15733119190=>'L',
15734119191=>'L',
15735119192=>'L',
15736119193=>'L',
15737119194=>'L',
15738119195=>'L',
15739119196=>'L',
15740119197=>'L',
15741119198=>'L',
15742119199=>'L',
15743119200=>'L',
15744119201=>'L',
15745119202=>'L',
15746119203=>'L',
15747119204=>'L',
15748119205=>'L',
15749119206=>'L',
15750119207=>'L',
15751119208=>'L',
15752119209=>'L',
15753119210=>'NSM',
15754119211=>'NSM',
15755119212=>'NSM',
15756119213=>'NSM',
15757119214=>'L',
15758119215=>'L',
15759119216=>'L',
15760119217=>'L',
15761119218=>'L',
15762119219=>'L',
15763119220=>'L',
15764119221=>'L',
15765119222=>'L',
15766119223=>'L',
15767119224=>'L',
15768119225=>'L',
15769119226=>'L',
15770119227=>'L',
15771119228=>'L',
15772119229=>'L',
15773119230=>'L',
15774119231=>'L',
15775119232=>'L',
15776119233=>'L',
15777119234=>'L',
15778119235=>'L',
15779119236=>'L',
15780119237=>'L',
15781119238=>'L',
15782119239=>'L',
15783119240=>'L',
15784119241=>'L',
15785119242=>'L',
15786119243=>'L',
15787119244=>'L',
15788119245=>'L',
15789119246=>'L',
15790119247=>'L',
15791119248=>'L',
15792119249=>'L',
15793119250=>'L',
15794119251=>'L',
15795119252=>'L',
15796119253=>'L',
15797119254=>'L',
15798119255=>'L',
15799119256=>'L',
15800119257=>'L',
15801119258=>'L',
15802119259=>'L',
15803119260=>'L',
15804119261=>'L',
15805119296=>'ON',
15806119297=>'ON',
15807119298=>'ON',
15808119299=>'ON',
15809119300=>'ON',
15810119301=>'ON',
15811119302=>'ON',
15812119303=>'ON',
15813119304=>'ON',
15814119305=>'ON',
15815119306=>'ON',
15816119307=>'ON',
15817119308=>'ON',
15818119309=>'ON',
15819119310=>'ON',
15820119311=>'ON',
15821119312=>'ON',
15822119313=>'ON',
15823119314=>'ON',
15824119315=>'ON',
15825119316=>'ON',
15826119317=>'ON',
15827119318=>'ON',
15828119319=>'ON',
15829119320=>'ON',
15830119321=>'ON',
15831119322=>'ON',
15832119323=>'ON',
15833119324=>'ON',
15834119325=>'ON',
15835119326=>'ON',
15836119327=>'ON',
15837119328=>'ON',
15838119329=>'ON',
15839119330=>'ON',
15840119331=>'ON',
15841119332=>'ON',
15842119333=>'ON',
15843119334=>'ON',
15844119335=>'ON',
15845119336=>'ON',
15846119337=>'ON',
15847119338=>'ON',
15848119339=>'ON',
15849119340=>'ON',
15850119341=>'ON',
15851119342=>'ON',
15852119343=>'ON',
15853119344=>'ON',
15854119345=>'ON',
15855119346=>'ON',
15856119347=>'ON',
15857119348=>'ON',
15858119349=>'ON',
15859119350=>'ON',
15860119351=>'ON',
15861119352=>'ON',
15862119353=>'ON',
15863119354=>'ON',
15864119355=>'ON',
15865119356=>'ON',
15866119357=>'ON',
15867119358=>'ON',
15868119359=>'ON',
15869119360=>'ON',
15870119361=>'ON',
15871119362=>'NSM',
15872119363=>'NSM',
15873119364=>'NSM',
15874119365=>'ON',
15875119552=>'ON',
15876119553=>'ON',
15877119554=>'ON',
15878119555=>'ON',
15879119556=>'ON',
15880119557=>'ON',
15881119558=>'ON',
15882119559=>'ON',
15883119560=>'ON',
15884119561=>'ON',
15885119562=>'ON',
15886119563=>'ON',
15887119564=>'ON',
15888119565=>'ON',
15889119566=>'ON',
15890119567=>'ON',
15891119568=>'ON',
15892119569=>'ON',
15893119570=>'ON',
15894119571=>'ON',
15895119572=>'ON',
15896119573=>'ON',
15897119574=>'ON',
15898119575=>'ON',
15899119576=>'ON',
15900119577=>'ON',
15901119578=>'ON',
15902119579=>'ON',
15903119580=>'ON',
15904119581=>'ON',
15905119582=>'ON',
15906119583=>'ON',
15907119584=>'ON',
15908119585=>'ON',
15909119586=>'ON',
15910119587=>'ON',
15911119588=>'ON',
15912119589=>'ON',
15913119590=>'ON',
15914119591=>'ON',
15915119592=>'ON',
15916119593=>'ON',
15917119594=>'ON',
15918119595=>'ON',
15919119596=>'ON',
15920119597=>'ON',
15921119598=>'ON',
15922119599=>'ON',
15923119600=>'ON',
15924119601=>'ON',
15925119602=>'ON',
15926119603=>'ON',
15927119604=>'ON',
15928119605=>'ON',
15929119606=>'ON',
15930119607=>'ON',
15931119608=>'ON',
15932119609=>'ON',
15933119610=>'ON',
15934119611=>'ON',
15935119612=>'ON',
15936119613=>'ON',
15937119614=>'ON',
15938119615=>'ON',
15939119616=>'ON',
15940119617=>'ON',
15941119618=>'ON',
15942119619=>'ON',
15943119620=>'ON',
15944119621=>'ON',
15945119622=>'ON',
15946119623=>'ON',
15947119624=>'ON',
15948119625=>'ON',
15949119626=>'ON',
15950119627=>'ON',
15951119628=>'ON',
15952119629=>'ON',
15953119630=>'ON',
15954119631=>'ON',
15955119632=>'ON',
15956119633=>'ON',
15957119634=>'ON',
15958119635=>'ON',
15959119636=>'ON',
15960119637=>'ON',
15961119638=>'ON',
15962119648=>'L',
15963119649=>'L',
15964119650=>'L',
15965119651=>'L',
15966119652=>'L',
15967119653=>'L',
15968119654=>'L',
15969119655=>'L',
15970119656=>'L',
15971119657=>'L',
15972119658=>'L',
15973119659=>'L',
15974119660=>'L',
15975119661=>'L',
15976119662=>'L',
15977119663=>'L',
15978119664=>'L',
15979119665=>'L',
15980119808=>'L',
15981119809=>'L',
15982119810=>'L',
15983119811=>'L',
15984119812=>'L',
15985119813=>'L',
15986119814=>'L',
15987119815=>'L',
15988119816=>'L',
15989119817=>'L',
15990119818=>'L',
15991119819=>'L',
15992119820=>'L',
15993119821=>'L',
15994119822=>'L',
15995119823=>'L',
15996119824=>'L',
15997119825=>'L',
15998119826=>'L',
15999119827=>'L',
16000119828=>'L',
16001119829=>'L',
16002119830=>'L',
16003119831=>'L',
16004119832=>'L',
16005119833=>'L',
16006119834=>'L',
16007119835=>'L',
16008119836=>'L',
16009119837=>'L',
16010119838=>'L',
16011119839=>'L',
16012119840=>'L',
16013119841=>'L',
16014119842=>'L',
16015119843=>'L',
16016119844=>'L',
16017119845=>'L',
16018119846=>'L',
16019119847=>'L',
16020119848=>'L',
16021119849=>'L',
16022119850=>'L',
16023119851=>'L',
16024119852=>'L',
16025119853=>'L',
16026119854=>'L',
16027119855=>'L',
16028119856=>'L',
16029119857=>'L',
16030119858=>'L',
16031119859=>'L',
16032119860=>'L',
16033119861=>'L',
16034119862=>'L',
16035119863=>'L',
16036119864=>'L',
16037119865=>'L',
16038119866=>'L',
16039119867=>'L',
16040119868=>'L',
16041119869=>'L',
16042119870=>'L',
16043119871=>'L',
16044119872=>'L',
16045119873=>'L',
16046119874=>'L',
16047119875=>'L',
16048119876=>'L',
16049119877=>'L',
16050119878=>'L',
16051119879=>'L',
16052119880=>'L',
16053119881=>'L',
16054119882=>'L',
16055119883=>'L',
16056119884=>'L',
16057119885=>'L',
16058119886=>'L',
16059119887=>'L',
16060119888=>'L',
16061119889=>'L',
16062119890=>'L',
16063119891=>'L',
16064119892=>'L',
16065119894=>'L',
16066119895=>'L',
16067119896=>'L',
16068119897=>'L',
16069119898=>'L',
16070119899=>'L',
16071119900=>'L',
16072119901=>'L',
16073119902=>'L',
16074119903=>'L',
16075119904=>'L',
16076119905=>'L',
16077119906=>'L',
16078119907=>'L',
16079119908=>'L',
16080119909=>'L',
16081119910=>'L',
16082119911=>'L',
16083119912=>'L',
16084119913=>'L',
16085119914=>'L',
16086119915=>'L',
16087119916=>'L',
16088119917=>'L',
16089119918=>'L',
16090119919=>'L',
16091119920=>'L',
16092119921=>'L',
16093119922=>'L',
16094119923=>'L',
16095119924=>'L',
16096119925=>'L',
16097119926=>'L',
16098119927=>'L',
16099119928=>'L',
16100119929=>'L',
16101119930=>'L',
16102119931=>'L',
16103119932=>'L',
16104119933=>'L',
16105119934=>'L',
16106119935=>'L',
16107119936=>'L',
16108119937=>'L',
16109119938=>'L',
16110119939=>'L',
16111119940=>'L',
16112119941=>'L',
16113119942=>'L',
16114119943=>'L',
16115119944=>'L',
16116119945=>'L',
16117119946=>'L',
16118119947=>'L',
16119119948=>'L',
16120119949=>'L',
16121119950=>'L',
16122119951=>'L',
16123119952=>'L',
16124119953=>'L',
16125119954=>'L',
16126119955=>'L',
16127119956=>'L',
16128119957=>'L',
16129119958=>'L',
16130119959=>'L',
16131119960=>'L',
16132119961=>'L',
16133119962=>'L',
16134119963=>'L',
16135119964=>'L',
16136119966=>'L',
16137119967=>'L',
16138119970=>'L',
16139119973=>'L',
16140119974=>'L',
16141119977=>'L',
16142119978=>'L',
16143119979=>'L',
16144119980=>'L',
16145119982=>'L',
16146119983=>'L',
16147119984=>'L',
16148119985=>'L',
16149119986=>'L',
16150119987=>'L',
16151119988=>'L',
16152119989=>'L',
16153119990=>'L',
16154119991=>'L',
16155119992=>'L',
16156119993=>'L',
16157119995=>'L',
16158119997=>'L',
16159119998=>'L',
16160119999=>'L',
16161120000=>'L',
16162120001=>'L',
16163120002=>'L',
16164120003=>'L',
16165120005=>'L',
16166120006=>'L',
16167120007=>'L',
16168120008=>'L',
16169120009=>'L',
16170120010=>'L',
16171120011=>'L',
16172120012=>'L',
16173120013=>'L',
16174120014=>'L',
16175120015=>'L',
16176120016=>'L',
16177120017=>'L',
16178120018=>'L',
16179120019=>'L',
16180120020=>'L',
16181120021=>'L',
16182120022=>'L',
16183120023=>'L',
16184120024=>'L',
16185120025=>'L',
16186120026=>'L',
16187120027=>'L',
16188120028=>'L',
16189120029=>'L',
16190120030=>'L',
16191120031=>'L',
16192120032=>'L',
16193120033=>'L',
16194120034=>'L',
16195120035=>'L',
16196120036=>'L',
16197120037=>'L',
16198120038=>'L',
16199120039=>'L',
16200120040=>'L',
16201120041=>'L',
16202120042=>'L',
16203120043=>'L',
16204120044=>'L',
16205120045=>'L',
16206120046=>'L',
16207120047=>'L',
16208120048=>'L',
16209120049=>'L',
16210120050=>'L',
16211120051=>'L',
16212120052=>'L',
16213120053=>'L',
16214120054=>'L',
16215120055=>'L',
16216120056=>'L',
16217120057=>'L',
16218120058=>'L',
16219120059=>'L',
16220120060=>'L',
16221120061=>'L',
16222120062=>'L',
16223120063=>'L',
16224120064=>'L',
16225120065=>'L',
16226120066=>'L',
16227120067=>'L',
16228120068=>'L',
16229120069=>'L',
16230120071=>'L',
16231120072=>'L',
16232120073=>'L',
16233120074=>'L',
16234120077=>'L',
16235120078=>'L',
16236120079=>'L',
16237120080=>'L',
16238120081=>'L',
16239120082=>'L',
16240120083=>'L',
16241120084=>'L',
16242120086=>'L',
16243120087=>'L',
16244120088=>'L',
16245120089=>'L',
16246120090=>'L',
16247120091=>'L',
16248120092=>'L',
16249120094=>'L',
16250120095=>'L',
16251120096=>'L',
16252120097=>'L',
16253120098=>'L',
16254120099=>'L',
16255120100=>'L',
16256120101=>'L',
16257120102=>'L',
16258120103=>'L',
16259120104=>'L',
16260120105=>'L',
16261120106=>'L',
16262120107=>'L',
16263120108=>'L',
16264120109=>'L',
16265120110=>'L',
16266120111=>'L',
16267120112=>'L',
16268120113=>'L',
16269120114=>'L',
16270120115=>'L',
16271120116=>'L',
16272120117=>'L',
16273120118=>'L',
16274120119=>'L',
16275120120=>'L',
16276120121=>'L',
16277120123=>'L',
16278120124=>'L',
16279120125=>'L',
16280120126=>'L',
16281120128=>'L',
16282120129=>'L',
16283120130=>'L',
16284120131=>'L',
16285120132=>'L',
16286120134=>'L',
16287120138=>'L',
16288120139=>'L',
16289120140=>'L',
16290120141=>'L',
16291120142=>'L',
16292120143=>'L',
16293120144=>'L',
16294120146=>'L',
16295120147=>'L',
16296120148=>'L',
16297120149=>'L',
16298120150=>'L',
16299120151=>'L',
16300120152=>'L',
16301120153=>'L',
16302120154=>'L',
16303120155=>'L',
16304120156=>'L',
16305120157=>'L',
16306120158=>'L',
16307120159=>'L',
16308120160=>'L',
16309120161=>'L',
16310120162=>'L',
16311120163=>'L',
16312120164=>'L',
16313120165=>'L',
16314120166=>'L',
16315120167=>'L',
16316120168=>'L',
16317120169=>'L',
16318120170=>'L',
16319120171=>'L',
16320120172=>'L',
16321120173=>'L',
16322120174=>'L',
16323120175=>'L',
16324120176=>'L',
16325120177=>'L',
16326120178=>'L',
16327120179=>'L',
16328120180=>'L',
16329120181=>'L',
16330120182=>'L',
16331120183=>'L',
16332120184=>'L',
16333120185=>'L',
16334120186=>'L',
16335120187=>'L',
16336120188=>'L',
16337120189=>'L',
16338120190=>'L',
16339120191=>'L',
16340120192=>'L',
16341120193=>'L',
16342120194=>'L',
16343120195=>'L',
16344120196=>'L',
16345120197=>'L',
16346120198=>'L',
16347120199=>'L',
16348120200=>'L',
16349120201=>'L',
16350120202=>'L',
16351120203=>'L',
16352120204=>'L',
16353120205=>'L',
16354120206=>'L',
16355120207=>'L',
16356120208=>'L',
16357120209=>'L',
16358120210=>'L',
16359120211=>'L',
16360120212=>'L',
16361120213=>'L',
16362120214=>'L',
16363120215=>'L',
16364120216=>'L',
16365120217=>'L',
16366120218=>'L',
16367120219=>'L',
16368120220=>'L',
16369120221=>'L',
16370120222=>'L',
16371120223=>'L',
16372120224=>'L',
16373120225=>'L',
16374120226=>'L',
16375120227=>'L',
16376120228=>'L',
16377120229=>'L',
16378120230=>'L',
16379120231=>'L',
16380120232=>'L',
16381120233=>'L',
16382120234=>'L',
16383120235=>'L',
16384120236=>'L',
16385120237=>'L',
16386120238=>'L',
16387120239=>'L',
16388120240=>'L',
16389120241=>'L',
16390120242=>'L',
16391120243=>'L',
16392120244=>'L',
16393120245=>'L',
16394120246=>'L',
16395120247=>'L',
16396120248=>'L',
16397120249=>'L',
16398120250=>'L',
16399120251=>'L',
16400120252=>'L',
16401120253=>'L',
16402120254=>'L',
16403120255=>'L',
16404120256=>'L',
16405120257=>'L',
16406120258=>'L',
16407120259=>'L',
16408120260=>'L',
16409120261=>'L',
16410120262=>'L',
16411120263=>'L',
16412120264=>'L',
16413120265=>'L',
16414120266=>'L',
16415120267=>'L',
16416120268=>'L',
16417120269=>'L',
16418120270=>'L',
16419120271=>'L',
16420120272=>'L',
16421120273=>'L',
16422120274=>'L',
16423120275=>'L',
16424120276=>'L',
16425120277=>'L',
16426120278=>'L',
16427120279=>'L',
16428120280=>'L',
16429120281=>'L',
16430120282=>'L',
16431120283=>'L',
16432120284=>'L',
16433120285=>'L',
16434120286=>'L',
16435120287=>'L',
16436120288=>'L',
16437120289=>'L',
16438120290=>'L',
16439120291=>'L',
16440120292=>'L',
16441120293=>'L',
16442120294=>'L',
16443120295=>'L',
16444120296=>'L',
16445120297=>'L',
16446120298=>'L',
16447120299=>'L',
16448120300=>'L',
16449120301=>'L',
16450120302=>'L',
16451120303=>'L',
16452120304=>'L',
16453120305=>'L',
16454120306=>'L',
16455120307=>'L',
16456120308=>'L',
16457120309=>'L',
16458120310=>'L',
16459120311=>'L',
16460120312=>'L',
16461120313=>'L',
16462120314=>'L',
16463120315=>'L',
16464120316=>'L',
16465120317=>'L',
16466120318=>'L',
16467120319=>'L',
16468120320=>'L',
16469120321=>'L',
16470120322=>'L',
16471120323=>'L',
16472120324=>'L',
16473120325=>'L',
16474120326=>'L',
16475120327=>'L',
16476120328=>'L',
16477120329=>'L',
16478120330=>'L',
16479120331=>'L',
16480120332=>'L',
16481120333=>'L',
16482120334=>'L',
16483120335=>'L',
16484120336=>'L',
16485120337=>'L',
16486120338=>'L',
16487120339=>'L',
16488120340=>'L',
16489120341=>'L',
16490120342=>'L',
16491120343=>'L',
16492120344=>'L',
16493120345=>'L',
16494120346=>'L',
16495120347=>'L',
16496120348=>'L',
16497120349=>'L',
16498120350=>'L',
16499120351=>'L',
16500120352=>'L',
16501120353=>'L',
16502120354=>'L',
16503120355=>'L',
16504120356=>'L',
16505120357=>'L',
16506120358=>'L',
16507120359=>'L',
16508120360=>'L',
16509120361=>'L',
16510120362=>'L',
16511120363=>'L',
16512120364=>'L',
16513120365=>'L',
16514120366=>'L',
16515120367=>'L',
16516120368=>'L',
16517120369=>'L',
16518120370=>'L',
16519120371=>'L',
16520120372=>'L',
16521120373=>'L',
16522120374=>'L',
16523120375=>'L',
16524120376=>'L',
16525120377=>'L',
16526120378=>'L',
16527120379=>'L',
16528120380=>'L',
16529120381=>'L',
16530120382=>'L',
16531120383=>'L',
16532120384=>'L',
16533120385=>'L',
16534120386=>'L',
16535120387=>'L',
16536120388=>'L',
16537120389=>'L',
16538120390=>'L',
16539120391=>'L',
16540120392=>'L',
16541120393=>'L',
16542120394=>'L',
16543120395=>'L',
16544120396=>'L',
16545120397=>'L',
16546120398=>'L',
16547120399=>'L',
16548120400=>'L',
16549120401=>'L',
16550120402=>'L',
16551120403=>'L',
16552120404=>'L',
16553120405=>'L',
16554120406=>'L',
16555120407=>'L',
16556120408=>'L',
16557120409=>'L',
16558120410=>'L',
16559120411=>'L',
16560120412=>'L',
16561120413=>'L',
16562120414=>'L',
16563120415=>'L',
16564120416=>'L',
16565120417=>'L',
16566120418=>'L',
16567120419=>'L',
16568120420=>'L',
16569120421=>'L',
16570120422=>'L',
16571120423=>'L',
16572120424=>'L',
16573120425=>'L',
16574120426=>'L',
16575120427=>'L',
16576120428=>'L',
16577120429=>'L',
16578120430=>'L',
16579120431=>'L',
16580120432=>'L',
16581120433=>'L',
16582120434=>'L',
16583120435=>'L',
16584120436=>'L',
16585120437=>'L',
16586120438=>'L',
16587120439=>'L',
16588120440=>'L',
16589120441=>'L',
16590120442=>'L',
16591120443=>'L',
16592120444=>'L',
16593120445=>'L',
16594120446=>'L',
16595120447=>'L',
16596120448=>'L',
16597120449=>'L',
16598120450=>'L',
16599120451=>'L',
16600120452=>'L',
16601120453=>'L',
16602120454=>'L',
16603120455=>'L',
16604120456=>'L',
16605120457=>'L',
16606120458=>'L',
16607120459=>'L',
16608120460=>'L',
16609120461=>'L',
16610120462=>'L',
16611120463=>'L',
16612120464=>'L',
16613120465=>'L',
16614120466=>'L',
16615120467=>'L',
16616120468=>'L',
16617120469=>'L',
16618120470=>'L',
16619120471=>'L',
16620120472=>'L',
16621120473=>'L',
16622120474=>'L',
16623120475=>'L',
16624120476=>'L',
16625120477=>'L',
16626120478=>'L',
16627120479=>'L',
16628120480=>'L',
16629120481=>'L',
16630120482=>'L',
16631120483=>'L',
16632120484=>'L',
16633120485=>'L',
16634120488=>'L',
16635120489=>'L',
16636120490=>'L',
16637120491=>'L',
16638120492=>'L',
16639120493=>'L',
16640120494=>'L',
16641120495=>'L',
16642120496=>'L',
16643120497=>'L',
16644120498=>'L',
16645120499=>'L',
16646120500=>'L',
16647120501=>'L',
16648120502=>'L',
16649120503=>'L',
16650120504=>'L',
16651120505=>'L',
16652120506=>'L',
16653120507=>'L',
16654120508=>'L',
16655120509=>'L',
16656120510=>'L',
16657120511=>'L',
16658120512=>'L',
16659120513=>'L',
16660120514=>'L',
16661120515=>'L',
16662120516=>'L',
16663120517=>'L',
16664120518=>'L',
16665120519=>'L',
16666120520=>'L',
16667120521=>'L',
16668120522=>'L',
16669120523=>'L',
16670120524=>'L',
16671120525=>'L',
16672120526=>'L',
16673120527=>'L',
16674120528=>'L',
16675120529=>'L',
16676120530=>'L',
16677120531=>'L',
16678120532=>'L',
16679120533=>'L',
16680120534=>'L',
16681120535=>'L',
16682120536=>'L',
16683120537=>'L',
16684120538=>'L',
16685120539=>'L',
16686120540=>'L',
16687120541=>'L',
16688120542=>'L',
16689120543=>'L',
16690120544=>'L',
16691120545=>'L',
16692120546=>'L',
16693120547=>'L',
16694120548=>'L',
16695120549=>'L',
16696120550=>'L',
16697120551=>'L',
16698120552=>'L',
16699120553=>'L',
16700120554=>'L',
16701120555=>'L',
16702120556=>'L',
16703120557=>'L',
16704120558=>'L',
16705120559=>'L',
16706120560=>'L',
16707120561=>'L',
16708120562=>'L',
16709120563=>'L',
16710120564=>'L',
16711120565=>'L',
16712120566=>'L',
16713120567=>'L',
16714120568=>'L',
16715120569=>'L',
16716120570=>'L',
16717120571=>'L',
16718120572=>'L',
16719120573=>'L',
16720120574=>'L',
16721120575=>'L',
16722120576=>'L',
16723120577=>'L',
16724120578=>'L',
16725120579=>'L',
16726120580=>'L',
16727120581=>'L',
16728120582=>'L',
16729120583=>'L',
16730120584=>'L',
16731120585=>'L',
16732120586=>'L',
16733120587=>'L',
16734120588=>'L',
16735120589=>'L',
16736120590=>'L',
16737120591=>'L',
16738120592=>'L',
16739120593=>'L',
16740120594=>'L',
16741120595=>'L',
16742120596=>'L',
16743120597=>'L',
16744120598=>'L',
16745120599=>'L',
16746120600=>'L',
16747120601=>'L',
16748120602=>'L',
16749120603=>'L',
16750120604=>'L',
16751120605=>'L',
16752120606=>'L',
16753120607=>'L',
16754120608=>'L',
16755120609=>'L',
16756120610=>'L',
16757120611=>'L',
16758120612=>'L',
16759120613=>'L',
16760120614=>'L',
16761120615=>'L',
16762120616=>'L',
16763120617=>'L',
16764120618=>'L',
16765120619=>'L',
16766120620=>'L',
16767120621=>'L',
16768120622=>'L',
16769120623=>'L',
16770120624=>'L',
16771120625=>'L',
16772120626=>'L',
16773120627=>'L',
16774120628=>'L',
16775120629=>'L',
16776120630=>'L',
16777120631=>'L',
16778120632=>'L',
16779120633=>'L',
16780120634=>'L',
16781120635=>'L',
16782120636=>'L',
16783120637=>'L',
16784120638=>'L',
16785120639=>'L',
16786120640=>'L',
16787120641=>'L',
16788120642=>'L',
16789120643=>'L',
16790120644=>'L',
16791120645=>'L',
16792120646=>'L',
16793120647=>'L',
16794120648=>'L',
16795120649=>'L',
16796120650=>'L',
16797120651=>'L',
16798120652=>'L',
16799120653=>'L',
16800120654=>'L',
16801120655=>'L',
16802120656=>'L',
16803120657=>'L',
16804120658=>'L',
16805120659=>'L',
16806120660=>'L',
16807120661=>'L',
16808120662=>'L',
16809120663=>'L',
16810120664=>'L',
16811120665=>'L',
16812120666=>'L',
16813120667=>'L',
16814120668=>'L',
16815120669=>'L',
16816120670=>'L',
16817120671=>'L',
16818120672=>'L',
16819120673=>'L',
16820120674=>'L',
16821120675=>'L',
16822120676=>'L',
16823120677=>'L',
16824120678=>'L',
16825120679=>'L',
16826120680=>'L',
16827120681=>'L',
16828120682=>'L',
16829120683=>'L',
16830120684=>'L',
16831120685=>'L',
16832120686=>'L',
16833120687=>'L',
16834120688=>'L',
16835120689=>'L',
16836120690=>'L',
16837120691=>'L',
16838120692=>'L',
16839120693=>'L',
16840120694=>'L',
16841120695=>'L',
16842120696=>'L',
16843120697=>'L',
16844120698=>'L',
16845120699=>'L',
16846120700=>'L',
16847120701=>'L',
16848120702=>'L',
16849120703=>'L',
16850120704=>'L',
16851120705=>'L',
16852120706=>'L',
16853120707=>'L',
16854120708=>'L',
16855120709=>'L',
16856120710=>'L',
16857120711=>'L',
16858120712=>'L',
16859120713=>'L',
16860120714=>'L',
16861120715=>'L',
16862120716=>'L',
16863120717=>'L',
16864120718=>'L',
16865120719=>'L',
16866120720=>'L',
16867120721=>'L',
16868120722=>'L',
16869120723=>'L',
16870120724=>'L',
16871120725=>'L',
16872120726=>'L',
16873120727=>'L',
16874120728=>'L',
16875120729=>'L',
16876120730=>'L',
16877120731=>'L',
16878120732=>'L',
16879120733=>'L',
16880120734=>'L',
16881120735=>'L',
16882120736=>'L',
16883120737=>'L',
16884120738=>'L',
16885120739=>'L',
16886120740=>'L',
16887120741=>'L',
16888120742=>'L',
16889120743=>'L',
16890120744=>'L',
16891120745=>'L',
16892120746=>'L',
16893120747=>'L',
16894120748=>'L',
16895120749=>'L',
16896120750=>'L',
16897120751=>'L',
16898120752=>'L',
16899120753=>'L',
16900120754=>'L',
16901120755=>'L',
16902120756=>'L',
16903120757=>'L',
16904120758=>'L',
16905120759=>'L',
16906120760=>'L',
16907120761=>'L',
16908120762=>'L',
16909120763=>'L',
16910120764=>'L',
16911120765=>'L',
16912120766=>'L',
16913120767=>'L',
16914120768=>'L',
16915120769=>'L',
16916120770=>'L',
16917120771=>'L',
16918120772=>'L',
16919120773=>'L',
16920120774=>'L',
16921120775=>'L',
16922120776=>'L',
16923120777=>'L',
16924120778=>'L',
16925120779=>'L',
16926120782=>'EN',
16927120783=>'EN',
16928120784=>'EN',
16929120785=>'EN',
16930120786=>'EN',
16931120787=>'EN',
16932120788=>'EN',
16933120789=>'EN',
16934120790=>'EN',
16935120791=>'EN',
16936120792=>'EN',
16937120793=>'EN',
16938120794=>'EN',
16939120795=>'EN',
16940120796=>'EN',
16941120797=>'EN',
16942120798=>'EN',
16943120799=>'EN',
16944120800=>'EN',
16945120801=>'EN',
16946120802=>'EN',
16947120803=>'EN',
16948120804=>'EN',
16949120805=>'EN',
16950120806=>'EN',
16951120807=>'EN',
16952120808=>'EN',
16953120809=>'EN',
16954120810=>'EN',
16955120811=>'EN',
16956120812=>'EN',
16957120813=>'EN',
16958120814=>'EN',
16959120815=>'EN',
16960120816=>'EN',
16961120817=>'EN',
16962120818=>'EN',
16963120819=>'EN',
16964120820=>'EN',
16965120821=>'EN',
16966120822=>'EN',
16967120823=>'EN',
16968120824=>'EN',
16969120825=>'EN',
16970120826=>'EN',
16971120827=>'EN',
16972120828=>'EN',
16973120829=>'EN',
16974120830=>'EN',
16975120831=>'EN',
16976131072=>'L',
16977173782=>'L',
16978194560=>'L',
16979194561=>'L',
16980194562=>'L',
16981194563=>'L',
16982194564=>'L',
16983194565=>'L',
16984194566=>'L',
16985194567=>'L',
16986194568=>'L',
16987194569=>'L',
16988194570=>'L',
16989194571=>'L',
16990194572=>'L',
16991194573=>'L',
16992194574=>'L',
16993194575=>'L',
16994194576=>'L',
16995194577=>'L',
16996194578=>'L',
16997194579=>'L',
16998194580=>'L',
16999194581=>'L',
17000194582=>'L',
17001194583=>'L',
17002194584=>'L',
17003194585=>'L',
17004194586=>'L',
17005194587=>'L',
17006194588=>'L',
17007194589=>'L',
17008194590=>'L',
17009194591=>'L',
17010194592=>'L',
17011194593=>'L',
17012194594=>'L',
17013194595=>'L',
17014194596=>'L',
17015194597=>'L',
17016194598=>'L',
17017194599=>'L',
17018194600=>'L',
17019194601=>'L',
17020194602=>'L',
17021194603=>'L',
17022194604=>'L',
17023194605=>'L',
17024194606=>'L',
17025194607=>'L',
17026194608=>'L',
17027194609=>'L',
17028194610=>'L',
17029194611=>'L',
17030194612=>'L',
17031194613=>'L',
17032194614=>'L',
17033194615=>'L',
17034194616=>'L',
17035194617=>'L',
17036194618=>'L',
17037194619=>'L',
17038194620=>'L',
17039194621=>'L',
17040194622=>'L',
17041194623=>'L',
17042194624=>'L',
17043194625=>'L',
17044194626=>'L',
17045194627=>'L',
17046194628=>'L',
17047194629=>'L',
17048194630=>'L',
17049194631=>'L',
17050194632=>'L',
17051194633=>'L',
17052194634=>'L',
17053194635=>'L',
17054194636=>'L',
17055194637=>'L',
17056194638=>'L',
17057194639=>'L',
17058194640=>'L',
17059194641=>'L',
17060194642=>'L',
17061194643=>'L',
17062194644=>'L',
17063194645=>'L',
17064194646=>'L',
17065194647=>'L',
17066194648=>'L',
17067194649=>'L',
17068194650=>'L',
17069194651=>'L',
17070194652=>'L',
17071194653=>'L',
17072194654=>'L',
17073194655=>'L',
17074194656=>'L',
17075194657=>'L',
17076194658=>'L',
17077194659=>'L',
17078194660=>'L',
17079194661=>'L',
17080194662=>'L',
17081194663=>'L',
17082194664=>'L',
17083194665=>'L',
17084194666=>'L',
17085194667=>'L',
17086194668=>'L',
17087194669=>'L',
17088194670=>'L',
17089194671=>'L',
17090194672=>'L',
17091194673=>'L',
17092194674=>'L',
17093194675=>'L',
17094194676=>'L',
17095194677=>'L',
17096194678=>'L',
17097194679=>'L',
17098194680=>'L',
17099194681=>'L',
17100194682=>'L',
17101194683=>'L',
17102194684=>'L',
17103194685=>'L',
17104194686=>'L',
17105194687=>'L',
17106194688=>'L',
17107194689=>'L',
17108194690=>'L',
17109194691=>'L',
17110194692=>'L',
17111194693=>'L',
17112194694=>'L',
17113194695=>'L',
17114194696=>'L',
17115194697=>'L',
17116194698=>'L',
17117194699=>'L',
17118194700=>'L',
17119194701=>'L',
17120194702=>'L',
17121194703=>'L',
17122194704=>'L',
17123194705=>'L',
17124194706=>'L',
17125194707=>'L',
17126194708=>'L',
17127194709=>'L',
17128194710=>'L',
17129194711=>'L',
17130194712=>'L',
17131194713=>'L',
17132194714=>'L',
17133194715=>'L',
17134194716=>'L',
17135194717=>'L',
17136194718=>'L',
17137194719=>'L',
17138194720=>'L',
17139194721=>'L',
17140194722=>'L',
17141194723=>'L',
17142194724=>'L',
17143194725=>'L',
17144194726=>'L',
17145194727=>'L',
17146194728=>'L',
17147194729=>'L',
17148194730=>'L',
17149194731=>'L',
17150194732=>'L',
17151194733=>'L',
17152194734=>'L',
17153194735=>'L',
17154194736=>'L',
17155194737=>'L',
17156194738=>'L',
17157194739=>'L',
17158194740=>'L',
17159194741=>'L',
17160194742=>'L',
17161194743=>'L',
17162194744=>'L',
17163194745=>'L',
17164194746=>'L',
17165194747=>'L',
17166194748=>'L',
17167194749=>'L',
17168194750=>'L',
17169194751=>'L',
17170194752=>'L',
17171194753=>'L',
17172194754=>'L',
17173194755=>'L',
17174194756=>'L',
17175194757=>'L',
17176194758=>'L',
17177194759=>'L',
17178194760=>'L',
17179194761=>'L',
17180194762=>'L',
17181194763=>'L',
17182194764=>'L',
17183194765=>'L',
17184194766=>'L',
17185194767=>'L',
17186194768=>'L',
17187194769=>'L',
17188194770=>'L',
17189194771=>'L',
17190194772=>'L',
17191194773=>'L',
17192194774=>'L',
17193194775=>'L',
17194194776=>'L',
17195194777=>'L',
17196194778=>'L',
17197194779=>'L',
17198194780=>'L',
17199194781=>'L',
17200194782=>'L',
17201194783=>'L',
17202194784=>'L',
17203194785=>'L',
17204194786=>'L',
17205194787=>'L',
17206194788=>'L',
17207194789=>'L',
17208194790=>'L',
17209194791=>'L',
17210194792=>'L',
17211194793=>'L',
17212194794=>'L',
17213194795=>'L',
17214194796=>'L',
17215194797=>'L',
17216194798=>'L',
17217194799=>'L',
17218194800=>'L',
17219194801=>'L',
17220194802=>'L',
17221194803=>'L',
17222194804=>'L',
17223194805=>'L',
17224194806=>'L',
17225194807=>'L',
17226194808=>'L',
17227194809=>'L',
17228194810=>'L',
17229194811=>'L',
17230194812=>'L',
17231194813=>'L',
17232194814=>'L',
17233194815=>'L',
17234194816=>'L',
17235194817=>'L',
17236194818=>'L',
17237194819=>'L',
17238194820=>'L',
17239194821=>'L',
17240194822=>'L',
17241194823=>'L',
17242194824=>'L',
17243194825=>'L',
17244194826=>'L',
17245194827=>'L',
17246194828=>'L',
17247194829=>'L',
17248194830=>'L',
17249194831=>'L',
17250194832=>'L',
17251194833=>'L',
17252194834=>'L',
17253194835=>'L',
17254194836=>'L',
17255194837=>'L',
17256194838=>'L',
17257194839=>'L',
17258194840=>'L',
17259194841=>'L',
17260194842=>'L',
17261194843=>'L',
17262194844=>'L',
17263194845=>'L',
17264194846=>'L',
17265194847=>'L',
17266194848=>'L',
17267194849=>'L',
17268194850=>'L',
17269194851=>'L',
17270194852=>'L',
17271194853=>'L',
17272194854=>'L',
17273194855=>'L',
17274194856=>'L',
17275194857=>'L',
17276194858=>'L',
17277194859=>'L',
17278194860=>'L',
17279194861=>'L',
17280194862=>'L',
17281194863=>'L',
17282194864=>'L',
17283194865=>'L',
17284194866=>'L',
17285194867=>'L',
17286194868=>'L',
17287194869=>'L',
17288194870=>'L',
17289194871=>'L',
17290194872=>'L',
17291194873=>'L',
17292194874=>'L',
17293194875=>'L',
17294194876=>'L',
17295194877=>'L',
17296194878=>'L',
17297194879=>'L',
17298194880=>'L',
17299194881=>'L',
17300194882=>'L',
17301194883=>'L',
17302194884=>'L',
17303194885=>'L',
17304194886=>'L',
17305194887=>'L',
17306194888=>'L',
17307194889=>'L',
17308194890=>'L',
17309194891=>'L',
17310194892=>'L',
17311194893=>'L',
17312194894=>'L',
17313194895=>'L',
17314194896=>'L',
17315194897=>'L',
17316194898=>'L',
17317194899=>'L',
17318194900=>'L',
17319194901=>'L',
17320194902=>'L',
17321194903=>'L',
17322194904=>'L',
17323194905=>'L',
17324194906=>'L',
17325194907=>'L',
17326194908=>'L',
17327194909=>'L',
17328194910=>'L',
17329194911=>'L',
17330194912=>'L',
17331194913=>'L',
17332194914=>'L',
17333194915=>'L',
17334194916=>'L',
17335194917=>'L',
17336194918=>'L',
17337194919=>'L',
17338194920=>'L',
17339194921=>'L',
17340194922=>'L',
17341194923=>'L',
17342194924=>'L',
17343194925=>'L',
17344194926=>'L',
17345194927=>'L',
17346194928=>'L',
17347194929=>'L',
17348194930=>'L',
17349194931=>'L',
17350194932=>'L',
17351194933=>'L',
17352194934=>'L',
17353194935=>'L',
17354194936=>'L',
17355194937=>'L',
17356194938=>'L',
17357194939=>'L',
17358194940=>'L',
17359194941=>'L',
17360194942=>'L',
17361194943=>'L',
17362194944=>'L',
17363194945=>'L',
17364194946=>'L',
17365194947=>'L',
17366194948=>'L',
17367194949=>'L',
17368194950=>'L',
17369194951=>'L',
17370194952=>'L',
17371194953=>'L',
17372194954=>'L',
17373194955=>'L',
17374194956=>'L',
17375194957=>'L',
17376194958=>'L',
17377194959=>'L',
17378194960=>'L',
17379194961=>'L',
17380194962=>'L',
17381194963=>'L',
17382194964=>'L',
17383194965=>'L',
17384194966=>'L',
17385194967=>'L',
17386194968=>'L',
17387194969=>'L',
17388194970=>'L',
17389194971=>'L',
17390194972=>'L',
17391194973=>'L',
17392194974=>'L',
17393194975=>'L',
17394194976=>'L',
17395194977=>'L',
17396194978=>'L',
17397194979=>'L',
17398194980=>'L',
17399194981=>'L',
17400194982=>'L',
17401194983=>'L',
17402194984=>'L',
17403194985=>'L',
17404194986=>'L',
17405194987=>'L',
17406194988=>'L',
17407194989=>'L',
17408194990=>'L',
17409194991=>'L',
17410194992=>'L',
17411194993=>'L',
17412194994=>'L',
17413194995=>'L',
17414194996=>'L',
17415194997=>'L',
17416194998=>'L',
17417194999=>'L',
17418195000=>'L',
17419195001=>'L',
17420195002=>'L',
17421195003=>'L',
17422195004=>'L',
17423195005=>'L',
17424195006=>'L',
17425195007=>'L',
17426195008=>'L',
17427195009=>'L',
17428195010=>'L',
17429195011=>'L',
17430195012=>'L',
17431195013=>'L',
17432195014=>'L',
17433195015=>'L',
17434195016=>'L',
17435195017=>'L',
17436195018=>'L',
17437195019=>'L',
17438195020=>'L',
17439195021=>'L',
17440195022=>'L',
17441195023=>'L',
17442195024=>'L',
17443195025=>'L',
17444195026=>'L',
17445195027=>'L',
17446195028=>'L',
17447195029=>'L',
17448195030=>'L',
17449195031=>'L',
17450195032=>'L',
17451195033=>'L',
17452195034=>'L',
17453195035=>'L',
17454195036=>'L',
17455195037=>'L',
17456195038=>'L',
17457195039=>'L',
17458195040=>'L',
17459195041=>'L',
17460195042=>'L',
17461195043=>'L',
17462195044=>'L',
17463195045=>'L',
17464195046=>'L',
17465195047=>'L',
17466195048=>'L',
17467195049=>'L',
17468195050=>'L',
17469195051=>'L',
17470195052=>'L',
17471195053=>'L',
17472195054=>'L',
17473195055=>'L',
17474195056=>'L',
17475195057=>'L',
17476195058=>'L',
17477195059=>'L',
17478195060=>'L',
17479195061=>'L',
17480195062=>'L',
17481195063=>'L',
17482195064=>'L',
17483195065=>'L',
17484195066=>'L',
17485195067=>'L',
17486195068=>'L',
17487195069=>'L',
17488195070=>'L',
17489195071=>'L',
17490195072=>'L',
17491195073=>'L',
17492195074=>'L',
17493195075=>'L',
17494195076=>'L',
17495195077=>'L',
17496195078=>'L',
17497195079=>'L',
17498195080=>'L',
17499195081=>'L',
17500195082=>'L',
17501195083=>'L',
17502195084=>'L',
17503195085=>'L',
17504195086=>'L',
17505195087=>'L',
17506195088=>'L',
17507195089=>'L',
17508195090=>'L',
17509195091=>'L',
17510195092=>'L',
17511195093=>'L',
17512195094=>'L',
17513195095=>'L',
17514195096=>'L',
17515195097=>'L',
17516195098=>'L',
17517195099=>'L',
17518195100=>'L',
17519195101=>'L',
17520917505=>'BN',
17521917536=>'BN',
17522917537=>'BN',
17523917538=>'BN',
17524917539=>'BN',
17525917540=>'BN',
17526917541=>'BN',
17527917542=>'BN',
17528917543=>'BN',
17529917544=>'BN',
17530917545=>'BN',
17531917546=>'BN',
17532917547=>'BN',
17533917548=>'BN',
17534917549=>'BN',
17535917550=>'BN',
17536917551=>'BN',
17537917552=>'BN',
17538917553=>'BN',
17539917554=>'BN',
17540917555=>'BN',
17541917556=>'BN',
17542917557=>'BN',
17543917558=>'BN',
17544917559=>'BN',
17545917560=>'BN',
17546917561=>'BN',
17547917562=>'BN',
17548917563=>'BN',
17549917564=>'BN',
17550917565=>'BN',
17551917566=>'BN',
17552917567=>'BN',
17553917568=>'BN',
17554917569=>'BN',
17555917570=>'BN',
17556917571=>'BN',
17557917572=>'BN',
17558917573=>'BN',
17559917574=>'BN',
17560917575=>'BN',
17561917576=>'BN',
17562917577=>'BN',
17563917578=>'BN',
17564917579=>'BN',
17565917580=>'BN',
17566917581=>'BN',
17567917582=>'BN',
17568917583=>'BN',
17569917584=>'BN',
17570917585=>'BN',
17571917586=>'BN',
17572917587=>'BN',
17573917588=>'BN',
17574917589=>'BN',
17575917590=>'BN',
17576917591=>'BN',
17577917592=>'BN',
17578917593=>'BN',
17579917594=>'BN',
17580917595=>'BN',
17581917596=>'BN',
17582917597=>'BN',
17583917598=>'BN',
17584917599=>'BN',
17585917600=>'BN',
17586917601=>'BN',
17587917602=>'BN',
17588917603=>'BN',
17589917604=>'BN',
17590917605=>'BN',
17591917606=>'BN',
17592917607=>'BN',
17593917608=>'BN',
17594917609=>'BN',
17595917610=>'BN',
17596917611=>'BN',
17597917612=>'BN',
17598917613=>'BN',
17599917614=>'BN',
17600917615=>'BN',
17601917616=>'BN',
17602917617=>'BN',
17603917618=>'BN',
17604917619=>'BN',
17605917620=>'BN',
17606917621=>'BN',
17607917622=>'BN',
17608917623=>'BN',
17609917624=>'BN',
17610917625=>'BN',
17611917626=>'BN',
17612917627=>'BN',
17613917628=>'BN',
17614917629=>'BN',
17615917630=>'BN',
17616917631=>'BN',
17617917760=>'NSM',
17618917761=>'NSM',
17619917762=>'NSM',
17620917763=>'NSM',
17621917764=>'NSM',
17622917765=>'NSM',
17623917766=>'NSM',
17624917767=>'NSM',
17625917768=>'NSM',
17626917769=>'NSM',
17627917770=>'NSM',
17628917771=>'NSM',
17629917772=>'NSM',
17630917773=>'NSM',
17631917774=>'NSM',
17632917775=>'NSM',
17633917776=>'NSM',
17634917777=>'NSM',
17635917778=>'NSM',
17636917779=>'NSM',
17637917780=>'NSM',
17638917781=>'NSM',
17639917782=>'NSM',
17640917783=>'NSM',
17641917784=>'NSM',
17642917785=>'NSM',
17643917786=>'NSM',
17644917787=>'NSM',
17645917788=>'NSM',
17646917789=>'NSM',
17647917790=>'NSM',
17648917791=>'NSM',
17649917792=>'NSM',
17650917793=>'NSM',
17651917794=>'NSM',
17652917795=>'NSM',
17653917796=>'NSM',
17654917797=>'NSM',
17655917798=>'NSM',
17656917799=>'NSM',
17657917800=>'NSM',
17658917801=>'NSM',
17659917802=>'NSM',
17660917803=>'NSM',
17661917804=>'NSM',
17662917805=>'NSM',
17663917806=>'NSM',
17664917807=>'NSM',
17665917808=>'NSM',
17666917809=>'NSM',
17667917810=>'NSM',
17668917811=>'NSM',
17669917812=>'NSM',
17670917813=>'NSM',
17671917814=>'NSM',
17672917815=>'NSM',
17673917816=>'NSM',
17674917817=>'NSM',
17675917818=>'NSM',
17676917819=>'NSM',
17677917820=>'NSM',
17678917821=>'NSM',
17679917822=>'NSM',
17680917823=>'NSM',
17681917824=>'NSM',
17682917825=>'NSM',
17683917826=>'NSM',
17684917827=>'NSM',
17685917828=>'NSM',
17686917829=>'NSM',
17687917830=>'NSM',
17688917831=>'NSM',
17689917832=>'NSM',
17690917833=>'NSM',
17691917834=>'NSM',
17692917835=>'NSM',
17693917836=>'NSM',
17694917837=>'NSM',
17695917838=>'NSM',
17696917839=>'NSM',
17697917840=>'NSM',
17698917841=>'NSM',
17699917842=>'NSM',
17700917843=>'NSM',
17701917844=>'NSM',
17702917845=>'NSM',
17703917846=>'NSM',
17704917847=>'NSM',
17705917848=>'NSM',
17706917849=>'NSM',
17707917850=>'NSM',
17708917851=>'NSM',
17709917852=>'NSM',
17710917853=>'NSM',
17711917854=>'NSM',
17712917855=>'NSM',
17713917856=>'NSM',
17714917857=>'NSM',
17715917858=>'NSM',
17716917859=>'NSM',
17717917860=>'NSM',
17718917861=>'NSM',
17719917862=>'NSM',
17720917863=>'NSM',
17721917864=>'NSM',
17722917865=>'NSM',
17723917866=>'NSM',
17724917867=>'NSM',
17725917868=>'NSM',
17726917869=>'NSM',
17727917870=>'NSM',
17728917871=>'NSM',
17729917872=>'NSM',
17730917873=>'NSM',
17731917874=>'NSM',
17732917875=>'NSM',
17733917876=>'NSM',
17734917877=>'NSM',
17735917878=>'NSM',
17736917879=>'NSM',
17737917880=>'NSM',
17738917881=>'NSM',
17739917882=>'NSM',
17740917883=>'NSM',
17741917884=>'NSM',
17742917885=>'NSM',
17743917886=>'NSM',
17744917887=>'NSM',
17745917888=>'NSM',
17746917889=>'NSM',
17747917890=>'NSM',
17748917891=>'NSM',
17749917892=>'NSM',
17750917893=>'NSM',
17751917894=>'NSM',
17752917895=>'NSM',
17753917896=>'NSM',
17754917897=>'NSM',
17755917898=>'NSM',
17756917899=>'NSM',
17757917900=>'NSM',
17758917901=>'NSM',
17759917902=>'NSM',
17760917903=>'NSM',
17761917904=>'NSM',
17762917905=>'NSM',
17763917906=>'NSM',
17764917907=>'NSM',
17765917908=>'NSM',
17766917909=>'NSM',
17767917910=>'NSM',
17768917911=>'NSM',
17769917912=>'NSM',
17770917913=>'NSM',
17771917914=>'NSM',
17772917915=>'NSM',
17773917916=>'NSM',
17774917917=>'NSM',
17775917918=>'NSM',
17776917919=>'NSM',
17777917920=>'NSM',
17778917921=>'NSM',
17779917922=>'NSM',
17780917923=>'NSM',
17781917924=>'NSM',
17782917925=>'NSM',
17783917926=>'NSM',
17784917927=>'NSM',
17785917928=>'NSM',
17786917929=>'NSM',
17787917930=>'NSM',
17788917931=>'NSM',
17789917932=>'NSM',
17790917933=>'NSM',
17791917934=>'NSM',
17792917935=>'NSM',
17793917936=>'NSM',
17794917937=>'NSM',
17795917938=>'NSM',
17796917939=>'NSM',
17797917940=>'NSM',
17798917941=>'NSM',
17799917942=>'NSM',
17800917943=>'NSM',
17801917944=>'NSM',
17802917945=>'NSM',
17803917946=>'NSM',
17804917947=>'NSM',
17805917948=>'NSM',
17806917949=>'NSM',
17807917950=>'NSM',
17808917951=>'NSM',
17809917952=>'NSM',
17810917953=>'NSM',
17811917954=>'NSM',
17812917955=>'NSM',
17813917956=>'NSM',
17814917957=>'NSM',
17815917958=>'NSM',
17816917959=>'NSM',
17817917960=>'NSM',
17818917961=>'NSM',
17819917962=>'NSM',
17820917963=>'NSM',
17821917964=>'NSM',
17822917965=>'NSM',
17823917966=>'NSM',
17824917967=>'NSM',
17825917968=>'NSM',
17826917969=>'NSM',
17827917970=>'NSM',
17828917971=>'NSM',
17829917972=>'NSM',
17830917973=>'NSM',
17831917974=>'NSM',
17832917975=>'NSM',
17833917976=>'NSM',
17834917977=>'NSM',
17835917978=>'NSM',
17836917979=>'NSM',
17837917980=>'NSM',
17838917981=>'NSM',
17839917982=>'NSM',
17840917983=>'NSM',
17841917984=>'NSM',
17842917985=>'NSM',
17843917986=>'NSM',
17844917987=>'NSM',
17845917988=>'NSM',
17846917989=>'NSM',
17847917990=>'NSM',
17848917991=>'NSM',
17849917992=>'NSM',
17850917993=>'NSM',
17851917994=>'NSM',
17852917995=>'NSM',
17853917996=>'NSM',
17854917997=>'NSM',
17855917998=>'NSM',
17856917999=>'NSM',
17857983040=>'L',
178581048573=>'L',
178591048576=>'L',
178601114109=>'L'
17861);
17862
17863/**
17864 * Mirror unicode characters. For information on bidi mirroring, see UAX #9: Bidirectional Algorithm, at http://www.unicode.org/unicode/reports/tr9/
17865 * @public
17866 */
17867public static $uni_mirror = array (
178680x0028=>0x0029,
178690x0029=>0x0028,
178700x003C=>0x003E,
178710x003E=>0x003C,
178720x005B=>0x005D,
178730x005D=>0x005B,
178740x007B=>0x007D,
178750x007D=>0x007B,
178760x00AB=>0x00BB,
178770x00BB=>0x00AB,
178780x0F3A=>0x0F3B,
178790x0F3B=>0x0F3A,
178800x0F3C=>0x0F3D,
178810x0F3D=>0x0F3C,
178820x169B=>0x169C,
178830x169C=>0x169B,
178840x2018=>0x2019,
178850x2019=>0x2018,
178860x201C=>0x201D,
178870x201D=>0x201C,
178880x2039=>0x203A,
178890x203A=>0x2039,
178900x2045=>0x2046,
178910x2046=>0x2045,
178920x207D=>0x207E,
178930x207E=>0x207D,
178940x208D=>0x208E,
178950x208E=>0x208D,
178960x2208=>0x220B,
178970x2209=>0x220C,
178980x220A=>0x220D,
178990x220B=>0x2208,
179000x220C=>0x2209,
179010x220D=>0x220A,
179020x2215=>0x29F5,
179030x223C=>0x223D,
179040x223D=>0x223C,
179050x2243=>0x22CD,
179060x2252=>0x2253,
179070x2253=>0x2252,
179080x2254=>0x2255,
179090x2255=>0x2254,
179100x2264=>0x2265,
179110x2265=>0x2264,
179120x2266=>0x2267,
179130x2267=>0x2266,
179140x2268=>0x2269,
179150x2269=>0x2268,
179160x226A=>0x226B,
179170x226B=>0x226A,
179180x226E=>0x226F,
179190x226F=>0x226E,
179200x2270=>0x2271,
179210x2271=>0x2270,
179220x2272=>0x2273,
179230x2273=>0x2272,
179240x2274=>0x2275,
179250x2275=>0x2274,
179260x2276=>0x2277,
179270x2277=>0x2276,
179280x2278=>0x2279,
179290x2279=>0x2278,
179300x227A=>0x227B,
179310x227B=>0x227A,
179320x227C=>0x227D,
179330x227D=>0x227C,
179340x227E=>0x227F,
179350x227F=>0x227E,
179360x2280=>0x2281,
179370x2281=>0x2280,
179380x2282=>0x2283,
179390x2283=>0x2282,
179400x2284=>0x2285,
179410x2285=>0x2284,
179420x2286=>0x2287,
179430x2287=>0x2286,
179440x2288=>0x2289,
179450x2289=>0x2288,
179460x228A=>0x228B,
179470x228B=>0x228A,
179480x228F=>0x2290,
179490x2290=>0x228F,
179500x2291=>0x2292,
179510x2292=>0x2291,
179520x2298=>0x29B8,
179530x22A2=>0x22A3,
179540x22A3=>0x22A2,
179550x22A6=>0x2ADE,
179560x22A8=>0x2AE4,
179570x22A9=>0x2AE3,
179580x22AB=>0x2AE5,
179590x22B0=>0x22B1,
179600x22B1=>0x22B0,
179610x22B2=>0x22B3,
179620x22B3=>0x22B2,
179630x22B4=>0x22B5,
179640x22B5=>0x22B4,
179650x22B6=>0x22B7,
179660x22B7=>0x22B6,
179670x22C9=>0x22CA,
179680x22CA=>0x22C9,
179690x22CB=>0x22CC,
179700x22CC=>0x22CB,
179710x22CD=>0x2243,
179720x22D0=>0x22D1,
179730x22D1=>0x22D0,
179740x22D6=>0x22D7,
179750x22D7=>0x22D6,
179760x22D8=>0x22D9,
179770x22D9=>0x22D8,
179780x22DA=>0x22DB,
179790x22DB=>0x22DA,
179800x22DC=>0x22DD,
179810x22DD=>0x22DC,
179820x22DE=>0x22DF,
179830x22DF=>0x22DE,
179840x22E0=>0x22E1,
179850x22E1=>0x22E0,
179860x22E2=>0x22E3,
179870x22E3=>0x22E2,
179880x22E4=>0x22E5,
179890x22E5=>0x22E4,
179900x22E6=>0x22E7,
179910x22E7=>0x22E6,
179920x22E8=>0x22E9,
179930x22E9=>0x22E8,
179940x22EA=>0x22EB,
179950x22EB=>0x22EA,
179960x22EC=>0x22ED,
179970x22ED=>0x22EC,
179980x22F0=>0x22F1,
179990x22F1=>0x22F0,
180000x22F2=>0x22FA,
180010x22F3=>0x22FB,
180020x22F4=>0x22FC,
180030x22F6=>0x22FD,
180040x22F7=>0x22FE,
180050x22FA=>0x22F2,
180060x22FB=>0x22F3,
180070x22FC=>0x22F4,
180080x22FD=>0x22F6,
180090x22FE=>0x22F7,
180100x2308=>0x2309,
180110x2309=>0x2308,
180120x230A=>0x230B,
180130x230B=>0x230A,
180140x2329=>0x232A,
180150x232A=>0x2329,
180160x2768=>0x2769,
180170x2769=>0x2768,
180180x276A=>0x276B,
180190x276B=>0x276A,
180200x276C=>0x276D,
180210x276D=>0x276C,
180220x276E=>0x276F,
180230x276F=>0x276E,
180240x2770=>0x2771,
180250x2771=>0x2770,
180260x2772=>0x2773,
180270x2773=>0x2772,
180280x2774=>0x2775,
180290x2775=>0x2774,
180300x27C3=>0x27C4,
180310x27C4=>0x27C3,
180320x27C5=>0x27C6,
180330x27C6=>0x27C5,
180340x27D5=>0x27D6,
180350x27D6=>0x27D5,
180360x27DD=>0x27DE,
180370x27DE=>0x27DD,
180380x27E2=>0x27E3,
180390x27E3=>0x27E2,
180400x27E4=>0x27E5,
180410x27E5=>0x27E4,
180420x27E6=>0x27E7,
180430x27E7=>0x27E6,
180440x27E8=>0x27E9,
180450x27E9=>0x27E8,
180460x27EA=>0x27EB,
180470x27EB=>0x27EA,
180480x2983=>0x2984,
180490x2984=>0x2983,
180500x2985=>0x2986,
180510x2986=>0x2985,
180520x2987=>0x2988,
180530x2988=>0x2987,
180540x2989=>0x298A,
180550x298A=>0x2989,
180560x298B=>0x298C,
180570x298C=>0x298B,
180580x298D=>0x2990,
180590x298E=>0x298F,
180600x298F=>0x298E,
180610x2990=>0x298D,
180620x2991=>0x2992,
180630x2992=>0x2991,
180640x2993=>0x2994,
180650x2994=>0x2993,
180660x2995=>0x2996,
180670x2996=>0x2995,
180680x2997=>0x2998,
180690x2998=>0x2997,
180700x29B8=>0x2298,
180710x29C0=>0x29C1,
180720x29C1=>0x29C0,
180730x29C4=>0x29C5,
180740x29C5=>0x29C4,
180750x29CF=>0x29D0,
180760x29D0=>0x29CF,
180770x29D1=>0x29D2,
180780x29D2=>0x29D1,
180790x29D4=>0x29D5,
180800x29D5=>0x29D4,
180810x29D8=>0x29D9,
180820x29D9=>0x29D8,
180830x29DA=>0x29DB,
180840x29DB=>0x29DA,
180850x29F5=>0x2215,
180860x29F8=>0x29F9,
180870x29F9=>0x29F8,
180880x29FC=>0x29FD,
180890x29FD=>0x29FC,
180900x2A2B=>0x2A2C,
180910x2A2C=>0x2A2B,
180920x2A2D=>0x2A2E,
180930x2A2E=>0x2A2D,
180940x2A34=>0x2A35,
180950x2A35=>0x2A34,
180960x2A3C=>0x2A3D,
180970x2A3D=>0x2A3C,
180980x2A64=>0x2A65,
180990x2A65=>0x2A64,
181000x2A79=>0x2A7A,
181010x2A7A=>0x2A79,
181020x2A7D=>0x2A7E,
181030x2A7E=>0x2A7D,
181040x2A7F=>0x2A80,
181050x2A80=>0x2A7F,
181060x2A81=>0x2A82,
181070x2A82=>0x2A81,
181080x2A83=>0x2A84,
181090x2A84=>0x2A83,
181100x2A8B=>0x2A8C,
181110x2A8C=>0x2A8B,
181120x2A91=>0x2A92,
181130x2A92=>0x2A91,
181140x2A93=>0x2A94,
181150x2A94=>0x2A93,
181160x2A95=>0x2A96,
181170x2A96=>0x2A95,
181180x2A97=>0x2A98,
181190x2A98=>0x2A97,
181200x2A99=>0x2A9A,
181210x2A9A=>0x2A99,
181220x2A9B=>0x2A9C,
181230x2A9C=>0x2A9B,
181240x2AA1=>0x2AA2,
181250x2AA2=>0x2AA1,
181260x2AA6=>0x2AA7,
181270x2AA7=>0x2AA6,
181280x2AA8=>0x2AA9,
181290x2AA9=>0x2AA8,
181300x2AAA=>0x2AAB,
181310x2AAB=>0x2AAA,
181320x2AAC=>0x2AAD,
181330x2AAD=>0x2AAC,
181340x2AAF=>0x2AB0,
181350x2AB0=>0x2AAF,
181360x2AB3=>0x2AB4,
181370x2AB4=>0x2AB3,
181380x2ABB=>0x2ABC,
181390x2ABC=>0x2ABB,
181400x2ABD=>0x2ABE,
181410x2ABE=>0x2ABD,
181420x2ABF=>0x2AC0,
181430x2AC0=>0x2ABF,
181440x2AC1=>0x2AC2,
181450x2AC2=>0x2AC1,
181460x2AC3=>0x2AC4,
181470x2AC4=>0x2AC3,
181480x2AC5=>0x2AC6,
181490x2AC6=>0x2AC5,
181500x2ACD=>0x2ACE,
181510x2ACE=>0x2ACD,
181520x2ACF=>0x2AD0,
181530x2AD0=>0x2ACF,
181540x2AD1=>0x2AD2,
181550x2AD2=>0x2AD1,
181560x2AD3=>0x2AD4,
181570x2AD4=>0x2AD3,
181580x2AD5=>0x2AD6,
181590x2AD6=>0x2AD5,
181600x2ADE=>0x22A6,
181610x2AE3=>0x22A9,
181620x2AE4=>0x22A8,
181630x2AE5=>0x22AB,
181640x2AEC=>0x2AED,
181650x2AED=>0x2AEC,
181660x2AF7=>0x2AF8,
181670x2AF8=>0x2AF7,
181680x2AF9=>0x2AFA,
181690x2AFA=>0x2AF9,
181700x2E02=>0x2E03,
181710x2E03=>0x2E02,
181720x2E04=>0x2E05,
181730x2E05=>0x2E04,
181740x2E09=>0x2E0A,
181750x2E0A=>0x2E09,
181760x2E0C=>0x2E0D,
181770x2E0D=>0x2E0C,
181780x2E1C=>0x2E1D,
181790x2E1D=>0x2E1C,
181800x3008=>0x3009,
181810x3009=>0x3008,
181820x300A=>0x300B,
181830x300B=>0x300A,
181840x300C=>0x300D,
181850x300D=>0x300C,
181860x300E=>0x300F,
181870x300F=>0x300E,
181880x3010=>0x3011,
181890x3011=>0x3010,
181900x3014=>0x3015,
181910x3015=>0x3014,
181920x3016=>0x3017,
181930x3017=>0x3016,
181940x3018=>0x3019,
181950x3019=>0x3018,
181960x301A=>0x301B,
181970x301B=>0x301A,
181980x301D=>0x301E,
181990x301E=>0x301D,
182000xFE59=>0xFE5A,
182010xFE5A=>0xFE59,
182020xFE5B=>0xFE5C,
182030xFE5C=>0xFE5B,
182040xFE5D=>0xFE5E,
182050xFE5E=>0xFE5D,
182060xFE64=>0xFE65,
182070xFE65=>0xFE64,
182080xFF08=>0xFF09,
182090xFF09=>0xFF08,
182100xFF1C=>0xFF1E,
182110xFF1E=>0xFF1C,
182120xFF3B=>0xFF3D,
182130xFF3D=>0xFF3B,
182140xFF5B=>0xFF5D,
182150xFF5D=>0xFF5B,
182160xFF5F=>0xFF60,
182170xFF60=>0xFF5F,
182180xFF62=>0xFF63,
182190xFF63=>0xFF62);
18220
18221/**
18222 * Arabic shape substitutions: char code => (isolated, final, initial, medial).
18223 * @public
18224 */
18225public static $uni_arabicsubst = array(
182261569=>array(65152),
182271570=>array(65153, 65154, 65153, 65154),
182281571=>array(65155, 65156, 65155, 65156),
182291572=>array(65157, 65158),
182301573=>array(65159, 65160, 65159, 65160),
182311574=>array(65161, 65162, 65163, 65164),
182321575=>array(65165, 65166, 65165, 65166),
182331576=>array(65167, 65168, 65169, 65170),
182341577=>array(65171, 65172),
182351578=>array(65173, 65174, 65175, 65176),
182361579=>array(65177, 65178, 65179, 65180),
182371580=>array(65181, 65182, 65183, 65184),
182381581=>array(65185, 65186, 65187, 65188),
182391582=>array(65189, 65190, 65191, 65192),
182401583=>array(65193, 65194, 65193, 65194),
182411584=>array(65195, 65196, 65195, 65196),
182421585=>array(65197, 65198, 65197, 65198),
182431586=>array(65199, 65200, 65199, 65200),
182441587=>array(65201, 65202, 65203, 65204),
182451588=>array(65205, 65206, 65207, 65208),
182461589=>array(65209, 65210, 65211, 65212),
182471590=>array(65213, 65214, 65215, 65216),
182481591=>array(65217, 65218, 65219, 65220),
182491592=>array(65221, 65222, 65223, 65224),
182501593=>array(65225, 65226, 65227, 65228),
182511594=>array(65229, 65230, 65231, 65232),
182521601=>array(65233, 65234, 65235, 65236),
182531602=>array(65237, 65238, 65239, 65240),
182541603=>array(65241, 65242, 65243, 65244),
182551604=>array(65245, 65246, 65247, 65248),
182561605=>array(65249, 65250, 65251, 65252),
182571606=>array(65253, 65254, 65255, 65256),
182581607=>array(65257, 65258, 65259, 65260),
182591608=>array(65261, 65262, 65261, 65262),
182601609=>array(65263, 65264, 64488, 64489),
182611610=>array(65265, 65266, 65267, 65268),
182621649=>array(64336, 64337),
182631655=>array(64477),
182641657=>array(64358, 64359, 64360, 64361),
182651658=>array(64350, 64351, 64352, 64353),
182661659=>array(64338, 64339, 64340, 64341),
182671662=>array(64342, 64343, 64344, 64345),
182681663=>array(64354, 64355, 64356, 64357),
182691664=>array(64346, 64347, 64348, 64349),
182701667=>array(64374, 64375, 64376, 64377),
182711668=>array(64370, 64371, 64372, 64373),
182721670=>array(64378, 64379, 64380, 64381),
182731671=>array(64382, 64383, 64384, 64385),
182741672=>array(64392, 64393),
182751676=>array(64388, 64389),
182761677=>array(64386, 64387),
182771678=>array(64390, 64391),
182781681=>array(64396, 64397),
182791688=>array(64394, 64395, 64394, 64395),
182801700=>array(64362, 64363, 64364, 64365),
182811702=>array(64366, 64367, 64368, 64369),
182821705=>array(64398, 64399, 64400, 64401),
182831709=>array(64467, 64468, 64469, 64470),
182841711=>array(64402, 64403, 64404, 64405),
182851713=>array(64410, 64411, 64412, 64413),
182861715=>array(64406, 64407, 64408, 64409),
182871722=>array(64414, 64415),
182881723=>array(64416, 64417, 64418, 64419),
182891726=>array(64426, 64427, 64428, 64429),
182901728=>array(64420, 64421),
182911729=>array(64422, 64423, 64424, 64425),
182921733=>array(64480, 64481),
182931734=>array(64473, 64474),
182941735=>array(64471, 64472),
182951736=>array(64475, 64476),
182961737=>array(64482, 64483),
182971739=>array(64478, 64479),
182981740=>array(64508, 64509, 64510, 64511),
182991744=>array(64484, 64485, 64486, 64487),
183001746=>array(64430, 64431),
183011747=>array(64432, 64433)
18302);
18303
18304/**
18305 * Arabic laa letter: (char code => isolated, final, initial, medial).
18306 * @public
18307 */
18308public static $uni_laa_array = array (
183091570 =>array(65269, 65270, 65269, 65270),
183101571 =>array(65271, 65272, 65271, 65272),
183111573 =>array(65273, 65274, 65273, 65274),
183121575 =>array(65275, 65276, 65275, 65276)
18313);
18314
18315/**
18316 * Array of character substitutions for sequences of two diacritics symbols.
18317 * Putting the combining mark and character in the same glyph allows us to avoid the two marks overlapping each other in an illegible manner.
18318 * second NSM char code => substitution char
18319 * @public
18320 */
18321public static $uni_diacritics = array (
183221612=>64606, # Shadda + Dammatan
183231613=>64607, # Shadda + Kasratan
183241614=>64608, # Shadda + Fatha
183251615=>64609, # Shadda + Damma
183261616=>64610 # Shadda + Kasra
18327);
18328
18329/**
18330 * Array of character substitutions from UTF-8 Unicode to Latin1.
18331 * @public
18332 */
18333public static $uni_utf8tolatin = array (
183348364=>128, # Euro1
18335338=>140, # OE
18336352=>138, # Scaron
18337376=>159, # Ydieresis
18338381=>142, # Zcaron2
183398226=>149, # bullet3
18340710=>136, # circumflex
183418224=>134, # dagger
183428225=>135, # daggerdbl
183438230=>133, # ellipsis
183448212=>151, # emdash
183458211=>150, # endash
18346402=>131, # florin
183478249=>139, # guilsinglleft
183488250=>155, # guilsinglright
18349339=>156, # oe
183508240=>137, # perthousand
183518222=>132, # quotedblbase
183528220=>147, # quotedblleft
183538221=>148, # quotedblright
183548216=>145, # quoteleft
183558217=>146, # quoteright
183568218=>130, # quotesinglbase
18357353=>154, # scaron
18358732=>152, # tilde
183598482=>153, # trademark
18360382=>158 # zcaron2
18361);
18362
18363/**
18364 * Array of Encoding Maps.
18365 * @public static
18366 */
18367public static $encmap = array(
18368
18369// encoding map for: cp874
18370'cp874' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'Euro',129=>'.notdef',130=>'.notdef',131=>'.notdef',132=>'.notdef',133=>'ellipsis',134=>'.notdef',135=>'.notdef',136=>'.notdef',137=>'.notdef',138=>'.notdef',139=>'.notdef',140=>'.notdef',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'quoteleft',146=>'quoteright',147=>'quotedblleft',148=>'quotedblright',149=>'bullet',150=>'endash',151=>'emdash',152=>'.notdef',153=>'.notdef',154=>'.notdef',155=>'.notdef',156=>'.notdef',157=>'.notdef',158=>'.notdef',159=>'.notdef',160=>'space',161=>'kokaithai',162=>'khokhaithai',163=>'khokhuatthai',164=>'khokhwaithai',165=>'khokhonthai',166=>'khorakhangthai',167=>'ngonguthai',168=>'chochanthai',169=>'chochingthai',170=>'chochangthai',171=>'sosothai',172=>'chochoethai',173=>'yoyingthai',174=>'dochadathai',175=>'topatakthai',176=>'thothanthai',177=>'thonangmonthothai',178=>'thophuthaothai',179=>'nonenthai',180=>'dodekthai',181=>'totaothai',182=>'thothungthai',183=>'thothahanthai',184=>'thothongthai',185=>'nonuthai',186=>'bobaimaithai',187=>'poplathai',188=>'phophungthai',189=>'fofathai',190=>'phophanthai',191=>'fofanthai',192=>'phosamphaothai',193=>'momathai',194=>'yoyakthai',195=>'roruathai',196=>'ruthai',197=>'lolingthai',198=>'luthai',199=>'wowaenthai',200=>'sosalathai',201=>'sorusithai',202=>'sosuathai',203=>'hohipthai',204=>'lochulathai',205=>'oangthai',206=>'honokhukthai',207=>'paiyannoithai',208=>'saraathai',209=>'maihanakatthai',210=>'saraaathai',211=>'saraamthai',212=>'saraithai',213=>'saraiithai',214=>'sarauethai',215=>'saraueethai',216=>'sarauthai',217=>'sarauuthai',218=>'phinthuthai',219=>'.notdef',220=>'.notdef',221=>'.notdef',222=>'.notdef',223=>'bahtthai',224=>'saraethai',225=>'saraaethai',226=>'saraothai',227=>'saraaimaimuanthai',228=>'saraaimaimalaithai',229=>'lakkhangyaothai',230=>'maiyamokthai',231=>'maitaikhuthai',232=>'maiekthai',233=>'maithothai',234=>'maitrithai',235=>'maichattawathai',236=>'thanthakhatthai',237=>'nikhahitthai',238=>'yamakkanthai',239=>'fongmanthai',240=>'zerothai',241=>'onethai',242=>'twothai',243=>'threethai',244=>'fourthai',245=>'fivethai',246=>'sixthai',247=>'seventhai',248=>'eightthai',249=>'ninethai',250=>'angkhankhuthai',251=>'khomutthai',252=>'.notdef',253=>'.notdef',254=>'.notdef',255=>'.notdef'),
18371
18372// encoding map for: cp1250
18373'cp1250' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'Euro',129=>'.notdef',130=>'quotesinglbase',131=>'.notdef',132=>'quotedblbase',133=>'ellipsis',134=>'dagger',135=>'daggerdbl',136=>'.notdef',137=>'perthousand',138=>'Scaron',139=>'guilsinglleft',140=>'Sacute',141=>'Tcaron',142=>'Zcaron',143=>'Zacute',144=>'.notdef',145=>'quoteleft',146=>'quoteright',147=>'quotedblleft',148=>'quotedblright',149=>'bullet',150=>'endash',151=>'emdash',152=>'.notdef',153=>'trademark',154=>'scaron',155=>'guilsinglright',156=>'sacute',157=>'tcaron',158=>'zcaron',159=>'zacute',160=>'space',161=>'caron',162=>'breve',163=>'Lslash',164=>'currency',165=>'Aogonek',166=>'brokenbar',167=>'section',168=>'dieresis',169=>'copyright',170=>'Scedilla',171=>'guillemotleft',172=>'logicalnot',173=>'hyphen',174=>'registered',175=>'Zdotaccent',176=>'degree',177=>'plusminus',178=>'ogonek',179=>'lslash',180=>'acute',181=>'mu',182=>'paragraph',183=>'periodcentered',184=>'cedilla',185=>'aogonek',186=>'scedilla',187=>'guillemotright',188=>'Lcaron',189=>'hungarumlaut',190=>'lcaron',191=>'zdotaccent',192=>'Racute',193=>'Aacute',194=>'Acircumflex',195=>'Abreve',196=>'Adieresis',197=>'Lacute',198=>'Cacute',199=>'Ccedilla',200=>'Ccaron',201=>'Eacute',202=>'Eogonek',203=>'Edieresis',204=>'Ecaron',205=>'Iacute',206=>'Icircumflex',207=>'Dcaron',208=>'Dcroat',209=>'Nacute',210=>'Ncaron',211=>'Oacute',212=>'Ocircumflex',213=>'Ohungarumlaut',214=>'Odieresis',215=>'multiply',216=>'Rcaron',217=>'Uring',218=>'Uacute',219=>'Uhungarumlaut',220=>'Udieresis',221=>'Yacute',222=>'Tcommaaccent',223=>'germandbls',224=>'racute',225=>'aacute',226=>'acircumflex',227=>'abreve',228=>'adieresis',229=>'lacute',230=>'cacute',231=>'ccedilla',232=>'ccaron',233=>'eacute',234=>'eogonek',235=>'edieresis',236=>'ecaron',237=>'iacute',238=>'icircumflex',239=>'dcaron',240=>'dcroat',241=>'nacute',242=>'ncaron',243=>'oacute',244=>'ocircumflex',245=>'ohungarumlaut',246=>'odieresis',247=>'divide',248=>'rcaron',249=>'uring',250=>'uacute',251=>'uhungarumlaut',252=>'udieresis',253=>'yacute',254=>'tcommaaccent',255=>'dotaccent'),
18374
18375// encoding map for: cp1251
18376'cp1251' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'afii10051',129=>'afii10052',130=>'quotesinglbase',131=>'afii10100',132=>'quotedblbase',133=>'ellipsis',134=>'dagger',135=>'daggerdbl',136=>'Euro',137=>'perthousand',138=>'afii10058',139=>'guilsinglleft',140=>'afii10059',141=>'afii10061',142=>'afii10060',143=>'afii10145',144=>'afii10099',145=>'quoteleft',146=>'quoteright',147=>'quotedblleft',148=>'quotedblright',149=>'bullet',150=>'endash',151=>'emdash',152=>'.notdef',153=>'trademark',154=>'afii10106',155=>'guilsinglright',156=>'afii10107',157=>'afii10109',158=>'afii10108',159=>'afii10193',160=>'space',161=>'afii10062',162=>'afii10110',163=>'afii10057',164=>'currency',165=>'afii10050',166=>'brokenbar',167=>'section',168=>'afii10023',169=>'copyright',170=>'afii10053',171=>'guillemotleft',172=>'logicalnot',173=>'hyphen',174=>'registered',175=>'afii10056',176=>'degree',177=>'plusminus',178=>'afii10055',179=>'afii10103',180=>'afii10098',181=>'mu',182=>'paragraph',183=>'periodcentered',184=>'afii10071',185=>'afii61352',186=>'afii10101',187=>'guillemotright',188=>'afii10105',189=>'afii10054',190=>'afii10102',191=>'afii10104',192=>'afii10017',193=>'afii10018',194=>'afii10019',195=>'afii10020',196=>'afii10021',197=>'afii10022',198=>'afii10024',199=>'afii10025',200=>'afii10026',201=>'afii10027',202=>'afii10028',203=>'afii10029',204=>'afii10030',205=>'afii10031',206=>'afii10032',207=>'afii10033',208=>'afii10034',209=>'afii10035',210=>'afii10036',211=>'afii10037',212=>'afii10038',213=>'afii10039',214=>'afii10040',215=>'afii10041',216=>'afii10042',217=>'afii10043',218=>'afii10044',219=>'afii10045',220=>'afii10046',221=>'afii10047',222=>'afii10048',223=>'afii10049',224=>'afii10065',225=>'afii10066',226=>'afii10067',227=>'afii10068',228=>'afii10069',229=>'afii10070',230=>'afii10072',231=>'afii10073',232=>'afii10074',233=>'afii10075',234=>'afii10076',235=>'afii10077',236=>'afii10078',237=>'afii10079',238=>'afii10080',239=>'afii10081',240=>'afii10082',241=>'afii10083',242=>'afii10084',243=>'afii10085',244=>'afii10086',245=>'afii10087',246=>'afii10088',247=>'afii10089',248=>'afii10090',249=>'afii10091',250=>'afii10092',251=>'afii10093',252=>'afii10094',253=>'afii10095',254=>'afii10096',255=>'afii10097'),
18377
18378// encoding map for: cp1252
18379'cp1252' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'Euro',129=>'.notdef',130=>'quotesinglbase',131=>'florin',132=>'quotedblbase',133=>'ellipsis',134=>'dagger',135=>'daggerdbl',136=>'circumflex',137=>'perthousand',138=>'Scaron',139=>'guilsinglleft',140=>'OE',141=>'.notdef',142=>'Zcaron',143=>'.notdef',144=>'.notdef',145=>'quoteleft',146=>'quoteright',147=>'quotedblleft',148=>'quotedblright',149=>'bullet',150=>'endash',151=>'emdash',152=>'tilde',153=>'trademark',154=>'scaron',155=>'guilsinglright',156=>'oe',157=>'.notdef',158=>'zcaron',159=>'Ydieresis',160=>'space',161=>'exclamdown',162=>'cent',163=>'sterling',164=>'currency',165=>'yen',166=>'brokenbar',167=>'section',168=>'dieresis',169=>'copyright',170=>'ordfeminine',171=>'guillemotleft',172=>'logicalnot',173=>'hyphen',174=>'registered',175=>'macron',176=>'degree',177=>'plusminus',178=>'twosuperior',179=>'threesuperior',180=>'acute',181=>'mu',182=>'paragraph',183=>'periodcentered',184=>'cedilla',185=>'onesuperior',186=>'ordmasculine',187=>'guillemotright',188=>'onequarter',189=>'onehalf',190=>'threequarters',191=>'questiondown',192=>'Agrave',193=>'Aacute',194=>'Acircumflex',195=>'Atilde',196=>'Adieresis',197=>'Aring',198=>'AE',199=>'Ccedilla',200=>'Egrave',201=>'Eacute',202=>'Ecircumflex',203=>'Edieresis',204=>'Igrave',205=>'Iacute',206=>'Icircumflex',207=>'Idieresis',208=>'Eth',209=>'Ntilde',210=>'Ograve',211=>'Oacute',212=>'Ocircumflex',213=>'Otilde',214=>'Odieresis',215=>'multiply',216=>'Oslash',217=>'Ugrave',218=>'Uacute',219=>'Ucircumflex',220=>'Udieresis',221=>'Yacute',222=>'Thorn',223=>'germandbls',224=>'agrave',225=>'aacute',226=>'acircumflex',227=>'atilde',228=>'adieresis',229=>'aring',230=>'ae',231=>'ccedilla',232=>'egrave',233=>'eacute',234=>'ecircumflex',235=>'edieresis',236=>'igrave',237=>'iacute',238=>'icircumflex',239=>'idieresis',240=>'eth',241=>'ntilde',242=>'ograve',243=>'oacute',244=>'ocircumflex',245=>'otilde',246=>'odieresis',247=>'divide',248=>'oslash',249=>'ugrave',250=>'uacute',251=>'ucircumflex',252=>'udieresis',253=>'yacute',254=>'thorn',255=>'ydieresis'),
18380
18381// encoding map for: cp1253
18382'cp1253' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'Euro',129=>'.notdef',130=>'quotesinglbase',131=>'florin',132=>'quotedblbase',133=>'ellipsis',134=>'dagger',135=>'daggerdbl',136=>'.notdef',137=>'perthousand',138=>'.notdef',139=>'guilsinglleft',140=>'.notdef',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'quoteleft',146=>'quoteright',147=>'quotedblleft',148=>'quotedblright',149=>'bullet',150=>'endash',151=>'emdash',152=>'.notdef',153=>'trademark',154=>'.notdef',155=>'guilsinglright',156=>'.notdef',157=>'.notdef',158=>'.notdef',159=>'.notdef',160=>'space',161=>'dieresistonos',162=>'Alphatonos',163=>'sterling',164=>'currency',165=>'yen',166=>'brokenbar',167=>'section',168=>'dieresis',169=>'copyright',170=>'.notdef',171=>'guillemotleft',172=>'logicalnot',173=>'hyphen',174=>'registered',175=>'afii00208',176=>'degree',177=>'plusminus',178=>'twosuperior',179=>'threesuperior',180=>'tonos',181=>'mu',182=>'paragraph',183=>'periodcentered',184=>'Epsilontonos',185=>'Etatonos',186=>'Iotatonos',187=>'guillemotright',188=>'Omicrontonos',189=>'onehalf',190=>'Upsilontonos',191=>'Omegatonos',192=>'iotadieresistonos',193=>'Alpha',194=>'Beta',195=>'Gamma',196=>'Delta',197=>'Epsilon',198=>'Zeta',199=>'Eta',200=>'Theta',201=>'Iota',202=>'Kappa',203=>'Lambda',204=>'Mu',205=>'Nu',206=>'Xi',207=>'Omicron',208=>'Pi',209=>'Rho',210=>'.notdef',211=>'Sigma',212=>'Tau',213=>'Upsilon',214=>'Phi',215=>'Chi',216=>'Psi',217=>'Omega',218=>'Iotadieresis',219=>'Upsilondieresis',220=>'alphatonos',221=>'epsilontonos',222=>'etatonos',223=>'iotatonos',224=>'upsilondieresistonos',225=>'alpha',226=>'beta',227=>'gamma',228=>'delta',229=>'epsilon',230=>'zeta',231=>'eta',232=>'theta',233=>'iota',234=>'kappa',235=>'lambda',236=>'mu',237=>'nu',238=>'xi',239=>'omicron',240=>'pi',241=>'rho',242=>'sigma1',243=>'sigma',244=>'tau',245=>'upsilon',246=>'phi',247=>'chi',248=>'psi',249=>'omega',250=>'iotadieresis',251=>'upsilondieresis',252=>'omicrontonos',253=>'upsilontonos',254=>'omegatonos',255=>'.notdef'),
18383
18384// encoding map for: cp1254
18385'cp1254' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'Euro',129=>'.notdef',130=>'quotesinglbase',131=>'florin',132=>'quotedblbase',133=>'ellipsis',134=>'dagger',135=>'daggerdbl',136=>'circumflex',137=>'perthousand',138=>'Scaron',139=>'guilsinglleft',140=>'OE',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'quoteleft',146=>'quoteright',147=>'quotedblleft',148=>'quotedblright',149=>'bullet',150=>'endash',151=>'emdash',152=>'tilde',153=>'trademark',154=>'scaron',155=>'guilsinglright',156=>'oe',157=>'.notdef',158=>'.notdef',159=>'Ydieresis',160=>'space',161=>'exclamdown',162=>'cent',163=>'sterling',164=>'currency',165=>'yen',166=>'brokenbar',167=>'section',168=>'dieresis',169=>'copyright',170=>'ordfeminine',171=>'guillemotleft',172=>'logicalnot',173=>'hyphen',174=>'registered',175=>'macron',176=>'degree',177=>'plusminus',178=>'twosuperior',179=>'threesuperior',180=>'acute',181=>'mu',182=>'paragraph',183=>'periodcentered',184=>'cedilla',185=>'onesuperior',186=>'ordmasculine',187=>'guillemotright',188=>'onequarter',189=>'onehalf',190=>'threequarters',191=>'questiondown',192=>'Agrave',193=>'Aacute',194=>'Acircumflex',195=>'Atilde',196=>'Adieresis',197=>'Aring',198=>'AE',199=>'Ccedilla',200=>'Egrave',201=>'Eacute',202=>'Ecircumflex',203=>'Edieresis',204=>'Igrave',205=>'Iacute',206=>'Icircumflex',207=>'Idieresis',208=>'Gbreve',209=>'Ntilde',210=>'Ograve',211=>'Oacute',212=>'Ocircumflex',213=>'Otilde',214=>'Odieresis',215=>'multiply',216=>'Oslash',217=>'Ugrave',218=>'Uacute',219=>'Ucircumflex',220=>'Udieresis',221=>'Idotaccent',222=>'Scedilla',223=>'germandbls',224=>'agrave',225=>'aacute',226=>'acircumflex',227=>'atilde',228=>'adieresis',229=>'aring',230=>'ae',231=>'ccedilla',232=>'egrave',233=>'eacute',234=>'ecircumflex',235=>'edieresis',236=>'igrave',237=>'iacute',238=>'icircumflex',239=>'idieresis',240=>'gbreve',241=>'ntilde',242=>'ograve',243=>'oacute',244=>'ocircumflex',245=>'otilde',246=>'odieresis',247=>'divide',248=>'oslash',249=>'ugrave',250=>'uacute',251=>'ucircumflex',252=>'udieresis',253=>'dotlessi',254=>'scedilla',255=>'ydieresis'),
18386
18387// encoding map for: cp1255
18388'cp1255' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'Euro',129=>'.notdef',130=>'quotesinglbase',131=>'florin',132=>'quotedblbase',133=>'ellipsis',134=>'dagger',135=>'daggerdbl',136=>'circumflex',137=>'perthousand',138=>'.notdef',139=>'guilsinglleft',140=>'.notdef',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'quoteleft',146=>'quoteright',147=>'quotedblleft',148=>'quotedblright',149=>'bullet',150=>'endash',151=>'emdash',152=>'tilde',153=>'trademark',154=>'.notdef',155=>'guilsinglright',156=>'.notdef',157=>'.notdef',158=>'.notdef',159=>'.notdef',160=>'space',161=>'exclamdown',162=>'cent',163=>'sterling',164=>'afii57636',165=>'yen',166=>'brokenbar',167=>'section',168=>'dieresis',169=>'copyright',170=>'multiply',171=>'guillemotleft',172=>'logicalnot',173=>'sfthyphen',174=>'registered',175=>'macron',176=>'degree',177=>'plusminus',178=>'twosuperior',179=>'threesuperior',180=>'acute',181=>'mu',182=>'paragraph',183=>'middot',184=>'cedilla',185=>'onesuperior',186=>'divide',187=>'guillemotright',188=>'onequarter',189=>'onehalf',190=>'threequarters',191=>'questiondown',192=>'afii57799',193=>'afii57801',194=>'afii57800',195=>'afii57802',196=>'afii57793',197=>'afii57794',198=>'afii57795',199=>'afii57798',200=>'afii57797',201=>'afii57806',202=>'.notdef',203=>'afii57796',204=>'afii57807',205=>'afii57839',206=>'afii57645',207=>'afii57841',208=>'afii57842',209=>'afii57804',210=>'afii57803',211=>'afii57658',212=>'afii57716',213=>'afii57717',214=>'afii57718',215=>'gereshhebrew',216=>'gershayimhebrew',217=>'.notdef',218=>'.notdef',219=>'.notdef',220=>'.notdef',221=>'.notdef',222=>'.notdef',223=>'.notdef',224=>'afii57664',225=>'afii57665',226=>'afii57666',227=>'afii57667',228=>'afii57668',229=>'afii57669',230=>'afii57670',231=>'afii57671',232=>'afii57672',233=>'afii57673',234=>'afii57674',235=>'afii57675',236=>'afii57676',237=>'afii57677',238=>'afii57678',239=>'afii57679',240=>'afii57680',241=>'afii57681',242=>'afii57682',243=>'afii57683',244=>'afii57684',245=>'afii57685',246=>'afii57686',247=>'afii57687',248=>'afii57688',249=>'afii57689',250=>'afii57690',251=>'.notdef',252=>'.notdef',253=>'afii299',254=>'afii300',255=>'.notdef'),
18389
18390// encoding map for: cp1256
18391'cp1256' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'Euro',129=>'afii57506',130=>'quotesinglbase',131=>'florin',132=>'quotedblbase',133=>'ellipsis',134=>'dagger',135=>'daggerdbl',136=>'circumflex',137=>'perthousand',138=>'afii57511',139=>'guilsinglleft',140=>'OE',141=>'afii57507',142=>'afii57508',143=>'afii57512',144=>'afii57509',145=>'quoteleft',146=>'quoteright',147=>'quotedblleft',148=>'quotedblright',149=>'bullet',150=>'endash',151=>'emdash',152=>'.notdef',153=>'trademark',154=>'afii57513',155=>'guilsinglright',156=>'oe',157=>'afii61664',158=>'afii301',159=>'afii57514',160=>'space',161=>'afii57388',162=>'cent',163=>'sterling',164=>'currency',165=>'yen',166=>'brokenbar',167=>'section',168=>'dieresis',169=>'copyright',170=>'.notdef',171=>'guillemotleft',172=>'logicalnot',173=>'hyphen',174=>'registered',175=>'macron',176=>'degree',177=>'plusminus',178=>'twosuperior',179=>'threesuperior',180=>'acute',181=>'mu',182=>'paragraph',183=>'periodcentered',184=>'cedilla',185=>'onesuperior',186=>'afii57403',187=>'guillemotright',188=>'onequarter',189=>'onehalf',190=>'threequarters',191=>'afii57407',192=>'.notdef',193=>'afii57409',194=>'afii57410',195=>'afii57411',196=>'afii57412',197=>'afii57413',198=>'afii57414',199=>'afii57415',200=>'afii57416',201=>'afii57417',202=>'afii57418',203=>'afii57419',204=>'afii57420',205=>'afii57421',206=>'afii57422',207=>'afii57423',208=>'afii57424',209=>'afii57425',210=>'afii57426',211=>'afii57427',212=>'afii57428',213=>'afii57429',214=>'afii57430',215=>'multiply',216=>'afii57431',217=>'afii57432',218=>'afii57433',219=>'afii57434',220=>'afii57440',221=>'afii57441',222=>'afii57442',223=>'afii57443',224=>'agrave',225=>'afii57444',226=>'acircumflex',227=>'afii57445',228=>'afii57446',229=>'afii57470',230=>'afii57448',231=>'ccedilla',232=>'egrave',233=>'eacute',234=>'ecircumflex',235=>'edieresis',236=>'afii57449',237=>'afii57450',238=>'icircumflex',239=>'idieresis',240=>'afii57451',241=>'afii57452',242=>'afii57453',243=>'afii57454',244=>'ocircumflex',245=>'afii57455',246=>'afii57456',247=>'divide',248=>'afii57457',249=>'ugrave',250=>'afii57458',251=>'ucircumflex',252=>'udieresis',253=>'afii299',254=>'afii300',255=>'afii57519'),
18392
18393// encoding map for: cp1257
18394'cp1257' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'Euro',129=>'.notdef',130=>'quotesinglbase',131=>'.notdef',132=>'quotedblbase',133=>'ellipsis',134=>'dagger',135=>'daggerdbl',136=>'.notdef',137=>'perthousand',138=>'.notdef',139=>'guilsinglleft',140=>'.notdef',141=>'dieresis',142=>'caron',143=>'cedilla',144=>'.notdef',145=>'quoteleft',146=>'quoteright',147=>'quotedblleft',148=>'quotedblright',149=>'bullet',150=>'endash',151=>'emdash',152=>'.notdef',153=>'trademark',154=>'.notdef',155=>'guilsinglright',156=>'.notdef',157=>'macron',158=>'ogonek',159=>'.notdef',160=>'space',161=>'.notdef',162=>'cent',163=>'sterling',164=>'currency',165=>'.notdef',166=>'brokenbar',167=>'section',168=>'Oslash',169=>'copyright',170=>'Rcommaaccent',171=>'guillemotleft',172=>'logicalnot',173=>'hyphen',174=>'registered',175=>'AE',176=>'degree',177=>'plusminus',178=>'twosuperior',179=>'threesuperior',180=>'acute',181=>'mu',182=>'paragraph',183=>'periodcentered',184=>'oslash',185=>'onesuperior',186=>'rcommaaccent',187=>'guillemotright',188=>'onequarter',189=>'onehalf',190=>'threequarters',191=>'ae',192=>'Aogonek',193=>'Iogonek',194=>'Amacron',195=>'Cacute',196=>'Adieresis',197=>'Aring',198=>'Eogonek',199=>'Emacron',200=>'Ccaron',201=>'Eacute',202=>'Zacute',203=>'Edotaccent',204=>'Gcommaaccent',205=>'Kcommaaccent',206=>'Imacron',207=>'Lcommaaccent',208=>'Scaron',209=>'Nacute',210=>'Ncommaaccent',211=>'Oacute',212=>'Omacron',213=>'Otilde',214=>'Odieresis',215=>'multiply',216=>'Uogonek',217=>'Lslash',218=>'Sacute',219=>'Umacron',220=>'Udieresis',221=>'Zdotaccent',222=>'Zcaron',223=>'germandbls',224=>'aogonek',225=>'iogonek',226=>'amacron',227=>'cacute',228=>'adieresis',229=>'aring',230=>'eogonek',231=>'emacron',232=>'ccaron',233=>'eacute',234=>'zacute',235=>'edotaccent',236=>'gcommaaccent',237=>'kcommaaccent',238=>'imacron',239=>'lcommaaccent',240=>'scaron',241=>'nacute',242=>'ncommaaccent',243=>'oacute',244=>'omacron',245=>'otilde',246=>'odieresis',247=>'divide',248=>'uogonek',249=>'lslash',250=>'sacute',251=>'umacron',252=>'udieresis',253=>'zdotaccent',254=>'zcaron',255=>'dotaccent'),
18395
18396// encoding map for: cp1258
18397'cp1258' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'Euro',129=>'.notdef',130=>'quotesinglbase',131=>'florin',132=>'quotedblbase',133=>'ellipsis',134=>'dagger',135=>'daggerdbl',136=>'circumflex',137=>'perthousand',138=>'.notdef',139=>'guilsinglleft',140=>'OE',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'quoteleft',146=>'quoteright',147=>'quotedblleft',148=>'quotedblright',149=>'bullet',150=>'endash',151=>'emdash',152=>'tilde',153=>'trademark',154=>'.notdef',155=>'guilsinglright',156=>'oe',157=>'.notdef',158=>'.notdef',159=>'Ydieresis',160=>'space',161=>'exclamdown',162=>'cent',163=>'sterling',164=>'currency',165=>'yen',166=>'brokenbar',167=>'section',168=>'dieresis',169=>'copyright',170=>'ordfeminine',171=>'guillemotleft',172=>'logicalnot',173=>'hyphen',174=>'registered',175=>'macron',176=>'degree',177=>'plusminus',178=>'twosuperior',179=>'threesuperior',180=>'acute',181=>'mu',182=>'paragraph',183=>'periodcentered',184=>'cedilla',185=>'onesuperior',186=>'ordmasculine',187=>'guillemotright',188=>'onequarter',189=>'onehalf',190=>'threequarters',191=>'questiondown',192=>'Agrave',193=>'Aacute',194=>'Acircumflex',195=>'Abreve',196=>'Adieresis',197=>'Aring',198=>'AE',199=>'Ccedilla',200=>'Egrave',201=>'Eacute',202=>'Ecircumflex',203=>'Edieresis',204=>'gravecomb',205=>'Iacute',206=>'Icircumflex',207=>'Idieresis',208=>'Dcroat',209=>'Ntilde',210=>'hookabovecomb',211=>'Oacute',212=>'Ocircumflex',213=>'Ohorn',214=>'Odieresis',215=>'multiply',216=>'Oslash',217=>'Ugrave',218=>'Uacute',219=>'Ucircumflex',220=>'Udieresis',221=>'Uhorn',222=>'tildecomb',223=>'germandbls',224=>'agrave',225=>'aacute',226=>'acircumflex',227=>'abreve',228=>'adieresis',229=>'aring',230=>'ae',231=>'ccedilla',232=>'egrave',233=>'eacute',234=>'ecircumflex',235=>'edieresis',236=>'acutecomb',237=>'iacute',238=>'icircumflex',239=>'idieresis',240=>'dcroat',241=>'ntilde',242=>'dotbelowcomb',243=>'oacute',244=>'ocircumflex',245=>'ohorn',246=>'odieresis',247=>'divide',248=>'oslash',249=>'ugrave',250=>'uacute',251=>'ucircumflex',252=>'udieresis',253=>'uhorn',254=>'dong',255=>'ydieresis'),
18398
18399// encoding map for: iso-8859-1
18400'iso-8859-1' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'.notdef',129=>'.notdef',130=>'.notdef',131=>'.notdef',132=>'.notdef',133=>'.notdef',134=>'.notdef',135=>'.notdef',136=>'.notdef',137=>'.notdef',138=>'.notdef',139=>'.notdef',140=>'.notdef',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'.notdef',146=>'.notdef',147=>'.notdef',148=>'.notdef',149=>'.notdef',150=>'.notdef',151=>'.notdef',152=>'.notdef',153=>'.notdef',154=>'.notdef',155=>'.notdef',156=>'.notdef',157=>'.notdef',158=>'.notdef',159=>'.notdef',160=>'space',161=>'exclamdown',162=>'cent',163=>'sterling',164=>'currency',165=>'yen',166=>'brokenbar',167=>'section',168=>'dieresis',169=>'copyright',170=>'ordfeminine',171=>'guillemotleft',172=>'logicalnot',173=>'hyphen',174=>'registered',175=>'macron',176=>'degree',177=>'plusminus',178=>'twosuperior',179=>'threesuperior',180=>'acute',181=>'mu',182=>'paragraph',183=>'periodcentered',184=>'cedilla',185=>'onesuperior',186=>'ordmasculine',187=>'guillemotright',188=>'onequarter',189=>'onehalf',190=>'threequarters',191=>'questiondown',192=>'Agrave',193=>'Aacute',194=>'Acircumflex',195=>'Atilde',196=>'Adieresis',197=>'Aring',198=>'AE',199=>'Ccedilla',200=>'Egrave',201=>'Eacute',202=>'Ecircumflex',203=>'Edieresis',204=>'Igrave',205=>'Iacute',206=>'Icircumflex',207=>'Idieresis',208=>'Eth',209=>'Ntilde',210=>'Ograve',211=>'Oacute',212=>'Ocircumflex',213=>'Otilde',214=>'Odieresis',215=>'multiply',216=>'Oslash',217=>'Ugrave',218=>'Uacute',219=>'Ucircumflex',220=>'Udieresis',221=>'Yacute',222=>'Thorn',223=>'germandbls',224=>'agrave',225=>'aacute',226=>'acircumflex',227=>'atilde',228=>'adieresis',229=>'aring',230=>'ae',231=>'ccedilla',232=>'egrave',233=>'eacute',234=>'ecircumflex',235=>'edieresis',236=>'igrave',237=>'iacute',238=>'icircumflex',239=>'idieresis',240=>'eth',241=>'ntilde',242=>'ograve',243=>'oacute',244=>'ocircumflex',245=>'otilde',246=>'odieresis',247=>'divide',248=>'oslash',249=>'ugrave',250=>'uacute',251=>'ucircumflex',252=>'udieresis',253=>'yacute',254=>'thorn',255=>'ydieresis'),
18401
18402// encoding map for: iso-8859-2
18403'iso-8859-2' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'.notdef',129=>'.notdef',130=>'.notdef',131=>'.notdef',132=>'.notdef',133=>'.notdef',134=>'.notdef',135=>'.notdef',136=>'.notdef',137=>'.notdef',138=>'.notdef',139=>'.notdef',140=>'.notdef',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'.notdef',146=>'.notdef',147=>'.notdef',148=>'.notdef',149=>'.notdef',150=>'.notdef',151=>'.notdef',152=>'.notdef',153=>'.notdef',154=>'.notdef',155=>'.notdef',156=>'.notdef',157=>'.notdef',158=>'.notdef',159=>'.notdef',160=>'space',161=>'Aogonek',162=>'breve',163=>'Lslash',164=>'currency',165=>'Lcaron',166=>'Sacute',167=>'section',168=>'dieresis',169=>'Scaron',170=>'Scedilla',171=>'Tcaron',172=>'Zacute',173=>'hyphen',174=>'Zcaron',175=>'Zdotaccent',176=>'degree',177=>'aogonek',178=>'ogonek',179=>'lslash',180=>'acute',181=>'lcaron',182=>'sacute',183=>'caron',184=>'cedilla',185=>'scaron',186=>'scedilla',187=>'tcaron',188=>'zacute',189=>'hungarumlaut',190=>'zcaron',191=>'zdotaccent',192=>'Racute',193=>'Aacute',194=>'Acircumflex',195=>'Abreve',196=>'Adieresis',197=>'Lacute',198=>'Cacute',199=>'Ccedilla',200=>'Ccaron',201=>'Eacute',202=>'Eogonek',203=>'Edieresis',204=>'Ecaron',205=>'Iacute',206=>'Icircumflex',207=>'Dcaron',208=>'Dcroat',209=>'Nacute',210=>'Ncaron',211=>'Oacute',212=>'Ocircumflex',213=>'Ohungarumlaut',214=>'Odieresis',215=>'multiply',216=>'Rcaron',217=>'Uring',218=>'Uacute',219=>'Uhungarumlaut',220=>'Udieresis',221=>'Yacute',222=>'Tcommaaccent',223=>'germandbls',224=>'racute',225=>'aacute',226=>'acircumflex',227=>'abreve',228=>'adieresis',229=>'lacute',230=>'cacute',231=>'ccedilla',232=>'ccaron',233=>'eacute',234=>'eogonek',235=>'edieresis',236=>'ecaron',237=>'iacute',238=>'icircumflex',239=>'dcaron',240=>'dcroat',241=>'nacute',242=>'ncaron',243=>'oacute',244=>'ocircumflex',245=>'ohungarumlaut',246=>'odieresis',247=>'divide',248=>'rcaron',249=>'uring',250=>'uacute',251=>'uhungarumlaut',252=>'udieresis',253=>'yacute',254=>'tcommaaccent',255=>'dotaccent'),
18404
18405// encoding map for: iso-8859-4
18406'iso-8859-4' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'.notdef',129=>'.notdef',130=>'.notdef',131=>'.notdef',132=>'.notdef',133=>'.notdef',134=>'.notdef',135=>'.notdef',136=>'.notdef',137=>'.notdef',138=>'.notdef',139=>'.notdef',140=>'.notdef',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'.notdef',146=>'.notdef',147=>'.notdef',148=>'.notdef',149=>'.notdef',150=>'.notdef',151=>'.notdef',152=>'.notdef',153=>'.notdef',154=>'.notdef',155=>'.notdef',156=>'.notdef',157=>'.notdef',158=>'.notdef',159=>'.notdef',160=>'space',161=>'Aogonek',162=>'kgreenlandic',163=>'Rcommaaccent',164=>'currency',165=>'Itilde',166=>'Lcommaaccent',167=>'section',168=>'dieresis',169=>'Scaron',170=>'Emacron',171=>'Gcommaaccent',172=>'Tbar',173=>'hyphen',174=>'Zcaron',175=>'macron',176=>'degree',177=>'aogonek',178=>'ogonek',179=>'rcommaaccent',180=>'acute',181=>'itilde',182=>'lcommaaccent',183=>'caron',184=>'cedilla',185=>'scaron',186=>'emacron',187=>'gcommaaccent',188=>'tbar',189=>'Eng',190=>'zcaron',191=>'eng',192=>'Amacron',193=>'Aacute',194=>'Acircumflex',195=>'Atilde',196=>'Adieresis',197=>'Aring',198=>'AE',199=>'Iogonek',200=>'Ccaron',201=>'Eacute',202=>'Eogonek',203=>'Edieresis',204=>'Edotaccent',205=>'Iacute',206=>'Icircumflex',207=>'Imacron',208=>'Dcroat',209=>'Ncommaaccent',210=>'Omacron',211=>'Kcommaaccent',212=>'Ocircumflex',213=>'Otilde',214=>'Odieresis',215=>'multiply',216=>'Oslash',217=>'Uogonek',218=>'Uacute',219=>'Ucircumflex',220=>'Udieresis',221=>'Utilde',222=>'Umacron',223=>'germandbls',224=>'amacron',225=>'aacute',226=>'acircumflex',227=>'atilde',228=>'adieresis',229=>'aring',230=>'ae',231=>'iogonek',232=>'ccaron',233=>'eacute',234=>'eogonek',235=>'edieresis',236=>'edotaccent',237=>'iacute',238=>'icircumflex',239=>'imacron',240=>'dcroat',241=>'ncommaaccent',242=>'omacron',243=>'kcommaaccent',244=>'ocircumflex',245=>'otilde',246=>'odieresis',247=>'divide',248=>'oslash',249=>'uogonek',250=>'uacute',251=>'ucircumflex',252=>'udieresis',253=>'utilde',254=>'umacron',255=>'dotaccent'),
18407
18408// encoding map for: iso-8859-5
18409'iso-8859-5' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'.notdef',129=>'.notdef',130=>'.notdef',131=>'.notdef',132=>'.notdef',133=>'.notdef',134=>'.notdef',135=>'.notdef',136=>'.notdef',137=>'.notdef',138=>'.notdef',139=>'.notdef',140=>'.notdef',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'.notdef',146=>'.notdef',147=>'.notdef',148=>'.notdef',149=>'.notdef',150=>'.notdef',151=>'.notdef',152=>'.notdef',153=>'.notdef',154=>'.notdef',155=>'.notdef',156=>'.notdef',157=>'.notdef',158=>'.notdef',159=>'.notdef',160=>'space',161=>'afii10023',162=>'afii10051',163=>'afii10052',164=>'afii10053',165=>'afii10054',166=>'afii10055',167=>'afii10056',168=>'afii10057',169=>'afii10058',170=>'afii10059',171=>'afii10060',172=>'afii10061',173=>'hyphen',174=>'afii10062',175=>'afii10145',176=>'afii10017',177=>'afii10018',178=>'afii10019',179=>'afii10020',180=>'afii10021',181=>'afii10022',182=>'afii10024',183=>'afii10025',184=>'afii10026',185=>'afii10027',186=>'afii10028',187=>'afii10029',188=>'afii10030',189=>'afii10031',190=>'afii10032',191=>'afii10033',192=>'afii10034',193=>'afii10035',194=>'afii10036',195=>'afii10037',196=>'afii10038',197=>'afii10039',198=>'afii10040',199=>'afii10041',200=>'afii10042',201=>'afii10043',202=>'afii10044',203=>'afii10045',204=>'afii10046',205=>'afii10047',206=>'afii10048',207=>'afii10049',208=>'afii10065',209=>'afii10066',210=>'afii10067',211=>'afii10068',212=>'afii10069',213=>'afii10070',214=>'afii10072',215=>'afii10073',216=>'afii10074',217=>'afii10075',218=>'afii10076',219=>'afii10077',220=>'afii10078',221=>'afii10079',222=>'afii10080',223=>'afii10081',224=>'afii10082',225=>'afii10083',226=>'afii10084',227=>'afii10085',228=>'afii10086',229=>'afii10087',230=>'afii10088',231=>'afii10089',232=>'afii10090',233=>'afii10091',234=>'afii10092',235=>'afii10093',236=>'afii10094',237=>'afii10095',238=>'afii10096',239=>'afii10097',240=>'afii61352',241=>'afii10071',242=>'afii10099',243=>'afii10100',244=>'afii10101',245=>'afii10102',246=>'afii10103',247=>'afii10104',248=>'afii10105',249=>'afii10106',250=>'afii10107',251=>'afii10108',252=>'afii10109',253=>'section',254=>'afii10110',255=>'afii10193'),
18410
18411// encoding map for: iso-8859-7
18412'iso-8859-7' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'.notdef',129=>'.notdef',130=>'.notdef',131=>'.notdef',132=>'.notdef',133=>'.notdef',134=>'.notdef',135=>'.notdef',136=>'.notdef',137=>'.notdef',138=>'.notdef',139=>'.notdef',140=>'.notdef',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'.notdef',146=>'.notdef',147=>'.notdef',148=>'.notdef',149=>'.notdef',150=>'.notdef',151=>'.notdef',152=>'.notdef',153=>'.notdef',154=>'.notdef',155=>'.notdef',156=>'.notdef',157=>'.notdef',158=>'.notdef',159=>'.notdef',160=>'space',161=>'quoteleft',162=>'quoteright',163=>'sterling',164=>'.notdef',165=>'.notdef',166=>'brokenbar',167=>'section',168=>'dieresis',169=>'copyright',170=>'.notdef',171=>'guillemotleft',172=>'logicalnot',173=>'hyphen',174=>'.notdef',175=>'afii00208',176=>'degree',177=>'plusminus',178=>'twosuperior',179=>'threesuperior',180=>'tonos',181=>'dieresistonos',182=>'Alphatonos',183=>'periodcentered',184=>'Epsilontonos',185=>'Etatonos',186=>'Iotatonos',187=>'guillemotright',188=>'Omicrontonos',189=>'onehalf',190=>'Upsilontonos',191=>'Omegatonos',192=>'iotadieresistonos',193=>'Alpha',194=>'Beta',195=>'Gamma',196=>'Delta',197=>'Epsilon',198=>'Zeta',199=>'Eta',200=>'Theta',201=>'Iota',202=>'Kappa',203=>'Lambda',204=>'Mu',205=>'Nu',206=>'Xi',207=>'Omicron',208=>'Pi',209=>'Rho',210=>'.notdef',211=>'Sigma',212=>'Tau',213=>'Upsilon',214=>'Phi',215=>'Chi',216=>'Psi',217=>'Omega',218=>'Iotadieresis',219=>'Upsilondieresis',220=>'alphatonos',221=>'epsilontonos',222=>'etatonos',223=>'iotatonos',224=>'upsilondieresistonos',225=>'alpha',226=>'beta',227=>'gamma',228=>'delta',229=>'epsilon',230=>'zeta',231=>'eta',232=>'theta',233=>'iota',234=>'kappa',235=>'lambda',236=>'mu',237=>'nu',238=>'xi',239=>'omicron',240=>'pi',241=>'rho',242=>'sigma1',243=>'sigma',244=>'tau',245=>'upsilon',246=>'phi',247=>'chi',248=>'psi',249=>'omega',250=>'iotadieresis',251=>'upsilondieresis',252=>'omicrontonos',253=>'upsilontonos',254=>'omegatonos',255=>'.notdef'),
18413
18414// encoding map for: iso-8859-9
18415'iso-8859-9' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'.notdef',129=>'.notdef',130=>'.notdef',131=>'.notdef',132=>'.notdef',133=>'.notdef',134=>'.notdef',135=>'.notdef',136=>'.notdef',137=>'.notdef',138=>'.notdef',139=>'.notdef',140=>'.notdef',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'.notdef',146=>'.notdef',147=>'.notdef',148=>'.notdef',149=>'.notdef',150=>'.notdef',151=>'.notdef',152=>'.notdef',153=>'.notdef',154=>'.notdef',155=>'.notdef',156=>'.notdef',157=>'.notdef',158=>'.notdef',159=>'.notdef',160=>'space',161=>'exclamdown',162=>'cent',163=>'sterling',164=>'currency',165=>'yen',166=>'brokenbar',167=>'section',168=>'dieresis',169=>'copyright',170=>'ordfeminine',171=>'guillemotleft',172=>'logicalnot',173=>'hyphen',174=>'registered',175=>'macron',176=>'degree',177=>'plusminus',178=>'twosuperior',179=>'threesuperior',180=>'acute',181=>'mu',182=>'paragraph',183=>'periodcentered',184=>'cedilla',185=>'onesuperior',186=>'ordmasculine',187=>'guillemotright',188=>'onequarter',189=>'onehalf',190=>'threequarters',191=>'questiondown',192=>'Agrave',193=>'Aacute',194=>'Acircumflex',195=>'Atilde',196=>'Adieresis',197=>'Aring',198=>'AE',199=>'Ccedilla',200=>'Egrave',201=>'Eacute',202=>'Ecircumflex',203=>'Edieresis',204=>'Igrave',205=>'Iacute',206=>'Icircumflex',207=>'Idieresis',208=>'Gbreve',209=>'Ntilde',210=>'Ograve',211=>'Oacute',212=>'Ocircumflex',213=>'Otilde',214=>'Odieresis',215=>'multiply',216=>'Oslash',217=>'Ugrave',218=>'Uacute',219=>'Ucircumflex',220=>'Udieresis',221=>'Idotaccent',222=>'Scedilla',223=>'germandbls',224=>'agrave',225=>'aacute',226=>'acircumflex',227=>'atilde',228=>'adieresis',229=>'aring',230=>'ae',231=>'ccedilla',232=>'egrave',233=>'eacute',234=>'ecircumflex',235=>'edieresis',236=>'igrave',237=>'iacute',238=>'icircumflex',239=>'idieresis',240=>'gbreve',241=>'ntilde',242=>'ograve',243=>'oacute',244=>'ocircumflex',245=>'otilde',246=>'odieresis',247=>'divide',248=>'oslash',249=>'ugrave',250=>'uacute',251=>'ucircumflex',252=>'udieresis',253=>'dotlessi',254=>'scedilla',255=>'ydieresis'),
18416
18417// encoding map for: iso-8859-11
18418'iso-8859-11' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'.notdef',129=>'.notdef',130=>'.notdef',131=>'.notdef',132=>'.notdef',133=>'.notdef',134=>'.notdef',135=>'.notdef',136=>'.notdef',137=>'.notdef',138=>'.notdef',139=>'.notdef',140=>'.notdef',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'.notdef',146=>'.notdef',147=>'.notdef',148=>'.notdef',149=>'.notdef',150=>'.notdef',151=>'.notdef',152=>'.notdef',153=>'.notdef',154=>'.notdef',155=>'.notdef',156=>'.notdef',157=>'.notdef',158=>'.notdef',159=>'.notdef',160=>'space',161=>'kokaithai',162=>'khokhaithai',163=>'khokhuatthai',164=>'khokhwaithai',165=>'khokhonthai',166=>'khorakhangthai',167=>'ngonguthai',168=>'chochanthai',169=>'chochingthai',170=>'chochangthai',171=>'sosothai',172=>'chochoethai',173=>'yoyingthai',174=>'dochadathai',175=>'topatakthai',176=>'thothanthai',177=>'thonangmonthothai',178=>'thophuthaothai',179=>'nonenthai',180=>'dodekthai',181=>'totaothai',182=>'thothungthai',183=>'thothahanthai',184=>'thothongthai',185=>'nonuthai',186=>'bobaimaithai',187=>'poplathai',188=>'phophungthai',189=>'fofathai',190=>'phophanthai',191=>'fofanthai',192=>'phosamphaothai',193=>'momathai',194=>'yoyakthai',195=>'roruathai',196=>'ruthai',197=>'lolingthai',198=>'luthai',199=>'wowaenthai',200=>'sosalathai',201=>'sorusithai',202=>'sosuathai',203=>'hohipthai',204=>'lochulathai',205=>'oangthai',206=>'honokhukthai',207=>'paiyannoithai',208=>'saraathai',209=>'maihanakatthai',210=>'saraaathai',211=>'saraamthai',212=>'saraithai',213=>'saraiithai',214=>'sarauethai',215=>'saraueethai',216=>'sarauthai',217=>'sarauuthai',218=>'phinthuthai',219=>'.notdef',220=>'.notdef',221=>'.notdef',222=>'.notdef',223=>'bahtthai',224=>'saraethai',225=>'saraaethai',226=>'saraothai',227=>'saraaimaimuanthai',228=>'saraaimaimalaithai',229=>'lakkhangyaothai',230=>'maiyamokthai',231=>'maitaikhuthai',232=>'maiekthai',233=>'maithothai',234=>'maitrithai',235=>'maichattawathai',236=>'thanthakhatthai',237=>'nikhahitthai',238=>'yamakkanthai',239=>'fongmanthai',240=>'zerothai',241=>'onethai',242=>'twothai',243=>'threethai',244=>'fourthai',245=>'fivethai',246=>'sixthai',247=>'seventhai',248=>'eightthai',249=>'ninethai',250=>'angkhankhuthai',251=>'khomutthai',252=>'.notdef',253=>'.notdef',254=>'.notdef',255=>'.notdef'),
18419
18420// encoding map for: iso-8859-15
18421'iso-8859-15' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'.notdef',129=>'.notdef',130=>'.notdef',131=>'.notdef',132=>'.notdef',133=>'.notdef',134=>'.notdef',135=>'.notdef',136=>'.notdef',137=>'.notdef',138=>'.notdef',139=>'.notdef',140=>'.notdef',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'.notdef',146=>'.notdef',147=>'.notdef',148=>'.notdef',149=>'.notdef',150=>'.notdef',151=>'.notdef',152=>'.notdef',153=>'.notdef',154=>'.notdef',155=>'.notdef',156=>'.notdef',157=>'.notdef',158=>'.notdef',159=>'.notdef',160=>'space',161=>'exclamdown',162=>'cent',163=>'sterling',164=>'Euro',165=>'yen',166=>'Scaron',167=>'section',168=>'scaron',169=>'copyright',170=>'ordfeminine',171=>'guillemotleft',172=>'logicalnot',173=>'hyphen',174=>'registered',175=>'macron',176=>'degree',177=>'plusminus',178=>'twosuperior',179=>'threesuperior',180=>'Zcaron',181=>'mu',182=>'paragraph',183=>'periodcentered',184=>'zcaron',185=>'onesuperior',186=>'ordmasculine',187=>'guillemotright',188=>'OE',189=>'oe',190=>'Ydieresis',191=>'questiondown',192=>'Agrave',193=>'Aacute',194=>'Acircumflex',195=>'Atilde',196=>'Adieresis',197=>'Aring',198=>'AE',199=>'Ccedilla',200=>'Egrave',201=>'Eacute',202=>'Ecircumflex',203=>'Edieresis',204=>'Igrave',205=>'Iacute',206=>'Icircumflex',207=>'Idieresis',208=>'Eth',209=>'Ntilde',210=>'Ograve',211=>'Oacute',212=>'Ocircumflex',213=>'Otilde',214=>'Odieresis',215=>'multiply',216=>'Oslash',217=>'Ugrave',218=>'Uacute',219=>'Ucircumflex',220=>'Udieresis',221=>'Yacute',222=>'Thorn',223=>'germandbls',224=>'agrave',225=>'aacute',226=>'acircumflex',227=>'atilde',228=>'adieresis',229=>'aring',230=>'ae',231=>'ccedilla',232=>'egrave',233=>'eacute',234=>'ecircumflex',235=>'edieresis',236=>'igrave',237=>'iacute',238=>'icircumflex',239=>'idieresis',240=>'eth',241=>'ntilde',242=>'ograve',243=>'oacute',244=>'ocircumflex',245=>'otilde',246=>'odieresis',247=>'divide',248=>'oslash',249=>'ugrave',250=>'uacute',251=>'ucircumflex',252=>'udieresis',253=>'yacute',254=>'thorn',255=>'ydieresis'),
18422
18423// encoding map for: iso-8859-16
18424'iso-8859-16' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'.notdef',129=>'.notdef',130=>'.notdef',131=>'.notdef',132=>'.notdef',133=>'.notdef',134=>'.notdef',135=>'.notdef',136=>'.notdef',137=>'.notdef',138=>'.notdef',139=>'.notdef',140=>'.notdef',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'.notdef',146=>'.notdef',147=>'.notdef',148=>'.notdef',149=>'.notdef',150=>'.notdef',151=>'.notdef',152=>'.notdef',153=>'.notdef',154=>'.notdef',155=>'.notdef',156=>'.notdef',157=>'.notdef',158=>'.notdef',159=>'.notdef',160=>'space',161=>'Aogonek',162=>'aogonek',163=>'Lslash',164=>'Euro',165=>'quotedblbase',166=>'Scaron',167=>'section',168=>'scaron',169=>'copyright',170=>'Scommaaccent',171=>'guillemotleft',172=>'Zacute',173=>'hyphen',174=>'zacute',175=>'Zdotaccent',176=>'degree',177=>'plusminus',178=>'Ccaron',179=>'lslash',180=>'Zcaron',181=>'quotedblright',182=>'paragraph',183=>'periodcentered',184=>'zcaron',185=>'ccaron',186=>'scommaaccent',187=>'guillemotright',188=>'OE',189=>'oe',190=>'Ydieresis',191=>'zdotaccent',192=>'Agrave',193=>'Aacute',194=>'Acircumflex',195=>'Abreve',196=>'Adieresis',197=>'Cacute',198=>'AE',199=>'Ccedilla',200=>'Egrave',201=>'Eacute',202=>'Ecircumflex',203=>'Edieresis',204=>'Igrave',205=>'Iacute',206=>'Icircumflex',207=>'Idieresis',208=>'Dcroat',209=>'Nacute',210=>'Ograve',211=>'Oacute',212=>'Ocircumflex',213=>'Ohungarumlaut',214=>'Odieresis',215=>'Sacute',216=>'Uhungarumlaut',217=>'Ugrave',218=>'Uacute',219=>'Ucircumflex',220=>'Udieresis',221=>'Eogonek',222=>'Tcommaaccent',223=>'germandbls',224=>'agrave',225=>'aacute',226=>'acircumflex',227=>'abreve',228=>'adieresis',229=>'cacute',230=>'ae',231=>'ccedilla',232=>'egrave',233=>'eacute',234=>'ecircumflex',235=>'edieresis',236=>'igrave',237=>'iacute',238=>'icircumflex',239=>'idieresis',240=>'dcroat',241=>'nacute',242=>'ograve',243=>'oacute',244=>'ocircumflex',245=>'ohungarumlaut',246=>'odieresis',247=>'sacute',248=>'uhungarumlaut',249=>'ugrave',250=>'uacute',251=>'ucircumflex',252=>'udieresis',253=>'eogonek',254=>'tcommaaccent',255=>'ydieresis'),
18425
18426// encoding map for: koi8-r
18427'koi8-r' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'SF100000',129=>'SF110000',130=>'SF010000',131=>'SF030000',132=>'SF020000',133=>'SF040000',134=>'SF080000',135=>'SF090000',136=>'SF060000',137=>'SF070000',138=>'SF050000',139=>'upblock',140=>'dnblock',141=>'block',142=>'lfblock',143=>'rtblock',144=>'ltshade',145=>'shade',146=>'dkshade',147=>'integraltp',148=>'filledbox',149=>'periodcentered',150=>'radical',151=>'approxequal',152=>'lessequal',153=>'greaterequal',154=>'space',155=>'integralbt',156=>'degree',157=>'twosuperior',158=>'periodcentered',159=>'divide',160=>'SF430000',161=>'SF240000',162=>'SF510000',163=>'afii10071',164=>'SF520000',165=>'SF390000',166=>'SF220000',167=>'SF210000',168=>'SF250000',169=>'SF500000',170=>'SF490000',171=>'SF380000',172=>'SF280000',173=>'SF270000',174=>'SF260000',175=>'SF360000',176=>'SF370000',177=>'SF420000',178=>'SF190000',179=>'afii10023',180=>'SF200000',181=>'SF230000',182=>'SF470000',183=>'SF480000',184=>'SF410000',185=>'SF450000',186=>'SF460000',187=>'SF400000',188=>'SF540000',189=>'SF530000',190=>'SF440000',191=>'copyright',192=>'afii10096',193=>'afii10065',194=>'afii10066',195=>'afii10088',196=>'afii10069',197=>'afii10070',198=>'afii10086',199=>'afii10068',200=>'afii10087',201=>'afii10074',202=>'afii10075',203=>'afii10076',204=>'afii10077',205=>'afii10078',206=>'afii10079',207=>'afii10080',208=>'afii10081',209=>'afii10097',210=>'afii10082',211=>'afii10083',212=>'afii10084',213=>'afii10085',214=>'afii10072',215=>'afii10067',216=>'afii10094',217=>'afii10093',218=>'afii10073',219=>'afii10090',220=>'afii10095',221=>'afii10091',222=>'afii10089',223=>'afii10092',224=>'afii10048',225=>'afii10017',226=>'afii10018',227=>'afii10040',228=>'afii10021',229=>'afii10022',230=>'afii10038',231=>'afii10020',232=>'afii10039',233=>'afii10026',234=>'afii10027',235=>'afii10028',236=>'afii10029',237=>'afii10030',238=>'afii10031',239=>'afii10032',240=>'afii10033',241=>'afii10049',242=>'afii10034',243=>'afii10035',244=>'afii10036',245=>'afii10037',246=>'afii10024',247=>'afii10019',248=>'afii10046',249=>'afii10045',250=>'afii10025',251=>'afii10042',252=>'afii10047',253=>'afii10043',254=>'afii10041',255=>'afii10044'),
18428
18429// encoding map for: koi8-u
18430'koi8-u' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'quotedbl',35=>'numbersign',36=>'dollar',37=>'percent',38=>'ampersand',39=>'quotesingle',40=>'parenleft',41=>'parenright',42=>'asterisk',43=>'plus',44=>'comma',45=>'hyphen',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'at',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',91=>'bracketleft',92=>'backslash',93=>'bracketright',94=>'asciicircum',95=>'underscore',96=>'grave',97=>'a',98=>'b',99=>'c',100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'braceleft',124=>'bar',125=>'braceright',126=>'asciitilde',127=>'.notdef',128=>'SF100000',129=>'SF110000',130=>'SF010000',131=>'SF030000',132=>'SF020000',133=>'SF040000',134=>'SF080000',135=>'SF090000',136=>'SF060000',137=>'SF070000',138=>'SF050000',139=>'upblock',140=>'dnblock',141=>'block',142=>'lfblock',143=>'rtblock',144=>'ltshade',145=>'shade',146=>'dkshade',147=>'integraltp',148=>'filledbox',149=>'bullet',150=>'radical',151=>'approxequal',152=>'lessequal',153=>'greaterequal',154=>'space',155=>'integralbt',156=>'degree',157=>'twosuperior',158=>'periodcentered',159=>'divide',160=>'SF430000',161=>'SF240000',162=>'SF510000',163=>'afii10071',164=>'afii10101',165=>'SF390000',166=>'afii10103',167=>'afii10104',168=>'SF250000',169=>'SF500000',170=>'SF490000',171=>'SF380000',172=>'SF280000',173=>'afii10098',174=>'SF260000',175=>'SF360000',176=>'SF370000',177=>'SF420000',178=>'SF190000',179=>'afii10023',180=>'afii10053',181=>'SF230000',182=>'afii10055',183=>'afii10056',184=>'SF410000',185=>'SF450000',186=>'SF460000',187=>'SF400000',188=>'SF540000',189=>'afii10050',190=>'SF440000',191=>'copyright',192=>'afii10096',193=>'afii10065',194=>'afii10066',195=>'afii10088',196=>'afii10069',197=>'afii10070',198=>'afii10086',199=>'afii10068',200=>'afii10087',201=>'afii10074',202=>'afii10075',203=>'afii10076',204=>'afii10077',205=>'afii10078',206=>'afii10079',207=>'afii10080',208=>'afii10081',209=>'afii10097',210=>'afii10082',211=>'afii10083',212=>'afii10084',213=>'afii10085',214=>'afii10072',215=>'afii10067',216=>'afii10094',217=>'afii10093',218=>'afii10073',219=>'afii10090',220=>'afii10095',221=>'afii10091',222=>'afii10089',223=>'afii10092',224=>'afii10048',225=>'afii10017',226=>'afii10018',227=>'afii10040',228=>'afii10021',229=>'afii10022',230=>'afii10038',231=>'afii10020',232=>'afii10039',233=>'afii10026',234=>'afii10027',235=>'afii10028',236=>'afii10029',237=>'afii10030',238=>'afii10031',239=>'afii10032',240=>'afii10033',241=>'afii10049',242=>'afii10034',243=>'afii10035',244=>'afii10036',245=>'afii10037',246=>'afii10024',247=>'afii10019',248=>'afii10046',249=>'afii10045',250=>'afii10025',251=>'afii10042',252=>'afii10047',253=>'afii10043',254=>'afii10041',255=>'afii10044'),
18431
18432// encoding map for: symbol
18433'symbol' => array(0=>'.notdef',1=>'.notdef',2=>'.notdef',3=>'.notdef',4=>'.notdef',5=>'.notdef',6=>'.notdef',7=>'.notdef',8=>'.notdef',9=>'.notdef',10=>'.notdef',11=>'.notdef',12=>'.notdef',13=>'.notdef',14=>'.notdef',15=>'.notdef',16=>'.notdef',17=>'.notdef',18=>'.notdef',19=>'.notdef',20=>'.notdef',21=>'.notdef',22=>'.notdef',23=>'.notdef',24=>'.notdef',25=>'.notdef',26=>'.notdef',27=>'.notdef',28=>'.notdef',29=>'.notdef',30=>'.notdef',31=>'.notdef',32=>'space',33=>'exclam',34=>'universal',35=>'numbersign',36=>'existential',37=>'percent',38=>'ampersand',39=>'suchthat',40=>'parenleft',41=>'parenright',42=>'asteriskmath',43=>'plus',44=>'comma',45=>'minus',46=>'period',47=>'slash',48=>'zero',49=>'one',50=>'two',51=>'three',52=>'four',53=>'five',54=>'six',55=>'seven',56=>'eight',57=>'nine',58=>'colon',59=>'semicolon',60=>'less',61=>'equal',62=>'greater',63=>'question',64=>'congruent',65=>'Alpha',66=>'Beta',67=>'Chi',68=>'Delta',69=>'Epsilon',70=>'Phi',71=>'Gamma',72=>'Eta',73=>'Iota',74=>'theta1',75=>'Kappa',76=>'Lambda',77=>'Mu',78=>'Nu',79=>'Omicron',80=>'Pi',81=>'Theta',82=>'Rho',83=>'Sigma',84=>'Tau',85=>'Upsilon',86=>'sigma1',87=>'Omega',88=>'Xi',89=>'Psi',90=>'Zeta',91=>'bracketleft',92=>'therefore',93=>'bracketright',94=>'perpendicular',95=>'underscore',96=>'radicalex',97=>'alpha',98=>'beta',99=>'chi',100=>'delta',101=>'epsilon',102=>'phi',103=>'gamma',104=>'eta',105=>'iota',106=>'phi1',107=>'kappa',108=>'lambda',109=>'mu',110=>'nu',111=>'omicron',112=>'pi',113=>'theta',114=>'rho',115=>'sigma',116=>'tau',117=>'upsilon',118=>'omega1',119=>'omega',120=>'xi',121=>'psi',122=>'zeta',123=>'braceleft',124=>'bar',125=>'braceright',126=>'similar',127=>'.notdef',128=>'.notdef',129=>'.notdef',130=>'.notdef',131=>'.notdef',132=>'.notdef',133=>'.notdef',134=>'.notdef',135=>'.notdef',136=>'.notdef',137=>'.notdef',138=>'.notdef',139=>'.notdef',140=>'.notdef',141=>'.notdef',142=>'.notdef',143=>'.notdef',144=>'.notdef',145=>'.notdef',146=>'.notdef',147=>'.notdef',148=>'.notdef',149=>'.notdef',150=>'.notdef',151=>'.notdef',152=>'.notdef',153=>'.notdef',154=>'.notdef',155=>'.notdef',156=>'.notdef',157=>'.notdef',158=>'.notdef',159=>'.notdef',160=>'Euro',161=>'Upsilon1',162=>'minute',163=>'lessequal',164=>'fraction',165=>'infinity',166=>'florin',167=>'club',168=>'diamond',169=>'heart',170=>'spade',171=>'arrowboth',172=>'arrowleft',173=>'arrowup',174=>'arrowright',175=>'arrowdown',176=>'degree',177=>'plusminus',178=>'second',179=>'greaterequal',180=>'multiply',181=>'proportional',182=>'partialdiff',183=>'bullet',184=>'divide',185=>'notequal',186=>'equivalence',187=>'approxequal',188=>'ellipsis',189=>'arrowvertex',190=>'arrowhorizex',191=>'carriagereturn',192=>'aleph',193=>'Ifraktur',194=>'Rfraktur',195=>'weierstrass',196=>'circlemultiply',197=>'circleplus',198=>'emptyset',199=>'intersection',200=>'union',201=>'propersuperset',202=>'reflexsuperset',203=>'notsubset',204=>'propersubset',205=>'reflexsubset',206=>'element',207=>'notelement',208=>'angle',209=>'gradient',210=>'registerserif',211=>'copyrightserif',212=>'trademarkserif',213=>'product',214=>'radical',215=>'dotmath',216=>'logicalnot',217=>'logicaland',218=>'logicalor',219=>'arrowdblboth',220=>'arrowdblleft',221=>'arrowdblup',222=>'arrowdblright',223=>'arrowdbldown',224=>'lozenge',225=>'angleleft',226=>'registersans',227=>'copyrightsans',228=>'trademarksans',229=>'summation',230=>'parenlefttp',231=>'parenleftex',232=>'parenleftbt',233=>'bracketlefttp',234=>'bracketleftex',235=>'bracketleftbt',236=>'bracelefttp',237=>'braceleftmid',238=>'braceleftbt',239=>'braceex',240=>'.notdef',241=>'angleright',242=>'integral',243=>'integraltp',244=>'integralex',245=>'integralbt',246=>'parenrighttp',247=>'parenrightex',248=>'parenrightbt',249=>'bracketrighttp',250=>'bracketrightex',251=>'bracketrightbt',252=>'bracerighttp',253=>'bracerightmid',254=>'bracerightbt',255=>'.notdef',1226=>'registered',1227=>'copyright',1228=>'trademark')
18434
18435); // end of encoding maps
18436
18437/**
18438 * ToUnicode map for Identity-H stream
18439 * @public static
18440 */
18441public static $uni_identity_h = "/CIDInit /ProcSet findresource begin\n12 dict begin\nbegincmap\n/CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def\n/CMapName /Adobe-Identity-UCS def\n/CMapType 2 def\n/WMode 0 def\n1 begincodespacerange\n<0000> <FFFF>\nendcodespacerange\n100 beginbfrange\n<0000> <00ff> <0000>\n<0100> <01ff> <0100>\n<0200> <02ff> <0200>\n<0300> <03ff> <0300>\n<0400> <04ff> <0400>\n<0500> <05ff> <0500>\n<0600> <06ff> <0600>\n<0700> <07ff> <0700>\n<0800> <08ff> <0800>\n<0900> <09ff> <0900>\n<0a00> <0aff> <0a00>\n<0b00> <0bff> <0b00>\n<0c00> <0cff> <0c00>\n<0d00> <0dff> <0d00>\n<0e00> <0eff> <0e00>\n<0f00> <0fff> <0f00>\n<1000> <10ff> <1000>\n<1100> <11ff> <1100>\n<1200> <12ff> <1200>\n<1300> <13ff> <1300>\n<1400> <14ff> <1400>\n<1500> <15ff> <1500>\n<1600> <16ff> <1600>\n<1700> <17ff> <1700>\n<1800> <18ff> <1800>\n<1900> <19ff> <1900>\n<1a00> <1aff> <1a00>\n<1b00> <1bff> <1b00>\n<1c00> <1cff> <1c00>\n<1d00> <1dff> <1d00>\n<1e00> <1eff> <1e00>\n<1f00> <1fff> <1f00>\n<2000> <20ff> <2000>\n<2100> <21ff> <2100>\n<2200> <22ff> <2200>\n<2300> <23ff> <2300>\n<2400> <24ff> <2400>\n<2500> <25ff> <2500>\n<2600> <26ff> <2600>\n<2700> <27ff> <2700>\n<2800> <28ff> <2800>\n<2900> <29ff> <2900>\n<2a00> <2aff> <2a00>\n<2b00> <2bff> <2b00>\n<2c00> <2cff> <2c00>\n<2d00> <2dff> <2d00>\n<2e00> <2eff> <2e00>\n<2f00> <2fff> <2f00>\n<3000> <30ff> <3000>\n<3100> <31ff> <3100>\n<3200> <32ff> <3200>\n<3300> <33ff> <3300>\n<3400> <34ff> <3400>\n<3500> <35ff> <3500>\n<3600> <36ff> <3600>\n<3700> <37ff> <3700>\n<3800> <38ff> <3800>\n<3900> <39ff> <3900>\n<3a00> <3aff> <3a00>\n<3b00> <3bff> <3b00>\n<3c00> <3cff> <3c00>\n<3d00> <3dff> <3d00>\n<3e00> <3eff> <3e00>\n<3f00> <3fff> <3f00>\n<4000> <40ff> <4000>\n<4100> <41ff> <4100>\n<4200> <42ff> <4200>\n<4300> <43ff> <4300>\n<4400> <44ff> <4400>\n<4500> <45ff> <4500>\n<4600> <46ff> <4600>\n<4700> <47ff> <4700>\n<4800> <48ff> <4800>\n<4900> <49ff> <4900>\n<4a00> <4aff> <4a00>\n<4b00> <4bff> <4b00>\n<4c00> <4cff> <4c00>\n<4d00> <4dff> <4d00>\n<4e00> <4eff> <4e00>\n<4f00> <4fff> <4f00>\n<5000> <50ff> <5000>\n<5100> <51ff> <5100>\n<5200> <52ff> <5200>\n<5300> <53ff> <5300>\n<5400> <54ff> <5400>\n<5500> <55ff> <5500>\n<5600> <56ff> <5600>\n<5700> <57ff> <5700>\n<5800> <58ff> <5800>\n<5900> <59ff> <5900>\n<5a00> <5aff> <5a00>\n<5b00> <5bff> <5b00>\n<5c00> <5cff> <5c00>\n<5d00> <5dff> <5d00>\n<5e00> <5eff> <5e00>\n<5f00> <5fff> <5f00>\n<6000> <60ff> <6000>\n<6100> <61ff> <6100>\n<6200> <62ff> <6200>\n<6300> <63ff> <6300>\nendbfrange\n100 beginbfrange\n<6400> <64ff> <6400>\n<6500> <65ff> <6500>\n<6600> <66ff> <6600>\n<6700> <67ff> <6700>\n<6800> <68ff> <6800>\n<6900> <69ff> <6900>\n<6a00> <6aff> <6a00>\n<6b00> <6bff> <6b00>\n<6c00> <6cff> <6c00>\n<6d00> <6dff> <6d00>\n<6e00> <6eff> <6e00>\n<6f00> <6fff> <6f00>\n<7000> <70ff> <7000>\n<7100> <71ff> <7100>\n<7200> <72ff> <7200>\n<7300> <73ff> <7300>\n<7400> <74ff> <7400>\n<7500> <75ff> <7500>\n<7600> <76ff> <7600>\n<7700> <77ff> <7700>\n<7800> <78ff> <7800>\n<7900> <79ff> <7900>\n<7a00> <7aff> <7a00>\n<7b00> <7bff> <7b00>\n<7c00> <7cff> <7c00>\n<7d00> <7dff> <7d00>\n<7e00> <7eff> <7e00>\n<7f00> <7fff> <7f00>\n<8000> <80ff> <8000>\n<8100> <81ff> <8100>\n<8200> <82ff> <8200>\n<8300> <83ff> <8300>\n<8400> <84ff> <8400>\n<8500> <85ff> <8500>\n<8600> <86ff> <8600>\n<8700> <87ff> <8700>\n<8800> <88ff> <8800>\n<8900> <89ff> <8900>\n<8a00> <8aff> <8a00>\n<8b00> <8bff> <8b00>\n<8c00> <8cff> <8c00>\n<8d00> <8dff> <8d00>\n<8e00> <8eff> <8e00>\n<8f00> <8fff> <8f00>\n<9000> <90ff> <9000>\n<9100> <91ff> <9100>\n<9200> <92ff> <9200>\n<9300> <93ff> <9300>\n<9400> <94ff> <9400>\n<9500> <95ff> <9500>\n<9600> <96ff> <9600>\n<9700> <97ff> <9700>\n<9800> <98ff> <9800>\n<9900> <99ff> <9900>\n<9a00> <9aff> <9a00>\n<9b00> <9bff> <9b00>\n<9c00> <9cff> <9c00>\n<9d00> <9dff> <9d00>\n<9e00> <9eff> <9e00>\n<9f00> <9fff> <9f00>\n<a000> <a0ff> <a000>\n<a100> <a1ff> <a100>\n<a200> <a2ff> <a200>\n<a300> <a3ff> <a300>\n<a400> <a4ff> <a400>\n<a500> <a5ff> <a500>\n<a600> <a6ff> <a600>\n<a700> <a7ff> <a700>\n<a800> <a8ff> <a800>\n<a900> <a9ff> <a900>\n<aa00> <aaff> <aa00>\n<ab00> <abff> <ab00>\n<ac00> <acff> <ac00>\n<ad00> <adff> <ad00>\n<ae00> <aeff> <ae00>\n<af00> <afff> <af00>\n<b000> <b0ff> <b000>\n<b100> <b1ff> <b100>\n<b200> <b2ff> <b200>\n<b300> <b3ff> <b300>\n<b400> <b4ff> <b400>\n<b500> <b5ff> <b500>\n<b600> <b6ff> <b600>\n<b700> <b7ff> <b700>\n<b800> <b8ff> <b800>\n<b900> <b9ff> <b900>\n<ba00> <baff> <ba00>\n<bb00> <bbff> <bb00>\n<bc00> <bcff> <bc00>\n<bd00> <bdff> <bd00>\n<be00> <beff> <be00>\n<bf00> <bfff> <bf00>\n<c000> <c0ff> <c000>\n<c100> <c1ff> <c100>\n<c200> <c2ff> <c200>\n<c300> <c3ff> <c300>\n<c400> <c4ff> <c400>\n<c500> <c5ff> <c500>\n<c600> <c6ff> <c600>\n<c700> <c7ff> <c700>\nendbfrange\n56 beginbfrange\n<c800> <c8ff> <c800>\n<c900> <c9ff> <c900>\n<ca00> <caff> <ca00>\n<cb00> <cbff> <cb00>\n<cc00> <ccff> <cc00>\n<cd00> <cdff> <cd00>\n<ce00> <ceff> <ce00>\n<cf00> <cfff> <cf00>\n<d000> <d0ff> <d000>\n<d100> <d1ff> <d100>\n<d200> <d2ff> <d200>\n<d300> <d3ff> <d300>\n<d400> <d4ff> <d400>\n<d500> <d5ff> <d500>\n<d600> <d6ff> <d600>\n<d700> <d7ff> <d700>\n<d800> <d8ff> <d800>\n<d900> <d9ff> <d900>\n<da00> <daff> <da00>\n<db00> <dbff> <db00>\n<dc00> <dcff> <dc00>\n<dd00> <ddff> <dd00>\n<de00> <deff> <de00>\n<df00> <dfff> <df00>\n<e000> <e0ff> <e000>\n<e100> <e1ff> <e100>\n<e200> <e2ff> <e200>\n<e300> <e3ff> <e300>\n<e400> <e4ff> <e400>\n<e500> <e5ff> <e500>\n<e600> <e6ff> <e600>\n<e700> <e7ff> <e700>\n<e800> <e8ff> <e800>\n<e900> <e9ff> <e900>\n<ea00> <eaff> <ea00>\n<eb00> <ebff> <eb00>\n<ec00> <ecff> <ec00>\n<ed00> <edff> <ed00>\n<ee00> <eeff> <ee00>\n<ef00> <efff> <ef00>\n<f000> <f0ff> <f000>\n<f100> <f1ff> <f100>\n<f200> <f2ff> <f200>\n<f300> <f3ff> <f300>\n<f400> <f4ff> <f400>\n<f500> <f5ff> <f500>\n<f600> <f6ff> <f600>\n<f700> <f7ff> <f700>\n<f800> <f8ff> <f800>\n<f900> <f9ff> <f900>\n<fa00> <faff> <fa00>\n<fb00> <fbff> <fb00>\n<fc00> <fcff> <fc00>\n<fd00> <fdff> <fd00>\n<fe00> <feff> <fe00>\n<ff00> <ffff> <ff00>\nendbfrange\nendcmap\nCMapName currentdict /CMap defineresource pop\nend\nend";
18442
18443} // END OF TCPDF_FONT_DATA CLASS
18444
18445//============================================================+
18446// END OF FILE
18447//============================================================+
diff --git a/inc/3rdparty/libraries/tcpdf/include/tcpdf_fonts.php b/inc/3rdparty/libraries/tcpdf/include/tcpdf_fonts.php
new file mode 100644
index 00000000..a7f0486a
--- /dev/null
+++ b/inc/3rdparty/libraries/tcpdf/include/tcpdf_fonts.php
@@ -0,0 +1,2583 @@
1<?php
2//============================================================+
3// File name : tcpdf_fonts.php
4// Version : 1.0.013
5// Begin : 2008-01-01
6// Last Update : 2014-05-23
7// Author : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
8// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
9// -------------------------------------------------------------------
10// Copyright (C) 2008-2014 Nicola Asuni - Tecnick.com LTD
11//
12// This file is part of TCPDF software library.
13//
14// TCPDF is free software: you can redistribute it and/or modify it
15// under the terms of the GNU Lesser General Public License as
16// published by the Free Software Foundation, either version 3 of the
17// License, or (at your option) any later version.
18//
19// TCPDF is distributed in the hope that it will be useful, but
20// WITHOUT ANY WARRANTY; without even the implied warranty of
21// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
22// See the GNU Lesser General Public License for more details.
23//
24// You should have received a copy of the GNU Lesser General Public License
25// along with TCPDF. If not, see <http://www.gnu.org/licenses/>.
26//
27// See LICENSE.TXT file for more information.
28// -------------------------------------------------------------------
29//
30// Description :Font methods for TCPDF library.
31//
32//============================================================+
33
34/**
35 * @file
36 * Unicode data and font methods for TCPDF library.
37 * @author Nicola Asuni
38 * @package com.tecnick.tcpdf
39 */
40
41/**
42 * @class TCPDF_FONTS
43 * Font methods for TCPDF library.
44 * @package com.tecnick.tcpdf
45 * @version 1.0.013
46 * @author Nicola Asuni - info@tecnick.com
47 */
48class TCPDF_FONTS {
49
50 /**
51 * Static cache used for speed up uniord performances
52 * @protected
53 */
54 protected static $cache_uniord = array();
55
56 /**
57 * Convert and add the selected TrueType or Type1 font to the fonts folder (that must be writeable).
58 * @param $fontfile (string) Font file (full path).
59 * @param $fonttype (string) Font type. Leave empty for autodetect mode. Valid values are: TrueTypeUnicode, TrueType, Type1, CID0JP = CID-0 Japanese, CID0KR = CID-0 Korean, CID0CS = CID-0 Chinese Simplified, CID0CT = CID-0 Chinese Traditional.
60 * @param $enc (string) Name of the encoding table to use. Leave empty for default mode. Omit this parameter for TrueType Unicode and symbolic fonts like Symbol or ZapfDingBats.
61 * @param $flags (int) Unsigned 32-bit integer containing flags specifying various characteristics of the font (PDF32000:2008 - 9.8.2 Font Descriptor Flags): +1 for fixed font; +4 for symbol or +32 for non-symbol; +64 for italic. Fixed and Italic mode are generally autodetected so you have to set it to 32 = non-symbolic font (default) or 4 = symbolic font.
62 * @param $outpath (string) Output path for generated font files (must be writeable by the web server). Leave empty for default font folder.
63 * @param $platid (int) Platform ID for CMAP table to extract (when building a Unicode font for Windows this value should be 3, for Macintosh should be 1).
64 * @param $encid (int) Encoding ID for CMAP table to extract (when building a Unicode font for Windows this value should be 1, for Macintosh should be 0). When Platform ID is 3, legal values for Encoding ID are: 0=Symbol, 1=Unicode, 2=ShiftJIS, 3=PRC, 4=Big5, 5=Wansung, 6=Johab, 7=Reserved, 8=Reserved, 9=Reserved, 10=UCS-4.
65 * @param $addcbbox (boolean) If true includes the character bounding box information on the php font file.
66 * @param $link (boolean) If true link to system font instead of copying the font data (not transportable) - Note: do not work with Type1 fonts.
67 * @return (string) TCPDF font name or boolean false in case of error.
68 * @author Nicola Asuni
69 * @since 5.9.123 (2010-09-30)
70 * @public static
71 */
72 public static function addTTFfont($fontfile, $fonttype='', $enc='', $flags=32, $outpath='', $platid=3, $encid=1, $addcbbox=false, $link=false) {
73 if (!file_exists($fontfile)) {
74 // Could not find file
75 return false;
76 }
77 // font metrics
78 $fmetric = array();
79 // build new font name for TCPDF compatibility
80 $font_path_parts = pathinfo($fontfile);
81 if (!isset($font_path_parts['filename'])) {
82 $font_path_parts['filename'] = substr($font_path_parts['basename'], 0, -(strlen($font_path_parts['extension']) + 1));
83 }
84 $font_name = strtolower($font_path_parts['filename']);
85 $font_name = preg_replace('/[^a-z0-9_]/', '', $font_name);
86 $search = array('bold', 'oblique', 'italic', 'regular');
87 $replace = array('b', 'i', 'i', '');
88 $font_name = str_replace($search, $replace, $font_name);
89 if (empty($font_name)) {
90 // set generic name
91 $font_name = 'tcpdffont';
92 }
93 // set output path
94 if (empty($outpath)) {
95 $outpath = self::_getfontpath();
96 }
97 // check if this font already exist
98 if (@file_exists($outpath.$font_name.'.php')) {
99 // this font already exist (delete it from fonts folder to rebuild it)
100 return $font_name;
101 }
102 $fmetric['file'] = $font_name;
103 $fmetric['ctg'] = $font_name.'.ctg.z';
104 // get font data
105 $font = file_get_contents($fontfile);
106 $fmetric['originalsize'] = strlen($font);
107 // autodetect font type
108 if (empty($fonttype)) {
109 if (TCPDF_STATIC::_getULONG($font, 0) == 0x10000) {
110 // True Type (Unicode or not)
111 $fonttype = 'TrueTypeUnicode';
112 } elseif (substr($font, 0, 4) == 'OTTO') {
113 // Open Type (Unicode or not)
114 //Unsupported font format: OpenType with CFF data
115 return false;
116 } else {
117 // Type 1
118 $fonttype = 'Type1';
119 }
120 }
121 // set font type
122 switch ($fonttype) {
123 case 'CID0CT':
124 case 'CID0CS':
125 case 'CID0KR':
126 case 'CID0JP': {
127 $fmetric['type'] = 'cidfont0';
128 break;
129 }
130 case 'Type1': {
131 $fmetric['type'] = 'Type1';
132 if (empty($enc) AND (($flags & 4) == 0)) {
133 $enc = 'cp1252';
134 }
135 break;
136 }
137 case 'TrueType': {
138 $fmetric['type'] = 'TrueType';
139 break;
140 }
141 case 'TrueTypeUnicode':
142 default: {
143 $fmetric['type'] = 'TrueTypeUnicode';
144 break;
145 }
146 }
147 // set encoding maps (if any)
148 $fmetric['enc'] = preg_replace('/[^A-Za-z0-9_\-]/', '', $enc);
149 $fmetric['diff'] = '';
150 if (($fmetric['type'] == 'TrueType') OR ($fmetric['type'] == 'Type1')) {
151 if (!empty($enc) AND ($enc != 'cp1252') AND isset(TCPDF_FONT_DATA::$encmap[$enc])) {
152 // build differences from reference encoding
153 $enc_ref = TCPDF_FONT_DATA::$encmap['cp1252'];
154 $enc_target = TCPDF_FONT_DATA::$encmap[$enc];
155 $last = 0;
156 for ($i = 32; $i <= 255; ++$i) {
157 if ($enc_target != $enc_ref[$i]) {
158 if ($i != ($last + 1)) {
159 $fmetric['diff'] .= $i.' ';
160 }
161 $last = $i;
162 $fmetric['diff'] .= '/'.$enc_target[$i].' ';
163 }
164 }
165 }
166 }
167 // parse the font by type
168 if ($fmetric['type'] == 'Type1') {
169 // ---------- TYPE 1 ----------
170 // read first segment
171 $a = unpack('Cmarker/Ctype/Vsize', substr($font, 0, 6));
172 if ($a['marker'] != 128) {
173 // Font file is not a valid binary Type1
174 return false;
175 }
176 $fmetric['size1'] = $a['size'];
177 $data = substr($font, 6, $fmetric['size1']);
178 // read second segment
179 $a = unpack('Cmarker/Ctype/Vsize', substr($font, (6 + $fmetric['size1']), 6));
180 if ($a['marker'] != 128) {
181 // Font file is not a valid binary Type1
182 return false;
183 }
184 $fmetric['size2'] = $a['size'];
185 $encrypted = substr($font, (12 + $fmetric['size1']), $fmetric['size2']);
186 $data .= $encrypted;
187 // store compressed font
188 $fmetric['file'] .= '.z';
189 $fp = fopen($outpath.$fmetric['file'], 'wb');
190 fwrite($fp, gzcompress($data));
191 fclose($fp);
192 // get font info
193 $fmetric['Flags'] = $flags;
194 preg_match ('#/FullName[\s]*\(([^\)]*)#', $font, $matches);
195 $fmetric['name'] = preg_replace('/[^a-zA-Z0-9_\-]/', '', $matches[1]);
196 preg_match('#/FontBBox[\s]*{([^}]*)#', $font, $matches);
197 $fmetric['bbox'] = trim($matches[1]);
198 $bv = explode(' ', $fmetric['bbox']);
199 $fmetric['Ascent'] = intval($bv[3]);
200 $fmetric['Descent'] = intval($bv[1]);
201 preg_match('#/ItalicAngle[\s]*([0-9\+\-]*)#', $font, $matches);
202 $fmetric['italicAngle'] = intval($matches[1]);
203 if ($fmetric['italicAngle'] != 0) {
204 $fmetric['Flags'] |= 64;
205 }
206 preg_match('#/UnderlinePosition[\s]*([0-9\+\-]*)#', $font, $matches);
207 $fmetric['underlinePosition'] = intval($matches[1]);
208 preg_match('#/UnderlineThickness[\s]*([0-9\+\-]*)#', $font, $matches);
209 $fmetric['underlineThickness'] = intval($matches[1]);
210 preg_match('#/isFixedPitch[\s]*([^\s]*)#', $font, $matches);
211 if ($matches[1] == 'true') {
212 $fmetric['Flags'] |= 1;
213 }
214 // get internal map
215 $imap = array();
216 if (preg_match_all('#dup[\s]([0-9]+)[\s]*/([^\s]*)[\s]put#sU', $font, $fmap, PREG_SET_ORDER) > 0) {
217 foreach ($fmap as $v) {
218 $imap[$v[2]] = $v[1];
219 }
220 }
221 // decrypt eexec encrypted part
222 $r = 55665; // eexec encryption constant
223 $c1 = 52845;
224 $c2 = 22719;
225 $elen = strlen($encrypted);
226 $eplain = '';
227 for ($i = 0; $i < $elen; ++$i) {
228 $chr = ord($encrypted[$i]);
229 $eplain .= chr($chr ^ ($r >> 8));
230 $r = ((($chr + $r) * $c1 + $c2) % 65536);
231 }
232 if (preg_match('#/ForceBold[\s]*([^\s]*)#', $eplain, $matches) > 0) {
233 if ($matches[1] == 'true') {
234 $fmetric['Flags'] |= 0x40000;
235 }
236 }
237 if (preg_match('#/StdVW[\s]*\[([^\]]*)#', $eplain, $matches) > 0) {
238 $fmetric['StemV'] = intval($matches[1]);
239 } else {
240 $fmetric['StemV'] = 70;
241 }
242 if (preg_match('#/StdHW[\s]*\[([^\]]*)#', $eplain, $matches) > 0) {
243 $fmetric['StemH'] = intval($matches[1]);
244 } else {
245 $fmetric['StemH'] = 30;
246 }
247 if (preg_match('#/BlueValues[\s]*\[([^\]]*)#', $eplain, $matches) > 0) {
248 $bv = explode(' ', $matches[1]);
249 if (count($bv) >= 6) {
250 $v1 = intval($bv[2]);
251 $v2 = intval($bv[4]);
252 if ($v1 <= $v2) {
253 $fmetric['XHeight'] = $v1;
254 $fmetric['CapHeight'] = $v2;
255 } else {
256 $fmetric['XHeight'] = $v2;
257 $fmetric['CapHeight'] = $v1;
258 }
259 } else {
260 $fmetric['XHeight'] = 450;
261 $fmetric['CapHeight'] = 700;
262 }
263 } else {
264 $fmetric['XHeight'] = 450;
265 $fmetric['CapHeight'] = 700;
266 }
267 // get the number of random bytes at the beginning of charstrings
268 if (preg_match('#/lenIV[\s]*([0-9]*)#', $eplain, $matches) > 0) {
269 $lenIV = intval($matches[1]);
270 } else {
271 $lenIV = 4;
272 }
273 $fmetric['Leading'] = 0;
274 // get charstring data
275 $eplain = substr($eplain, (strpos($eplain, '/CharStrings') + 1));
276 preg_match_all('#/([A-Za-z0-9\.]*)[\s][0-9]+[\s]RD[\s](.*)[\s]ND#sU', $eplain, $matches, PREG_SET_ORDER);
277 if (!empty($enc) AND isset(TCPDF_FONT_DATA::$encmap[$enc])) {
278 $enc_map = TCPDF_FONT_DATA::$encmap[$enc];
279 } else {
280 $enc_map = false;
281 }
282 $fmetric['cw'] = '';
283 $fmetric['MaxWidth'] = 0;
284 $cwidths = array();
285 foreach ($matches as $k => $v) {
286 $cid = 0;
287 if (isset($imap[$v[1]])) {
288 $cid = $imap[$v[1]];
289 } elseif ($enc_map !== false) {
290 $cid = array_search($v[1], $enc_map);
291 if ($cid === false) {
292 $cid = 0;
293 } elseif ($cid > 1000) {
294 $cid -= 1000;
295 }
296 }
297 // decrypt charstring encrypted part
298 $r = 4330; // charstring encryption constant
299 $c1 = 52845;
300 $c2 = 22719;
301 $cd = $v[2];
302 $clen = strlen($cd);
303 $ccom = array();
304 for ($i = 0; $i < $clen; ++$i) {
305 $chr = ord($cd[$i]);
306 $ccom[] = ($chr ^ ($r >> 8));
307 $r = ((($chr + $r) * $c1 + $c2) % 65536);
308 }
309 // decode numbers
310 $cdec = array();
311 $ck = 0;
312 $i = $lenIV;
313 while ($i < $clen) {
314 if ($ccom[$i] < 32) {
315 $cdec[$ck] = $ccom[$i];
316 if (($ck > 0) AND ($cdec[$ck] == 13)) {
317 // hsbw command: update width
318 $cwidths[$cid] = $cdec[($ck - 1)];
319 }
320 ++$i;
321 } elseif (($ccom[$i] >= 32) AND ($ccom[$i] <= 246)) {
322 $cdec[$ck] = ($ccom[$i] - 139);
323 ++$i;
324 } elseif (($ccom[$i] >= 247) AND ($ccom[$i] <= 250)) {
325 $cdec[$ck] = ((($ccom[$i] - 247) * 256) + $ccom[($i + 1)] + 108);
326 $i += 2;
327 } elseif (($ccom[$i] >= 251) AND ($ccom[$i] <= 254)) {
328 $cdec[$ck] = ((-($ccom[$i] - 251) * 256) - $ccom[($i + 1)] - 108);
329 $i += 2;
330 } elseif ($ccom[$i] == 255) {
331 $sval = chr($ccom[($i + 1)]).chr($ccom[($i + 2)]).chr($ccom[($i + 3)]).chr($ccom[($i + 4)]);
332 $vsval = unpack('li', $sval);
333 $cdec[$ck] = $vsval['i'];
334 $i += 5;
335 }
336 ++$ck;
337 }
338 } // end for each matches
339 $fmetric['MissingWidth'] = $cwidths[0];
340 $fmetric['MaxWidth'] = $fmetric['MissingWidth'];
341 $fmetric['AvgWidth'] = 0;
342 // set chars widths
343 for ($cid = 0; $cid <= 255; ++$cid) {
344 if (isset($cwidths[$cid])) {
345 if ($cwidths[$cid] > $fmetric['MaxWidth']) {
346 $fmetric['MaxWidth'] = $cwidths[$cid];
347 }
348 $fmetric['AvgWidth'] += $cwidths[$cid];
349 $fmetric['cw'] .= ','.$cid.'=>'.$cwidths[$cid];
350 } else {
351 $fmetric['cw'] .= ','.$cid.'=>'.$fmetric['MissingWidth'];
352 }
353 }
354 $fmetric['AvgWidth'] = round($fmetric['AvgWidth'] / count($cwidths));
355 } else {
356 // ---------- TRUE TYPE ----------
357 if ($fmetric['type'] != 'cidfont0') {
358 if ($link) {
359 // creates a symbolic link to the existing font
360 symlink($fontfile, $outpath.$fmetric['file']);
361 } else {
362 // store compressed font
363 $fmetric['file'] .= '.z';
364 $fp = fopen($outpath.$fmetric['file'], 'wb');
365 fwrite($fp, gzcompress($font));
366 fclose($fp);
367 }
368 }
369 $offset = 0; // offset position of the font data
370 if (TCPDF_STATIC::_getULONG($font, $offset) != 0x10000) {
371 // sfnt version must be 0x00010000 for TrueType version 1.0.
372 return false;
373 }
374 $offset += 4;
375 // get number of tables
376 $numTables = TCPDF_STATIC::_getUSHORT($font, $offset);
377 $offset += 2;
378 // skip searchRange, entrySelector and rangeShift
379 $offset += 6;
380 // tables array
381 $table = array();
382 // ---------- get tables ----------
383 for ($i = 0; $i < $numTables; ++$i) {
384 // get table info
385 $tag = substr($font, $offset, 4);
386 $offset += 4;
387 $table[$tag] = array();
388 $table[$tag]['checkSum'] = TCPDF_STATIC::_getULONG($font, $offset);
389 $offset += 4;
390 $table[$tag]['offset'] = TCPDF_STATIC::_getULONG($font, $offset);
391 $offset += 4;
392 $table[$tag]['length'] = TCPDF_STATIC::_getULONG($font, $offset);
393 $offset += 4;
394 }
395 // check magicNumber
396 $offset = $table['head']['offset'] + 12;
397 if (TCPDF_STATIC::_getULONG($font, $offset) != 0x5F0F3CF5) {
398 // magicNumber must be 0x5F0F3CF5
399 return false;
400 }
401 $offset += 4;
402 $offset += 2; // skip flags
403 // get FUnits
404 $fmetric['unitsPerEm'] = TCPDF_STATIC::_getUSHORT($font, $offset);
405 $offset += 2;
406 // units ratio constant
407 $urk = (1000 / $fmetric['unitsPerEm']);
408 $offset += 16; // skip created, modified
409 $xMin = round(TCPDF_STATIC::_getFWORD($font, $offset) * $urk);
410 $offset += 2;
411 $yMin = round(TCPDF_STATIC::_getFWORD($font, $offset) * $urk);
412 $offset += 2;
413 $xMax = round(TCPDF_STATIC::_getFWORD($font, $offset) * $urk);
414 $offset += 2;
415 $yMax = round(TCPDF_STATIC::_getFWORD($font, $offset) * $urk);
416 $offset += 2;
417 $fmetric['bbox'] = ''.$xMin.' '.$yMin.' '.$xMax.' '.$yMax.'';
418 $macStyle = TCPDF_STATIC::_getUSHORT($font, $offset);
419 $offset += 2;
420 // PDF font flags
421 $fmetric['Flags'] = $flags;
422 if (($macStyle & 2) == 2) {
423 // italic flag
424 $fmetric['Flags'] |= 64;
425 }
426 // get offset mode (indexToLocFormat : 0 = short, 1 = long)
427 $offset = $table['head']['offset'] + 50;
428 $short_offset = (TCPDF_STATIC::_getSHORT($font, $offset) == 0);
429 $offset += 2;
430 // get the offsets to the locations of the glyphs in the font, relative to the beginning of the glyphData table
431 $indexToLoc = array();
432 $offset = $table['loca']['offset'];
433 if ($short_offset) {
434 // short version
435 $tot_num_glyphs = floor($table['loca']['length'] / 2); // numGlyphs + 1
436 for ($i = 0; $i < $tot_num_glyphs; ++$i) {
437 $indexToLoc[$i] = TCPDF_STATIC::_getUSHORT($font, $offset) * 2;
438 $offset += 2;
439 }
440 } else {
441 // long version
442 $tot_num_glyphs = floor($table['loca']['length'] / 4); // numGlyphs + 1
443 for ($i = 0; $i < $tot_num_glyphs; ++$i) {
444 $indexToLoc[$i] = TCPDF_STATIC::_getULONG($font, $offset);
445 $offset += 4;
446 }
447 }
448 // get glyphs indexes of chars from cmap table
449 $offset = $table['cmap']['offset'] + 2;
450 $numEncodingTables = TCPDF_STATIC::_getUSHORT($font, $offset);
451 $offset += 2;
452 $encodingTables = array();
453 for ($i = 0; $i < $numEncodingTables; ++$i) {
454 $encodingTables[$i]['platformID'] = TCPDF_STATIC::_getUSHORT($font, $offset);
455 $offset += 2;
456 $encodingTables[$i]['encodingID'] = TCPDF_STATIC::_getUSHORT($font, $offset);
457 $offset += 2;
458 $encodingTables[$i]['offset'] = TCPDF_STATIC::_getULONG($font, $offset);
459 $offset += 4;
460 }
461 // ---------- get os/2 metrics ----------
462 $offset = $table['OS/2']['offset'];
463 $offset += 2; // skip version
464 // xAvgCharWidth
465 $fmetric['AvgWidth'] = round(TCPDF_STATIC::_getFWORD($font, $offset) * $urk);
466 $offset += 2;
467 // usWeightClass
468 $usWeightClass = round(TCPDF_STATIC::_getUFWORD($font, $offset) * $urk);
469 // estimate StemV and StemH (400 = usWeightClass for Normal - Regular font)
470 $fmetric['StemV'] = round((70 * $usWeightClass) / 400);
471 $fmetric['StemH'] = round((30 * $usWeightClass) / 400);
472 $offset += 2;
473 $offset += 2; // usWidthClass
474 $fsType = TCPDF_STATIC::_getSHORT($font, $offset);
475 $offset += 2;
476 if ($fsType == 2) {
477 // This Font cannot be modified, embedded or exchanged in any manner without first obtaining permission of the legal owner.
478 return false;
479 }
480 // ---------- get font name ----------
481 $fmetric['name'] = '';
482 $offset = $table['name']['offset'];
483 $offset += 2; // skip Format selector (=0).
484 // Number of NameRecords that follow n.
485 $numNameRecords = TCPDF_STATIC::_getUSHORT($font, $offset);
486 $offset += 2;
487 // Offset to start of string storage (from start of table).
488 $stringStorageOffset = TCPDF_STATIC::_getUSHORT($font, $offset);
489 $offset += 2;
490 for ($i = 0; $i < $numNameRecords; ++$i) {
491 $offset += 6; // skip Platform ID, Platform-specific encoding ID, Language ID.
492 // Name ID.
493 $nameID = TCPDF_STATIC::_getUSHORT($font, $offset);
494 $offset += 2;
495 if ($nameID == 6) {
496 // String length (in bytes).
497 $stringLength = TCPDF_STATIC::_getUSHORT($font, $offset);
498 $offset += 2;
499 // String offset from start of storage area (in bytes).
500 $stringOffset = TCPDF_STATIC::_getUSHORT($font, $offset);
501 $offset += 2;
502 $offset = ($table['name']['offset'] + $stringStorageOffset + $stringOffset);
503 $fmetric['name'] = substr($font, $offset, $stringLength);
504 $fmetric['name'] = preg_replace('/[^a-zA-Z0-9_\-]/', '', $fmetric['name']);
505 break;
506 } else {
507 $offset += 4; // skip String length, String offset
508 }
509 }
510 if (empty($fmetric['name'])) {
511 $fmetric['name'] = $font_name;
512 }
513 // ---------- get post data ----------
514 $offset = $table['post']['offset'];
515 $offset += 4; // skip Format Type
516 $fmetric['italicAngle'] = TCPDF_STATIC::_getFIXED($font, $offset);
517 $offset += 4;
518 $fmetric['underlinePosition'] = round(TCPDF_STATIC::_getFWORD($font, $offset) * $urk);
519 $offset += 2;
520 $fmetric['underlineThickness'] = round(TCPDF_STATIC::_getFWORD($font, $offset) * $urk);
521 $offset += 2;
522 $isFixedPitch = (TCPDF_STATIC::_getULONG($font, $offset) == 0) ? false : true;
523 $offset += 2;
524 if ($isFixedPitch) {
525 $fmetric['Flags'] |= 1;
526 }
527 // ---------- get hhea data ----------
528 $offset = $table['hhea']['offset'];
529 $offset += 4; // skip Table version number
530 // Ascender
531 $fmetric['Ascent'] = round(TCPDF_STATIC::_getFWORD($font, $offset) * $urk);
532 $offset += 2;
533 // Descender
534 $fmetric['Descent'] = round(TCPDF_STATIC::_getFWORD($font, $offset) * $urk);
535 $offset += 2;
536 // LineGap
537 $fmetric['Leading'] = round(TCPDF_STATIC::_getFWORD($font, $offset) * $urk);
538 $offset += 2;
539 // advanceWidthMax
540 $fmetric['MaxWidth'] = round(TCPDF_STATIC::_getUFWORD($font, $offset) * $urk);
541 $offset += 2;
542 $offset += 22; // skip some values
543 // get the number of hMetric entries in hmtx table
544 $numberOfHMetrics = TCPDF_STATIC::_getUSHORT($font, $offset);
545 // ---------- get maxp data ----------
546 $offset = $table['maxp']['offset'];
547 $offset += 4; // skip Table version number
548 // get the the number of glyphs in the font.
549 $numGlyphs = TCPDF_STATIC::_getUSHORT($font, $offset);
550 // ---------- get CIDToGIDMap ----------
551 $ctg = array();
552 foreach ($encodingTables as $enctable) {
553 // get only specified Platform ID and Encoding ID
554 if (($enctable['platformID'] == $platid) AND ($enctable['encodingID'] == $encid)) {
555 $offset = $table['cmap']['offset'] + $enctable['offset'];
556 $format = TCPDF_STATIC::_getUSHORT($font, $offset);
557 $offset += 2;
558 switch ($format) {
559 case 0: { // Format 0: Byte encoding table
560 $offset += 4; // skip length and version/language
561 for ($c = 0; $c < 256; ++$c) {
562 $g = TCPDF_STATIC::_getBYTE($font, $offset);
563 $ctg[$c] = $g;
564 ++$offset;
565 }
566 break;
567 }
568 case 2: { // Format 2: High-byte mapping through table
569 $offset += 4; // skip length and version/language
570 $numSubHeaders = 0;
571 for ($i = 0; $i < 256; ++$i) {
572 // Array that maps high bytes to subHeaders: value is subHeader index * 8.
573 $subHeaderKeys[$i] = (TCPDF_STATIC::_getUSHORT($font, $offset) / 8);
574 $offset += 2;
575 if ($numSubHeaders < $subHeaderKeys[$i]) {
576 $numSubHeaders = $subHeaderKeys[$i];
577 }
578 }
579 // the number of subHeaders is equal to the max of subHeaderKeys + 1
580 ++$numSubHeaders;
581 // read subHeader structures
582 $subHeaders = array();
583 $numGlyphIndexArray = 0;
584 for ($k = 0; $k < $numSubHeaders; ++$k) {
585 $subHeaders[$k]['firstCode'] = TCPDF_STATIC::_getUSHORT($font, $offset);
586 $offset += 2;
587 $subHeaders[$k]['entryCount'] = TCPDF_STATIC::_getUSHORT($font, $offset);
588 $offset += 2;
589 $subHeaders[$k]['idDelta'] = TCPDF_STATIC::_getUSHORT($font, $offset);
590 $offset += 2;
591 $subHeaders[$k]['idRangeOffset'] = TCPDF_STATIC::_getUSHORT($font, $offset);
592 $offset += 2;
593 $subHeaders[$k]['idRangeOffset'] -= (2 + (($numSubHeaders - $k - 1) * 8));
594 $subHeaders[$k]['idRangeOffset'] /= 2;
595 $numGlyphIndexArray += $subHeaders[$k]['entryCount'];
596 }
597 for ($k = 0; $k < $numGlyphIndexArray; ++$k) {
598 $glyphIndexArray[$k] = TCPDF_STATIC::_getUSHORT($font, $offset);
599 $offset += 2;
600 }
601 for ($i = 0; $i < 256; ++$i) {
602 $k = $subHeaderKeys[$i];
603 if ($k == 0) {
604 // one byte code
605 $c = $i;
606 $g = $glyphIndexArray[0];
607 $ctg[$c] = $g;
608 } else {
609 // two bytes code
610 $start_byte = $subHeaders[$k]['firstCode'];
611 $end_byte = $start_byte + $subHeaders[$k]['entryCount'];
612 for ($j = $start_byte; $j < $end_byte; ++$j) {
613 // combine high and low bytes
614 $c = (($i << 8) + $j);
615 $idRangeOffset = ($subHeaders[$k]['idRangeOffset'] + $j - $subHeaders[$k]['firstCode']);
616 $g = ($glyphIndexArray[$idRangeOffset] + $subHeaders[$k]['idDelta']) % 65536;
617 if ($g < 0) {
618 $g = 0;
619 }
620 $ctg[$c] = $g;
621 }
622 }
623 }
624 break;
625 }
626 case 4: { // Format 4: Segment mapping to delta values
627 $length = TCPDF_STATIC::_getUSHORT($font, $offset);
628 $offset += 2;
629 $offset += 2; // skip version/language
630 $segCount = floor(TCPDF_STATIC::_getUSHORT($font, $offset) / 2);
631 $offset += 2;
632 $offset += 6; // skip searchRange, entrySelector, rangeShift
633 $endCount = array(); // array of end character codes for each segment
634 for ($k = 0; $k < $segCount; ++$k) {
635 $endCount[$k] = TCPDF_STATIC::_getUSHORT($font, $offset);
636 $offset += 2;
637 }
638 $offset += 2; // skip reservedPad
639 $startCount = array(); // array of start character codes for each segment
640 for ($k = 0; $k < $segCount; ++$k) {
641 $startCount[$k] = TCPDF_STATIC::_getUSHORT($font, $offset);
642 $offset += 2;
643 }
644 $idDelta = array(); // delta for all character codes in segment
645 for ($k = 0; $k < $segCount; ++$k) {
646 $idDelta[$k] = TCPDF_STATIC::_getUSHORT($font, $offset);
647 $offset += 2;
648 }
649 $idRangeOffset = array(); // Offsets into glyphIdArray or 0
650 for ($k = 0; $k < $segCount; ++$k) {
651 $idRangeOffset[$k] = TCPDF_STATIC::_getUSHORT($font, $offset);
652 $offset += 2;
653 }
654 $gidlen = (floor($length / 2) - 8 - (4 * $segCount));
655 $glyphIdArray = array(); // glyph index array
656 for ($k = 0; $k < $gidlen; ++$k) {
657 $glyphIdArray[$k] = TCPDF_STATIC::_getUSHORT($font, $offset);
658 $offset += 2;
659 }
660 for ($k = 0; $k < $segCount; ++$k) {
661 for ($c = $startCount[$k]; $c <= $endCount[$k]; ++$c) {
662 if ($idRangeOffset[$k] == 0) {
663 $g = ($idDelta[$k] + $c) % 65536;
664 } else {
665 $gid = (floor($idRangeOffset[$k] / 2) + ($c - $startCount[$k]) - ($segCount - $k));
666 $g = ($glyphIdArray[$gid] + $idDelta[$k]) % 65536;
667 }
668 if ($g < 0) {
669 $g = 0;
670 }
671 $ctg[$c] = $g;
672 }
673 }
674 break;
675 }
676 case 6: { // Format 6: Trimmed table mapping
677 $offset += 4; // skip length and version/language
678 $firstCode = TCPDF_STATIC::_getUSHORT($font, $offset);
679 $offset += 2;
680 $entryCount = TCPDF_STATIC::_getUSHORT($font, $offset);
681 $offset += 2;
682 for ($k = 0; $k < $entryCount; ++$k) {
683 $c = ($k + $firstCode);
684 $g = TCPDF_STATIC::_getUSHORT($font, $offset);
685 $offset += 2;
686 $ctg[$c] = $g;
687 }
688 break;
689 }
690 case 8: { // Format 8: Mixed 16-bit and 32-bit coverage
691 $offset += 10; // skip reserved, length and version/language
692 for ($k = 0; $k < 8192; ++$k) {
693 $is32[$k] = TCPDF_STATIC::_getBYTE($font, $offset);
694 ++$offset;
695 }
696 $nGroups = TCPDF_STATIC::_getULONG($font, $offset);
697 $offset += 4;
698 for ($i = 0; $i < $nGroups; ++$i) {
699 $startCharCode = TCPDF_STATIC::_getULONG($font, $offset);
700 $offset += 4;
701 $endCharCode = TCPDF_STATIC::_getULONG($font, $offset);
702 $offset += 4;
703 $startGlyphID = TCPDF_STATIC::_getULONG($font, $offset);
704 $offset += 4;
705 for ($k = $startCharCode; $k <= $endCharCode; ++$k) {
706 $is32idx = floor($c / 8);
707 if ((isset($is32[$is32idx])) AND (($is32[$is32idx] & (1 << (7 - ($c % 8)))) == 0)) {
708 $c = $k;
709 } else {
710 // 32 bit format
711 // convert to decimal (http://www.unicode.org/faq//utf_bom.html#utf16-4)
712 //LEAD_OFFSET = (0xD800 - (0x10000 >> 10)) = 55232
713 //SURROGATE_OFFSET = (0x10000 - (0xD800 << 10) - 0xDC00) = -56613888
714 $c = ((55232 + ($k >> 10)) << 10) + (0xDC00 + ($k & 0x3FF)) -56613888;
715 }
716 $ctg[$c] = 0;
717 ++$startGlyphID;
718 }
719 }
720 break;
721 }
722 case 10: { // Format 10: Trimmed array
723 $offset += 10; // skip reserved, length and version/language
724 $startCharCode = TCPDF_STATIC::_getULONG($font, $offset);
725 $offset += 4;
726 $numChars = TCPDF_STATIC::_getULONG($font, $offset);
727 $offset += 4;
728 for ($k = 0; $k < $numChars; ++$k) {
729 $c = ($k + $startCharCode);
730 $g = TCPDF_STATIC::_getUSHORT($font, $offset);
731 $ctg[$c] = $g;
732 $offset += 2;
733 }
734 break;
735 }
736 case 12: { // Format 12: Segmented coverage
737 $offset += 10; // skip length and version/language
738 $nGroups = TCPDF_STATIC::_getULONG($font, $offset);
739 $offset += 4;
740 for ($k = 0; $k < $nGroups; ++$k) {
741 $startCharCode = TCPDF_STATIC::_getULONG($font, $offset);
742 $offset += 4;
743 $endCharCode = TCPDF_STATIC::_getULONG($font, $offset);
744 $offset += 4;
745 $startGlyphCode = TCPDF_STATIC::_getULONG($font, $offset);
746 $offset += 4;
747 for ($c = $startCharCode; $c <= $endCharCode; ++$c) {
748 $ctg[$c] = $startGlyphCode;
749 ++$startGlyphCode;
750 }
751 }
752 break;
753 }
754 case 13: { // Format 13: Many-to-one range mappings
755 // to be implemented ...
756 break;
757 }
758 case 14: { // Format 14: Unicode Variation Sequences
759 // to be implemented ...
760 break;
761 }
762 }
763 }
764 }
765 if (!isset($ctg[0])) {
766 $ctg[0] = 0;
767 }
768 // get xHeight (height of x)
769 $offset = ($table['glyf']['offset'] + $indexToLoc[$ctg[120]] + 4);
770 $yMin = TCPDF_STATIC::_getFWORD($font, $offset);
771 $offset += 4;
772 $yMax = TCPDF_STATIC::_getFWORD($font, $offset);
773 $offset += 2;
774 $fmetric['XHeight'] = round(($yMax - $yMin) * $urk);
775 // get CapHeight (height of H)
776 $offset = ($table['glyf']['offset'] + $indexToLoc[$ctg[72]] + 4);
777 $yMin = TCPDF_STATIC::_getFWORD($font, $offset);
778 $offset += 4;
779 $yMax = TCPDF_STATIC::_getFWORD($font, $offset);
780 $offset += 2;
781 $fmetric['CapHeight'] = round(($yMax - $yMin) * $urk);
782 // ceate widths array
783 $cw = array();
784 $offset = $table['hmtx']['offset'];
785 for ($i = 0 ; $i < $numberOfHMetrics; ++$i) {
786 $cw[$i] = round(TCPDF_STATIC::_getUFWORD($font, $offset) * $urk);
787 $offset += 4; // skip lsb
788 }
789 if ($numberOfHMetrics < $numGlyphs) {
790 // fill missing widths with the last value
791 $cw = array_pad($cw, $numGlyphs, $cw[($numberOfHMetrics - 1)]);
792 }
793 $fmetric['MissingWidth'] = $cw[0];
794 $fmetric['cw'] = '';
795 $fmetric['cbbox'] = '';
796 for ($cid = 0; $cid <= 65535; ++$cid) {
797 if (isset($ctg[$cid])) {
798 if (isset($cw[$ctg[$cid]])) {
799 $fmetric['cw'] .= ','.$cid.'=>'.$cw[$ctg[$cid]];
800 }
801 if ($addcbbox AND isset($indexToLoc[$ctg[$cid]])) {
802 $offset = ($table['glyf']['offset'] + $indexToLoc[$ctg[$cid]]);
803 $xMin = round(TCPDF_STATIC::_getFWORD($font, $offset + 2) * $urk);
804 $yMin = round(TCPDF_STATIC::_getFWORD($font, $offset + 4) * $urk);
805 $xMax = round(TCPDF_STATIC::_getFWORD($font, $offset + 6) * $urk);
806 $yMax = round(TCPDF_STATIC::_getFWORD($font, $offset + 8) * $urk);
807 $fmetric['cbbox'] .= ','.$cid.'=>array('.$xMin.','.$yMin.','.$xMax.','.$yMax.')';
808 }
809 }
810 }
811 } // end of true type
812 if (($fmetric['type'] == 'TrueTypeUnicode') AND (count($ctg) == 256)) {
813 $fmetric['type'] = 'TrueType';
814 }
815 // ---------- create php font file ----------
816 $pfile = '<'.'?'.'php'."\n";
817 $pfile .= '// TCPDF FONT FILE DESCRIPTION'."\n";
818 $pfile .= '$type=\''.$fmetric['type'].'\';'."\n";
819 $pfile .= '$name=\''.$fmetric['name'].'\';'."\n";
820 $pfile .= '$up='.$fmetric['underlinePosition'].';'."\n";
821 $pfile .= '$ut='.$fmetric['underlineThickness'].';'."\n";
822 if ($fmetric['MissingWidth'] > 0) {
823 $pfile .= '$dw='.$fmetric['MissingWidth'].';'."\n";
824 } else {
825 $pfile .= '$dw='.$fmetric['AvgWidth'].';'."\n";
826 }
827 $pfile .= '$diff=\''.$fmetric['diff'].'\';'."\n";
828 if ($fmetric['type'] == 'Type1') {
829 // Type 1
830 $pfile .= '$enc=\''.$fmetric['enc'].'\';'."\n";
831 $pfile .= '$file=\''.$fmetric['file'].'\';'."\n";
832 $pfile .= '$size1='.$fmetric['size1'].';'."\n";
833 $pfile .= '$size2='.$fmetric['size2'].';'."\n";
834 } else {
835 $pfile .= '$originalsize='.$fmetric['originalsize'].';'."\n";
836 if ($fmetric['type'] == 'cidfont0') {
837 // CID-0
838 switch ($fonttype) {
839 case 'CID0JP': {
840 $pfile .= '// Japanese'."\n";
841 $pfile .= '$enc=\'UniJIS-UTF16-H\';'."\n";
842 $pfile .= '$cidinfo=array(\'Registry\'=>\'Adobe\', \'Ordering\'=>\'Japan1\',\'Supplement\'=>5);'."\n";
843 $pfile .= 'include(dirname(__FILE__).\'/uni2cid_aj16.php\');'."\n";
844 break;
845 }
846 case 'CID0KR': {
847 $pfile .= '// Korean'."\n";
848 $pfile .= '$enc=\'UniKS-UTF16-H\';'."\n";
849 $pfile .= '$cidinfo=array(\'Registry\'=>\'Adobe\', \'Ordering\'=>\'Korea1\',\'Supplement\'=>0);'."\n";
850 $pfile .= 'include(dirname(__FILE__).\'/uni2cid_ak12.php\');'."\n";
851 break;
852 }
853 case 'CID0CS': {
854 $pfile .= '// Chinese Simplified'."\n";
855 $pfile .= '$enc=\'UniGB-UTF16-H\';'."\n";
856 $pfile .= '$cidinfo=array(\'Registry\'=>\'Adobe\', \'Ordering\'=>\'GB1\',\'Supplement\'=>2);'."\n";
857 $pfile .= 'include(dirname(__FILE__).\'/uni2cid_ag15.php\');'."\n";
858 break;
859 }
860 case 'CID0CT':
861 default: {
862 $pfile .= '// Chinese Traditional'."\n";
863 $pfile .= '$enc=\'UniCNS-UTF16-H\';'."\n";
864 $pfile .= '$cidinfo=array(\'Registry\'=>\'Adobe\', \'Ordering\'=>\'CNS1\',\'Supplement\'=>0);'."\n";
865 $pfile .= 'include(dirname(__FILE__).\'/uni2cid_aj16.php\');'."\n";
866 break;
867 }
868 }
869 } else {
870 // TrueType
871 $pfile .= '$enc=\''.$fmetric['enc'].'\';'."\n";
872 $pfile .= '$file=\''.$fmetric['file'].'\';'."\n";
873 $pfile .= '$ctg=\''.$fmetric['ctg'].'\';'."\n";
874 // create CIDToGIDMap
875 $cidtogidmap = str_pad('', 131072, "\x00"); // (256 * 256 * 2) = 131072
876 foreach ($ctg as $cid => $gid) {
877 $cidtogidmap = self::updateCIDtoGIDmap($cidtogidmap, $cid, $ctg[$cid]);
878 }
879 // store compressed CIDToGIDMap
880 $fp = fopen($outpath.$fmetric['ctg'], 'wb');
881 fwrite($fp, gzcompress($cidtogidmap));
882 fclose($fp);
883 }
884 }
885 $pfile .= '$desc=array(';
886 $pfile .= '\'Flags\'=>'.$fmetric['Flags'].',';
887 $pfile .= '\'FontBBox\'=>\'['.$fmetric['bbox'].']\',';
888 $pfile .= '\'ItalicAngle\'=>'.$fmetric['italicAngle'].',';
889 $pfile .= '\'Ascent\'=>'.$fmetric['Ascent'].',';
890 $pfile .= '\'Descent\'=>'.$fmetric['Descent'].',';
891 $pfile .= '\'Leading\'=>'.$fmetric['Leading'].',';
892 $pfile .= '\'CapHeight\'=>'.$fmetric['CapHeight'].',';
893 $pfile .= '\'XHeight\'=>'.$fmetric['XHeight'].',';
894 $pfile .= '\'StemV\'=>'.$fmetric['StemV'].',';
895 $pfile .= '\'StemH\'=>'.$fmetric['StemH'].',';
896 $pfile .= '\'AvgWidth\'=>'.$fmetric['AvgWidth'].',';
897 $pfile .= '\'MaxWidth\'=>'.$fmetric['MaxWidth'].',';
898 $pfile .= '\'MissingWidth\'=>'.$fmetric['MissingWidth'].'';
899 $pfile .= ');'."\n";
900 if (!empty($fmetric['cbbox'])) {
901 $pfile .= '$cbbox=array('.substr($fmetric['cbbox'], 1).');'."\n";
902 }
903 $pfile .= '$cw=array('.substr($fmetric['cw'], 1).');'."\n";
904 $pfile .= '// --- EOF ---'."\n";
905 // store file
906 $fp = fopen($outpath.$font_name.'.php', 'w');
907 fwrite($fp, $pfile);
908 fclose($fp);
909 // return TCPDF font name
910 return $font_name;
911 }
912
913 /**
914 * Returs the checksum of a TTF table.
915 * @param $table (string) table to check
916 * @param $length (int) length of table in bytes
917 * @return int checksum
918 * @author Nicola Asuni
919 * @since 5.2.000 (2010-06-02)
920 * @public static
921 */
922 public static function _getTTFtableChecksum($table, $length) {
923 $sum = 0;
924 $tlen = ($length / 4);
925 $offset = 0;
926 for ($i = 0; $i < $tlen; ++$i) {
927 $v = unpack('Ni', substr($table, $offset, 4));
928 $sum += $v['i'];
929 $offset += 4;
930 }
931 $sum = unpack('Ni', pack('N', $sum));
932 return $sum['i'];
933 }
934
935 /**
936 * Returns a subset of the TrueType font data without the unused glyphs.
937 * @param $font (string) TrueType font data.
938 * @param $subsetchars (array) Array of used characters (the glyphs to keep).
939 * @return (string) A subset of TrueType font data without the unused glyphs.
940 * @author Nicola Asuni
941 * @since 5.2.000 (2010-06-02)
942 * @public static
943 */
944 public static function _getTrueTypeFontSubset($font, $subsetchars) {
945 ksort($subsetchars);
946 $offset = 0; // offset position of the font data
947 if (TCPDF_STATIC::_getULONG($font, $offset) != 0x10000) {
948 // sfnt version must be 0x00010000 for TrueType version 1.0.
949 return $font;
950 }
951 $offset += 4;
952 // get number of tables
953 $numTables = TCPDF_STATIC::_getUSHORT($font, $offset);
954 $offset += 2;
955 // skip searchRange, entrySelector and rangeShift
956 $offset += 6;
957 // tables array
958 $table = array();
959 // for each table
960 for ($i = 0; $i < $numTables; ++$i) {
961 // get table info
962 $tag = substr($font, $offset, 4);
963 $offset += 4;
964 $table[$tag] = array();
965 $table[$tag]['checkSum'] = TCPDF_STATIC::_getULONG($font, $offset);
966 $offset += 4;
967 $table[$tag]['offset'] = TCPDF_STATIC::_getULONG($font, $offset);
968 $offset += 4;
969 $table[$tag]['length'] = TCPDF_STATIC::_getULONG($font, $offset);
970 $offset += 4;
971 }
972 // check magicNumber
973 $offset = $table['head']['offset'] + 12;
974 if (TCPDF_STATIC::_getULONG($font, $offset) != 0x5F0F3CF5) {
975 // magicNumber must be 0x5F0F3CF5
976 return $font;
977 }
978 $offset += 4;
979 // get offset mode (indexToLocFormat : 0 = short, 1 = long)
980 $offset = $table['head']['offset'] + 50;
981 $short_offset = (TCPDF_STATIC::_getSHORT($font, $offset) == 0);
982 $offset += 2;
983 // get the offsets to the locations of the glyphs in the font, relative to the beginning of the glyphData table
984 $indexToLoc = array();
985 $offset = $table['loca']['offset'];
986 if ($short_offset) {
987 // short version
988 $tot_num_glyphs = floor($table['loca']['length'] / 2); // numGlyphs + 1
989 for ($i = 0; $i < $tot_num_glyphs; ++$i) {
990 $indexToLoc[$i] = TCPDF_STATIC::_getUSHORT($font, $offset) * 2;
991 $offset += 2;
992 }
993 } else {
994 // long version
995 $tot_num_glyphs = ($table['loca']['length'] / 4); // numGlyphs + 1
996 for ($i = 0; $i < $tot_num_glyphs; ++$i) {
997 $indexToLoc[$i] = TCPDF_STATIC::_getULONG($font, $offset);
998 $offset += 4;
999 }
1000 }
1001 // get glyphs indexes of chars from cmap table
1002 $subsetglyphs = array(); // glyph IDs on key
1003 $subsetglyphs[0] = true; // character codes that do not correspond to any glyph in the font should be mapped to glyph index 0
1004 $offset = $table['cmap']['offset'] + 2;
1005 $numEncodingTables = TCPDF_STATIC::_getUSHORT($font, $offset);
1006 $offset += 2;
1007 $encodingTables = array();
1008 for ($i = 0; $i < $numEncodingTables; ++$i) {
1009 $encodingTables[$i]['platformID'] = TCPDF_STATIC::_getUSHORT($font, $offset);
1010 $offset += 2;
1011 $encodingTables[$i]['encodingID'] = TCPDF_STATIC::_getUSHORT($font, $offset);
1012 $offset += 2;
1013 $encodingTables[$i]['offset'] = TCPDF_STATIC::_getULONG($font, $offset);
1014 $offset += 4;
1015 }
1016 foreach ($encodingTables as $enctable) {
1017 // get all platforms and encodings
1018 $offset = $table['cmap']['offset'] + $enctable['offset'];
1019 $format = TCPDF_STATIC::_getUSHORT($font, $offset);
1020 $offset += 2;
1021 switch ($format) {
1022 case 0: { // Format 0: Byte encoding table
1023 $offset += 4; // skip length and version/language
1024 for ($c = 0; $c < 256; ++$c) {
1025 if (isset($subsetchars[$c])) {
1026 $g = TCPDF_STATIC::_getBYTE($font, $offset);
1027 $subsetglyphs[$g] = true;
1028 }
1029 ++$offset;
1030 }
1031 break;
1032 }
1033 case 2: { // Format 2: High-byte mapping through table
1034 $offset += 4; // skip length and version/language
1035 $numSubHeaders = 0;
1036 for ($i = 0; $i < 256; ++$i) {
1037 // Array that maps high bytes to subHeaders: value is subHeader index * 8.
1038 $subHeaderKeys[$i] = (TCPDF_STATIC::_getUSHORT($font, $offset) / 8);
1039 $offset += 2;
1040 if ($numSubHeaders < $subHeaderKeys[$i]) {
1041 $numSubHeaders = $subHeaderKeys[$i];
1042 }
1043 }
1044 // the number of subHeaders is equal to the max of subHeaderKeys + 1
1045 ++$numSubHeaders;
1046 // read subHeader structures
1047 $subHeaders = array();
1048 $numGlyphIndexArray = 0;
1049 for ($k = 0; $k < $numSubHeaders; ++$k) {
1050 $subHeaders[$k]['firstCode'] = TCPDF_STATIC::_getUSHORT($font, $offset);
1051 $offset += 2;
1052 $subHeaders[$k]['entryCount'] = TCPDF_STATIC::_getUSHORT($font, $offset);
1053 $offset += 2;
1054 $subHeaders[$k]['idDelta'] = TCPDF_STATIC::_getUSHORT($font, $offset);
1055 $offset += 2;
1056 $subHeaders[$k]['idRangeOffset'] = TCPDF_STATIC::_getUSHORT($font, $offset);
1057 $offset += 2;
1058 $subHeaders[$k]['idRangeOffset'] -= (2 + (($numSubHeaders - $k - 1) * 8));
1059 $subHeaders[$k]['idRangeOffset'] /= 2;
1060 $numGlyphIndexArray += $subHeaders[$k]['entryCount'];
1061 }
1062 for ($k = 0; $k < $numGlyphIndexArray; ++$k) {
1063 $glyphIndexArray[$k] = TCPDF_STATIC::_getUSHORT($font, $offset);
1064 $offset += 2;
1065 }
1066 for ($i = 0; $i < 256; ++$i) {
1067 $k = $subHeaderKeys[$i];
1068 if ($k == 0) {
1069 // one byte code
1070 $c = $i;
1071 if (isset($subsetchars[$c])) {
1072 $g = $glyphIndexArray[0];
1073 $subsetglyphs[$g] = true;
1074 }
1075 } else {
1076 // two bytes code
1077 $start_byte = $subHeaders[$k]['firstCode'];
1078 $end_byte = $start_byte + $subHeaders[$k]['entryCount'];
1079 for ($j = $start_byte; $j < $end_byte; ++$j) {
1080 // combine high and low bytes
1081 $c = (($i << 8) + $j);
1082 if (isset($subsetchars[$c])) {
1083 $idRangeOffset = ($subHeaders[$k]['idRangeOffset'] + $j - $subHeaders[$k]['firstCode']);
1084 $g = ($glyphIndexArray[$idRangeOffset] + $subHeaders[$k]['idDelta']) % 65536;
1085 if ($g < 0) {
1086 $g = 0;
1087 }
1088 $subsetglyphs[$g] = true;
1089 }
1090 }
1091 }
1092 }
1093 break;
1094 }
1095 case 4: { // Format 4: Segment mapping to delta values
1096 $length = TCPDF_STATIC::_getUSHORT($font, $offset);
1097 $offset += 2;
1098 $offset += 2; // skip version/language
1099 $segCount = floor(TCPDF_STATIC::_getUSHORT($font, $offset) / 2);
1100 $offset += 2;
1101 $offset += 6; // skip searchRange, entrySelector, rangeShift
1102 $endCount = array(); // array of end character codes for each segment
1103 for ($k = 0; $k < $segCount; ++$k) {
1104 $endCount[$k] = TCPDF_STATIC::_getUSHORT($font, $offset);
1105 $offset += 2;
1106 }
1107 $offset += 2; // skip reservedPad
1108 $startCount = array(); // array of start character codes for each segment
1109 for ($k = 0; $k < $segCount; ++$k) {
1110 $startCount[$k] = TCPDF_STATIC::_getUSHORT($font, $offset);
1111 $offset += 2;
1112 }
1113 $idDelta = array(); // delta for all character codes in segment
1114 for ($k = 0; $k < $segCount; ++$k) {
1115 $idDelta[$k] = TCPDF_STATIC::_getUSHORT($font, $offset);
1116 $offset += 2;
1117 }
1118 $idRangeOffset = array(); // Offsets into glyphIdArray or 0
1119 for ($k = 0; $k < $segCount; ++$k) {
1120 $idRangeOffset[$k] = TCPDF_STATIC::_getUSHORT($font, $offset);
1121 $offset += 2;
1122 }
1123 $gidlen = (floor($length / 2) - 8 - (4 * $segCount));
1124 $glyphIdArray = array(); // glyph index array
1125 for ($k = 0; $k < $gidlen; ++$k) {
1126 $glyphIdArray[$k] = TCPDF_STATIC::_getUSHORT($font, $offset);
1127 $offset += 2;
1128 }
1129 for ($k = 0; $k < $segCount; ++$k) {
1130 for ($c = $startCount[$k]; $c <= $endCount[$k]; ++$c) {
1131 if (isset($subsetchars[$c])) {
1132 if ($idRangeOffset[$k] == 0) {
1133 $g = ($idDelta[$k] + $c) % 65536;
1134 } else {
1135 $gid = (floor($idRangeOffset[$k] / 2) + ($c - $startCount[$k]) - ($segCount - $k));
1136 $g = ($glyphIdArray[$gid] + $idDelta[$k]) % 65536;
1137 }
1138 if ($g < 0) {
1139 $g = 0;
1140 }
1141 $subsetglyphs[$g] = true;
1142 }
1143 }
1144 }
1145 break;
1146 }
1147 case 6: { // Format 6: Trimmed table mapping
1148 $offset += 4; // skip length and version/language
1149 $firstCode = TCPDF_STATIC::_getUSHORT($font, $offset);
1150 $offset += 2;
1151 $entryCount = TCPDF_STATIC::_getUSHORT($font, $offset);
1152 $offset += 2;
1153 for ($k = 0; $k < $entryCount; ++$k) {
1154 $c = ($k + $firstCode);
1155 if (isset($subsetchars[$c])) {
1156 $g = TCPDF_STATIC::_getUSHORT($font, $offset);
1157 $subsetglyphs[$g] = true;
1158 }
1159 $offset += 2;
1160 }
1161 break;
1162 }
1163 case 8: { // Format 8: Mixed 16-bit and 32-bit coverage
1164 $offset += 10; // skip reserved, length and version/language
1165 for ($k = 0; $k < 8192; ++$k) {
1166 $is32[$k] = TCPDF_STATIC::_getBYTE($font, $offset);
1167 ++$offset;
1168 }
1169 $nGroups = TCPDF_STATIC::_getULONG($font, $offset);
1170 $offset += 4;
1171 for ($i = 0; $i < $nGroups; ++$i) {
1172 $startCharCode = TCPDF_STATIC::_getULONG($font, $offset);
1173 $offset += 4;
1174 $endCharCode = TCPDF_STATIC::_getULONG($font, $offset);
1175 $offset += 4;
1176 $startGlyphID = TCPDF_STATIC::_getULONG($font, $offset);
1177 $offset += 4;
1178 for ($k = $startCharCode; $k <= $endCharCode; ++$k) {
1179 $is32idx = floor($c / 8);
1180 if ((isset($is32[$is32idx])) AND (($is32[$is32idx] & (1 << (7 - ($c % 8)))) == 0)) {
1181 $c = $k;
1182 } else {
1183 // 32 bit format
1184 // convert to decimal (http://www.unicode.org/faq//utf_bom.html#utf16-4)
1185 //LEAD_OFFSET = (0xD800 - (0x10000 >> 10)) = 55232
1186 //SURROGATE_OFFSET = (0x10000 - (0xD800 << 10) - 0xDC00) = -56613888
1187 $c = ((55232 + ($k >> 10)) << 10) + (0xDC00 + ($k & 0x3FF)) -56613888;
1188 }
1189 if (isset($subsetchars[$c])) {
1190 $subsetglyphs[$startGlyphID] = true;
1191 }
1192 ++$startGlyphID;
1193 }
1194 }
1195 break;
1196 }
1197 case 10: { // Format 10: Trimmed array
1198 $offset += 10; // skip reserved, length and version/language
1199 $startCharCode = TCPDF_STATIC::_getULONG($font, $offset);
1200 $offset += 4;
1201 $numChars = TCPDF_STATIC::_getULONG($font, $offset);
1202 $offset += 4;
1203 for ($k = 0; $k < $numChars; ++$k) {
1204 $c = ($k + $startCharCode);
1205 if (isset($subsetchars[$c])) {
1206 $g = TCPDF_STATIC::_getUSHORT($font, $offset);
1207 $subsetglyphs[$g] = true;
1208 }
1209 $offset += 2;
1210 }
1211 break;
1212 }
1213 case 12: { // Format 12: Segmented coverage
1214 $offset += 10; // skip length and version/language
1215 $nGroups = TCPDF_STATIC::_getULONG($font, $offset);
1216 $offset += 4;
1217 for ($k = 0; $k < $nGroups; ++$k) {
1218 $startCharCode = TCPDF_STATIC::_getULONG($font, $offset);
1219 $offset += 4;
1220 $endCharCode = TCPDF_STATIC::_getULONG($font, $offset);
1221 $offset += 4;
1222 $startGlyphCode = TCPDF_STATIC::_getULONG($font, $offset);
1223 $offset += 4;
1224 for ($c = $startCharCode; $c <= $endCharCode; ++$c) {
1225 if (isset($subsetchars[$c])) {
1226 $subsetglyphs[$startGlyphCode] = true;
1227 }
1228 ++$startGlyphCode;
1229 }
1230 }
1231 break;
1232 }
1233 case 13: { // Format 13: Many-to-one range mappings
1234 // to be implemented ...
1235 break;
1236 }
1237 case 14: { // Format 14: Unicode Variation Sequences
1238 // to be implemented ...
1239 break;
1240 }
1241 }
1242 }
1243 // include all parts of composite glyphs
1244 $new_sga = $subsetglyphs;
1245 while (!empty($new_sga)) {
1246 $sga = $new_sga;
1247 $new_sga = array();
1248 foreach ($sga as $key => $val) {
1249 if (isset($indexToLoc[$key])) {
1250 $offset = ($table['glyf']['offset'] + $indexToLoc[$key]);
1251 $numberOfContours = TCPDF_STATIC::_getSHORT($font, $offset);
1252 $offset += 2;
1253 if ($numberOfContours < 0) { // composite glyph
1254 $offset += 8; // skip xMin, yMin, xMax, yMax
1255 do {
1256 $flags = TCPDF_STATIC::_getUSHORT($font, $offset);
1257 $offset += 2;
1258 $glyphIndex = TCPDF_STATIC::_getUSHORT($font, $offset);
1259 $offset += 2;
1260 if (!isset($subsetglyphs[$glyphIndex])) {
1261 // add missing glyphs
1262 $new_sga[$glyphIndex] = true;
1263 }
1264 // skip some bytes by case
1265 if ($flags & 1) {
1266 $offset += 4;
1267 } else {
1268 $offset += 2;
1269 }
1270 if ($flags & 8) {
1271 $offset += 2;
1272 } elseif ($flags & 64) {
1273 $offset += 4;
1274 } elseif ($flags & 128) {
1275 $offset += 8;
1276 }
1277 } while ($flags & 32);
1278 }
1279 }
1280 }
1281 $subsetglyphs += $new_sga;
1282 }
1283 // sort glyphs by key (and remove duplicates)
1284 ksort($subsetglyphs);
1285 // build new glyf and loca tables
1286 $glyf = '';
1287 $loca = '';
1288 $offset = 0;
1289 $glyf_offset = $table['glyf']['offset'];
1290 for ($i = 0; $i < $tot_num_glyphs; ++$i) {
1291 if (isset($subsetglyphs[$i])) {
1292 $length = ($indexToLoc[($i + 1)] - $indexToLoc[$i]);
1293 $glyf .= substr($font, ($glyf_offset + $indexToLoc[$i]), $length);
1294 } else {
1295 $length = 0;
1296 }
1297 if ($short_offset) {
1298 $loca .= pack('n', floor($offset / 2));
1299 } else {
1300 $loca .= pack('N', $offset);
1301 }
1302 $offset += $length;
1303 }
1304 // array of table names to preserve (loca and glyf tables will be added later)
1305 // the cmap table is not needed and shall not be present, since the mapping from character codes to glyph descriptions is provided separately
1306 $table_names = array ('head', 'hhea', 'hmtx', 'maxp', 'cvt ', 'fpgm', 'prep'); // minimum required table names
1307 // get the tables to preserve
1308 $offset = 12;
1309 foreach ($table as $tag => $val) {
1310 if (in_array($tag, $table_names)) {
1311 $table[$tag]['data'] = substr($font, $table[$tag]['offset'], $table[$tag]['length']);
1312 if ($tag == 'head') {
1313 // set the checkSumAdjustment to 0
1314 $table[$tag]['data'] = substr($table[$tag]['data'], 0, 8)."\x0\x0\x0\x0".substr($table[$tag]['data'], 12);
1315 }
1316 $pad = 4 - ($table[$tag]['length'] % 4);
1317 if ($pad != 4) {
1318 // the length of a table must be a multiple of four bytes
1319 $table[$tag]['length'] += $pad;
1320 $table[$tag]['data'] .= str_repeat("\x0", $pad);
1321 }
1322 $table[$tag]['offset'] = $offset;
1323 $offset += $table[$tag]['length'];
1324 // check sum is not changed (so keep the following line commented)
1325 //$table[$tag]['checkSum'] = self::_getTTFtableChecksum($table[$tag]['data'], $table[$tag]['length']);
1326 } else {
1327 unset($table[$tag]);
1328 }
1329 }
1330 // add loca
1331 $table['loca']['data'] = $loca;
1332 $table['loca']['length'] = strlen($loca);
1333 $pad = 4 - ($table['loca']['length'] % 4);
1334 if ($pad != 4) {
1335 // the length of a table must be a multiple of four bytes
1336 $table['loca']['length'] += $pad;
1337 $table['loca']['data'] .= str_repeat("\x0", $pad);
1338 }
1339 $table['loca']['offset'] = $offset;
1340 $table['loca']['checkSum'] = self::_getTTFtableChecksum($table['loca']['data'], $table['loca']['length']);
1341 $offset += $table['loca']['length'];
1342 // add glyf
1343 $table['glyf']['data'] = $glyf;
1344 $table['glyf']['length'] = strlen($glyf);
1345 $pad = 4 - ($table['glyf']['length'] % 4);
1346 if ($pad != 4) {
1347 // the length of a table must be a multiple of four bytes
1348 $table['glyf']['length'] += $pad;
1349 $table['glyf']['data'] .= str_repeat("\x0", $pad);
1350 }
1351 $table['glyf']['offset'] = $offset;
1352 $table['glyf']['checkSum'] = self::_getTTFtableChecksum($table['glyf']['data'], $table['glyf']['length']);
1353 // rebuild font
1354 $font = '';
1355 $font .= pack('N', 0x10000); // sfnt version
1356 $numTables = count($table);
1357 $font .= pack('n', $numTables); // numTables
1358 $entrySelector = floor(log($numTables, 2));
1359 $searchRange = pow(2, $entrySelector) * 16;
1360 $rangeShift = ($numTables * 16) - $searchRange;
1361 $font .= pack('n', $searchRange); // searchRange
1362 $font .= pack('n', $entrySelector); // entrySelector
1363 $font .= pack('n', $rangeShift); // rangeShift
1364 $offset = ($numTables * 16);
1365 foreach ($table as $tag => $data) {
1366 $font .= $tag; // tag
1367 $font .= pack('N', $data['checkSum']); // checkSum
1368 $font .= pack('N', ($data['offset'] + $offset)); // offset
1369 $font .= pack('N', $data['length']); // length
1370 }
1371 foreach ($table as $data) {
1372 $font .= $data['data'];
1373 }
1374 // set checkSumAdjustment on head table
1375 $checkSumAdjustment = 0xB1B0AFBA - self::_getTTFtableChecksum($font, strlen($font));
1376 $font = substr($font, 0, $table['head']['offset'] + 8).pack('N', $checkSumAdjustment).substr($font, $table['head']['offset'] + 12);
1377 return $font;
1378 }
1379
1380 /**
1381 * Outputs font widths
1382 * @param $font (array) font data
1383 * @param $cidoffset (int) offset for CID values
1384 * @return PDF command string for font widths
1385 * @author Nicola Asuni
1386 * @since 4.4.000 (2008-12-07)
1387 * @public static
1388 */
1389 public static function _putfontwidths($font, $cidoffset=0) {
1390 ksort($font['cw']);
1391 $rangeid = 0;
1392 $range = array();
1393 $prevcid = -2;
1394 $prevwidth = -1;
1395 $interval = false;
1396 // for each character
1397 foreach ($font['cw'] as $cid => $width) {
1398 $cid -= $cidoffset;
1399 if ($font['subset'] AND (!isset($font['subsetchars'][$cid]))) {
1400 // ignore the unused characters (font subsetting)
1401 continue;
1402 }
1403 if ($width != $font['dw']) {
1404 if ($cid == ($prevcid + 1)) {
1405 // consecutive CID
1406 if ($width == $prevwidth) {
1407 if ($width == $range[$rangeid][0]) {
1408 $range[$rangeid][] = $width;
1409 } else {
1410 array_pop($range[$rangeid]);
1411 // new range
1412 $rangeid = $prevcid;
1413 $range[$rangeid] = array();
1414 $range[$rangeid][] = $prevwidth;
1415 $range[$rangeid][] = $width;
1416 }
1417 $interval = true;
1418 $range[$rangeid]['interval'] = true;
1419 } else {
1420 if ($interval) {
1421 // new range
1422 $rangeid = $cid;
1423 $range[$rangeid] = array();
1424 $range[$rangeid][] = $width;
1425 } else {
1426 $range[$rangeid][] = $width;
1427 }
1428 $interval = false;
1429 }
1430 } else {
1431 // new range
1432 $rangeid = $cid;
1433 $range[$rangeid] = array();
1434 $range[$rangeid][] = $width;
1435 $interval = false;
1436 }
1437 $prevcid = $cid;
1438 $prevwidth = $width;
1439 }
1440 }
1441 // optimize ranges
1442 $prevk = -1;
1443 $nextk = -1;
1444 $prevint = false;
1445 foreach ($range as $k => $ws) {
1446 $cws = count($ws);
1447 if (($k == $nextk) AND (!$prevint) AND ((!isset($ws['interval'])) OR ($cws < 4))) {
1448 if (isset($range[$k]['interval'])) {
1449 unset($range[$k]['interval']);
1450 }
1451 $range[$prevk] = array_merge($range[$prevk], $range[$k]);
1452 unset($range[$k]);
1453 } else {
1454 $prevk = $k;
1455 }
1456 $nextk = $k + $cws;
1457 if (isset($ws['interval'])) {
1458 if ($cws > 3) {
1459 $prevint = true;
1460 } else {
1461 $prevint = false;
1462 }
1463 if (isset($range[$k]['interval'])) {
1464 unset($range[$k]['interval']);
1465 }
1466 --$nextk;
1467 } else {
1468 $prevint = false;
1469 }
1470 }
1471 // output data
1472 $w = '';
1473 foreach ($range as $k => $ws) {
1474 if (count(array_count_values($ws)) == 1) {
1475 // interval mode is more compact
1476 $w .= ' '.$k.' '.($k + count($ws) - 1).' '.$ws[0];
1477 } else {
1478 // range mode
1479 $w .= ' '.$k.' [ '.implode(' ', $ws).' ]';
1480 }
1481 }
1482 return '/W ['.$w.' ]';
1483 }
1484
1485 /**
1486 * Returns the unicode caracter specified by the value
1487 * @param $c (int) UTF-8 value
1488 * @param $unicode (boolean) True if we are in unicode mode, false otherwise.
1489 * @return Returns the specified character.
1490 * @since 2.3.000 (2008-03-05)
1491 * @public static
1492 */
1493 public static function unichr($c, $unicode=true) {
1494 if (!$unicode) {
1495 return chr($c);
1496 } elseif ($c <= 0x7F) {
1497 // one byte
1498 return chr($c);
1499 } elseif ($c <= 0x7FF) {
1500 // two bytes
1501 return chr(0xC0 | $c >> 6).chr(0x80 | $c & 0x3F);
1502 } elseif ($c <= 0xFFFF) {
1503 // three bytes
1504 return chr(0xE0 | $c >> 12).chr(0x80 | $c >> 6 & 0x3F).chr(0x80 | $c & 0x3F);
1505 } elseif ($c <= 0x10FFFF) {
1506 // four bytes
1507 return chr(0xF0 | $c >> 18).chr(0x80 | $c >> 12 & 0x3F).chr(0x80 | $c >> 6 & 0x3F).chr(0x80 | $c & 0x3F);
1508 } else {
1509 return '';
1510 }
1511 }
1512
1513 /**
1514 * Returns the unicode caracter specified by UTF-8 value
1515 * @param $c (int) UTF-8 value
1516 * @return Returns the specified character.
1517 * @public static
1518 */
1519 public static function unichrUnicode($c) {
1520 return self::unichr($c, true);
1521 }
1522
1523 /**
1524 * Returns the unicode caracter specified by ASCII value
1525 * @param $c (int) UTF-8 value
1526 * @return Returns the specified character.
1527 * @public static
1528 */
1529 public static function unichrASCII($c) {
1530 return self::unichr($c, false);
1531 }
1532
1533 /**
1534 * Converts array of UTF-8 characters to UTF16-BE string.<br>
1535 * Based on: http://www.faqs.org/rfcs/rfc2781.html
1536 * <pre>
1537 * Encoding UTF-16:
1538 *
1539 * Encoding of a single character from an ISO 10646 character value to
1540 * UTF-16 proceeds as follows. Let U be the character number, no greater
1541 * than 0x10FFFF.
1542 *
1543 * 1) If U < 0x10000, encode U as a 16-bit unsigned integer and
1544 * terminate.
1545 *
1546 * 2) Let U' = U - 0x10000. Because U is less than or equal to 0x10FFFF,
1547 * U' must be less than or equal to 0xFFFFF. That is, U' can be
1548 * represented in 20 bits.
1549 *
1550 * 3) Initialize two 16-bit unsigned integers, W1 and W2, to 0xD800 and
1551 * 0xDC00, respectively. These integers each have 10 bits free to
1552 * encode the character value, for a total of 20 bits.
1553 *
1554 * 4) Assign the 10 high-order bits of the 20-bit U' to the 10 low-order
1555 * bits of W1 and the 10 low-order bits of U' to the 10 low-order
1556 * bits of W2. Terminate.
1557 *
1558 * Graphically, steps 2 through 4 look like:
1559 * U' = yyyyyyyyyyxxxxxxxxxx
1560 * W1 = 110110yyyyyyyyyy
1561 * W2 = 110111xxxxxxxxxx
1562 * </pre>
1563 * @param $unicode (array) array containing UTF-8 unicode values
1564 * @param $setbom (boolean) if true set the Byte Order Mark (BOM = 0xFEFF)
1565 * @return string
1566 * @protected
1567 * @author Nicola Asuni
1568 * @since 2.1.000 (2008-01-08)
1569 * @public static
1570 */
1571 public static function arrUTF8ToUTF16BE($unicode, $setbom=false) {
1572 $outstr = ''; // string to be returned
1573 if ($setbom) {
1574 $outstr .= "\xFE\xFF"; // Byte Order Mark (BOM)
1575 }
1576 foreach ($unicode as $char) {
1577 if ($char == 0x200b) {
1578 // skip Unicode Character 'ZERO WIDTH SPACE' (DEC:8203, U+200B)
1579 } elseif ($char == 0xFFFD) {
1580 $outstr .= "\xFF\xFD"; // replacement character
1581 } elseif ($char < 0x10000) {
1582 $outstr .= chr($char >> 0x08);
1583 $outstr .= chr($char & 0xFF);
1584 } else {
1585 $char -= 0x10000;
1586 $w1 = 0xD800 | ($char >> 0x0a);
1587 $w2 = 0xDC00 | ($char & 0x3FF);
1588 $outstr .= chr($w1 >> 0x08);
1589 $outstr .= chr($w1 & 0xFF);
1590 $outstr .= chr($w2 >> 0x08);
1591 $outstr .= chr($w2 & 0xFF);
1592 }
1593 }
1594 return $outstr;
1595 }
1596
1597 /**
1598 * Convert an array of UTF8 values to array of unicode characters
1599 * @param $ta (array) The input array of UTF8 values.
1600 * @param $isunicode (boolean) True for Unicode mode, false otherwise.
1601 * @return Return array of unicode characters
1602 * @since 4.5.037 (2009-04-07)
1603 * @public static
1604 */
1605 public static function UTF8ArrayToUniArray($ta, $isunicode=true) {
1606 if ($isunicode) {
1607 return array_map(array('TCPDF_FONTS', 'unichrUnicode'), $ta);
1608 }
1609 return array_map(array('TCPDF_FONTS', 'unichrASCII'), $ta);
1610 }
1611
1612 /**
1613 * Extract a slice of the $strarr array and return it as string.
1614 * @param $strarr (string) The input array of characters.
1615 * @param $start (int) the starting element of $strarr.
1616 * @param $end (int) first element that will not be returned.
1617 * @param $unicode (boolean) True if we are in unicode mode, false otherwise.
1618 * @return Return part of a string
1619 * @public static
1620 */
1621 public static function UTF8ArrSubString($strarr, $start='', $end='', $unicode=true) {
1622 if (strlen($start) == 0) {
1623 $start = 0;
1624 }
1625 if (strlen($end) == 0) {
1626 $end = count($strarr);
1627 }
1628 $string = '';
1629 for ($i = $start; $i < $end; ++$i) {
1630 $string .= self::unichr($strarr[$i], $unicode);
1631 }
1632 return $string;
1633 }
1634
1635 /**
1636 * Extract a slice of the $uniarr array and return it as string.
1637 * @param $uniarr (string) The input array of characters.
1638 * @param $start (int) the starting element of $strarr.
1639 * @param $end (int) first element that will not be returned.
1640 * @return Return part of a string
1641 * @since 4.5.037 (2009-04-07)
1642 * @public static
1643 */
1644 public static function UniArrSubString($uniarr, $start='', $end='') {
1645 if (strlen($start) == 0) {
1646 $start = 0;
1647 }
1648 if (strlen($end) == 0) {
1649 $end = count($uniarr);
1650 }
1651 $string = '';
1652 for ($i=$start; $i < $end; ++$i) {
1653 $string .= $uniarr[$i];
1654 }
1655 return $string;
1656 }
1657
1658 /**
1659 * Update the CIDToGIDMap string with a new value.
1660 * @param $map (string) CIDToGIDMap.
1661 * @param $cid (int) CID value.
1662 * @param $gid (int) GID value.
1663 * @return (string) CIDToGIDMap.
1664 * @author Nicola Asuni
1665 * @since 5.9.123 (2011-09-29)
1666 * @public static
1667 */
1668 public static function updateCIDtoGIDmap($map, $cid, $gid) {
1669 if (($cid >= 0) AND ($cid <= 0xFFFF) AND ($gid >= 0)) {
1670 if ($gid > 0xFFFF) {
1671 $gid -= 0x10000;
1672 }
1673 $map[($cid * 2)] = chr($gid >> 8);
1674 $map[(($cid * 2) + 1)] = chr($gid & 0xFF);
1675 }
1676 return $map;
1677 }
1678
1679 /**
1680 * Return fonts path
1681 * @return string
1682 * @public static
1683 */
1684 public static function _getfontpath() {
1685 if (!defined('K_PATH_FONTS') AND is_dir($fdir = realpath(dirname(__FILE__).'/../fonts'))) {
1686 if (substr($fdir, -1) != '/') {
1687 $fdir .= '/';
1688 }
1689 define('K_PATH_FONTS', $fdir);
1690 }
1691 return defined('K_PATH_FONTS') ? K_PATH_FONTS : '';
1692 }
1693
1694 /**
1695 * Return font full path
1696 * @param $file (string) Font file name.
1697 * @param $fontdir (string) Font directory (set to false fto search on default directories)
1698 * @return string Font full path or empty string
1699 * @author Nicola Asuni
1700 * @since 6.0.025
1701 * @public static
1702 */
1703 public static function getFontFullPath($file, $fontdir=false) {
1704 $fontfile = '';
1705 // search files on various directories
1706 if (($fontdir !== false) AND @file_exists($fontdir.$file)) {
1707 $fontfile = $fontdir.$file;
1708 } elseif (@file_exists(self::_getfontpath().$file)) {
1709 $fontfile = self::_getfontpath().$file;
1710 } elseif (@file_exists($file)) {
1711 $fontfile = $file;
1712 }
1713 return $fontfile;
1714 }
1715
1716 /**
1717 * Converts UTF-8 characters array to array of Latin1 characters array<br>
1718 * @param $unicode (array) array containing UTF-8 unicode values
1719 * @return array
1720 * @author Nicola Asuni
1721 * @since 4.8.023 (2010-01-15)
1722 * @public static
1723 */
1724 public static function UTF8ArrToLatin1Arr($unicode) {
1725 $outarr = array(); // array to be returned
1726 foreach ($unicode as $char) {
1727 if ($char < 256) {
1728 $outarr[] = $char;
1729 } elseif (array_key_exists($char, TCPDF_FONT_DATA::$uni_utf8tolatin)) {
1730 // map from UTF-8
1731 $outarr[] = TCPDF_FONT_DATA::$uni_utf8tolatin[$char];
1732 } elseif ($char == 0xFFFD) {
1733 // skip
1734 } else {
1735 $outarr[] = 63; // '?' character
1736 }
1737 }
1738 return $outarr;
1739 }
1740
1741 /**
1742 * Converts UTF-8 characters array to array of Latin1 string<br>
1743 * @param $unicode (array) array containing UTF-8 unicode values
1744 * @return array
1745 * @author Nicola Asuni
1746 * @since 4.8.023 (2010-01-15)
1747 * @public static
1748 */
1749 public static function UTF8ArrToLatin1($unicode) {
1750 $outstr = ''; // string to be returned
1751 foreach ($unicode as $char) {
1752 if ($char < 256) {
1753 $outstr .= chr($char);
1754 } elseif (array_key_exists($char, TCPDF_FONT_DATA::$uni_utf8tolatin)) {
1755 // map from UTF-8
1756 $outstr .= chr(TCPDF_FONT_DATA::$uni_utf8tolatin[$char]);
1757 } elseif ($char == 0xFFFD) {
1758 // skip
1759 } else {
1760 $outstr .= '?';
1761 }
1762 }
1763 return $outstr;
1764 }
1765
1766 /**
1767 * Converts UTF-8 character to integer value.<br>
1768 * Uses the getUniord() method if the value is not cached.
1769 * @param $uch (string) character string to process.
1770 * @return integer Unicode value
1771 * @public static
1772 */
1773 public static function uniord($uch) {
1774 if (!isset(self::$cache_uniord[$uch])) {
1775 self::$cache_uniord[$uch] = self::getUniord($uch);
1776 }
1777 return self::$cache_uniord[$uch];
1778 }
1779
1780 /**
1781 * Converts UTF-8 character to integer value.<br>
1782 * Invalid byte sequences will be replaced with 0xFFFD (replacement character)<br>
1783 * Based on: http://www.faqs.org/rfcs/rfc3629.html
1784 * <pre>
1785 * Char. number range | UTF-8 octet sequence
1786 * (hexadecimal) | (binary)
1787 * --------------------+-----------------------------------------------
1788 * 0000 0000-0000 007F | 0xxxxxxx
1789 * 0000 0080-0000 07FF | 110xxxxx 10xxxxxx
1790 * 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
1791 * 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
1792 * ---------------------------------------------------------------------
1793 *
1794 * ABFN notation:
1795 * ---------------------------------------------------------------------
1796 * UTF8-octets = *( UTF8-char )
1797 * UTF8-char = UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4
1798 * UTF8-1 = %x00-7F
1799 * UTF8-2 = %xC2-DF UTF8-tail
1800 *
1801 * UTF8-3 = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) /
1802 * %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail )
1803 * UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) /
1804 * %xF4 %x80-8F 2( UTF8-tail )
1805 * UTF8-tail = %x80-BF
1806 * ---------------------------------------------------------------------
1807 * </pre>
1808 * @param $uch (string) character string to process.
1809 * @return integer Unicode value
1810 * @author Nicola Asuni
1811 * @public static
1812 */
1813 public static function getUniord($uch) {
1814 if (function_exists('mb_convert_encoding')) {
1815 list(, $char) = @unpack('N', mb_convert_encoding($uch, 'UCS-4BE', 'UTF-8'));
1816 if ($char >= 0) {
1817 return $char;
1818 }
1819 }
1820 $bytes = array(); // array containing single character byte sequences
1821 $countbytes = 0;
1822 $numbytes = 1; // number of octetc needed to represent the UTF-8 character
1823 $length = strlen($uch);
1824 for ($i = 0; $i < $length; ++$i) {
1825 $char = ord($uch[$i]); // get one string character at time
1826 if ($countbytes == 0) { // get starting octect
1827 if ($char <= 0x7F) {
1828 return $char; // use the character "as is" because is ASCII
1829 } elseif (($char >> 0x05) == 0x06) { // 2 bytes character (0x06 = 110 BIN)
1830 $bytes[] = ($char - 0xC0) << 0x06;
1831 ++$countbytes;
1832 $numbytes = 2;
1833 } elseif (($char >> 0x04) == 0x0E) { // 3 bytes character (0x0E = 1110 BIN)
1834 $bytes[] = ($char - 0xE0) << 0x0C;
1835 ++$countbytes;
1836 $numbytes = 3;
1837 } elseif (($char >> 0x03) == 0x1E) { // 4 bytes character (0x1E = 11110 BIN)
1838 $bytes[] = ($char - 0xF0) << 0x12;
1839 ++$countbytes;
1840 $numbytes = 4;
1841 } else {
1842 // use replacement character for other invalid sequences
1843 return 0xFFFD;
1844 }
1845 } elseif (($char >> 0x06) == 0x02) { // bytes 2, 3 and 4 must start with 0x02 = 10 BIN
1846 $bytes[] = $char - 0x80;
1847 ++$countbytes;
1848 if ($countbytes == $numbytes) {
1849 // compose UTF-8 bytes to a single unicode value
1850 $char = $bytes[0];
1851 for ($j = 1; $j < $numbytes; ++$j) {
1852 $char += ($bytes[$j] << (($numbytes - $j - 1) * 0x06));
1853 }
1854 if ((($char >= 0xD800) AND ($char <= 0xDFFF)) OR ($char >= 0x10FFFF)) {
1855 // The definition of UTF-8 prohibits encoding character numbers between
1856 // U+D800 and U+DFFF, which are reserved for use with the UTF-16
1857 // encoding form (as surrogate pairs) and do not directly represent
1858 // characters.
1859 return 0xFFFD; // use replacement character
1860 } else {
1861 return $char;
1862 }
1863 }
1864 } else {
1865 // use replacement character for other invalid sequences
1866 return 0xFFFD;
1867 }
1868 }
1869 return 0xFFFD;
1870 }
1871
1872 /**
1873 * Converts UTF-8 strings to codepoints array.<br>
1874 * Invalid byte sequences will be replaced with 0xFFFD (replacement character)<br>
1875 * @param $str (string) string to process.
1876 * @param $isunicode (boolean) True when the documetn is in Unicode mode, false otherwise.
1877 * @param $currentfont (array) Reference to current font array.
1878 * @return array containing codepoints (UTF-8 characters values)
1879 * @author Nicola Asuni
1880 * @public static
1881 */
1882 public static function UTF8StringToArray($str, $isunicode=true, &$currentfont) {
1883 if ($isunicode) {
1884 // requires PCRE unicode support turned on
1885 $chars = TCPDF_STATIC::pregSplit('//','u', $str, -1, PREG_SPLIT_NO_EMPTY);
1886 $carr = array_map(array('TCPDF_FONTS', 'uniord'), $chars);
1887 } else {
1888 $chars = str_split($str);
1889 $carr = array_map('ord', $chars);
1890 }
1891 $currentfont['subsetchars'] += array_fill_keys($carr, true);
1892 return $carr;
1893 }
1894
1895 /**
1896 * Converts UTF-8 strings to Latin1 when using the standard 14 core fonts.<br>
1897 * @param $str (string) string to process.
1898 * @param $isunicode (boolean) True when the documetn is in Unicode mode, false otherwise.
1899 * @param $currentfont (array) Reference to current font array.
1900 * @return string
1901 * @since 3.2.000 (2008-06-23)
1902 * @public static
1903 */
1904 public static function UTF8ToLatin1($str, $isunicode=true, &$currentfont) {
1905 $unicode = self::UTF8StringToArray($str, $isunicode, $currentfont); // array containing UTF-8 unicode values
1906 return self::UTF8ArrToLatin1($unicode);
1907 }
1908
1909 /**
1910 * Converts UTF-8 strings to UTF16-BE.<br>
1911 * @param $str (string) string to process.
1912 * @param $setbom (boolean) if true set the Byte Order Mark (BOM = 0xFEFF)
1913 * @param $isunicode (boolean) True when the documetn is in Unicode mode, false otherwise.
1914 * @param $currentfont (array) Reference to current font array.
1915 * @return string
1916 * @author Nicola Asuni
1917 * @since 1.53.0.TC005 (2005-01-05)
1918 * @public static
1919 */
1920 public static function UTF8ToUTF16BE($str, $setbom=false, $isunicode=true, &$currentfont) {
1921 if (!$isunicode) {
1922 return $str; // string is not in unicode
1923 }
1924 $unicode = self::UTF8StringToArray($str, $isunicode, $currentfont); // array containing UTF-8 unicode values
1925 return self::arrUTF8ToUTF16BE($unicode, $setbom);
1926 }
1927
1928 /**
1929 * Reverse the RLT substrings using the Bidirectional Algorithm (http://unicode.org/reports/tr9/).
1930 * @param $str (string) string to manipulate.
1931 * @param $setbom (bool) if true set the Byte Order Mark (BOM = 0xFEFF)
1932 * @param $forcertl (bool) if true forces RTL text direction
1933 * @param $isunicode (boolean) True if the document is in Unicode mode, false otherwise.
1934 * @param $currentfont (array) Reference to current font array.
1935 * @return string
1936 * @author Nicola Asuni
1937 * @since 2.1.000 (2008-01-08)
1938 * @public static
1939 */
1940 public static function utf8StrRev($str, $setbom=false, $forcertl=false, $isunicode=true, &$currentfont) {
1941 return self::utf8StrArrRev(self::UTF8StringToArray($str, $isunicode, $currentfont), $str, $setbom, $forcertl, $isunicode, $currentfont);
1942 }
1943
1944 /**
1945 * Reverse the RLT substrings array using the Bidirectional Algorithm (http://unicode.org/reports/tr9/).
1946 * @param $arr (array) array of unicode values.
1947 * @param $str (string) string to manipulate (or empty value).
1948 * @param $setbom (bool) if true set the Byte Order Mark (BOM = 0xFEFF)
1949 * @param $forcertl (bool) if true forces RTL text direction
1950 * @param $isunicode (boolean) True if the document is in Unicode mode, false otherwise.
1951 * @param $currentfont (array) Reference to current font array.
1952 * @return string
1953 * @author Nicola Asuni
1954 * @since 4.9.000 (2010-03-27)
1955 * @public static
1956 */
1957 public static function utf8StrArrRev($arr, $str='', $setbom=false, $forcertl=false, $isunicode=true, &$currentfont) {
1958 return self::arrUTF8ToUTF16BE(self::utf8Bidi($arr, $str, $forcertl, $isunicode, $currentfont), $setbom);
1959 }
1960
1961 /**
1962 * Reverse the RLT substrings using the Bidirectional Algorithm (http://unicode.org/reports/tr9/).
1963 * @param $ta (array) array of characters composing the string.
1964 * @param $str (string) string to process
1965 * @param $forcertl (bool) if 'R' forces RTL, if 'L' forces LTR
1966 * @param $isunicode (boolean) True if the document is in Unicode mode, false otherwise.
1967 * @param $currentfont (array) Reference to current font array.
1968 * @return array of unicode chars
1969 * @author Nicola Asuni
1970 * @since 2.4.000 (2008-03-06)
1971 * @public static
1972 */
1973 public static function utf8Bidi($ta, $str='', $forcertl=false, $isunicode=true, &$currentfont) {
1974 // paragraph embedding level
1975 $pel = 0;
1976 // max level
1977 $maxlevel = 0;
1978 if (TCPDF_STATIC::empty_string($str)) {
1979 // create string from array
1980 $str = self::UTF8ArrSubString($ta, '', '', $isunicode);
1981 }
1982 // check if string contains arabic text
1983 if (preg_match(TCPDF_FONT_DATA::$uni_RE_PATTERN_ARABIC, $str)) {
1984 $arabic = true;
1985 } else {
1986 $arabic = false;
1987 }
1988 // check if string contains RTL text
1989 if (!($forcertl OR $arabic OR preg_match(TCPDF_FONT_DATA::$uni_RE_PATTERN_RTL, $str))) {
1990 return $ta;
1991 }
1992
1993 // get number of chars
1994 $numchars = count($ta);
1995
1996 if ($forcertl == 'R') {
1997 $pel = 1;
1998 } elseif ($forcertl == 'L') {
1999 $pel = 0;
2000 } else {
2001 // P2. In each paragraph, find the first character of type L, AL, or R.
2002 // P3. If a character is found in P2 and it is of type AL or R, then set the paragraph embedding level to one; otherwise, set it to zero.
2003 for ($i=0; $i < $numchars; ++$i) {
2004 $type = TCPDF_FONT_DATA::$uni_type[$ta[$i]];
2005 if ($type == 'L') {
2006 $pel = 0;
2007 break;
2008 } elseif (($type == 'AL') OR ($type == 'R')) {
2009 $pel = 1;
2010 break;
2011 }
2012 }
2013 }
2014
2015 // Current Embedding Level
2016 $cel = $pel;
2017 // directional override status
2018 $dos = 'N';
2019 $remember = array();
2020 // start-of-level-run
2021 $sor = $pel % 2 ? 'R' : 'L';
2022 $eor = $sor;
2023
2024 // Array of characters data
2025 $chardata = Array();
2026
2027 // X1. Begin by setting the current embedding level to the paragraph embedding level. Set the directional override status to neutral. Process each character iteratively, applying rules X2 through X9. Only embedding levels from 0 to 61 are valid in this phase.
2028 // In the resolution of levels in rules I1 and I2, the maximum embedding level of 62 can be reached.
2029 for ($i=0; $i < $numchars; ++$i) {
2030 if ($ta[$i] == TCPDF_FONT_DATA::$uni_RLE) {
2031 // X2. With each RLE, compute the least greater odd embedding level.
2032 // a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to neutral.
2033 // b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status.
2034 $next_level = $cel + ($cel % 2) + 1;
2035 if ($next_level < 62) {
2036 $remember[] = array('num' => TCPDF_FONT_DATA::$uni_RLE, 'cel' => $cel, 'dos' => $dos);
2037 $cel = $next_level;
2038 $dos = 'N';
2039 $sor = $eor;
2040 $eor = $cel % 2 ? 'R' : 'L';
2041 }
2042 } elseif ($ta[$i] == TCPDF_FONT_DATA::$uni_LRE) {
2043 // X3. With each LRE, compute the least greater even embedding level.
2044 // a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to neutral.
2045 // b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status.
2046 $next_level = $cel + 2 - ($cel % 2);
2047 if ( $next_level < 62 ) {
2048 $remember[] = array('num' => TCPDF_FONT_DATA::$uni_LRE, 'cel' => $cel, 'dos' => $dos);
2049 $cel = $next_level;
2050 $dos = 'N';
2051 $sor = $eor;
2052 $eor = $cel % 2 ? 'R' : 'L';
2053 }
2054 } elseif ($ta[$i] == TCPDF_FONT_DATA::$uni_RLO) {
2055 // X4. With each RLO, compute the least greater odd embedding level.
2056 // a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to right-to-left.
2057 // b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status.
2058 $next_level = $cel + ($cel % 2) + 1;
2059 if ($next_level < 62) {
2060 $remember[] = array('num' => TCPDF_FONT_DATA::$uni_RLO, 'cel' => $cel, 'dos' => $dos);
2061 $cel = $next_level;
2062 $dos = 'R';
2063 $sor = $eor;
2064 $eor = $cel % 2 ? 'R' : 'L';
2065 }
2066 } elseif ($ta[$i] == TCPDF_FONT_DATA::$uni_LRO) {
2067 // X5. With each LRO, compute the least greater even embedding level.
2068 // a. If this new level would be valid, then this embedding code is valid. Remember (push) the current embedding level and override status. Reset the current level to this new level, and reset the override status to left-to-right.
2069 // b. If the new level would not be valid, then this code is invalid. Do not change the current level or override status.
2070 $next_level = $cel + 2 - ($cel % 2);
2071 if ( $next_level < 62 ) {
2072 $remember[] = array('num' => TCPDF_FONT_DATA::$uni_LRO, 'cel' => $cel, 'dos' => $dos);
2073 $cel = $next_level;
2074 $dos = 'L';
2075 $sor = $eor;
2076 $eor = $cel % 2 ? 'R' : 'L';
2077 }
2078 } elseif ($ta[$i] == TCPDF_FONT_DATA::$uni_PDF) {
2079 // X7. With each PDF, determine the matching embedding or override code. If there was a valid matching code, restore (pop) the last remembered (pushed) embedding level and directional override.
2080 if (count($remember)) {
2081 $last = count($remember ) - 1;
2082 if (($remember[$last]['num'] == TCPDF_FONT_DATA::$uni_RLE) OR
2083 ($remember[$last]['num'] == TCPDF_FONT_DATA::$uni_LRE) OR
2084 ($remember[$last]['num'] == TCPDF_FONT_DATA::$uni_RLO) OR
2085 ($remember[$last]['num'] == TCPDF_FONT_DATA::$uni_LRO)) {
2086 $match = array_pop($remember);
2087 $cel = $match['cel'];
2088 $dos = $match['dos'];
2089 $sor = $eor;
2090 $eor = ($cel > $match['cel'] ? $cel : $match['cel']) % 2 ? 'R' : 'L';
2091 }
2092 }
2093 } elseif (($ta[$i] != TCPDF_FONT_DATA::$uni_RLE) AND
2094 ($ta[$i] != TCPDF_FONT_DATA::$uni_LRE) AND
2095 ($ta[$i] != TCPDF_FONT_DATA::$uni_RLO) AND
2096 ($ta[$i] != TCPDF_FONT_DATA::$uni_LRO) AND
2097 ($ta[$i] != TCPDF_FONT_DATA::$uni_PDF)) {
2098 // X6. For all types besides RLE, LRE, RLO, LRO, and PDF:
2099 // a. Set the level of the current character to the current embedding level.
2100 // b. Whenever the directional override status is not neutral, reset the current character type to the directional override status.
2101 if ($dos != 'N') {
2102 $chardir = $dos;
2103 } else {
2104 if (isset(TCPDF_FONT_DATA::$uni_type[$ta[$i]])) {
2105 $chardir = TCPDF_FONT_DATA::$uni_type[$ta[$i]];
2106 } else {
2107 $chardir = 'L';
2108 }
2109 }
2110 // stores string characters and other information
2111 $chardata[] = array('char' => $ta[$i], 'level' => $cel, 'type' => $chardir, 'sor' => $sor, 'eor' => $eor);
2112 }
2113 } // end for each char
2114
2115 // X8. All explicit directional embeddings and overrides are completely terminated at the end of each paragraph. Paragraph separators are not included in the embedding.
2116 // X9. Remove all RLE, LRE, RLO, LRO, PDF, and BN codes.
2117 // X10. The remaining rules are applied to each run of characters at the same level. For each run, determine the start-of-level-run (sor) and end-of-level-run (eor) type, either L or R. This depends on the higher of the two levels on either side of the boundary (at the start or end of the paragraph, the level of the 'other' run is the base embedding level). If the higher level is odd, the type is R; otherwise, it is L.
2118
2119 // 3.3.3 Resolving Weak Types
2120 // Weak types are now resolved one level run at a time. At level run boundaries where the type of the character on the other side of the boundary is required, the type assigned to sor or eor is used.
2121 // Nonspacing marks are now resolved based on the previous characters.
2122 $numchars = count($chardata);
2123
2124 // W1. Examine each nonspacing mark (NSM) in the level run, and change the type of the NSM to the type of the previous character. If the NSM is at the start of the level run, it will get the type of sor.
2125 $prevlevel = -1; // track level changes
2126 $levcount = 0; // counts consecutive chars at the same level
2127 for ($i=0; $i < $numchars; ++$i) {
2128 if ($chardata[$i]['type'] == 'NSM') {
2129 if ($levcount) {
2130 $chardata[$i]['type'] = $chardata[$i]['sor'];
2131 } elseif ($i > 0) {
2132 $chardata[$i]['type'] = $chardata[($i-1)]['type'];
2133 }
2134 }
2135 if ($chardata[$i]['level'] != $prevlevel) {
2136 $levcount = 0;
2137 } else {
2138 ++$levcount;
2139 }
2140 $prevlevel = $chardata[$i]['level'];
2141 }
2142
2143 // W2. Search backward from each instance of a European number until the first strong type (R, L, AL, or sor) is found. If an AL is found, change the type of the European number to Arabic number.
2144 $prevlevel = -1;
2145 $levcount = 0;
2146 for ($i=0; $i < $numchars; ++$i) {
2147 if ($chardata[$i]['char'] == 'EN') {
2148 for ($j=$levcount; $j >= 0; $j--) {
2149 if ($chardata[$j]['type'] == 'AL') {
2150 $chardata[$i]['type'] = 'AN';
2151 } elseif (($chardata[$j]['type'] == 'L') OR ($chardata[$j]['type'] == 'R')) {
2152 break;
2153 }
2154 }
2155 }
2156 if ($chardata[$i]['level'] != $prevlevel) {
2157 $levcount = 0;
2158 } else {
2159 ++$levcount;
2160 }
2161 $prevlevel = $chardata[$i]['level'];
2162 }
2163
2164 // W3. Change all ALs to R.
2165 for ($i=0; $i < $numchars; ++$i) {
2166 if ($chardata[$i]['type'] == 'AL') {
2167 $chardata[$i]['type'] = 'R';
2168 }
2169 }
2170
2171 // W4. A single European separator between two European numbers changes to a European number. A single common separator between two numbers of the same type changes to that type.
2172 $prevlevel = -1;
2173 $levcount = 0;
2174 for ($i=0; $i < $numchars; ++$i) {
2175 if (($levcount > 0) AND (($i+1) < $numchars) AND ($chardata[($i+1)]['level'] == $prevlevel)) {
2176 if (($chardata[$i]['type'] == 'ES') AND ($chardata[($i-1)]['type'] == 'EN') AND ($chardata[($i+1)]['type'] == 'EN')) {
2177 $chardata[$i]['type'] = 'EN';
2178 } elseif (($chardata[$i]['type'] == 'CS') AND ($chardata[($i-1)]['type'] == 'EN') AND ($chardata[($i+1)]['type'] == 'EN')) {
2179 $chardata[$i]['type'] = 'EN';
2180 } elseif (($chardata[$i]['type'] == 'CS') AND ($chardata[($i-1)]['type'] == 'AN') AND ($chardata[($i+1)]['type'] == 'AN')) {
2181 $chardata[$i]['type'] = 'AN';
2182 }
2183 }
2184 if ($chardata[$i]['level'] != $prevlevel) {
2185 $levcount = 0;
2186 } else {
2187 ++$levcount;
2188 }
2189 $prevlevel = $chardata[$i]['level'];
2190 }
2191
2192 // W5. A sequence of European terminators adjacent to European numbers changes to all European numbers.
2193 $prevlevel = -1;
2194 $levcount = 0;
2195 for ($i=0; $i < $numchars; ++$i) {
2196 if ($chardata[$i]['type'] == 'ET') {
2197 if (($levcount > 0) AND ($chardata[($i-1)]['type'] == 'EN')) {
2198 $chardata[$i]['type'] = 'EN';
2199 } else {
2200 $j = $i+1;
2201 while (($j < $numchars) AND ($chardata[$j]['level'] == $prevlevel)) {
2202 if ($chardata[$j]['type'] == 'EN') {
2203 $chardata[$i]['type'] = 'EN';
2204 break;
2205 } elseif ($chardata[$j]['type'] != 'ET') {
2206 break;
2207 }
2208 ++$j;
2209 }
2210 }
2211 }
2212 if ($chardata[$i]['level'] != $prevlevel) {
2213 $levcount = 0;
2214 } else {
2215 ++$levcount;
2216 }
2217 $prevlevel = $chardata[$i]['level'];
2218 }
2219
2220 // W6. Otherwise, separators and terminators change to Other Neutral.
2221 $prevlevel = -1;
2222 $levcount = 0;
2223 for ($i=0; $i < $numchars; ++$i) {
2224 if (($chardata[$i]['type'] == 'ET') OR ($chardata[$i]['type'] == 'ES') OR ($chardata[$i]['type'] == 'CS')) {
2225 $chardata[$i]['type'] = 'ON';
2226 }
2227 if ($chardata[$i]['level'] != $prevlevel) {
2228 $levcount = 0;
2229 } else {
2230 ++$levcount;
2231 }
2232 $prevlevel = $chardata[$i]['level'];
2233 }
2234
2235 //W7. Search backward from each instance of a European number until the first strong type (R, L, or sor) is found. If an L is found, then change the type of the European number to L.
2236 $prevlevel = -1;
2237 $levcount = 0;
2238 for ($i=0; $i < $numchars; ++$i) {
2239 if ($chardata[$i]['char'] == 'EN') {
2240 for ($j=$levcount; $j >= 0; $j--) {
2241 if ($chardata[$j]['type'] == 'L') {
2242 $chardata[$i]['type'] = 'L';
2243 } elseif ($chardata[$j]['type'] == 'R') {
2244 break;
2245 }
2246 }
2247 }
2248 if ($chardata[$i]['level'] != $prevlevel) {
2249 $levcount = 0;
2250 } else {
2251 ++$levcount;
2252 }
2253 $prevlevel = $chardata[$i]['level'];
2254 }
2255
2256 // N1. A sequence of neutrals takes the direction of the surrounding strong text if the text on both sides has the same direction. European and Arabic numbers act as if they were R in terms of their influence on neutrals. Start-of-level-run (sor) and end-of-level-run (eor) are used at level run boundaries.
2257 $prevlevel = -1;
2258 $levcount = 0;
2259 for ($i=0; $i < $numchars; ++$i) {
2260 if (($levcount > 0) AND (($i+1) < $numchars) AND ($chardata[($i+1)]['level'] == $prevlevel)) {
2261 if (($chardata[$i]['type'] == 'N') AND ($chardata[($i-1)]['type'] == 'L') AND ($chardata[($i+1)]['type'] == 'L')) {
2262 $chardata[$i]['type'] = 'L';
2263 } elseif (($chardata[$i]['type'] == 'N') AND
2264 (($chardata[($i-1)]['type'] == 'R') OR ($chardata[($i-1)]['type'] == 'EN') OR ($chardata[($i-1)]['type'] == 'AN')) AND
2265 (($chardata[($i+1)]['type'] == 'R') OR ($chardata[($i+1)]['type'] == 'EN') OR ($chardata[($i+1)]['type'] == 'AN'))) {
2266 $chardata[$i]['type'] = 'R';
2267 } elseif ($chardata[$i]['type'] == 'N') {
2268 // N2. Any remaining neutrals take the embedding direction
2269 $chardata[$i]['type'] = $chardata[$i]['sor'];
2270 }
2271 } elseif (($levcount == 0) AND (($i+1) < $numchars) AND ($chardata[($i+1)]['level'] == $prevlevel)) {
2272 // first char
2273 if (($chardata[$i]['type'] == 'N') AND ($chardata[$i]['sor'] == 'L') AND ($chardata[($i+1)]['type'] == 'L')) {
2274 $chardata[$i]['type'] = 'L';
2275 } elseif (($chardata[$i]['type'] == 'N') AND
2276 (($chardata[$i]['sor'] == 'R') OR ($chardata[$i]['sor'] == 'EN') OR ($chardata[$i]['sor'] == 'AN')) AND
2277 (($chardata[($i+1)]['type'] == 'R') OR ($chardata[($i+1)]['type'] == 'EN') OR ($chardata[($i+1)]['type'] == 'AN'))) {
2278 $chardata[$i]['type'] = 'R';
2279 } elseif ($chardata[$i]['type'] == 'N') {
2280 // N2. Any remaining neutrals take the embedding direction
2281 $chardata[$i]['type'] = $chardata[$i]['sor'];
2282 }
2283 } elseif (($levcount > 0) AND ((($i+1) == $numchars) OR (($i+1) < $numchars) AND ($chardata[($i+1)]['level'] != $prevlevel))) {
2284 //last char
2285 if (($chardata[$i]['type'] == 'N') AND ($chardata[($i-1)]['type'] == 'L') AND ($chardata[$i]['eor'] == 'L')) {
2286 $chardata[$i]['type'] = 'L';
2287 } elseif (($chardata[$i]['type'] == 'N') AND
2288 (($chardata[($i-1)]['type'] == 'R') OR ($chardata[($i-1)]['type'] == 'EN') OR ($chardata[($i-1)]['type'] == 'AN')) AND
2289 (($chardata[$i]['eor'] == 'R') OR ($chardata[$i]['eor'] == 'EN') OR ($chardata[$i]['eor'] == 'AN'))) {
2290 $chardata[$i]['type'] = 'R';
2291 } elseif ($chardata[$i]['type'] == 'N') {
2292 // N2. Any remaining neutrals take the embedding direction
2293 $chardata[$i]['type'] = $chardata[$i]['sor'];
2294 }
2295 } elseif ($chardata[$i]['type'] == 'N') {
2296 // N2. Any remaining neutrals take the embedding direction
2297 $chardata[$i]['type'] = $chardata[$i]['sor'];
2298 }
2299 if ($chardata[$i]['level'] != $prevlevel) {
2300 $levcount = 0;
2301 } else {
2302 ++$levcount;
2303 }
2304 $prevlevel = $chardata[$i]['level'];
2305 }
2306
2307 // I1. For all characters with an even (left-to-right) embedding direction, those of type R go up one level and those of type AN or EN go up two levels.
2308 // I2. For all characters with an odd (right-to-left) embedding direction, those of type L, EN or AN go up one level.
2309 for ($i=0; $i < $numchars; ++$i) {
2310 $odd = $chardata[$i]['level'] % 2;
2311 if ($odd) {
2312 if (($chardata[$i]['type'] == 'L') OR ($chardata[$i]['type'] == 'AN') OR ($chardata[$i]['type'] == 'EN')) {
2313 $chardata[$i]['level'] += 1;
2314 }
2315 } else {
2316 if ($chardata[$i]['type'] == 'R') {
2317 $chardata[$i]['level'] += 1;
2318 } elseif (($chardata[$i]['type'] == 'AN') OR ($chardata[$i]['type'] == 'EN')) {
2319 $chardata[$i]['level'] += 2;
2320 }
2321 }
2322 $maxlevel = max($chardata[$i]['level'],$maxlevel);
2323 }
2324
2325 // L1. On each line, reset the embedding level of the following characters to the paragraph embedding level:
2326 // 1. Segment separators,
2327 // 2. Paragraph separators,
2328 // 3. Any sequence of whitespace characters preceding a segment separator or paragraph separator, and
2329 // 4. Any sequence of white space characters at the end of the line.
2330 for ($i=0; $i < $numchars; ++$i) {
2331 if (($chardata[$i]['type'] == 'B') OR ($chardata[$i]['type'] == 'S')) {
2332 $chardata[$i]['level'] = $pel;
2333 } elseif ($chardata[$i]['type'] == 'WS') {
2334 $j = $i+1;
2335 while ($j < $numchars) {
2336 if ((($chardata[$j]['type'] == 'B') OR ($chardata[$j]['type'] == 'S')) OR
2337 (($j == ($numchars-1)) AND ($chardata[$j]['type'] == 'WS'))) {
2338 $chardata[$i]['level'] = $pel;
2339 break;
2340 } elseif ($chardata[$j]['type'] != 'WS') {
2341 break;
2342 }
2343 ++$j;
2344 }
2345 }
2346 }
2347
2348 // Arabic Shaping
2349 // Cursively connected scripts, such as Arabic or Syriac, require the selection of positional character shapes that depend on adjacent characters. Shaping is logically applied after the Bidirectional Algorithm is used and is limited to characters within the same directional run.
2350 if ($arabic) {
2351 $endedletter = array(1569,1570,1571,1572,1573,1575,1577,1583,1584,1585,1586,1608,1688);
2352 $alfletter = array(1570,1571,1573,1575);
2353 $chardata2 = $chardata;
2354 $laaletter = false;
2355 $charAL = array();
2356 $x = 0;
2357 for ($i=0; $i < $numchars; ++$i) {
2358 if ((TCPDF_FONT_DATA::$uni_type[$chardata[$i]['char']] == 'AL') OR ($chardata[$i]['char'] == 32) OR ($chardata[$i]['char'] == 8204)) {
2359 $charAL[$x] = $chardata[$i];
2360 $charAL[$x]['i'] = $i;
2361 $chardata[$i]['x'] = $x;
2362 ++$x;
2363 }
2364 }
2365 $numAL = $x;
2366 for ($i=0; $i < $numchars; ++$i) {
2367 $thischar = $chardata[$i];
2368 if ($i > 0) {
2369 $prevchar = $chardata[($i-1)];
2370 } else {
2371 $prevchar = false;
2372 }
2373 if (($i+1) < $numchars) {
2374 $nextchar = $chardata[($i+1)];
2375 } else {
2376 $nextchar = false;
2377 }
2378 if (TCPDF_FONT_DATA::$uni_type[$thischar['char']] == 'AL') {
2379 $x = $thischar['x'];
2380 if ($x > 0) {
2381 $prevchar = $charAL[($x-1)];
2382 } else {
2383 $prevchar = false;
2384 }
2385 if (($x+1) < $numAL) {
2386 $nextchar = $charAL[($x+1)];
2387 } else {
2388 $nextchar = false;
2389 }
2390 // if laa letter
2391 if (($prevchar !== false) AND ($prevchar['char'] == 1604) AND (in_array($thischar['char'], $alfletter))) {
2392 $arabicarr = TCPDF_FONT_DATA::$uni_laa_array;
2393 $laaletter = true;
2394 if ($x > 1) {
2395 $prevchar = $charAL[($x-2)];
2396 } else {
2397 $prevchar = false;
2398 }
2399 } else {
2400 $arabicarr = TCPDF_FONT_DATA::$uni_arabicsubst;
2401 $laaletter = false;
2402 }
2403 if (($prevchar !== false) AND ($nextchar !== false) AND
2404 ((TCPDF_FONT_DATA::$uni_type[$prevchar['char']] == 'AL') OR (TCPDF_FONT_DATA::$uni_type[$prevchar['char']] == 'NSM')) AND
2405 ((TCPDF_FONT_DATA::$uni_type[$nextchar['char']] == 'AL') OR (TCPDF_FONT_DATA::$uni_type[$nextchar['char']] == 'NSM')) AND
2406 ($prevchar['type'] == $thischar['type']) AND
2407 ($nextchar['type'] == $thischar['type']) AND
2408 ($nextchar['char'] != 1567)) {
2409 if (in_array($prevchar['char'], $endedletter)) {
2410 if (isset($arabicarr[$thischar['char']][2])) {
2411 // initial
2412 $chardata2[$i]['char'] = $arabicarr[$thischar['char']][2];
2413 }
2414 } else {
2415 if (isset($arabicarr[$thischar['char']][3])) {
2416 // medial
2417 $chardata2[$i]['char'] = $arabicarr[$thischar['char']][3];
2418 }
2419 }
2420 } elseif (($nextchar !== false) AND
2421 ((TCPDF_FONT_DATA::$uni_type[$nextchar['char']] == 'AL') OR (TCPDF_FONT_DATA::$uni_type[$nextchar['char']] == 'NSM')) AND
2422 ($nextchar['type'] == $thischar['type']) AND
2423 ($nextchar['char'] != 1567)) {
2424 if (isset($arabicarr[$chardata[$i]['char']][2])) {
2425 // initial
2426 $chardata2[$i]['char'] = $arabicarr[$thischar['char']][2];
2427 }
2428 } elseif ((($prevchar !== false) AND
2429 ((TCPDF_FONT_DATA::$uni_type[$prevchar['char']] == 'AL') OR (TCPDF_FONT_DATA::$uni_type[$prevchar['char']] == 'NSM')) AND
2430 ($prevchar['type'] == $thischar['type'])) OR
2431 (($nextchar !== false) AND ($nextchar['char'] == 1567))) {
2432 // final
2433 if (($i > 1) AND ($thischar['char'] == 1607) AND
2434 ($chardata[$i-1]['char'] == 1604) AND
2435 ($chardata[$i-2]['char'] == 1604)) {
2436 //Allah Word
2437 // mark characters to delete with false
2438 $chardata2[$i-2]['char'] = false;
2439 $chardata2[$i-1]['char'] = false;
2440 $chardata2[$i]['char'] = 65010;
2441 } else {
2442 if (($prevchar !== false) AND in_array($prevchar['char'], $endedletter)) {
2443 if (isset($arabicarr[$thischar['char']][0])) {
2444 // isolated
2445 $chardata2[$i]['char'] = $arabicarr[$thischar['char']][0];
2446 }
2447 } else {
2448 if (isset($arabicarr[$thischar['char']][1])) {
2449 // final
2450 $chardata2[$i]['char'] = $arabicarr[$thischar['char']][1];
2451 }
2452 }
2453 }
2454 } elseif (isset($arabicarr[$thischar['char']][0])) {
2455 // isolated
2456 $chardata2[$i]['char'] = $arabicarr[$thischar['char']][0];
2457 }
2458 // if laa letter
2459 if ($laaletter) {
2460 // mark characters to delete with false
2461 $chardata2[($charAL[($x-1)]['i'])]['char'] = false;
2462 }
2463 } // end if AL (Arabic Letter)
2464 } // end for each char
2465 /*
2466 * Combining characters that can occur with Arabic Shadda (0651 HEX, 1617 DEC) are replaced.
2467 * Putting the combining mark and shadda in the same glyph allows us to avoid the two marks overlapping each other in an illegible manner.
2468 */
2469 for ($i = 0; $i < ($numchars-1); ++$i) {
2470 if (($chardata2[$i]['char'] == 1617) AND (isset(TCPDF_FONT_DATA::$uni_diacritics[($chardata2[$i+1]['char'])]))) {
2471 // check if the subtitution font is defined on current font
2472 if (isset($currentfont['cw'][(TCPDF_FONT_DATA::$uni_diacritics[($chardata2[$i+1]['char'])])])) {
2473 $chardata2[$i]['char'] = false;
2474 $chardata2[$i+1]['char'] = TCPDF_FONT_DATA::$uni_diacritics[($chardata2[$i+1]['char'])];
2475 }
2476 }
2477 }
2478 // remove marked characters
2479 foreach ($chardata2 as $key => $value) {
2480 if ($value['char'] === false) {
2481 unset($chardata2[$key]);
2482 }
2483 }
2484 $chardata = array_values($chardata2);
2485 $numchars = count($chardata);
2486 unset($chardata2);
2487 unset($arabicarr);
2488 unset($laaletter);
2489 unset($charAL);
2490 }
2491
2492 // L2. From the highest level found in the text to the lowest odd level on each line, including intermediate levels not actually present in the text, reverse any contiguous sequence of characters that are at that level or higher.
2493 for ($j=$maxlevel; $j > 0; $j--) {
2494 $ordarray = Array();
2495 $revarr = Array();
2496 $onlevel = false;
2497 for ($i=0; $i < $numchars; ++$i) {
2498 if ($chardata[$i]['level'] >= $j) {
2499 $onlevel = true;
2500 if (isset(TCPDF_FONT_DATA::$uni_mirror[$chardata[$i]['char']])) {
2501 // L4. A character is depicted by a mirrored glyph if and only if (a) the resolved directionality of that character is R, and (b) the Bidi_Mirrored property value of that character is true.
2502 $chardata[$i]['char'] = TCPDF_FONT_DATA::$uni_mirror[$chardata[$i]['char']];
2503 }
2504 $revarr[] = $chardata[$i];
2505 } else {
2506 if ($onlevel) {
2507 $revarr = array_reverse($revarr);
2508 $ordarray = array_merge($ordarray, $revarr);
2509 $revarr = Array();
2510 $onlevel = false;
2511 }
2512 $ordarray[] = $chardata[$i];
2513 }
2514 }
2515 if ($onlevel) {
2516 $revarr = array_reverse($revarr);
2517 $ordarray = array_merge($ordarray, $revarr);
2518 }
2519 $chardata = $ordarray;
2520 }
2521 $ordarray = array();
2522 foreach ($chardata as $cd) {
2523 $ordarray[] = $cd['char'];
2524 // store char values for subsetting
2525 $currentfont['subsetchars'][$cd['char']] = true;
2526 }
2527 return $ordarray;
2528 }
2529
2530 /**
2531 * Get a reference font size.
2532 * @param $size (string) String containing font size value.
2533 * @param $refsize (float) Reference font size in points.
2534 * @return float value in points
2535 * @public static
2536 */
2537 public static function getFontRefSize($size, $refsize=12) {
2538 switch ($size) {
2539 case 'xx-small': {
2540 $size = ($refsize - 4);
2541 break;
2542 }
2543 case 'x-small': {
2544 $size = ($refsize - 3);
2545 break;
2546 }
2547 case 'small': {
2548 $size = ($refsize - 2);
2549 break;
2550 }
2551 case 'medium': {
2552 $size = $refsize;
2553 break;
2554 }
2555 case 'large': {
2556 $size = ($refsize + 2);
2557 break;
2558 }
2559 case 'x-large': {
2560 $size = ($refsize + 4);
2561 break;
2562 }
2563 case 'xx-large': {
2564 $size = ($refsize + 6);
2565 break;
2566 }
2567 case 'smaller': {
2568 $size = ($refsize - 3);
2569 break;
2570 }
2571 case 'larger': {
2572 $size = ($refsize + 3);
2573 break;
2574 }
2575 }
2576 return $size;
2577 }
2578
2579} // END OF TCPDF_FONTS CLASS
2580
2581//============================================================+
2582// END OF FILE
2583//============================================================+
diff --git a/inc/3rdparty/libraries/tcpdf/include/tcpdf_images.php b/inc/3rdparty/libraries/tcpdf/include/tcpdf_images.php
new file mode 100644
index 00000000..150832ef
--- /dev/null
+++ b/inc/3rdparty/libraries/tcpdf/include/tcpdf_images.php
@@ -0,0 +1,355 @@
1<?php
2//============================================================+
3// File name : tcpdf_images.php
4// Version : 1.0.003
5// Begin : 2002-08-03
6// Last Update : 2014-04-03
7// Author : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
8// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
9// -------------------------------------------------------------------
10// Copyright (C) 2002-2014 Nicola Asuni - Tecnick.com LTD
11//
12// This file is part of TCPDF software library.
13//
14// TCPDF is free software: you can redistribute it and/or modify it
15// under the terms of the GNU Lesser General Public License as
16// published by the Free Software Foundation, either version 3 of the
17// License, or (at your option) any later version.
18//
19// TCPDF is distributed in the hope that it will be useful, but
20// WITHOUT ANY WARRANTY; without even the implied warranty of
21// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
22// See the GNU Lesser General Public License for more details.
23//
24// You should have received a copy of the License
25// along with TCPDF. If not, see
26// <http://www.tecnick.com/pagefiles/tcpdf/LICENSE.TXT>.
27//
28// See LICENSE.TXT file for more information.
29// -------------------------------------------------------------------
30//
31// Description :
32// Static image methods used by the TCPDF class.
33//
34//============================================================+
35
36/**
37 * @file
38 * This is a PHP class that contains static image methods for the TCPDF class.<br>
39 * @package com.tecnick.tcpdf
40 * @author Nicola Asuni
41 * @version 1.0.003
42 */
43
44/**
45 * @class TCPDF_IMAGES
46 * Static image methods used by the TCPDF class.
47 * @package com.tecnick.tcpdf
48 * @brief PHP class for generating PDF documents without requiring external extensions.
49 * @version 1.0.003
50 * @author Nicola Asuni - info@tecnick.com
51 */
52class TCPDF_IMAGES {
53
54 /**
55 * Array of hinheritable SVG properties.
56 * @since 5.0.000 (2010-05-02)
57 * @public static
58 */
59 public static $svginheritprop = array('clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cursor', 'direction', 'fill', 'fill-opacity', 'fill-rule', 'font', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'glyph-orientation-horizontal', 'glyph-orientation-vertical', 'image-rendering', 'kerning', 'letter-spacing', 'marker', 'marker-end', 'marker-mid', 'marker-start', 'pointer-events', 'shape-rendering', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'text-anchor', 'text-rendering', 'visibility', 'word-spacing', 'writing-mode');
60
61// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
62
63 /**
64 * Return the image type given the file name or array returned by getimagesize() function.
65 * @param $imgfile (string) image file name
66 * @param $iminfo (array) array of image information returned by getimagesize() function.
67 * @return string image type
68 * @since 4.8.017 (2009-11-27)
69 * @public static
70 */
71 public static function getImageFileType($imgfile, $iminfo=array()) {
72 $type = '';
73 if (isset($iminfo['mime']) AND !empty($iminfo['mime'])) {
74 $mime = explode('/', $iminfo['mime']);
75 if ((count($mime) > 1) AND ($mime[0] == 'image') AND (!empty($mime[1]))) {
76 $type = strtolower(trim($mime[1]));
77 }
78 }
79 if (empty($type)) {
80 $fileinfo = pathinfo($imgfile);
81 if (isset($fileinfo['extension']) AND (!TCPDF_STATIC::empty_string($fileinfo['extension']))) {
82 $type = strtolower(trim($fileinfo['extension']));
83 }
84 }
85 if ($type == 'jpg') {
86 $type = 'jpeg';
87 }
88 return $type;
89 }
90
91 /**
92 * Set the transparency for the given GD image.
93 * @param $new_image (image) GD image object
94 * @param $image (image) GD image object.
95 * return GD image object.
96 * @since 4.9.016 (2010-04-20)
97 * @public static
98 */
99 public static function setGDImageTransparency($new_image, $image) {
100 // transparency index
101 $tid = imagecolortransparent($image);
102 // default transparency color
103 $tcol = array('red' => 255, 'green' => 255, 'blue' => 255);
104 if ($tid >= 0) {
105 // get the colors for the transparency index
106 $tcol = imagecolorsforindex($image, $tid);
107 }
108 $tid = imagecolorallocate($new_image, $tcol['red'], $tcol['green'], $tcol['blue']);
109 imagefill($new_image, 0, 0, $tid);
110 imagecolortransparent($new_image, $tid);
111 return $new_image;
112 }
113
114 /**
115 * Convert the loaded image to a PNG and then return a structure for the PDF creator.
116 * This function requires GD library and write access to the directory defined on K_PATH_CACHE constant.
117 * @param $image (image) Image object.
118 * return image PNG image object.
119 * @since 4.9.016 (2010-04-20)
120 * @public static
121 */
122 public static function _toPNG($image) {
123 // set temporary image file name
124 $tempname = TCPDF_STATIC::getObjFilename('img');
125 // turn off interlaced mode
126 imageinterlace($image, 0);
127 // create temporary PNG image
128 imagepng($image, $tempname);
129 // remove image from memory
130 imagedestroy($image);
131 // get PNG image data
132 $retvars = self::_parsepng($tempname);
133 // tidy up by removing temporary image
134 unlink($tempname);
135 return $retvars;
136 }
137
138 /**
139 * Convert the loaded image to a JPEG and then return a structure for the PDF creator.
140 * This function requires GD library and write access to the directory defined on K_PATH_CACHE constant.
141 * @param $image (image) Image object.
142 * @param $quality (int) JPEG quality.
143 * return image JPEG image object.
144 * @public static
145 */
146 public static function _toJPEG($image, $quality) {
147 $tempname = TCPDF_STATIC::getObjFilename('img');
148 imagejpeg($image, $tempname, $quality);
149 imagedestroy($image);
150 $retvars = self::_parsejpeg($tempname);
151 // tidy up by removing temporary image
152 unlink($tempname);
153 return $retvars;
154 }
155
156 /**
157 * Extract info from a JPEG file without using the GD library.
158 * @param $file (string) image file to parse
159 * @return array structure containing the image data
160 * @public static
161 */
162 public static function _parsejpeg($file) {
163 $a = getimagesize($file);
164 if (empty($a)) {
165 //Missing or incorrect image file
166 return false;
167 }
168 if ($a[2] != 2) {
169 // Not a JPEG file
170 return false;
171 }
172 // bits per pixel
173 $bpc = isset($a['bits']) ? intval($a['bits']) : 8;
174 // number of image channels
175 if (!isset($a['channels'])) {
176 $channels = 3;
177 } else {
178 $channels = intval($a['channels']);
179 }
180 // default colour space
181 switch ($channels) {
182 case 1: {
183 $colspace = 'DeviceGray';
184 break;
185 }
186 case 3: {
187 $colspace = 'DeviceRGB';
188 break;
189 }
190 case 4: {
191 $colspace = 'DeviceCMYK';
192 break;
193 }
194 default: {
195 $channels = 3;
196 $colspace = 'DeviceRGB';
197 break;
198 }
199 }
200 // get file content
201 $data = file_get_contents($file);
202 // check for embedded ICC profile
203 $icc = array();
204 $offset = 0;
205 while (($pos = strpos($data, "ICC_PROFILE\0", $offset)) !== false) {
206 // get ICC sequence length
207 $length = (TCPDF_STATIC::_getUSHORT($data, ($pos - 2)) - 16);
208 // marker sequence number
209 $msn = max(1, ord($data[($pos + 12)]));
210 // number of markers (total of APP2 used)
211 $nom = max(1, ord($data[($pos + 13)]));
212 // get sequence segment
213 $icc[($msn - 1)] = substr($data, ($pos + 14), $length);
214 // move forward to next sequence
215 $offset = ($pos + 14 + $length);
216 }
217 // order and compact ICC segments
218 if (count($icc) > 0) {
219 ksort($icc);
220 $icc = implode('', $icc);
221 if ((ord($icc[36]) != 0x61) OR (ord($icc[37]) != 0x63) OR (ord($icc[38]) != 0x73) OR (ord($icc[39]) != 0x70)) {
222 // invalid ICC profile
223 $icc = false;
224 }
225 } else {
226 $icc = false;
227 }
228 return array('w' => $a[0], 'h' => $a[1], 'ch' => $channels, 'icc' => $icc, 'cs' => $colspace, 'bpc' => $bpc, 'f' => 'DCTDecode', 'data' => $data);
229 }
230
231 /**
232 * Extract info from a PNG file without using the GD library.
233 * @param $file (string) image file to parse
234 * @return array structure containing the image data
235 * @public static
236 */
237 public static function _parsepng($file) {
238 $f = @fopen($file, 'rb');
239 if ($f === false) {
240 // Can't open image file
241 return false;
242 }
243 //Check signature
244 if (fread($f, 8) != chr(137).'PNG'.chr(13).chr(10).chr(26).chr(10)) {
245 // Not a PNG file
246 return false;
247 }
248 //Read header chunk
249 fread($f, 4);
250 if (fread($f, 4) != 'IHDR') {
251 //Incorrect PNG file
252 return false;
253 }
254 $w = TCPDF_STATIC::_freadint($f);
255 $h = TCPDF_STATIC::_freadint($f);
256 $bpc = ord(fread($f, 1));
257 $ct = ord(fread($f, 1));
258 if ($ct == 0) {
259 $colspace = 'DeviceGray';
260 } elseif ($ct == 2) {
261 $colspace = 'DeviceRGB';
262 } elseif ($ct == 3) {
263 $colspace = 'Indexed';
264 } else {
265 // alpha channel
266 fclose($f);
267 return 'pngalpha';
268 }
269 if (ord(fread($f, 1)) != 0) {
270 // Unknown compression method
271 fclose($f);
272 return false;
273 }
274 if (ord(fread($f, 1)) != 0) {
275 // Unknown filter method
276 fclose($f);
277 return false;
278 }
279 if (ord(fread($f, 1)) != 0) {
280 // Interlacing not supported
281 fclose($f);
282 return false;
283 }
284 fread($f, 4);
285 $channels = ($ct == 2 ? 3 : 1);
286 $parms = '/DecodeParms << /Predictor 15 /Colors '.$channels.' /BitsPerComponent '.$bpc.' /Columns '.$w.' >>';
287 //Scan chunks looking for palette, transparency and image data
288 $pal = '';
289 $trns = '';
290 $data = '';
291 $icc = false;
292 do {
293 $n = TCPDF_STATIC::_freadint($f);
294 $type = fread($f, 4);
295 if ($type == 'PLTE') {
296 // read palette
297 $pal = TCPDF_STATIC::rfread($f, $n);
298 fread($f, 4);
299 } elseif ($type == 'tRNS') {
300 // read transparency info
301 $t = TCPDF_STATIC::rfread($f, $n);
302 if ($ct == 0) { // DeviceGray
303 $trns = array(ord($t[1]));
304 } elseif ($ct == 2) { // DeviceRGB
305 $trns = array(ord($t[1]), ord($t[3]), ord($t[5]));
306 } else { // Indexed
307 if ($n > 0) {
308 $trns = array();
309 for ($i = 0; $i < $n; ++ $i) {
310 $trns[] = ord($t{$i});
311 }
312 }
313 }
314 fread($f, 4);
315 } elseif ($type == 'IDAT') {
316 // read image data block
317 $data .= TCPDF_STATIC::rfread($f, $n);
318 fread($f, 4);
319 } elseif ($type == 'iCCP') {
320 // skip profile name
321 $len = 0;
322 while ((ord(fread($f, 1)) != 0) AND ($len < 80)) {
323 ++$len;
324 }
325 // get compression method
326 if (ord(fread($f, 1)) != 0) {
327 // Unknown filter method
328 fclose($f);
329 return false;
330 }
331 // read ICC Color Profile
332 $icc = TCPDF_STATIC::rfread($f, ($n - $len - 2));
333 // decompress profile
334 $icc = gzuncompress($icc);
335 fread($f, 4);
336 } elseif ($type == 'IEND') {
337 break;
338 } else {
339 TCPDF_STATIC::rfread($f, $n + 4);
340 }
341 } while ($n);
342 if (($colspace == 'Indexed') AND (empty($pal))) {
343 // Missing palette
344 fclose($f);
345 return false;
346 }
347 fclose($f);
348 return array('w' => $w, 'h' => $h, 'ch' => $channels, 'icc' => $icc, 'cs' => $colspace, 'bpc' => $bpc, 'f' => 'FlateDecode', 'parms' => $parms, 'pal' => $pal, 'trns' => $trns, 'data' => $data);
349 }
350
351} // END OF TCPDF_IMAGES CLASS
352
353//============================================================+
354// END OF FILE
355//============================================================+
diff --git a/inc/3rdparty/libraries/tcpdf/include/tcpdf_static.php b/inc/3rdparty/libraries/tcpdf/include/tcpdf_static.php
new file mode 100644
index 00000000..e657446a
--- /dev/null
+++ b/inc/3rdparty/libraries/tcpdf/include/tcpdf_static.php
@@ -0,0 +1,2851 @@
1<?php
2//============================================================+
3// File name : tcpdf_static.php
4// Version : 1.0.004
5// Begin : 2002-08-03
6// Last Update : 2014-09-02
7// Author : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
8// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
9// -------------------------------------------------------------------
10// Copyright (C) 2002-2014 Nicola Asuni - Tecnick.com LTD
11//
12// This file is part of TCPDF software library.
13//
14// TCPDF is free software: you can redistribute it and/or modify it
15// under the terms of the GNU Lesser General Public License as
16// published by the Free Software Foundation, either version 3 of the
17// License, or (at your option) any later version.
18//
19// TCPDF is distributed in the hope that it will be useful, but
20// WITHOUT ANY WARRANTY; without even the implied warranty of
21// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
22// See the GNU Lesser General Public License for more details.
23//
24// You should have received a copy of the License
25// along with TCPDF. If not, see
26// <http://www.tecnick.com/pagefiles/tcpdf/LICENSE.TXT>.
27//
28// See LICENSE.TXT file for more information.
29// -------------------------------------------------------------------
30//
31// Description :
32// Static methods used by the TCPDF class.
33//
34//============================================================+
35
36/**
37 * @file
38 * This is a PHP class that contains static methods for the TCPDF class.<br>
39 * @package com.tecnick.tcpdf
40 * @author Nicola Asuni
41 * @version 1.0.004
42 */
43
44/**
45 * @class TCPDF_STATIC
46 * Static methods used by the TCPDF class.
47 * @package com.tecnick.tcpdf
48 * @brief PHP class for generating PDF documents without requiring external extensions.
49 * @version 1.0.004
50 * @author Nicola Asuni - info@tecnick.com
51 */
52class TCPDF_STATIC {
53
54 /**
55 * Current TCPDF version.
56 * @private static
57 */
58 private static $tcpdf_version = '6.0.093';
59
60 /**
61 * String alias for total number of pages.
62 * @public static
63 */
64 public static $alias_tot_pages = '{:ptp:}';
65
66 /**
67 * String alias for page number.
68 * @public static
69 */
70 public static $alias_num_page = '{:pnp:}';
71
72 /**
73 * String alias for total number of pages in a single group.
74 * @public static
75 */
76 public static $alias_group_tot_pages = '{:ptg:}';
77
78 /**
79 * String alias for group page number.
80 * @public static
81 */
82 public static $alias_group_num_page = '{:png:}';
83
84 /**
85 * String alias for right shift compensation used to correctly align page numbers on the right.
86 * @public static
87 */
88 public static $alias_right_shift = '{rsc:';
89
90 /**
91 * Encryption padding string.
92 * @public static
93 */
94 public static $enc_padding = "\x28\xBF\x4E\x5E\x4E\x75\x8A\x41\x64\x00\x4E\x56\xFF\xFA\x01\x08\x2E\x2E\x00\xB6\xD0\x68\x3E\x80\x2F\x0C\xA9\xFE\x64\x53\x69\x7A";
95
96 /**
97 * ByteRange placemark used during digital signature process.
98 * @since 4.6.028 (2009-08-25)
99 * @public static
100 */
101 public static $byterange_string = '/ByteRange[0 ********** ********** **********]';
102
103 /**
104 * Array page boxes names
105 * @public static
106 */
107 public static $pageboxes = array('MediaBox', 'CropBox', 'BleedBox', 'TrimBox', 'ArtBox');
108
109 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
110
111 /**
112 * Return the current TCPDF version.
113 * @return TCPDF version string
114 * @since 5.9.012 (2010-11-10)
115 * @public static
116 */
117 public static function getTCPDFVersion() {
118 return self::$tcpdf_version;
119 }
120
121 /**
122 * Return the current TCPDF producer.
123 * @return TCPDF producer string
124 * @since 6.0.000 (2013-03-16)
125 * @public static
126 */
127 public static function getTCPDFProducer() {
128 return "\x54\x43\x50\x44\x46\x20".self::getTCPDFVersion()."\x20\x28\x68\x74\x74\x70\x3a\x2f\x2f\x77\x77\x77\x2e\x74\x63\x70\x64\x66\x2e\x6f\x72\x67\x29";
129 }
130
131 /**
132 * Sets the current active configuration setting of magic_quotes_runtime (if the set_magic_quotes_runtime function exist)
133 * @param $mqr (boolean) FALSE for off, TRUE for on.
134 * @since 4.6.025 (2009-08-17)
135 * @public static
136 */
137 public static function set_mqr($mqr) {
138 if (!defined('PHP_VERSION_ID')) {
139 $version = PHP_VERSION;
140 define('PHP_VERSION_ID', (($version[0] * 10000) + ($version[2] * 100) + $version[4]));
141 }
142 if (PHP_VERSION_ID < 50300) {
143 @set_magic_quotes_runtime($mqr);
144 }
145 }
146
147 /**
148 * Gets the current active configuration setting of magic_quotes_runtime (if the get_magic_quotes_runtime function exist)
149 * @return Returns 0 if magic quotes runtime is off or get_magic_quotes_runtime doesn't exist, 1 otherwise.
150 * @since 4.6.025 (2009-08-17)
151 * @public static
152 */
153 public static function get_mqr() {
154 if (!defined('PHP_VERSION_ID')) {
155 $version = PHP_VERSION;
156 define('PHP_VERSION_ID', (($version[0] * 10000) + ($version[2] * 100) + $version[4]));
157 }
158 if (PHP_VERSION_ID < 50300) {
159 return @get_magic_quotes_runtime();
160 }
161 return 0;
162 }
163
164 /**
165 * Get page dimensions from format name.
166 * @param $format (mixed) The format name. It can be: <ul>
167 * <li><b>ISO 216 A Series + 2 SIS 014711 extensions</b></li>
168 * <li>A0 (841x1189 mm ; 33.11x46.81 in)</li>
169 * <li>A1 (594x841 mm ; 23.39x33.11 in)</li>
170 * <li>A2 (420x594 mm ; 16.54x23.39 in)</li>
171 * <li>A3 (297x420 mm ; 11.69x16.54 in)</li>
172 * <li>A4 (210x297 mm ; 8.27x11.69 in)</li>
173 * <li>A5 (148x210 mm ; 5.83x8.27 in)</li>
174 * <li>A6 (105x148 mm ; 4.13x5.83 in)</li>
175 * <li>A7 (74x105 mm ; 2.91x4.13 in)</li>
176 * <li>A8 (52x74 mm ; 2.05x2.91 in)</li>
177 * <li>A9 (37x52 mm ; 1.46x2.05 in)</li>
178 * <li>A10 (26x37 mm ; 1.02x1.46 in)</li>
179 * <li>A11 (18x26 mm ; 0.71x1.02 in)</li>
180 * <li>A12 (13x18 mm ; 0.51x0.71 in)</li>
181 * <li><b>ISO 216 B Series + 2 SIS 014711 extensions</b></li>
182 * <li>B0 (1000x1414 mm ; 39.37x55.67 in)</li>
183 * <li>B1 (707x1000 mm ; 27.83x39.37 in)</li>
184 * <li>B2 (500x707 mm ; 19.69x27.83 in)</li>
185 * <li>B3 (353x500 mm ; 13.90x19.69 in)</li>
186 * <li>B4 (250x353 mm ; 9.84x13.90 in)</li>
187 * <li>B5 (176x250 mm ; 6.93x9.84 in)</li>
188 * <li>B6 (125x176 mm ; 4.92x6.93 in)</li>
189 * <li>B7 (88x125 mm ; 3.46x4.92 in)</li>
190 * <li>B8 (62x88 mm ; 2.44x3.46 in)</li>
191 * <li>B9 (44x62 mm ; 1.73x2.44 in)</li>
192 * <li>B10 (31x44 mm ; 1.22x1.73 in)</li>
193 * <li>B11 (22x31 mm ; 0.87x1.22 in)</li>
194 * <li>B12 (15x22 mm ; 0.59x0.87 in)</li>
195 * <li><b>ISO 216 C Series + 2 SIS 014711 extensions + 2 EXTENSION</b></li>
196 * <li>C0 (917x1297 mm ; 36.10x51.06 in)</li>
197 * <li>C1 (648x917 mm ; 25.51x36.10 in)</li>
198 * <li>C2 (458x648 mm ; 18.03x25.51 in)</li>
199 * <li>C3 (324x458 mm ; 12.76x18.03 in)</li>
200 * <li>C4 (229x324 mm ; 9.02x12.76 in)</li>
201 * <li>C5 (162x229 mm ; 6.38x9.02 in)</li>
202 * <li>C6 (114x162 mm ; 4.49x6.38 in)</li>
203 * <li>C7 (81x114 mm ; 3.19x4.49 in)</li>
204 * <li>C8 (57x81 mm ; 2.24x3.19 in)</li>
205 * <li>C9 (40x57 mm ; 1.57x2.24 in)</li>
206 * <li>C10 (28x40 mm ; 1.10x1.57 in)</li>
207 * <li>C11 (20x28 mm ; 0.79x1.10 in)</li>
208 * <li>C12 (14x20 mm ; 0.55x0.79 in)</li>
209 * <li>C76 (81x162 mm ; 3.19x6.38 in)</li>
210 * <li>DL (110x220 mm ; 4.33x8.66 in)</li>
211 * <li><b>SIS 014711 E Series</b></li>
212 * <li>E0 (879x1241 mm ; 34.61x48.86 in)</li>
213 * <li>E1 (620x879 mm ; 24.41x34.61 in)</li>
214 * <li>E2 (440x620 mm ; 17.32x24.41 in)</li>
215 * <li>E3 (310x440 mm ; 12.20x17.32 in)</li>
216 * <li>E4 (220x310 mm ; 8.66x12.20 in)</li>
217 * <li>E5 (155x220 mm ; 6.10x8.66 in)</li>
218 * <li>E6 (110x155 mm ; 4.33x6.10 in)</li>
219 * <li>E7 (78x110 mm ; 3.07x4.33 in)</li>
220 * <li>E8 (55x78 mm ; 2.17x3.07 in)</li>
221 * <li>E9 (39x55 mm ; 1.54x2.17 in)</li>
222 * <li>E10 (27x39 mm ; 1.06x1.54 in)</li>
223 * <li>E11 (19x27 mm ; 0.75x1.06 in)</li>
224 * <li>E12 (13x19 mm ; 0.51x0.75 in)</li>
225 * <li><b>SIS 014711 G Series</b></li>
226 * <li>G0 (958x1354 mm ; 37.72x53.31 in)</li>
227 * <li>G1 (677x958 mm ; 26.65x37.72 in)</li>
228 * <li>G2 (479x677 mm ; 18.86x26.65 in)</li>
229 * <li>G3 (338x479 mm ; 13.31x18.86 in)</li>
230 * <li>G4 (239x338 mm ; 9.41x13.31 in)</li>
231 * <li>G5 (169x239 mm ; 6.65x9.41 in)</li>
232 * <li>G6 (119x169 mm ; 4.69x6.65 in)</li>
233 * <li>G7 (84x119 mm ; 3.31x4.69 in)</li>
234 * <li>G8 (59x84 mm ; 2.32x3.31 in)</li>
235 * <li>G9 (42x59 mm ; 1.65x2.32 in)</li>
236 * <li>G10 (29x42 mm ; 1.14x1.65 in)</li>
237 * <li>G11 (21x29 mm ; 0.83x1.14 in)</li>
238 * <li>G12 (14x21 mm ; 0.55x0.83 in)</li>
239 * <li><b>ISO Press</b></li>
240 * <li>RA0 (860x1220 mm ; 33.86x48.03 in)</li>
241 * <li>RA1 (610x860 mm ; 24.02x33.86 in)</li>
242 * <li>RA2 (430x610 mm ; 16.93x24.02 in)</li>
243 * <li>RA3 (305x430 mm ; 12.01x16.93 in)</li>
244 * <li>RA4 (215x305 mm ; 8.46x12.01 in)</li>
245 * <li>SRA0 (900x1280 mm ; 35.43x50.39 in)</li>
246 * <li>SRA1 (640x900 mm ; 25.20x35.43 in)</li>
247 * <li>SRA2 (450x640 mm ; 17.72x25.20 in)</li>
248 * <li>SRA3 (320x450 mm ; 12.60x17.72 in)</li>
249 * <li>SRA4 (225x320 mm ; 8.86x12.60 in)</li>
250 * <li><b>German DIN 476</b></li>
251 * <li>4A0 (1682x2378 mm ; 66.22x93.62 in)</li>
252 * <li>2A0 (1189x1682 mm ; 46.81x66.22 in)</li>
253 * <li><b>Variations on the ISO Standard</b></li>
254 * <li>A2_EXTRA (445x619 mm ; 17.52x24.37 in)</li>
255 * <li>A3+ (329x483 mm ; 12.95x19.02 in)</li>
256 * <li>A3_EXTRA (322x445 mm ; 12.68x17.52 in)</li>
257 * <li>A3_SUPER (305x508 mm ; 12.01x20.00 in)</li>
258 * <li>SUPER_A3 (305x487 mm ; 12.01x19.17 in)</li>
259 * <li>A4_EXTRA (235x322 mm ; 9.25x12.68 in)</li>
260 * <li>A4_SUPER (229x322 mm ; 9.02x12.68 in)</li>
261 * <li>SUPER_A4 (227x356 mm ; 8.94x14.02 in)</li>
262 * <li>A4_LONG (210x348 mm ; 8.27x13.70 in)</li>
263 * <li>F4 (210x330 mm ; 8.27x12.99 in)</li>
264 * <li>SO_B5_EXTRA (202x276 mm ; 7.95x10.87 in)</li>
265 * <li>A5_EXTRA (173x235 mm ; 6.81x9.25 in)</li>
266 * <li><b>ANSI Series</b></li>
267 * <li>ANSI_E (864x1118 mm ; 34.00x44.00 in)</li>
268 * <li>ANSI_D (559x864 mm ; 22.00x34.00 in)</li>
269 * <li>ANSI_C (432x559 mm ; 17.00x22.00 in)</li>
270 * <li>ANSI_B (279x432 mm ; 11.00x17.00 in)</li>
271 * <li>ANSI_A (216x279 mm ; 8.50x11.00 in)</li>
272 * <li><b>Traditional 'Loose' North American Paper Sizes</b></li>
273 * <li>LEDGER, USLEDGER (432x279 mm ; 17.00x11.00 in)</li>
274 * <li>TABLOID, USTABLOID, BIBLE, ORGANIZERK (279x432 mm ; 11.00x17.00 in)</li>
275 * <li>LETTER, USLETTER, ORGANIZERM (216x279 mm ; 8.50x11.00 in)</li>
276 * <li>LEGAL, USLEGAL (216x356 mm ; 8.50x14.00 in)</li>
277 * <li>GLETTER, GOVERNMENTLETTER (203x267 mm ; 8.00x10.50 in)</li>
278 * <li>JLEGAL, JUNIORLEGAL (203x127 mm ; 8.00x5.00 in)</li>
279 * <li><b>Other North American Paper Sizes</b></li>
280 * <li>QUADDEMY (889x1143 mm ; 35.00x45.00 in)</li>
281 * <li>SUPER_B (330x483 mm ; 13.00x19.00 in)</li>
282 * <li>QUARTO (229x279 mm ; 9.00x11.00 in)</li>
283 * <li>FOLIO, GOVERNMENTLEGAL (216x330 mm ; 8.50x13.00 in)</li>
284 * <li>EXECUTIVE, MONARCH (184x267 mm ; 7.25x10.50 in)</li>
285 * <li>MEMO, STATEMENT, ORGANIZERL (140x216 mm ; 5.50x8.50 in)</li>
286 * <li>FOOLSCAP (210x330 mm ; 8.27x13.00 in)</li>
287 * <li>COMPACT (108x171 mm ; 4.25x6.75 in)</li>
288 * <li>ORGANIZERJ (70x127 mm ; 2.75x5.00 in)</li>
289 * <li><b>Canadian standard CAN 2-9.60M</b></li>
290 * <li>P1 (560x860 mm ; 22.05x33.86 in)</li>
291 * <li>P2 (430x560 mm ; 16.93x22.05 in)</li>
292 * <li>P3 (280x430 mm ; 11.02x16.93 in)</li>
293 * <li>P4 (215x280 mm ; 8.46x11.02 in)</li>
294 * <li>P5 (140x215 mm ; 5.51x8.46 in)</li>
295 * <li>P6 (107x140 mm ; 4.21x5.51 in)</li>
296 * <li><b>North American Architectural Sizes</b></li>
297 * <li>ARCH_E (914x1219 mm ; 36.00x48.00 in)</li>
298 * <li>ARCH_E1 (762x1067 mm ; 30.00x42.00 in)</li>
299 * <li>ARCH_D (610x914 mm ; 24.00x36.00 in)</li>
300 * <li>ARCH_C, BROADSHEET (457x610 mm ; 18.00x24.00 in)</li>
301 * <li>ARCH_B (305x457 mm ; 12.00x18.00 in)</li>
302 * <li>ARCH_A (229x305 mm ; 9.00x12.00 in)</li>
303 * <li><b>Announcement Envelopes</b></li>
304 * <li>ANNENV_A2 (111x146 mm ; 4.37x5.75 in)</li>
305 * <li>ANNENV_A6 (121x165 mm ; 4.75x6.50 in)</li>
306 * <li>ANNENV_A7 (133x184 mm ; 5.25x7.25 in)</li>
307 * <li>ANNENV_A8 (140x206 mm ; 5.50x8.12 in)</li>
308 * <li>ANNENV_A10 (159x244 mm ; 6.25x9.62 in)</li>
309 * <li>ANNENV_SLIM (98x225 mm ; 3.87x8.87 in)</li>
310 * <li><b>Commercial Envelopes</b></li>
311 * <li>COMMENV_N6_1/4 (89x152 mm ; 3.50x6.00 in)</li>
312 * <li>COMMENV_N6_3/4 (92x165 mm ; 3.62x6.50 in)</li>
313 * <li>COMMENV_N8 (98x191 mm ; 3.87x7.50 in)</li>
314 * <li>COMMENV_N9 (98x225 mm ; 3.87x8.87 in)</li>
315 * <li>COMMENV_N10 (105x241 mm ; 4.12x9.50 in)</li>
316 * <li>COMMENV_N11 (114x263 mm ; 4.50x10.37 in)</li>
317 * <li>COMMENV_N12 (121x279 mm ; 4.75x11.00 in)</li>
318 * <li>COMMENV_N14 (127x292 mm ; 5.00x11.50 in)</li>
319 * <li><b>Catalogue Envelopes</b></li>
320 * <li>CATENV_N1 (152x229 mm ; 6.00x9.00 in)</li>
321 * <li>CATENV_N1_3/4 (165x241 mm ; 6.50x9.50 in)</li>
322 * <li>CATENV_N2 (165x254 mm ; 6.50x10.00 in)</li>
323 * <li>CATENV_N3 (178x254 mm ; 7.00x10.00 in)</li>
324 * <li>CATENV_N6 (191x267 mm ; 7.50x10.50 in)</li>
325 * <li>CATENV_N7 (203x279 mm ; 8.00x11.00 in)</li>
326 * <li>CATENV_N8 (210x286 mm ; 8.25x11.25 in)</li>
327 * <li>CATENV_N9_1/2 (216x267 mm ; 8.50x10.50 in)</li>
328 * <li>CATENV_N9_3/4 (222x286 mm ; 8.75x11.25 in)</li>
329 * <li>CATENV_N10_1/2 (229x305 mm ; 9.00x12.00 in)</li>
330 * <li>CATENV_N12_1/2 (241x318 mm ; 9.50x12.50 in)</li>
331 * <li>CATENV_N13_1/2 (254x330 mm ; 10.00x13.00 in)</li>
332 * <li>CATENV_N14_1/4 (286x311 mm ; 11.25x12.25 in)</li>
333 * <li>CATENV_N14_1/2 (292x368 mm ; 11.50x14.50 in)</li>
334 * <li><b>Japanese (JIS P 0138-61) Standard B-Series</b></li>
335 * <li>JIS_B0 (1030x1456 mm ; 40.55x57.32 in)</li>
336 * <li>JIS_B1 (728x1030 mm ; 28.66x40.55 in)</li>
337 * <li>JIS_B2 (515x728 mm ; 20.28x28.66 in)</li>
338 * <li>JIS_B3 (364x515 mm ; 14.33x20.28 in)</li>
339 * <li>JIS_B4 (257x364 mm ; 10.12x14.33 in)</li>
340 * <li>JIS_B5 (182x257 mm ; 7.17x10.12 in)</li>
341 * <li>JIS_B6 (128x182 mm ; 5.04x7.17 in)</li>
342 * <li>JIS_B7 (91x128 mm ; 3.58x5.04 in)</li>
343 * <li>JIS_B8 (64x91 mm ; 2.52x3.58 in)</li>
344 * <li>JIS_B9 (45x64 mm ; 1.77x2.52 in)</li>
345 * <li>JIS_B10 (32x45 mm ; 1.26x1.77 in)</li>
346 * <li>JIS_B11 (22x32 mm ; 0.87x1.26 in)</li>
347 * <li>JIS_B12 (16x22 mm ; 0.63x0.87 in)</li>
348 * <li><b>PA Series</b></li>
349 * <li>PA0 (840x1120 mm ; 33.07x44.09 in)</li>
350 * <li>PA1 (560x840 mm ; 22.05x33.07 in)</li>
351 * <li>PA2 (420x560 mm ; 16.54x22.05 in)</li>
352 * <li>PA3 (280x420 mm ; 11.02x16.54 in)</li>
353 * <li>PA4 (210x280 mm ; 8.27x11.02 in)</li>
354 * <li>PA5 (140x210 mm ; 5.51x8.27 in)</li>
355 * <li>PA6 (105x140 mm ; 4.13x5.51 in)</li>
356 * <li>PA7 (70x105 mm ; 2.76x4.13 in)</li>
357 * <li>PA8 (52x70 mm ; 2.05x2.76 in)</li>
358 * <li>PA9 (35x52 mm ; 1.38x2.05 in)</li>
359 * <li>PA10 (26x35 mm ; 1.02x1.38 in)</li>
360 * <li><b>Standard Photographic Print Sizes</b></li>
361 * <li>PASSPORT_PHOTO (35x45 mm ; 1.38x1.77 in)</li>
362 * <li>E (82x120 mm ; 3.25x4.72 in)</li>
363 * <li>3R, L (89x127 mm ; 3.50x5.00 in)</li>
364 * <li>4R, KG (102x152 mm ; 4.02x5.98 in)</li>
365 * <li>4D (120x152 mm ; 4.72x5.98 in)</li>
366 * <li>5R, 2L (127x178 mm ; 5.00x7.01 in)</li>
367 * <li>6R, 8P (152x203 mm ; 5.98x7.99 in)</li>
368 * <li>8R, 6P (203x254 mm ; 7.99x10.00 in)</li>
369 * <li>S8R, 6PW (203x305 mm ; 7.99x12.01 in)</li>
370 * <li>10R, 4P (254x305 mm ; 10.00x12.01 in)</li>
371 * <li>S10R, 4PW (254x381 mm ; 10.00x15.00 in)</li>
372 * <li>11R (279x356 mm ; 10.98x14.02 in)</li>
373 * <li>S11R (279x432 mm ; 10.98x17.01 in)</li>
374 * <li>12R (305x381 mm ; 12.01x15.00 in)</li>
375 * <li>S12R (305x456 mm ; 12.01x17.95 in)</li>
376 * <li><b>Common Newspaper Sizes</b></li>
377 * <li>NEWSPAPER_BROADSHEET (750x600 mm ; 29.53x23.62 in)</li>
378 * <li>NEWSPAPER_BERLINER (470x315 mm ; 18.50x12.40 in)</li>
379 * <li>NEWSPAPER_COMPACT, NEWSPAPER_TABLOID (430x280 mm ; 16.93x11.02 in)</li>
380 * <li><b>Business Cards</b></li>
381 * <li>CREDIT_CARD, BUSINESS_CARD, BUSINESS_CARD_ISO7810 (54x86 mm ; 2.13x3.37 in)</li>
382 * <li>BUSINESS_CARD_ISO216 (52x74 mm ; 2.05x2.91 in)</li>
383 * <li>BUSINESS_CARD_IT, BUSINESS_CARD_UK, BUSINESS_CARD_FR, BUSINESS_CARD_DE, BUSINESS_CARD_ES (55x85 mm ; 2.17x3.35 in)</li>
384 * <li>BUSINESS_CARD_US, BUSINESS_CARD_CA (51x89 mm ; 2.01x3.50 in)</li>
385 * <li>BUSINESS_CARD_JP (55x91 mm ; 2.17x3.58 in)</li>
386 * <li>BUSINESS_CARD_HK (54x90 mm ; 2.13x3.54 in)</li>
387 * <li>BUSINESS_CARD_AU, BUSINESS_CARD_DK, BUSINESS_CARD_SE (55x90 mm ; 2.17x3.54 in)</li>
388 * <li>BUSINESS_CARD_RU, BUSINESS_CARD_CZ, BUSINESS_CARD_FI, BUSINESS_CARD_HU, BUSINESS_CARD_IL (50x90 mm ; 1.97x3.54 in)</li>
389 * <li><b>Billboards</b></li>
390 * <li>4SHEET (1016x1524 mm ; 40.00x60.00 in)</li>
391 * <li>6SHEET (1200x1800 mm ; 47.24x70.87 in)</li>
392 * <li>12SHEET (3048x1524 mm ; 120.00x60.00 in)</li>
393 * <li>16SHEET (2032x3048 mm ; 80.00x120.00 in)</li>
394 * <li>32SHEET (4064x3048 mm ; 160.00x120.00 in)</li>
395 * <li>48SHEET (6096x3048 mm ; 240.00x120.00 in)</li>
396 * <li>64SHEET (8128x3048 mm ; 320.00x120.00 in)</li>
397 * <li>96SHEET (12192x3048 mm ; 480.00x120.00 in)</li>
398 * <li><b>Old Imperial English (some are still used in USA)</b></li>
399 * <li>EN_EMPEROR (1219x1829 mm ; 48.00x72.00 in)</li>
400 * <li>EN_ANTIQUARIAN (787x1346 mm ; 31.00x53.00 in)</li>
401 * <li>EN_GRAND_EAGLE (730x1067 mm ; 28.75x42.00 in)</li>
402 * <li>EN_DOUBLE_ELEPHANT (679x1016 mm ; 26.75x40.00 in)</li>
403 * <li>EN_ATLAS (660x864 mm ; 26.00x34.00 in)</li>
404 * <li>EN_COLOMBIER (597x876 mm ; 23.50x34.50 in)</li>
405 * <li>EN_ELEPHANT (584x711 mm ; 23.00x28.00 in)</li>
406 * <li>EN_DOUBLE_DEMY (572x902 mm ; 22.50x35.50 in)</li>
407 * <li>EN_IMPERIAL (559x762 mm ; 22.00x30.00 in)</li>
408 * <li>EN_PRINCESS (546x711 mm ; 21.50x28.00 in)</li>
409 * <li>EN_CARTRIDGE (533x660 mm ; 21.00x26.00 in)</li>
410 * <li>EN_DOUBLE_LARGE_POST (533x838 mm ; 21.00x33.00 in)</li>
411 * <li>EN_ROYAL (508x635 mm ; 20.00x25.00 in)</li>
412 * <li>EN_SHEET, EN_HALF_POST (495x597 mm ; 19.50x23.50 in)</li>
413 * <li>EN_SUPER_ROYAL (483x686 mm ; 19.00x27.00 in)</li>
414 * <li>EN_DOUBLE_POST (483x775 mm ; 19.00x30.50 in)</li>
415 * <li>EN_MEDIUM (445x584 mm ; 17.50x23.00 in)</li>
416 * <li>EN_DEMY (445x572 mm ; 17.50x22.50 in)</li>
417 * <li>EN_LARGE_POST (419x533 mm ; 16.50x21.00 in)</li>
418 * <li>EN_COPY_DRAUGHT (406x508 mm ; 16.00x20.00 in)</li>
419 * <li>EN_POST (394x489 mm ; 15.50x19.25 in)</li>
420 * <li>EN_CROWN (381x508 mm ; 15.00x20.00 in)</li>
421 * <li>EN_PINCHED_POST (375x470 mm ; 14.75x18.50 in)</li>
422 * <li>EN_BRIEF (343x406 mm ; 13.50x16.00 in)</li>
423 * <li>EN_FOOLSCAP (343x432 mm ; 13.50x17.00 in)</li>
424 * <li>EN_SMALL_FOOLSCAP (337x419 mm ; 13.25x16.50 in)</li>
425 * <li>EN_POTT (318x381 mm ; 12.50x15.00 in)</li>
426 * <li><b>Old Imperial Belgian</b></li>
427 * <li>BE_GRAND_AIGLE (700x1040 mm ; 27.56x40.94 in)</li>
428 * <li>BE_COLOMBIER (620x850 mm ; 24.41x33.46 in)</li>
429 * <li>BE_DOUBLE_CARRE (620x920 mm ; 24.41x36.22 in)</li>
430 * <li>BE_ELEPHANT (616x770 mm ; 24.25x30.31 in)</li>
431 * <li>BE_PETIT_AIGLE (600x840 mm ; 23.62x33.07 in)</li>
432 * <li>BE_GRAND_JESUS (550x730 mm ; 21.65x28.74 in)</li>
433 * <li>BE_JESUS (540x730 mm ; 21.26x28.74 in)</li>
434 * <li>BE_RAISIN (500x650 mm ; 19.69x25.59 in)</li>
435 * <li>BE_GRAND_MEDIAN (460x605 mm ; 18.11x23.82 in)</li>
436 * <li>BE_DOUBLE_POSTE (435x565 mm ; 17.13x22.24 in)</li>
437 * <li>BE_COQUILLE (430x560 mm ; 16.93x22.05 in)</li>
438 * <li>BE_PETIT_MEDIAN (415x530 mm ; 16.34x20.87 in)</li>
439 * <li>BE_RUCHE (360x460 mm ; 14.17x18.11 in)</li>
440 * <li>BE_PROPATRIA (345x430 mm ; 13.58x16.93 in)</li>
441 * <li>BE_LYS (317x397 mm ; 12.48x15.63 in)</li>
442 * <li>BE_POT (307x384 mm ; 12.09x15.12 in)</li>
443 * <li>BE_ROSETTE (270x347 mm ; 10.63x13.66 in)</li>
444 * <li><b>Old Imperial French</b></li>
445 * <li>FR_UNIVERS (1000x1300 mm ; 39.37x51.18 in)</li>
446 * <li>FR_DOUBLE_COLOMBIER (900x1260 mm ; 35.43x49.61 in)</li>
447 * <li>FR_GRANDE_MONDE (900x1260 mm ; 35.43x49.61 in)</li>
448 * <li>FR_DOUBLE_SOLEIL (800x1200 mm ; 31.50x47.24 in)</li>
449 * <li>FR_DOUBLE_JESUS (760x1120 mm ; 29.92x44.09 in)</li>
450 * <li>FR_GRAND_AIGLE (750x1060 mm ; 29.53x41.73 in)</li>
451 * <li>FR_PETIT_AIGLE (700x940 mm ; 27.56x37.01 in)</li>
452 * <li>FR_DOUBLE_RAISIN (650x1000 mm ; 25.59x39.37 in)</li>
453 * <li>FR_JOURNAL (650x940 mm ; 25.59x37.01 in)</li>
454 * <li>FR_COLOMBIER_AFFICHE (630x900 mm ; 24.80x35.43 in)</li>
455 * <li>FR_DOUBLE_CAVALIER (620x920 mm ; 24.41x36.22 in)</li>
456 * <li>FR_CLOCHE (600x800 mm ; 23.62x31.50 in)</li>
457 * <li>FR_SOLEIL (600x800 mm ; 23.62x31.50 in)</li>
458 * <li>FR_DOUBLE_CARRE (560x900 mm ; 22.05x35.43 in)</li>
459 * <li>FR_DOUBLE_COQUILLE (560x880 mm ; 22.05x34.65 in)</li>
460 * <li>FR_JESUS (560x760 mm ; 22.05x29.92 in)</li>
461 * <li>FR_RAISIN (500x650 mm ; 19.69x25.59 in)</li>
462 * <li>FR_CAVALIER (460x620 mm ; 18.11x24.41 in)</li>
463 * <li>FR_DOUBLE_COURONNE (460x720 mm ; 18.11x28.35 in)</li>
464 * <li>FR_CARRE (450x560 mm ; 17.72x22.05 in)</li>
465 * <li>FR_COQUILLE (440x560 mm ; 17.32x22.05 in)</li>
466 * <li>FR_DOUBLE_TELLIERE (440x680 mm ; 17.32x26.77 in)</li>
467 * <li>FR_DOUBLE_CLOCHE (400x600 mm ; 15.75x23.62 in)</li>
468 * <li>FR_DOUBLE_POT (400x620 mm ; 15.75x24.41 in)</li>
469 * <li>FR_ECU (400x520 mm ; 15.75x20.47 in)</li>
470 * <li>FR_COURONNE (360x460 mm ; 14.17x18.11 in)</li>
471 * <li>FR_TELLIERE (340x440 mm ; 13.39x17.32 in)</li>
472 * <li>FR_POT (310x400 mm ; 12.20x15.75 in)</li>
473 * </ul>
474 * @return array containing page width and height in points
475 * @since 5.0.010 (2010-05-17)
476 * @public static
477 */
478 public static function getPageSizeFromFormat($format) {
479 // Paper cordinates are calculated in this way: (inches * 72) where (1 inch = 25.4 mm)
480 switch (strtoupper($format)) {
481 // ISO 216 A Series + 2 SIS 014711 extensions
482 case 'A0' : {$pf = array( 2383.937, 3370.394); break;}
483 case 'A1' : {$pf = array( 1683.780, 2383.937); break;}
484 case 'A2' : {$pf = array( 1190.551, 1683.780); break;}
485 case 'A3' : {$pf = array( 841.890, 1190.551); break;}
486 case 'A4' : {$pf = array( 595.276, 841.890); break;}
487 case 'A5' : {$pf = array( 419.528, 595.276); break;}
488 case 'A6' : {$pf = array( 297.638, 419.528); break;}
489 case 'A7' : {$pf = array( 209.764, 297.638); break;}
490 case 'A8' : {$pf = array( 147.402, 209.764); break;}
491 case 'A9' : {$pf = array( 104.882, 147.402); break;}
492 case 'A10': {$pf = array( 73.701, 104.882); break;}
493 case 'A11': {$pf = array( 51.024, 73.701); break;}
494 case 'A12': {$pf = array( 36.850, 51.024); break;}
495 // ISO 216 B Series + 2 SIS 014711 extensions
496 case 'B0' : {$pf = array( 2834.646, 4008.189); break;}
497 case 'B1' : {$pf = array( 2004.094, 2834.646); break;}
498 case 'B2' : {$pf = array( 1417.323, 2004.094); break;}
499 case 'B3' : {$pf = array( 1000.630, 1417.323); break;}
500 case 'B4' : {$pf = array( 708.661, 1000.630); break;}
501 case 'B5' : {$pf = array( 498.898, 708.661); break;}
502 case 'B6' : {$pf = array( 354.331, 498.898); break;}
503 case 'B7' : {$pf = array( 249.449, 354.331); break;}
504 case 'B8' : {$pf = array( 175.748, 249.449); break;}
505 case 'B9' : {$pf = array( 124.724, 175.748); break;}
506 case 'B10': {$pf = array( 87.874, 124.724); break;}
507 case 'B11': {$pf = array( 62.362, 87.874); break;}
508 case 'B12': {$pf = array( 42.520, 62.362); break;}
509 // ISO 216 C Series + 2 SIS 014711 extensions + 2 EXTENSION
510 case 'C0' : {$pf = array( 2599.370, 3676.535); break;}
511 case 'C1' : {$pf = array( 1836.850, 2599.370); break;}
512 case 'C2' : {$pf = array( 1298.268, 1836.850); break;}
513 case 'C3' : {$pf = array( 918.425, 1298.268); break;}
514 case 'C4' : {$pf = array( 649.134, 918.425); break;}
515 case 'C5' : {$pf = array( 459.213, 649.134); break;}
516 case 'C6' : {$pf = array( 323.150, 459.213); break;}
517 case 'C7' : {$pf = array( 229.606, 323.150); break;}
518 case 'C8' : {$pf = array( 161.575, 229.606); break;}
519 case 'C9' : {$pf = array( 113.386, 161.575); break;}
520 case 'C10': {$pf = array( 79.370, 113.386); break;}
521 case 'C11': {$pf = array( 56.693, 79.370); break;}
522 case 'C12': {$pf = array( 39.685, 56.693); break;}
523 case 'C76': {$pf = array( 229.606, 459.213); break;}
524 case 'DL' : {$pf = array( 311.811, 623.622); break;}
525 // SIS 014711 E Series
526 case 'E0' : {$pf = array( 2491.654, 3517.795); break;}
527 case 'E1' : {$pf = array( 1757.480, 2491.654); break;}
528 case 'E2' : {$pf = array( 1247.244, 1757.480); break;}
529 case 'E3' : {$pf = array( 878.740, 1247.244); break;}
530 case 'E4' : {$pf = array( 623.622, 878.740); break;}
531 case 'E5' : {$pf = array( 439.370, 623.622); break;}
532 case 'E6' : {$pf = array( 311.811, 439.370); break;}
533 case 'E7' : {$pf = array( 221.102, 311.811); break;}
534 case 'E8' : {$pf = array( 155.906, 221.102); break;}
535 case 'E9' : {$pf = array( 110.551, 155.906); break;}
536 case 'E10': {$pf = array( 76.535, 110.551); break;}
537 case 'E11': {$pf = array( 53.858, 76.535); break;}
538 case 'E12': {$pf = array( 36.850, 53.858); break;}
539 // SIS 014711 G Series
540 case 'G0' : {$pf = array( 2715.591, 3838.110); break;}
541 case 'G1' : {$pf = array( 1919.055, 2715.591); break;}
542 case 'G2' : {$pf = array( 1357.795, 1919.055); break;}
543 case 'G3' : {$pf = array( 958.110, 1357.795); break;}
544 case 'G4' : {$pf = array( 677.480, 958.110); break;}
545 case 'G5' : {$pf = array( 479.055, 677.480); break;}
546 case 'G6' : {$pf = array( 337.323, 479.055); break;}
547 case 'G7' : {$pf = array( 238.110, 337.323); break;}
548 case 'G8' : {$pf = array( 167.244, 238.110); break;}
549 case 'G9' : {$pf = array( 119.055, 167.244); break;}
550 case 'G10': {$pf = array( 82.205, 119.055); break;}
551 case 'G11': {$pf = array( 59.528, 82.205); break;}
552 case 'G12': {$pf = array( 39.685, 59.528); break;}
553 // ISO Press
554 case 'RA0': {$pf = array( 2437.795, 3458.268); break;}
555 case 'RA1': {$pf = array( 1729.134, 2437.795); break;}
556 case 'RA2': {$pf = array( 1218.898, 1729.134); break;}
557 case 'RA3': {$pf = array( 864.567, 1218.898); break;}
558 case 'RA4': {$pf = array( 609.449, 864.567); break;}
559 case 'SRA0': {$pf = array( 2551.181, 3628.346); break;}
560 case 'SRA1': {$pf = array( 1814.173, 2551.181); break;}
561 case 'SRA2': {$pf = array( 1275.591, 1814.173); break;}
562 case 'SRA3': {$pf = array( 907.087, 1275.591); break;}
563 case 'SRA4': {$pf = array( 637.795, 907.087); break;}
564 // German DIN 476
565 case '4A0': {$pf = array( 4767.874, 6740.787); break;}
566 case '2A0': {$pf = array( 3370.394, 4767.874); break;}
567 // Variations on the ISO Standard
568 case 'A2_EXTRA' : {$pf = array( 1261.417, 1754.646); break;}
569 case 'A3+' : {$pf = array( 932.598, 1369.134); break;}
570 case 'A3_EXTRA' : {$pf = array( 912.756, 1261.417); break;}
571 case 'A3_SUPER' : {$pf = array( 864.567, 1440.000); break;}
572 case 'SUPER_A3' : {$pf = array( 864.567, 1380.472); break;}
573 case 'A4_EXTRA' : {$pf = array( 666.142, 912.756); break;}
574 case 'A4_SUPER' : {$pf = array( 649.134, 912.756); break;}
575 case 'SUPER_A4' : {$pf = array( 643.465, 1009.134); break;}
576 case 'A4_LONG' : {$pf = array( 595.276, 986.457); break;}
577 case 'F4' : {$pf = array( 595.276, 935.433); break;}
578 case 'SO_B5_EXTRA': {$pf = array( 572.598, 782.362); break;}
579 case 'A5_EXTRA' : {$pf = array( 490.394, 666.142); break;}
580 // ANSI Series
581 case 'ANSI_E': {$pf = array( 2448.000, 3168.000); break;}
582 case 'ANSI_D': {$pf = array( 1584.000, 2448.000); break;}
583 case 'ANSI_C': {$pf = array( 1224.000, 1584.000); break;}
584 case 'ANSI_B': {$pf = array( 792.000, 1224.000); break;}
585 case 'ANSI_A': {$pf = array( 612.000, 792.000); break;}
586 // Traditional 'Loose' North American Paper Sizes
587 case 'USLEDGER':
588 case 'LEDGER' : {$pf = array( 1224.000, 792.000); break;}
589 case 'ORGANIZERK':
590 case 'BIBLE':
591 case 'USTABLOID':
592 case 'TABLOID': {$pf = array( 792.000, 1224.000); break;}
593 case 'ORGANIZERM':
594 case 'USLETTER':
595 case 'LETTER' : {$pf = array( 612.000, 792.000); break;}
596 case 'USLEGAL':
597 case 'LEGAL' : {$pf = array( 612.000, 1008.000); break;}
598 case 'GOVERNMENTLETTER':
599 case 'GLETTER': {$pf = array( 576.000, 756.000); break;}
600 case 'JUNIORLEGAL':
601 case 'JLEGAL' : {$pf = array( 576.000, 360.000); break;}
602 // Other North American Paper Sizes
603 case 'QUADDEMY': {$pf = array( 2520.000, 3240.000); break;}
604 case 'SUPER_B': {$pf = array( 936.000, 1368.000); break;}
605 case 'QUARTO': {$pf = array( 648.000, 792.000); break;}
606 case 'GOVERNMENTLEGAL':
607 case 'FOLIO': {$pf = array( 612.000, 936.000); break;}
608 case 'MONARCH':
609 case 'EXECUTIVE': {$pf = array( 522.000, 756.000); break;}
610 case 'ORGANIZERL':
611 case 'STATEMENT':
612 case 'MEMO': {$pf = array( 396.000, 612.000); break;}
613 case 'FOOLSCAP': {$pf = array( 595.440, 936.000); break;}
614 case 'COMPACT': {$pf = array( 306.000, 486.000); break;}
615 case 'ORGANIZERJ': {$pf = array( 198.000, 360.000); break;}
616 // Canadian standard CAN 2-9.60M
617 case 'P1': {$pf = array( 1587.402, 2437.795); break;}
618 case 'P2': {$pf = array( 1218.898, 1587.402); break;}
619 case 'P3': {$pf = array( 793.701, 1218.898); break;}
620 case 'P4': {$pf = array( 609.449, 793.701); break;}
621 case 'P5': {$pf = array( 396.850, 609.449); break;}
622 case 'P6': {$pf = array( 303.307, 396.850); break;}
623 // North American Architectural Sizes
624 case 'ARCH_E' : {$pf = array( 2592.000, 3456.000); break;}
625 case 'ARCH_E1': {$pf = array( 2160.000, 3024.000); break;}
626 case 'ARCH_D' : {$pf = array( 1728.000, 2592.000); break;}
627 case 'BROADSHEET':
628 case 'ARCH_C' : {$pf = array( 1296.000, 1728.000); break;}
629 case 'ARCH_B' : {$pf = array( 864.000, 1296.000); break;}
630 case 'ARCH_A' : {$pf = array( 648.000, 864.000); break;}
631 // --- North American Envelope Sizes ---
632 // - Announcement Envelopes
633 case 'ANNENV_A2' : {$pf = array( 314.640, 414.000); break;}
634 case 'ANNENV_A6' : {$pf = array( 342.000, 468.000); break;}
635 case 'ANNENV_A7' : {$pf = array( 378.000, 522.000); break;}
636 case 'ANNENV_A8' : {$pf = array( 396.000, 584.640); break;}
637 case 'ANNENV_A10' : {$pf = array( 450.000, 692.640); break;}
638 case 'ANNENV_SLIM': {$pf = array( 278.640, 638.640); break;}
639 // - Commercial Envelopes
640 case 'COMMENV_N6_1/4': {$pf = array( 252.000, 432.000); break;}
641 case 'COMMENV_N6_3/4': {$pf = array( 260.640, 468.000); break;}
642 case 'COMMENV_N8' : {$pf = array( 278.640, 540.000); break;}
643 case 'COMMENV_N9' : {$pf = array( 278.640, 638.640); break;}
644 case 'COMMENV_N10' : {$pf = array( 296.640, 684.000); break;}
645 case 'COMMENV_N11' : {$pf = array( 324.000, 746.640); break;}
646 case 'COMMENV_N12' : {$pf = array( 342.000, 792.000); break;}
647 case 'COMMENV_N14' : {$pf = array( 360.000, 828.000); break;}
648 // - Catalogue Envelopes
649 case 'CATENV_N1' : {$pf = array( 432.000, 648.000); break;}
650 case 'CATENV_N1_3/4' : {$pf = array( 468.000, 684.000); break;}
651 case 'CATENV_N2' : {$pf = array( 468.000, 720.000); break;}
652 case 'CATENV_N3' : {$pf = array( 504.000, 720.000); break;}
653 case 'CATENV_N6' : {$pf = array( 540.000, 756.000); break;}
654 case 'CATENV_N7' : {$pf = array( 576.000, 792.000); break;}
655 case 'CATENV_N8' : {$pf = array( 594.000, 810.000); break;}
656 case 'CATENV_N9_1/2' : {$pf = array( 612.000, 756.000); break;}
657 case 'CATENV_N9_3/4' : {$pf = array( 630.000, 810.000); break;}
658 case 'CATENV_N10_1/2': {$pf = array( 648.000, 864.000); break;}
659 case 'CATENV_N12_1/2': {$pf = array( 684.000, 900.000); break;}
660 case 'CATENV_N13_1/2': {$pf = array( 720.000, 936.000); break;}
661 case 'CATENV_N14_1/4': {$pf = array( 810.000, 882.000); break;}
662 case 'CATENV_N14_1/2': {$pf = array( 828.000, 1044.000); break;}
663 // Japanese (JIS P 0138-61) Standard B-Series
664 case 'JIS_B0' : {$pf = array( 2919.685, 4127.244); break;}
665 case 'JIS_B1' : {$pf = array( 2063.622, 2919.685); break;}
666 case 'JIS_B2' : {$pf = array( 1459.843, 2063.622); break;}
667 case 'JIS_B3' : {$pf = array( 1031.811, 1459.843); break;}
668 case 'JIS_B4' : {$pf = array( 728.504, 1031.811); break;}
669 case 'JIS_B5' : {$pf = array( 515.906, 728.504); break;}
670 case 'JIS_B6' : {$pf = array( 362.835, 515.906); break;}
671 case 'JIS_B7' : {$pf = array( 257.953, 362.835); break;}
672 case 'JIS_B8' : {$pf = array( 181.417, 257.953); break;}
673 case 'JIS_B9' : {$pf = array( 127.559, 181.417); break;}
674 case 'JIS_B10': {$pf = array( 90.709, 127.559); break;}
675 case 'JIS_B11': {$pf = array( 62.362, 90.709); break;}
676 case 'JIS_B12': {$pf = array( 45.354, 62.362); break;}
677 // PA Series
678 case 'PA0' : {$pf = array( 2381.102, 3174.803,); break;}
679 case 'PA1' : {$pf = array( 1587.402, 2381.102); break;}
680 case 'PA2' : {$pf = array( 1190.551, 1587.402); break;}
681 case 'PA3' : {$pf = array( 793.701, 1190.551); break;}
682 case 'PA4' : {$pf = array( 595.276, 793.701); break;}
683 case 'PA5' : {$pf = array( 396.850, 595.276); break;}
684 case 'PA6' : {$pf = array( 297.638, 396.850); break;}
685 case 'PA7' : {$pf = array( 198.425, 297.638); break;}
686 case 'PA8' : {$pf = array( 147.402, 198.425); break;}
687 case 'PA9' : {$pf = array( 99.213, 147.402); break;}
688 case 'PA10': {$pf = array( 73.701, 99.213); break;}
689 // Standard Photographic Print Sizes
690 case 'PASSPORT_PHOTO': {$pf = array( 99.213, 127.559); break;}
691 case 'E' : {$pf = array( 233.858, 340.157); break;}
692 case 'L':
693 case '3R' : {$pf = array( 252.283, 360.000); break;}
694 case 'KG':
695 case '4R' : {$pf = array( 289.134, 430.866); break;}
696 case '4D' : {$pf = array( 340.157, 430.866); break;}
697 case '2L':
698 case '5R' : {$pf = array( 360.000, 504.567); break;}
699 case '8P':
700 case '6R' : {$pf = array( 430.866, 575.433); break;}
701 case '6P':
702 case '8R' : {$pf = array( 575.433, 720.000); break;}
703 case '6PW':
704 case 'S8R' : {$pf = array( 575.433, 864.567); break;}
705 case '4P':
706 case '10R' : {$pf = array( 720.000, 864.567); break;}
707 case '4PW':
708 case 'S10R': {$pf = array( 720.000, 1080.000); break;}
709 case '11R' : {$pf = array( 790.866, 1009.134); break;}
710 case 'S11R': {$pf = array( 790.866, 1224.567); break;}
711 case '12R' : {$pf = array( 864.567, 1080.000); break;}
712 case 'S12R': {$pf = array( 864.567, 1292.598); break;}
713 // Common Newspaper Sizes
714 case 'NEWSPAPER_BROADSHEET': {$pf = array( 2125.984, 1700.787); break;}
715 case 'NEWSPAPER_BERLINER' : {$pf = array( 1332.283, 892.913); break;}
716 case 'NEWSPAPER_TABLOID':
717 case 'NEWSPAPER_COMPACT' : {$pf = array( 1218.898, 793.701); break;}
718 // Business Cards
719 case 'CREDIT_CARD':
720 case 'BUSINESS_CARD':
721 case 'BUSINESS_CARD_ISO7810': {$pf = array( 153.014, 242.646); break;}
722 case 'BUSINESS_CARD_ISO216' : {$pf = array( 147.402, 209.764); break;}
723 case 'BUSINESS_CARD_IT':
724 case 'BUSINESS_CARD_UK':
725 case 'BUSINESS_CARD_FR':
726 case 'BUSINESS_CARD_DE':
727 case 'BUSINESS_CARD_ES' : {$pf = array( 155.906, 240.945); break;}
728 case 'BUSINESS_CARD_CA':
729 case 'BUSINESS_CARD_US' : {$pf = array( 144.567, 252.283); break;}
730 case 'BUSINESS_CARD_JP' : {$pf = array( 155.906, 257.953); break;}
731 case 'BUSINESS_CARD_HK' : {$pf = array( 153.071, 255.118); break;}
732 case 'BUSINESS_CARD_AU':
733 case 'BUSINESS_CARD_DK':
734 case 'BUSINESS_CARD_SE' : {$pf = array( 155.906, 255.118); break;}
735 case 'BUSINESS_CARD_RU':
736 case 'BUSINESS_CARD_CZ':
737 case 'BUSINESS_CARD_FI':
738 case 'BUSINESS_CARD_HU':
739 case 'BUSINESS_CARD_IL' : {$pf = array( 141.732, 255.118); break;}
740 // Billboards
741 case '4SHEET' : {$pf = array( 2880.000, 4320.000); break;}
742 case '6SHEET' : {$pf = array( 3401.575, 5102.362); break;}
743 case '12SHEET': {$pf = array( 8640.000, 4320.000); break;}
744 case '16SHEET': {$pf = array( 5760.000, 8640.000); break;}
745 case '32SHEET': {$pf = array(11520.000, 8640.000); break;}
746 case '48SHEET': {$pf = array(17280.000, 8640.000); break;}
747 case '64SHEET': {$pf = array(23040.000, 8640.000); break;}
748 case '96SHEET': {$pf = array(34560.000, 8640.000); break;}
749 // Old European Sizes
750 // - Old Imperial English Sizes
751 case 'EN_EMPEROR' : {$pf = array( 3456.000, 5184.000); break;}
752 case 'EN_ANTIQUARIAN' : {$pf = array( 2232.000, 3816.000); break;}
753 case 'EN_GRAND_EAGLE' : {$pf = array( 2070.000, 3024.000); break;}
754 case 'EN_DOUBLE_ELEPHANT' : {$pf = array( 1926.000, 2880.000); break;}
755 case 'EN_ATLAS' : {$pf = array( 1872.000, 2448.000); break;}
756 case 'EN_COLOMBIER' : {$pf = array( 1692.000, 2484.000); break;}
757 case 'EN_ELEPHANT' : {$pf = array( 1656.000, 2016.000); break;}
758 case 'EN_DOUBLE_DEMY' : {$pf = array( 1620.000, 2556.000); break;}
759 case 'EN_IMPERIAL' : {$pf = array( 1584.000, 2160.000); break;}
760 case 'EN_PRINCESS' : {$pf = array( 1548.000, 2016.000); break;}
761 case 'EN_CARTRIDGE' : {$pf = array( 1512.000, 1872.000); break;}
762 case 'EN_DOUBLE_LARGE_POST': {$pf = array( 1512.000, 2376.000); break;}
763 case 'EN_ROYAL' : {$pf = array( 1440.000, 1800.000); break;}
764 case 'EN_SHEET':
765 case 'EN_HALF_POST' : {$pf = array( 1404.000, 1692.000); break;}
766 case 'EN_SUPER_ROYAL' : {$pf = array( 1368.000, 1944.000); break;}
767 case 'EN_DOUBLE_POST' : {$pf = array( 1368.000, 2196.000); break;}
768 case 'EN_MEDIUM' : {$pf = array( 1260.000, 1656.000); break;}
769 case 'EN_DEMY' : {$pf = array( 1260.000, 1620.000); break;}
770 case 'EN_LARGE_POST' : {$pf = array( 1188.000, 1512.000); break;}
771 case 'EN_COPY_DRAUGHT' : {$pf = array( 1152.000, 1440.000); break;}
772 case 'EN_POST' : {$pf = array( 1116.000, 1386.000); break;}
773 case 'EN_CROWN' : {$pf = array( 1080.000, 1440.000); break;}
774 case 'EN_PINCHED_POST' : {$pf = array( 1062.000, 1332.000); break;}
775 case 'EN_BRIEF' : {$pf = array( 972.000, 1152.000); break;}
776 case 'EN_FOOLSCAP' : {$pf = array( 972.000, 1224.000); break;}
777 case 'EN_SMALL_FOOLSCAP' : {$pf = array( 954.000, 1188.000); break;}
778 case 'EN_POTT' : {$pf = array( 900.000, 1080.000); break;}
779 // - Old Imperial Belgian Sizes
780 case 'BE_GRAND_AIGLE' : {$pf = array( 1984.252, 2948.031); break;}
781 case 'BE_COLOMBIER' : {$pf = array( 1757.480, 2409.449); break;}
782 case 'BE_DOUBLE_CARRE': {$pf = array( 1757.480, 2607.874); break;}
783 case 'BE_ELEPHANT' : {$pf = array( 1746.142, 2182.677); break;}
784 case 'BE_PETIT_AIGLE' : {$pf = array( 1700.787, 2381.102); break;}
785 case 'BE_GRAND_JESUS' : {$pf = array( 1559.055, 2069.291); break;}
786 case 'BE_JESUS' : {$pf = array( 1530.709, 2069.291); break;}
787 case 'BE_RAISIN' : {$pf = array( 1417.323, 1842.520); break;}
788 case 'BE_GRAND_MEDIAN': {$pf = array( 1303.937, 1714.961); break;}
789 case 'BE_DOUBLE_POSTE': {$pf = array( 1233.071, 1601.575); break;}
790 case 'BE_COQUILLE' : {$pf = array( 1218.898, 1587.402); break;}
791 case 'BE_PETIT_MEDIAN': {$pf = array( 1176.378, 1502.362); break;}
792 case 'BE_RUCHE' : {$pf = array( 1020.472, 1303.937); break;}
793 case 'BE_PROPATRIA' : {$pf = array( 977.953, 1218.898); break;}
794 case 'BE_LYS' : {$pf = array( 898.583, 1125.354); break;}
795 case 'BE_POT' : {$pf = array( 870.236, 1088.504); break;}
796 case 'BE_ROSETTE' : {$pf = array( 765.354, 983.622); break;}
797 // - Old Imperial French Sizes
798 case 'FR_UNIVERS' : {$pf = array( 2834.646, 3685.039); break;}
799 case 'FR_DOUBLE_COLOMBIER' : {$pf = array( 2551.181, 3571.654); break;}
800 case 'FR_GRANDE_MONDE' : {$pf = array( 2551.181, 3571.654); break;}
801 case 'FR_DOUBLE_SOLEIL' : {$pf = array( 2267.717, 3401.575); break;}
802 case 'FR_DOUBLE_JESUS' : {$pf = array( 2154.331, 3174.803); break;}
803 case 'FR_GRAND_AIGLE' : {$pf = array( 2125.984, 3004.724); break;}
804 case 'FR_PETIT_AIGLE' : {$pf = array( 1984.252, 2664.567); break;}
805 case 'FR_DOUBLE_RAISIN' : {$pf = array( 1842.520, 2834.646); break;}
806 case 'FR_JOURNAL' : {$pf = array( 1842.520, 2664.567); break;}
807 case 'FR_COLOMBIER_AFFICHE': {$pf = array( 1785.827, 2551.181); break;}
808 case 'FR_DOUBLE_CAVALIER' : {$pf = array( 1757.480, 2607.874); break;}
809 case 'FR_CLOCHE' : {$pf = array( 1700.787, 2267.717); break;}
810 case 'FR_SOLEIL' : {$pf = array( 1700.787, 2267.717); break;}
811 case 'FR_DOUBLE_CARRE' : {$pf = array( 1587.402, 2551.181); break;}
812 case 'FR_DOUBLE_COQUILLE' : {$pf = array( 1587.402, 2494.488); break;}
813 case 'FR_JESUS' : {$pf = array( 1587.402, 2154.331); break;}
814 case 'FR_RAISIN' : {$pf = array( 1417.323, 1842.520); break;}
815 case 'FR_CAVALIER' : {$pf = array( 1303.937, 1757.480); break;}
816 case 'FR_DOUBLE_COURONNE' : {$pf = array( 1303.937, 2040.945); break;}
817 case 'FR_CARRE' : {$pf = array( 1275.591, 1587.402); break;}
818 case 'FR_COQUILLE' : {$pf = array( 1247.244, 1587.402); break;}
819 case 'FR_DOUBLE_TELLIERE' : {$pf = array( 1247.244, 1927.559); break;}
820 case 'FR_DOUBLE_CLOCHE' : {$pf = array( 1133.858, 1700.787); break;}
821 case 'FR_DOUBLE_POT' : {$pf = array( 1133.858, 1757.480); break;}
822 case 'FR_ECU' : {$pf = array( 1133.858, 1474.016); break;}
823 case 'FR_COURONNE' : {$pf = array( 1020.472, 1303.937); break;}
824 case 'FR_TELLIERE' : {$pf = array( 963.780, 1247.244); break;}
825 case 'FR_POT' : {$pf = array( 878.740, 1133.858); break;}
826 // DEFAULT ISO A4
827 default: {$pf = array( 595.276, 841.890); break;}
828 }
829 return $pf;
830 }
831
832 /**
833 * Set page boundaries.
834 * @param $page (int) page number
835 * @param $type (string) valid values are: <ul><li>'MediaBox' : the boundaries of the physical medium on which the page shall be displayed or printed;</li><li>'CropBox' : the visible region of default user space;</li><li>'BleedBox' : the region to which the contents of the page shall be clipped when output in a production environment;</li><li>'TrimBox' : the intended dimensions of the finished page after trimming;</li><li>'ArtBox' : the page's meaningful content (including potential white space).</li></ul>
836 * @param $llx (float) lower-left x coordinate in user units.
837 * @param $lly (float) lower-left y coordinate in user units.
838 * @param $urx (float) upper-right x coordinate in user units.
839 * @param $ury (float) upper-right y coordinate in user units.
840 * @param $points (boolean) If true uses user units as unit of measure, otherwise uses PDF points.
841 * @param $k (float) Scale factor (number of points in user unit).
842 * @param $pagedim (array) Array of page dimensions.
843 * @return pagedim array of page dimensions.
844 * @since 5.0.010 (2010-05-17)
845 * @public static
846 */
847 public static function setPageBoxes($page, $type, $llx, $lly, $urx, $ury, $points=false, $k, $pagedim=array()) {
848 if (!isset($pagedim[$page])) {
849 // initialize array
850 $pagedim[$page] = array();
851 }
852 if (!in_array($type, self::$pageboxes)) {
853 return;
854 }
855 if ($points) {
856 $k = 1;
857 }
858 $pagedim[$page][$type]['llx'] = ($llx * $k);
859 $pagedim[$page][$type]['lly'] = ($lly * $k);
860 $pagedim[$page][$type]['urx'] = ($urx * $k);
861 $pagedim[$page][$type]['ury'] = ($ury * $k);
862 return $pagedim;
863 }
864
865 /**
866 * Swap X and Y coordinates of page boxes (change page boxes orientation).
867 * @param $page (int) page number
868 * @param $pagedim (array) Array of page dimensions.
869 * @return pagedim array of page dimensions.
870 * @since 5.0.010 (2010-05-17)
871 * @public static
872 */
873 public static function swapPageBoxCoordinates($page, $pagedim) {
874 foreach (self::$pageboxes as $type) {
875 // swap X and Y coordinates
876 if (isset($pagedim[$page][$type])) {
877 $tmp = $pagedim[$page][$type]['llx'];
878 $pagedim[$page][$type]['llx'] = $pagedim[$page][$type]['lly'];
879 $pagedim[$page][$type]['lly'] = $tmp;
880 $tmp = $pagedim[$page][$type]['urx'];
881 $pagedim[$page][$type]['urx'] = $pagedim[$page][$type]['ury'];
882 $pagedim[$page][$type]['ury'] = $tmp;
883 }
884 }
885 return $pagedim;
886 }
887
888 /**
889 * Get the canonical page layout mode.
890 * @param $layout (string) The page layout. Possible values are:<ul><li>SinglePage Display one page at a time</li><li>OneColumn Display the pages in one column</li><li>TwoColumnLeft Display the pages in two columns, with odd-numbered pages on the left</li><li>TwoColumnRight Display the pages in two columns, with odd-numbered pages on the right</li><li>TwoPageLeft (PDF 1.5) Display the pages two at a time, with odd-numbered pages on the left</li><li>TwoPageRight (PDF 1.5) Display the pages two at a time, with odd-numbered pages on the right</li></ul>
891 * @return (string) Canonical page layout name.
892 * @public static
893 */
894 public static function getPageLayoutMode($layout='SinglePage') {
895 switch ($layout) {
896 case 'default':
897 case 'single':
898 case 'SinglePage': {
899 $layout_mode = 'SinglePage';
900 break;
901 }
902 case 'continuous':
903 case 'OneColumn': {
904 $layout_mode = 'OneColumn';
905 break;
906 }
907 case 'two':
908 case 'TwoColumnLeft': {
909 $layout_mode = 'TwoColumnLeft';
910 break;
911 }
912 case 'TwoColumnRight': {
913 $layout_mode = 'TwoColumnRight';
914 break;
915 }
916 case 'TwoPageLeft': {
917 $layout_mode = 'TwoPageLeft';
918 break;
919 }
920 case 'TwoPageRight': {
921 $layout_mode = 'TwoPageRight';
922 break;
923 }
924 default: {
925 $layout_mode = 'SinglePage';
926 }
927 }
928 return $layout_mode;
929 }
930
931 /**
932 * Get the canonical page layout mode.
933 * @param $mode (string) A name object specifying how the document should be displayed when opened:<ul><li>UseNone Neither document outline nor thumbnail images visible</li><li>UseOutlines Document outline visible</li><li>UseThumbs Thumbnail images visible</li><li>FullScreen Full-screen mode, with no menu bar, window controls, or any other window visible</li><li>UseOC (PDF 1.5) Optional content group panel visible</li><li>UseAttachments (PDF 1.6) Attachments panel visible</li></ul>
934 * @return (string) Canonical page mode name.
935 * @public static
936 */
937 public static function getPageMode($mode='UseNone') {
938 switch ($mode) {
939 case 'UseNone': {
940 $page_mode = 'UseNone';
941 break;
942 }
943 case 'UseOutlines': {
944 $page_mode = 'UseOutlines';
945 break;
946 }
947 case 'UseThumbs': {
948 $page_mode = 'UseThumbs';
949 break;
950 }
951 case 'FullScreen': {
952 $page_mode = 'FullScreen';
953 break;
954 }
955 case 'UseOC': {
956 $page_mode = 'UseOC';
957 break;
958 }
959 case '': {
960 $page_mode = 'UseAttachments';
961 break;
962 }
963 default: {
964 $page_mode = 'UseNone';
965 }
966 }
967 return $page_mode;
968 }
969
970 /**
971 * Check if the URL exist.
972 * @param $url (string) URL to check.
973 * @return Boolean true if the URl exist, false otherwise.
974 * @since 5.9.204 (2013-01-28)
975 * @public static
976 */
977 public static function isValidURL($url) {
978 $headers = @get_headers($url);
979 return (strpos($headers[0], '200') !== false);
980 }
981
982 /**
983 * Removes SHY characters from text.
984 * Unicode Data:<ul>
985 * <li>Name : SOFT HYPHEN, commonly abbreviated as SHY</li>
986 * <li>HTML Entity (decimal): "&amp;#173;"</li>
987 * <li>HTML Entity (hex): "&amp;#xad;"</li>
988 * <li>HTML Entity (named): "&amp;shy;"</li>
989 * <li>How to type in Microsoft Windows: [Alt +00AD] or [Alt 0173]</li>
990 * <li>UTF-8 (hex): 0xC2 0xAD (c2ad)</li>
991 * <li>UTF-8 character: chr(194).chr(173)</li>
992 * </ul>
993 * @param $txt (string) input string
994 * @param $unicode (boolean) True if we are in unicode mode, false otherwise.
995 * @return string without SHY characters.
996 * @since (4.5.019) 2009-02-28
997 * @public static
998 */
999 public static function removeSHY($txt='', $unicode=true) {
1000 $txt = preg_replace('/([\\xc2]{1}[\\xad]{1})/', '', $txt);
1001 if (!$unicode) {
1002 $txt = preg_replace('/([\\xad]{1})/', '', $txt);
1003 }
1004 return $txt;
1005 }
1006
1007
1008 /**
1009 * Get the border mode accounting for multicell position (opens bottom side of multicell crossing pages)
1010 * @param $brd (mixed) Indicates if borders must be drawn around the cell block. The value can be a number:<ul><li>0: no border (default)</li><li>1: frame</li></ul>or a string containing some or all of the following characters (in any order):<ul><li>L: left</li><li>T: top</li><li>R: right</li><li>B: bottom</li></ul> or an array of line styles for each border group: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0)))
1011 * @param $position (string) multicell position: 'start', 'middle', 'end'
1012 * @param $opencell (boolean) True when the cell is left open at the page bottom, false otherwise.
1013 * @return border mode array
1014 * @since 4.4.002 (2008-12-09)
1015 * @public static
1016 */
1017 public static function getBorderMode($brd, $position='start', $opencell=true) {
1018 if ((!$opencell) OR empty($brd)) {
1019 return $brd;
1020 }
1021 if ($brd == 1) {
1022 $brd = 'LTRB';
1023 }
1024 if (is_string($brd)) {
1025 // convert string to array
1026 $slen = strlen($brd);
1027 $newbrd = array();
1028 for ($i = 0; $i < $slen; ++$i) {
1029 $newbrd[$brd[$i]] = array('cap' => 'square', 'join' => 'miter');
1030 }
1031 $brd = $newbrd;
1032 }
1033 foreach ($brd as $border => $style) {
1034 switch ($position) {
1035 case 'start': {
1036 if (strpos($border, 'B') !== false) {
1037 // remove bottom line
1038 $newkey = str_replace('B', '', $border);
1039 if (strlen($newkey) > 0) {
1040 $brd[$newkey] = $style;
1041 }
1042 unset($brd[$border]);
1043 }
1044 break;
1045 }
1046 case 'middle': {
1047 if (strpos($border, 'B') !== false) {
1048 // remove bottom line
1049 $newkey = str_replace('B', '', $border);
1050 if (strlen($newkey) > 0) {
1051 $brd[$newkey] = $style;
1052 }
1053 unset($brd[$border]);
1054 $border = $newkey;
1055 }
1056 if (strpos($border, 'T') !== false) {
1057 // remove bottom line
1058 $newkey = str_replace('T', '', $border);
1059 if (strlen($newkey) > 0) {
1060 $brd[$newkey] = $style;
1061 }
1062 unset($brd[$border]);
1063 }
1064 break;
1065 }
1066 case 'end': {
1067 if (strpos($border, 'T') !== false) {
1068 // remove bottom line
1069 $newkey = str_replace('T', '', $border);
1070 if (strlen($newkey) > 0) {
1071 $brd[$newkey] = $style;
1072 }
1073 unset($brd[$border]);
1074 }
1075 break;
1076 }
1077 }
1078 }
1079 return $brd;
1080 }
1081
1082 /**
1083 * Determine whether a string is empty.
1084 * @param $str (string) string to be checked
1085 * @return boolean true if string is empty
1086 * @since 4.5.044 (2009-04-16)
1087 * @public static
1088 */
1089 public static function empty_string($str) {
1090 return (is_null($str) OR (is_string($str) AND (strlen($str) == 0)));
1091 }
1092
1093 /**
1094 * Returns a temporary filename for caching object on filesystem.
1095 * @param $type (string) Type of file (name of the subdir on the tcpdf cache folder).
1096 * @return string filename.
1097 * @since 4.5.000 (2008-12-31)
1098 * @public static
1099 */
1100 public static function getObjFilename($type='tmp') {
1101 return tempnam(K_PATH_CACHE, '__tcpdf_'.$type.'_'.md5(uniqid('', true).rand().microtime(true)).'_');
1102 }
1103
1104 /**
1105 * Add "\" before "\", "(" and ")"
1106 * @param $s (string) string to escape.
1107 * @return string escaped string.
1108 * @public static
1109 */
1110 public static function _escape($s) {
1111 // the chr(13) substitution fixes the Bugs item #1421290.
1112 return strtr($s, array(')' => '\\)', '(' => '\\(', '\\' => '\\\\', chr(13) => '\r'));
1113 }
1114
1115 /**
1116 * Escape some special characters (&lt; &gt; &amp;) for XML output.
1117 * @param $str (string) Input string to convert.
1118 * @return converted string
1119 * @since 5.9.121 (2011-09-28)
1120 * @public static
1121 */
1122 public static function _escapeXML($str) {
1123 $replaceTable = array("\0" => '', '&' => '&amp;', '<' => '&lt;', '>' => '&gt;');
1124 $str = strtr($str, $replaceTable);
1125 return $str;
1126 }
1127
1128 /**
1129 * Creates a copy of a class object
1130 * @param $object (object) class object to be cloned
1131 * @return cloned object
1132 * @since 4.5.029 (2009-03-19)
1133 * @public static
1134 */
1135 public static function objclone($object) {
1136 if (($object instanceof Imagick) AND (version_compare(phpversion('imagick'), '3.0.1') !== 1)) {
1137 // on the versions after 3.0.1 the clone() method was deprecated in favour of clone keyword
1138 return @$object->clone();
1139 }
1140 return @clone($object);
1141 }
1142
1143 /**
1144 * Ouput input data and compress it if possible.
1145 * @param $data (string) Data to output.
1146 * @param $length (int) Data length in bytes.
1147 * @since 5.9.086
1148 * @public static
1149 */
1150 public static function sendOutputData($data, $length) {
1151 if (!isset($_SERVER['HTTP_ACCEPT_ENCODING']) OR empty($_SERVER['HTTP_ACCEPT_ENCODING'])) {
1152 // the content length may vary if the server is using compression
1153 header('Content-Length: '.$length);
1154 }
1155 echo $data;
1156 }
1157
1158 /**
1159 * Replace page number aliases with number.
1160 * @param $page (string) Page content.
1161 * @param $replace (array) Array of replacements (array keys are replacement strings, values are alias arrays).
1162 * @param $diff (int) If passed, this will be set to the total char number difference between alias and replacements.
1163 * @return replaced page content and updated $diff parameter as array.
1164 * @public static
1165 */
1166 public static function replacePageNumAliases($page, $replace, $diff=0) {
1167 foreach ($replace as $rep) {
1168 foreach ($rep[3] as $a) {
1169 if (strpos($page, $a) !== false) {
1170 $page = str_replace($a, $rep[0], $page);
1171 $diff += ($rep[2] - $rep[1]);
1172 }
1173 }
1174 }
1175 return array($page, $diff);
1176 }
1177
1178 /**
1179 * Returns timestamp in seconds from formatted date-time.
1180 * @param $date (string) Formatted date-time.
1181 * @return int seconds.
1182 * @since 5.9.152 (2012-03-23)
1183 * @public static
1184 */
1185 public static function getTimestamp($date) {
1186 if (($date[0] == 'D') AND ($date[1] == ':')) {
1187 // remove date prefix if present
1188 $date = substr($date, 2);
1189 }
1190 return strtotime($date);
1191 }
1192
1193 /**
1194 * Returns a formatted date-time.
1195 * @param $time (int) Time in seconds.
1196 * @return string escaped date string.
1197 * @since 5.9.152 (2012-03-23)
1198 * @public static
1199 */
1200 public static function getFormattedDate($time) {
1201 return substr_replace(date('YmdHisO', intval($time)), '\'', (0 - 2), 0).'\'';
1202 }
1203
1204 /**
1205 * Get ULONG from string (Big Endian 32-bit unsigned integer).
1206 * @param $str (string) string from where to extract value
1207 * @param $offset (int) point from where to read the data
1208 * @return int 32 bit value
1209 * @author Nicola Asuni
1210 * @since 5.2.000 (2010-06-02)
1211 * @public static
1212 */
1213 public static function _getULONG($str, $offset) {
1214 $v = unpack('Ni', substr($str, $offset, 4));
1215 return $v['i'];
1216 }
1217
1218 /**
1219 * Get USHORT from string (Big Endian 16-bit unsigned integer).
1220 * @param $str (string) string from where to extract value
1221 * @param $offset (int) point from where to read the data
1222 * @return int 16 bit value
1223 * @author Nicola Asuni
1224 * @since 5.2.000 (2010-06-02)
1225 * @public static
1226 */
1227 public static function _getUSHORT($str, $offset) {
1228 $v = unpack('ni', substr($str, $offset, 2));
1229 return $v['i'];
1230 }
1231
1232 /**
1233 * Get SHORT from string (Big Endian 16-bit signed integer).
1234 * @param $str (string) String from where to extract value.
1235 * @param $offset (int) Point from where to read the data.
1236 * @return int 16 bit value
1237 * @author Nicola Asuni
1238 * @since 5.2.000 (2010-06-02)
1239 * @public static
1240 */
1241 public static function _getSHORT($str, $offset) {
1242 $v = unpack('si', substr($str, $offset, 2));
1243 return $v['i'];
1244 }
1245
1246 /**
1247 * Get FWORD from string (Big Endian 16-bit signed integer).
1248 * @param $str (string) String from where to extract value.
1249 * @param $offset (int) Point from where to read the data.
1250 * @return int 16 bit value
1251 * @author Nicola Asuni
1252 * @since 5.9.123 (2011-09-30)
1253 * @public static
1254 */
1255 public static function _getFWORD($str, $offset) {
1256 $v = self::_getUSHORT($str, $offset);
1257 if ($v > 0x7fff) {
1258 $v -= 0x10000;
1259 }
1260 return $v;
1261 }
1262
1263 /**
1264 * Get UFWORD from string (Big Endian 16-bit unsigned integer).
1265 * @param $str (string) string from where to extract value
1266 * @param $offset (int) point from where to read the data
1267 * @return int 16 bit value
1268 * @author Nicola Asuni
1269 * @since 5.9.123 (2011-09-30)
1270 * @public static
1271 */
1272 public static function _getUFWORD($str, $offset) {
1273 $v = self::_getUSHORT($str, $offset);
1274 return $v;
1275 }
1276
1277 /**
1278 * Get FIXED from string (32-bit signed fixed-point number (16.16).
1279 * @param $str (string) string from where to extract value
1280 * @param $offset (int) point from where to read the data
1281 * @return int 16 bit value
1282 * @author Nicola Asuni
1283 * @since 5.9.123 (2011-09-30)
1284 * @public static
1285 */
1286 public static function _getFIXED($str, $offset) {
1287 // mantissa
1288 $m = self::_getFWORD($str, $offset);
1289 // fraction
1290 $f = self::_getUSHORT($str, ($offset + 2));
1291 $v = floatval(''.$m.'.'.$f.'');
1292 return $v;
1293 }
1294
1295 /**
1296 * Get BYTE from string (8-bit unsigned integer).
1297 * @param $str (string) String from where to extract value.
1298 * @param $offset (int) Point from where to read the data.
1299 * @return int 8 bit value
1300 * @author Nicola Asuni
1301 * @since 5.2.000 (2010-06-02)
1302 * @public static
1303 */
1304 public static function _getBYTE($str, $offset) {
1305 $v = unpack('Ci', substr($str, $offset, 1));
1306 return $v['i'];
1307 }
1308 /**
1309 * Binary-safe and URL-safe file read.
1310 * Reads up to length bytes from the file pointer referenced by handle. Reading stops as soon as one of the following conditions is met: length bytes have been read; EOF (end of file) is reached.
1311 * @param $handle (resource)
1312 * @param $length (int)
1313 * @return Returns the read string or FALSE in case of error.
1314 * @author Nicola Asuni
1315 * @since 4.5.027 (2009-03-16)
1316 * @public static
1317 */
1318 public static function rfread($handle, $length) {
1319 $data = fread($handle, $length);
1320 if ($data === false) {
1321 return false;
1322 }
1323 $rest = ($length - strlen($data));
1324 if ($rest > 0) {
1325 $data .= self::rfread($handle, $rest);
1326 }
1327 return $data;
1328 }
1329
1330 /**
1331 * Read a 4-byte (32 bit) integer from file.
1332 * @param $f (string) file name.
1333 * @return 4-byte integer
1334 * @public static
1335 */
1336 public static function _freadint($f) {
1337 $a = unpack('Ni', fread($f, 4));
1338 return $a['i'];
1339 }
1340
1341 /**
1342 * Returns a string containing random data to be used as a seed for encryption methods.
1343 * @param $seed (string) starting seed value
1344 * @return string containing random data
1345 * @author Nicola Asuni
1346 * @since 5.9.006 (2010-10-19)
1347 * @public static
1348 */
1349 public static function getRandomSeed($seed='') {
1350 $seed .= microtime();
1351 if (function_exists('openssl_random_pseudo_bytes') AND (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN')) {
1352 // this is not used on windows systems because it is very slow for a know bug
1353 $seed .= openssl_random_pseudo_bytes(512);
1354 } else {
1355 for ($i = 0; $i < 23; ++$i) {
1356 $seed .= uniqid('', true);
1357 }
1358 }
1359 $seed .= uniqid('', true);
1360 $seed .= rand();
1361 $seed .= __FILE__;
1362 if (isset($_SERVER['REMOTE_ADDR'])) {
1363 $seed .= $_SERVER['REMOTE_ADDR'];
1364 }
1365 if (isset($_SERVER['HTTP_USER_AGENT'])) {
1366 $seed .= $_SERVER['HTTP_USER_AGENT'];
1367 }
1368 if (isset($_SERVER['HTTP_ACCEPT'])) {
1369 $seed .= $_SERVER['HTTP_ACCEPT'];
1370 }
1371 if (isset($_SERVER['HTTP_ACCEPT_ENCODING'])) {
1372 $seed .= $_SERVER['HTTP_ACCEPT_ENCODING'];
1373 }
1374 if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
1375 $seed .= $_SERVER['HTTP_ACCEPT_LANGUAGE'];
1376 }
1377 if (isset($_SERVER['HTTP_ACCEPT_CHARSET'])) {
1378 $seed .= $_SERVER['HTTP_ACCEPT_CHARSET'];
1379 }
1380 $seed .= rand();
1381 $seed .= uniqid('', true);
1382 $seed .= microtime();
1383 return $seed;
1384 }
1385
1386 /**
1387 * Encrypts a string using MD5 and returns it's value as a binary string.
1388 * @param $str (string) input string
1389 * @return String MD5 encrypted binary string
1390 * @since 2.0.000 (2008-01-02)
1391 * @public static
1392 */
1393 public static function _md5_16($str) {
1394 return pack('H*', md5($str));
1395 }
1396
1397 /**
1398 * Returns the input text exrypted using AES algorithm and the specified key.
1399 * This method requires mcrypt.
1400 * @param $key (string) encryption key
1401 * @param $text (String) input text to be encrypted
1402 * @return String encrypted text
1403 * @author Nicola Asuni
1404 * @since 5.0.005 (2010-05-11)
1405 * @public static
1406 */
1407 public static function _AES($key, $text) {
1408 // padding (RFC 2898, PKCS #5: Password-Based Cryptography Specification Version 2.0)
1409 $padding = 16 - (strlen($text) % 16);
1410 $text .= str_repeat(chr($padding), $padding);
1411 $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_RAND);
1412 $text = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv);
1413 $text = $iv.$text;
1414 return $text;
1415 }
1416
1417 /**
1418 * Returns the input text encrypted using RC4 algorithm and the specified key.
1419 * RC4 is the standard encryption algorithm used in PDF format
1420 * @param $key (string) Encryption key.
1421 * @param $text (String) Input text to be encrypted.
1422 * @param $last_enc_key (String) Reference to last RC4 key encrypted.
1423 * @param $last_enc_key_c (String) Reference to last RC4 computed key.
1424 * @return String encrypted text
1425 * @since 2.0.000 (2008-01-02)
1426 * @author Klemen Vodopivec, Nicola Asuni
1427 * @public static
1428 */
1429 public static function _RC4($key, $text, &$last_enc_key, &$last_enc_key_c) {
1430 if (function_exists('mcrypt_encrypt') AND ($out = @mcrypt_encrypt(MCRYPT_ARCFOUR, $key, $text, MCRYPT_MODE_STREAM, ''))) {
1431 // try to use mcrypt function if exist
1432 return $out;
1433 }
1434 if ($last_enc_key != $key) {
1435 $k = str_repeat($key, ((256 / strlen($key)) + 1));
1436 $rc4 = range(0, 255);
1437 $j = 0;
1438 for ($i = 0; $i < 256; ++$i) {
1439 $t = $rc4[$i];
1440 $j = ($j + $t + ord($k[$i])) % 256;
1441 $rc4[$i] = $rc4[$j];
1442 $rc4[$j] = $t;
1443 }
1444 $last_enc_key = $key;
1445 $last_enc_key_c = $rc4;
1446 } else {
1447 $rc4 = $last_enc_key_c;
1448 }
1449 $len = strlen($text);
1450 $a = 0;
1451 $b = 0;
1452 $out = '';
1453 for ($i = 0; $i < $len; ++$i) {
1454 $a = ($a + 1) % 256;
1455 $t = $rc4[$a];
1456 $b = ($b + $t) % 256;
1457 $rc4[$a] = $rc4[$b];
1458 $rc4[$b] = $t;
1459 $k = $rc4[($rc4[$a] + $rc4[$b]) % 256];
1460 $out .= chr(ord($text[$i]) ^ $k);
1461 }
1462 return $out;
1463 }
1464
1465 /**
1466 * Return the premission code used on encryption (P value).
1467 * @param $permissions (Array) the set of permissions (specify the ones you want to block).
1468 * @param $mode (int) encryption strength: 0 = RC4 40 bit; 1 = RC4 128 bit; 2 = AES 128 bit; 3 = AES 256 bit.
1469 * @since 5.0.005 (2010-05-12)
1470 * @author Nicola Asuni
1471 * @public static
1472 */
1473 public static function getUserPermissionCode($permissions, $mode=0) {
1474 $options = array(
1475 'owner' => 2, // bit 2 -- inverted logic: cleared by default
1476 'print' => 4, // bit 3
1477 'modify' => 8, // bit 4
1478 'copy' => 16, // bit 5
1479 'annot-forms' => 32, // bit 6
1480 'fill-forms' => 256, // bit 9
1481 'extract' => 512, // bit 10
1482 'assemble' => 1024,// bit 11
1483 'print-high' => 2048 // bit 12
1484 );
1485 $protection = 2147422012; // 32 bit: (01111111 11111111 00001111 00111100)
1486 foreach ($permissions as $permission) {
1487 if (isset($options[$permission])) {
1488 if (($mode > 0) OR ($options[$permission] <= 32)) {
1489 // set only valid permissions
1490 if ($options[$permission] == 2) {
1491 // the logic for bit 2 is inverted (cleared by default)
1492 $protection += $options[$permission];
1493 } else {
1494 $protection -= $options[$permission];
1495 }
1496 }
1497 }
1498 }
1499 return $protection;
1500 }
1501
1502 /**
1503 * Convert hexadecimal string to string
1504 * @param $bs (string) byte-string to convert
1505 * @return String
1506 * @since 5.0.005 (2010-05-12)
1507 * @author Nicola Asuni
1508 * @public static
1509 */
1510 public static function convertHexStringToString($bs) {
1511 $string = ''; // string to be returned
1512 $bslength = strlen($bs);
1513 if (($bslength % 2) != 0) {
1514 // padding
1515 $bs .= '0';
1516 ++$bslength;
1517 }
1518 for ($i = 0; $i < $bslength; $i += 2) {
1519 $string .= chr(hexdec($bs[$i].$bs[($i + 1)]));
1520 }
1521 return $string;
1522 }
1523
1524 /**
1525 * Convert string to hexadecimal string (byte string)
1526 * @param $s (string) string to convert
1527 * @return byte string
1528 * @since 5.0.010 (2010-05-17)
1529 * @author Nicola Asuni
1530 * @public static
1531 */
1532 public static function convertStringToHexString($s) {
1533 $bs = '';
1534 $chars = preg_split('//', $s, -1, PREG_SPLIT_NO_EMPTY);
1535 foreach ($chars as $c) {
1536 $bs .= sprintf('%02s', dechex(ord($c)));
1537 }
1538 return $bs;
1539 }
1540
1541 /**
1542 * Convert encryption P value to a string of bytes, low-order byte first.
1543 * @param $protection (string) 32bit encryption permission value (P value)
1544 * @return String
1545 * @since 5.0.005 (2010-05-12)
1546 * @author Nicola Asuni
1547 * @public static
1548 */
1549 public static function getEncPermissionsString($protection) {
1550 $binprot = sprintf('%032b', $protection);
1551 $str = chr(bindec(substr($binprot, 24, 8)));
1552 $str .= chr(bindec(substr($binprot, 16, 8)));
1553 $str .= chr(bindec(substr($binprot, 8, 8)));
1554 $str .= chr(bindec(substr($binprot, 0, 8)));
1555 return $str;
1556 }
1557
1558 /**
1559 * Encode a name object.
1560 * @param $name (string) Name object to encode.
1561 * @return (string) Encoded name object.
1562 * @author Nicola Asuni
1563 * @since 5.9.097 (2011-06-23)
1564 * @public static
1565 */
1566 public static function encodeNameObject($name) {
1567 $escname = '';
1568 $length = strlen($name);
1569 for ($i = 0; $i < $length; ++$i) {
1570 $chr = $name[$i];
1571 if (preg_match('/[0-9a-zA-Z#_=-]/', $chr) == 1) {
1572 $escname .= $chr;
1573 } else {
1574 $escname .= sprintf('#%02X', ord($chr));
1575 }
1576 }
1577 return $escname;
1578 }
1579
1580 /**
1581 * Convert JavaScript form fields properties array to Annotation Properties array.
1582 * @param $prop (array) javascript field properties. Possible values are described on official Javascript for Acrobat API reference.
1583 * @param $spot_colors (array) Reference to spot colors array.
1584 * @param $rtl (boolean) True if in Right-To-Left text direction mode, false otherwise.
1585 * @return array of annotation properties
1586 * @author Nicola Asuni
1587 * @since 4.8.000 (2009-09-06)
1588 * @public static
1589 */
1590 public static function getAnnotOptFromJSProp($prop, &$spot_colors, $rtl=false) {
1591 if (isset($prop['aopt']) AND is_array($prop['aopt'])) {
1592 // the annotation options area lready defined
1593 return $prop['aopt'];
1594 }
1595 $opt = array(); // value to be returned
1596 // alignment: Controls how the text is laid out within the text field.
1597 if (isset($prop['alignment'])) {
1598 switch ($prop['alignment']) {
1599 case 'left': {
1600 $opt['q'] = 0;
1601 break;
1602 }
1603 case 'center': {
1604 $opt['q'] = 1;
1605 break;
1606 }
1607 case 'right': {
1608 $opt['q'] = 2;
1609 break;
1610 }
1611 default: {
1612 $opt['q'] = ($rtl)?2:0;
1613 break;
1614 }
1615 }
1616 }
1617 // lineWidth: Specifies the thickness of the border when stroking the perimeter of a field's rectangle.
1618 if (isset($prop['lineWidth'])) {
1619 $linewidth = intval($prop['lineWidth']);
1620 } else {
1621 $linewidth = 1;
1622 }
1623 // borderStyle: The border style for a field.
1624 if (isset($prop['borderStyle'])) {
1625 switch ($prop['borderStyle']) {
1626 case 'border.d':
1627 case 'dashed': {
1628 $opt['border'] = array(0, 0, $linewidth, array(3, 2));
1629 $opt['bs'] = array('w'=>$linewidth, 's'=>'D', 'd'=>array(3, 2));
1630 break;
1631 }
1632 case 'border.b':
1633 case 'beveled': {
1634 $opt['border'] = array(0, 0, $linewidth);
1635 $opt['bs'] = array('w'=>$linewidth, 's'=>'B');
1636 break;
1637 }
1638 case 'border.i':
1639 case 'inset': {
1640 $opt['border'] = array(0, 0, $linewidth);
1641 $opt['bs'] = array('w'=>$linewidth, 's'=>'I');
1642 break;
1643 }
1644 case 'border.u':
1645 case 'underline': {
1646 $opt['border'] = array(0, 0, $linewidth);
1647 $opt['bs'] = array('w'=>$linewidth, 's'=>'U');
1648 break;
1649 }
1650 case 'border.s':
1651 case 'solid': {
1652 $opt['border'] = array(0, 0, $linewidth);
1653 $opt['bs'] = array('w'=>$linewidth, 's'=>'S');
1654 break;
1655 }
1656 default: {
1657 break;
1658 }
1659 }
1660 }
1661 if (isset($prop['border']) AND is_array($prop['border'])) {
1662 $opt['border'] = $prop['border'];
1663 }
1664 if (!isset($opt['mk'])) {
1665 $opt['mk'] = array();
1666 }
1667 if (!isset($opt['mk']['if'])) {
1668 $opt['mk']['if'] = array();
1669 }
1670 $opt['mk']['if']['a'] = array(0.5, 0.5);
1671 // buttonAlignX: Controls how space is distributed from the left of the button face with respect to the icon.
1672 if (isset($prop['buttonAlignX'])) {
1673 $opt['mk']['if']['a'][0] = $prop['buttonAlignX'];
1674 }
1675 // buttonAlignY: Controls how unused space is distributed from the bottom of the button face with respect to the icon.
1676 if (isset($prop['buttonAlignY'])) {
1677 $opt['mk']['if']['a'][1] = $prop['buttonAlignY'];
1678 }
1679 // buttonFitBounds: If true, the extent to which the icon may be scaled is set to the bounds of the button field.
1680 if (isset($prop['buttonFitBounds']) AND ($prop['buttonFitBounds'] == 'true')) {
1681 $opt['mk']['if']['fb'] = true;
1682 }
1683 // buttonScaleHow: Controls how the icon is scaled (if necessary) to fit inside the button face.
1684 if (isset($prop['buttonScaleHow'])) {
1685 switch ($prop['buttonScaleHow']) {
1686 case 'scaleHow.proportional': {
1687 $opt['mk']['if']['s'] = 'P';
1688 break;
1689 }
1690 case 'scaleHow.anamorphic': {
1691 $opt['mk']['if']['s'] = 'A';
1692 break;
1693 }
1694 }
1695 }
1696 // buttonScaleWhen: Controls when an icon is scaled to fit inside the button face.
1697 if (isset($prop['buttonScaleWhen'])) {
1698 switch ($prop['buttonScaleWhen']) {
1699 case 'scaleWhen.always': {
1700 $opt['mk']['if']['sw'] = 'A';
1701 break;
1702 }
1703 case 'scaleWhen.never': {
1704 $opt['mk']['if']['sw'] = 'N';
1705 break;
1706 }
1707 case 'scaleWhen.tooBig': {
1708 $opt['mk']['if']['sw'] = 'B';
1709 break;
1710 }
1711 case 'scaleWhen.tooSmall': {
1712 $opt['mk']['if']['sw'] = 'S';
1713 break;
1714 }
1715 }
1716 }
1717 // buttonPosition: Controls how the text and the icon of the button are positioned with respect to each other within the button face.
1718 if (isset($prop['buttonPosition'])) {
1719 switch ($prop['buttonPosition']) {
1720 case 0:
1721 case 'position.textOnly': {
1722 $opt['mk']['tp'] = 0;
1723 break;
1724 }
1725 case 1:
1726 case 'position.iconOnly': {
1727 $opt['mk']['tp'] = 1;
1728 break;
1729 }
1730 case 2:
1731 case 'position.iconTextV': {
1732 $opt['mk']['tp'] = 2;
1733 break;
1734 }
1735 case 3:
1736 case 'position.textIconV': {
1737 $opt['mk']['tp'] = 3;
1738 break;
1739 }
1740 case 4:
1741 case 'position.iconTextH': {
1742 $opt['mk']['tp'] = 4;
1743 break;
1744 }
1745 case 5:
1746 case 'position.textIconH': {
1747 $opt['mk']['tp'] = 5;
1748 break;
1749 }
1750 case 6:
1751 case 'position.overlay': {
1752 $opt['mk']['tp'] = 6;
1753 break;
1754 }
1755 }
1756 }
1757 // fillColor: Specifies the background color for a field.
1758 if (isset($prop['fillColor'])) {
1759 if (is_array($prop['fillColor'])) {
1760 $opt['mk']['bg'] = $prop['fillColor'];
1761 } else {
1762 $opt['mk']['bg'] = TCPDF_COLORS::convertHTMLColorToDec($prop['fillColor'], $spot_colors);
1763 }
1764 }
1765 // strokeColor: Specifies the stroke color for a field that is used to stroke the rectangle of the field with a line as large as the line width.
1766 if (isset($prop['strokeColor'])) {
1767 if (is_array($prop['strokeColor'])) {
1768 $opt['mk']['bc'] = $prop['strokeColor'];
1769 } else {
1770 $opt['mk']['bc'] = TCPDF_COLORS::convertHTMLColorToDec($prop['strokeColor'], $spot_colors);
1771 }
1772 }
1773 // rotation: The rotation of a widget in counterclockwise increments.
1774 if (isset($prop['rotation'])) {
1775 $opt['mk']['r'] = $prop['rotation'];
1776 }
1777 // charLimit: Limits the number of characters that a user can type into a text field.
1778 if (isset($prop['charLimit'])) {
1779 $opt['maxlen'] = intval($prop['charLimit']);
1780 }
1781 if (!isset($ff)) {
1782 $ff = 0; // default value
1783 }
1784 // readonly: The read-only characteristic of a field. If a field is read-only, the user can see the field but cannot change it.
1785 if (isset($prop['readonly']) AND ($prop['readonly'] == 'true')) {
1786 $ff += 1 << 0;
1787 }
1788 // required: Specifies whether a field requires a value.
1789 if (isset($prop['required']) AND ($prop['required'] == 'true')) {
1790 $ff += 1 << 1;
1791 }
1792 // multiline: Controls how text is wrapped within the field.
1793 if (isset($prop['multiline']) AND ($prop['multiline'] == 'true')) {
1794 $ff += 1 << 12;
1795 }
1796 // password: Specifies whether the field should display asterisks when data is entered in the field.
1797 if (isset($prop['password']) AND ($prop['password'] == 'true')) {
1798 $ff += 1 << 13;
1799 }
1800 // NoToggleToOff: If set, exactly one radio button shall be selected at all times; selecting the currently selected button has no effect.
1801 if (isset($prop['NoToggleToOff']) AND ($prop['NoToggleToOff'] == 'true')) {
1802 $ff += 1 << 14;
1803 }
1804 // Radio: If set, the field is a set of radio buttons.
1805 if (isset($prop['Radio']) AND ($prop['Radio'] == 'true')) {
1806 $ff += 1 << 15;
1807 }
1808 // Pushbutton: If set, the field is a pushbutton that does not retain a permanent value.
1809 if (isset($prop['Pushbutton']) AND ($prop['Pushbutton'] == 'true')) {
1810 $ff += 1 << 16;
1811 }
1812 // Combo: If set, the field is a combo box; if clear, the field is a list box.
1813 if (isset($prop['Combo']) AND ($prop['Combo'] == 'true')) {
1814 $ff += 1 << 17;
1815 }
1816 // editable: Controls whether a combo box is editable.
1817 if (isset($prop['editable']) AND ($prop['editable'] == 'true')) {
1818 $ff += 1 << 18;
1819 }
1820 // Sort: If set, the field's option items shall be sorted alphabetically.
1821 if (isset($prop['Sort']) AND ($prop['Sort'] == 'true')) {
1822 $ff += 1 << 19;
1823 }
1824 // fileSelect: If true, sets the file-select flag in the Options tab of the text field (Field is Used for File Selection).
1825 if (isset($prop['fileSelect']) AND ($prop['fileSelect'] == 'true')) {
1826 $ff += 1 << 20;
1827 }
1828 // multipleSelection: If true, indicates that a list box allows a multiple selection of items.
1829 if (isset($prop['multipleSelection']) AND ($prop['multipleSelection'] == 'true')) {
1830 $ff += 1 << 21;
1831 }
1832 // doNotSpellCheck: If true, spell checking is not performed on this editable text field.
1833 if (isset($prop['doNotSpellCheck']) AND ($prop['doNotSpellCheck'] == 'true')) {
1834 $ff += 1 << 22;
1835 }
1836 // doNotScroll: If true, the text field does not scroll and the user, therefore, is limited by the rectangular region designed for the field.
1837 if (isset($prop['doNotScroll']) AND ($prop['doNotScroll'] == 'true')) {
1838 $ff += 1 << 23;
1839 }
1840 // comb: If set to true, the field background is drawn as series of boxes (one for each character in the value of the field) and each character of the content is drawn within those boxes. The number of boxes drawn is determined from the charLimit property. It applies only to text fields. The setter will also raise if any of the following field properties are also set multiline, password, and fileSelect. A side-effect of setting this property is that the doNotScroll property is also set.
1841 if (isset($prop['comb']) AND ($prop['comb'] == 'true')) {
1842 $ff += 1 << 24;
1843 }
1844 // radiosInUnison: If false, even if a group of radio buttons have the same name and export value, they behave in a mutually exclusive fashion, like HTML radio buttons.
1845 if (isset($prop['radiosInUnison']) AND ($prop['radiosInUnison'] == 'true')) {
1846 $ff += 1 << 25;
1847 }
1848 // richText: If true, the field allows rich text formatting.
1849 if (isset($prop['richText']) AND ($prop['richText'] == 'true')) {
1850 $ff += 1 << 25;
1851 }
1852 // commitOnSelChange: Controls whether a field value is committed after a selection change.
1853 if (isset($prop['commitOnSelChange']) AND ($prop['commitOnSelChange'] == 'true')) {
1854 $ff += 1 << 26;
1855 }
1856 $opt['ff'] = $ff;
1857 // defaultValue: The default value of a field - that is, the value that the field is set to when the form is reset.
1858 if (isset($prop['defaultValue'])) {
1859 $opt['dv'] = $prop['defaultValue'];
1860 }
1861 $f = 4; // default value for annotation flags
1862 // readonly: The read-only characteristic of a field. If a field is read-only, the user can see the field but cannot change it.
1863 if (isset($prop['readonly']) AND ($prop['readonly'] == 'true')) {
1864 $f += 1 << 6;
1865 }
1866 // display: Controls whether the field is hidden or visible on screen and in print.
1867 if (isset($prop['display'])) {
1868 if ($prop['display'] == 'display.visible') {
1869 //
1870 } elseif ($prop['display'] == 'display.hidden') {
1871 $f += 1 << 1;
1872 } elseif ($prop['display'] == 'display.noPrint') {
1873 $f -= 1 << 2;
1874 } elseif ($prop['display'] == 'display.noView') {
1875 $f += 1 << 5;
1876 }
1877 }
1878 $opt['f'] = $f;
1879 // currentValueIndices: Reads and writes single or multiple values of a list box or combo box.
1880 if (isset($prop['currentValueIndices']) AND is_array($prop['currentValueIndices'])) {
1881 $opt['i'] = $prop['currentValueIndices'];
1882 }
1883 // value: The value of the field data that the user has entered.
1884 if (isset($prop['value'])) {
1885 if (is_array($prop['value'])) {
1886 $opt['opt'] = array();
1887 foreach ($prop['value'] AS $key => $optval) {
1888 // exportValues: An array of strings representing the export values for the field.
1889 if (isset($prop['exportValues'][$key])) {
1890 $opt['opt'][$key] = array($prop['exportValues'][$key], $prop['value'][$key]);
1891 } else {
1892 $opt['opt'][$key] = $prop['value'][$key];
1893 }
1894 }
1895 } else {
1896 $opt['v'] = $prop['value'];
1897 }
1898 }
1899 // richValue: This property specifies the text contents and formatting of a rich text field.
1900 if (isset($prop['richValue'])) {
1901 $opt['rv'] = $prop['richValue'];
1902 }
1903 // submitName: If nonempty, used during form submission instead of name. Only applicable if submitting in HTML format (that is, URL-encoded).
1904 if (isset($prop['submitName'])) {
1905 $opt['tm'] = $prop['submitName'];
1906 }
1907 // name: Fully qualified field name.
1908 if (isset($prop['name'])) {
1909 $opt['t'] = $prop['name'];
1910 }
1911 // userName: The user name (short description string) of the field.
1912 if (isset($prop['userName'])) {
1913 $opt['tu'] = $prop['userName'];
1914 }
1915 // highlight: Defines how a button reacts when a user clicks it.
1916 if (isset($prop['highlight'])) {
1917 switch ($prop['highlight']) {
1918 case 'none':
1919 case 'highlight.n': {
1920 $opt['h'] = 'N';
1921 break;
1922 }
1923 case 'invert':
1924 case 'highlight.i': {
1925 $opt['h'] = 'i';
1926 break;
1927 }
1928 case 'push':
1929 case 'highlight.p': {
1930 $opt['h'] = 'P';
1931 break;
1932 }
1933 case 'outline':
1934 case 'highlight.o': {
1935 $opt['h'] = 'O';
1936 break;
1937 }
1938 }
1939 }
1940 // Unsupported options:
1941 // - calcOrderIndex: Changes the calculation order of fields in the document.
1942 // - delay: Delays the redrawing of a field's appearance.
1943 // - defaultStyle: This property defines the default style attributes for the form field.
1944 // - style: Allows the user to set the glyph style of a check box or radio button.
1945 // - textColor, textFont, textSize
1946 return $opt;
1947 }
1948
1949 /**
1950 * Format the page numbers.
1951 * This method can be overriden for custom formats.
1952 * @param $num (int) page number
1953 * @since 4.2.005 (2008-11-06)
1954 * @public static
1955 */
1956 public static function formatPageNumber($num) {
1957 return number_format((float)$num, 0, '', '.');
1958 }
1959
1960 /**
1961 * Format the page numbers on the Table Of Content.
1962 * This method can be overriden for custom formats.
1963 * @param $num (int) page number
1964 * @since 4.5.001 (2009-01-04)
1965 * @see addTOC(), addHTMLTOC()
1966 * @public static
1967 */
1968 public static function formatTOCPageNumber($num) {
1969 return number_format((float)$num, 0, '', '.');
1970 }
1971
1972 /**
1973 * Extracts the CSS properties from a CSS string.
1974 * @param $cssdata (string) string containing CSS definitions.
1975 * @return An array where the keys are the CSS selectors and the values are the CSS properties.
1976 * @author Nicola Asuni
1977 * @since 5.1.000 (2010-05-25)
1978 * @public static
1979 */
1980 public static function extractCSSproperties($cssdata) {
1981 if (empty($cssdata)) {
1982 return array();
1983 }
1984 // remove comments
1985 $cssdata = preg_replace('/\/\*[^\*]*\*\//', '', $cssdata);
1986 // remove newlines and multiple spaces
1987 $cssdata = preg_replace('/[\s]+/', ' ', $cssdata);
1988 // remove some spaces
1989 $cssdata = preg_replace('/[\s]*([;:\{\}]{1})[\s]*/', '\\1', $cssdata);
1990 // remove empty blocks
1991 $cssdata = preg_replace('/([^\}\{]+)\{\}/', '', $cssdata);
1992 // replace media type parenthesis
1993 $cssdata = preg_replace('/@media[\s]+([^\{]*)\{/i', '@media \\1§', $cssdata);
1994 $cssdata = preg_replace('/\}\}/si', '}§', $cssdata);
1995 // trim string
1996 $cssdata = trim($cssdata);
1997 // find media blocks (all, braille, embossed, handheld, print, projection, screen, speech, tty, tv)
1998 $cssblocks = array();
1999 $matches = array();
2000 if (preg_match_all('/@media[\s]+([^\§]*)§([^§]*)§/i', $cssdata, $matches) > 0) {
2001 foreach ($matches[1] as $key => $type) {
2002 $cssblocks[$type] = $matches[2][$key];
2003 }
2004 // remove media blocks
2005 $cssdata = preg_replace('/@media[\s]+([^\§]*)§([^§]*)§/i', '', $cssdata);
2006 }
2007 // keep 'all' and 'print' media, other media types are discarded
2008 if (isset($cssblocks['all']) AND !empty($cssblocks['all'])) {
2009 $cssdata .= $cssblocks['all'];
2010 }
2011 if (isset($cssblocks['print']) AND !empty($cssblocks['print'])) {
2012 $cssdata .= $cssblocks['print'];
2013 }
2014 // reset css blocks array
2015 $cssblocks = array();
2016 $matches = array();
2017 // explode css data string into array
2018 if (substr($cssdata, -1) == '}') {
2019 // remove last parethesis
2020 $cssdata = substr($cssdata, 0, -1);
2021 }
2022 $matches = explode('}', $cssdata);
2023 foreach ($matches as $key => $block) {
2024 // index 0 contains the CSS selector, index 1 contains CSS properties
2025 $cssblocks[$key] = explode('{', $block);
2026 if (!isset($cssblocks[$key][1])) {
2027 // remove empty definitions
2028 unset($cssblocks[$key]);
2029 }
2030 }
2031 // split groups of selectors (comma-separated list of selectors)
2032 foreach ($cssblocks as $key => $block) {
2033 if (strpos($block[0], ',') > 0) {
2034 $selectors = explode(',', $block[0]);
2035 foreach ($selectors as $sel) {
2036 $cssblocks[] = array(0 => trim($sel), 1 => $block[1]);
2037 }
2038 unset($cssblocks[$key]);
2039 }
2040 }
2041 // covert array to selector => properties
2042 $cssdata = array();
2043 foreach ($cssblocks as $block) {
2044 $selector = $block[0];
2045 // calculate selector's specificity
2046 $matches = array();
2047 $a = 0; // the declaration is not from is a 'style' attribute
2048 $b = intval(preg_match_all('/[\#]/', $selector, $matches)); // number of ID attributes
2049 $c = intval(preg_match_all('/[\[\.]/', $selector, $matches)); // number of other attributes
2050 $c += intval(preg_match_all('/[\:]link|visited|hover|active|focus|target|lang|enabled|disabled|checked|indeterminate|root|nth|first|last|only|empty|contains|not/i', $selector, $matches)); // number of pseudo-classes
2051 $d = intval(preg_match_all('/[\>\+\~\s]{1}[a-zA-Z0-9]+/', ' '.$selector, $matches)); // number of element names
2052 $d += intval(preg_match_all('/[\:][\:]/', $selector, $matches)); // number of pseudo-elements
2053 $specificity = $a.$b.$c.$d;
2054 // add specificity to the beginning of the selector
2055 $cssdata[$specificity.' '.$selector] = $block[1];
2056 }
2057 // sort selectors alphabetically to account for specificity
2058 ksort($cssdata, SORT_STRING);
2059 // return array
2060 return $cssdata;
2061 }
2062
2063 /**
2064 * Cleanup HTML code (requires HTML Tidy library).
2065 * @param $html (string) htmlcode to fix
2066 * @param $default_css (string) CSS commands to add
2067 * @param $tagvs (array) parameters for setHtmlVSpace method
2068 * @param $tidy_options (array) options for tidy_parse_string function
2069 * @param $tagvspaces (array) Array of vertical spaces for tags.
2070 * @return string XHTML code cleaned up
2071 * @author Nicola Asuni
2072 * @since 5.9.017 (2010-11-16)
2073 * @see setHtmlVSpace()
2074 * @public static
2075 */
2076 public static function fixHTMLCode($html, $default_css='', $tagvs='', $tidy_options='', &$tagvspaces) {
2077 // configure parameters for HTML Tidy
2078 if ($tidy_options === '') {
2079 $tidy_options = array (
2080 'clean' => 1,
2081 'drop-empty-paras' => 0,
2082 'drop-proprietary-attributes' => 1,
2083 'fix-backslash' => 1,
2084 'hide-comments' => 1,
2085 'join-styles' => 1,
2086 'lower-literals' => 1,
2087 'merge-divs' => 1,
2088 'merge-spans' => 1,
2089 'output-xhtml' => 1,
2090 'word-2000' => 1,
2091 'wrap' => 0,
2092 'output-bom' => 0,
2093 //'char-encoding' => 'utf8',
2094 //'input-encoding' => 'utf8',
2095 //'output-encoding' => 'utf8'
2096 );
2097 }
2098 // clean up the HTML code
2099 $tidy = tidy_parse_string($html, $tidy_options);
2100 // fix the HTML
2101 $tidy->cleanRepair();
2102 // get the CSS part
2103 $tidy_head = tidy_get_head($tidy);
2104 $css = $tidy_head->value;
2105 $css = preg_replace('/<style([^>]+)>/ims', '<style>', $css);
2106 $css = preg_replace('/<\/style>(.*)<style>/ims', "\n", $css);
2107 $css = str_replace('/*<![CDATA[*/', '', $css);
2108 $css = str_replace('/*]]>*/', '', $css);
2109 preg_match('/<style>(.*)<\/style>/ims', $css, $matches);
2110 if (isset($matches[1])) {
2111 $css = strtolower($matches[1]);
2112 } else {
2113 $css = '';
2114 }
2115 // include default css
2116 $css = '<style>'.$default_css.$css.'</style>';
2117 // get the body part
2118 $tidy_body = tidy_get_body($tidy);
2119 $html = $tidy_body->value;
2120 // fix some self-closing tags
2121 $html = str_replace('<br>', '<br />', $html);
2122 // remove some empty tag blocks
2123 $html = preg_replace('/<div([^\>]*)><\/div>/', '', $html);
2124 $html = preg_replace('/<p([^\>]*)><\/p>/', '', $html);
2125 if ($tagvs !== '') {
2126 // set vertical space for some XHTML tags
2127 $tagvspaces = $tagvs;
2128 }
2129 // return the cleaned XHTML code + CSS
2130 return $css.$html;
2131 }
2132
2133 /**
2134 * Returns true if the CSS selector is valid for the selected HTML tag
2135 * @param $dom (array) array of HTML tags and properties
2136 * @param $key (int) key of the current HTML tag
2137 * @param $selector (string) CSS selector string
2138 * @return true if the selector is valid, false otherwise
2139 * @since 5.1.000 (2010-05-25)
2140 * @public static
2141 */
2142 public static function isValidCSSSelectorForTag($dom, $key, $selector) {
2143 $valid = false; // value to be returned
2144 $tag = $dom[$key]['value'];
2145 $class = array();
2146 if (isset($dom[$key]['attribute']['class']) AND !empty($dom[$key]['attribute']['class'])) {
2147 $class = explode(' ', strtolower($dom[$key]['attribute']['class']));
2148 }
2149 $id = '';
2150 if (isset($dom[$key]['attribute']['id']) AND !empty($dom[$key]['attribute']['id'])) {
2151 $id = strtolower($dom[$key]['attribute']['id']);
2152 }
2153 $selector = preg_replace('/([\>\+\~\s]{1})([\.]{1})([^\>\+\~\s]*)/si', '\\1*.\\3', $selector);
2154 $matches = array();
2155 if (preg_match_all('/([\>\+\~\s]{1})([a-zA-Z0-9\*]+)([^\>\+\~\s]*)/si', $selector, $matches, PREG_PATTERN_ORDER | PREG_OFFSET_CAPTURE) > 0) {
2156 $parentop = array_pop($matches[1]);
2157 $operator = $parentop[0];
2158 $offset = $parentop[1];
2159 $lasttag = array_pop($matches[2]);
2160 $lasttag = strtolower(trim($lasttag[0]));
2161 if (($lasttag == '*') OR ($lasttag == $tag)) {
2162 // the last element on selector is our tag or 'any tag'
2163 $attrib = array_pop($matches[3]);
2164 $attrib = strtolower(trim($attrib[0]));
2165 if (!empty($attrib)) {
2166 // check if matches class, id, attribute, pseudo-class or pseudo-element
2167 switch ($attrib[0]) {
2168 case '.': { // class
2169 if (in_array(substr($attrib, 1), $class)) {
2170 $valid = true;
2171 }
2172 break;
2173 }
2174 case '#': { // ID
2175 if (substr($attrib, 1) == $id) {
2176 $valid = true;
2177 }
2178 break;
2179 }
2180 case '[': { // attribute
2181 $attrmatch = array();
2182 if (preg_match('/\[([a-zA-Z0-9]*)[\s]*([\~\^\$\*\|\=]*)[\s]*["]?([^"\]]*)["]?\]/i', $attrib, $attrmatch) > 0) {
2183 $att = strtolower($attrmatch[1]);
2184 $val = $attrmatch[3];
2185 if (isset($dom[$key]['attribute'][$att])) {
2186 switch ($attrmatch[2]) {
2187 case '=': {
2188 if ($dom[$key]['attribute'][$att] == $val) {
2189 $valid = true;
2190 }
2191 break;
2192 }
2193 case '~=': {
2194 if (in_array($val, explode(' ', $dom[$key]['attribute'][$att]))) {
2195 $valid = true;
2196 }
2197 break;
2198 }
2199 case '^=': {
2200 if ($val == substr($dom[$key]['attribute'][$att], 0, strlen($val))) {
2201 $valid = true;
2202 }
2203 break;
2204 }
2205 case '$=': {
2206 if ($val == substr($dom[$key]['attribute'][$att], -strlen($val))) {
2207 $valid = true;
2208 }
2209 break;
2210 }
2211 case '*=': {
2212 if (strpos($dom[$key]['attribute'][$att], $val) !== false) {
2213 $valid = true;
2214 }
2215 break;
2216 }
2217 case '|=': {
2218 if ($dom[$key]['attribute'][$att] == $val) {
2219 $valid = true;
2220 } elseif (preg_match('/'.$val.'[\-]{1}/i', $dom[$key]['attribute'][$att]) > 0) {
2221 $valid = true;
2222 }
2223 break;
2224 }
2225 default: {
2226 $valid = true;
2227 }
2228 }
2229 }
2230 }
2231 break;
2232 }
2233 case ':': { // pseudo-class or pseudo-element
2234 if ($attrib[1] == ':') { // pseudo-element
2235 // pseudo-elements are not supported!
2236 // (::first-line, ::first-letter, ::before, ::after)
2237 } else { // pseudo-class
2238 // pseudo-classes are not supported!
2239 // (:root, :nth-child(n), :nth-last-child(n), :nth-of-type(n), :nth-last-of-type(n), :first-child, :last-child, :first-of-type, :last-of-type, :only-child, :only-of-type, :empty, :link, :visited, :active, :hover, :focus, :target, :lang(fr), :enabled, :disabled, :checked)
2240 }
2241 break;
2242 }
2243 } // end of switch
2244 } else {
2245 $valid = true;
2246 }
2247 if ($valid AND ($offset > 0)) {
2248 $valid = false;
2249 // check remaining selector part
2250 $selector = substr($selector, 0, $offset);
2251 switch ($operator) {
2252 case ' ': { // descendant of an element
2253 while ($dom[$key]['parent'] > 0) {
2254 if (self::isValidCSSSelectorForTag($dom, $dom[$key]['parent'], $selector)) {
2255 $valid = true;
2256 break;
2257 } else {
2258 $key = $dom[$key]['parent'];
2259 }
2260 }
2261 break;
2262 }
2263 case '>': { // child of an element
2264 $valid = self::isValidCSSSelectorForTag($dom, $dom[$key]['parent'], $selector);
2265 break;
2266 }
2267 case '+': { // immediately preceded by an element
2268 for ($i = ($key - 1); $i > $dom[$key]['parent']; --$i) {
2269 if ($dom[$i]['tag'] AND $dom[$i]['opening']) {
2270 $valid = self::isValidCSSSelectorForTag($dom, $i, $selector);
2271 break;
2272 }
2273 }
2274 break;
2275 }
2276 case '~': { // preceded by an element
2277 for ($i = ($key - 1); $i > $dom[$key]['parent']; --$i) {
2278 if ($dom[$i]['tag'] AND $dom[$i]['opening']) {
2279 if (self::isValidCSSSelectorForTag($dom, $i, $selector)) {
2280 break;
2281 }
2282 }
2283 }
2284 break;
2285 }
2286 }
2287 }
2288 }
2289 }
2290 return $valid;
2291 }
2292
2293 /**
2294 * Returns the styles array that apply for the selected HTML tag.
2295 * @param $dom (array) array of HTML tags and properties
2296 * @param $key (int) key of the current HTML tag
2297 * @param $css (array) array of CSS properties
2298 * @return array containing CSS properties
2299 * @since 5.1.000 (2010-05-25)
2300 * @public static
2301 */
2302 public static function getCSSdataArray($dom, $key, $css) {
2303 $cssarray = array(); // style to be returned
2304 // get parent CSS selectors
2305 $selectors = array();
2306 if (isset($dom[($dom[$key]['parent'])]['csssel'])) {
2307 $selectors = $dom[($dom[$key]['parent'])]['csssel'];
2308 }
2309 // get all styles that apply
2310 foreach($css as $selector => $style) {
2311 $pos = strpos($selector, ' ');
2312 // get specificity
2313 $specificity = substr($selector, 0, $pos);
2314 // remove specificity
2315 $selector = substr($selector, $pos);
2316 // check if this selector apply to current tag
2317 if (self::isValidCSSSelectorForTag($dom, $key, $selector)) {
2318 if (!in_array($selector, $selectors)) {
2319 // add style if not already added on parent selector
2320 $cssarray[] = array('k' => $selector, 's' => $specificity, 'c' => $style);
2321 $selectors[] = $selector;
2322 }
2323 }
2324 }
2325 if (isset($dom[$key]['attribute']['style'])) {
2326 // attach inline style (latest properties have high priority)
2327 $cssarray[] = array('k' => '', 's' => '1000', 'c' => $dom[$key]['attribute']['style']);
2328 }
2329 // order the css array to account for specificity
2330 $cssordered = array();
2331 foreach ($cssarray as $key => $val) {
2332 $skey = sprintf('%04d', $key);
2333 $cssordered[$val['s'].'_'.$skey] = $val;
2334 }
2335 // sort selectors alphabetically to account for specificity
2336 ksort($cssordered, SORT_STRING);
2337 return array($selectors, $cssordered);
2338 }
2339
2340 /**
2341 * Compact CSS data array into single string.
2342 * @param $css (array) array of CSS properties
2343 * @return string containing merged CSS properties
2344 * @since 5.9.070 (2011-04-19)
2345 * @public static
2346 */
2347 public static function getTagStyleFromCSSarray($css) {
2348 $tagstyle = ''; // value to be returned
2349 foreach ($css as $style) {
2350 // split single css commands
2351 $csscmds = explode(';', $style['c']);
2352 foreach ($csscmds as $cmd) {
2353 if (!empty($cmd)) {
2354 $pos = strpos($cmd, ':');
2355 if ($pos !== false) {
2356 $cmd = substr($cmd, 0, ($pos + 1));
2357 if (strpos($tagstyle, $cmd) !== false) {
2358 // remove duplicate commands (last commands have high priority)
2359 $tagstyle = preg_replace('/'.$cmd.'[^;]+/i', '', $tagstyle);
2360 }
2361 }
2362 }
2363 }
2364 $tagstyle .= ';'.$style['c'];
2365 }
2366 // remove multiple semicolons
2367 $tagstyle = preg_replace('/[;]+/', ';', $tagstyle);
2368 return $tagstyle;
2369 }
2370
2371 /**
2372 * Returns the Roman representation of an integer number
2373 * @param $number (int) number to convert
2374 * @return string roman representation of the specified number
2375 * @since 4.4.004 (2008-12-10)
2376 * @public static
2377 */
2378 public static function intToRoman($number) {
2379 $roman = '';
2380 while ($number >= 1000) {
2381 $roman .= 'M';
2382 $number -= 1000;
2383 }
2384 while ($number >= 900) {
2385 $roman .= 'CM';
2386 $number -= 900;
2387 }
2388 while ($number >= 500) {
2389 $roman .= 'D';
2390 $number -= 500;
2391 }
2392 while ($number >= 400) {
2393 $roman .= 'CD';
2394 $number -= 400;
2395 }
2396 while ($number >= 100) {
2397 $roman .= 'C';
2398 $number -= 100;
2399 }
2400 while ($number >= 90) {
2401 $roman .= 'XC';
2402 $number -= 90;
2403 }
2404 while ($number >= 50) {
2405 $roman .= 'L';
2406 $number -= 50;
2407 }
2408 while ($number >= 40) {
2409 $roman .= 'XL';
2410 $number -= 40;
2411 }
2412 while ($number >= 10) {
2413 $roman .= 'X';
2414 $number -= 10;
2415 }
2416 while ($number >= 9) {
2417 $roman .= 'IX';
2418 $number -= 9;
2419 }
2420 while ($number >= 5) {
2421 $roman .= 'V';
2422 $number -= 5;
2423 }
2424 while ($number >= 4) {
2425 $roman .= 'IV';
2426 $number -= 4;
2427 }
2428 while ($number >= 1) {
2429 $roman .= 'I';
2430 --$number;
2431 }
2432 return $roman;
2433 }
2434
2435 /**
2436 * Find position of last occurrence of a substring in a string
2437 * @param $haystack (string) The string to search in.
2438 * @param $needle (string) substring to search.
2439 * @param $offset (int) May be specified to begin searching an arbitrary number of characters into the string.
2440 * @return Returns the position where the needle exists. Returns FALSE if the needle was not found.
2441 * @since 4.8.038 (2010-03-13)
2442 * @public static
2443 */
2444 public static function revstrpos($haystack, $needle, $offset = 0) {
2445 $length = strlen($haystack);
2446 $offset = ($offset > 0)?($length - $offset):abs($offset);
2447 $pos = strpos(strrev($haystack), strrev($needle), $offset);
2448 return ($pos === false)?false:($length - $pos - strlen($needle));
2449 }
2450
2451 /**
2452 * Serialize an array of parameters to be used with TCPDF tag in HTML code.
2453 * @param $data (array) parameters array
2454 * @return string containing serialized data
2455 * @since 4.9.006 (2010-04-02)
2456 * @public static
2457 */
2458 public static function serializeTCPDFtagParameters($data) {
2459 return urlencode(json_encode($data));
2460 }
2461
2462 /**
2463 * Unserialize parameters to be used with TCPDF tag in HTML code.
2464 * @param $data (string) serialized data
2465 * @return array containing unserialized data
2466 * @public static
2467 */
2468 public static function unserializeTCPDFtagParameters($data) {
2469 return json_decode(urldecode($data), true);
2470 }
2471
2472 /**
2473 * Returns an array of hyphenation patterns.
2474 * @param $file (string) TEX file containing hypenation patterns. TEX pattrns can be downloaded from http://www.ctan.org/tex-archive/language/hyph-utf8/tex/generic/hyph-utf8/patterns/
2475 * @return array of hyphenation patterns
2476 * @author Nicola Asuni
2477 * @since 4.9.012 (2010-04-12)
2478 * @public static
2479 */
2480 public static function getHyphenPatternsFromTEX($file) {
2481 // TEX patterns are available at:
2482 // http://www.ctan.org/tex-archive/language/hyph-utf8/tex/generic/hyph-utf8/patterns/
2483 $data = file_get_contents($file);
2484 $patterns = array();
2485 // remove comments
2486 $data = preg_replace('/\%[^\n]*/', '', $data);
2487 // extract the patterns part
2488 preg_match('/\\\\patterns\{([^\}]*)\}/i', $data, $matches);
2489 $data = trim(substr($matches[0], 10, -1));
2490 // extract each pattern
2491 $patterns_array = preg_split('/[\s]+/', $data);
2492 // create new language array of patterns
2493 $patterns = array();
2494 foreach($patterns_array as $val) {
2495 if (!TCPDF_STATIC::empty_string($val)) {
2496 $val = trim($val);
2497 $val = str_replace('\'', '\\\'', $val);
2498 $key = preg_replace('/[0-9]+/', '', $val);
2499 $patterns[$key] = $val;
2500 }
2501 }
2502 return $patterns;
2503 }
2504
2505 /**
2506 * Get the Path-Painting Operators.
2507 * @param $style (string) Style of rendering. Possible values are:
2508 * <ul>
2509 * <li>S or D: Stroke the path.</li>
2510 * <li>s or d: Close and stroke the path.</li>
2511 * <li>f or F: Fill the path, using the nonzero winding number rule to determine the region to fill.</li>
2512 * <li>f* or F*: Fill the path, using the even-odd rule to determine the region to fill.</li>
2513 * <li>B or FD or DF: Fill and then stroke the path, using the nonzero winding number rule to determine the region to fill.</li>
2514 * <li>B* or F*D or DF*: Fill and then stroke the path, using the even-odd rule to determine the region to fill.</li>
2515 * <li>b or fd or df: Close, fill, and then stroke the path, using the nonzero winding number rule to determine the region to fill.</li>
2516 * <li>b or f*d or df*: Close, fill, and then stroke the path, using the even-odd rule to determine the region to fill.</li>
2517 * <li>CNZ: Clipping mode using the even-odd rule to determine which regions lie inside the clipping path.</li>
2518 * <li>CEO: Clipping mode using the nonzero winding number rule to determine which regions lie inside the clipping path</li>
2519 * <li>n: End the path object without filling or stroking it.</li>
2520 * </ul>
2521 * @param $default (string) default style
2522 * @author Nicola Asuni
2523 * @since 5.0.000 (2010-04-30)
2524 * @public static
2525 */
2526 public static function getPathPaintOperator($style, $default='S') {
2527 $op = '';
2528 switch($style) {
2529 case 'S':
2530 case 'D': {
2531 $op = 'S';
2532 break;
2533 }
2534 case 's':
2535 case 'd': {
2536 $op = 's';
2537 break;
2538 }
2539 case 'f':
2540 case 'F': {
2541 $op = 'f';
2542 break;
2543 }
2544 case 'f*':
2545 case 'F*': {
2546 $op = 'f*';
2547 break;
2548 }
2549 case 'B':
2550 case 'FD':
2551 case 'DF': {
2552 $op = 'B';
2553 break;
2554 }
2555 case 'B*':
2556 case 'F*D':
2557 case 'DF*': {
2558 $op = 'B*';
2559 break;
2560 }
2561 case 'b':
2562 case 'fd':
2563 case 'df': {
2564 $op = 'b';
2565 break;
2566 }
2567 case 'b*':
2568 case 'f*d':
2569 case 'df*': {
2570 $op = 'b*';
2571 break;
2572 }
2573 case 'CNZ': {
2574 $op = 'W n';
2575 break;
2576 }
2577 case 'CEO': {
2578 $op = 'W* n';
2579 break;
2580 }
2581 case 'n': {
2582 $op = 'n';
2583 break;
2584 }
2585 default: {
2586 if (!empty($default)) {
2587 $op = self::getPathPaintOperator($default, '');
2588 } else {
2589 $op = '';
2590 }
2591 }
2592 }
2593 return $op;
2594 }
2595
2596 /**
2597 * Get the product of two SVG tranformation matrices
2598 * @param $ta (array) first SVG tranformation matrix
2599 * @param $tb (array) second SVG tranformation matrix
2600 * @return transformation array
2601 * @author Nicola Asuni
2602 * @since 5.0.000 (2010-05-02)
2603 * @public static
2604 */
2605 public static function getTransformationMatrixProduct($ta, $tb) {
2606 $tm = array();
2607 $tm[0] = ($ta[0] * $tb[0]) + ($ta[2] * $tb[1]);
2608 $tm[1] = ($ta[1] * $tb[0]) + ($ta[3] * $tb[1]);
2609 $tm[2] = ($ta[0] * $tb[2]) + ($ta[2] * $tb[3]);
2610 $tm[3] = ($ta[1] * $tb[2]) + ($ta[3] * $tb[3]);
2611 $tm[4] = ($ta[0] * $tb[4]) + ($ta[2] * $tb[5]) + $ta[4];
2612 $tm[5] = ($ta[1] * $tb[4]) + ($ta[3] * $tb[5]) + $ta[5];
2613 return $tm;
2614 }
2615
2616 /**
2617 * Get the tranformation matrix from SVG transform attribute
2618 * @param $attribute (string) transformation
2619 * @return array of transformations
2620 * @author Nicola Asuni
2621 * @since 5.0.000 (2010-05-02)
2622 * @public static
2623 */
2624 public static function getSVGTransformMatrix($attribute) {
2625 // identity matrix
2626 $tm = array(1, 0, 0, 1, 0, 0);
2627 $transform = array();
2628 if (preg_match_all('/(matrix|translate|scale|rotate|skewX|skewY)[\s]*\(([^\)]+)\)/si', $attribute, $transform, PREG_SET_ORDER) > 0) {
2629 foreach ($transform as $key => $data) {
2630 if (!empty($data[2])) {
2631 $a = 1;
2632 $b = 0;
2633 $c = 0;
2634 $d = 1;
2635 $e = 0;
2636 $f = 0;
2637 $regs = array();
2638 switch ($data[1]) {
2639 case 'matrix': {
2640 if (preg_match('/([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)/si', $data[2], $regs)) {
2641 $a = $regs[1];
2642 $b = $regs[2];
2643 $c = $regs[3];
2644 $d = $regs[4];
2645 $e = $regs[5];
2646 $f = $regs[6];
2647 }
2648 break;
2649 }
2650 case 'translate': {
2651 if (preg_match('/([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)/si', $data[2], $regs)) {
2652 $e = $regs[1];
2653 $f = $regs[2];
2654 } elseif (preg_match('/([a-z0-9\-\.]+)/si', $data[2], $regs)) {
2655 $e = $regs[1];
2656 }
2657 break;
2658 }
2659 case 'scale': {
2660 if (preg_match('/([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)/si', $data[2], $regs)) {
2661 $a = $regs[1];
2662 $d = $regs[2];
2663 } elseif (preg_match('/([a-z0-9\-\.]+)/si', $data[2], $regs)) {
2664 $a = $regs[1];
2665 $d = $a;
2666 }
2667 break;
2668 }
2669 case 'rotate': {
2670 if (preg_match('/([0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)[\,\s]+([a-z0-9\-\.]+)/si', $data[2], $regs)) {
2671 $ang = deg2rad($regs[1]);
2672 $x = $regs[2];
2673 $y = $regs[3];
2674 $a = cos($ang);
2675 $b = sin($ang);
2676 $c = -$b;
2677 $d = $a;
2678 $e = ($x * (1 - $a)) - ($y * $c);
2679 $f = ($y * (1 - $d)) - ($x * $b);
2680 } elseif (preg_match('/([0-9\-\.]+)/si', $data[2], $regs)) {
2681 $ang = deg2rad($regs[1]);
2682 $a = cos($ang);
2683 $b = sin($ang);
2684 $c = -$b;
2685 $d = $a;
2686 $e = 0;
2687 $f = 0;
2688 }
2689 break;
2690 }
2691 case 'skewX': {
2692 if (preg_match('/([0-9\-\.]+)/si', $data[2], $regs)) {
2693 $c = tan(deg2rad($regs[1]));
2694 }
2695 break;
2696 }
2697 case 'skewY': {
2698 if (preg_match('/([0-9\-\.]+)/si', $data[2], $regs)) {
2699 $b = tan(deg2rad($regs[1]));
2700 }
2701 break;
2702 }
2703 }
2704 $tm = self::getTransformationMatrixProduct($tm, array($a, $b, $c, $d, $e, $f));
2705 }
2706 }
2707 }
2708 return $tm;
2709 }
2710
2711 /**
2712 * Returns the angle in radiants between two vectors
2713 * @param $x1 (int) X coordinate of first vector point
2714 * @param $y1 (int) Y coordinate of first vector point
2715 * @param $x2 (int) X coordinate of second vector point
2716 * @param $y2 (int) Y coordinate of second vector point
2717 * @author Nicola Asuni
2718 * @since 5.0.000 (2010-05-04)
2719 * @public static
2720 */
2721 public static function getVectorsAngle($x1, $y1, $x2, $y2) {
2722 $dprod = ($x1 * $x2) + ($y1 * $y2);
2723 $dist1 = sqrt(($x1 * $x1) + ($y1 * $y1));
2724 $dist2 = sqrt(($x2 * $x2) + ($y2 * $y2));
2725 $angle = acos($dprod / ($dist1 * $dist2));
2726 if (is_nan($angle)) {
2727 $angle = M_PI;
2728 }
2729 if ((($x1 * $y2) - ($x2 * $y1)) < 0) {
2730 $angle *= -1;
2731 }
2732 return $angle;
2733 }
2734
2735 /**
2736 * Split string by a regular expression.
2737 * This is a wrapper for the preg_split function to avoid the bug: https://bugs.php.net/bug.php?id=45850
2738 * @param $pattern (string) The regular expression pattern to search for without the modifiers, as a string.
2739 * @param $modifiers (string) The modifiers part of the pattern,
2740 * @param $subject (string) The input string.
2741 * @param $limit (int) If specified, then only substrings up to limit are returned with the rest of the string being placed in the last substring. A limit of -1, 0 or NULL means "no limit" and, as is standard across PHP, you can use NULL to skip to the flags parameter.
2742 * @param $flags (int) The flags as specified on the preg_split PHP function.
2743 * @return Returns an array containing substrings of subject split along boundaries matched by pattern.modifier
2744 * @author Nicola Asuni
2745 * @since 6.0.023
2746 * @public static
2747 */
2748 public static function pregSplit($pattern, $modifiers, $subject, $limit=NULL, $flags=NULL) {
2749 // the bug only happens on PHP 5.2 when using the u modifier
2750 if ((strpos($modifiers, 'u') === FALSE) OR (count(preg_split('//u', "\n\t", -1, PREG_SPLIT_NO_EMPTY)) == 2)) {
2751 return preg_split($pattern.$modifiers, $subject, $limit, $flags);
2752 }
2753 // preg_split is bugged - try alternative solution
2754 $ret = array();
2755 while (($nl = strpos($subject, "\n")) !== FALSE) {
2756 $ret = array_merge($ret, preg_split($pattern.$modifiers, substr($subject, 0, $nl), $limit, $flags));
2757 $ret[] = "\n";
2758 $subject = substr($subject, ($nl + 1));
2759 }
2760 if (strlen($subject) > 0) {
2761 $ret = array_merge($ret, preg_split($pattern.$modifiers, $subject, $limit, $flags));
2762 }
2763 return $ret;
2764 }
2765
2766 /**
2767 * Reads entire file into a string.
2768 * The file can be also an URL.
2769 * @param $file (string) Name of the file or URL to read.
2770 * @return The function returns the read data or FALSE on failure.
2771 * @author Nicola Asuni
2772 * @since 6.0.025
2773 * @public static
2774 */
2775 public static function fileGetContents($file) {
2776 //$file = html_entity_decode($file);
2777 // array of possible alternative paths/URLs
2778 $alt = array($file);
2779 // replace URL relative path with full real server path
2780 if ((strlen($file) > 1)
2781 AND ($file[0] == '/')
2782 AND ($file[1] != '/')
2783 AND !empty($_SERVER['DOCUMENT_ROOT'])
2784 AND ($_SERVER['DOCUMENT_ROOT'] != '/')) {
2785 $findroot = strpos($file, $_SERVER['DOCUMENT_ROOT']);
2786 if (($findroot === false) OR ($findroot > 1)) {
2787 if (substr($_SERVER['DOCUMENT_ROOT'], -1) == '/') {
2788 $tmp = substr($_SERVER['DOCUMENT_ROOT'], 0, -1).$file;
2789 } else {
2790 $tmp = $_SERVER['DOCUMENT_ROOT'].$file;
2791 }
2792 $alt[] = htmlspecialchars_decode(urldecode($tmp));
2793 }
2794 }
2795 // URL mode
2796 $url = $file;
2797 // check for missing protocol
2798 if (preg_match('%^/{2}%', $url)) {
2799 if (preg_match('%^([^:]+:)//%i', K_PATH_URL, $match)) {
2800 $url = $match[1].str_replace(' ', '%20', $url);
2801 $alt[] = $url;
2802 }
2803 }
2804 $urldata = @parse_url($url);
2805 if (!isset($urldata['query']) OR (strlen($urldata['query']) <= 0)) {
2806 if (strpos($url, K_PATH_URL) === 0) {
2807 // convert URL to full server path
2808 $tmp = str_replace(K_PATH_URL, K_PATH_MAIN, $url);
2809 $tmp = htmlspecialchars_decode(urldecode($tmp));
2810 $alt[] = $tmp;
2811 }
2812 }
2813 if (isset($_SERVER['SCRIPT_URI'])) {
2814 $urldata = @parse_url($_SERVER['SCRIPT_URI']);
2815 $alt[] = $urldata['scheme'].'://'.$urldata['host'].(($file[0] == '/') ? '' : '/').$file;
2816 }
2817 foreach ($alt as $f) {
2818 $ret = @file_get_contents($f);
2819 if (($ret === FALSE)
2820 AND !ini_get('allow_url_fopen')
2821 AND function_exists('curl_init')
2822 AND preg_match('%^(https?|ftp)://%', $f)) {
2823 // try to get remote file data using cURL
2824 $cs = curl_init(); // curl session
2825 curl_setopt($cs, CURLOPT_URL, $f);
2826 curl_setopt($cs, CURLOPT_BINARYTRANSFER, true);
2827 curl_setopt($cs, CURLOPT_FAILONERROR, true);
2828 curl_setopt($cs, CURLOPT_RETURNTRANSFER, true);
2829 if ((ini_get('open_basedir') == '') AND (!ini_get('safe_mode'))) {
2830 curl_setopt($cs, CURLOPT_FOLLOWLOCATION, true);
2831 }
2832 curl_setopt($cs, CURLOPT_CONNECTTIMEOUT, 5);
2833 curl_setopt($cs, CURLOPT_TIMEOUT, 30);
2834 curl_setopt($cs, CURLOPT_SSL_VERIFYPEER, false);
2835 curl_setopt($cs, CURLOPT_SSL_VERIFYHOST, false);
2836 curl_setopt($cs, CURLOPT_USERAGENT, 'TCPDF');
2837 $ret = curl_exec($cs);
2838 curl_close($cs);
2839 }
2840 if ($ret !== FALSE) {
2841 break;
2842 }
2843 }
2844 return $ret;
2845 }
2846
2847} // END OF TCPDF_STATIC CLASS
2848
2849//============================================================+
2850// END OF FILE
2851//============================================================+