1 // Portions copyright 2012 Google, Inc. 2 // Portions copyright 2011 Mozilla Foundation. All rights reserved. 3 4 // This program is free software; you can redistribute it and/or modify 5 // it under the terms of the GNU General Public License as published by 6 // the Free Software Foundation; either version 2 of the License, or 7 // (at your option) any later version. 8 // 9 // This program is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with this program; if not, write to the Free Software 16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 17 18 // The PDF-JS code in this file has been written by Mozilla. 19 // It is available in its latest version from: 20 // 21 // https://github.com/mozilla/pdf.js 22 23 24 //////// Benchmark set-up. (c) by Google. //////// 25 26 var pdf_file = "test.pdf"; 27 var canvas_logs = []; 28 29 var PdfJS = new BenchmarkSuite("PdfJS", 9000000, [ 30 new Benchmark("PdfJS", runPdfJS, setupPdfJS, tearDownPdfJS, 4) 31 ]); 32 33 function setupPdfJS() { 34 // Check for Typed Arrays support, throw error if not. 35 if (!(typeof Uint8Array != "undefined" && 36 typeof Float64Array != "undefined" && 37 typeof (new Uint8Array(0)).subarray != "undefined")) { 38 throw "TypedArrayUnsupported"; 39 } 40 41 PdfJS_window.__resources__[pdf_file] = buffer(PdfJS_window.atob(getPDF())); 42 } 43 44 function runPdfJS() { 45 PDFJS.getDocument(pdf_file).then(function(pdf) { 46 var canvas = PdfJS_window.document.getElementById('canvas'); 47 var context = canvas.getContext('2d'); 48 var renderContext = {canvasContext: context}; 49 canvas_logs.push(context.__log__); 50 51 // Cycle through all pages. 52 function renderPages(i, j) { 53 if (i > j) return; 54 context.clearRect(0, 0, canvas.width, canvas.height); 55 pdf.getPage(i).then(function(page) { 56 renderContext.viewport = page.getViewport(1); 57 canvas.height = renderContext.viewport.height; 58 canvas.width = renderContext.viewport.width; 59 page.render(renderContext).then(renderPages.bind(null, i + 1, j)); 60 }); 61 } 62 renderPages(1, pdf.numPages); 63 }); 64 65 // Wait for everything to complete. 66 PdfJS_window.flushTimeouts(); 67 } 68 69 function tearDownPdfJS() { 70 // Should produce 36788 939524096 for all runs. 71 for (var i = 0; i < canvas_logs.length; ++i) { 72 var log_length = canvas_logs[i].length; 73 var log_hash = hash(canvas_logs[i].join(" ")); 74 var expected_length = 36788; 75 var expected_hash = 939524096; 76 if (log_length !== expected_length || log_hash !== expected_hash) { 77 var message = "PdfJS produced incorrect output: " + 78 "expected " + expected_length + " " + expected_hash + ", " + 79 "got " + log_length + " " + log_hash; 80 console.log(message + "\n"); 81 throw message; 82 } 83 } 84 // Allow GC of global state. 85 delete this.PDFJS; 86 delete this.PdfJS_window; 87 } 88 89 function buffer(s) { 90 var b = new ArrayBuffer(s.length); 91 var a = new Uint8Array(b); 92 for (var i = 0; i < s.length; ++i) a[i] = s.charCodeAt(i); 93 return b; 94 } 95 96 function hash(s) { 97 var up = Math.floor((s.length + 3) / 4); 98 var h = 0; 99 for (var i = 0; 4*i - 3 < s.length; i += 4) { 100 for (var j = 0; j < 4 && i + j < s.length; ++j) 101 h = (h + s.charCodeAt(i + j) << (8*j)) | 0; 102 } 103 return h; 104 } 105 106 107 ///////// Mocks of relevant browser functionality. (c) by Google. //////// 108 109 // Every acces to window will be redirected to PdfJS_window. 110 var PdfJS_window = Object.create(this); 111 112 function PdfJS_windowInstall(name, x) { 113 Object.defineProperty(PdfJS_window, name, {value: x}); 114 } 115 116 PdfJS_windowInstall("setTimeout", function(cmd, delay) { 117 PdfJS_window.__timeouts__.push(cmd); 118 }); 119 120 PdfJS_windowInstall("flushTimeouts", function() { 121 while (PdfJS_window.__timeouts__.length != 0) { 122 var next = PdfJS_window.__timeouts__.pop(); 123 if (typeof next === "function") 124 next({data: "{}"}); 125 else 126 eval(next); 127 } 128 }); 129 130 PdfJS_windowInstall("window", PdfJS_window); 131 132 PdfJS_window.__timeouts__ = []; 133 PdfJS_window.__resources__ = {}; 134 135 136 // Base64 encoding/decoding is based on code by Grant Galitz. 137 PdfJS_window.__to64__ = [ 138 "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", 139 "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", 140 "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", 141 "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", 142 "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/", "=" 143 ]; 144 145 PdfJS_windowInstall("btoa", function(data) { 146 var result = ""; 147 if (data.length > 0) { 148 var i = 0; 149 while (i < data.length) { 150 var b1 = data.charCodeAt(i++) & 0xff; 151 var b2 = data.charCodeAt(i++ < data.length ? i-1 : 0) & 0xff; 152 var b3 = data.charCodeAt(i++ < data.length ? i-1 : 0) & 0xff; 153 result += PdfJS_window.__to64__[b1 >> 2]; 154 if (i === data.length + 2) { 155 result += PdfJS_window.__to64__[(b1 & 0x3) << 4] + "=="; 156 } else { 157 result += PdfJS_window.__to64__[((b1 & 0x3) << 4) | (b2 >> 4)]; 158 if (i === data.length + 1) { 159 result += PdfJS_window.__to64__[(b2 & 0xF) << 2] + "="; 160 } else { 161 result += PdfJS_window.__to64__[((b2 & 0xF) << 2) | (b3 >> 6)] + 162 PdfJS_window.__to64__[b3 & 0x3F]; 163 } 164 } 165 } 166 } 167 return result; 168 }); 169 170 PdfJS_window.__from64__ = 171 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; 172 173 PdfJS_windowInstall("atob", function(data) { 174 var result = ""; 175 var i = 0; 176 while (i < data.length) { 177 var x1 = PdfJS_window.__from64__.indexOf(data.charAt(i++)); 178 var x2 = PdfJS_window.__from64__.indexOf(data.charAt(i++)); 179 var x3 = PdfJS_window.__from64__.indexOf(data.charAt(i++)); 180 var x4 = PdfJS_window.__from64__.indexOf(data.charAt(i++)); 181 result += String.fromCharCode((x1 << 2) | (x2 >> 4)); 182 if (x3 != 0x40) { 183 result += String.fromCharCode(((x2 & 0x0F) << 4) | (x3 >> 2)); 184 if (x4 != 0x40) { 185 result += String.fromCharCode(((x3 & 0x03) << 6) | x4); 186 } 187 } 188 } 189 return result; 190 }); 191 192 193 PdfJS_windowInstall("XMLHttpRequest", function() { 194 this.open = function(type, url, some_bool) { 195 this.url = url; 196 } 197 this.overrideMimeType = function() {} 198 this.send = function() { 199 this.response = PdfJS_window.__resources__[this.url]; 200 this.readyState = 4; 201 this.status = 0; 202 this.onreadystatechange(); 203 } 204 }); 205 206 PdfJS_windowInstall("console", this.console ? this.console : { 207 log: function(s) { 208 // To verify that the test produces the right results, 209 // uncomment this code. 210 /* 211 var re = new RegExp("%d", "g"); 212 var args = arguments; 213 var i = 0; 214 print(s.replace(re, function() { return args[++i] })); 215 */ 216 } 217 }); 218 219 PdfJS_windowInstall("location", { 220 protocol: "" 221 }); 222 223 PdfJS_windowInstall("Event", function() { 224 this.initEvent = function(name) { 225 this.name = name; 226 } 227 }); 228 229 PdfJS_windowInstall("Element", function(type) { 230 this.__listeners__ = {}; 231 this.element_type = type; 232 this.insertBefore = function() {}; 233 this.addEventListener = function(name, listener) { 234 this.__listeners__[name] = listener; 235 }; 236 this.removeEventListener = function(name) { 237 delete this.__listeners__[name]; 238 }; 239 this.dispatchEvent = function(event) { 240 this.__listeners__[event.name](event) 241 }; 242 this.getElementsByTagName = function(name) { 243 if (name === "head") { 244 return [{appendChild: function() {}}] 245 } 246 }; 247 this.appendChild = function() {}; 248 this.setAttribute = function() {}; 249 this.sheet = { 250 cssRules: [], 251 insertRule: function() {} 252 }; 253 }); 254 255 PdfJS_windowInstall("Context", function() { 256 this.__log__ = []; 257 this.save = function() { 258 this.__log__.push("save","\n"); 259 } 260 this.restore = function() { 261 this.__log__.push("restore","\n"); 262 } 263 this.transform = function(a,b,c,d,e,f) { 264 this.__log__.push("transform",a,b,c,d,e,f,"\n"); 265 } 266 this.translate = function(x,y) { 267 this.__log__.push("translate",x,y,"\n"); 268 } 269 this.scale = function(x,y) { 270 this.__log__.push("scale",x,y,"\n"); 271 } 272 this.rect = function(x,y,w,h) { 273 this.__log__.push("rect",x,y,w,h,"\n"); 274 } 275 this.clip = function() { 276 this.__log__.push("clip","\n"); 277 } 278 this.fill = function() { 279 this.__log__.push("fill","\n"); 280 } 281 this.stroke = function() { 282 this.__log__.push("stroke","\n"); 283 } 284 this.beginPath = function() { 285 this.__log__.push("beginPath","\n"); 286 } 287 this.closePath = function() { 288 this.__log__.push("closePath","\n"); 289 } 290 this.moveTo = function(x,y) { 291 this.__log__.push("moveTo",x,y,"\n"); 292 } 293 this.lineTo = function(x,y) { 294 this.__log__.push("lineTo",x,y,"\n"); 295 } 296 this.fillRect = function(x,y,w,h) { 297 this.__log__.push("fillRect",x,y,w,h,"\n"); 298 } 299 this.fillText = function(s,x,y,w) { 300 this.__log__.push("fillText",s,x,y,"\n"); 301 } 302 this.strokeText = function(s,x,y,w) { 303 this.__log__.push("strokeText",s,x,y,"\n"); 304 } 305 this.getImageData = function(x,y,w,h) { 306 this.__log__.push("getImageData",x,y,w,h,"\n"); 307 return {data: []}; 308 } 309 this.putImageData = function(data,x,y) { 310 this.__log__.push("putImageData","{...}",x,y,"\n"); 311 } 312 this.drawImage = function(image,x,y) { 313 this.__log__.push("drawImage","<elem>",x,y,"\n"); 314 } 315 this.getParameter = function(name) { 316 this.__log__.push("getParameter",name,"\n"); 317 return null; 318 } 319 this.enable = function() { 320 this.__log__.push("enable","\n"); 321 } 322 this.disable = function() { 323 this.__log__.push("disable","\n"); 324 } 325 this.depthFunc = function(param) { 326 this.__log__.push("depthFunc",param,"\n"); 327 } 328 this.clearColor = function(r,g,b,a) { 329 this.__log__.push("clearColor",r,g,b,a,"\n"); 330 } 331 this.clear = function(m) { 332 this.__log__.push("clear",m,"\n"); 333 } 334 this.clearRect = function(x,y,w,h) { 335 this.__log__.push("createRect",x,y,w,h,"\n"); 336 } 337 }); 338 339 PdfJS_windowInstall("Canvas", function() { 340 this.getContext = function() { 341 return new PdfJS_window.Context(); 342 } 343 this.width = 100; 344 this.height = 100; 345 this.style = { visibility: "visibile" }; 346 }); 347 348 PdfJS_windowInstall("document", { 349 body : new PdfJS_window.Element("body"), 350 documentElement : new PdfJS_window.Element("document"), 351 createElement : function(element_type) { 352 var element; 353 if (element_type === "canvas") { 354 element = new PdfJS_window.Canvas(); 355 } else { 356 element = new PdfJS_window.Element(element_type); 357 } 358 element.parentNode = new PdfJS_window.Element("dummy_parent"); 359 return element; 360 }, 361 getElementById : function(name) { 362 if (name === "canvas") { 363 return new PdfJS_window.Canvas(); 364 } else { 365 return undefined; 366 } 367 }, 368 getElementsByTagName : function(element) { 369 if (element === "script") { 370 return new Array(new this.createElement(element)); 371 } 372 }, 373 createEvent : function() { return new PdfJS_window.Event() } 374 }); 375 376 PdfJS_window.window.addEventListener = function(name, listener) { 377 PdfJS_window.setTimeout(listener) 378 } 379 380 PdfJS_windowInstall("Worker", undefined); 381 382 383 ///////// The PDF we want to render, encoded in base64. //////// 384 385 function getPDF() { 386 return "JVBERi0xLjQKJdDUxdgKMyAwIG9iaiA8PAovTGVuZ3RoIDMxMTAgICAgICAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjalVlLk+O2Eb7Pr1B8MadqRfP9uGX9iu2yEyc7VU7V7h4wFCTRQ5EKQM7u5pK/nq8flMhdeVO5iECj0Wh0N7o/QF8/3H31fVxs4jJM4jzbPOw3cZGEZVRtyjgP4zrfPOw2r4PfjvdJEXy436ZREnx/X9bB1DdjO/SmE9qvbjg4czq1/UEIv5hxtM7fv3346avvk3gTx2Gd5wmtkBR1WOX1pgiTrBT5b6IoFda4XLJukzwL87jebNMizDGHuX8ajj1WgUY/TIej9S+oUwY/9n5sx4nUsvdx0At1Pzjh/daM5h6EZ/qxo+39032eB+b8glbeZBm2XWy2cRrWs1rfHE13ol2wgIf7Kg7sU9/qRFXhfhsH/7nP6igYDhiB8KEzIjOFKdNcZVYiM4uTupCpf8G0qg6G0T7eb2meO8i8bVqHRVqvJ7767btvv/trKFPd76fjnxsfNrSeahl6KzZMk00d1kVSkAlzGLuAqKwKy0pFvXz0ozPNKOzVgnsbF3GYRwk1wlTt/RIGSPIi8MN+pPXe3SdVYJwVKuleBbYZTpb5yuA0zGOm30njNJCZHNxihQfs586+f0EbT4J2FLb2cxKcTm1PZ15ycKPpSRWdPA6qJi01ugmLNdyklrNi2TiDRTN8Ochkf7x6ncu+bNfBxlmaBL/dVyl1tzDW1IyTszvhEztUSzvUqjtGrfEfpMUKkVzXjpaCNEovo8VldGcfp4OOYj9xsJPxsxtI/nO7syrZyKcZus7y6RPGYc9bi3RThWyKLI7pu6mj6WkBdY5mpFYRNKYXkvpOqM5uJ097ZOZhJu6mRhn2UG4iO0j3vDrzBSkmpvcwYJ7FwTcDu+eZzSqemlMGpnemP0zmYP1Ke3XJuTO0alZEkNo39jxONC/L66BrT+3oZYxMQLTxqMziEvr5IAQo+djZkxc+jgejky6bp87VXMa1sAK2UCUpch1iYJHrWIHPKj75I9gSMvfgSThO60VlkB9NQ+o9YYEyiYIfSaN+ntEq09lIiFsnfYlMEeaPgwSfziGnEv0akoMM7a0hZ3kZRpQIdbkb9D+7m5bipKqgjxvbhmyDQM2Q3o8tEq/bDm5HKhLLLNdLl88tNTrz7w/Sss/3dKC7yRCfCpJQxGgjwTK69nEardAODlvoeHotEQkie6qEp7a3NCb3jeJ/eI4CEZ+XrFQU2PeGsg4XjDq+WJWGTqZvz9ggL11SlPlRZ8lWQBud1bnJHPwy4O2zipIcxyGOmbyjCbm5bWaS6Q4DNDye/Itb6vNaWVxQkkPY2jm/EUmCPC5JfBycj2arEYy6xgxHOyF24SjpvonyiGMdbUOq0TRdXQTtSdlBOy/h4jdRnDUthwYm/SirIwW2B9vzeQRVcgTr2N9KPAdzslucX3YC54akLmd7eSgVc35Ng1cty6TRi0/VfWXwQQYkqZayd2o8saF1VFJoGfipaaz3+6lbLUaZiRPrKupvBs18BrYpFOOUnqYZcu9oOo4/UG+VHaJzXNL3qLMQtJ2Q5DS6DtlECnO2Qf1Js4LBDZQAQCjmohzDRTEOJKyeUv0isSgGk2T6Tyo1ZidxWAFa8ewHzh1pVq9yB/VnOh80+gKYnc6jdFh5fHf2hKMLUMDxn0fYXEx5hJu8MTC9idNMN4feZXNfqCgpL2gtUwxrtCgUt5IMK1gsrJ1R/FPEnhUXzRZ/IRrJicwomfhBWrIRYCHbnYWy1uJargTPgWDfn7uhHWUe52cWuZM01VMUjhoUlwXkFN6IesSeOv1Rqw+Fwsk8SXWk+NF4aTprnAy/E5Nx8HCx4OgjBfJAd7yKSg6jzS0I80mdirN1fc7inA1NA2Qz6iMpdXKWBQkAFjdm4qIVM9qgzyXR0UwkaS+JkYbmmu4seY0oXGTAdykG4R+jrgcOq4KMxGWmyBZJFR14xHZ7bXv5EpICcpeOUaKRz7ymch5brrNH6TrbcHZuJVHrzHFWQRf+Uultf57G9SIUH7fytTtMiywdFRcIR+2d7XRBirksyjWHR8VyRaIP08hLUtt4YRHIAAJq+NSNyJoFAM0DZ8czVRS2+lVorpbMFvlOJd3UfWcp3feMaoHeaGpCRrGO4BKRyJ38xQpOmnsC0+pcBu/10tQrOZPrhSIQucj/jxVRxeg80agC/+K6qY9Kp57ASaORpqWU5uhbaeVIa43wYRyp4BGh06qtE5RxhWRY0HxrSa/QTxjPjnBdKxdKAr2428E/CLOjTIkD/79lnhgkyEVOmLtWqtwtpwFxtb1xlF9Kcji0xo/ii3JlI+CNYgYvYmz6CshMS4QgIZVFrSgJZ9IZAZ2TWVnMaUE6C/cR8yXRob1Wy/5LMJ4e/4+28LeJVgN+6IfR6IlFb49rzcDXSy+EB85prrfuS6VczU+9X1qH3RmCOQ+/EK4Q8mudV+Vv+WEgCh4pZuk8A+UAPU/dTjivt5+YLjpmZ3BVkN47gKRbuvdcBVJyPb8rZEnw1IvWSKWsGUYpimloXYLSK86gWClTRmi6C2Eg03tpKgUlGbXZuKel5DT4h/WoIpcMB8qrjy+lN7T/edyFbKg/KiMPArOSwGtcCBgkiqxl6NnACsr0MiA3dGpcK+elcBGdz3S9tkZyhdAnxYjJfJWmGZzkE2B0P6FiU1TublSS+eRD2QzTVo8MWQ1rOfkC8nth4dwKigYbzEW+qJPk0wp61VDnzDcUSbIgUDCIUN8e+kUZwJhHaF/wOx3GHCUchfeGV8RqrqXo42OLAjowNE6jOji08/2Zu0Y+AhG6ySp/r7nMybA6qz9Yxto4K5xEWZ7FgeLagf3q7FWcRtVi3yxsUCzUqg79zW34dme3lCFS2zCYwrICb0hTflQBdHsphEWxTgWIyAS5DoJ0NNenA6Hw0QPLvIRQtTRREwC0F5YZvJLA4XSW+yQ4BOSli4pKKl0y9u0yaen23sObNDev2AP0YIAv/PY7LeWE5IfJsdvAxQeVHhmmA/uUoASnYtAUtYIL+FCKh3QFj9BsvVeDWQTBCu9tM6nJQG4dUJddHjihb4Xb893qjxJYHq+9JSSxfZ4sokcGVK04mC/wVvhENXlQoS8ANQzr5XKf5rlA3qvkeJFxiX0OYth2p5LGi0StLbR8e+Iwriu55dzYFWzR2iu0y2ZTZuUC9suAZNByZqjgIRi7F6IM0gGwvnHto4D3JTcsls/vL0tx8yHhGzUHe1XRDXd+hFRtribytzCMGAon8GqoqPzEUBhnQ2FIrikfpEOG4hONzNdbYbxI3DvLMJ3azur7GnVW6WdeXa0fsSFbt+SE+5VNApoG2kZVFSzkvLnlpS09yaXzkxVaLR2NrM6XibbQ+zc15MK5t26+aSjmLbgu9v5s5pEv6L0OGVauwcRA+93x20aR8K1Q6fORk4HPvwss8iBkCxClexs/nitYoIEFCptfC+ZklF0MmF4qyOVBtLw+iPKoQljr6L1NwNPddw93/7qLoVm0iTdlsonzIoyrbNOc7l6/jTY70KF3mNbV5h1znTZxFYV5VKLdbV7d/f3ua/qXJyk3eViXJT8eVFmYlDEgQB2iLn38H0xSbaqwLgr+PygLAZs22zSsonr11ABwuXpqQH+nWRLNvSPbUyuuq4wfzcr5URBZuXUNP7Zp3+gsI5/F/y7onexpUKGDLnSiuK85RCv6XwptwCF+d67K4FXXHo5syU45nH1u/bzYM7O76yGk/zryqsI3gu91l+asezP87k/Hmes+5GNHtbTkuY5JdSRMjDBAef3DdKijtx/xEbWq31K0AtxotFZlMN8S5cpWycMXfR+Nn5efh+S6V9G7SHtoBaygdzUaMbPR5NEpXngzWm+yd8N+f8PpSRlmdQ1uqexc1+ioFmUgtq3FthlArt217Edqs4Oo8bMBCket/qd0Zf9o0CsKfR+dvEpk8t8PfZtu8Nat2WSrWRycp8eu9cd5nYW5OIUUxXUJhu7c4iTIjVmsAmRUVXG87nNlE+vcwKGXUlZHmQXg3TFUyINfO2vknYYKcjNJey4PIPqVeYgydLvt3vgj/Su5U25OrxpeW2/HUR8q6WbY71Yiy2DP/1lQHRlFoj60LZedH7aFrO+XFV2whLJ4qV3s9AdD/1fW9B/Xn8L5hZEYojrmKEiSsI5jmKkOq+szpWal/wISIDWMCmVuZHN0cmVhbQplbmRvYmoKMiAwIG9iaiA8PAovVHlwZSAvUGFnZQovQ29udGVudHMgMyAwIFIKL1Jlc291cmNlcyAxIDAgUgovTWVkaWFCb3ggWzAgMCA1OTUuMjc2IDg0MS44OV0KL1BhcmVudCAxMyAwIFIKPj4gZW5kb2JqCjEgMCBvYmogPDwKL0ZvbnQgPDwgL0YxNiA0IDAgUiAvRjIxIDUgMCBSIC9GMTcgNiAwIFIgL0YzMiA3IDAgUiAvRjggOCAwIFIgL0YzNCA5IDAgUiAvRjI3IDEwIDAgUiAvRjI4IDExIDAgUiAvRjMxIDEyIDAgUiA+PgovUHJvY1NldCBbIC9QREYgL1RleHQgXQo+PiBlbmRvYmoKMTQgMCBvYmoKWzUyNSA1MjUgNTI1IDUyNSA1MjUgNTI1IDUyNSA1MjUgNTI1IDUyNSA1MjUgNTI1IDUyNV0KZW5kb2JqCjE1IDAgb2JqClsyODUuNSA1MTMuOSA4NTYuNSA1MTMuOSA4NTYuNSA3OTkuNCAyODUuNSAzOTkuNyAzOTkuNyA1MTMuOSA3OTkuNCAyODUuNSAzNDIuNiAyODUuNSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSA1MTMuOSAyODUuNSAyODUuNSAyODUuNSA3OTkuNCA0ODUuMyA0ODUuMyA3OTkuNCA3NzAuNyA3MjcuOSA3NDIuMyA3ODUgNjk5LjQgNjcwLjggODA2LjUgNzcwLjcgMzcxIDUyOC4xIDc5OS4yIDY0Mi4zIDk0MiA3NzAuNyA3OTkuNCA2OTkuNCA3OTkuNCA3NTYuNSA1NzEgNzQyLjMgNzcwLjcgNzcwLjcgMTA1Ni4yIDc3MC43IDc3MC43IDYyOC4xIDI4NS41IDUxMy45IDI4NS41IDUxMy45IDI4NS41IDI4NS41IDUxMy45IDU3MSA0NTYuOCA1NzEgNDU3LjIgMzE0IDUxMy45IDU3MSAyODUuNSAzMTQgNTQyLjQgMjg1LjUgODU2LjUgNTcxIDUxMy45IDU3MSA1NDIuNCA0MDIgNDA1LjQgMzk5LjcgNTcxIDU0Mi40IDc0Mi4zIDU0Mi40IDU0Mi40XQplbmRvYmoKMTYgMCBvYmoKWzYzOC45XQplbmRvYmoKMTcgMCBvYmoKWzU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDU2Mi41IDMxMi41IDMxMi41IDM0Mi42IDg3NSA1MzEuMiA1MzEuMiA4NzUgODQ5LjUgNzk5LjggODEyLjUgODYyLjMgNzM4LjQgNzA3LjIgODg0LjMgODc5LjYgNDE5IDU4MSA4ODAuOCA2NzUuOSAxMDY3LjEgODc5LjYgODQ0LjkgNzY4LjUgODQ0LjkgODM5LjEgNjI1IDc4Mi40IDg2NC42IDg0OS41IDExNjIgODQ5LjUgODQ5LjUgNjg3LjUgMzEyLjUgNTgxIDMxMi41IDU2Mi41IDMxMi41IDMxMi41IDU0Ni45IDYyNSA1MDAgNjI1IDUxMy4zIDM0My43IDU2Mi41IDYyNSAzMTIuNSAzNDMuNyA1OTMuNyAzMTIuNSA5MzcuNSA2MjUgNTYyLjUgNjI1IDU5My43IDQ1OS41IDQ0My44IDQzNy41IDYyNV0KZW5kb2JqCjE4IDAgb2JqCls1ODMuMyA1NTUuNiA1NTUuNiA4MzMuMyA4MzMuMyAyNzcuOCAzMDUuNiA1MDAgNTAwIDUwMCA1MDAgNTAwIDc1MCA0NDQuNCA1MDAgNzIyLjIgNzc3LjggNTAwIDkwMi44IDEwMTMuOSA3NzcuOCAyNzcuOCAyNzcuOCA1MDAgODMzLjMgNTAwIDgzMy4zIDc3Ny44IDI3Ny44IDM4OC45IDM4OC45IDUwMCA3NzcuOCAyNzcuOCAzMzMuMyAyNzcuOCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDI3Ny44IDI3Ny44IDI3Ny44IDc3Ny44IDQ3Mi4yIDQ3Mi4yIDc3Ny44IDc1MCA3MDguMyA3MjIuMiA3NjMuOSA2ODAuNiA2NTIuOCA3ODQuNyA3NTAgMzYxLjEgNTEzLjkgNzc3LjggNjI1IDkxNi43IDc1MCA3NzcuOCA2ODAuNiA3NzcuOCA3MzYuMSA1NTUuNiA3MjIuMiA3NTAgNzUwIDEwMjcuOCA3NTAgNzUwIDYxMS4xIDI3Ny44IDUwMCAyNzcuOCA1MDAgMjc3LjggMjc3LjggNTAwIDU1NS42IDQ0NC40IDU1NS42IDQ0NC40IDMwNS42IDUwMCA1NTUuNiAyNzcuOCAzMDUuNiA1MjcuOCAyNzcuOCA4MzMuMyA1NTUuNiA1MDAgNTU1LjYgNTI3LjggMzkxLjcgMzk0LjQgMzg4LjkgNTU1LjYgNTI3LjggNzIyLjIgNTI3LjggNTI3LjggNDQ0LjRdCmVuZG9iagoxOSAwIG9iagpbODY5LjQgODE4LjEgODMwLjYgODgxLjkgNzU1LjYgNzIzLjYgOTA0LjIgOTAwIDQzNi4xIDU5NC40IDkwMS40IDY5MS43IDEwOTEuNyA5MDAgODYzLjkgNzg2LjEgODYzLjkgODYyLjUgNjM4LjkgODAwIDg4NC43IDg2OS40IDExODguOSA4NjkuNCA4NjkuNCA3MDIuOCAzMTkuNCA2MDIuOCAzMTkuNCA1NzUgMzE5LjQgMzE5LjQgNTU5IDYzOC45IDUxMS4xIDYzOC45IDUyNy4xIDM1MS40IDU3NSA2MzguOSAzMTkuNCAzNTEuNCA2MDYuOSAzMTkuNCA5NTguMyA2MzguOSA1NzUgNjM4LjkgNjA2LjkgNDczLjYgNDUzLjYgNDQ3LjJdCmVuZG9iagoyMCAwIG9iagpbMjcyIDMyNi40IDI3MiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiA0ODkuNiAyNzIgMjcyIDI3MiA3NjEuNiA0NjIuNCA0NjIuNCA3NjEuNiA3MzQgNjkzLjQgNzA3LjIgNzQ3LjggNjY2LjIgNjM5IDc2OC4zIDczNCAzNTMuMiA1MDMgNzYxLjIgNjExLjggODk3LjIgNzM0IDc2MS42IDY2Ni4yIDc2MS42IDcyMC42IDU0NCA3MDcuMiA3MzQgNzM0IDEwMDYgNzM0IDczNCA1OTguNCAyNzIgNDg5LjYgMjcyIDQ4OS42IDI3MiAyNzIgNDg5LjYgNTQ0IDQzNS4yIDU0NCA0MzUuMiAyOTkuMiA0ODkuNiA1NDQgMjcyIDI5OS4yIDUxNi44IDI3MiA4MTYgNTQ0IDQ4OS42IDU0NCA1MTYuOCAzODAuOCAzODYuMiAzODAuOCA1NDQgNTE2LjggNzA3LjIgNTE2LjggNTE2LjggNDM1LjIgNDg5LjYgOTc5LjIgNDg5LjYgNDg5LjYgNDg5LjZdCmVuZG9iagoyMSAwIG9iagpbNTAwXQplbmRvYmoKMjIgMCBvYmoKWzYwMi4xIDcyNi4zIDY5My4zIDMyNy42IDQ3MS41IDcxOS40IDU3NiA4NTAgNjkzLjMgNzE5LjggNjI4LjIgNzE5LjggNjgwLjUgNTEwLjkgNjY3LjYgNjkzLjMgNjkzLjMgOTU0LjUgNjkzLjMgNjkzLjMgNTYzLjEgMjQ5LjYgNDU4LjYgMjQ5LjYgNDU4LjYgMjQ5LjYgMjQ5LjYgNDU4LjYgNTEwLjkgNDA2LjQgNTEwLjkgNDA2LjQgMjc1LjggNDU4LjYgNTEwLjkgMjQ5LjYgMjc1LjggNDg0LjcgMjQ5LjYgNzcyLjEgNTEwLjkgNDU4LjYgNTEwLjkgNDg0LjcgMzU0LjEgMzU5LjQgMzU0LjEgNTEwLjkgNDg0LjcgNjY3LjYgNDg0LjcgNDg0LjddCmVuZG9iagoyMyAwIG9iaiA8PAovTGVuZ3RoMSAxNDc4Ci9MZW5ndGgyIDg1MTgKL0xlbmd0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v8GGxC7XToegrvebyXdbtw9p5HgLpTWptCKqTLk+yf8P4ygJngplbmRzdHJlYW0KZW5kb2JqCjQwIDAgb2JqIDw8Ci9UeXBlIC9Gb250RGVzY3JpcHRvcgovRm9udE5hbWUgL01GTURBRitDTVRUOQovRmxhZ3MgNAovRm9udEJCb3ggWy02IC0yMzMgNTQyIDY5OF0KL0FzY2VudCA2MTEKL0NhcEhlaWdodCA2MTEKL0Rlc2NlbnQgLTIyMgovSXRhbGljQW5nbGUgMAovU3RlbVYgNzQKL1hIZWlnaHQgNDMxCi9DaGFyU2V0ICgvZi9uL28vcikKL0ZvbnRGaWxlIDM5IDAgUgo+PiBlbmRvYmoKNyAwIG9iaiA8PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHlwZTEKL0Jhc2VGb250IC9RWktSRE0rQ01CWDEwCi9Gb250RGVzY3JpcHRvciAyNCAwIFIKL0ZpcnN0Q2hhciA2NQovTGFzdENoYXIgMTE2Ci9XaWR0aHMgMTkgMCBSCj4+IGVuZG9iago5IDAgb2JqIDw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL0dYR0dCUStDTUJYMTIKL0ZvbnREZXNjcmlwdG9yIDI2IDAgUgovRmlyc3RDaGFyIDQ5Ci9MYXN0Q2hhciAxMTcKL1dpZHRocyAxNyAwIFIKPj4gZW5kb2JqCjggMCBvYmogPDwKL1R5cGUgL0ZvbnQKL1N1YnR5cGUgL1R5cGUxCi9CYXNlRm9udCAvUlpQTUxTK0NNUjEwCi9Gb250RGVzY3JpcHRvciAyOCAwIFIKL0ZpcnN0Q2hhciAxMQovTGFzdENoYXIgMTIyCi9XaWR0aHMgMTggMCBSCj4+IGVuZG9iago2IDAgb2JqIDw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL1BIQlhEUStDTVIxMgovRm9udERlc2NyaXB0b3IgMzAgMCBSCi9GaXJzdENoYXIgNDQKL0xhc3RDaGFyIDEyNwovV2lkdGhzIDIwIDAgUgo+PiBlbmRvYmoKNCAwIG9iaiA8PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHlwZTEKL0Jhc2VGb250IC9KVFlNS04rQ01SMTcKL0ZvbnREZXNjcmlwdG9yIDMyIDAgUgovRmlyc3RDaGFyIDcwCi9MYXN0Q2hhciAxMjEKL1dpZHRocyAyMiAwIFIKPj4gZW5kb2JqCjExIDAgb2JqIDw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL1RLSkhISStDTVI5Ci9Gb250RGVzY3JpcHRvciAzNCAwIFIKL0ZpcnN0Q2hhciAzMwovTGFzdENoYXIgMTIxCi9XaWR0aHMgMTUgMCBSCj4+IGVuZG9iago1IDAgb2JqIDw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL1VFSVpZVytDTVNZMTAKL0ZvbnREZXNjcmlwdG9yIDM2IDAgUgovRmlyc3RDaGFyIDMKL0xhc3RDaGFyIDMKL1dpZHRocyAyMSAwIFIKPj4gZW5kb2JqCjEwIDAgb2JqIDw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL0dVT1dUSytDTVNZNgovRm9udERlc2NyaXB0b3IgMzggMCBSCi9GaXJzdENoYXIgMwovTGFzdENoYXIgMwovV2lkdGhzIDE2IDAgUgo+PiBlbmRvYmoKMTIgMCBvYmogPDwKL1R5cGUgL0ZvbnQKL1N1YnR5cGUgL1R5cGUxCi9CYXNlRm9udCAvTUZNREFGK0NNVFQ5Ci9Gb250RGVzY3JpcHRvciA0MCAwIFIKL0ZpcnN0Q2hhciAxMDIKL0xhc3RDaGFyIDExNAovV2lkdGhzIDE0IDAgUgo+PiBlbmRvYmoKMTMgMCBvYmogPDwKL1R5cGUgL1BhZ2VzCi9Db3VudCAxCi9LaWRzIFsyIDAgUl0KPj4gZW5kb2JqCjQxIDAgb2JqIDw8Ci9UeXBlIC9DYXRhbG9nCi9QYWdlcyAxMyAwIFIKPj4gZW5kb2JqCjQyIDAgb2JqIDw8Ci9Qcm9kdWNlciAocGRmVGVYLTEuNDAuMTApCi9DcmVhdG9yIChUZVgpCi9DcmVhdGlvbkRhdGUgKEQ6MjAxMjA2MTExODA4NDYrMDInMDAnKQovTW9kRGF0ZSAoRDoyMDEyMDYxMTE4MDg0NiswMicwMCcpCi9UcmFwcGVkIC9GYWxzZQovUFRFWC5GdWxsYmFubmVyIChUaGlzIGlzIHBkZlRlWCwgVmVyc2lvbiAzLjE0MTU5MjYtMS40MC4xMC0yLjIgKFRlWCBMaXZlIDIwMDkvRGViaWFuKSBrcGF0aHNlYSB2ZXJzaW9uIDUuMC4wKQo+PiBlbmRvYmoKeHJlZgowIDQzCjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAwMzMxNiAwMDAwMCBuIAowMDAwMDAzMjA0IDAwMDAwIG4gCjAwMDAwMDAwMTUgMDAwMDAgbiAKMDAwMDEwODgzNCAwMDAwMCBuIAowMDAwMTA5MTEyIDAwMDAwIG4gCjAwMDAxMDg2OTUgMDAwMDAgbiAKMDAwMDEwODI3NiAwMDAwMCBuIAowMDAwMTA4NTU2IDAwMDAwIG4gCjAwMDAxMDg0MTYgMDAwMDAgbiAKMDAwMDEwOTI0OSAwMDAwMCBuIAowMDAwMTA4OTczIDAwMDAwIG4gCjAwMDAxMDkzODYgMDAwMDAgbiAKMDAwMDEwOTUyNyAwMDAwMCBuIAowMDAwMDAzNDc0IDAwMDAwIG4gCjAwMDAwMDM1NDQgMDAwMDAgbiAKMDAwMDAwNDA3MSAwMDAwMCBuIAowMDAwMDA0MDk1IDAwMDAwIG4gCjAwMDAwMDQ1MDEgMDAwMDAgbiAKMDAwMDAwNTEyMyAwMDAwMCBuIAowMDAwMDA1NDQxIDAwMDAwIG4gCjAwMDAwMDU5MDYgMDAwMDAgbiAKMDAwMDAwNTkyOCAwMDAwMCBuIAowMDAwMDA2MjU0IDAwMDAwIG4gCjAwMDAwMTU4NzcgMDAwMDAgbiAKMDAwMDAxNjEwOCAwMDAwMCBuIAowMDAwMDI0NDIxIDAwMDAwIG4gCjAwMDAwMjQ2NjAgMDAwMDAgbiAKMDAwMDA0MzkyNSAwMDAwMCBuIAowMDAwMDQ0MzQyIDAwMDAwIG4gCjAwMDAwNTg3MzMgMDAwMDAgbiAKMDAwMDA1OTA1NiAwMDAwMCBuIAowMDAwMDY5NjY1IDAwMDAwIG4gCjAwMDAwNjk5MTcgMDAwMDAgbiAKMDAwMDA4NTU4MCAwMDAwMCBuIAowMDAwMDg1OTMxIDAwMDAwIG4gCjAwMDAwOTMwNDggMDAwMDAgbiAKMDAwMDA5MzI3OSAwMDAwMCBuIAowMDAwMTAwNDQ1IDAwMDAwIG4gCjAwMDAxMDA2NzQgMDAwMDAgbiAKMDAwMDEwODA1NSAwMDAwMCBuIAowMDAwMTA5NTg1IDAwMDAwIG4gCjAwMDAxMDk2MzYgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSA0MwovUm9vdCA0MSAwIFIKL0luZm8gNDIgMCBSCi9JRCBbPEE1MTIyOERDMEI2RDhERTcwNDA5QjM4RUY1MDJDQkYwPiA8QTUxMjI4REMwQjZEOERFNzA0MDlCMzhFRjUwMkNCRjA+XSA+PgpzdGFydHhyZWYKMTA5OTAyCiUlRU9GCg==" 387 } 388 389 390 ///////// Rest taken from generated pdf.js. (c) by Mozilla. //////// 391 ///////// File unchanged, except that all references to DOM- //////// 392 ///////// specific global names have been prefixed by PdfJS_window., //////// 393 ///////// to avoid interference with the benchmark runner script. //////// 394 395 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 396 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ 397 398 var PDFJS = {}; 399 400 (function pdfjsWrapper() { 401 // Use strict in our context only - users might not want it 402 'use strict'; 403 404 PDFJS.build = '3cc61f0'; 405 406 // Files are inserted below - see Makefile 407 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 408 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ 409 410 'use strict'; 411 412 var globalScope = (typeof PdfJS_window.window === 'undefined') ? this : PdfJS_window.window; 413 414 var isWorker = (typeof PdfJS_window.window == 'undefined'); 415 416 var ERRORS = 0, WARNINGS = 1, TODOS = 5; 417 var verbosity = WARNINGS; 418 419 // The global PDFJS object exposes the API 420 // In production, it will be declared outside a global wrapper 421 // In development, it will be declared here 422 if (!globalScope.PDFJS) { 423 globalScope.PDFJS = {}; 424 } 425 426 // getPdf() 427 // Convenience function to perform binary Ajax GET 428 // Usage: getPdf('http://...', callback) 429 // getPdf({ 430 // url:String , 431 // [,progress:Function, error:Function] 432 // }, 433 // callback) 434 function getPdf(arg, callback) { 435 var params = arg; 436 if (typeof arg === 'string') 437 params = { url: arg }; 438 439 var xhr = new PdfJS_window.XMLHttpRequest(); 440 xhr.open('GET', params.url); 441 xhr.mozResponseType = xhr.responseType = 'arraybuffer'; 442 var protocol = params.url.indexOf(':') < 0 ? PdfJS_window.window.location.protocol : 443 params.url.substring(0, params.url.indexOf(':') + 1); 444 xhr.expected = (protocol === 'http:' || protocol === 'https:') ? 200 : 0; 445 446 if ('progress' in params) 447 xhr.onprogress = params.progress || undefined; 448 449 if ('error' in params) 450 xhr.onerror = params.error || undefined; 451 452 xhr.onreadystatechange = function getPdfOnreadystatechange(e) { 453 if (xhr.readyState === 4) { 454 if (xhr.status === xhr.expected) { 455 var data = (xhr.mozResponseArrayBuffer || xhr.mozResponse || 456 xhr.responseArrayBuffer || xhr.response); 457 callback(data); 458 } else if (params.error) { 459 params.error(e); 460 } 461 } 462 }; 463 xhr.send(null); 464 } 465 globalScope.PDFJS.getPdf = getPdf; 466 globalScope.PDFJS.pdfBug = false; 467 468 var Page = (function PageClosure() { 469 function Page(xref, pageNumber, pageDict, ref) { 470 this.pageNumber = pageNumber; 471 this.pageDict = pageDict; 472 this.xref = xref; 473 this.ref = ref; 474 475 this.displayReadyPromise = null; 476 } 477 478 Page.prototype = { 479 getPageProp: function Page_getPageProp(key) { 480 return this.pageDict.get(key); 481 }, 482 inheritPageProp: function Page_inheritPageProp(key) { 483 var dict = this.pageDict; 484 var obj = dict.get(key); 485 while (obj === undefined) { 486 dict = dict.get('Parent'); 487 if (!dict) 488 break; 489 obj = dict.get(key); 490 } 491 return obj; 492 }, 493 get content() { 494 return shadow(this, 'content', this.getPageProp('Contents')); 495 }, 496 get resources() { 497 return shadow(this, 'resources', this.inheritPageProp('Resources')); 498 }, 499 get mediaBox() { 500 var obj = this.inheritPageProp('MediaBox'); 501 // Reset invalid media box to letter size. 502 if (!isArray(obj) || obj.length !== 4) 503 obj = [0, 0, 612, 792]; 504 return shadow(this, 'mediaBox', obj); 505 }, 506 get view() { 507 var mediaBox = this.mediaBox; 508 var cropBox = this.inheritPageProp('CropBox'); 509 if (!isArray(cropBox) || cropBox.length !== 4) 510 return shadow(this, 'view', mediaBox); 511 512 // From the spec, 6th ed., p.963: 513 // "The crop, bleed, trim, and art boxes should not ordinarily 514 // extend beyond the boundaries of the media box. If they do, they are 515 // effectively reduced to their intersection with the media box." 516 cropBox = Util.intersect(cropBox, mediaBox); 517 if (!cropBox) 518 return shadow(this, 'view', mediaBox); 519 520 return shadow(this, 'view', cropBox); 521 }, 522 get annotations() { 523 return shadow(this, 'annotations', this.inheritPageProp('Annots')); 524 }, 525 get rotate() { 526 var rotate = this.inheritPageProp('Rotate') || 0; 527 // Normalize rotation so it's a multiple of 90 and between 0 and 270 528 if (rotate % 90 != 0) { 529 rotate = 0; 530 } else if (rotate >= 360) { 531 rotate = rotate % 360; 532 } else if (rotate < 0) { 533 // The spec doesn't cover negatives, assume its counterclockwise 534 // rotation. The following is the other implementation of modulo. 535 rotate = ((rotate % 360) + 360) % 360; 536 } 537 return shadow(this, 'rotate', rotate); 538 }, 539 540 getOperatorList: function Page_getOperatorList(handler, dependency) { 541 var xref = this.xref; 542 var content = this.content; 543 var resources = this.resources; 544 if (isArray(content)) { 545 // fetching items 546 var streams = []; 547 var i, n = content.length; 548 for (i = 0; i < n; ++i) 549 streams.push(xref.fetchIfRef(content[i])); 550 content = new StreamsSequenceStream(streams); 551 } else if (isStream(content)) { 552 content.reset(); 553 } else if (!content) { 554 // replacing non-existent page content with empty one 555 content = new Stream(new Uint8Array(0)); 556 } 557 558 var pe = this.pe = new PartialEvaluator( 559 xref, handler, 'p' + this.pageNumber + '_'); 560 561 return pe.getOperatorList(content, resources, dependency); 562 }, 563 564 getLinks: function Page_getLinks() { 565 var links = []; 566 var annotations = pageGetAnnotations(); 567 var i, n = annotations.length; 568 for (i = 0; i < n; ++i) { 569 if (annotations[i].type != 'Link') 570 continue; 571 links.push(annotations[i]); 572 } 573 return links; 574 }, 575 getAnnotations: function Page_getAnnotations() { 576 var xref = this.xref; 577 function getInheritableProperty(annotation, name) { 578 var item = annotation; 579 while (item && !item.has(name)) { 580 item = item.get('Parent'); 581 } 582 if (!item) 583 return null; 584 return item.get(name); 585 } 586 function isValidUrl(url) { 587 if (!url) 588 return false; 589 var colon = url.indexOf(':'); 590 if (colon < 0) 591 return false; 592 var protocol = url.substr(0, colon); 593 switch (protocol) { 594 case 'http': 595 case 'https': 596 case 'ftp': 597 case 'mailto': 598 return true; 599 default: 600 return false; 601 } 602 } 603 604 var annotations = this.annotations || []; 605 var i, n = annotations.length; 606 var items = []; 607 for (i = 0; i < n; ++i) { 608 var annotationRef = annotations[i]; 609 var annotation = xref.fetch(annotationRef); 610 if (!isDict(annotation)) 611 continue; 612 var subtype = annotation.get('Subtype'); 613 if (!isName(subtype)) 614 continue; 615 var rect = annotation.get('Rect'); 616 617 var item = {}; 618 item.type = subtype.name; 619 item.rect = rect; 620 switch (subtype.name) { 621 case 'Link': 622 var a = annotation.get('A'); 623 if (a) { 624 switch (a.get('S').name) { 625 case 'URI': 626 var url = a.get('URI'); 627 // TODO: pdf spec mentions urls can be relative to a Base 628 // entry in the dictionary. 629 if (!isValidUrl(url)) 630 url = ''; 631 item.url = url; 632 break; 633 case 'GoTo': 634 item.dest = a.get('D'); 635 break; 636 default: 637 TODO('other link types'); 638 } 639 } else if (annotation.has('Dest')) { 640 // simple destination link 641 var dest = annotation.get('Dest'); 642 item.dest = isName(dest) ? dest.name : dest; 643 } 644 break; 645 case 'Widget': 646 var fieldType = getInheritableProperty(annotation, 'FT'); 647 if (!isName(fieldType)) 648 break; 649 item.fieldType = fieldType.name; 650 // Building the full field name by collecting the field and 651 // its ancestors 'T' properties and joining them using '.'. 652 var fieldName = []; 653 var namedItem = annotation, ref = annotationRef; 654 while (namedItem) { 655 var parent = namedItem.get('Parent'); 656 var parentRef = namedItem.getRaw('Parent'); 657 var name = namedItem.get('T'); 658 if (name) { 659 fieldName.unshift(stringToPDFString(name)); 660 } else { 661 // The field name is absent, that means more than one field 662 // with the same name may exist. Replacing the empty name 663 // with the '`' plus index in the parent's 'Kids' array. 664 // This is not in the PDF spec but necessary to id the 665 // the input controls. 666 var kids = parent.get('Kids'); 667 var j, jj; 668 for (j = 0, jj = kids.length; j < jj; j++) { 669 var kidRef = kids[j]; 670 if (kidRef.num == ref.num && kidRef.gen == ref.gen) 671 break; 672 } 673 fieldName.unshift('`' + j); 674 } 675 namedItem = parent; 676 ref = parentRef; 677 } 678 item.fullName = fieldName.join('.'); 679 var alternativeText = stringToPDFString(annotation.get('TU') || ''); 680 item.alternativeText = alternativeText; 681 var da = getInheritableProperty(annotation, 'DA') || ''; 682 var m = /([\d\.]+)\sTf/.exec(da); 683 if (m) 684 item.fontSize = parseFloat(m[1]); 685 item.textAlignment = getInheritableProperty(annotation, 'Q'); 686 item.flags = getInheritableProperty(annotation, 'Ff') || 0; 687 break; 688 case 'Text': 689 var content = annotation.get('Contents'); 690 var title = annotation.get('T'); 691 item.content = stringToPDFString(content || ''); 692 item.title = stringToPDFString(title || ''); 693 item.name = !annotation.has('Name') ? 'Note' : 694 annotation.get('Name').name; 695 break; 696 default: 697 TODO('unimplemented annotation type: ' + subtype.name); 698 break; 699 } 700 items.push(item); 701 } 702 return items; 703 } 704 }; 705 706 return Page; 707 })(); 708 709 /** 710 * The `PDFDocument` holds all the data of the PDF file. Compared to the 711 * `PDFDoc`, this one doesn't have any job management code. 712 * Right now there exists one PDFDocument on the main thread + one object 713 * for each worker. If there is no worker support enabled, there are two 714 * `PDFDocument` objects on the main thread created. 715 */ 716 var PDFDocument = (function PDFDocumentClosure() { 717 function PDFDocument(arg, callback) { 718 if (isStream(arg)) 719 init.call(this, arg); 720 else if (isArrayBuffer(arg)) 721 init.call(this, new Stream(arg)); 722 else 723 error('PDFDocument: Unknown argument type'); 724 } 725 726 function init(stream) { 727 assertWellFormed(stream.length > 0, 'stream must have data'); 728 this.stream = stream; 729 this.setup(); 730 this.acroForm = this.catalog.catDict.get('AcroForm'); 731 } 732 733 function find(stream, needle, limit, backwards) { 734 var pos = stream.pos; 735 var end = stream.end; 736 var str = ''; 737 if (pos + limit > end) 738 limit = end - pos; 739 for (var n = 0; n < limit; ++n) 740 str += stream.getChar(); 741 stream.pos = pos; 742 var index = backwards ? str.lastIndexOf(needle) : str.indexOf(needle); 743 if (index == -1) 744 return false; /* not found */ 745 stream.pos += index; 746 return true; /* found */ 747 } 748 749 PDFDocument.prototype = { 750 get linearization() { 751 var length = this.stream.length; 752 var linearization = false; 753 if (length) { 754 linearization = new Linearization(this.stream); 755 if (linearization.length != length) 756 linearization = false; 757 } 758 // shadow the prototype getter with a data property 759 return shadow(this, 'linearization', linearization); 760 }, 761 get startXRef() { 762 var stream = this.stream; 763 var startXRef = 0; 764 var linearization = this.linearization; 765 if (linearization) { 766 // Find end of first obj. 767 stream.reset(); 768 if (find(stream, 'endobj', 1024)) 769 startXRef = stream.pos + 6; 770 } else { 771 // Find startxref by jumping backward from the end of the file. 772 var step = 1024; 773 var found = false, pos = stream.end; 774 while (!found && pos > 0) { 775 pos -= step - 'startxref'.length; 776 if (pos < 0) 777 pos = 0; 778 stream.pos = pos; 779 found = find(stream, 'startxref', step, true); 780 } 781 if (found) { 782 stream.skip(9); 783 var ch; 784 do { 785 ch = stream.getChar(); 786 } while (Lexer.isSpace(ch)); 787 var str = ''; 788 while ((ch - '0') <= 9) { 789 str += ch; 790 ch = stream.getChar(); 791 } 792 startXRef = parseInt(str, 10); 793 if (isNaN(startXRef)) 794 startXRef = 0; 795 } 796 } 797 // shadow the prototype getter with a data property 798 return shadow(this, 'startXRef', startXRef); 799 }, 800 get mainXRefEntriesOffset() { 801 var mainXRefEntriesOffset = 0; 802 var linearization = this.linearization; 803 if (linearization) 804 mainXRefEntriesOffset = linearization.mainXRefEntriesOffset; 805 // shadow the prototype getter with a data property 806 return shadow(this, 'mainXRefEntriesOffset', mainXRefEntriesOffset); 807 }, 808 // Find the header, remove leading garbage and setup the stream 809 // starting from the header. 810 checkHeader: function PDFDocument_checkHeader() { 811 var stream = this.stream; 812 stream.reset(); 813 if (find(stream, '%PDF-', 1024)) { 814 // Found the header, trim off any garbage before it. 815 stream.moveStart(); 816 return; 817 } 818 // May not be a PDF file, continue anyway. 819 }, 820 setup: function PDFDocument_setup(ownerPassword, userPassword) { 821 this.checkHeader(); 822 var xref = new XRef(this.stream, 823 this.startXRef, 824 this.mainXRefEntriesOffset); 825 this.xref = xref; 826 this.catalog = new Catalog(xref); 827 }, 828 get numPages() { 829 var linearization = this.linearization; 830 var num = linearization ? linearization.numPages : this.catalog.numPages; 831 // shadow the prototype getter 832 return shadow(this, 'numPages', num); 833 }, 834 getDocumentInfo: function PDFDocument_getDocumentInfo() { 835 var info; 836 if (this.xref.trailer.has('Info')) { 837 var infoDict = this.xref.trailer.get('Info'); 838 839 info = {}; 840 infoDict.forEach(function(key, value) { 841 info[key] = typeof value !== 'string' ? value : 842 stringToPDFString(value); 843 }); 844 } 845 846 return shadow(this, 'getDocumentInfo', info); 847 }, 848 getFingerprint: function PDFDocument_getFingerprint() { 849 var xref = this.xref, fileID; 850 if (xref.trailer.has('ID')) { 851 fileID = ''; 852 var id = xref.trailer.get('ID')[0]; 853 id.split('').forEach(function(el) { 854 fileID += Number(el.charCodeAt(0)).toString(16); 855 }); 856 } else { 857 // If we got no fileID, then we generate one, 858 // from the first 100 bytes of PDF 859 var data = this.stream.bytes.subarray(0, 100); 860 var hash = calculateMD5(data, 0, data.length); 861 fileID = ''; 862 for (var i = 0, length = hash.length; i < length; i++) { 863 fileID += Number(hash[i]).toString(16); 864 } 865 } 866 867 return shadow(this, 'getFingerprint', fileID); 868 }, 869 getPage: function PDFDocument_getPage(n) { 870 return this.catalog.getPage(n); 871 } 872 }; 873 874 return PDFDocument; 875 })(); 876 877 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 878 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ 879 880 'use strict'; 881 882 function log(msg) { 883 if (PdfJS_window.console && PdfJS_window.console.log) 884 PdfJS_window.console.log(msg); 885 else if (print) 886 print(msg); 887 } 888 889 function warn(msg) { 890 if (verbosity >= WARNINGS) 891 log('Warning: ' + msg); 892 } 893 894 function backtrace() { 895 try { 896 throw new Error(); 897 } catch (e) { 898 return e.stack ? e.stack.split('\n').slice(2).join('\n') : ''; 899 } 900 } 901 902 function error(msg) { 903 log('Error: ' + msg); 904 log(backtrace()); 905 throw new Error(msg); 906 } 907 908 function TODO(what) { 909 if (verbosity >= TODOS) 910 log('TODO: ' + what); 911 } 912 913 function malformed(msg) { 914 error('Malformed PDF: ' + msg); 915 } 916 917 function assert(cond, msg) { 918 if (!cond) 919 error(msg); 920 } 921 922 // In a well-formed PDF, |cond| holds. If it doesn't, subsequent 923 // behavior is undefined. 924 function assertWellFormed(cond, msg) { 925 if (!cond) 926 malformed(msg); 927 } 928 929 function shadow(obj, prop, value) { 930 Object.defineProperty(obj, prop, { value: value, 931 enumerable: true, 932 configurable: true, 933 writable: false }); 934 return value; 935 } 936 937 function bytesToString(bytes) { 938 var str = ''; 939 var length = bytes.length; 940 for (var n = 0; n < length; ++n) 941 str += String.fromCharCode(bytes[n]); 942 return str; 943 } 944 945 function stringToBytes(str) { 946 var length = str.length; 947 var bytes = new Uint8Array(length); 948 for (var n = 0; n < length; ++n) 949 bytes[n] = str.charCodeAt(n) & 0xFF; 950 return bytes; 951 } 952 953 var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0]; 954 955 var Util = PDFJS.Util = (function UtilClosure() { 956 function Util() {} 957 958 Util.makeCssRgb = function Util_makeCssRgb(r, g, b) { 959 var ri = (255 * r) | 0, gi = (255 * g) | 0, bi = (255 * b) | 0; 960 return 'rgb(' + ri + ',' + gi + ',' + bi + ')'; 961 }; 962 963 Util.makeCssCmyk = function Util_makeCssCmyk(c, m, y, k) { 964 c = (new DeviceCmykCS()).getRgb([c, m, y, k]); 965 var ri = (255 * c[0]) | 0, gi = (255 * c[1]) | 0, bi = (255 * c[2]) | 0; 966 return 'rgb(' + ri + ',' + gi + ',' + bi + ')'; 967 }; 968 969 // For 2d affine transforms 970 Util.applyTransform = function Util_applyTransform(p, m) { 971 var xt = p[0] * m[0] + p[1] * m[2] + m[4]; 972 var yt = p[0] * m[1] + p[1] * m[3] + m[5]; 973 return [xt, yt]; 974 }; 975 976 Util.applyInverseTransform = function Util_applyInverseTransform(p, m) { 977 var d = m[0] * m[3] - m[1] * m[2]; 978 var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d; 979 var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d; 980 return [xt, yt]; 981 }; 982 983 Util.inverseTransform = function Util_inverseTransform(m) { 984 var d = m[0] * m[3] - m[1] * m[2]; 985 return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, 986 (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d]; 987 }; 988 989 // Apply a generic 3d matrix M on a 3-vector v: 990 // | a b c | | X | 991 // | d e f | x | Y | 992 // | g h i | | Z | 993 // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i], 994 // with v as [X,Y,Z] 995 Util.apply3dTransform = function Util_apply3dTransform(m, v) { 996 return [ 997 m[0] * v[0] + m[1] * v[1] + m[2] * v[2], 998 m[3] * v[0] + m[4] * v[1] + m[5] * v[2], 999 m[6] * v[0] + m[7] * v[1] + m[8] * v[2] 1000 ]; 1001 } 1002 1003 // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2) 1004 // For coordinate systems whose origin lies in the bottom-left, this 1005 // means normalization to (BL,TR) ordering. For systems with origin in the 1006 // top-left, this means (TL,BR) ordering. 1007 Util.normalizeRect = function Util_normalizeRect(rect) { 1008 var r = rect.slice(0); // clone rect 1009 if (rect[0] > rect[2]) { 1010 r[0] = rect[2]; 1011 r[2] = rect[0]; 1012 } 1013 if (rect[1] > rect[3]) { 1014 r[1] = rect[3]; 1015 r[3] = rect[1]; 1016 } 1017 return r; 1018 } 1019 1020 // Returns a rectangle [x1, y1, x2, y2] corresponding to the 1021 // intersection of rect1 and rect2. If no intersection, returns 'false' 1022 // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2] 1023 Util.intersect = function Util_intersect(rect1, rect2) { 1024 function compare(a, b) { 1025 return a - b; 1026 }; 1027 1028 // Order points along the axes 1029 var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare), 1030 orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare), 1031 result = []; 1032 1033 rect1 = Util.normalizeRect(rect1); 1034 rect2 = Util.normalizeRect(rect2); 1035 1036 // X: first and second points belong to different rectangles? 1037 if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) || 1038 (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) { 1039 // Intersection must be between second and third points 1040 result[0] = orderedX[1]; 1041 result[2] = orderedX[2]; 1042 } else { 1043 return false; 1044 } 1045 1046 // Y: first and second points belong to different rectangles? 1047 if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) || 1048 (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) { 1049 // Intersection must be between second and third points 1050 result[1] = orderedY[1]; 1051 result[3] = orderedY[2]; 1052 } else { 1053 return false; 1054 } 1055 1056 return result; 1057 }; 1058 1059 Util.sign = function Util_sign(num) { 1060 return num < 0 ? -1 : 1; 1061 }; 1062 1063 return Util; 1064 })(); 1065 1066 var PageViewport = PDFJS.PageViewport = (function PageViewportClosure() { 1067 function PageViewport(viewBox, scale, rotate, offsetX, offsetY) { 1068 // creating transform to convert pdf coordinate system to the normal 1069 // canvas like coordinates taking in account scale and rotation 1070 var centerX = (viewBox[2] + viewBox[0]) / 2; 1071 var centerY = (viewBox[3] + viewBox[1]) / 2; 1072 var rotateA, rotateB, rotateC, rotateD; 1073 switch (rotate) { 1074 case -180: 1075 case 180: 1076 rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1; 1077 break; 1078 case -270: 1079 case 90: 1080 rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0; 1081 break; 1082 case -90: 1083 case 270: 1084 rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0; 1085 break; 1086 case 360: 1087 case 0: 1088 default: 1089 rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1; 1090 break; 1091 } 1092 var offsetCanvasX, offsetCanvasY; 1093 var width, height; 1094 if (rotateA == 0) { 1095 offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX; 1096 offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY; 1097 width = Math.abs(viewBox[3] - viewBox[1]) * scale; 1098 height = Math.abs(viewBox[2] - viewBox[0]) * scale; 1099 } else { 1100 offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX; 1101 offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY; 1102 width = Math.abs(viewBox[2] - viewBox[0]) * scale; 1103 height = Math.abs(viewBox[3] - viewBox[1]) * scale; 1104 } 1105 // creating transform for the following operations: 1106 // translate(-centerX, -centerY), rotate and flip vertically, 1107 // scale, and translate(offsetCanvasX, offsetCanvasY) 1108 this.transform = [ 1109 rotateA * scale, 1110 rotateB * scale, 1111 rotateC * scale, 1112 rotateD * scale, 1113 offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, 1114 offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY 1115 ]; 1116 1117 this.offsetX = offsetX; 1118 this.offsetY = offsetY; 1119 this.width = width; 1120 this.height = height; 1121 this.fontScale = scale; 1122 } 1123 PageViewport.prototype = { 1124 convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) { 1125 return Util.applyTransform([x, y], this.transform); 1126 }, 1127 convertToViewportRectangle: 1128 function PageViewport_convertToViewportRectangle(rect) { 1129 var tl = Util.applyTransform([rect[0], rect[1]], this.transform); 1130 var br = Util.applyTransform([rect[2], rect[3]], this.transform); 1131 return [tl[0], tl[1], br[0], br[1]]; 1132 }, 1133 convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) { 1134 return Util.applyInverseTransform([x, y], this.transform); 1135 } 1136 }; 1137 return PageViewport; 1138 })(); 1139 1140 var PDFStringTranslateTable = [ 1141 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1142 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0, 1143 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1144 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1145 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1146 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 1147 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C, 1148 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160, 1149 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC 1150 ]; 1151 1152 function stringToPDFString(str) { 1153 var i, n = str.length, str2 = ''; 1154 if (str[0] === '\xFE' && str[1] === '\xFF') { 1155 // UTF16BE BOM 1156 for (i = 2; i < n; i += 2) 1157 str2 += String.fromCharCode( 1158 (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1)); 1159 } else { 1160 for (i = 0; i < n; ++i) { 1161 var code = PDFStringTranslateTable[str.charCodeAt(i)]; 1162 str2 += code ? String.fromCharCode(code) : str.charAt(i); 1163 } 1164 } 1165 return str2; 1166 } 1167 1168 function isBool(v) { 1169 return typeof v == 'boolean'; 1170 } 1171 1172 function isInt(v) { 1173 return typeof v == 'number' && ((v | 0) == v); 1174 } 1175 1176 function isNum(v) { 1177 return typeof v == 'number'; 1178 } 1179 1180 function isString(v) { 1181 return typeof v == 'string'; 1182 } 1183 1184 function isNull(v) { 1185 return v === null; 1186 } 1187 1188 function isName(v) { 1189 return v instanceof Name; 1190 } 1191 1192 function isCmd(v, cmd) { 1193 return v instanceof Cmd && (!cmd || v.cmd == cmd); 1194 } 1195 1196 function isDict(v, type) { 1197 return v instanceof Dict && (!type || v.get('Type').name == type); 1198 } 1199 1200 function isArray(v) { 1201 return v instanceof Array; 1202 } 1203 1204 function isStream(v) { 1205 return typeof v == 'object' && v != null && ('getChar' in v); 1206 } 1207 1208 function isArrayBuffer(v) { 1209 return typeof v == 'object' && v != null && ('byteLength' in v); 1210 } 1211 1212 function isRef(v) { 1213 return v instanceof Ref; 1214 } 1215 1216 function isPDFFunction(v) { 1217 var fnDict; 1218 if (typeof v != 'object') 1219 return false; 1220 else if (isDict(v)) 1221 fnDict = v; 1222 else if (isStream(v)) 1223 fnDict = v.dict; 1224 else 1225 return false; 1226 return fnDict.has('FunctionType'); 1227 } 1228 1229 /** 1230 * 'Promise' object. 1231 * Each object that is stored in PDFObjects is based on a Promise object that 1232 * contains the status of the object and the data. There migth be situations, 1233 * where a function want to use the value of an object, but it isn't ready at 1234 * that time. To get a notification, once the object is ready to be used, s.o. 1235 * can add a callback using the `then` method on the promise that then calls 1236 * the callback once the object gets resolved. 1237 * A promise can get resolved only once and only once the data of the promise 1238 * can be set. If any of these happens twice or the data is required before 1239 * it was set, an exception is throw. 1240 */ 1241 var Promise = PDFJS.Promise = (function PromiseClosure() { 1242 var EMPTY_PROMISE = {}; 1243 1244 /** 1245 * If `data` is passed in this constructor, the promise is created resolved. 1246 * If there isn't data, it isn't resolved at the beginning. 1247 */ 1248 function Promise(name, data) { 1249 this.name = name; 1250 this.isRejected = false; 1251 this.error = null; 1252 // If you build a promise and pass in some data it's already resolved. 1253 if (data != null) { 1254 this.isResolved = true; 1255 this._data = data; 1256 this.hasData = true; 1257 } else { 1258 this.isResolved = false; 1259 this._data = EMPTY_PROMISE; 1260 } 1261 this.callbacks = []; 1262 this.errbacks = []; 1263 this.progressbacks = []; 1264 }; 1265 /** 1266 * Builds a promise that is resolved when all the passed in promises are 1267 * resolved. 1268 * @param {Promise[]} promises Array of promises to wait for. 1269 * @return {Promise} New dependant promise. 1270 */ 1271 Promise.all = function Promise_all(promises) { 1272 var deferred = new Promise(); 1273 var unresolved = promises.length; 1274 var results = []; 1275 if (unresolved === 0) { 1276 deferred.resolve(results); 1277 return deferred; 1278 } 1279 for (var i = 0, ii = promises.length; i < ii; ++i) { 1280 var promise = promises[i]; 1281 promise.then((function(i) { 1282 return function(value) { 1283 results[i] = value; 1284 unresolved--; 1285 if (unresolved === 0) 1286 deferred.resolve(results); 1287 }; 1288 })(i)); 1289 } 1290 return deferred; 1291 }; 1292 Promise.prototype = { 1293 hasData: false, 1294 1295 set data(value) { 1296 if (value === undefined) { 1297 return; 1298 } 1299 if (this._data !== EMPTY_PROMISE) { 1300 error('Promise ' + this.name + 1301 ': Cannot set the data of a promise twice'); 1302 } 1303 this._data = value; 1304 this.hasData = true; 1305 1306 if (this.onDataCallback) { 1307 this.onDataCallback(value); 1308 } 1309 }, 1310 1311 get data() { 1312 if (this._data === EMPTY_PROMISE) { 1313 error('Promise ' + this.name + ': Cannot get data that isn\'t set'); 1314 } 1315 return this._data; 1316 }, 1317 1318 onData: function Promise_onData(callback) { 1319 if (this._data !== EMPTY_PROMISE) { 1320 callback(this._data); 1321 } else { 1322 this.onDataCallback = callback; 1323 } 1324 }, 1325 1326 resolve: function Promise_resolve(data) { 1327 if (this.isResolved) { 1328 error('A Promise can be resolved only once ' + this.name); 1329 } 1330 if (this.isRejected) { 1331 error('The Promise was already rejected ' + this.name); 1332 } 1333 1334 this.isResolved = true; 1335 this.data = data || null; 1336 var callbacks = this.callbacks; 1337 1338 for (var i = 0, ii = callbacks.length; i < ii; i++) { 1339 callbacks[i].call(null, data); 1340 } 1341 }, 1342 1343 progress: function Promise_progress(data) { 1344 var callbacks = this.progressbacks; 1345 for (var i = 0, ii = callbacks.length; i < ii; i++) { 1346 callbacks[i].call(null, data); 1347 } 1348 }, 1349 1350 reject: function Promise_reject(reason) { 1351 if (this.isRejected) { 1352 error('A Promise can be rejected only once ' + this.name); 1353 } 1354 if (this.isResolved) { 1355 error('The Promise was already resolved ' + this.name); 1356 } 1357 1358 this.isRejected = true; 1359 this.error = reason || null; 1360 var errbacks = this.errbacks; 1361 1362 for (var i = 0, ii = errbacks.length; i < ii; i++) { 1363 errbacks[i].call(null, reason); 1364 } 1365 }, 1366 1367 then: function Promise_then(callback, errback, progressback) { 1368 if (!callback) { 1369 error('Requiring callback' + this.name); 1370 } 1371 1372 // If the promise is already resolved, call the callback directly. 1373 if (this.isResolved) { 1374 var data = this.data; 1375 callback.call(null, data); 1376 } else if (this.isRejected && errback) { 1377 var error = this.error; 1378 errback.call(null, error); 1379 } else { 1380 this.callbacks.push(callback); 1381 if (errback) 1382 this.errbacks.push(errback); 1383 } 1384 1385 if (progressback) 1386 this.progressbacks.push(progressback); 1387 } 1388 }; 1389 1390 return Promise; 1391 })(); 1392 1393 var StatTimer = (function StatTimerClosure() { 1394 function rpad(str, pad, length) { 1395 while (str.length < length) 1396 str += pad; 1397 return str; 1398 } 1399 function StatTimer() { 1400 this.started = {}; 1401 this.times = []; 1402 this.enabled = true; 1403 } 1404 StatTimer.prototype = { 1405 time: function StatTimer_time(name) { 1406 if (!this.enabled) 1407 return; 1408 if (name in this.started) 1409 throw 'Timer is already running for ' + name; 1410 this.started[name] = Date.now(); 1411 }, 1412 timeEnd: function StatTimer_timeEnd(name) { 1413 if (!this.enabled) 1414 return; 1415 if (!(name in this.started)) 1416 throw 'Timer has not been started for ' + name; 1417 this.times.push({ 1418 'name': name, 1419 'start': this.started[name], 1420 'end': Date.now() 1421 }); 1422 // Remove timer from started so it can be called again. 1423 delete this.started[name]; 1424 }, 1425 toString: function StatTimer_toString() { 1426 var times = this.times; 1427 var out = ''; 1428 // Find the longest name for padding purposes. 1429 var longest = 0; 1430 for (var i = 0, ii = times.length; i < ii; ++i) { 1431 var name = times[i]['name']; 1432 if (name.length > longest) 1433 longest = name.length; 1434 } 1435 for (var i = 0, ii = times.length; i < ii; ++i) { 1436 var span = times[i]; 1437 var duration = span.end - span.start; 1438 out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\n'; 1439 } 1440 return out; 1441 } 1442 }; 1443 return StatTimer; 1444 })(); 1445 1446 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1447 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ 1448 1449 /** 1450 * This is the main entry point for loading a PDF and interacting with it. 1451 * NOTE: If a URL is used to fetch the PDF data a standard XMLHttpRequest(XHR) 1452 * is used, which means it must follow the same origin rules that any XHR does 1453 * e.g. No cross domain requests without CORS. 1454 * 1455 * @param {string|TypedAray} source Either a url to a PDF is located or a 1456 * typed array already populated with data. 1457 * @return {Promise} A promise that is resolved with {PDFDocumentProxy} object. 1458 */ 1459 PDFJS.getDocument = function getDocument(source) { 1460 var promise = new PDFJS.Promise(); 1461 var transport = new WorkerTransport(promise); 1462 if (typeof source === 'string') { 1463 // fetch url 1464 PDFJS.getPdf( 1465 { 1466 url: source, 1467 progress: function getPDFProgress(evt) { 1468 if (evt.lengthComputable) 1469 promise.progress({ 1470 loaded: evt.loaded, 1471 total: evt.total 1472 }); 1473 }, 1474 error: function getPDFError(e) { 1475 promise.reject('Unexpected server response of ' + 1476 e.target.status + '.'); 1477 } 1478 }, 1479 function getPDFLoad(data) { 1480 transport.sendData(data); 1481 }); 1482 } else { 1483 // assuming the source is array, instantiating directly from it 1484 transport.sendData(source); 1485 } 1486 return promise; 1487 }; 1488 1489 /** 1490 * Proxy to a PDFDocument in the worker thread. Also, contains commonly used 1491 * properties that can be read synchronously. 1492 */ 1493 var PDFDocumentProxy = (function PDFDocumentProxyClosure() { 1494 function PDFDocumentProxy(pdfInfo, transport) { 1495 this.pdfInfo = pdfInfo; 1496 this.transport = transport; 1497 } 1498 PDFDocumentProxy.prototype = { 1499 /** 1500 * @return {number} Total number of pages the PDF contains. 1501 */ 1502 get numPages() { 1503 return this.pdfInfo.numPages; 1504 }, 1505 /** 1506 * @return {string} A unique ID to identify a PDF. Not guaranteed to be 1507 * unique. 1508 */ 1509 get fingerprint() { 1510 return this.pdfInfo.fingerprint; 1511 }, 1512 /** 1513 * @param {number} The page number to get. The first page is 1. 1514 * @return {Promise} A promise that is resolved with a {PDFPageProxy} 1515 * object. 1516 */ 1517 getPage: function PDFDocumentProxy_getPage(number) { 1518 return this.transport.getPage(number); 1519 }, 1520 /** 1521 * @return {Promise} A promise that is resolved with a lookup table for 1522 * mapping named destinations to reference numbers. 1523 */ 1524 getDestinations: function PDFDocumentProxy_getDestinations() { 1525 var promise = new PDFJS.Promise(); 1526 var destinations = this.pdfInfo.destinations; 1527 promise.resolve(destinations); 1528 return promise; 1529 }, 1530 /** 1531 * @return {Promise} A promise that is resolved with an {array} that is a 1532 * tree outline (if it has one) of the PDF. The tree is in the format of: 1533 * [ 1534 * { 1535 * title: string, 1536 * bold: boolean, 1537 * italic: boolean, 1538 * color: rgb array, 1539 * dest: dest obj, 1540 * items: array of more items like this 1541 * }, 1542 * ... 1543 * ]. 1544 */ 1545 getOutline: function PDFDocumentProxy_getOutline() { 1546 var promise = new PDFJS.Promise(); 1547 var outline = this.pdfInfo.outline; 1548 promise.resolve(outline); 1549 return promise; 1550 }, 1551 /** 1552 * @return {Promise} A promise that is resolved with an {object} that has 1553 * info and metadata properties. Info is an {object} filled with anything 1554 * available in the information dictionary and similarly metadata is a 1555 * {Metadata} object with information from the metadata section of the PDF. 1556 */ 1557 getMetadata: function PDFDocumentProxy_getMetadata() { 1558 var promise = new PDFJS.Promise(); 1559 var info = this.pdfInfo.info; 1560 var metadata = this.pdfInfo.metadata; 1561 promise.resolve({ 1562 info: info, 1563 metadata: metadata ? new PDFJS.Metadata(metadata) : null 1564 }); 1565 return promise; 1566 }, 1567 destroy: function PDFDocumentProxy_destroy() { 1568 this.transport.destroy(); 1569 } 1570 }; 1571 return PDFDocumentProxy; 1572 })(); 1573 1574 var PDFPageProxy = (function PDFPageProxyClosure() { 1575 function PDFPageProxy(pageInfo, transport) { 1576 this.pageInfo = pageInfo; 1577 this.transport = transport; 1578 this.stats = new StatTimer(); 1579 this.stats.enabled = !!globalScope.PDFJS.enableStats; 1580 this.objs = transport.objs; 1581 this.renderInProgress = false; 1582 } 1583 PDFPageProxy.prototype = { 1584 /** 1585 * @return {number} Page number of the page. First page is 1. 1586 */ 1587 get pageNumber() { 1588 return this.pageInfo.pageIndex + 1; 1589 }, 1590 /** 1591 * @return {number} The number of degrees the page is rotated clockwise. 1592 */ 1593 get rotate() { 1594 return this.pageInfo.rotate; 1595 }, 1596 /** 1597 * @return {object} The reference that points to this page. It has 'num' and 1598 * 'gen' properties. 1599 */ 1600 get ref() { 1601 return this.pageInfo.ref; 1602 }, 1603 /** 1604 * @return {array} An array of the visible portion of the PDF page in the 1605 * user space units - [x1, y1, x2, y2]. 1606 */ 1607 get view() { 1608 return this.pageInfo.view; 1609 }, 1610 /** 1611 * @param {number} scale The desired scale of the viewport. 1612 * @param {number} rotate Degrees to rotate the viewport. If omitted this 1613 * defaults to the page rotation. 1614 * @return {PageViewport} Contains 'width' and 'height' properties along 1615 * with transforms required for rendering. 1616 */ 1617 getViewport: function PDFPageProxy_getViewport(scale, rotate) { 1618 if (arguments.length < 2) 1619 rotate = this.rotate; 1620 return new PDFJS.PageViewport(this.view, scale, rotate, 0, 0); 1621 }, 1622 /** 1623 * @return {Promise} A promise that is resolved with an {array} of the 1624 * annotation objects. 1625 */ 1626 getAnnotations: function PDFPageProxy_getAnnotations() { 1627 if (this.annotationsPromise) 1628 return this.annotationsPromise; 1629 1630 var promise = new PDFJS.Promise(); 1631 this.annotationsPromise = promise; 1632 this.transport.getAnnotations(this.pageInfo.pageIndex); 1633 return promise; 1634 }, 1635 /** 1636 * Begins the process of rendering a page to the desired context. 1637 * @param {object} params A parameter object that supports: 1638 * { 1639 * canvasContext(required): A 2D context of a DOM Canvas object., 1640 * textLayer(optional): An object that has beginLayout, endLayout, and 1641 * appendText functions. 1642 * }. 1643 * @return {Promise} A promise that is resolved when the page finishes 1644 * rendering. 1645 */ 1646 render: function PDFPageProxy_render(params) { 1647 this.renderInProgress = true; 1648 1649 var promise = new Promise(); 1650 var stats = this.stats; 1651 stats.time('Overall'); 1652 // If there is no displayReadyPromise yet, then the operatorList was never 1653 // requested before. Make the request and create the promise. 1654 if (!this.displayReadyPromise) { 1655 this.displayReadyPromise = new Promise(); 1656 this.destroyed = false; 1657 1658 this.stats.time('Page Request'); 1659 this.transport.messageHandler.send('RenderPageRequest', { 1660 pageIndex: this.pageNumber - 1 1661 }); 1662 } 1663 1664 var self = this; 1665 function complete(error) { 1666 self.renderInProgress = false; 1667 if (self.destroyed) { 1668 delete self.operatorList; 1669 delete self.displayReadyPromise; 1670 } 1671 1672 if (error) 1673 promise.reject(error); 1674 else 1675 promise.resolve(); 1676 }; 1677 1678 // Once the operatorList and fonts are loaded, do the actual rendering. 1679 this.displayReadyPromise.then( 1680 function pageDisplayReadyPromise() { 1681 if (self.destroyed) { 1682 complete(); 1683 return; 1684 } 1685 1686 var gfx = new CanvasGraphics(params.canvasContext, 1687 this.objs, params.textLayer); 1688 try { 1689 this.display(gfx, params.viewport, complete); 1690 } catch (e) { 1691 complete(e); 1692 } 1693 }.bind(this), 1694 function pageDisplayReadPromiseError(reason) { 1695 complete(reason); 1696 } 1697 ); 1698 1699 return promise; 1700 }, 1701 /** 1702 * For internal use only. 1703 */ 1704 startRenderingFromOperatorList: 1705 function PDFPageProxy_startRenderingFromOperatorList(operatorList, 1706 fonts) { 1707 var self = this; 1708 this.operatorList = operatorList; 1709 1710 var displayContinuation = function pageDisplayContinuation() { 1711 // Always defer call to display() to work around bug in 1712 // Firefox error reporting from XHR callbacks. 1713 PdfJS_window.setTimeout(function pageSetTimeout() { 1714 self.displayReadyPromise.resolve(); 1715 }); 1716 }; 1717 1718 this.ensureFonts(fonts, 1719 function pageStartRenderingFromOperatorListEnsureFonts() { 1720 displayContinuation(); 1721 } 1722 ); 1723 }, 1724 /** 1725 * For internal use only. 1726 */ 1727 ensureFonts: function PDFPageProxy_ensureFonts(fonts, callback) { 1728 this.stats.time('Font Loading'); 1729 // Convert the font names to the corresponding font obj. 1730 for (var i = 0, ii = fonts.length; i < ii; i++) { 1731 fonts[i] = this.objs.objs[fonts[i]].data; 1732 } 1733 1734 // Load all the fonts 1735 FontLoader.bind( 1736 fonts, 1737 function pageEnsureFontsFontObjs(fontObjs) { 1738 this.stats.timeEnd('Font Loading'); 1739 1740 callback.call(this); 1741 }.bind(this) 1742 ); 1743 }, 1744 /** 1745 * For internal use only. 1746 */ 1747 display: function PDFPageProxy_display(gfx, viewport, callback) { 1748 var stats = this.stats; 1749 stats.time('Rendering'); 1750 1751 gfx.beginDrawing(viewport); 1752 1753 var startIdx = 0; 1754 var length = this.operatorList.fnArray.length; 1755 var operatorList = this.operatorList; 1756 var stepper = null; 1757 if (PDFJS.pdfBug && StepperManager.enabled) { 1758 stepper = StepperManager.create(this.pageNumber - 1); 1759 stepper.init(operatorList); 1760 stepper.nextBreakPoint = stepper.getNextBreakPoint(); 1761 } 1762 1763 var self = this; 1764 function next() { 1765 startIdx = 1766 gfx.executeOperatorList(operatorList, startIdx, next, stepper); 1767 if (startIdx == length) { 1768 gfx.endDrawing(); 1769 stats.timeEnd('Rendering'); 1770 stats.timeEnd('Overall'); 1771 if (callback) callback(); 1772 } 1773 } 1774 next(); 1775 }, 1776 /** 1777 * Stub for future feature. 1778 */ 1779 getTextContent: function PDFPageProxy_getTextContent() { 1780 var promise = new PDFJS.Promise(); 1781 var textContent = 'page text'; // not implemented 1782 promise.resolve(textContent); 1783 return promise; 1784 }, 1785 /** 1786 * Stub for future feature. 1787 */ 1788 getOperationList: function PDFPageProxy_getOperationList() { 1789 var promise = new PDFJS.Promise(); 1790 var operationList = { // not implemented 1791 dependencyFontsID: null, 1792 operatorList: null 1793 }; 1794 promise.resolve(operationList); 1795 return promise; 1796 }, 1797 /** 1798 * Destroys resources allocated by the page. 1799 */ 1800 destroy: function PDFPageProxy_destroy() { 1801 this.destroyed = true; 1802 1803 if (!this.renderInProgress) { 1804 delete this.operatorList; 1805 delete this.displayReadyPromise; 1806 } 1807 } 1808 }; 1809 return PDFPageProxy; 1810 })(); 1811 /** 1812 * For internal use only. 1813 */ 1814 var WorkerTransport = (function WorkerTransportClosure() { 1815 function WorkerTransport(promise) { 1816 this.workerReadyPromise = promise; 1817 this.objs = new PDFObjects(); 1818 1819 this.pageCache = []; 1820 this.pagePromises = []; 1821 this.fontsLoading = {}; 1822 1823 // If worker support isn't disabled explicit and the browser has worker 1824 // support, create a new web worker and test if it/the browser fullfills 1825 // all requirements to run parts of pdf.js in a web worker. 1826 // Right now, the requirement is, that an Uint8Array is still an Uint8Array 1827 // as it arrives on the worker. Chrome added this with version 15. 1828 if (!globalScope.PDFJS.disableWorker && typeof PdfJS_window.Worker !== 'undefined') { 1829 var workerSrc = PDFJS.workerSrc; 1830 if (typeof workerSrc === 'undefined') { 1831 error('No PDFJS.workerSrc specified'); 1832 } 1833 1834 try { 1835 var worker; 1836 if (PDFJS.isFirefoxExtension) { 1837 // The firefox extension can't load the worker from the resource:// 1838 // url so we have to inline the script and then use the blob loader. 1839 var bb = new MozBlobBuilder(); 1840 bb.append(PdfJS_window.document.querySelector('#PDFJS_SCRIPT_TAG').textContent); 1841 var blobUrl = PdfJS_window.window.URL.createObjectURL(bb.getBlob()); 1842 worker = new Worker(blobUrl); 1843 } else { 1844 // Some versions of FF can't create a worker on localhost, see: 1845 // https://bugzilla.mozilla.org/show_bug.cgi?id=683280 1846 worker = new Worker(workerSrc); 1847 } 1848 1849 var messageHandler = new MessageHandler('main', worker); 1850 this.messageHandler = messageHandler; 1851 1852 messageHandler.on('test', function transportTest(supportTypedArray) { 1853 if (supportTypedArray) { 1854 this.worker = worker; 1855 this.setupMessageHandler(messageHandler); 1856 } else { 1857 globalScope.PDFJS.disableWorker = true; 1858 this.setupFakeWorker(); 1859 } 1860 }.bind(this)); 1861 1862 var testObj = new Uint8Array(1); 1863 // Some versions of Opera throw a DATA_CLONE_ERR on 1864 // serializing the typed array. 1865 messageHandler.send('test', testObj); 1866 return; 1867 } catch (e) { 1868 warn('The worker has been disabled.'); 1869 } 1870 } 1871 // Either workers are disabled, not supported or have thrown an exception. 1872 // Thus, we fallback to a faked worker. 1873 globalScope.PDFJS.disableWorker = true; 1874 this.setupFakeWorker(); 1875 } 1876 WorkerTransport.prototype = { 1877 destroy: function WorkerTransport_destroy() { 1878 if (this.worker) 1879 this.worker.terminate(); 1880 1881 this.pageCache = []; 1882 this.pagePromises = []; 1883 }, 1884 setupFakeWorker: function WorkerTransport_setupFakeWorker() { 1885 // If we don't use a worker, just post/sendMessage to the main thread. 1886 var fakeWorker = { 1887 postMessage: function WorkerTransport_postMessage(obj) { 1888 fakeWorker.onmessage({data: obj}); 1889 }, 1890 terminate: function WorkerTransport_terminate() {} 1891 }; 1892 1893 var messageHandler = new MessageHandler('main', fakeWorker); 1894 this.setupMessageHandler(messageHandler); 1895 1896 // If the main thread is our worker, setup the handling for the messages 1897 // the main thread sends to it self. 1898 WorkerMessageHandler.setup(messageHandler); 1899 }, 1900 1901 setupMessageHandler: 1902 function WorkerTransport_setupMessageHandler(messageHandler) { 1903 this.messageHandler = messageHandler; 1904 1905 messageHandler.on('GetDoc', function transportDoc(data) { 1906 var pdfInfo = data.pdfInfo; 1907 var pdfDocument = new PDFDocumentProxy(pdfInfo, this); 1908 this.pdfDocument = pdfDocument; 1909 this.workerReadyPromise.resolve(pdfDocument); 1910 }, this); 1911 1912 messageHandler.on('GetPage', function transportPage(data) { 1913 var pageInfo = data.pageInfo; 1914 var page = new PDFPageProxy(pageInfo, this); 1915 this.pageCache[pageInfo.pageIndex] = page; 1916 var promise = this.pagePromises[pageInfo.pageIndex]; 1917 promise.resolve(page); 1918 }, this); 1919 1920 messageHandler.on('GetAnnotations', function transportAnnotations(data) { 1921 var annotations = data.annotations; 1922 var promise = this.pageCache[data.pageIndex].annotationsPromise; 1923 promise.resolve(annotations); 1924 }, this); 1925 1926 messageHandler.on('RenderPage', function transportRender(data) { 1927 var page = this.pageCache[data.pageIndex]; 1928 var depFonts = data.depFonts; 1929 1930 page.stats.timeEnd('Page Request'); 1931 page.startRenderingFromOperatorList(data.operatorList, depFonts); 1932 }, this); 1933 1934 messageHandler.on('obj', function transportObj(data) { 1935 var id = data[0]; 1936 var type = data[1]; 1937 if (this.objs.hasData(id)) 1938 return; 1939 1940 switch (type) { 1941 case 'JpegStream': 1942 var imageData = data[2]; 1943 loadJpegStream(id, imageData, this.objs); 1944 break; 1945 case 'Image': 1946 var imageData = data[2]; 1947 this.objs.resolve(id, imageData); 1948 break; 1949 case 'Font': 1950 var name = data[2]; 1951 var file = data[3]; 1952 var properties = data[4]; 1953 1954 if (file) { 1955 // Rewrap the ArrayBuffer in a stream. 1956 var fontFileDict = new Dict(); 1957 file = new Stream(file, 0, file.length, fontFileDict); 1958 } 1959 1960 // At this point, only the font object is created but the font is 1961 // not yet attached to the DOM. This is done in `FontLoader.bind`. 1962 var font = new Font(name, file, properties); 1963 this.objs.resolve(id, font); 1964 break; 1965 default: 1966 error('Got unkown object type ' + type); 1967 } 1968 }, this); 1969 1970 messageHandler.on('PageError', function transportError(data) { 1971 var page = this.pageCache[data.pageNum - 1]; 1972 if (page.displayReadyPromise) 1973 page.displayReadyPromise.reject(data.error); 1974 else 1975 error(data.error); 1976 }, this); 1977 1978 messageHandler.on('JpegDecode', function(data, promise) { 1979 var imageData = data[0]; 1980 var components = data[1]; 1981 if (components != 3 && components != 1) 1982 error('Only 3 component or 1 component can be returned'); 1983 1984 var img = new Image(); 1985 img.onload = (function messageHandler_onloadClosure() { 1986 var width = img.width; 1987 var height = img.height; 1988 var size = width * height; 1989 var rgbaLength = size * 4; 1990 var buf = new Uint8Array(size * components); 1991 var tmpCanvas = createScratchCanvas(width, height); 1992 var tmpCtx = tmpCanvas.getContext('2d'); 1993 tmpCtx.drawImage(img, 0, 0); 1994 var data = tmpCtx.getImageData(0, 0, width, height).data; 1995 1996 if (components == 3) { 1997 for (var i = 0, j = 0; i < rgbaLength; i += 4, j += 3) { 1998 buf[j] = data[i]; 1999 buf[j + 1] = data[i + 1]; 2000 buf[j + 2] = data[i + 2]; 2001 } 2002 } else if (components == 1) { 2003 for (var i = 0, j = 0; i < rgbaLength; i += 4, j++) { 2004 buf[j] = data[i]; 2005 } 2006 } 2007 promise.resolve({ data: buf, width: width, height: height}); 2008 }).bind(this); 2009 var src = 'data:image/jpeg;base64,' + PdfJS_window.window.btoa(imageData); 2010 img.src = src; 2011 }); 2012 }, 2013 2014 sendData: function WorkerTransport_sendData(data) { 2015 this.messageHandler.send('GetDocRequest', data); 2016 }, 2017 2018 getPage: function WorkerTransport_getPage(pageNumber, promise) { 2019 var pageIndex = pageNumber - 1; 2020 if (pageIndex in this.pagePromises) 2021 return this.pagePromises[pageIndex]; 2022 var promise = new PDFJS.Promise('Page ' + pageNumber); 2023 this.pagePromises[pageIndex] = promise; 2024 this.messageHandler.send('GetPageRequest', { pageIndex: pageIndex }); 2025 return promise; 2026 }, 2027 2028 getAnnotations: function WorkerTransport_getAnnotations(pageIndex) { 2029 this.messageHandler.send('GetAnnotationsRequest', 2030 { pageIndex: pageIndex }); 2031 } 2032 }; 2033 return WorkerTransport; 2034 2035 })(); 2036 2037 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2038 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ 2039 2040 'use strict'; 2041 2042 // <canvas> contexts store most of the state we need natively. 2043 // However, PDF needs a bit more state, which we store here. 2044 2045 var TextRenderingMode = { 2046 FILL: 0, 2047 STROKE: 1, 2048 FILL_STROKE: 2, 2049 INVISIBLE: 3, 2050 FILL_ADD_TO_PATH: 4, 2051 STROKE_ADD_TO_PATH: 5, 2052 FILL_STROKE_ADD_TO_PATH: 6, 2053 ADD_TO_PATH: 7 2054 }; 2055 2056 // Minimal font size that would be used during canvas fillText operations. 2057 var MIN_FONT_SIZE = 1; 2058 2059 function createScratchCanvas(width, height) { 2060 var canvas = PdfJS_window.document.createElement('canvas'); 2061 canvas.width = width; 2062 canvas.height = height; 2063 return canvas; 2064 } 2065 2066 function addContextCurrentTransform(ctx) { 2067 // If the context doesn't expose a `mozCurrentTransform`, add a JS based on. 2068 if (!ctx.mozCurrentTransform) { 2069 // Store the original context 2070 ctx._originalSave = ctx.save; 2071 ctx._originalRestore = ctx.restore; 2072 ctx._originalRotate = ctx.rotate; 2073 ctx._originalScale = ctx.scale; 2074 ctx._originalTranslate = ctx.translate; 2075 ctx._originalTransform = ctx.transform; 2076 2077 ctx._transformMatrix = [1, 0, 0, 1, 0, 0]; 2078 ctx._transformStack = []; 2079 2080 Object.defineProperty(ctx, 'mozCurrentTransform', { 2081 get: function getCurrentTransform() { 2082 return this._transformMatrix; 2083 } 2084 }); 2085 2086 Object.defineProperty(ctx, 'mozCurrentTransformInverse', { 2087 get: function getCurrentTransformInverse() { 2088 // Calculation done using WolframAlpha: 2089 // http://www.wolframalpha.com/input/? 2090 // i=Inverse+{{a%2C+c%2C+e}%2C+{b%2C+d%2C+f}%2C+{0%2C+0%2C+1}} 2091 2092 var m = this._transformMatrix; 2093 var a = m[0], b = m[1], c = m[2], d = m[3], e = m[4], f = m[5]; 2094 2095 var ad_bc = a * d - b * c; 2096 var bc_ad = b * c - a * d; 2097 2098 return [ 2099 d / ad_bc, 2100 b / bc_ad, 2101 c / bc_ad, 2102 a / ad_bc, 2103 (d * e - c * f) / bc_ad, 2104 (b * e - a * f) / ad_bc 2105 ]; 2106 } 2107 }); 2108 2109 ctx.save = function ctxSave() { 2110 var old = this._transformMatrix; 2111 this._transformStack.push(old); 2112 this._transformMatrix = old.slice(0, 6); 2113 2114 this._originalSave(); 2115 }; 2116 2117 ctx.restore = function ctxRestore() { 2118 var prev = this._transformStack.pop(); 2119 if (prev) { 2120 this._transformMatrix = prev; 2121 this._originalRestore(); 2122 } 2123 }; 2124 2125 ctx.translate = function ctxTranslate(x, y) { 2126 var m = this._transformMatrix; 2127 m[4] = m[0] * x + m[2] * y + m[4]; 2128 m[5] = m[1] * x + m[3] * y + m[5]; 2129 2130 this._originalTranslate(x, y); 2131 }; 2132 2133 ctx.scale = function ctxScale(x, y) { 2134 var m = this._transformMatrix; 2135 m[0] = m[0] * x; 2136 m[1] = m[1] * x; 2137 m[2] = m[2] * y; 2138 m[3] = m[3] * y; 2139 2140 this._originalScale(x, y); 2141 }; 2142 2143 ctx.transform = function ctxTransform(a, b, c, d, e, f) { 2144 var m = this._transformMatrix; 2145 this._transformMatrix = [ 2146 m[0] * a + m[2] * b, 2147 m[1] * a + m[3] * b, 2148 m[0] * c + m[2] * d, 2149 m[1] * c + m[3] * d, 2150 m[0] * e + m[2] * f + m[4], 2151 m[1] * e + m[3] * f + m[5] 2152 ]; 2153 2154 ctx._originalTransform(a, b, c, d, e, f); 2155 }; 2156 2157 ctx.rotate = function ctxRotate(angle) { 2158 var cosValue = Math.cos(angle); 2159 var sinValue = Math.sin(angle); 2160 2161 var m = this._transformMatrix; 2162 this._transformMatrix = [ 2163 m[0] * cosValue + m[2] * sinValue, 2164 m[1] * cosValue + m[3] * sinValue, 2165 m[0] * (-sinValue) + m[2] * cosValue, 2166 m[1] * (-sinValue) + m[3] * cosValue, 2167 m[4], 2168 m[5] 2169 ]; 2170 2171 this._originalRotate(angle); 2172 }; 2173 } 2174 } 2175 2176 var CanvasExtraState = (function CanvasExtraStateClosure() { 2177 function CanvasExtraState(old) { 2178 // Are soft masks and alpha values shapes or opacities? 2179 this.alphaIsShape = false; 2180 this.fontSize = 0; 2181 this.fontSizeScale = 1; 2182 this.textMatrix = IDENTITY_MATRIX; 2183 this.fontMatrix = IDENTITY_MATRIX; 2184 this.leading = 0; 2185 // Current point (in user coordinates) 2186 this.x = 0; 2187 this.y = 0; 2188 // Start of text line (in text coordinates) 2189 this.lineX = 0; 2190 this.lineY = 0; 2191 // Character and word spacing 2192 this.charSpacing = 0; 2193 this.wordSpacing = 0; 2194 this.textHScale = 1; 2195 this.textRenderingMode = TextRenderingMode.FILL; 2196 // Color spaces 2197 this.fillColorSpace = new DeviceGrayCS(); 2198 this.fillColorSpaceObj = null; 2199 this.strokeColorSpace = new DeviceGrayCS(); 2200 this.strokeColorSpaceObj = null; 2201 this.fillColorObj = null; 2202 this.strokeColorObj = null; 2203 // Default fore and background colors 2204 this.fillColor = '#000000'; 2205 this.strokeColor = '#000000'; 2206 // Note: fill alpha applies to all non-stroking operations 2207 this.fillAlpha = 1; 2208 this.strokeAlpha = 1; 2209 this.lineWidth = 1; 2210 2211 this.old = old; 2212 } 2213 2214 CanvasExtraState.prototype = { 2215 clone: function CanvasExtraState_clone() { 2216 return Object.create(this); 2217 }, 2218 setCurrentPoint: function CanvasExtraState_setCurrentPoint(x, y) { 2219 this.x = x; 2220 this.y = y; 2221 } 2222 }; 2223 return CanvasExtraState; 2224 })(); 2225 2226 var CanvasGraphics = (function CanvasGraphicsClosure() { 2227 // Defines the time the executeOperatorList is going to be executing 2228 // before it stops and shedules a continue of execution. 2229 var kExecutionTime = 15; 2230 2231 function CanvasGraphics(canvasCtx, objs, textLayer) { 2232 this.ctx = canvasCtx; 2233 this.current = new CanvasExtraState(); 2234 this.stateStack = []; 2235 this.pendingClip = null; 2236 this.res = null; 2237 this.xobjs = null; 2238 this.objs = objs; 2239 this.textLayer = textLayer; 2240 if (canvasCtx) { 2241 addContextCurrentTransform(canvasCtx); 2242 } 2243 } 2244 2245 var LINE_CAP_STYLES = ['butt', 'round', 'square']; 2246 var LINE_JOIN_STYLES = ['miter', 'round', 'bevel']; 2247 var NORMAL_CLIP = {}; 2248 var EO_CLIP = {}; 2249 2250 CanvasGraphics.prototype = { 2251 slowCommands: { 2252 'stroke': true, 2253 'closeStroke': true, 2254 'fill': true, 2255 'eoFill': true, 2256 'fillStroke': true, 2257 'eoFillStroke': true, 2258 'closeFillStroke': true, 2259 'closeEOFillStroke': true, 2260 'showText': true, 2261 'showSpacedText': true, 2262 'setStrokeColorSpace': true, 2263 'setFillColorSpace': true, 2264 'setStrokeColor': true, 2265 'setStrokeColorN': true, 2266 'setFillColor': true, 2267 'setFillColorN': true, 2268 'setStrokeGray': true, 2269 'setFillGray': true, 2270 'setStrokeRGBColor': true, 2271 'setFillRGBColor': true, 2272 'setStrokeCMYKColor': true, 2273 'setFillCMYKColor': true, 2274 'paintJpegXObject': true, 2275 'paintImageXObject': true, 2276 'paintImageMaskXObject': true, 2277 'shadingFill': true 2278 }, 2279 2280 beginDrawing: function CanvasGraphics_beginDrawing(viewport) { 2281 var transform = viewport.transform; 2282 this.ctx.save(); 2283 this.ctx.transform.apply(this.ctx, transform); 2284 2285 if (this.textLayer) 2286 this.textLayer.beginLayout(); 2287 }, 2288 2289 executeOperatorList: function CanvasGraphics_executeOperatorList( 2290 operatorList, 2291 executionStartIdx, continueCallback, 2292 stepper) { 2293 var argsArray = operatorList.argsArray; 2294 var fnArray = operatorList.fnArray; 2295 var i = executionStartIdx || 0; 2296 var argsArrayLen = argsArray.length; 2297 2298 // Sometimes the OperatorList to execute is empty. 2299 if (argsArrayLen == i) { 2300 return i; 2301 } 2302 2303 var executionEndIdx; 2304 var endTime = Date.now() + kExecutionTime; 2305 2306 var objs = this.objs; 2307 var fnName; 2308 var slowCommands = this.slowCommands; 2309 2310 while (true) { 2311 if (stepper && i === stepper.nextBreakPoint) { 2312 stepper.breakIt(i, continueCallback); 2313 return i; 2314 } 2315 2316 fnName = fnArray[i]; 2317 2318 if (fnName !== 'dependency') { 2319 this[fnName].apply(this, argsArray[i]); 2320 } else { 2321 var deps = argsArray[i]; 2322 for (var n = 0, nn = deps.length; n < nn; n++) { 2323 var depObjId = deps[n]; 2324 2325 // If the promise isn't resolved yet, add the continueCallback 2326 // to the promise and bail out. 2327 if (!objs.isResolved(depObjId)) { 2328 objs.get(depObjId, continueCallback); 2329 return i; 2330 } 2331 } 2332 } 2333 2334 i++; 2335 2336 // If the entire operatorList was executed, stop as were done. 2337 if (i == argsArrayLen) { 2338 return i; 2339 } 2340 2341 // If the execution took longer then a certain amount of time, shedule 2342 // to continue exeution after a short delay. 2343 // However, this is only possible if a 'continueCallback' is passed in. 2344 if (continueCallback && slowCommands[fnName] && Date.now() > endTime) { 2345 PdfJS_window.setTimeout(continueCallback, 0); 2346 return i; 2347 } 2348 2349 // If the operatorList isn't executed completely yet OR the execution 2350 // time was short enough, do another execution round. 2351 } 2352 }, 2353 2354 endDrawing: function CanvasGraphics_endDrawing() { 2355 this.ctx.restore(); 2356 2357 if (this.textLayer) 2358 this.textLayer.endLayout(); 2359 }, 2360 2361 // Graphics state 2362 setLineWidth: function CanvasGraphics_setLineWidth(width) { 2363 this.current.lineWidth = width; 2364 this.ctx.lineWidth = width; 2365 }, 2366 setLineCap: function CanvasGraphics_setLineCap(style) { 2367 this.ctx.lineCap = LINE_CAP_STYLES[style]; 2368 }, 2369 setLineJoin: function CanvasGraphics_setLineJoin(style) { 2370 this.ctx.lineJoin = LINE_JOIN_STYLES[style]; 2371 }, 2372 setMiterLimit: function CanvasGraphics_setMiterLimit(limit) { 2373 this.ctx.miterLimit = limit; 2374 }, 2375 setDash: function CanvasGraphics_setDash(dashArray, dashPhase) { 2376 this.ctx.mozDash = dashArray; 2377 this.ctx.mozDashOffset = dashPhase; 2378 this.ctx.webkitLineDash = dashArray; 2379 this.ctx.webkitLineDashOffset = dashPhase; 2380 }, 2381 setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) { 2382 TODO('set rendering intent: ' + intent); 2383 }, 2384 setFlatness: function CanvasGraphics_setFlatness(flatness) { 2385 TODO('set flatness: ' + flatness); 2386 }, 2387 setGState: function CanvasGraphics_setGState(states) { 2388 for (var i = 0, ii = states.length; i < ii; i++) { 2389 var state = states[i]; 2390 var key = state[0]; 2391 var value = state[1]; 2392 2393 switch (key) { 2394 case 'LW': 2395 this.setLineWidth(value); 2396 break; 2397 case 'LC': 2398 this.setLineCap(value); 2399 break; 2400 case 'LJ': 2401 this.setLineJoin(value); 2402 break; 2403 case 'ML': 2404 this.setMiterLimit(value); 2405 break; 2406 case 'D': 2407 this.setDash(value[0], value[1]); 2408 break; 2409 case 'RI': 2410 this.setRenderingIntent(value); 2411 break; 2412 case 'FL': 2413 this.setFlatness(value); 2414 break; 2415 case 'Font': 2416 this.setFont(state[1], state[2]); 2417 break; 2418 case 'CA': 2419 this.current.strokeAlpha = state[1]; 2420 break; 2421 case 'ca': 2422 this.current.fillAlpha = state[1]; 2423 this.ctx.globalAlpha = state[1]; 2424 break; 2425 } 2426 } 2427 }, 2428 save: function CanvasGraphics_save() { 2429 this.ctx.save(); 2430 var old = this.current; 2431 this.stateStack.push(old); 2432 this.current = old.clone(); 2433 }, 2434 restore: function CanvasGraphics_restore() { 2435 var prev = this.stateStack.pop(); 2436 if (prev) { 2437 this.current = prev; 2438 this.ctx.restore(); 2439 } 2440 }, 2441 transform: function CanvasGraphics_transform(a, b, c, d, e, f) { 2442 this.ctx.transform(a, b, c, d, e, f); 2443 }, 2444 2445 // Path 2446 moveTo: function CanvasGraphics_moveTo(x, y) { 2447 this.ctx.moveTo(x, y); 2448 this.current.setCurrentPoint(x, y); 2449 }, 2450 lineTo: function CanvasGraphics_lineTo(x, y) { 2451 this.ctx.lineTo(x, y); 2452 this.current.setCurrentPoint(x, y); 2453 }, 2454 curveTo: function CanvasGraphics_curveTo(x1, y1, x2, y2, x3, y3) { 2455 this.ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3); 2456 this.current.setCurrentPoint(x3, y3); 2457 }, 2458 curveTo2: function CanvasGraphics_curveTo2(x2, y2, x3, y3) { 2459 var current = this.current; 2460 this.ctx.bezierCurveTo(current.x, current.y, x2, y2, x3, y3); 2461 current.setCurrentPoint(x3, y3); 2462 }, 2463 curveTo3: function CanvasGraphics_curveTo3(x1, y1, x3, y3) { 2464 this.curveTo(x1, y1, x3, y3, x3, y3); 2465 this.current.setCurrentPoint(x3, y3); 2466 }, 2467 closePath: function CanvasGraphics_closePath() { 2468 this.ctx.closePath(); 2469 }, 2470 rectangle: function CanvasGraphics_rectangle(x, y, width, height) { 2471 this.ctx.rect(x, y, width, height); 2472 }, 2473 stroke: function CanvasGraphics_stroke(consumePath) { 2474 consumePath = typeof consumePath !== 'undefined' ? consumePath : true; 2475 var ctx = this.ctx; 2476 var strokeColor = this.current.strokeColor; 2477 if (this.current.lineWidth === 0) 2478 ctx.lineWidth = this.getSinglePixelWidth(); 2479 // For stroke we want to temporarily change the global alpha to the 2480 // stroking alpha. 2481 ctx.globalAlpha = this.current.strokeAlpha; 2482 if (strokeColor && strokeColor.hasOwnProperty('type') && 2483 strokeColor.type === 'Pattern') { 2484 // for patterns, we transform to pattern space, calculate 2485 // the pattern, call stroke, and restore to user space 2486 ctx.save(); 2487 ctx.strokeStyle = strokeColor.getPattern(ctx); 2488 ctx.stroke(); 2489 ctx.restore(); 2490 } else { 2491 ctx.stroke(); 2492 } 2493 if (consumePath) 2494 this.consumePath(); 2495 // Restore the global alpha to the fill alpha 2496 ctx.globalAlpha = this.current.fillAlpha; 2497 }, 2498 closeStroke: function CanvasGraphics_closeStroke() { 2499 this.closePath(); 2500 this.stroke(); 2501 }, 2502 fill: function CanvasGraphics_fill(consumePath) { 2503 consumePath = typeof consumePath !== 'undefined' ? consumePath : true; 2504 var ctx = this.ctx; 2505 var fillColor = this.current.fillColor; 2506 2507 if (fillColor && fillColor.hasOwnProperty('type') && 2508 fillColor.type === 'Pattern') { 2509 ctx.save(); 2510 ctx.fillStyle = fillColor.getPattern(ctx); 2511 ctx.fill(); 2512 ctx.restore(); 2513 } else { 2514 ctx.fill(); 2515 } 2516 if (consumePath) 2517 this.consumePath(); 2518 }, 2519 eoFill: function CanvasGraphics_eoFill() { 2520 var savedFillRule = this.setEOFillRule(); 2521 this.fill(); 2522 this.restoreFillRule(savedFillRule); 2523 }, 2524 fillStroke: function CanvasGraphics_fillStroke() { 2525 this.fill(false); 2526 this.stroke(false); 2527 2528 this.consumePath(); 2529 }, 2530 eoFillStroke: function CanvasGraphics_eoFillStroke() { 2531 var savedFillRule = this.setEOFillRule(); 2532 this.fillStroke(); 2533 this.restoreFillRule(savedFillRule); 2534 }, 2535 closeFillStroke: function CanvasGraphics_closeFillStroke() { 2536 this.closePath(); 2537 this.fillStroke(); 2538 }, 2539 closeEOFillStroke: function CanvasGraphics_closeEOFillStroke() { 2540 var savedFillRule = this.setEOFillRule(); 2541 this.closePath(); 2542 this.fillStroke(); 2543 this.restoreFillRule(savedFillRule); 2544 }, 2545 endPath: function CanvasGraphics_endPath() { 2546 this.consumePath(); 2547 }, 2548 2549 // Clipping 2550 clip: function CanvasGraphics_clip() { 2551 this.pendingClip = NORMAL_CLIP; 2552 }, 2553 eoClip: function CanvasGraphics_eoClip() { 2554 this.pendingClip = EO_CLIP; 2555 }, 2556 2557 // Text 2558 beginText: function CanvasGraphics_beginText() { 2559 this.current.textMatrix = IDENTITY_MATRIX; 2560 this.current.x = this.current.lineX = 0; 2561 this.current.y = this.current.lineY = 0; 2562 }, 2563 endText: function CanvasGraphics_endText() { 2564 }, 2565 setCharSpacing: function CanvasGraphics_setCharSpacing(spacing) { 2566 this.current.charSpacing = spacing; 2567 }, 2568 setWordSpacing: function CanvasGraphics_setWordSpacing(spacing) { 2569 this.current.wordSpacing = spacing; 2570 }, 2571 setHScale: function CanvasGraphics_setHScale(scale) { 2572 this.current.textHScale = scale / 100; 2573 }, 2574 setLeading: function CanvasGraphics_setLeading(leading) { 2575 this.current.leading = -leading; 2576 }, 2577 setFont: function CanvasGraphics_setFont(fontRefName, size) { 2578 var fontObj = this.objs.get(fontRefName); 2579 var current = this.current; 2580 2581 if (!fontObj) 2582 error('Can\'t find font for ' + fontRefName); 2583 2584 // Slice-clone matrix so we can manipulate it without affecting original 2585 if (fontObj.fontMatrix) 2586 current.fontMatrix = fontObj.fontMatrix.slice(0); 2587 else 2588 current.fontMatrix = IDENTITY_MATRIX.slice(0); 2589 2590 // A valid matrix needs all main diagonal elements to be non-zero 2591 // This also ensures we bypass FF bugzilla bug #719844. 2592 if (current.fontMatrix[0] === 0 || 2593 current.fontMatrix[3] === 0) { 2594 warn('Invalid font matrix for font ' + fontRefName); 2595 } 2596 2597 // The spec for Tf (setFont) says that 'size' specifies the font 'scale', 2598 // and in some docs this can be negative (inverted x-y axes). 2599 // We implement this condition with fontMatrix. 2600 if (size < 0) { 2601 size = -size; 2602 current.fontMatrix[0] *= -1; 2603 current.fontMatrix[3] *= -1; 2604 } 2605 2606 this.current.font = fontObj; 2607 this.current.fontSize = size; 2608 2609 if (fontObj.coded) 2610 return; // we don't need ctx.font for Type3 fonts 2611 2612 var name = fontObj.loadedName || 'sans-serif'; 2613 var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') : 2614 (fontObj.bold ? 'bold' : 'normal'); 2615 2616 var italic = fontObj.italic ? 'italic' : 'normal'; 2617 var serif = fontObj.isSerifFont ? 'serif' : 'sans-serif'; 2618 var typeface = '"' + name + '", ' + serif; 2619 2620 // Some font backends cannot handle fonts below certain size. 2621 // Keeping the font at minimal size and using the fontSizeScale to change 2622 // the current transformation matrix before the fillText/strokeText. 2623 // See https://bugzilla.mozilla.org/show_bug.cgi?id=726227 2624 var browserFontSize = size >= MIN_FONT_SIZE ? size : MIN_FONT_SIZE; 2625 this.current.fontSizeScale = browserFontSize != MIN_FONT_SIZE ? 1.0 : 2626 size / MIN_FONT_SIZE; 2627 2628 var rule = italic + ' ' + bold + ' ' + browserFontSize + 'px ' + typeface; 2629 this.ctx.font = rule; 2630 }, 2631 setTextRenderingMode: function CanvasGraphics_setTextRenderingMode(mode) { 2632 if (mode >= TextRenderingMode.FILL_ADD_TO_PATH) 2633 TODO('unsupported text rendering mode: ' + mode); 2634 this.current.textRenderingMode = mode; 2635 }, 2636 setTextRise: function CanvasGraphics_setTextRise(rise) { 2637 TODO('text rise: ' + rise); 2638 }, 2639 moveText: function CanvasGraphics_moveText(x, y) { 2640 this.current.x = this.current.lineX += x; 2641 this.current.y = this.current.lineY += y; 2642 }, 2643 setLeadingMoveText: function CanvasGraphics_setLeadingMoveText(x, y) { 2644 this.setLeading(-y); 2645 this.moveText(x, y); 2646 }, 2647 setTextMatrix: function CanvasGraphics_setTextMatrix(a, b, c, d, e, f) { 2648 this.current.textMatrix = [a, b, c, d, e, f]; 2649 2650 this.current.x = this.current.lineX = 0; 2651 this.current.y = this.current.lineY = 0; 2652 }, 2653 nextLine: function CanvasGraphics_nextLine() { 2654 this.moveText(0, this.current.leading); 2655 }, 2656 applyTextTransforms: function CanvasGraphics_applyTextTransforms() { 2657 var ctx = this.ctx; 2658 var current = this.current; 2659 var textHScale = current.textHScale; 2660 var fontMatrix = current.fontMatrix || IDENTITY_MATRIX; 2661 2662 ctx.transform.apply(ctx, current.textMatrix); 2663 ctx.scale(1, -1); 2664 ctx.translate(current.x, -1 * current.y); 2665 ctx.transform.apply(ctx, fontMatrix); 2666 ctx.scale(textHScale, 1); 2667 }, 2668 getTextGeometry: function CanvasGraphics_getTextGeometry() { 2669 var geometry = {}; 2670 var ctx = this.ctx; 2671 var font = this.current.font; 2672 var ctxMatrix = ctx.mozCurrentTransform; 2673 if (ctxMatrix) { 2674 var bl = Util.applyTransform([0, 0], ctxMatrix); 2675 var tr = Util.applyTransform([1, 1], ctxMatrix); 2676 geometry.x = bl[0]; 2677 geometry.y = bl[1]; 2678 geometry.hScale = tr[0] - bl[0]; 2679 geometry.vScale = tr[1] - bl[1]; 2680 } 2681 geometry.spaceWidth = font.spaceWidth; 2682 return geometry; 2683 }, 2684 2685 showText: function CanvasGraphics_showText(str, skipTextSelection) { 2686 var ctx = this.ctx; 2687 var current = this.current; 2688 var font = current.font; 2689 var glyphs = font.charsToGlyphs(str); 2690 var fontSize = current.fontSize; 2691 var fontSizeScale = current.fontSizeScale; 2692 var charSpacing = current.charSpacing; 2693 var wordSpacing = current.wordSpacing; 2694 var textHScale = current.textHScale; 2695 var fontMatrix = current.fontMatrix || IDENTITY_MATRIX; 2696 var textHScale2 = textHScale * fontMatrix[0]; 2697 var glyphsLength = glyphs.length; 2698 var textLayer = this.textLayer; 2699 var text = {str: '', length: 0, canvasWidth: 0, geom: {}}; 2700 var textSelection = textLayer && !skipTextSelection ? true : false; 2701 var textRenderingMode = current.textRenderingMode; 2702 2703 // Type3 fonts - each glyph is a "mini-PDF" 2704 if (font.coded) { 2705 ctx.save(); 2706 ctx.transform.apply(ctx, current.textMatrix); 2707 ctx.translate(current.x, current.y); 2708 2709 ctx.scale(textHScale, 1); 2710 2711 if (textSelection) { 2712 this.save(); 2713 ctx.scale(1, -1); 2714 text.geom = this.getTextGeometry(); 2715 this.restore(); 2716 } 2717 for (var i = 0; i < glyphsLength; ++i) { 2718 2719 var glyph = glyphs[i]; 2720 if (glyph === null) { 2721 // word break 2722 this.ctx.translate(wordSpacing, 0); 2723 continue; 2724 } 2725 2726 this.save(); 2727 ctx.scale(fontSize, fontSize); 2728 ctx.transform.apply(ctx, fontMatrix); 2729 this.executeOperatorList(glyph.operatorList); 2730 this.restore(); 2731 2732 var transformed = Util.applyTransform([glyph.width, 0], fontMatrix); 2733 var width = transformed[0] * fontSize + 2734 Util.sign(current.fontMatrix[0]) * charSpacing; 2735 2736 ctx.translate(width, 0); 2737 current.x += width * textHScale; 2738 2739 text.str += glyph.unicode; 2740 text.length++; 2741 text.canvasWidth += width; 2742 } 2743 ctx.restore(); 2744 } else { 2745 ctx.save(); 2746 this.applyTextTransforms(); 2747 2748 var lineWidth = current.lineWidth; 2749 var scale = Math.abs(current.textMatrix[0] * fontMatrix[0]); 2750 if (scale == 0 || lineWidth == 0) 2751 lineWidth = this.getSinglePixelWidth(); 2752 else 2753 lineWidth /= scale; 2754 2755 if (textSelection) 2756 text.geom = this.getTextGeometry(); 2757 2758 if (fontSizeScale != 1.0) { 2759 ctx.scale(fontSizeScale, fontSizeScale); 2760 lineWidth /= fontSizeScale; 2761 } 2762 2763 ctx.lineWidth = lineWidth; 2764 2765 var x = 0; 2766 for (var i = 0; i < glyphsLength; ++i) { 2767 var glyph = glyphs[i]; 2768 if (glyph === null) { 2769 // word break 2770 x += Util.sign(current.fontMatrix[0]) * wordSpacing; 2771 continue; 2772 } 2773 2774 var character = glyph.fontChar; 2775 var charWidth = glyph.width * fontSize * 0.001 + 2776 Util.sign(current.fontMatrix[0]) * charSpacing; 2777 2778 if (!glyph.disabled) { 2779 var scaledX = x / fontSizeScale; 2780 switch (textRenderingMode) { 2781 default: // other unsupported rendering modes 2782 case TextRenderingMode.FILL: 2783 case TextRenderingMode.FILL_ADD_TO_PATH: 2784 ctx.fillText(character, scaledX, 0); 2785 break; 2786 case TextRenderingMode.STROKE: 2787 case TextRenderingMode.STROKE_ADD_TO_PATH: 2788 ctx.strokeText(character, scaledX, 0); 2789 break; 2790 case TextRenderingMode.FILL_STROKE: 2791 case TextRenderingMode.FILL_STROKE_ADD_TO_PATH: 2792 ctx.fillText(character, scaledX, 0); 2793 ctx.strokeText(character, scaledX, 0); 2794 break; 2795 case TextRenderingMode.INVISIBLE: 2796 break; 2797 } 2798 } 2799 2800 x += charWidth; 2801 2802 var glyphUnicode = glyph.unicode === ' ' ? '\u00A0' : glyph.unicode; 2803 var glyphUnicodeLength = glyphUnicode.length; 2804 //reverse an arabic ligature 2805 if (glyphUnicodeLength > 1 && 2806 isRTLRangeFor(glyphUnicode.charCodeAt(0))) { 2807 for (var ii = glyphUnicodeLength - 1; ii >= 0; ii--) 2808 text.str += glyphUnicode[ii]; 2809 } else 2810 text.str += glyphUnicode; 2811 text.length += glyphUnicodeLength; 2812 text.canvasWidth += charWidth; 2813 } 2814 current.x += x * textHScale2; 2815 ctx.restore(); 2816 } 2817 2818 if (textSelection) 2819 this.textLayer.appendText(text, font.loadedName, fontSize); 2820 2821 return text; 2822 }, 2823 showSpacedText: function CanvasGraphics_showSpacedText(arr) { 2824 var ctx = this.ctx; 2825 var current = this.current; 2826 var font = current.font; 2827 var fontSize = current.fontSize; 2828 var textHScale = current.textHScale; 2829 if (!font.coded) 2830 textHScale *= (current.fontMatrix || IDENTITY_MATRIX)[0]; 2831 var arrLength = arr.length; 2832 var textLayer = this.textLayer; 2833 var text = {str: '', length: 0, canvasWidth: 0, geom: {}}; 2834 var textSelection = textLayer ? true : false; 2835 2836 if (textSelection) { 2837 ctx.save(); 2838 // Type3 fonts - each glyph is a "mini-PDF" (see also showText) 2839 if (font.coded) { 2840 ctx.transform.apply(ctx, current.textMatrix); 2841 ctx.scale(1, -1); 2842 ctx.translate(current.x, -1 * current.y); 2843 ctx.scale(textHScale, 1); 2844 } else 2845 this.applyTextTransforms(); 2846 text.geom = this.getTextGeometry(); 2847 ctx.restore(); 2848 } 2849 2850 for (var i = 0; i < arrLength; ++i) { 2851 var e = arr[i]; 2852 if (isNum(e)) { 2853 var spacingLength = -e * 0.001 * fontSize * textHScale; 2854 current.x += spacingLength; 2855 2856 if (textSelection) { 2857 // Emulate precise spacing via HTML spaces 2858 text.canvasWidth += spacingLength; 2859 if (e < 0 && text.geom.spaceWidth > 0) { // avoid div by zero 2860 var numFakeSpaces = Math.round(-e / text.geom.spaceWidth); 2861 if (numFakeSpaces > 0) { 2862 text.str += '\u00A0'; 2863 text.length++; 2864 } 2865 } 2866 } 2867 } else if (isString(e)) { 2868 var shownText = this.showText(e, true); 2869 2870 if (textSelection) { 2871 if (shownText.str === ' ') { 2872 text.str += '\u00A0'; 2873 } else { 2874 text.str += shownText.str; 2875 } 2876 text.canvasWidth += shownText.canvasWidth; 2877 text.length += shownText.length; 2878 } 2879 } else { 2880 malformed('TJ array element ' + e + ' is not string or num'); 2881 } 2882 } 2883 2884 if (textSelection) 2885 this.textLayer.appendText(text, font.loadedName, fontSize); 2886 }, 2887 nextLineShowText: function CanvasGraphics_nextLineShowText(text) { 2888 this.nextLine(); 2889 this.showText(text); 2890 }, 2891 nextLineSetSpacingShowText: 2892 function CanvasGraphics_nextLineSetSpacingShowText(wordSpacing, 2893 charSpacing, 2894 text) { 2895 this.setWordSpacing(wordSpacing); 2896 this.setCharSpacing(charSpacing); 2897 this.nextLineShowText(text); 2898 }, 2899 2900 // Type3 fonts 2901 setCharWidth: function CanvasGraphics_setCharWidth(xWidth, yWidth) { 2902 // We can safely ignore this since the width should be the same 2903 // as the width in the Widths array. 2904 }, 2905 setCharWidthAndBounds: function CanvasGraphics_setCharWidthAndBounds(xWidth, 2906 yWidth, 2907 llx, 2908 lly, 2909 urx, 2910 ury) { 2911 // TODO According to the spec we're also suppose to ignore any operators 2912 // that set color or include images while processing this type3 font. 2913 this.rectangle(llx, lly, urx - llx, ury - lly); 2914 this.clip(); 2915 this.endPath(); 2916 }, 2917 2918 // Color 2919 setStrokeColorSpace: function CanvasGraphics_setStrokeColorSpace(raw) { 2920 this.current.strokeColorSpace = ColorSpace.fromIR(raw); 2921 }, 2922 setFillColorSpace: function CanvasGraphics_setFillColorSpace(raw) { 2923 this.current.fillColorSpace = ColorSpace.fromIR(raw); 2924 }, 2925 setStrokeColor: function CanvasGraphics_setStrokeColor(/*...*/) { 2926 var cs = this.current.strokeColorSpace; 2927 var rgbColor = cs.getRgb(arguments); 2928 var color = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]); 2929 this.ctx.strokeStyle = color; 2930 this.current.strokeColor = color; 2931 }, 2932 getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR, cs) { 2933 if (IR[0] == 'TilingPattern') { 2934 var args = IR[1]; 2935 var base = cs.base; 2936 var color; 2937 if (base) { 2938 var baseComps = base.numComps; 2939 2940 color = []; 2941 for (var i = 0; i < baseComps; ++i) 2942 color.push(args[i]); 2943 2944 color = base.getRgb(color); 2945 } 2946 var pattern = new TilingPattern(IR, color, this.ctx, this.objs); 2947 } else if (IR[0] == 'RadialAxial' || IR[0] == 'Dummy') { 2948 var pattern = Pattern.shadingFromIR(IR); 2949 } else { 2950 error('Unkown IR type ' + IR[0]); 2951 } 2952 return pattern; 2953 }, 2954 setStrokeColorN: function CanvasGraphics_setStrokeColorN(/*...*/) { 2955 var cs = this.current.strokeColorSpace; 2956 2957 if (cs.name == 'Pattern') { 2958 this.current.strokeColor = this.getColorN_Pattern(arguments, cs); 2959 } else { 2960 this.setStrokeColor.apply(this, arguments); 2961 } 2962 }, 2963 setFillColor: function CanvasGraphics_setFillColor(/*...*/) { 2964 var cs = this.current.fillColorSpace; 2965 var rgbColor = cs.getRgb(arguments); 2966 var color = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]); 2967 this.ctx.fillStyle = color; 2968 this.current.fillColor = color; 2969 }, 2970 setFillColorN: function CanvasGraphics_setFillColorN(/*...*/) { 2971 var cs = this.current.fillColorSpace; 2972 2973 if (cs.name == 'Pattern') { 2974 this.current.fillColor = this.getColorN_Pattern(arguments, cs); 2975 } else { 2976 this.setFillColor.apply(this, arguments); 2977 } 2978 }, 2979 setStrokeGray: function CanvasGraphics_setStrokeGray(gray) { 2980 if (!(this.current.strokeColorSpace instanceof DeviceGrayCS)) 2981 this.current.strokeColorSpace = new DeviceGrayCS(); 2982 2983 var color = Util.makeCssRgb(gray, gray, gray); 2984 this.ctx.strokeStyle = color; 2985 this.current.strokeColor = color; 2986 }, 2987 setFillGray: function CanvasGraphics_setFillGray(gray) { 2988 if (!(this.current.fillColorSpace instanceof DeviceGrayCS)) 2989 this.current.fillColorSpace = new DeviceGrayCS(); 2990 2991 var color = Util.makeCssRgb(gray, gray, gray); 2992 this.ctx.fillStyle = color; 2993 this.current.fillColor = color; 2994 }, 2995 setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) { 2996 if (!(this.current.strokeColorSpace instanceof DeviceRgbCS)) 2997 this.current.strokeColorSpace = new DeviceRgbCS(); 2998 2999 var color = Util.makeCssRgb(r, g, b); 3000 this.ctx.strokeStyle = color; 3001 this.current.strokeColor = color; 3002 }, 3003 setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) { 3004 if (!(this.current.fillColorSpace instanceof DeviceRgbCS)) 3005 this.current.fillColorSpace = new DeviceRgbCS(); 3006 3007 var color = Util.makeCssRgb(r, g, b); 3008 this.ctx.fillStyle = color; 3009 this.current.fillColor = color; 3010 }, 3011 setStrokeCMYKColor: function CanvasGraphics_setStrokeCMYKColor(c, m, y, k) { 3012 if (!(this.current.strokeColorSpace instanceof DeviceCmykCS)) 3013 this.current.strokeColorSpace = new DeviceCmykCS(); 3014 3015 var color = Util.makeCssCmyk(c, m, y, k); 3016 this.ctx.strokeStyle = color; 3017 this.current.strokeColor = color; 3018 }, 3019 setFillCMYKColor: function CanvasGraphics_setFillCMYKColor(c, m, y, k) { 3020 if (!(this.current.fillColorSpace instanceof DeviceCmykCS)) 3021 this.current.fillColorSpace = new DeviceCmykCS(); 3022 3023 var color = Util.makeCssCmyk(c, m, y, k); 3024 this.ctx.fillStyle = color; 3025 this.current.fillColor = color; 3026 }, 3027 3028 shadingFill: function CanvasGraphics_shadingFill(patternIR) { 3029 var ctx = this.ctx; 3030 3031 this.save(); 3032 var pattern = Pattern.shadingFromIR(patternIR); 3033 ctx.fillStyle = pattern.getPattern(ctx); 3034 3035 var inv = ctx.mozCurrentTransformInverse; 3036 if (inv) { 3037 var canvas = ctx.canvas; 3038 var width = canvas.width; 3039 var height = canvas.height; 3040 3041 var bl = Util.applyTransform([0, 0], inv); 3042 var br = Util.applyTransform([0, height], inv); 3043 var ul = Util.applyTransform([width, 0], inv); 3044 var ur = Util.applyTransform([width, height], inv); 3045 3046 var x0 = Math.min(bl[0], br[0], ul[0], ur[0]); 3047 var y0 = Math.min(bl[1], br[1], ul[1], ur[1]); 3048 var x1 = Math.max(bl[0], br[0], ul[0], ur[0]); 3049 var y1 = Math.max(bl[1], br[1], ul[1], ur[1]); 3050 3051 this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0); 3052 } else { 3053 // HACK to draw the gradient onto an infinite rectangle. 3054 // PDF gradients are drawn across the entire image while 3055 // Canvas only allows gradients to be drawn in a rectangle 3056 // The following bug should allow us to remove this. 3057 // https://bugzilla.mozilla.org/show_bug.cgi?id=664884 3058 3059 this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10); 3060 } 3061 3062 this.restore(); 3063 }, 3064 3065 // Images 3066 beginInlineImage: function CanvasGraphics_beginInlineImage() { 3067 error('Should not call beginInlineImage'); 3068 }, 3069 beginImageData: function CanvasGraphics_beginImageData() { 3070 error('Should not call beginImageData'); 3071 }, 3072 3073 paintFormXObjectBegin: function CanvasGraphics_paintFormXObjectBegin(matrix, 3074 bbox) { 3075 this.save(); 3076 3077 if (matrix && isArray(matrix) && 6 == matrix.length) 3078 this.transform.apply(this, matrix); 3079 3080 if (bbox && isArray(bbox) && 4 == bbox.length) { 3081 var width = bbox[2] - bbox[0]; 3082 var height = bbox[3] - bbox[1]; 3083 this.rectangle(bbox[0], bbox[1], width, height); 3084 this.clip(); 3085 this.endPath(); 3086 } 3087 }, 3088 3089 paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() { 3090 this.restore(); 3091 }, 3092 3093 paintJpegXObject: function CanvasGraphics_paintJpegXObject(objId, w, h) { 3094 var domImage = this.objs.get(objId); 3095 if (!domImage) { 3096 error('Dependent image isn\'t ready yet'); 3097 } 3098 3099 this.save(); 3100 3101 var ctx = this.ctx; 3102 // scale the image to the unit square 3103 ctx.scale(1 / w, -1 / h); 3104 3105 ctx.drawImage(domImage, 0, 0, domImage.width, domImage.height, 3106 0, -h, w, h); 3107 3108 this.restore(); 3109 }, 3110 3111 paintImageMaskXObject: function CanvasGraphics_paintImageMaskXObject( 3112 imgArray, inverseDecode, width, height) { 3113 function applyStencilMask(buffer, inverseDecode) { 3114 var imgArrayPos = 0; 3115 var i, j, mask, buf; 3116 // removing making non-masked pixels transparent 3117 var bufferPos = 3; // alpha component offset 3118 for (i = 0; i < height; i++) { 3119 mask = 0; 3120 for (j = 0; j < width; j++) { 3121 if (!mask) { 3122 buf = imgArray[imgArrayPos++]; 3123 mask = 128; 3124 } 3125 if (!(buf & mask) == inverseDecode) { 3126 buffer[bufferPos] = 0; 3127 } 3128 bufferPos += 4; 3129 mask >>= 1; 3130 } 3131 } 3132 } 3133 3134 this.save(); 3135 3136 var ctx = this.ctx; 3137 var w = width, h = height; 3138 // scale the image to the unit square 3139 ctx.scale(1 / w, -1 / h); 3140 3141 var tmpCanvas = createScratchCanvas(w, h); 3142 var tmpCtx = tmpCanvas.getContext('2d'); 3143 3144 var fillColor = this.current.fillColor; 3145 tmpCtx.fillStyle = (fillColor && fillColor.hasOwnProperty('type') && 3146 fillColor.type === 'Pattern') ? 3147 fillColor.getPattern(tmpCtx) : fillColor; 3148 tmpCtx.fillRect(0, 0, w, h); 3149 3150 var imgData = tmpCtx.getImageData(0, 0, w, h); 3151 var pixels = imgData.data; 3152 3153 applyStencilMask(pixels, inverseDecode); 3154 3155 tmpCtx.putImageData(imgData, 0, 0); 3156 ctx.drawImage(tmpCanvas, 0, -h); 3157 this.restore(); 3158 }, 3159 3160 paintImageXObject: function CanvasGraphics_paintImageXObject(objId) { 3161 var imgData = this.objs.get(objId); 3162 if (!imgData) 3163 error('Dependent image isn\'t ready yet'); 3164 3165 this.save(); 3166 var ctx = this.ctx; 3167 var w = imgData.width; 3168 var h = imgData.height; 3169 // scale the image to the unit square 3170 ctx.scale(1 / w, -1 / h); 3171 3172 var tmpCanvas = createScratchCanvas(w, h); 3173 var tmpCtx = tmpCanvas.getContext('2d'); 3174 this.putBinaryImageData(tmpCtx, imgData, w, h); 3175 3176 ctx.drawImage(tmpCanvas, 0, -h); 3177 this.restore(); 3178 }, 3179 3180 putBinaryImageData: function CanvasGraphics_putBinaryImageData() { 3181 // 3182 }, 3183 3184 // Marked content 3185 3186 markPoint: function CanvasGraphics_markPoint(tag) { 3187 TODO('Marked content'); 3188 }, 3189 markPointProps: function CanvasGraphics_markPointProps(tag, properties) { 3190 TODO('Marked content'); 3191 }, 3192 beginMarkedContent: function CanvasGraphics_beginMarkedContent(tag) { 3193 TODO('Marked content'); 3194 }, 3195 beginMarkedContentProps: function CanvasGraphics_beginMarkedContentProps( 3196 tag, properties) { 3197 TODO('Marked content'); 3198 }, 3199 endMarkedContent: function CanvasGraphics_endMarkedContent() { 3200 TODO('Marked content'); 3201 }, 3202 3203 // Compatibility 3204 3205 beginCompat: function CanvasGraphics_beginCompat() { 3206 TODO('ignore undefined operators (should we do that anyway?)'); 3207 }, 3208 endCompat: function CanvasGraphics_endCompat() { 3209 TODO('stop ignoring undefined operators'); 3210 }, 3211 3212 // Helper functions 3213 3214 consumePath: function CanvasGraphics_consumePath() { 3215 if (this.pendingClip) { 3216 var savedFillRule = null; 3217 if (this.pendingClip == EO_CLIP) 3218 savedFillRule = this.setEOFillRule(); 3219 3220 this.ctx.clip(); 3221 3222 this.pendingClip = null; 3223 if (savedFillRule !== null) 3224 this.restoreFillRule(savedFillRule); 3225 } 3226 this.ctx.beginPath(); 3227 }, 3228 // We generally keep the canvas context set for 3229 // nonzero-winding, and just set evenodd for the operations 3230 // that need them. 3231 setEOFillRule: function CanvasGraphics_setEOFillRule() { 3232 var savedFillRule = this.ctx.mozFillRule; 3233 this.ctx.mozFillRule = 'evenodd'; 3234 return savedFillRule; 3235 }, 3236 restoreFillRule: function CanvasGraphics_restoreFillRule(rule) { 3237 this.ctx.mozFillRule = rule; 3238 }, 3239 getSinglePixelWidth: function CanvasGraphics_getSinglePixelWidth(scale) { 3240 var inverse = this.ctx.mozCurrentTransformInverse; 3241 return Math.abs(inverse[0] + inverse[2]); 3242 } 3243 }; 3244 3245 return CanvasGraphics; 3246 })(); 3247 3248 if (!isWorker) { 3249 // Feature detection if the browser can use an Uint8Array directly as imgData. 3250 var canvas = PdfJS_window.document.createElement('canvas'); 3251 canvas.width = 1; 3252 canvas.height = 1; 3253 var ctx = canvas.getContext('2d'); 3254 3255 try { 3256 ctx.putImageData({ 3257 width: 1, 3258 height: 1, 3259 data: new Uint8Array(4) 3260 }, 0, 0); 3261 3262 CanvasGraphics.prototype.putBinaryImageData = 3263 function CanvasGraphicsPutBinaryImageDataNative(ctx, imgData) { 3264 ctx.putImageData(imgData, 0, 0); 3265 }; 3266 } catch (e) { 3267 CanvasGraphics.prototype.putBinaryImageData = 3268 function CanvasGraphicsPutBinaryImageDataShim(ctx, imgData, w, h) { 3269 var tmpImgData = ctx.getImageData(0, 0, w, h); 3270 3271 // Copy over the imageData pixel by pixel. 3272 var tmpImgDataPixels = tmpImgData.data; 3273 var len = tmpImgDataPixels.length; 3274 3275 while (len--) { 3276 tmpImgDataPixels[len] = imgData.data[len]; 3277 } 3278 3279 ctx.putImageData(tmpImgData, 0, 0); 3280 }; 3281 } 3282 } 3283 3284 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 3285 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ 3286 3287 'use strict'; 3288 3289 var Name = (function NameClosure() { 3290 function Name(name) { 3291 this.name = name; 3292 } 3293 3294 Name.prototype = {}; 3295 3296 return Name; 3297 })(); 3298 3299 var Cmd = (function CmdClosure() { 3300 function Cmd(cmd) { 3301 this.cmd = cmd; 3302 } 3303 3304 Cmd.prototype = {}; 3305 3306 var cmdCache = {}; 3307 3308 Cmd.get = function Cmd_get(cmd) { 3309 var cmdValue = cmdCache[cmd]; 3310 if (cmdValue) 3311 return cmdValue; 3312 3313 return cmdCache[cmd] = new Cmd(cmd); 3314 }; 3315 3316 return Cmd; 3317 })(); 3318 3319 var Dict = (function DictClosure() { 3320 // xref is optional 3321 function Dict(xref) { 3322 // Map should only be used internally, use functions below to access. 3323 var map = Object.create(null); 3324 3325 this.assignXref = function Dict_assignXref(newXref) { 3326 xref = newXref; 3327 }; 3328 3329 // automatically dereferences Ref objects 3330 this.get = function Dict_get(key1, key2, key3) { 3331 var value; 3332 if (typeof (value = map[key1]) != 'undefined' || key1 in map || 3333 typeof key2 == 'undefined') { 3334 return xref ? xref.fetchIfRef(value) : value; 3335 } 3336 if (typeof (value = map[key2]) != 'undefined' || key2 in map || 3337 typeof key3 == 'undefined') { 3338 return xref ? xref.fetchIfRef(value) : value; 3339 } 3340 value = map[key3] || null; 3341 return xref ? xref.fetchIfRef(value) : value; 3342 }; 3343 3344 // no dereferencing 3345 this.getRaw = function Dict_getRaw(key) { 3346 return map[key]; 3347 }; 3348 3349 // creates new map and dereferences all Refs 3350 this.getAll = function Dict_getAll() { 3351 var all = {}; 3352 for (var key in map) { 3353 var obj = this.get(key); 3354 all[key] = obj instanceof Dict ? obj.getAll() : obj; 3355 } 3356 return all; 3357 }; 3358 3359 this.set = function Dict_set(key, value) { 3360 map[key] = value; 3361 }; 3362 3363 this.has = function Dict_has(key) { 3364 return key in map; 3365 }; 3366 3367 this.forEach = function Dict_forEach(callback) { 3368 for (var key in map) { 3369 callback(key, this.get(key)); 3370 } 3371 }; 3372 }; 3373 3374 return Dict; 3375 })(); 3376 3377 var Ref = (function RefClosure() { 3378 function Ref(num, gen) { 3379 this.num = num; 3380 this.gen = gen; 3381 } 3382 3383 Ref.prototype = {}; 3384 3385 return Ref; 3386 })(); 3387 3388 // The reference is identified by number and generation, 3389 // this structure stores only one instance of the reference. 3390 var RefSet = (function RefSetClosure() { 3391 function RefSet() { 3392 this.dict = {}; 3393 } 3394 3395 RefSet.prototype = { 3396 has: function RefSet_has(ref) { 3397 return !!this.dict['R' + ref.num + '.' + ref.gen]; 3398 }, 3399 3400 put: function RefSet_put(ref) { 3401 this.dict['R' + ref.num + '.' + ref.gen] = ref; 3402 } 3403 }; 3404 3405 return RefSet; 3406 })(); 3407 3408 var Catalog = (function CatalogClosure() { 3409 function Catalog(xref) { 3410 this.xref = xref; 3411 var obj = xref.getCatalogObj(); 3412 assertWellFormed(isDict(obj), 'catalog object is not a dictionary'); 3413 this.catDict = obj; 3414 } 3415 3416 Catalog.prototype = { 3417 get metadata() { 3418 var stream = this.catDict.get('Metadata'); 3419 var metadata; 3420 if (stream && isDict(stream.dict)) { 3421 var type = stream.dict.get('Type'); 3422 var subtype = stream.dict.get('Subtype'); 3423 3424 if (isName(type) && isName(subtype) && 3425 type.name === 'Metadata' && subtype.name === 'XML') { 3426 metadata = stringToPDFString(bytesToString(stream.getBytes())); 3427 } 3428 } 3429 3430 return shadow(this, 'metadata', metadata); 3431 }, 3432 get toplevelPagesDict() { 3433 var pagesObj = this.catDict.get('Pages'); 3434 assertWellFormed(isDict(pagesObj), 'invalid top-level pages dictionary'); 3435 // shadow the prototype getter 3436 return shadow(this, 'toplevelPagesDict', pagesObj); 3437 }, 3438 get documentOutline() { 3439 var xref = this.xref; 3440 var obj = this.catDict.get('Outlines'); 3441 var root = { items: [] }; 3442 if (isDict(obj)) { 3443 obj = obj.getRaw('First'); 3444 var processed = new RefSet(); 3445 if (isRef(obj)) { 3446 var queue = [{obj: obj, parent: root}]; 3447 // to avoid recursion keeping track of the items 3448 // in the processed dictionary 3449 processed.put(obj); 3450 while (queue.length > 0) { 3451 var i = queue.shift(); 3452 var outlineDict = xref.fetchIfRef(i.obj); 3453 if (outlineDict === null) 3454 continue; 3455 if (!outlineDict.has('Title')) 3456 error('Invalid outline item'); 3457 var dest = outlineDict.get('A'); 3458 if (dest) 3459 dest = dest.get('D'); 3460 else if (outlineDict.has('Dest')) { 3461 dest = outlineDict.getRaw('Dest'); 3462 if (isName(dest)) 3463 dest = dest.name; 3464 } 3465 var title = outlineDict.get('Title'); 3466 var outlineItem = { 3467 dest: dest, 3468 title: stringToPDFString(title), 3469 color: outlineDict.get('C') || [0, 0, 0], 3470 count: outlineDict.get('Count'), 3471 bold: !!(outlineDict.get('F') & 2), 3472 italic: !!(outlineDict.get('F') & 1), 3473 items: [] 3474 }; 3475 i.parent.items.push(outlineItem); 3476 obj = outlineDict.getRaw('First'); 3477 if (isRef(obj) && !processed.has(obj)) { 3478 queue.push({obj: obj, parent: outlineItem}); 3479 processed.put(obj); 3480 } 3481 obj = outlineDict.getRaw('Next'); 3482 if (isRef(obj) && !processed.has(obj)) { 3483 queue.push({obj: obj, parent: i.parent}); 3484 processed.put(obj); 3485 } 3486 } 3487 } 3488 } 3489 obj = root.items.length > 0 ? root.items : null; 3490 return shadow(this, 'documentOutline', obj); 3491 }, 3492 get numPages() { 3493 var obj = this.toplevelPagesDict.get('Count'); 3494 assertWellFormed( 3495 isInt(obj), 3496 'page count in top level pages object is not an integer' 3497 ); 3498 // shadow the prototype getter 3499 return shadow(this, 'num', obj); 3500 }, 3501 traverseKids: function Catalog_traverseKids(pagesDict) { 3502 var pageCache = this.pageCache; 3503 var kids = pagesDict.get('Kids'); 3504 assertWellFormed(isArray(kids), 3505 'page dictionary kids object is not an array'); 3506 for (var i = 0, ii = kids.length; i < ii; ++i) { 3507 var kid = kids[i]; 3508 assertWellFormed(isRef(kid), 3509 'page dictionary kid is not a reference'); 3510 var obj = this.xref.fetch(kid); 3511 if (isDict(obj, 'Page') || (isDict(obj) && !obj.has('Kids'))) { 3512 pageCache.push(new Page(this.xref, pageCache.length, obj, kid)); 3513 } else { // must be a child page dictionary 3514 assertWellFormed( 3515 isDict(obj), 3516 'page dictionary kid reference points to wrong type of object' 3517 ); 3518 this.traverseKids(obj); 3519 } 3520 } 3521 }, 3522 get destinations() { 3523 function fetchDestination(dest) { 3524 return isDict(dest) ? dest.get('D') : dest; 3525 } 3526 3527 var xref = this.xref; 3528 var dests = {}, nameTreeRef, nameDictionaryRef; 3529 var obj = this.catDict.get('Names'); 3530 if (obj) 3531 nameTreeRef = obj.getRaw('Dests'); 3532 else if (this.catDict.has('Dests')) 3533 nameDictionaryRef = this.catDict.get('Dests'); 3534 3535 if (nameDictionaryRef) { 3536 // reading simple destination dictionary 3537 obj = nameDictionaryRef; 3538 obj.forEach(function catalogForEach(key, value) { 3539 if (!value) return; 3540 dests[key] = fetchDestination(value); 3541 }); 3542 } 3543 if (nameTreeRef) { 3544 // reading name tree 3545 var processed = new RefSet(); 3546 processed.put(nameTreeRef); 3547 var queue = [nameTreeRef]; 3548 while (queue.length > 0) { 3549 var i, n; 3550 obj = xref.fetch(queue.shift()); 3551 if (obj.has('Kids')) { 3552 var kids = obj.get('Kids'); 3553 for (i = 0, n = kids.length; i < n; i++) { 3554 var kid = kids[i]; 3555 if (processed.has(kid)) 3556 error('invalid destinations'); 3557 queue.push(kid); 3558 processed.put(kid); 3559 } 3560 continue; 3561 } 3562 var names = obj.get('Names'); 3563 for (i = 0, n = names.length; i < n; i += 2) { 3564 dests[names[i]] = fetchDestination(xref.fetchIfRef(names[i + 1])); 3565 } 3566 } 3567 } 3568 return shadow(this, 'destinations', dests); 3569 }, 3570 getPage: function Catalog_getPage(n) { 3571 var pageCache = this.pageCache; 3572 if (!pageCache) { 3573 pageCache = this.pageCache = []; 3574 this.traverseKids(this.toplevelPagesDict); 3575 } 3576 return this.pageCache[n - 1]; 3577 } 3578 }; 3579 3580 return Catalog; 3581 })(); 3582 3583 var XRef = (function XRefClosure() { 3584 function XRef(stream, startXRef, mainXRefEntriesOffset) { 3585 this.stream = stream; 3586 this.entries = []; 3587 this.xrefstms = {}; 3588 var trailerDict = this.readXRef(startXRef); 3589 trailerDict.assignXref(this); 3590 this.trailer = trailerDict; 3591 // prepare the XRef cache 3592 this.cache = []; 3593 3594 var encrypt = trailerDict.get('Encrypt'); 3595 if (encrypt) { 3596 var fileId = trailerDict.get('ID'); 3597 this.encrypt = new CipherTransformFactory(encrypt, 3598 fileId[0] /*, password */); 3599 } 3600 3601 // get the root dictionary (catalog) object 3602 if (!(this.root = trailerDict.get('Root'))) 3603 error('Invalid root reference'); 3604 } 3605 3606 XRef.prototype = { 3607 readXRefTable: function XRef_readXRefTable(parser) { 3608 // Example of cross-reference table: 3609 // xref 3610 // 0 1 <-- subsection header (first obj #, obj count) 3611 // 0000000000 65535 f <-- actual object (offset, generation #, f/n) 3612 // 23 2 <-- subsection header ... and so on ... 3613 // 0000025518 00002 n 3614 // 0000025635 00000 n 3615 // trailer 3616 // ... 3617 3618 // Outer loop is over subsection headers 3619 var obj; 3620 while (!isCmd(obj = parser.getObj(), 'trailer')) { 3621 var first = obj, 3622 count = parser.getObj(); 3623 3624 if (!isInt(first) || !isInt(count)) 3625 error('Invalid XRef table: wrong types in subsection header'); 3626 3627 // Inner loop is over objects themselves 3628 for (var i = 0; i < count; i++) { 3629 var entry = {}; 3630 entry.offset = parser.getObj(); 3631 entry.gen = parser.getObj(); 3632 var type = parser.getObj(); 3633 3634 if (isCmd(type, 'f')) 3635 entry.free = true; 3636 else if (isCmd(type, 'n')) 3637 entry.uncompressed = true; 3638 3639 // Validate entry obj 3640 if (!isInt(entry.offset) || !isInt(entry.gen) || 3641 !(entry.free || entry.uncompressed)) { 3642 error('Invalid entry in XRef subsection: ' + first + ', ' + count); 3643 } 3644 3645 if (!this.entries[i + first]) 3646 this.entries[i + first] = entry; 3647 } 3648 } 3649 3650 // Sanity check: as per spec, first object must be free 3651 if (this.entries[0] && !this.entries[0].free) 3652 error('Invalid XRef table: unexpected first object'); 3653 3654 // Sanity check 3655 if (!isCmd(obj, 'trailer')) 3656 error('Invalid XRef table: could not find trailer dictionary'); 3657 3658 // Read trailer dictionary, e.g. 3659 // trailer 3660 // << /Size 22 3661 // /Root 20R 3662 // /Info 10R 3663 // /ID [ <81b14aafa313db63dbd6f981e49f94f4> ] 3664 // >> 3665 // The parser goes through the entire stream << ... >> and provides 3666 // a getter interface for the key-value table 3667 var dict = parser.getObj(); 3668 if (!isDict(dict)) 3669 error('Invalid XRef table: could not parse trailer dictionary'); 3670 3671 return dict; 3672 }, 3673 readXRefStream: function XRef_readXRefStream(stream) { 3674 var streamParameters = stream.parameters; 3675 var byteWidths = streamParameters.get('W'); 3676 var range = streamParameters.get('Index'); 3677 if (!range) 3678 range = [0, streamParameters.get('Size')]; 3679 var i, j; 3680 while (range.length > 0) { 3681 var first = range[0], n = range[1]; 3682 if (!isInt(first) || !isInt(n)) 3683 error('Invalid XRef range fields: ' + first + ', ' + n); 3684 var typeFieldWidth = byteWidths[0]; 3685 var offsetFieldWidth = byteWidths[1]; 3686 var generationFieldWidth = byteWidths[2]; 3687 if (!isInt(typeFieldWidth) || !isInt(offsetFieldWidth) || 3688 !isInt(generationFieldWidth)) { 3689 error('Invalid XRef entry fields length: ' + first + ', ' + n); 3690 } 3691 for (i = 0; i < n; ++i) { 3692 var type = 0, offset = 0, generation = 0; 3693 for (j = 0; j < typeFieldWidth; ++j) 3694 type = (type << 8) | stream.getByte(); 3695 // if type field is absent, its default value = 1 3696 if (typeFieldWidth == 0) 3697 type = 1; 3698 for (j = 0; j < offsetFieldWidth; ++j) 3699 offset = (offset << 8) | stream.getByte(); 3700 for (j = 0; j < generationFieldWidth; ++j) 3701 generation = (generation << 8) | stream.getByte(); 3702 var entry = {}; 3703 entry.offset = offset; 3704 entry.gen = generation; 3705 switch (type) { 3706 case 0: 3707 entry.free = true; 3708 break; 3709 case 1: 3710 entry.uncompressed = true; 3711 break; 3712 case 2: 3713 break; 3714 default: 3715 error('Invalid XRef entry type: ' + type); 3716 } 3717 if (!this.entries[first + i]) 3718 this.entries[first + i] = entry; 3719 } 3720 range.splice(0, 2); 3721 } 3722 return streamParameters; 3723 }, 3724 indexObjects: function XRef_indexObjects() { 3725 // Simple scan through the PDF content to find objects, 3726 // trailers and XRef streams. 3727 function readToken(data, offset) { 3728 var token = '', ch = data[offset]; 3729 while (ch !== 13 && ch !== 10) { 3730 if (++offset >= data.length) 3731 break; 3732 token += String.fromCharCode(ch); 3733 ch = data[offset]; 3734 } 3735 return token; 3736 } 3737 function skipUntil(data, offset, what) { 3738 var length = what.length, dataLength = data.length; 3739 var skipped = 0; 3740 // finding byte sequence 3741 while (offset < dataLength) { 3742 var i = 0; 3743 while (i < length && data[offset + i] == what[i]) 3744 ++i; 3745 if (i >= length) 3746 break; // sequence found 3747 3748 offset++; 3749 skipped++; 3750 } 3751 return skipped; 3752 } 3753 var trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]); 3754 var startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114, 3755 101, 102]); 3756 var endobjBytes = new Uint8Array([101, 110, 100, 111, 98, 106]); 3757 var xrefBytes = new Uint8Array([47, 88, 82, 101, 102]); 3758 3759 var stream = this.stream; 3760 stream.pos = 0; 3761 var buffer = stream.getBytes(); 3762 var position = stream.start, length = buffer.length; 3763 var trailers = [], xrefStms = []; 3764 var state = 0; 3765 var currentToken; 3766 while (position < length) { 3767 var ch = buffer[position]; 3768 if (ch === 32 || ch === 9 || ch === 13 || ch === 10) { 3769 ++position; 3770 continue; 3771 } 3772 if (ch === 37) { // %-comment 3773 do { 3774 ++position; 3775 ch = buffer[position]; 3776 } while (ch !== 13 && ch !== 10); 3777 continue; 3778 } 3779 var token = readToken(buffer, position); 3780 var m; 3781 if (token === 'xref') { 3782 position += skipUntil(buffer, position, trailerBytes); 3783 trailers.push(position); 3784 position += skipUntil(buffer, position, startxrefBytes); 3785 } else if ((m = /^(\d+)\s+(\d+)\s+obj\b/.exec(token))) { 3786 this.entries[m[1]] = { 3787 offset: position, 3788 gen: m[2] | 0, 3789 uncompressed: true 3790 }; 3791 3792 var contentLength = skipUntil(buffer, position, endobjBytes) + 7; 3793 var content = buffer.subarray(position, position + contentLength); 3794 3795 // checking XRef stream suspect 3796 // (it shall have '/XRef' and next char is not a letter) 3797 var xrefTagOffset = skipUntil(content, 0, xrefBytes); 3798 if (xrefTagOffset < contentLength && 3799 content[xrefTagOffset + 5] < 64) { 3800 xrefStms.push(position); 3801 this.xrefstms[position] = 1; // don't read it recursively 3802 } 3803 3804 position += contentLength; 3805 } else 3806 position += token.length + 1; 3807 } 3808 // reading XRef streams 3809 for (var i = 0, ii = xrefStms.length; i < ii; ++i) { 3810 this.readXRef(xrefStms[i], true); 3811 } 3812 // finding main trailer 3813 var dict; 3814 for (var i = 0, ii = trailers.length; i < ii; ++i) { 3815 stream.pos = trailers[i]; 3816 var parser = new Parser(new Lexer(stream), true, null); 3817 var obj = parser.getObj(); 3818 if (!isCmd(obj, 'trailer')) 3819 continue; 3820 // read the trailer dictionary 3821 if (!isDict(dict = parser.getObj())) 3822 continue; 3823 // taking the first one with 'ID' 3824 if (dict.has('ID')) 3825 return dict; 3826 } 3827 // no tailer with 'ID', taking last one (if exists) 3828 if (dict) 3829 return dict; 3830 // nothing helps 3831 error('Invalid PDF structure'); 3832 }, 3833 readXRef: function XRef_readXRef(startXRef, recoveryMode) { 3834 var stream = this.stream; 3835 stream.pos = startXRef; 3836 3837 try { 3838 var parser = new Parser(new Lexer(stream), true, null); 3839 var obj = parser.getObj(); 3840 var dict; 3841 3842 // Get dictionary 3843 if (isCmd(obj, 'xref')) { 3844 // Parse end-of-file XRef 3845 dict = this.readXRefTable(parser); 3846 3847 // Recursively get other XRefs 'XRefStm', if any 3848 obj = dict.get('XRefStm'); 3849 if (isInt(obj)) { 3850 var pos = obj; 3851 // ignore previously loaded xref streams 3852 // (possible infinite recursion) 3853 if (!(pos in this.xrefstms)) { 3854 this.xrefstms[pos] = 1; 3855 this.readXRef(pos); 3856 } 3857 } 3858 } else if (isInt(obj)) { 3859 // Parse in-stream XRef 3860 if (!isInt(parser.getObj()) || 3861 !isCmd(parser.getObj(), 'obj') || 3862 !isStream(obj = parser.getObj())) { 3863 error('Invalid XRef stream'); 3864 } 3865 dict = this.readXRefStream(obj); 3866 if (!dict) 3867 error('Failed to read XRef stream'); 3868 } 3869 3870 // Recursively get previous dictionary, if any 3871 obj = dict.get('Prev'); 3872 if (isInt(obj)) 3873 this.readXRef(obj, recoveryMode); 3874 else if (isRef(obj)) { 3875 // The spec says Prev must not be a reference, i.e. "/Prev NNN" 3876 // This is a fallback for non-compliant PDFs, i.e. "/Prev NNN 0 R" 3877 this.readXRef(obj.num, recoveryMode); 3878 } 3879 3880 return dict; 3881 } catch (e) { 3882 log('(while reading XRef): ' + e); 3883 } 3884 3885 if (recoveryMode) 3886 return; 3887 3888 warn('Indexing all PDF objects'); 3889 return this.indexObjects(); 3890 }, 3891 getEntry: function XRef_getEntry(i) { 3892 var e = this.entries[i]; 3893 if (e === null) 3894 return null; 3895 return e.free ? null : e; // returns null is the entry is free 3896 }, 3897 fetchIfRef: function XRef_fetchIfRef(obj) { 3898 if (!isRef(obj)) 3899 return obj; 3900 return this.fetch(obj); 3901 }, 3902 fetch: function XRef_fetch(ref, suppressEncryption) { 3903 assertWellFormed(isRef(ref), 'ref object is not a reference'); 3904 var num = ref.num; 3905 if (num in this.cache) 3906 return this.cache[num]; 3907 3908 var e = this.getEntry(num); 3909 3910 // the referenced entry can be free 3911 if (e === null) 3912 return (this.cache[num] = e); 3913 3914 var gen = ref.gen; 3915 var stream, parser; 3916 if (e.uncompressed) { 3917 if (e.gen != gen) 3918 error('inconsistent generation in XRef'); 3919 stream = this.stream.makeSubStream(e.offset); 3920 parser = new Parser(new Lexer(stream), true, this); 3921 var obj1 = parser.getObj(); 3922 var obj2 = parser.getObj(); 3923 var obj3 = parser.getObj(); 3924 if (!isInt(obj1) || obj1 != num || 3925 !isInt(obj2) || obj2 != gen || 3926 !isCmd(obj3)) { 3927 error('bad XRef entry'); 3928 } 3929 if (!isCmd(obj3, 'obj')) { 3930 // some bad pdfs use "obj1234" and really mean 1234 3931 if (obj3.cmd.indexOf('obj') == 0) { 3932 num = parseInt(obj3.cmd.substring(3), 10); 3933 if (!isNaN(num)) 3934 return num; 3935 } 3936 error('bad XRef entry'); 3937 } 3938 if (this.encrypt && !suppressEncryption) { 3939 try { 3940 e = parser.getObj(this.encrypt.createCipherTransform(num, gen)); 3941 } catch (ex) { 3942 // almost all streams must be encrypted, but sometimes 3943 // they are not probably due to some broken generators 3944 // re-trying without encryption 3945 return this.fetch(ref, true); 3946 } 3947 } else { 3948 e = parser.getObj(); 3949 } 3950 // Don't cache streams since they are mutable (except images). 3951 if (!isStream(e) || e instanceof JpegStream) 3952 this.cache[num] = e; 3953 return e; 3954 } 3955 3956 // compressed entry 3957 stream = this.fetch(new Ref(e.offset, 0)); 3958 if (!isStream(stream)) 3959 error('bad ObjStm stream'); 3960 var first = stream.parameters.get('First'); 3961 var n = stream.parameters.get('N'); 3962 if (!isInt(first) || !isInt(n)) { 3963 error('invalid first and n parameters for ObjStm stream'); 3964 } 3965 parser = new Parser(new Lexer(stream), false, this); 3966 var i, entries = [], nums = []; 3967 // read the object numbers to populate cache 3968 for (i = 0; i < n; ++i) { 3969 num = parser.getObj(); 3970 if (!isInt(num)) { 3971 error('invalid object number in the ObjStm stream: ' + num); 3972 } 3973 nums.push(num); 3974 var offset = parser.getObj(); 3975 if (!isInt(offset)) { 3976 error('invalid object offset in the ObjStm stream: ' + offset); 3977 } 3978 } 3979 // read stream objects for cache 3980 for (i = 0; i < n; ++i) { 3981 entries.push(parser.getObj()); 3982 this.cache[nums[i]] = entries[i]; 3983 } 3984 e = entries[e.gen]; 3985 if (!e) { 3986 error('bad XRef entry for compressed object'); 3987 } 3988 return e; 3989 }, 3990 getCatalogObj: function XRef_getCatalogObj() { 3991 return this.root; 3992 } 3993 }; 3994 3995 return XRef; 3996 })(); 3997 3998 /** 3999 * A PDF document and page is built of many objects. E.g. there are objects 4000 * for fonts, images, rendering code and such. These objects might get processed 4001 * inside of a worker. The `PDFObjects` implements some basic functions to 4002 * manage these objects. 4003 */ 4004 var PDFObjects = (function PDFObjectsClosure() { 4005 function PDFObjects() { 4006 this.objs = {}; 4007 } 4008 4009 PDFObjects.prototype = { 4010 objs: null, 4011 4012 /** 4013 * Internal function. 4014 * Ensures there is an object defined for `objId`. Stores `data` on the 4015 * object *if* it is created. 4016 */ 4017 ensureObj: function PDFObjects_ensureObj(objId, data) { 4018 if (this.objs[objId]) 4019 return this.objs[objId]; 4020 return this.objs[objId] = new Promise(objId, data); 4021 }, 4022 4023 /** 4024 * If called *without* callback, this returns the data of `objId` but the 4025 * object needs to be resolved. If it isn't, this function throws. 4026 * 4027 * If called *with* a callback, the callback is called with the data of the 4028 * object once the object is resolved. That means, if you call this 4029 * function and the object is already resolved, the callback gets called 4030 * right away. 4031 */ 4032 get: function PDFObjects_get(objId, callback) { 4033 // If there is a callback, then the get can be async and the object is 4034 // not required to be resolved right now 4035 if (callback) { 4036 this.ensureObj(objId).then(callback); 4037 return null; 4038 } 4039 4040 // If there isn't a callback, the user expects to get the resolved data 4041 // directly. 4042 var obj = this.objs[objId]; 4043 4044 // If there isn't an object yet or the object isn't resolved, then the 4045 // data isn't ready yet! 4046 if (!obj || !obj.isResolved) 4047 error('Requesting object that isn\'t resolved yet ' + objId); 4048 4049 return obj.data; 4050 }, 4051 4052 /** 4053 * Resolves the object `objId` with optional `data`. 4054 */ 4055 resolve: function PDFObjects_resolve(objId, data) { 4056 var objs = this.objs; 4057 4058 // In case there is a promise already on this object, just resolve it. 4059 if (objs[objId]) { 4060 objs[objId].resolve(data); 4061 } else { 4062 this.ensureObj(objId, data); 4063 } 4064 }, 4065 4066 onData: function PDFObjects_onData(objId, callback) { 4067 this.ensureObj(objId).onData(callback); 4068 }, 4069 4070 isResolved: function PDFObjects_isResolved(objId) { 4071 var objs = this.objs; 4072 if (!objs[objId]) { 4073 return false; 4074 } else { 4075 return objs[objId].isResolved; 4076 } 4077 }, 4078 4079 hasData: function PDFObjects_hasData(objId) { 4080 var objs = this.objs; 4081 if (!objs[objId]) { 4082 return false; 4083 } else { 4084 return objs[objId].hasData; 4085 } 4086 }, 4087 4088 /** 4089 * Sets the data of an object but *doesn't* resolve it. 4090 */ 4091 setData: function PDFObjects_setData(objId, data) { 4092 // Watchout! If you call `this.ensureObj(objId, data)` you're going to 4093 // create a *resolved* promise which shouldn't be the case! 4094 this.ensureObj(objId).data = data; 4095 } 4096 }; 4097 return PDFObjects; 4098 })(); 4099 4100 4101 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 4102 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ 4103 4104 'use strict'; 4105 4106 var PDFFunction = (function PDFFunctionClosure() { 4107 var CONSTRUCT_SAMPLED = 0; 4108 var CONSTRUCT_INTERPOLATED = 2; 4109 var CONSTRUCT_STICHED = 3; 4110 var CONSTRUCT_POSTSCRIPT = 4; 4111 4112 return { 4113 getSampleArray: function PDFFunction_getSampleArray(size, outputSize, bps, 4114 str) { 4115 var length = 1; 4116 for (var i = 0, ii = size.length; i < ii; i++) 4117 length *= size[i]; 4118 length *= outputSize; 4119 4120 var array = []; 4121 var codeSize = 0; 4122 var codeBuf = 0; 4123 // 32 is a valid bps so shifting won't work 4124 var sampleMul = 1.0 / (Math.pow(2.0, bps) - 1); 4125 4126 var strBytes = str.getBytes((length * bps + 7) / 8); 4127 var strIdx = 0; 4128 for (var i = 0; i < length; i++) { 4129 while (codeSize < bps) { 4130 codeBuf <<= 8; 4131 codeBuf |= strBytes[strIdx++]; 4132 codeSize += 8; 4133 } 4134 codeSize -= bps; 4135 array.push((codeBuf >> codeSize) * sampleMul); 4136 codeBuf &= (1 << codeSize) - 1; 4137 } 4138 return array; 4139 }, 4140 4141 getIR: function PDFFunction_getIR(xref, fn) { 4142 var dict = fn.dict; 4143 if (!dict) 4144 dict = fn; 4145 4146 var types = [this.constructSampled, 4147 null, 4148 this.constructInterpolated, 4149 this.constructStiched, 4150 this.constructPostScript]; 4151 4152 var typeNum = dict.get('FunctionType'); 4153 var typeFn = types[typeNum]; 4154 if (!typeFn) 4155 error('Unknown type of function'); 4156 4157 return typeFn.call(this, fn, dict, xref); 4158 }, 4159 4160 fromIR: function PDFFunction_fromIR(IR) { 4161 var type = IR[0]; 4162 switch (type) { 4163 case CONSTRUCT_SAMPLED: 4164 return this.constructSampledFromIR(IR); 4165 case CONSTRUCT_INTERPOLATED: 4166 return this.constructInterpolatedFromIR(IR); 4167 case CONSTRUCT_STICHED: 4168 return this.constructStichedFromIR(IR); 4169 case CONSTRUCT_POSTSCRIPT: 4170 default: 4171 return this.constructPostScriptFromIR(IR); 4172 } 4173 }, 4174 4175 parse: function PDFFunction_parse(xref, fn) { 4176 var IR = this.getIR(xref, fn); 4177 return this.fromIR(IR); 4178 }, 4179 4180 constructSampled: function PDFFunction_constructSampled(str, dict) { 4181 function toMultiArray(arr) { 4182 var inputLength = arr.length; 4183 var outputLength = arr.length / 2; 4184 var out = []; 4185 var index = 0; 4186 for (var i = 0; i < inputLength; i += 2) { 4187 out[index] = [arr[i], arr[i + 1]]; 4188 ++index; 4189 } 4190 return out; 4191 } 4192 var domain = dict.get('Domain'); 4193 var range = dict.get('Range'); 4194 4195 if (!domain || !range) 4196 error('No domain or range'); 4197 4198 var inputSize = domain.length / 2; 4199 var outputSize = range.length / 2; 4200 4201 domain = toMultiArray(domain); 4202 range = toMultiArray(range); 4203 4204 var size = dict.get('Size'); 4205 var bps = dict.get('BitsPerSample'); 4206 var order = dict.get('Order'); 4207 if (!order) 4208 order = 1; 4209 if (order !== 1) 4210 error('No support for cubic spline interpolation: ' + order); 4211 4212 var encode = dict.get('Encode'); 4213 if (!encode) { 4214 encode = []; 4215 for (var i = 0; i < inputSize; ++i) { 4216 encode.push(0); 4217 encode.push(size[i] - 1); 4218 } 4219 } 4220 encode = toMultiArray(encode); 4221 4222 var decode = dict.get('Decode'); 4223 if (!decode) 4224 decode = range; 4225 else 4226 decode = toMultiArray(decode); 4227 4228 var samples = this.getSampleArray(size, outputSize, bps, str); 4229 4230 return [ 4231 CONSTRUCT_SAMPLED, inputSize, domain, encode, decode, samples, size, 4232 outputSize, Math.pow(2, bps) - 1, range 4233 ]; 4234 }, 4235 4236 constructSampledFromIR: function PDFFunction_constructSampledFromIR(IR) { 4237 // See chapter 3, page 109 of the PDF reference 4238 function interpolate(x, xmin, xmax, ymin, ymax) { 4239 return ymin + ((x - xmin) * ((ymax - ymin) / (xmax - xmin))); 4240 } 4241 4242 return function constructSampledFromIRResult(args) { 4243 // See chapter 3, page 110 of the PDF reference. 4244 var m = IR[1]; 4245 var domain = IR[2]; 4246 var encode = IR[3]; 4247 var decode = IR[4]; 4248 var samples = IR[5]; 4249 var size = IR[6]; 4250 var n = IR[7]; 4251 var mask = IR[8]; 4252 var range = IR[9]; 4253 4254 if (m != args.length) 4255 error('Incorrect number of arguments: ' + inputSize + ' != ' + 4256 args.length); 4257 4258 var x = args; 4259 4260 // Building the cube vertices: its part and sample index 4261 // http://rjwagner49.com/Mathematics/Interpolation.pdf 4262 var cubeVertices = 1 << m; 4263 var cubeN = new Float64Array(cubeVertices); 4264 var cubeVertex = new Uint32Array(cubeVertices); 4265 for (var j = 0; j < cubeVertices; j++) 4266 cubeN[j] = 1; 4267 4268 var k = n, pos = 1; 4269 // Map x_i to y_j for 0 <= i < m using the sampled function. 4270 for (var i = 0; i < m; ++i) { 4271 // x_i' = min(max(x_i, Domain_2i), Domain_2i+1) 4272 var domain_2i = domain[i][0]; 4273 var domain_2i_1 = domain[i][1]; 4274 var xi = Math.min(Math.max(x[i], domain_2i), domain_2i_1); 4275 4276 // e_i = Interpolate(x_i', Domain_2i, Domain_2i+1, 4277 // Encode_2i, Encode_2i+1) 4278 var e = interpolate(xi, domain_2i, domain_2i_1, 4279 encode[i][0], encode[i][1]); 4280 4281 // e_i' = min(max(e_i, 0), Size_i - 1) 4282 var size_i = size[i]; 4283 e = Math.min(Math.max(e, 0), size_i - 1); 4284 4285 // Adjusting the cube: N and vertex sample index 4286 var e0 = e < size_i - 1 ? Math.floor(e) : e - 1; // e1 = e0 + 1; 4287 var n0 = e0 + 1 - e; // (e1 - e) / (e1 - e0); 4288 var n1 = e - e0; // (e - e0) / (e1 - e0); 4289 var offset0 = e0 * k; 4290 var offset1 = offset0 + k; // e1 * k 4291 for (var j = 0; j < cubeVertices; j++) { 4292 if (j & pos) { 4293 cubeN[j] *= n1; 4294 cubeVertex[j] += offset1; 4295 } else { 4296 cubeN[j] *= n0; 4297 cubeVertex[j] += offset0; 4298 } 4299 } 4300 4301 k *= size_i; 4302 pos <<= 1; 4303 } 4304 4305 var y = new Float64Array(n); 4306 for (var j = 0; j < n; ++j) { 4307 // Sum all cube vertices' samples portions 4308 var rj = 0; 4309 for (var i = 0; i < cubeVertices; i++) 4310 rj += samples[cubeVertex[i] + j] * cubeN[i]; 4311 4312 // r_j' = Interpolate(r_j, 0, 2^BitsPerSample - 1, 4313 // Decode_2j, Decode_2j+1) 4314 rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]); 4315 4316 // y_j = min(max(r_j, range_2j), range_2j+1) 4317 y[j] = Math.min(Math.max(rj, range[j][0]), range[j][1]); 4318 } 4319 4320 return y; 4321 } 4322 }, 4323 4324 constructInterpolated: function PDFFunction_constructInterpolated(str, 4325 dict) { 4326 var c0 = dict.get('C0') || [0]; 4327 var c1 = dict.get('C1') || [1]; 4328 var n = dict.get('N'); 4329 4330 if (!isArray(c0) || !isArray(c1)) 4331 error('Illegal dictionary for interpolated function'); 4332 4333 var length = c0.length; 4334 var diff = []; 4335 for (var i = 0; i < length; ++i) 4336 diff.push(c1[i] - c0[i]); 4337 4338 return [CONSTRUCT_INTERPOLATED, c0, diff, n]; 4339 }, 4340 4341 constructInterpolatedFromIR: 4342 function PDFFunction_constructInterpolatedFromIR(IR) { 4343 var c0 = IR[1]; 4344 var diff = IR[2]; 4345 var n = IR[3]; 4346 4347 var length = diff.length; 4348 4349 return function constructInterpolatedFromIRResult(args) { 4350 var x = n == 1 ? args[0] : Math.pow(args[0], n); 4351 4352 var out = []; 4353 for (var j = 0; j < length; ++j) 4354 out.push(c0[j] + (x * diff[j])); 4355 4356 return out; 4357 4358 } 4359 }, 4360 4361 constructStiched: function PDFFunction_constructStiched(fn, dict, xref) { 4362 var domain = dict.get('Domain'); 4363 4364 if (!domain) 4365 error('No domain'); 4366 4367 var inputSize = domain.length / 2; 4368 if (inputSize != 1) 4369 error('Bad domain for stiched function'); 4370 4371 var fnRefs = dict.get('Functions'); 4372 var fns = []; 4373 for (var i = 0, ii = fnRefs.length; i < ii; ++i) 4374 fns.push(PDFFunction.getIR(xref, xref.fetchIfRef(fnRefs[i]))); 4375 4376 var bounds = dict.get('Bounds'); 4377 var encode = dict.get('Encode'); 4378 4379 return [CONSTRUCT_STICHED, domain, bounds, encode, fns]; 4380 }, 4381 4382 constructStichedFromIR: function PDFFunction_constructStichedFromIR(IR) { 4383 var domain = IR[1]; 4384 var bounds = IR[2]; 4385 var encode = IR[3]; 4386 var fnsIR = IR[4]; 4387 var fns = []; 4388 4389 for (var i = 0, ii = fnsIR.length; i < ii; i++) { 4390 fns.push(PDFFunction.fromIR(fnsIR[i])); 4391 } 4392 4393 return function constructStichedFromIRResult(args) { 4394 var clip = function constructStichedFromIRClip(v, min, max) { 4395 if (v > max) 4396 v = max; 4397 else if (v < min) 4398 v = min; 4399 return v; 4400 }; 4401 4402 // clip to domain 4403 var v = clip(args[0], domain[0], domain[1]); 4404 // calulate which bound the value is in 4405 for (var i = 0, ii = bounds.length; i < ii; ++i) { 4406 if (v < bounds[i]) 4407 break; 4408 } 4409 4410 // encode value into domain of function 4411 var dmin = domain[0]; 4412 if (i > 0) 4413 dmin = bounds[i - 1]; 4414 var dmax = domain[1]; 4415 if (i < bounds.length) 4416 dmax = bounds[i]; 4417 4418 var rmin = encode[2 * i]; 4419 var rmax = encode[2 * i + 1]; 4420 4421 var v2 = rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin); 4422 4423 // call the appropropriate function 4424 return fns[i]([v2]); 4425 }; 4426 }, 4427 4428 constructPostScript: function PDFFunction_constructPostScript(fn, dict, 4429 xref) { 4430 var domain = dict.get('Domain'); 4431 var range = dict.get('Range'); 4432 4433 if (!domain) 4434 error('No domain.'); 4435 4436 if (!range) 4437 error('No range.'); 4438 4439 var lexer = new PostScriptLexer(fn); 4440 var parser = new PostScriptParser(lexer); 4441 var code = parser.parse(); 4442 4443 return [CONSTRUCT_POSTSCRIPT, domain, range, code]; 4444 }, 4445 4446 constructPostScriptFromIR: function PDFFunction_constructPostScriptFromIR( 4447 IR) { 4448 var domain = IR[1]; 4449 var range = IR[2]; 4450 var code = IR[3]; 4451 var numOutputs = range.length / 2; 4452 var evaluator = new PostScriptEvaluator(code); 4453 // Cache the values for a big speed up, the cache size is limited though 4454 // since the number of possible values can be huge from a PS function. 4455 var cache = new FunctionCache(); 4456 return function constructPostScriptFromIRResult(args) { 4457 var initialStack = []; 4458 for (var i = 0, ii = (domain.length / 2); i < ii; ++i) { 4459 initialStack.push(args[i]); 4460 } 4461 4462 var key = initialStack.join('_'); 4463 if (cache.has(key)) 4464 return cache.get(key); 4465 4466 var stack = evaluator.execute(initialStack); 4467 var transformed = []; 4468 for (i = numOutputs - 1; i >= 0; --i) { 4469 var out = stack.pop(); 4470 var rangeIndex = 2 * i; 4471 if (out < range[rangeIndex]) 4472 out = range[rangeIndex]; 4473 else if (out > range[rangeIndex + 1]) 4474 out = range[rangeIndex + 1]; 4475 transformed[i] = out; 4476 } 4477 cache.set(key, transformed); 4478 return transformed; 4479 }; 4480 } 4481 }; 4482 })(); 4483 4484 var FunctionCache = (function FunctionCacheClosure() { 4485 // Of 10 PDF's with type4 functions the maxium number of distinct values seen 4486 // was 256. This still may need some tweaking in the future though. 4487 var MAX_CACHE_SIZE = 1024; 4488 function FunctionCache() { 4489 this.cache = {}; 4490 this.total = 0; 4491 } 4492 FunctionCache.prototype = { 4493 has: function FunctionCache_has(key) { 4494 return key in this.cache; 4495 }, 4496 get: function FunctionCache_get(key) { 4497 return this.cache[key]; 4498 }, 4499 set: function FunctionCache_set(key, value) { 4500 if (this.total < MAX_CACHE_SIZE) { 4501 this.cache[key] = value; 4502 this.total++; 4503 } 4504 } 4505 }; 4506 return FunctionCache; 4507 })(); 4508 4509 var PostScriptStack = (function PostScriptStackClosure() { 4510 var MAX_STACK_SIZE = 100; 4511 function PostScriptStack(initialStack) { 4512 this.stack = initialStack || []; 4513 } 4514 4515 PostScriptStack.prototype = { 4516 push: function PostScriptStack_push(value) { 4517 if (this.stack.length >= MAX_STACK_SIZE) 4518 error('PostScript function stack overflow.'); 4519 this.stack.push(value); 4520 }, 4521 pop: function PostScriptStack_pop() { 4522 if (this.stack.length <= 0) 4523 error('PostScript function stack underflow.'); 4524 return this.stack.pop(); 4525 }, 4526 copy: function PostScriptStack_copy(n) { 4527 if (this.stack.length + n >= MAX_STACK_SIZE) 4528 error('PostScript function stack overflow.'); 4529 var stack = this.stack; 4530 for (var i = stack.length - n, j = n - 1; j >= 0; j--, i++) 4531 stack.push(stack[i]); 4532 }, 4533 index: function PostScriptStack_index(n) { 4534 this.push(this.stack[this.stack.length - n - 1]); 4535 }, 4536 // rotate the last n stack elements p times 4537 roll: function PostScriptStack_roll(n, p) { 4538 var stack = this.stack; 4539 var l = stack.length - n; 4540 var r = stack.length - 1, c = l + (p - Math.floor(p / n) * n), i, j, t; 4541 for (i = l, j = r; i < j; i++, j--) { 4542 t = stack[i]; stack[i] = stack[j]; stack[j] = t; 4543 } 4544 for (i = l, j = c - 1; i < j; i++, j--) { 4545 t = stack[i]; stack[i] = stack[j]; stack[j] = t; 4546 } 4547 for (i = c, j = r; i < j; i++, j--) { 4548 t = stack[i]; stack[i] = stack[j]; stack[j] = t; 4549 } 4550 } 4551 }; 4552 return PostScriptStack; 4553 })(); 4554 var PostScriptEvaluator = (function PostScriptEvaluatorClosure() { 4555 function PostScriptEvaluator(operators, operands) { 4556 this.operators = operators; 4557 this.operands = operands; 4558 } 4559 PostScriptEvaluator.prototype = { 4560 execute: function PostScriptEvaluator_execute(initialStack) { 4561 var stack = new PostScriptStack(initialStack); 4562 var counter = 0; 4563 var operators = this.operators; 4564 var length = operators.length; 4565 var operator, a, b; 4566 while (counter < length) { 4567 operator = operators[counter++]; 4568 if (typeof operator == 'number') { 4569 // Operator is really an operand and should be pushed to the stack. 4570 stack.push(operator); 4571 continue; 4572 } 4573 switch (operator) { 4574 // non standard ps operators 4575 case 'jz': // jump if false 4576 b = stack.pop(); 4577 a = stack.pop(); 4578 if (!a) 4579 counter = b; 4580 break; 4581 case 'j': // jump 4582 a = stack.pop(); 4583 counter = a; 4584 break; 4585 4586 // all ps operators in alphabetical order (excluding if/ifelse) 4587 case 'abs': 4588 a = stack.pop(); 4589 stack.push(Math.abs(a)); 4590 break; 4591 case 'add': 4592 b = stack.pop(); 4593 a = stack.pop(); 4594 stack.push(a + b); 4595 break; 4596 case 'and': 4597 b = stack.pop(); 4598 a = stack.pop(); 4599 if (isBool(a) && isBool(b)) 4600 stack.push(a && b); 4601 else 4602 stack.push(a & b); 4603 break; 4604 case 'atan': 4605 a = stack.pop(); 4606 stack.push(Math.atan(a)); 4607 break; 4608 case 'bitshift': 4609 b = stack.pop(); 4610 a = stack.pop(); 4611 if (a > 0) 4612 stack.push(a << b); 4613 else 4614 stack.push(a >> b); 4615 break; 4616 case 'ceiling': 4617 a = stack.pop(); 4618 stack.push(Math.ceil(a)); 4619 break; 4620 case 'copy': 4621 a = stack.pop(); 4622 stack.copy(a); 4623 break; 4624 case 'cos': 4625 a = stack.pop(); 4626 stack.push(Math.cos(a)); 4627 break; 4628 case 'cvi': 4629 a = stack.pop() | 0; 4630 stack.push(a); 4631 break; 4632 case 'cvr': 4633 // noop 4634 break; 4635 case 'div': 4636 b = stack.pop(); 4637 a = stack.pop(); 4638 stack.push(a / b); 4639 break; 4640 case 'dup': 4641 stack.copy(1); 4642 break; 4643 case 'eq': 4644 b = stack.pop(); 4645 a = stack.pop(); 4646 stack.push(a == b); 4647 break; 4648 case 'exch': 4649 stack.roll(2, 1); 4650 break; 4651 case 'exp': 4652 b = stack.pop(); 4653 a = stack.pop(); 4654 stack.push(Math.pow(a, b)); 4655 break; 4656 case 'false': 4657 stack.push(false); 4658 break; 4659 case 'floor': 4660 a = stack.pop(); 4661 stack.push(Math.floor(a)); 4662 break; 4663 case 'ge': 4664 b = stack.pop(); 4665 a = stack.pop(); 4666 stack.push(a >= b); 4667 break; 4668 case 'gt': 4669 b = stack.pop(); 4670 a = stack.pop(); 4671 stack.push(a > b); 4672 break; 4673 case 'idiv': 4674 b = stack.pop(); 4675 a = stack.pop(); 4676 stack.push((a / b) | 0); 4677 break; 4678 case 'index': 4679 a = stack.pop(); 4680 stack.index(a); 4681 break; 4682 case 'le': 4683 b = stack.pop(); 4684 a = stack.pop(); 4685 stack.push(a <= b); 4686 break; 4687 case 'ln': 4688 a = stack.pop(); 4689 stack.push(Math.log(a)); 4690 break; 4691 case 'log': 4692 a = stack.pop(); 4693 stack.push(Math.log(a) / Math.LN10); 4694 break; 4695 case 'lt': 4696 b = stack.pop(); 4697 a = stack.pop(); 4698 stack.push(a < b); 4699 break; 4700 case 'mod': 4701 b = stack.pop(); 4702 a = stack.pop(); 4703 stack.push(a % b); 4704 break; 4705 case 'mul': 4706 b = stack.pop(); 4707 a = stack.pop(); 4708 stack.push(a * b); 4709 break; 4710 case 'ne': 4711 b = stack.pop(); 4712 a = stack.pop(); 4713 stack.push(a != b); 4714 break; 4715 case 'neg': 4716 a = stack.pop(); 4717 stack.push(-b); 4718 break; 4719 case 'not': 4720 a = stack.pop(); 4721 if (isBool(a) && isBool(b)) 4722 stack.push(a && b); 4723 else 4724 stack.push(a & b); 4725 break; 4726 case 'or': 4727 b = stack.pop(); 4728 a = stack.pop(); 4729 if (isBool(a) && isBool(b)) 4730 stack.push(a || b); 4731 else 4732 stack.push(a | b); 4733 break; 4734 case 'pop': 4735 stack.pop(); 4736 break; 4737 case 'roll': 4738 b = stack.pop(); 4739 a = stack.pop(); 4740 stack.roll(a, b); 4741 break; 4742 case 'round': 4743 a = stack.pop(); 4744 stack.push(Math.round(a)); 4745 break; 4746 case 'sin': 4747 a = stack.pop(); 4748 stack.push(Math.sin(a)); 4749 break; 4750 case 'sqrt': 4751 a = stack.pop(); 4752 stack.push(Math.sqrt(a)); 4753 break; 4754 case 'sub': 4755 b = stack.pop(); 4756 a = stack.pop(); 4757 stack.push(a - b); 4758 break; 4759 case 'true': 4760 stack.push(true); 4761 break; 4762 case 'truncate': 4763 a = stack.pop(); 4764 a = a < 0 ? Math.ceil(a) : Math.floor(a); 4765 stack.push(a); 4766 break; 4767 case 'xor': 4768 b = stack.pop(); 4769 a = stack.pop(); 4770 if (isBool(a) && isBool(b)) 4771 stack.push(a != b); 4772 else 4773 stack.push(a ^ b); 4774 break; 4775 default: 4776 error('Unknown operator ' + operator); 4777 break; 4778 } 4779 } 4780 return stack.stack; 4781 } 4782 }; 4783 return PostScriptEvaluator; 4784 })(); 4785 4786 var PostScriptParser = (function PostScriptParserClosure() { 4787 function PostScriptParser(lexer) { 4788 this.lexer = lexer; 4789 this.operators = []; 4790 this.token; 4791 this.prev; 4792 } 4793 PostScriptParser.prototype = { 4794 nextToken: function PostScriptParser_nextToken() { 4795 this.prev = this.token; 4796 this.token = this.lexer.getToken(); 4797 }, 4798 accept: function PostScriptParser_accept(type) { 4799 if (this.token.type == type) { 4800 this.nextToken(); 4801 return true; 4802 } 4803 return false; 4804 }, 4805 expect: function PostScriptParser_expect(type) { 4806 if (this.accept(type)) 4807 return true; 4808 error('Unexpected symbol: found ' + this.token.type + ' expected ' + 4809 type + '.'); 4810 }, 4811 parse: function PostScriptParser_parse() { 4812 this.nextToken(); 4813 this.expect(PostScriptTokenTypes.LBRACE); 4814 this.parseBlock(); 4815 this.expect(PostScriptTokenTypes.RBRACE); 4816 return this.operators; 4817 }, 4818 parseBlock: function PostScriptParser_parseBlock() { 4819 while (true) { 4820 if (this.accept(PostScriptTokenTypes.NUMBER)) { 4821 this.operators.push(this.prev.value); 4822 } else if (this.accept(PostScriptTokenTypes.OPERATOR)) { 4823 this.operators.push(this.prev.value); 4824 } else if (this.accept(PostScriptTokenTypes.LBRACE)) { 4825 this.parseCondition(); 4826 } else { 4827 return; 4828 } 4829 } 4830 }, 4831 parseCondition: function PostScriptParser_parseCondition() { 4832 // Add two place holders that will be updated later 4833 var conditionLocation = this.operators.length; 4834 this.operators.push(null, null); 4835 4836 this.parseBlock(); 4837 this.expect(PostScriptTokenTypes.RBRACE); 4838 if (this.accept(PostScriptTokenTypes.IF)) { 4839 // The true block is right after the 'if' so it just falls through on 4840 // true else it jumps and skips the true block. 4841 this.operators[conditionLocation] = this.operators.length; 4842 this.operators[conditionLocation + 1] = 'jz'; 4843 } else if (this.accept(PostScriptTokenTypes.LBRACE)) { 4844 var jumpLocation = this.operators.length; 4845 this.operators.push(null, null); 4846 var endOfTrue = this.operators.length; 4847 this.parseBlock(); 4848 this.expect(PostScriptTokenTypes.RBRACE); 4849 this.expect(PostScriptTokenTypes.IFELSE); 4850 // The jump is added at the end of the true block to skip the false 4851 // block. 4852 this.operators[jumpLocation] = this.operators.length; 4853 this.operators[jumpLocation + 1] = 'j'; 4854 4855 this.operators[conditionLocation] = endOfTrue; 4856 this.operators[conditionLocation + 1] = 'jz'; 4857 } else { 4858 error('PS Function: error parsing conditional.'); 4859 } 4860 } 4861 }; 4862 return PostScriptParser; 4863 })(); 4864 4865 var PostScriptTokenTypes = { 4866 LBRACE: 0, 4867 RBRACE: 1, 4868 NUMBER: 2, 4869 OPERATOR: 3, 4870 IF: 4, 4871 IFELSE: 5 4872 }; 4873 4874 var PostScriptToken = (function PostScriptTokenClosure() { 4875 function PostScriptToken(type, value) { 4876 this.type = type; 4877 this.value = value; 4878 } 4879 4880 var opCache = {}; 4881 4882 PostScriptToken.getOperator = function PostScriptToken_getOperator(op) { 4883 var opValue = opCache[op]; 4884 if (opValue) 4885 return opValue; 4886 4887 return opCache[op] = new PostScriptToken(PostScriptTokenTypes.OPERATOR, op); 4888 }; 4889 4890 PostScriptToken.LBRACE = new PostScriptToken(PostScriptTokenTypes.LBRACE, 4891 '{'); 4892 PostScriptToken.RBRACE = new PostScriptToken(PostScriptTokenTypes.RBRACE, 4893 '}'); 4894 PostScriptToken.IF = new PostScriptToken(PostScriptTokenTypes.IF, 'IF'); 4895 PostScriptToken.IFELSE = new PostScriptToken(PostScriptTokenTypes.IFELSE, 4896 'IFELSE'); 4897 return PostScriptToken; 4898 })(); 4899 4900 var PostScriptLexer = (function PostScriptLexerClosure() { 4901 function PostScriptLexer(stream) { 4902 this.stream = stream; 4903 } 4904 PostScriptLexer.prototype = { 4905 getToken: function PostScriptLexer_getToken() { 4906 var s = ''; 4907 var ch; 4908 var comment = false; 4909 var stream = this.stream; 4910 4911 // skip comments 4912 while (true) { 4913 if (!(ch = stream.getChar())) 4914 return EOF; 4915 4916 if (comment) { 4917 if (ch == '\x0a' || ch == '\x0d') 4918 comment = false; 4919 } else if (ch == '%') { 4920 comment = true; 4921 } else if (!Lexer.isSpace(ch)) { 4922 break; 4923 } 4924 } 4925 switch (ch) { 4926 case '0': case '1': case '2': case '3': case '4': 4927 case '5': case '6': case '7': case '8': case '9': 4928 case '+': case '-': case '.': 4929 return new PostScriptToken(PostScriptTokenTypes.NUMBER, 4930 this.getNumber(ch)); 4931 case '{': 4932 return PostScriptToken.LBRACE; 4933 case '}': 4934 return PostScriptToken.RBRACE; 4935 } 4936 // operator 4937 var str = ch.toLowerCase(); 4938 while (true) { 4939 ch = stream.lookChar(); 4940 if (ch === null) 4941 break; 4942 ch = ch.toLowerCase(); 4943 if (ch >= 'a' && ch <= 'z') 4944 str += ch; 4945 else 4946 break; 4947 stream.skip(); 4948 } 4949 switch (str) { 4950 case 'if': 4951 return PostScriptToken.IF; 4952 case 'ifelse': 4953 return PostScriptToken.IFELSE; 4954 default: 4955 return PostScriptToken.getOperator(str); 4956 } 4957 }, 4958 getNumber: function PostScriptLexer_getNumber(ch) { 4959 var str = ch; 4960 var stream = this.stream; 4961 while (true) { 4962 ch = stream.lookChar(); 4963 if ((ch >= '0' && ch <= '9') || ch == '-' || ch == '.') 4964 str += ch; 4965 else 4966 break; 4967 stream.skip(); 4968 } 4969 var value = parseFloat(str); 4970 if (isNaN(value)) 4971 error('Invalid floating point number: ' + value); 4972 return value; 4973 } 4974 }; 4975 return PostScriptLexer; 4976 })(); 4977 4978 4979 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 4980 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ 4981 4982 'use strict'; 4983 4984 var ISOAdobeCharset = [ 4985 '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 4986 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright', 4987 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero', 4988 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 4989 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 4990 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 4991 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 4992 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore', 4993 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 4994 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 4995 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent', 4996 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 4997 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 4998 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl', 4999 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 5000 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 5001 'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde', 5002 'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla', 5003 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine', 5004 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash', 5005 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu', 5006 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter', 5007 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior', 5008 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright', 5009 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde', 5010 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute', 5011 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex', 5012 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex', 5013 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute', 5014 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla', 5015 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex', 5016 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis', 5017 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis', 5018 'ugrave', 'yacute', 'ydieresis', 'zcaron' 5019 ]; 5020 5021 var ExpertCharset = [ 5022 '.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle', 5023 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 5024 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 5025 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 5026 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 5027 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 5028 'colon', 'semicolon', 'commasuperior', 'threequartersemdash', 5029 'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior', 5030 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 5031 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 5032 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', 5033 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 5034 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 5035 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 5036 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 5037 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 5038 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle', 5039 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 5040 'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall', 5041 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall', 5042 'Cedillasmall', 'onequarter', 'onehalf', 'threequarters', 5043 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 5044 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior', 5045 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 5046 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 5047 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 5048 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 5049 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 5050 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall', 5051 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall', 5052 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 5053 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', 5054 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 5055 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 5056 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', 5057 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 5058 'Ydieresissmall' 5059 ]; 5060 5061 var ExpertSubsetCharset = [ 5062 '.notdef', 'space', 'dollaroldstyle', 'dollarsuperior', 5063 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 5064 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 5065 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 5066 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 5067 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior', 5068 'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior', 5069 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior', 5070 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 5071 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', 5072 'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted', 5073 'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter', 5074 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths', 5075 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior', 5076 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 5077 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior', 5078 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior', 5079 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior', 5080 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior', 5081 'periodinferior', 'commainferior' 5082 ]; 5083 5084 5085 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 5086 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ 5087 5088 'use strict'; 5089 5090 var CIDToUnicodeMaps = { 5091 'Adobe-Japan1': [[32, 160], {f: 12, c: 33}, [45, 8209], {f: 46, c: 46}, 165, 5092 {f: 2, c: 93}, [95, 818], [96, 768], {f: 27, c: 97}, 166, 125, [732, 771], 5093 [700, 8217], 92, [699, 8216], 124, [126, 8764], {f: 3, c: 161}, 8260, 402, 5094 0, 164, 8220, 171, {f: 2, c: 8249}, {f: 2, c: 64257}, [8210, 8211], 0, 0, 5095 [183, 8729], 0, 8226, 8218, 8222, 8221, 187, 0, 0, 191, {f: 2, c: 769}, 5096 [175, 772], {f: 3, c: 774}, 778, [184, 807], 779, 808, 780, [822, 8212], 5097 198, 170, 321, 216, 338, 186, 230, 305, 322, 248, 339, 223, 173, 169, 172, 5098 174, 0, 0, {f: 2, c: 178}, 181, 185, {f: 3, c: 188}, {f: 6, c: 192}, 5099 {f: 16, c: 199}, 0, {f: 6, c: 217}, {f: 6, c: 224}, {f: 16, c: 231}, 0, 5100 {f: 7, c: 249}, 352, 376, 381, [773, 8254], 353, 8482, 382, 0, 8194, 5101 {s: 91}, 65512, {s: 3}, {f: 63, c: 65377}, {s: 243}, [8195, 12288], 5102 {f: 2, c: 12289}, 65292, 65294, 12539, {f: 2, c: 65306}, 65311, 65281, 5103 {f: 2, c: 12443}, 180, 65344, 168, 65342, 65507, 65343, {f: 2, c: 12541}, 5104 {f: 2, c: 12445}, 12291, 20189, {f: 3, c: 12293}, 12540, 8213, 8208, 65295, 5105 65340, [12316, 65374], 8214, 65372, 8230, 8229, {s: 4}, {f: 2, c: 65288}, 5106 {f: 2, c: 12308}, 65339, 65341, 65371, 65373, {f: 10, c: 12296}, 65291, 5107 [8722, 65293], 177, 215, 247, 65309, 8800, 65308, 65310, {f: 2, c: 8806}, 5108 8734, 8756, 9794, 9792, 176, {f: 2, c: 8242}, 8451, 65509, 65284, 5109 {f: 2, c: 65504}, 65285, 65283, 65286, 65290, 65312, 167, 9734, 9733, 9675, 5110 9679, 9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, 9660, 8251, 12306, 5111 8594, {f: 2, c: 8592}, 8595, 12307, 8712, 8715, {f: 2, c: 8838}, 5112 {f: 2, c: 8834}, 8746, 8745, {f: 2, c: 8743}, 65506, 8658, 8660, 8704, 5113 8707, 8736, 8869, 8978, 8706, 8711, 8801, 8786, {f: 2, c: 8810}, 8730, 5114 8765, 8733, 8757, {f: 2, c: 8747}, 8491, 8240, 9839, 9837, 9834, 5115 {f: 2, c: 8224}, 182, 9711, {f: 10, c: 65296}, {f: 26, c: 65313}, 5116 {f: 26, c: 65345}, {f: 83, c: 12353}, {f: 86, c: 12449}, {f: 17, c: 913}, 5117 {f: 7, c: 931}, {f: 17, c: 945}, {f: 7, c: 963}, {f: 6, c: 1040}, 1025, 5118 {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, 20124, 21782, 23043, 38463, 5119 21696, 24859, 25384, 23030, 36898, 33909, 33564, 31312, 24746, 25569, 5120 28197, 26093, 33894, 33446, 39925, 26771, 22311, 26017, 25201, 23451, 5121 22992, 34427, 39156, 32098, 32190, 39822, 25110, 31903, 34999, 23433, 5122 24245, 25353, 26263, 26696, 38343, 38797, 26447, 20197, 20234, 20301, 5123 20381, 20553, 22258, 22839, 22996, 23041, 23561, 24799, 24847, 24944, 5124 26131, 26885, 28858, 30031, 30064, 31227, 32173, 32239, 32963, 33806, 5125 [12176, 34915], 35586, 36949, 36986, 21307, 20117, 20133, 22495, 32946, 5126 37057, 30959, [12032, 19968], 22769, 28322, 36920, 31282, 33576, 33419, 5127 39983, 20801, 21360, 21693, 21729, 22240, 23035, 24341, 39154, 28139, 5128 32996, 34093, 38498, 38512, 38560, 38907, 21515, 21491, 23431, 28879, 5129 [12155, 32701], 36802, [12204, 38632], 21359, 40284, 31418, 19985, 30867, 5130 [12165, 33276], 28198, 22040, 21764, 27421, 34074, 39995, 23013, 21417, 5131 28006, [12128, 29916], 38287, 22082, 20113, 36939, 38642, 33615, 39180, 5132 21473, 21942, 23344, 24433, 26144, 26355, 26628, 27704, 27891, 27945, 5133 29787, 30408, 31310, 38964, 33521, 34907, 35424, 37613, 28082, 30123, 5134 30410, 39365, 24742, 35585, 36234, 38322, 27022, 21421, 20870, 22290, 5135 22576, 22852, 23476, 24310, 24616, 25513, 25588, 27839, 28436, 28814, 5136 28948, 29017, 29141, 29503, 32257, 33398, 33489, 34199, 36960, 37467, 5137 40219, 22633, 26044, 27738, 29989, 20985, 22830, 22885, 24448, 24540, 5138 25276, 26106, 27178, 27431, 27572, 29579, 32705, 35158, 40236, 40206, 5139 [12009, 40644], 23713, 27798, 33659, 20740, 23627, 25014, 33222, 26742, 5140 29281, [12036, 20057], 20474, 21368, 24681, 28201, 31311, [12211, 38899], 5141 19979, 21270, 20206, 20309, 20285, 20385, 20339, 21152, 21487, 22025, 5142 22799, 23233, 23478, 23521, 31185, 26247, 26524, 26550, 27468, 27827, 5143 [12117, 28779], 29634, 31117, [12146, 31166], 31292, 31623, 33457, 33499, 5144 33540, 33655, 33775, 33747, 34662, 35506, 22057, 36008, 36838, 36942, 5145 38686, 34442, 20420, 23784, 25105, [12123, 29273], 30011, 33253, 33469, 5146 34558, 36032, 38597, 39187, 39381, 20171, 20250, 35299, 22238, 22602, 5147 22730, 24315, 24555, 24618, 24724, 24674, 25040, 25106, 25296, 25913, 5148 39745, 26214, 26800, 28023, 28784, 30028, 30342, 32117, 33445, 34809, 5149 38283, 38542, [12185, 35997], 20977, 21182, 22806, 21683, 23475, 23830, 5150 24936, 27010, 28079, 30861, 33995, 34903, 35442, 37799, 39608, 28012, 5151 39336, 34521, 22435, 26623, 34510, 37390, 21123, 22151, 21508, 24275, 5152 25313, 25785, 26684, 26680, 27579, 29554, 30906, 31339, 35226, 5153 [12179, 35282], 36203, 36611, 37101, 38307, 38548, [12208, 38761], 23398, 5154 23731, 27005, {f: 2, c: 38989}, 25499, 31520, 27179, 27263, 26806, 39949, 5155 28511, 21106, 21917, 24688, 25324, 27963, 28167, 28369, 33883, 35088, 5156 36676, 19988, 39993, 21494, 26907, 27194, 38788, 26666, 20828, 31427, 5157 33970, 37340, 37772, 22107, 40232, 26658, 33541, 33841, 31909, 21000, 5158 33477, [12129, 29926], 20094, 20355, 20896, 23506, 21002, 21208, 21223, 5159 24059, 21914, 22570, 23014, 23436, 23448, 23515, [12082, 24178], 24185, 5160 24739, 24863, 24931, 25022, 25563, 25954, 26577, 26707, 26874, 27454, 5161 27475, 27735, 28450, 28567, 28485, 29872, [12130, 29976], 30435, 30475, 5162 31487, 31649, 31777, 32233, [12152, 32566], 32752, 32925, 33382, 33694, 5163 35251, 35532, 36011, 36996, 37969, 38291, 38289, 38306, 38501, 38867, 5164 39208, 33304, 20024, 21547, 23736, 24012, 29609, 30284, 30524, 23721, 5165 32747, 36107, 38593, 38929, 38996, 39000, 20225, 20238, 21361, 21916, 5166 22120, 22522, 22855, 23305, 23492, 23696, 24076, 24190, 24524, 25582, 5167 26426, 26071, 26082, 26399, 26827, 26820, 27231, 24112, 27589, 27671, 5168 27773, 30079, 31048, 23395, 31232, 32000, 24509, 35215, 35352, 36020, 5169 36215, 36556, 36637, 39138, 39438, [12004, 12225, 39740], [12018, 20096], 5170 20605, 20736, 22931, 23452, 25135, 25216, 25836, 27450, 29344, 30097, 5171 31047, 32681, 34811, 35516, 35696, 25516, 33738, 38816, 21513, 21507, 5172 21931, 26708, 27224, 35440, 30759, 26485, [12233, 40653], 21364, 23458, 5173 33050, 34384, 36870, 19992, 20037, 20167, 20241, 21450, 21560, 23470, 5174 [12088, 24339], 24613, 25937, 26429, 27714, 27762, 27875, 28792, 29699, 5175 31350, 31406, 31496, 32026, 31998, 32102, 26087, [12124, 29275], 21435, 5176 23621, 24040, 25298, 25312, 25369, 28192, 34394, 35377, 36317, 37624, 5177 28417, 31142, [12226, 39770], 20136, {f: 2, c: 20139}, 20379, 20384, 20689, 5178 20807, 31478, 20849, 20982, 21332, 21281, 21375, 21483, 21932, 22659, 5179 23777, 24375, 24394, 24623, 24656, 24685, 25375, 25945, 27211, 27841, 5180 29378, 29421, 30703, 33016, 33029, 33288, 34126, 37111, 37857, 38911, 5181 39255, 39514, 20208, 20957, 23597, 26241, 26989, 23616, 26354, 26997, 5182 [12127, 29577], 26704, 31873, 20677, 21220, 22343, [12081, 24062], 37670, 5183 [12100, 26020], 27427, 27453, 29748, 31105, 31165, 31563, 32202, 33465, 5184 33740, 34943, 35167, 35641, 36817, [12198, 37329], 21535, 37504, 20061, 5185 20534, 21477, 21306, 29399, 29590, 30697, 33510, 36527, 39366, 39368, 5186 39378, 20855, 24858, 34398, 21936, 31354, 20598, 23507, 36935, 38533, 5187 20018, 27355, 37351, 23633, 23624, 25496, 31391, 27795, 38772, 36705, 5188 31402, 29066, 38536, 31874, 26647, 32368, 26705, 37740, 21234, 21531, 5189 34219, 35347, 32676, 36557, 37089, 21350, 34952, 31041, 20418, 20670, 5190 21009, 20804, 21843, 22317, 29674, 22411, 22865, 24418, 24452, 24693, 5191 24950, 24935, 25001, 25522, 25658, 25964, 26223, 26690, 28179, 30054, 5192 31293, 31995, 32076, 32153, 32331, 32619, 33550, 33610, 34509, 35336, 5193 35427, 35686, 36605, 38938, 40335, 33464, 36814, 39912, 21127, 25119, 5194 25731, 28608, 38553, 26689, 20625, [12107, 27424], 27770, 28500, 5195 [12147, 31348], 32080, [12174, 34880], 35363, [12105, 26376], 20214, 20537, 5196 20518, 20581, 20860, 21048, 21091, 21927, 22287, 22533, 23244, 24314, 5197 25010, 25080, 25331, 25458, 26908, 27177, 29309, [12125, 29356], 29486, 5198 30740, 30831, 32121, 30476, 32937, [12178, 35211], 35609, 36066, 36562, 5199 36963, 37749, 38522, 38997, 39443, 40568, 20803, 21407, 21427, 24187, 5200 24358, 28187, 28304, [12126, 29572], 29694, 32067, 33335, [12180, 35328], 5201 35578, 38480, 20046, 20491, 21476, 21628, 22266, 22993, 23396, 5202 [12080, 24049], 24235, 24359, [12094, 25144], 25925, 26543, 28246, 29392, 5203 31946, 34996, 32929, 32993, 33776, [11969, 34382], 35463, 36328, 37431, 5204 38599, 39015, [12238, 40723], 20116, 20114, 20237, 21320, 21577, 21566, 5205 23087, 24460, 24481, 24735, 26791, 27278, 29786, 30849, 35486, 35492, 5206 35703, 37264, 20062, 39881, 20132, 20348, 20399, 20505, 20502, 20809, 5207 20844, 21151, 21177, 21246, 21402, [12061, 21475], 21521, 21518, 21897, 5208 22353, 22434, 22909, 23380, 23389, 23439, [12079, 24037], 24039, 24055, 5209 24184, 24195, 24218, 24247, 24344, 24658, 24908, 25239, 25304, 25511, 5210 25915, 26114, 26179, 26356, 26477, 26657, 26775, 27083, 27743, 27946, 5211 28009, 28207, 28317, 30002, 30343, 30828, 31295, 31968, 32005, 32024, 5212 32094, 32177, 32789, 32771, 32943, 32945, 33108, 33167, 33322, 33618, 5213 [12175, 34892], 34913, 35611, 36002, 36092, 37066, 37237, 37489, 30783, 5214 37628, 38308, 38477, 38917, [12217, 39321], [12220, 39640], 40251, 21083, 5215 21163, 21495, 21512, 22741, 25335, 28640, 35946, 36703, 40633, 20811, 5216 21051, 21578, 22269, 31296, 37239, 40288, [12234, 40658], 29508, 28425, 5217 33136, 29969, 24573, 24794, [12219, 39592], 29403, 36796, 27492, 38915, 5218 20170, 22256, 22372, 22718, 23130, 24680, 25031, 26127, 26118, 26681, 5219 26801, 28151, 30165, 32058, [12169, 33390], 39746, 20123, 20304, 21449, 5220 21766, 23919, 24038, 24046, 26619, 27801, 29811, 30722, 35408, 37782, 5221 35039, 22352, 24231, 25387, 20661, 20652, 20877, 26368, 21705, 22622, 5222 22971, 23472, 24425, 25165, 25505, 26685, 27507, 28168, 28797, 37319, 5223 29312, 30741, 30758, 31085, 25998, 32048, 33756, 35009, 36617, 38555, 5224 21092, 22312, 26448, 32618, 36001, 20916, 22338, 38442, 22586, 27018, 5225 32948, 21682, 23822, 22524, 30869, 40442, 20316, 21066, 21643, 25662, 5226 26152, 26388, 26613, 31364, 31574, 32034, 37679, 26716, 39853, 31545, 5227 21273, 20874, 21047, 23519, 25334, 25774, 25830, 26413, 27578, 34217, 5228 38609, 30352, 39894, 25420, 37638, 39851, [12139, 30399], 26194, 19977, 5229 20632, 21442, [12077, 23665], 24808, 25746, 25955, 26719, 29158, 29642, 5230 29987, 31639, 32386, 34453, 35715, 36059, 37240, 39184, 26028, 26283, 5231 27531, 20181, 20180, 20282, 20351, 21050, 21496, 21490, 21987, 22235, 5232 [12064, 22763], 22987, 22985, 23039, [12070, 23376], 23629, 24066, 24107, 5233 24535, 24605, 25351, [12096, 25903], 23388, 26031, 26045, 26088, 26525, 5234 [12108, 27490], 27515, [12114, 27663], 29509, 31049, 31169, [12151, 31992], 5235 32025, 32043, 32930, 33026, [12164, 33267], 35222, 35422, 35433, 35430, 5236 35468, 35566, 36039, 36060, 38604, 39164, [12013, 27503], 20107, 20284, 5237 20365, 20816, 23383, 23546, 24904, 25345, 26178, 27425, 28363, 27835, 5238 29246, 29885, 30164, 30913, [12144, 31034], [12157, 32780], [12159, 32819], 5239 [12163, 33258], 33940, 36766, 27728, [12229, 40575], 24335, 35672, 40235, 5240 31482, 36600, 23437, 38635, 19971, 21489, 22519, 22833, 23241, 23460, 5241 24713, 28287, 28422, 30142, 36074, 23455, 34048, 31712, 20594, 26612, 5242 33437, 23649, 34122, 32286, 33294, 20889, 23556, 25448, 36198, 26012, 5243 29038, 31038, 32023, 32773, 35613, [12190, 36554], 36974, 34503, 37034, 5244 20511, 21242, 23610, 26451, 28796, 29237, 37196, 37320, 37675, 33509, 5245 23490, 24369, 24825, 20027, 21462, 23432, [12095, 25163], 26417, 27530, 5246 29417, 29664, 31278, 33131, 36259, 37202, [12216, 39318], 20754, 21463, 5247 21610, 23551, 25480, 27193, 32172, 38656, 22234, 21454, 21608, 23447, 5248 23601, 24030, 20462, 24833, 25342, 27954, 31168, 31179, 32066, 32333, 5249 32722, 33261, [12168, 33311], 33936, 34886, 35186, 35728, 36468, 36655, 5250 36913, 37195, 37228, 38598, 37276, 20160, 20303, 20805, [12055, 21313], 5251 24467, 25102, 26580, 27713, 28171, 29539, 32294, 37325, 37507, 21460, 5252 22809, 23487, 28113, 31069, 32302, 31899, 22654, 29087, 20986, 34899, 5253 36848, 20426, 23803, 26149, 30636, 31459, 33308, 39423, 20934, 24490, 5254 26092, 26991, 27529, 28147, 28310, 28516, 30462, 32020, 24033, 36981, 5255 37255, 38918, 20966, 21021, 25152, 26257, 26329, 28186, 24246, 32210, 5256 32626, 26360, 34223, 34295, 35576, 21161, 21465, [12069, 22899], 24207, 5257 24464, 24661, 37604, 38500, 20663, 20767, 21213, 21280, 21319, 21484, 5258 21736, 21830, 21809, 22039, 22888, 22974, 23100, 23477, 23558, 5259 [12073, 23567], 23569, 23578, 24196, 24202, 24288, 24432, 25215, 25220, 5260 25307, 25484, 25463, 26119, 26124, 26157, 26230, 26494, 26786, 27167, 5261 27189, 27836, 28040, 28169, 28248, 28988, 28966, 29031, 30151, 30465, 5262 30813, 30977, 31077, 31216, 31456, 31505, 31911, 32057, 32918, 33750, 5263 33931, 34121, 34909, 35059, 35359, 35388, 35412, 35443, 35937, 36062, 5264 37284, 37478, 37758, 37912, 38556, 38808, 19978, 19976, 19998, 20055, 5265 20887, 21104, 22478, 22580, 22732, 23330, 24120, 24773, 25854, 26465, 5266 26454, 27972, 29366, 30067, 31331, 33976, 35698, 37304, 37664, 22065, 5267 22516, 39166, 25325, 26893, 27542, 29165, 32340, 32887, [12170, 33394], 5268 35302, [12215, 39135], 34645, 36785, 23611, 20280, 20449, 20405, 21767, 5269 23072, 23517, 23529, [12092, 24515], 24910, 25391, 26032, 26187, 26862, 5270 27035, 28024, 28145, 30003, 30137, 30495, 31070, 31206, 32051, 5271 [12162, 33251], 33455, 34218, 35242, 35386, [12189, 36523], [12191, 36763], 5272 36914, 37341, 38663, [12040, 20154], 20161, 20995, 22645, 22764, 23563, 5273 29978, 23613, 33102, 35338, 36805, 38499, 38765, 31525, 35535, 38920, 5274 37218, 22259, 21416, 36887, 21561, 22402, 24101, 25512, [12116, 27700], 5275 28810, 30561, 31883, 32736, 34928, 36930, 37204, 37648, 37656, 38543, 5276 29790, 39620, 23815, 23913, 25968, 26530, 36264, 38619, 25454, 26441, 5277 26905, 33733, 38935, 38592, 35070, 28548, 25722, [12072, 23544], 19990, 5278 28716, 30045, 26159, 20932, 21046, 21218, 22995, 24449, 24615, 25104, 5279 25919, 25972, 26143, 26228, 26866, 26646, 27491, 28165, 29298, 5280 [12131, 29983], 30427, 31934, 32854, 22768, 35069, [11972, 35199], 35488, 5281 35475, 35531, 36893, 37266, [11992, 38738], 38745, [12011, 25993], 31246, 5282 33030, 38587, 24109, 24796, 25114, 26021, 26132, 26512, [12143, 30707], 5283 31309, 31821, 32318, 33034, 36012, [12186, 36196], 36321, 36447, 30889, 5284 20999, 25305, 25509, 25666, 25240, 35373, 31363, 31680, 35500, 38634, 5285 32118, [12166, 33292], 34633, 20185, 20808, 21315, 21344, 23459, 23554, 5286 23574, 24029, 25126, 25159, 25776, 26643, 26676, 27849, 27973, 27927, 5287 26579, 28508, 29006, 29053, 26059, 31359, 31661, 32218, 32330, 32680, 5288 33146, [12167, 33307], 33337, 34214, 35438, 36046, 36341, 36984, 36983, 5289 37549, 37521, 38275, 39854, 21069, 21892, 28472, 28982, 20840, 31109, 5290 32341, 33203, 31950, 22092, 22609, 23720, 25514, 26366, 26365, 26970, 5291 29401, 30095, 30094, 30990, 31062, 31199, 31895, 32032, 32068, 34311, 5292 35380, 38459, 36961, [12239, 40736], 20711, 21109, 21452, 21474, 20489, 5293 21930, 22766, 22863, 29245, 23435, 23652, 21277, 24803, 24819, 25436, 5294 25475, 25407, 25531, 25805, 26089, 26361, 24035, 27085, 27133, 28437, 5295 29157, 20105, 30185, 30456, 31379, 31967, 32207, 32156, 32865, 33609, 5296 33624, 33900, 33980, 34299, 35013, [12187, 36208], 36865, 36973, 37783, 5297 38684, 39442, 20687, 22679, 24974, 33235, 34101, 36104, 36896, 20419, 5298 20596, 21063, 21363, 24687, 25417, 26463, 28204, [12188, 36275], 36895, 5299 20439, 23646, 36042, 26063, 32154, 21330, 34966, 20854, 25539, 23384, 5300 23403, 23562, 25613, 26449, 36956, 20182, 22810, 22826, 27760, 35409, 5301 21822, 22549, 22949, 24816, 25171, 26561, 33333, 26965, 38464, 39364, 5302 39464, 20307, 22534, 23550, 32784, 23729, 24111, 24453, 24608, 24907, 5303 25140, 26367, 27888, 28382, 32974, 33151, 33492, 34955, 36024, 36864, 5304 36910, 38538, 40667, 39899, 20195, 21488, [12068, 22823], 31532, 37261, 5305 38988, 40441, 28381, 28711, 21331, 21828, 23429, 25176, 25246, 25299, 5306 27810, 28655, 29730, 35351, 37944, 28609, 35582, 33592, 20967, 34552, 5307 21482, 21481, 20294, 36948, [12192, 36784], 22890, 33073, 24061, 31466, 5308 36799, 26842, [12181, 35895], 29432, 40008, 27197, 35504, 20025, 21336, 5309 22022, 22374, 25285, 25506, 26086, 27470, 28129, 28251, 28845, 30701, 5310 31471, 31658, 32187, 32829, 32966, 34507, 35477, 37723, 22243, 22727, 5311 24382, 26029, 26262, 27264, 27573, 30007, 35527, 20516, 30693, 22320, 5312 24347, 24677, 26234, 27744, 30196, 31258, 32622, 33268, 34584, 36933, 5313 39347, 31689, 30044, [12149, 31481], 31569, 33988, 36880, 31209, 31378, 5314 33590, 23265, 30528, 20013, 20210, 23449, 24544, 25277, 26172, 26609, 5315 27880, [12173, 34411], 34935, 35387, 37198, 37619, 39376, 27159, 28710, 5316 29482, 33511, 33879, 36015, 19969, 20806, 20939, 21899, 23541, 24086, 5317 24115, 24193, 24340, 24373, 24427, 24500, 25074, 25361, 26274, 26397, 5318 28526, 29266, 30010, 30522, 32884, 33081, 33144, 34678, 35519, 35548, 5319 36229, 36339, 37530, [11985, 12199, 38263], 38914, [12227, 40165], 21189, 5320 25431, 30452, 26389, 27784, 29645, 36035, 37806, 38515, 27941, 22684, 5321 26894, 27084, 36861, 37786, 30171, 36890, 22618, 26626, 25524, 27131, 5322 20291, 28460, 26584, 36795, 34086, 32180, 37716, 26943, 28528, 22378, 5323 22775, 23340, 32044, [12118, 29226], 21514, 37347, 40372, 20141, 20302, 5324 20572, 20597, 21059, 35998, 21576, 22564, 23450, 24093, 24213, 24237, 5325 24311, 24351, 24716, 25269, 25402, 25552, 26799, 27712, 30855, 31118, 5326 31243, 32224, 33351, 35330, 35558, 36420, 36883, 37048, 37165, 37336, 5327 [12237, 40718], 27877, 25688, 25826, 25973, 28404, 30340, 31515, 36969, 5328 37841, 28346, 21746, 24505, 25764, 36685, 36845, 37444, 20856, 22635, 5329 22825, 23637, 24215, 28155, 32399, 29980, 36028, 36578, 39003, 28857, 5330 20253, 27583, 28593, [12133, 30000], 38651, 20814, 21520, 22581, 22615, 5331 22956, 23648, 24466, [12099, 26007], 26460, 28193, 30331, 33759, 36077, 5332 36884, 37117, 37709, 30757, 30778, 21162, 24230, [12063, 22303], 22900, 5333 24594, 20498, 20826, 20908, 20941, [12049, 20992], 21776, 22612, 22616, 5334 22871, 23445, 23798, 23947, 24764, 25237, 25645, 26481, 26691, 26812, 5335 26847, 30423, 28120, 28271, 28059, 28783, 29128, 24403, 30168, 31095, 5336 31561, 31572, 31570, 31958, 32113, 21040, 33891, 34153, 34276, 35342, 5337 35588, [12182, 35910], 36367, 36867, 36879, 37913, 38518, 38957, 39472, 5338 38360, 20685, 21205, 21516, 22530, 23566, 24999, 25758, 27934, 30643, 5339 31461, 33012, 33796, 36947, 37509, 23776, 40199, 21311, 24471, 24499, 5340 28060, 29305, 30563, 31167, 31716, 27602, 29420, 35501, 26627, 27233, 5341 20984, 31361, 26932, 23626, 40182, 33515, 23493, [12195, 37193], 28702, 5342 22136, 23663, 24775, 25958, 27788, 35930, 36929, 38931, 21585, 26311, 5343 37389, 22856, 37027, 20869, 20045, 20970, 34201, 35598, 28760, 25466, 5344 37707, 26978, 39348, 32260, 30071, 21335, 26976, 36575, 38627, 27741, 5345 [12038, 20108], 23612, 24336, 36841, 21250, 36049, [12161, 32905], 34425, 5346 24319, [12103, 26085], 20083, [12042, 20837], 22914, 23615, 38894, 20219, 5347 22922, 24525, 35469, 28641, 31152, 31074, 23527, 33905, 29483, 29105, 5348 24180, 24565, 25467, 25754, 29123, 31896, 20035, 24316, 20043, 22492, 5349 22178, 24745, 28611, 32013, 33021, 33075, 33215, 36786, 35223, 34468, 5350 24052, 25226, 25773, 35207, 26487, 27874, 27966, 29750, 30772, 23110, 5351 32629, 33453, [12218, 39340], 20467, 24259, 25309, 25490, 25943, 26479, 5352 30403, 29260, 32972, 32954, 36649, 37197, 20493, 22521, 23186, 26757, 5353 26995, 29028, 29437, 36023, 22770, 36064, 38506, 36889, 34687, 31204, 5354 30695, 33833, 20271, 21093, 21338, 25293, 26575, 27850, [12137, 30333], 5355 31636, 31893, 33334, 34180, 36843, 26333, 28448, 29190, 32283, 33707, 5356 39361, [12008, 40614], 20989, 31665, 30834, 31672, 32903, 31560, 27368, 5357 24161, 32908, 30033, 30048, [12043, 20843], 37474, 28300, 30330, 37271, 5358 39658, 20240, 32624, 25244, 31567, 38309, 40169, 22138, 22617, 34532, 5359 38588, 20276, 21028, 21322, 21453, 21467, 24070, 25644, 26001, 26495, 5360 27710, 27726, 29256, 29359, 29677, 30036, 32321, 33324, 34281, 36009, 5361 31684, [12196, 37318], 29033, 38930, 39151, 25405, 26217, 30058, 30436, 5362 30928, 34115, 34542, 21290, 21329, 21542, 22915, 24199, 24444, 24754, 5363 25161, 25209, 25259, 26000, [12112, 27604], 27852, 30130, [12138, 30382], 5364 30865, 31192, 32203, 32631, 32933, 34987, 35513, 36027, 36991, 5365 [12206, 38750], [12214, 39131], 27147, 31800, 20633, 23614, 24494, 26503, 5366 27608, 29749, 30473, 32654, [12240, 40763], 26570, 31255, 21305, 5367 [12134, 30091], 39661, 24422, 33181, 33777, 32920, 24380, 24517, 30050, 5368 31558, 36924, 26727, 23019, 23195, 32016, 30334, 35628, 20469, 24426, 5369 27161, 27703, 28418, 29922, 31080, 34920, 35413, 35961, 24287, 25551, 5370 30149, 31186, 33495, 37672, 37618, 33948, 34541, 39981, 21697, 24428, 5371 25996, 27996, 28693, 36007, 36051, 38971, 25935, 29942, 19981, 20184, 5372 22496, 22827, 23142, 23500, 20904, 24067, 24220, 24598, 25206, 25975, 5373 26023, 26222, 28014, [12119, 29238], 31526, 33104, 33178, 33433, 35676, 5374 36000, 36070, 36212, [12201, 38428], 38468, 20398, 25771, 27494, 33310, 5375 33889, 34154, 37096, 23553, 26963, [12213, 39080], 33914, 34135, 20239, 5376 21103, 24489, 24133, 26381, 31119, 33145, 35079, 35206, 28149, 24343, 5377 25173, 27832, 20175, 29289, 39826, 20998, 21563, 22132, 22707, 24996, 5378 25198, 28954, 22894, 31881, 31966, 32027, 38640, [12098, 25991], 32862, 5379 19993, 20341, 20853, 22592, 24163, 24179, 24330, 26564, 20006, 34109, 5380 38281, 38491, [12150, 31859], [12212, 38913], 20731, 22721, 30294, 30887, 5381 21029, 30629, 34065, 31622, 20559, 22793, [12122, 29255], 31687, 32232, 5382 36794, 36820, 36941, 20415, 21193, 23081, 24321, 38829, 20445, 33303, 5383 37610, 22275, 25429, 27497, 29995, 35036, 36628, 31298, 21215, 22675, 5384 24917, 25098, 26286, [11935, 27597], 31807, 33769, 20515, 20472, 21253, 5385 21574, 22577, 22857, 23453, 23792, 23791, 23849, 24214, 25265, 25447, 5386 25918, [12101, 26041], 26379, 27861, 27873, 28921, 30770, 32299, 32990, 5387 33459, 33804, 34028, 34562, 35090, 35370, 35914, 37030, 37586, 39165, 5388 40179, 40300, 20047, 20129, 20621, 21078, 22346, 22952, 24125, 5389 {f: 2, c: 24536}, 25151, 26292, 26395, 26576, 26834, 20882, 32033, 32938, 5390 33192, 35584, 35980, 36031, 37502, 38450, 21536, 38956, 21271, 20693, 5391 [12056, 21340], 22696, 25778, 26420, 29287, 30566, 31302, 37350, 21187, 5392 27809, 27526, 22528, 24140, 22868, 26412, 32763, 20961, 30406, 25705, 5393 30952, 39764, [12231, 40635], 22475, 22969, 26151, 26522, 27598, 21737, 5394 27097, 24149, 33180, 26517, 39850, 26622, 40018, 26717, 20134, 20451, 5395 [12060, 21448], 25273, 26411, 27819, 36804, 20397, 32365, 40639, 19975, 5396 24930, 28288, 28459, 34067, 21619, 26410, 39749, [11922, 24051], 31637, 5397 23724, 23494, 34588, 28234, 34001, 31252, 33032, 22937, 31885, 5398 [11936, 27665], 30496, 21209, 22818, 28961, 29279, [12141, 30683], 38695, 5399 40289, 26891, 23167, 23064, 20901, 21517, 21629, 26126, 30431, 36855, 5400 37528, 40180, 23018, 29277, 28357, 20813, 26825, 32191, 32236, 5401 [12207, 38754], 40634, 25720, 27169, 33538, 22916, 23391, [12113, 27611], 5402 29467, 30450, 32178, 32791, 33945, 20786, [12106, 26408], 40665, 5403 [12140, 30446], 26466, 21247, 39173, 23588, 25147, 31870, 36016, 21839, 5404 24758, 32011, [12200, 38272], 21249, 20063, 20918, 22812, 29242, 32822, 5405 37326, 24357, [12142, 30690], 21380, 24441, 32004, 34220, 35379, 36493, 5406 38742, 26611, 34222, 37971, 24841, 24840, 27833, 30290, 35565, 36664, 5407 21807, 20305, 20778, 21191, 21451, 23461, 24189, 24736, 24962, 25558, 5408 26377, 26586, 28263, 28044, {f: 2, c: 29494}, 30001, 31056, 35029, 35480, 5409 36938, [12194, 37009], 37109, 38596, 34701, [12067, 22805], 20104, 20313, 5410 19982, 35465, 36671, 38928, 20653, 24188, 22934, 23481, 24248, 25562, 5411 25594, 25793, 26332, 26954, 27096, 27915, 28342, 29076, [12132, 29992], 5412 31407, [12154, 32650], 32768, 33865, 33993, 35201, 35617, 36362, 36965, 5413 38525, 39178, 24958, 25233, 27442, 27779, 28020, 32716, 32764, 28096, 5414 32645, 34746, 35064, 26469, 33713, 38972, 38647, 27931, 32097, 33853, 5415 37226, 20081, 21365, 23888, 27396, 28651, 34253, 34349, 35239, 21033, 5416 21519, 23653, 26446, 26792, 29702, 29827, 30178, 35023, 35041, 5417 [12197, 37324], 38626, 38520, 24459, 29575, [12148, 31435], 33870, 25504, 5418 30053, 21129, 27969, 28316, 29705, 30041, 30827, 31890, 38534, 5419 [12015, 31452], [12243, 40845], 20406, 24942, 26053, 34396, 20102, 20142, 5420 20698, 20001, 20940, 23534, 26009, 26753, 28092, 29471, 30274, 30637, 5421 31260, 31975, 33391, 35538, 36988, 37327, 38517, 38936, [12050, 21147], 5422 32209, 20523, 21400, 26519, 28107, 29136, 29747, 33256, 36650, 38563, 5423 40023, 40607, 29792, 22593, 28057, 32047, 39006, 20196, 20278, 20363, 5424 20919, 21169, 23994, 24604, 29618, 31036, 33491, 37428, 38583, 38646, 5425 38666, 40599, 40802, 26278, 27508, 21015, 21155, 28872, 35010, 24265, 5426 24651, 24976, 28451, 29001, 31806, 32244, 32879, 34030, 36899, 37676, 5427 21570, 39791, 27347, 28809, 36034, 36335, 38706, 21172, 23105, 24266, 5428 24324, 26391, 27004, 27028, 28010, 28431, 29282, 29436, 31725, 5429 [12156, 32769], 32894, 34635, 37070, 20845, 40595, 31108, 32907, 37682, 5430 35542, 20525, 21644, 35441, 27498, 36036, 33031, 24785, 26528, 40434, 5431 20121, 20120, 39952, 35435, 34241, 34152, 26880, 28286, 30871, 33109, 5432 24332, 19984, 19989, 20010, 20017, [12034, 20022], 20028, [12035, 20031], 5433 20034, 20054, 20056, 20098, [12037, 20101], 35947, 20106, 33298, 24333, 5434 20110, {f: 2, c: 20126}, [12039, 20128], 20130, 20144, 20147, 20150, 20174, 5435 20173, 20164, 20166, 20162, 20183, 20190, 20205, 20191, 20215, 20233, 5436 20314, 20272, 20315, 20317, 20311, 20295, 20342, 20360, 20367, 20376, 5437 20347, 20329, 20336, 20369, 20335, 20358, 20374, 20760, 20436, 20447, 5438 20430, 20440, 20443, 20433, 20442, 20432, {f: 2, c: 20452}, 20506, 20520, 5439 20500, 20522, 20517, 20485, 20252, 20470, 20513, 20521, 20524, 20478, 5440 20463, 20497, 20486, 20547, 20551, 26371, 20565, 20560, 20552, 20570, 5441 20566, 20588, 20600, 20608, 20634, 20613, 20660, 20658, {f: 2, c: 20681}, 5442 20659, 20674, 20694, 20702, 20709, 20717, 20707, 20718, 20729, 20725, 5443 20745, {f: 2, c: 20737}, 20758, 20757, 20756, 20762, 20769, 20794, 20791, 5444 20796, 20795, [12041, 20799], [11918, 20800], 20818, 20812, 20820, 20834, 5445 31480, {f: 2, c: 20841}, 20846, 20864, [12044, 20866], 22232, 20876, 20873, 5446 20879, 20881, 20883, 20885, [12045, 20886], 20900, 20902, 20898, 5447 {f: 2, c: 20905}, [12046, 20907], 20915, {f: 2, c: 20913}, 20912, 20917, 5448 20925, 20933, 20937, 20955, [12047, 20960], 34389, 20969, 20973, 20976, 5449 [12048, 20981], 20990, 20996, 21003, 21012, 21006, 21031, 21034, 21038, 5450 21043, 21049, 21071, 21060, {f: 2, c: 21067}, 21086, 21076, 21098, 21108, 5451 21097, 21107, 21119, 21117, 21133, 21140, 21138, 21105, 21128, 21137, 5452 36776, 36775, {f: 2, c: 21164}, 21180, 21173, 21185, 21197, 21207, 21214, 5453 21219, 21222, 39149, 21216, 21235, 21237, 21240, [12051, 21241], 21254, 5454 21256, 30008, 21261, 21264, 21263, [12052, 21269], [12053, 21274], 21283, 5455 21295, 21297, 21299, [12054, 21304], 21312, 21318, 21317, 19991, 21321, 5456 21325, 20950, 21342, [12057, 21353], 21358, 22808, 21371, 21367, 5457 [12058, 21378], 21398, 21408, 21414, 21413, 21422, 21424, [12059, 21430], 5458 21443, 31762, 38617, 21471, 26364, 29166, 21486, 21480, 21485, 21498, 5459 21505, 21565, 21568, {f: 2, c: 21548}, 21564, 21550, 21558, 21545, 21533, 5460 21582, 21647, 21621, 21646, 21599, 21617, 21623, 21616, 21650, 21627, 5461 21632, 21622, 21636, 21648, 21638, 21703, 21666, 21688, 21669, 21676, 5462 21700, 21704, 21672, 21675, 21698, 21668, 21694, 21692, 21720, 5463 {f: 2, c: 21733}, 21775, 21780, 21757, 21742, 21741, 21754, 21730, 21817, 5464 21824, 21859, 21836, 21806, 21852, 21829, {f: 2, c: 21846}, 21816, 21811, 5465 21853, 21913, 21888, 21679, 21898, 21919, 21883, 21886, 21912, 21918, 5466 21934, 21884, 21891, 21929, 21895, 21928, 21978, 21957, 21983, 21956, 5467 21980, 21988, 21972, 22036, 22007, 22038, 22014, 22013, 22043, 22009, 5468 22094, 22096, 29151, 22068, 22070, 22066, 22072, 22123, 22116, 22063, 5469 22124, 22122, 22150, 22144, 22154, 22176, 22164, 22159, 22181, 22190, 5470 22198, 22196, 22210, 22204, 22209, 22211, 22208, 22216, 22222, 22225, 5471 22227, [12062, 22231], 22254, 22265, 22272, 22271, 22276, 22281, 22280, 5472 22283, 22285, 22291, 22296, 22294, 21959, 22300, 22310, {f: 2, c: 22327}, 5473 22350, 22331, 22336, 22351, 22377, 22464, 22408, 22369, 22399, 22409, 5474 22419, 22432, 22451, 22436, 22442, 22448, 22467, 22470, 22484, 5475 {f: 2, c: 22482}, 22538, 22486, 22499, 22539, 22553, 22557, 22642, 22561, 5476 22626, 22603, 22640, 27584, 22610, 22589, 22649, 22661, 22713, 22687, 5477 22699, 22714, 22750, 22715, 22712, 22702, 22725, 22739, 22737, 22743, 5478 22745, 22744, 22757, 22748, 22756, 22751, 22767, 22778, 22777, 5479 {f: 3, c: 22779}, [12065, 22786], [12066, 22794], 22800, 22811, 26790, 5480 22821, {f: 2, c: 22828}, 22834, 22840, 22846, 31442, 22869, 22864, 22862, 5481 22874, 22872, 22882, 22880, 22887, 22892, 22889, 22904, 22913, 22941, 5482 20318, 20395, 22947, 22962, 22982, 23016, 23004, 22925, {f: 2, c: 23001}, 5483 23077, 23071, 23057, 23068, 23049, 23066, 23104, 23148, 23113, 5484 {f: 2, c: 23093}, 23138, 23146, 23194, 23228, 23230, 23243, 23234, 23229, 5485 23267, 23255, 23270, 23273, 23254, {f: 2, c: 23290}, 23308, 23307, 23318, 5486 23346, 23248, 23338, 23350, 23358, 23363, 23365, 23360, 23377, 23381, 5487 {f: 2, c: 23386}, 23397, 23401, 23408, 23411, 23413, 23416, 25992, 23418, 5488 [12071, 23424], 23427, 23462, 23480, 23491, 23495, 23497, 23508, 23504, 5489 23524, 23526, 23522, 23518, 23525, 23531, 23536, 23542, 23539, 23557, 5490 {f: 2, c: 23559}, 23565, 23571, 23584, [11920, 12074, 23586], 23592, 5491 [12075, 23608], 23609, 23617, 23622, 23630, 23635, 23632, 23631, 23409, 5492 23660, [12076, 23662], 20066, 23670, 23673, 23692, 23697, 23700, 22939, 5493 23723, 23739, 23734, 23740, 23735, 23749, 23742, 23751, 23769, 23785, 5494 23805, 23802, 23789, 23948, 23786, 23819, 23829, 23831, 23900, 23839, 5495 23835, 23825, 23828, 23842, 23834, 23833, 23832, 23884, 23890, 23886, 5496 23883, 23916, 23923, 23926, 23943, 23940, 23938, 23970, 23965, 23980, 5497 23982, 23997, 23952, 23991, 23996, 24009, 24013, 24019, 24018, 24022, 5498 [12078, 24027], 24043, 24050, 24053, 24075, 24090, 24089, 24081, 24091, 5499 {f: 2, c: 24118}, 24132, 24131, 24128, 24142, 24151, 24148, 24159, 24162, 5500 24164, 24135, {f: 2, c: 24181}, [11923, 12083, 24186], 40636, 5501 [12084, 24191], 24224, {f: 2, c: 24257}, 24264, 24272, 24271, 24278, 24291, 5502 24285, {f: 2, c: 24282}, 24290, 24289, {f: 2, c: 24296}, 24300, 24305, 5503 24307, 24304, [12085, 24308], 24312, [12086, 24318], 24323, 24329, 24413, 5504 24412, [12087, 24331], 24337, 24342, 24361, 24365, 24376, 24385, 24392, 5505 24396, 24398, 24367, [11924, 24401], {f: 2, c: 24406}, 24409, 5506 [12090, 24417], 24429, [12091, 24435], 24439, 24451, 24450, 24447, 24458, 5507 24456, 24465, 24455, 24478, 24473, 24472, 24480, 24488, 24493, 24508, 5508 24534, 24571, 24548, 24568, 24561, 24541, 24755, 24575, 24609, 24672, 5509 24601, 24592, 24617, 24590, 24625, 24603, 24597, 24619, 24614, 24591, 5510 24634, 24666, 24641, 24682, 24695, 24671, 24650, 24646, 24653, 24675, 5511 24643, 24676, 24642, 24684, 24683, 24665, 24705, 24717, 24807, 24707, 5512 24730, 24708, 24731, {f: 2, c: 24726}, 24722, 24743, 24715, 24801, 24760, 5513 24800, 24787, 24756, 24560, 24765, 24774, 24757, 24792, 24909, 24853, 5514 24838, {f: 2, c: 24822}, 24832, 24820, 24826, 24835, 24865, 24827, 24817, 5515 {f: 2, c: 24845}, 24903, 24894, 24872, 24871, 24906, 24895, 24892, 24876, 5516 24884, 24893, 24898, 24900, 24947, 24951, {f: 3, c: 24920}, 24939, 24948, 5517 24943, 24933, 24945, 24927, 24925, 24915, 24949, 24985, 24982, 24967, 5518 25004, 24980, 24986, 24970, 24977, 25003, 25006, 25036, 25034, 25033, 5519 25079, 25032, 25027, 25030, 25018, 25035, 32633, 25037, 25062, 25059, 5520 25078, 25082, 25076, 25087, 25085, 25084, 25086, 25088, [12093, 25096], 5521 25097, 25101, 25100, 25108, 25115, 25118, 25121, 25130, 25134, 25136, 5522 {f: 2, c: 25138}, 25153, 25166, 25182, 25187, 25179, 25184, 25192, 25212, 5523 25218, 25225, 25214, {f: 2, c: 25234}, 25238, 25300, 25219, 25236, 25303, 5524 25297, 25275, 25295, 25343, 25286, 25812, 25288, 25308, 25292, 25290, 5525 25282, 25287, 25243, 25289, 25356, 25326, 25329, 25383, 25346, 25352, 5526 25327, 25333, 25424, 25406, 25421, 25628, 25423, 25494, 25486, 25472, 5527 25515, 25462, 25507, 25487, 25481, 25503, 25525, 25451, 25449, 25534, 5528 25577, 25536, 25542, 25571, 25545, 25554, 25590, 25540, 25622, 25652, 5529 25606, 25619, 25638, 25654, 25885, 25623, 25640, 25615, 25703, 25711, 5530 25718, 25678, 25898, 25749, 25747, 25765, 25769, 25736, 25788, 25818, 5531 25810, 25797, 25799, 25787, 25816, 25794, 25841, 25831, 33289, 5532 {f: 2, c: 25824}, 25260, 25827, 25839, 25900, 25846, 25844, 25842, 25850, 5533 25856, 25853, 25880, 25884, 25861, 25892, 25891, 25899, [12097, 25908], 5534 [11929, 25909], 25911, 25910, 25912, 30027, 25928, 25942, 25941, 25933, 5535 25944, 25950, 25949, 25970, 25976, {f: 2, c: 25986}, 35722, 26011, 26015, 5536 26027, 26039, 26051, 26054, 26049, 26052, 26060, 26066, 26075, 26073, 5537 [12102, 26080], [11931, 26081], 26097, 26482, 26122, 26115, 26107, 26483, 5538 {f: 2, c: 26165}, 26164, 26140, 26191, 26180, 26185, 26177, 26206, 26205, 5539 26212, {f: 2, c: 26215}, 26207, 26210, 26224, 26243, 26248, 26254, 26249, 5540 26244, 26264, 26269, 26305, 26297, 26313, 26302, 26300, 26308, 26296, 5541 26326, 26330, 26336, 26175, 26342, 26345, [12104, 26352], 26357, 26359, 5542 26383, 26390, 26398, {f: 2, c: 26406}, 38712, 26414, 26431, 26422, 26433, 5543 26424, 26423, 26438, 26462, 26464, 26457, {f: 2, c: 26467}, 26505, 26480, 5544 26537, 26492, 26474, 26508, 26507, 26534, 26529, 26501, 26551, 26607, 5545 26548, 26604, 26547, 26601, 26552, 26596, 26590, 26589, 26594, 26606, 5546 26553, 26574, 26566, 26599, 27292, 26654, 26694, 26665, 26688, 26701, 5547 26674, 26702, 26803, 26667, 26713, 26723, 26743, 26751, 26783, 26767, 5548 26797, 26772, 26781, 26779, 26755, 27310, 26809, 26740, 26805, 26784, 5549 26810, 26895, 26765, 26750, 26881, 26826, 26888, 26840, 26914, 26918, 5550 26849, 26892, 26829, 26836, 26855, 26837, 26934, 26898, 26884, 26839, 5551 26851, 26917, 26873, 26848, 26863, 26920, 26922, 26906, 26915, 26913, 5552 26822, 27001, 26999, 26972, 27000, 26987, 26964, 27006, 26990, 26937, 5553 26996, 26941, 26969, 26928, 26977, 26974, 26973, 27009, 26986, 27058, 5554 27054, 27088, 27071, 27073, 27091, 27070, 27086, 23528, 27082, 27101, 5555 27067, 27075, 27047, 27182, 27025, 27040, 27036, 27029, 27060, 27102, 5556 27112, 27138, 27163, 27135, 27402, 27129, 27122, 27111, 27141, 27057, 5557 27166, 27117, 27156, 27115, 27146, 27154, 27329, 27171, 27155, 27204, 5558 27148, 27250, 27190, 27256, 27207, 27234, 27225, 27238, 27208, 27192, 5559 27170, 27280, 27277, 27296, 27268, {f: 2, c: 27298}, 27287, 34327, 27323, 5560 27331, 27330, 27320, 27315, 27308, 27358, 27345, 27359, 27306, 27354, 5561 27370, 27387, 27397, 34326, 27386, 27410, 27414, 39729, 27423, 27448, 5562 27447, 30428, 27449, 39150, 27463, 27459, 27465, 27472, 27481, 27476, 5563 27483, 27487, 27489, 27512, [12109, 27513], {f: 2, c: 27519}, 27524, 27523, 5564 27533, 27544, 27541, 27550, 27556, {f: 2, c: 27562}, 27567, 27570, 27569, 5565 [12110, 27571], 27575, 27580, 27590, [12111, 27595], 27603, 27615, 27628, 5566 27627, 27635, 27631, 40638, 27656, 27667, [12115, 27668], 27675, 27684, 5567 27683, 27742, 27733, 27746, 27754, 27778, 27789, 27802, 27777, 27803, 5568 27774, 27752, 27763, 27794, 27792, 27844, 27889, 27859, 27837, 27863, 5569 27845, 27869, 27822, 27825, 27838, 27834, 27867, 27887, 27865, 27882, 5570 27935, 34893, 27958, 27947, 27965, 27960, 27929, 27957, 27955, 27922, 5571 27916, 28003, 28051, 28004, 27994, 28025, 27993, 28046, 28053, 28644, 5572 28037, 28153, 28181, 28170, 28085, 28103, 28134, 28088, 28102, 28140, 5573 28126, 28108, 28136, 28114, 28101, 28154, 28121, 28132, 28117, 28138, 5574 28142, 28205, 28270, 28206, 28185, 28274, 28255, 28222, 28195, 28267, 5575 28203, 28278, 28237, 28191, 28227, 28218, 28238, 28196, 28415, 28189, 5576 28216, 28290, 28330, 28312, 28361, 28343, 28371, 28349, 28335, 28356, 5577 28338, {f: 2, c: 28372}, 28303, 28325, 28354, 28319, 28481, 28433, 28748, 5578 28396, 28408, 28414, 28479, 28402, 28465, 28399, 28466, 28364, 28478, 5579 28435, 28407, 28550, 28538, 28536, 28545, 28544, 28527, 28507, 28659, 5580 28525, 28546, 28540, 28504, 28558, 28561, 28610, 28518, 28595, 28579, 5581 28577, 28580, 28601, 28614, 28586, 28639, 28629, 28652, 28628, 28632, 5582 28657, 28654, 28635, 28681, 28683, 28666, 28689, 28673, 28687, 28670, 5583 28699, 28698, 28532, 28701, 28696, 28703, 28720, 28734, 28722, 28753, 5584 28771, 28825, 28818, 28847, 28913, 28844, 28856, 28851, 28846, 28895, 5585 28875, 28893, 28889, 28937, 28925, 28956, 28953, 29029, 29013, 29064, 5586 29030, 29026, 29004, 29014, 29036, 29071, 29179, 29060, 29077, 29096, 5587 29100, 29143, 29113, 29118, 29138, 29129, 29140, 29134, 29152, 29164, 5588 29159, 29173, 29180, 29177, 29183, 29197, 29200, 29211, 29224, 29229, 5589 29228, 29232, 29234, [12120, 29243], 29244, [12121, 29247], 29248, 29254, 5590 29259, 29272, 29300, 29310, 29314, 29313, 29319, 29330, 29334, 29346, 5591 29351, 29369, 29362, 29379, 29382, 29380, 29390, 29394, 29410, 5592 {f: 2, c: 29408}, 29433, 29431, 20495, 29463, 29450, 29468, 29462, 29469, 5593 29492, 29487, 29481, 29477, 29502, {f: 2, c: 29518}, 40664, 29527, 29546, 5594 29544, 29552, 29560, 29557, 29563, 29562, 29640, 29619, 29646, 29627, 5595 29632, 29669, 29678, 29662, 29858, 29701, 29807, 29733, 29688, 29746, 5596 29754, 29781, 29759, 29791, 29785, 29761, 29788, 29801, 29808, 29795, 5597 29802, 29814, 29822, 29835, 29854, 29863, 29898, 29903, 29908, 29681, 5598 29920, 29923, 29927, 29929, 29934, 29938, {f: 2, c: 29936}, 29944, 29943, 5599 29956, 29955, 29957, 29964, 29966, 29965, 29973, 29971, 29982, 29990, 5600 29996, 30012, 30020, 30029, 30026, 30025, 30043, 30022, 30042, 30057, 5601 30052, 30055, 30059, 30061, 30072, 30070, {f: 2, c: 30086}, 30068, 30090, 5602 30089, 30082, 30100, 30106, 30109, 30117, 30115, 30146, 30131, 30147, 5603 30133, 30141, 30136, 30140, 30129, 30157, 30154, 30162, 30169, 30179, 5604 30174, {f: 2, c: 30206}, 30204, 30209, 30192, 30202, {f: 2, c: 30194}, 5605 30219, 30221, 30217, 30239, 30247, {f: 3, c: 30240}, 30244, 30260, 30256, 5606 30267, {f: 2, c: 30279}, 30278, 30300, 30296, {f: 2, c: 30305}, 5607 {f: 3, c: 30312}, 30311, 30316, 30320, 30322, [12136, 30326], 30328, 30332, 5608 30336, 30339, 30344, 30347, 30350, 30358, 30355, {f: 2, c: 30361}, 30384, 5609 30388, {f: 3, c: 30392}, 30402, 30413, 30422, 30418, 30430, 30433, 30437, 5610 30439, 30442, 34351, 30459, 30472, 30471, 30468, 30505, 30500, 30494, 5611 {f: 2, c: 30501}, 30491, {f: 2, c: 30519}, 30535, 30554, 30568, 30571, 5612 30555, 30565, 30591, 30590, 30585, 30606, 30603, 30609, 30624, 30622, 5613 30640, 30646, 30649, 30655, {f: 2, c: 30652}, 30651, 30663, 30669, 30679, 5614 30682, 30684, 30691, 30702, 30716, 30732, 30738, 31014, 30752, 31018, 5615 30789, 30862, 30836, 30854, 30844, 30874, 30860, 30883, 30901, 30890, 5616 30895, 30929, 30918, 30923, 30932, 30910, 30908, 30917, 30922, 30956, 5617 30951, 30938, 30973, 30964, 30983, 30994, 30993, 31001, 31020, 31019, 5618 31040, 31072, 31063, 31071, 31066, 31061, 31059, 31098, 31103, 31114, 5619 31133, 31143, 40779, 31146, 31150, 31155, {f: 2, c: 31161}, 31177, 31189, 5620 31207, 31212, 31201, 31203, 31240, 31245, {f: 2, c: 31256}, 31264, 31263, 5621 31104, 31281, 31291, 31294, 31287, 31299, 31319, 31305, {f: 2, c: 31329}, 5622 31337, 40861, 31344, 31353, 31357, 31368, 31383, 31381, 31384, 31382, 5623 31401, 31432, 31408, 31414, 31429, 31428, 31423, 36995, 31431, 31434, 5624 31437, 31439, 31445, 31443, {f: 2, c: 31449}, 31453, {f: 2, c: 31457}, 5625 31462, 31469, 31472, 31490, 31503, 31498, 31494, 31539, {f: 2, c: 31512}, 5626 31518, 31541, 31528, 31542, 31568, 31610, 31492, 31565, 31499, 31564, 5627 31557, 31605, 31589, 31604, 31591, {f: 2, c: 31600}, 31596, 31598, 31645, 5628 31640, 31647, 31629, 31644, 31642, 31627, 31634, 31631, 31581, 31641, 5629 31691, 31681, 31692, 31695, 31668, 31686, 31709, 31721, 31761, 31764, 5630 31718, 31717, 31840, 31744, 31751, 31763, 31731, 31735, 31767, 31757, 5631 31734, 31779, 31783, 31786, 31775, 31799, 31787, 31805, 31820, 31811, 5632 31828, 31823, 31808, 31824, 31832, 31839, 31844, 31830, 31845, 31852, 5633 31861, 31875, 31888, 31908, 31917, 31906, 31915, 31905, 31912, 31923, 5634 31922, 31921, 31918, 31929, 31933, 31936, 31941, 31938, 31960, 31954, 5635 31964, 31970, 39739, 31983, 31986, 31988, 31990, 31994, 32006, 32002, 5636 32028, 32021, 32010, 32069, 32075, 32046, 32050, 32063, 32053, 32070, 5637 32115, 32086, 32078, 32114, 32104, 32110, 32079, 32099, 32147, 32137, 5638 32091, 32143, 32125, 32155, 32186, 32174, 32163, 32181, 32199, 32189, 5639 32171, 32317, 32162, 32175, 32220, 32184, 32159, 32176, 32216, 32221, 5640 32228, 32222, 32251, 32242, 32225, 32261, 32266, 32291, 32289, 32274, 5641 32305, 32287, 32265, 32267, 32290, 32326, 32358, 32315, 32309, 32313, 5642 32323, 32311, 32306, 32314, 32359, 32349, 32342, 32350, {f: 2, c: 32345}, 5643 32377, 32362, 32361, 32380, 32379, 32387, 32213, 32381, 36782, 32383, 5644 {f: 2, c: 32392}, 32396, 32402, 32400, {f: 2, c: 32403}, 32406, 32398, 5645 {f: 2, c: 32411}, 32568, 32570, 32581, {f: 3, c: 32588}, 32592, 5646 [12153, 32593], 32597, 32596, 32600, {f: 2, c: 32607}, {f: 2, c: 32616}, 5647 32615, 32632, 32642, 32646, 32643, 32648, 32647, 32652, 32660, 32670, 5648 32669, 32666, 32675, 32687, 32690, 32697, 32686, 32694, 32696, 35697, 5649 {f: 2, c: 32709}, 32714, 32725, 32724, 32737, 32742, 32745, 32755, 32761, 5650 39132, 32774, 32772, 32779, [12158, 32786], {f: 2, c: 32792}, 32796, 32801, 5651 32808, 32831, 32827, 32842, 32838, 32850, 32856, 32858, 32863, 32866, 5652 32872, 32883, 32882, 32880, 32886, 32889, 32893, [12160, 32895], 32900, 5653 32902, 32901, 32923, 32915, 32922, 32941, 20880, 32940, 32987, 32997, 5654 32985, 32989, 32964, 32986, 32982, 33033, 33007, 33009, 33051, 33065, 5655 33059, 33071, 33099, 38539, 33094, 33086, 33107, 33105, 33020, 33137, 5656 33134, {f: 2, c: 33125}, 33140, 33155, 33160, 33162, 33152, 33154, 33184, 5657 33173, 33188, 33187, 33119, 33171, 33193, 33200, 33205, 33214, 33208, 5658 33213, 33216, 33218, 33210, 33225, 33229, 33233, 33241, 33240, 33224, 5659 33242, {f: 2, c: 33247}, 33255, {f: 2, c: 33274}, 33278, {f: 2, c: 33281}, 5660 33285, 33287, 33290, 33293, 33296, 33302, 33321, 33323, 33336, 33331, 5661 33344, 33369, 33368, 33373, 33370, 33375, 33380, 33378, 33384, 5662 {f: 2, c: 33386}, 33326, 33393, 33399, [12171, 33400], 33406, 33421, 33426, 5663 33451, 33439, 33467, 33452, 33505, 33507, 33503, 33490, 33524, 33523, 5664 33530, 33683, 33539, 33531, 33529, 33502, 33542, 33500, 33545, 33497, 5665 33589, 33588, 33558, 33586, 33585, 33600, 33593, 33616, 33605, 33583, 5666 33579, {f: 2, c: 33559}, 33669, 33690, 33706, 33695, 33698, 33686, 33571, 5667 33678, 33671, 33674, 33660, 33717, 33651, 33653, 33696, 33673, 33704, 5668 33780, 33811, 33771, 33742, 33789, 33795, 33752, 33803, 33729, 33783, 5669 33799, 33760, 33778, 33805, 33826, 33824, 33725, 33848, 34054, 33787, 5670 33901, 33834, 33852, 34138, 33924, 33911, 33899, 33965, 33902, 33922, 5671 33897, 33862, 33836, 33903, 33913, 33845, 33994, 33890, 33977, 33983, 5672 33951, 34009, 33997, 33979, 34010, 34000, 33985, 33990, 34006, 33953, 5673 34081, 34047, 34036, {f: 2, c: 34071}, 34092, 34079, 34069, 34068, 34044, 5674 34112, 34147, 34136, 34120, 34113, 34306, 34123, 34133, 34176, 34212, 5675 34184, 34193, 34186, 34216, 34157, 34196, 34203, 34282, 34183, 34204, 5676 34167, 34174, 34192, 34249, 34234, 34255, 34233, 34256, 34261, 34269, 5677 34277, 34268, 34297, 34314, 34323, 34315, 34302, 34298, 34310, 34338, 5678 34330, 34352, 34367, [12172, 34381], 20053, 34388, 34399, 34407, 34417, 5679 34451, 34467, {f: 2, c: 34473}, {f: 2, c: 34443}, 34486, 34479, 34500, 5680 34502, 34480, 34505, 34851, 34475, 34516, 34526, 34537, 34540, 34527, 5681 34523, 34543, 34578, 34566, 34568, 34560, 34563, 34555, 34577, 34569, 5682 34573, 34553, 34570, 34612, 34623, 34615, 34619, 34597, 34601, 34586, 5683 34656, 34655, 34680, 34636, 34638, 34676, 34647, 34664, 34670, 34649, 5684 34643, 34659, 34666, 34821, 34722, 34719, 34690, 34735, 34763, 34749, 5685 34752, 34768, 38614, 34731, 34756, 34739, 34759, 34758, 34747, 34799, 5686 34802, 34784, 34831, 34829, 34814, {f: 2, c: 34806}, 34830, 34770, 34833, 5687 34838, 34837, 34850, 34849, 34865, 34870, 34873, 34855, 34875, 34884, 5688 34882, 34898, 34905, 34910, 34914, 34923, 34945, 34942, 34974, 34933, 5689 34941, 34997, 34930, 34946, 34967, 34962, 34990, 34969, 34978, 34957, 5690 34980, 34992, 35007, 34993, {f: 2, c: 35011}, 35028, {f: 2, c: 35032}, 5691 35037, 35065, 35074, 35068, 35060, 35048, 35058, 35076, 35084, 35082, 5692 35091, 35139, 35102, 35109, {f: 2, c: 35114}, 35137, 35140, 35131, 35126, 5693 35128, 35148, 35101, 35168, 35166, 35174, 35172, 35181, 35178, 35183, 5694 35188, 35191, [12177, 35198], 35203, 35208, 35210, 35219, 35224, 35233, 5695 35241, 35238, 35244, 35247, 35250, 35258, 35261, {f: 2, c: 35263}, 35290, 5696 {f: 2, c: 35292}, 35303, 35316, 35320, 35331, 35350, 35344, 35340, 35355, 5697 35357, 35365, 35382, 35393, 35419, 35410, 35398, 35400, 35452, 35437, 5698 35436, 35426, 35461, 35458, 35460, 35496, 35489, 35473, {f: 2, c: 35493}, 5699 35482, 35491, 35524, 35533, 35522, 35546, 35563, 35571, 35559, 35556, 5700 35569, 35604, 35552, 35554, 35575, 35550, 35547, 35596, 35591, 35610, 5701 35553, 35606, 35600, 35607, 35616, 35635, 38827, 35622, 35627, 35646, 5702 35624, 35649, 35660, 35663, 35662, 35657, 35670, 35675, 35674, 35691, 5703 35679, 35692, 35695, 35700, 35709, 35712, 35724, 35726, {f: 2, c: 35730}, 5704 35734, {f: 2, c: 35737}, 35898, 35905, 35903, 35912, 35916, 35918, 35920, 5705 [12183, 35925], 35938, 35948, [12184, 35960], 35962, 35970, 35977, 35973, 5706 35978, {f: 2, c: 35981}, 35988, 35964, 35992, 25117, 36013, 36010, 36029, 5707 {f: 2, c: 36018}, 36014, 36022, 36040, 36033, 36068, 36067, 36058, 36093, 5708 {f: 2, c: 36090}, {f: 2, c: 36100}, 36106, 36103, 36111, 36109, 36112, 5709 40782, 36115, 36045, 36116, 36118, 36199, 36205, 36209, 36211, 36225, 5710 36249, 36290, 36286, 36282, 36303, 36314, 36310, 36300, 36315, 36299, 5711 {f: 2, c: 36330}, 36319, 36323, 36348, {f: 2, c: 36360}, 36351, 5712 {f: 2, c: 36381}, 36368, 36383, 36418, 36405, 36400, 36404, 36426, 36423, 5713 36425, 36428, 36432, 36424, 36441, 36452, 36448, 36394, 36451, 36437, 5714 36470, 36466, 36476, 36481, 36487, 36485, 36484, 36491, 36490, 36499, 5715 36497, 36500, 36505, 36522, 36513, 36524, 36528, 36550, 36529, 36542, 5716 36549, 36552, 36555, 36571, 36579, 36604, 36603, 36587, 36606, 36618, 5717 36613, 36629, 36626, 36633, 36627, 36636, 36639, 36635, 36620, 36646, 5718 36659, 36667, 36665, 36677, 36674, 36670, 36684, 36681, 36678, 36686, 5719 36695, 36700, {f: 3, c: 36706}, 36764, 36767, 36771, 36781, 36783, 36791, 5720 36826, 36837, 36834, 36842, 36847, 36999, 36852, 36869, {f: 2, c: 36857}, 5721 36881, 36885, 36897, 36877, 36894, 36886, 36875, 36903, 36918, 36917, 5722 36921, 36856, {f: 4, c: 36943}, 36878, 36937, 36926, 36950, 36952, 36958, 5723 36968, 36975, 36982, 38568, 36978, 36994, 36989, 36993, 36992, 37002, 5724 37001, 37007, 37032, 37039, 37041, 37045, 37090, 37092, 25160, 37083, 5725 37122, 37138, 37145, 37170, 37168, 37194, 37206, 37208, 37219, 37221, 5726 37225, 37235, 37234, 37259, 37257, 37250, 37282, 37291, 37295, 37290, 5727 37301, 37300, 37306, {f: 2, c: 37312}, 37321, 37323, 37328, 37334, 37343, 5728 37345, 37339, 37372, {f: 2, c: 37365}, 37406, 37375, 37396, 37420, 37397, 5729 37393, 37470, 37463, 37445, 37449, 37476, 37448, 37525, 37439, 37451, 5730 37456, 37532, 37526, 37523, 37531, 37466, 37583, 37561, 37559, 37609, 5731 37647, 37626, 37700, 37678, 37657, 37666, 37658, 37667, 37690, 37685, 5732 37691, 37724, 37728, 37756, 37742, 37718, 37808, {f: 2, c: 37804}, 37780, 5733 37817, {f: 2, c: 37846}, 37864, 37861, 37848, 37827, 37853, 37840, 37832, 5734 37860, 37914, 37908, 37907, 37891, 37895, 37904, 37942, 37931, 37941, 5735 37921, 37946, 37953, 37970, 37956, 37979, 37984, 37986, 37982, 37994, 5736 37417, 38000, 38005, 38007, 38013, 37978, 38012, 38014, 38017, 38015, 5737 38274, 38279, 38282, 38292, 38294, {f: 2, c: 38296}, 38304, 38312, 38311, 5738 38317, 38332, 38331, 38329, 38334, 38346, 28662, 38339, 38349, 38348, 5739 38357, 38356, 38358, 38364, 38369, 38373, 38370, 38433, 38440, 5740 {f: 2, c: 38446}, 38466, 38476, 38479, 38475, 38519, 38492, 38494, 38493, 5741 38495, 38502, 38514, 38508, 38541, 38552, 38549, 38551, 38570, 38567, 5742 {f: 2, c: 38577}, 38576, 38580, [12202, 38582], 38584, [12203, 38585], 5743 38606, 38603, 38601, 38605, 35149, 38620, 38669, 38613, 38649, 38660, 5744 38662, 38664, 38675, 38670, 38673, 38671, 38678, 38681, 38692, 38698, 5745 38704, 38713, {f: 2, c: 38717}, 38724, 38726, 38728, 38722, 38729, 38748, 5746 38752, 38756, 38758, 38760, 21202, 38763, 38769, 38777, 38789, 38780, 5747 38785, 38778, 38790, 38795, {f: 2, c: 38799}, 38812, 38824, 38822, 38819, 5748 {f: 2, c: 38835}, 38851, 38854, 38856, [12209, 38859], 38876, 5749 [12210, 38893], 40783, 38898, 31455, 38902, 38901, 38927, 38924, 38968, 5750 38948, 38945, 38967, 38973, 38982, 38991, 38987, 39019, {f: 3, c: 39023}, 5751 39028, 39027, 39082, 39087, 39089, 39094, 39108, 39107, 39110, 39145, 5752 39147, 39171, 39177, 39186, 39188, 39192, 39201, {f: 2, c: 39197}, 39204, 5753 39200, 39212, 39214, {f: 2, c: 39229}, 39234, 39241, 39237, 39248, 39243, 5754 {f: 2, c: 39249}, 39244, 39253, {f: 2, c: 39319}, 39333, {f: 2, c: 39341}, 5755 39356, 39391, 39387, 39389, 39384, 39377, {f: 2, c: 39405}, 5756 {f: 2, c: 39409}, 39419, 39416, 39425, 39439, 39429, 39394, 39449, 39467, 5757 39479, 39493, 39490, 39488, 39491, 39486, 39509, 39501, 39515, 39511, 5758 39519, 39522, 39525, 39524, 39529, 39531, 39530, 39597, 39600, 39612, 5759 39616, 39631, 39633, {f: 2, c: 39635}, 39646, [12221, 39647], 5760 {f: 2, c: 39650}, 39654, 39663, 39659, 39662, 39668, 39665, 39671, 39675, 5761 39686, 39704, 39706, 39711, {f: 2, c: 39714}, [12222, 39717], 5762 {f: 4, c: 39719}, 39726, [12223, 39727], [12224, 39730], 39748, 39747, 5763 39759, {f: 2, c: 39757}, 39761, 39768, 39796, 39827, 39811, 39825, 5764 {f: 2, c: 39830}, {f: 2, c: 39839}, 39848, 39860, 39872, 39882, 39865, 5765 39878, 39887, {f: 2, c: 39889}, 39907, 39906, 39908, 39892, 39905, 39994, 5766 39922, 39921, 39920, 39957, 39956, 39945, 39955, 39948, 39942, 39944, 5767 39954, 39946, 39940, 39982, 39963, 39973, 39972, 39969, 39984, 40007, 5768 39986, 40006, 39998, 40026, 40032, 40039, 40054, 40056, 40167, 40172, 5769 40176, 40201, 40200, 40171, 40195, 40198, 40234, 40230, 40367, 40227, 5770 40223, 40260, 40213, 40210, 40257, 40255, 40254, 40262, 40264, 5771 {f: 2, c: 40285}, 40292, 40273, 40272, 40281, 40306, 40329, 40327, 40363, 5772 40303, 40314, 40346, 40356, 40361, 40370, 40388, 40385, 40379, 40376, 5773 40378, 40390, 40399, 40386, 40409, 40403, 40440, 40422, 40429, 40431, 5774 40445, {f: 2, c: 40474}, 40478, [12228, 40565], 40569, 40573, 40577, 40584, 5775 {f: 2, c: 40587}, 40594, 40597, 40593, 40605, [12230, 40613], 40617, 40632, 5776 40618, 40621, 38753, 40652, {f: 3, c: 40654}, 40660, 40668, 40670, 40669, 5777 40672, 40677, 40680, 40687, 40692, {f: 2, c: 40694}, [12235, 40697], 5778 {f: 2, c: 40699}, [12236, 40701], {f: 2, c: 40711}, 30391, 40725, 40737, 5779 40748, 40766, [12241, 40778], [12242, 40786], 40788, 40803, 5780 {f: 3, c: 40799}, {f: 2, c: 40806}, 40812, 40810, 40823, 40818, 40822, 5781 40853, [12244, 40860], [12245, 40864], 22575, 27079, 36953, 29796, 0, 5782 {f: 76, c: 9472}, {f: 20, c: 9312}, {f: 10, c: 8544}, 13129, 13076, 0, 5783 13133, 0, 13095, 0, 13110, 13137, 0, 13069, 13094, 0, 13099, 13130, 0, 5784 {f: 3, c: 13212}, {f: 2, c: 13198}, 13252, 13217, 12317, 12319, 8470, 5785 13261, 0, {f: 5, c: 12964}, {f: 2, c: 12849}, 12857, 13182, 13181, 13180, 5786 8750, 8721, {s: 3}, 8735, 8895, 0, 0, 21854, {s: 7}, 167133, 0, 0, 28976, 5787 0, 40407, {s: 4}, 64054, 0, 0, 22169, 15694, {s: 4}, 20448, 0, 0, 36544, 0, 5788 194797, {s: 4}, 153716, 32363, 33606, 167670, {s: 3}, 40572, 0, 0, 26171, 5789 0, 40628, {s: 4}, 26629, {s: 5}, 23650, 0, 194780, 0, 32353, 0, 0, 64070, 5790 {s: 5}, 34083, 37292, {s: 7}, 34796, {s: 8}, 25620, 0, 0, 39506, {s: 4}, 5791 64074, 0, 194692, {s: 4}, 31774, {s: 6}, 64016, 25681, 0, 0, 63980, 22625, 5792 39002, 0, 194679, {s: 3}, 31153, 0, 28678, {s: 9}, 22218, {s: 3}, 21085, 0, 5793 28497, 37297, {s: 10}, 64106, {s: 6}, 38960, 0, 40629, {s: 9}, 33802, 5794 63939, {f: 2, c: 63890}, 63897, 0, 34847, 194575, 0, 194771, 194584, 5795 {s: 7}, 137754, 23643, {s: 4}, 25890, 0, 0, 26618, 0, 26766, 0, 148432, 5796 194848, {s: 21}, 34110, {s: 15}, 30562, {s: 12}, 65075, 0, 5797 {f: 2, c: 65073}, {s: 4}, 65072, {f: 2, c: 65077}, {f: 2, c: 65081}, 0, 0, 5798 {f: 2, c: 65079}, {f: 2, c: 65087}, {f: 2, c: 65085}, {f: 4, c: 65089}, 5799 {f: 2, c: 65083}, {s: 41}, {f: 3, c: 12436}, 0, 0, 22099, {s: 41}, 65508, 5800 65287, 65282, 0, 9665, 9655, 8681, 8679, 8678, 8680, 9634, 9831, 9825, 5801 9828, 9826, 13216, 13218, {f: 2, c: 13220}, 13207, 8467, 13208, 13235, 5802 13234, 13233, 13232, {f: 3, c: 13189}, 13259, 13200, 13268, 13206, 13090, 5803 13078, 13080, 13077, 13059, 13091, 13143, 13122, 13113, 13115, 13056, 5804 13105, 13127, 13086, 13098, 0, 13183, 8481, 9742, 12342, 12320, {s: 3}, 5805 {f: 9, c: 9352}, {f: 20, c: 9332}, 12881, {f: 10, c: 8560}, 5806 {f: 10, c: 12882}, {f: 26, c: 9372}, 12867, 12861, 12863, 12852, 12856, 5807 12851, 12860, 12866, 12862, 12854, 12853, 12859, 12864, 12858, 12976, 5808 12973, 12969, 12975, 12948, 12970, 12952, 12971, 12946, 12945, 12947, 5809 12972, 12974, 12950, {s: 8}, {f: 3, c: 9131}, 0, {f: 3, c: 9127}, 0, 13260, 5810 13061, 0, 0, 13215, 13219, 13222, 0, 0, 12958, {f: 2, c: 13192}, 13256, 5811 8749, 0, 12848, {f: 6, c: 12842}, 12855, 12865, 10145, {s: 3}, 9673, 9824, 5812 9829, 9827, 9830, {f: 4, c: 9728}, 9758, {f: 2, c: 9756}, 9759, 12953, 5813 9450, {f: 2, c: 8554}, {s: 3}, {f: 8, c: 9601}, 9615, 9614, 9613, 9612, 5814 9611, 9610, 9609, {f: 2, c: 9620}, {f: 2, c: 9581}, 9584, 9583, 9552, 9566, 5815 9578, 9569, {f: 2, c: 9698}, 9701, 9700, 0, 0, {f: 3, c: 9585}, {s: 20}, 5816 20956, 29081, {f: 9, c: 10102}, {s: 3}, {f: 2, c: 8570}, {s: 3}, 8575, 5817 8458, 8457, 0, 0, 12292, 8646, {f: 2, c: 8644}, 0, {f: 4, c: 12535}, 0, 0, 5818 12957, {s: 3}, 13179, {s: 3}, 13107, 13134, {s: 30}, 32394, 35100, 37704, 5819 37512, 34012, 20425, 28859, 26161, 26824, 37625, 26363, 24389, 5820 [12033, 20008], 20193, 20220, 20224, 20227, 20281, 20310, 20370, 20362, 5821 20378, 20372, 20429, 20544, 20514, 20479, 20510, 20550, 20592, 20546, 5822 20628, 20724, 20696, 20810, 20836, 20893, 20926, 20972, 21013, 21148, 5823 21158, 21184, 21211, 21248, 0, 21284, 21362, 21395, 21426, 21469, 64014, 5824 21660, 21642, 21673, 21759, 21894, 22361, 22373, 22444, 22472, 22471, 5825 64015, 0, 22686, 22706, 22795, 22867, 22875, 22877, 22883, 22948, 22970, 5826 23382, 23488, 29999, 23512, 0, 23582, 23718, 23738, 23797, 23847, 23891, 0, 5827 23874, 23917, {f: 2, c: 23992}, 24016, 24353, 24372, 24423, 24503, 24542, 5828 24669, 24709, 24714, 24798, 24789, 24864, 24818, 24849, 24887, 24880, 5829 24984, 25107, 25254, 25589, 25696, 25757, 25806, 25934, 26112, 26133, 5830 26121, 26158, 0, 26148, 26213, 26199, 26201, 64018, 26227, 26265, 26272, 5831 26290, 26303, 26362, 26382, 0, 26470, 26555, 26706, 26560, 0, 26692, 26831, 5832 64019, 26984, 64020, 27032, 27106, 27184, 27243, 27206, 27251, 27262, 5833 27362, 27364, 27606, 27711, 27740, 27782, 27759, 27866, 27908, 28039, 5834 28015, 28054, 28076, 28111, 28152, 28146, 28156, 28217, 28252, 28199, 5835 28220, 28351, 28552, 28597, 28661, 28677, 28679, 28712, 28805, 28843, 5836 28943, 28932, 29020, {f: 2, c: 28998}, 0, 29121, 29182, 29361, 29374, 5837 29476, 64022, 29559, 29629, 29641, 29654, 29667, 29650, 29703, 29685, 5838 29734, 29738, 29737, 29742, 0, 29833, 29855, 29953, 30063, 30338, 30364, 5839 30366, 30363, 30374, 64023, 30534, 21167, 30753, 30798, 30820, 30842, 5840 31024, {f: 3, c: 64024}, 31124, 64027, 31131, 31441, 31463, 64028, 31467, 5841 31646, 64029, 32072, 0, 32183, 32160, 32214, 32338, 32583, 32673, 64030, 5842 33537, 33634, 33663, 33735, 33782, 33864, 33972, 34131, 34137, 34155, 5843 64031, 34224, {f: 2, c: 64032}, 34823, 35061, 35346, 35383, 35449, 35495, 5844 35518, 35551, 64034, 35574, 35667, 35711, 36080, 36084, 36114, 36214, 5845 64035, 36559, 0, 64037, 36967, 37086, 64038, 37141, 37159, 37338, 37335, 5846 37342, {f: 2, c: 37357}, {f: 2, c: 37348}, 37382, 37392, 37386, 37434, 5847 37440, 37436, 37454, 37465, 37457, 37433, 37479, 37543, {f: 2, c: 37495}, 5848 37607, 37591, 37593, 37584, 64039, 37589, 37600, 37587, 37669, 37665, 5849 37627, 64040, 37662, 37631, 37661, 37634, 37744, 37719, 37796, 37830, 5850 37854, 37880, 37937, 37957, 37960, 38290, 0, 64041, 38557, 38575, 38707, 5851 38715, 38723, 38733, 38735, [12205, 38737], 0, 38999, 39013, 5852 {f: 2, c: 64042}, 39207, 64044, 39326, 39502, 39641, 39644, 39797, 39794, 5853 39823, 39857, 39867, 39936, 40304, 40299, 64045, 40473, 40657, {s: 636}, 5854 8364, 8486, 0, 0, 64256, {f: 2, c: 64259}, 257, 299, 363, 275, 333, 256, 5855 298, 362, 274, 332, {f: 4, c: 8539}, {f: 2, c: 8531}, 8304, 5856 {f: 6, c: 8308}, {f: 10, c: 8320}, 461, 282, 0, 7868, 463, 0, 296, 465, 0, 5857 467, 366, 360, 462, 283, 0, 7869, 464, 0, 297, 466, 0, 468, 367, 361, 593, 5858 8049, 8048, 509, 0, 596, 0, 0, 601, 0, 0, 602, 0, 0, 603, 8051, 8050, 0, 5859 331, 629, 652, 0, 0, 658, 643, 720, {s: 682}, {f: 10, c: 12832}, {s: 108}, 5860 {f: 4, c: 12892}, {f: 15, c: 12977}, {s: 50}, {f: 26, c: 9424}, 5861 {f: 26, c: 9398}, {s: 48}, {f: 47, c: 13008}, 0, {f: 10, c: 12928}, 12944, 5862 {f: 6, c: 12938}, 0, 12959, {s: 6}, {f: 2, c: 12960}, 12955, 12954, 12963, 5863 12962, 12951, 0, 12956, 12949, {s: 6}, 9676, {s: 11}, 10111, 5864 {f: 10, c: 9451}, {s: 510}, 8414, {s: 815}, 13274, {s: 3}, 8448, 13250, 0, 5865 0, 8453, 0, 13169, 0, 0, 13197, 13211, {s: 3}, {f: 2, c: 13271}, {s: 3}, 5866 {f: 2, c: 13057}, 13060, 13062, 0, 13064, 0, 13063, 13066, 0, 13065, 0, 5867 13067, 0, 13068, {f: 6, c: 13070}, 0, 13079, 0, 13081, 0, {f: 4, c: 13082}, 5868 {f: 3, c: 13087}, 13092, 0, 13093, 0, 0, {f: 2, c: 13096}, 0, 13101, 0, 0, 5869 {f: 3, c: 13102}, 13106, 0, 0, {f: 2, c: 13108}, 13116, {s: 3}, 13111, 0, 5870 13112, 13114, 13117, 13121, {f: 3, c: 13118}, {f: 4, c: 13123}, 13128, 5871 {f: 2, c: 13131}, {f: 2, c: 13135}, 0, 0, 13138, 13140, 0, 0, 13139, 5872 {f: 2, c: 13141}, {s: 132}, 8501, 976, 8714, 8463, 0, 981, 987, 977, 0, 5873 {f: 2, c: 9832}, 9836, {s: 5}, 12347, 0, {f: 3, c: 12339}, 8252, 8265, 5874 {s: 5}, 8723, 0, 8771, {f: 2, c: 8818}, {s: 6}, {f: 2, c: 12312}, 5875 {f: 2, c: 65375}, {s: 10}, 9115, {f: 2, c: 9117}, 9120, {s: 4}, 9121, 5876 {f: 2, c: 9123}, 9126, {s: 12}, [9116, 9119, 9122, 9125, 9130], {s: 8}, 5877 9986, 0, 0, 12349, 0, 12447, 0, 0, 8709, 8864, 8854, 8856, 8853, 8855, 5878 {s: 4}, 9664, 9654, {s: 4}, 8656, 8596, {f: 2, c: 8600}, {f: 2, c: 8598}, 5879 8652, 8651, {s: 10}, 12336, 8967, {s: 8}, 10048, 10047, {s: 7}, 9643, 0, 5880 9642, 0, 10010, {s: 12}, 9702, {s: 4}, 10070, {s: 379}, {f: 2, c: 65093}, 5881 {s: 679}, 64103, 64098, 32227, [12232, 40643], 28331, 64082, 64061, 64069, 5882 64062, 27114, 28212, 64096, 64071, 64056, 64066, 64078, 34395, 64105, 5883 64052, 64099, 25581, 25802, 30799, 64084, 63856, 64077, 64097, 64072, 5884 64076, {f: 2, c: 64091}, 64081, 64067, 64090, 28041, 29376, 0, 194885, 5885 64086, 64080, 64049, 64059, 24034, 64063, 64101, 21373, 64055, 64095, 5886 24501, 64064, 0, 64083, 0, 64085, 64104, 64068, 64089, 26202, 64053, 64075, 5887 64100, 64065, 64048, 0, 64057, 64051, 27493, 64058, 27599, 64050, 25150, 5888 64079, 63773, 63964, 63798, 28122, 63952, 26310, 27511, 64087, 37706, 0, 5889 37636, {s: 120}, 133390, {s: 120}, 35999, 11991, [11965, 158033], {s: 5}, 5890 37555, 38321, 0, 0, 194812, {s: 13}, 194965, {s: 8}, 194794, 0, 26478, 5891 11974, 0, 194594, {s: 13}, 13314, 0, 0, 26083, {s: 4}, 134071, {s: 10}, 5892 171339, 0, 194611, 24378, {s: 8}, 11945, 0, 20465, {s: 7}, 63753, {s: 7}, 5893 11964, 0, 0, 194732, 26435, {s: 3}, 133732, 35329, 25142, 0, 0, 21555, 5894 23067, {s: 3}, 25221, 0, 0, 194819, {s: 6}, 21567, {s: 9}, 27506, {s: 4}, 5895 29986, 19256, 0, 0, 24063, {s: 6}, 194827, 29626, 134047, {s: 3}, 194600, 5896 0, 194849, {s: 5}, 194623, {s: 16}, 194675, {f: 2, c: 11916}, 23577, 5897 {s: 3}, 131083, 23426, 194642, {s: 5}, 11997, [11999, 39136], 5898 [11998, 169599], 14221, 0, [11927, 14586], 0, 194887, 0, [11909, 20155], 5899 131490, {s: 7}, 13599, 0, 194738, 0, 0, [11971, 35200], {s: 4}, 31237, 5900 {s: 4}, 35498, 0, 32085, 0, 28568, {s: 7}, 25591, 30246, {s: 4}, 5901 [11978, 163767], {s: 5}, 146686, {s: 5}, 13351, 0, 0, 33067, 0, 0, 194842, 5902 {s: 5}, 11950, {s: 5}, 194714, {s: 3}, 194831, {s: 19}, 22305, 135741, 5903 194586, 0, 64003, {s: 7}, 21534, 15240, 20839, {s: 4}, 63839, {s: 9}, 5904 20023, {s: 13}, [11946, 150804], 24421, 23020, 194658, 0, 24217, {s: 46}, 5905 13416, {s: 8}, 21200, {s: 9}, 26625, 0, 195024, 195039, {s: 5}, 153215, 0, 5906 0, 11959, {s: 4}, 36534, 63775, {s: 3}, 63875, {s: 5}, 31867, 63906, 0, 5907 63898, 0, [11961, 32770], 157360, {s: 4}, [11911, 132648], 0, 0, 131210, 5908 194604, [11915, 13630], {s: 4}, 21589, 0, 22841, 0, 0, 23414, 194669, 5909 23572, 14306, 23782, 0, 20040, 0, 0, 194742, {s: 4}, 158105, 25371, 0, 0, 5910 26211, 0, 194779, 0, 0, 27126, 27014, {s: 3}, 27596, 0, 28183, 0, 0, 27818, 5911 {s: 3}, [11942, 20012], 0, 0, 29935, 30069, 30188, 30286, 16305, 30570, 5912 30633, {s: 6}, 31571, 0, 0, 16996, {s: 3}, 194924, 0, 0, 32328, {s: 5}, 5913 11955, {s: 4}, 33089, 17491, 0, [11966, 33401], [11967, 64094], 5914 [11968, 64093], 0, 20857, 33626, {s: 3}, 17701, 0, 34292, 131248, {s: 4}, 5915 34429, 0, 13358, 35014, {s: 6}, 18406, {s: 8}, 36808, {s: 19}, 166279, 0, 5916 0, 167447, 0, 0, 38969, {s: 6}, 39432, {s: 4}, 39903, {s: 10}, 148206, 5917 {s: 5}, 21385, 0, 64017, 194785, 0, 146622, 132625, 0, {f: 2, c: 19972}, 5918 19999, 20011, {f: 2, c: 20015}, {f: 2, c: 20032}, 20036, [11907, 20058], 5919 20095, 20109, 20118, 20153, 20176, 20192, 20221, 20223, 20235, 20245, 5920 20320, 20283, 20297, 20308, 20346, {f: 2, c: 20349}, 20375, 20414, 20431, 5921 20477, {f: 2, c: 20480}, 20496, 20507, 20519, 20526, 20567, 20582, 20586, 5922 20539, 20623, 20630, 20636, 20684, 20710, 20713, 20719, 20744, 20747, 5923 20752, 20763, 20766, 20831, 20897, 20924, 0, 20974, 20980, 20993, 5924 [11913, 20994], 21011, 21065, 21089, 21094, 21139, 21192, 21232, 5925 {f: 2, c: 21258}, 21310, 21324, 21323, 21345, 21356, 21419, 21466, 21478, 5926 21493, 21543, 21581, 21606, 21611, 21620, 21645, 21654, 21665, 21677, 5927 21689, 21695, 21702, 21709, 21774, 21803, 21813, 21834, 21856, 0, 21896, 5928 21902, 22024, {f: 2, c: 22030}, 22071, 22079, 22089, 22091, 22095, 22118, 5929 22121, 22127, {f: 2, c: 22129}, 22165, 22170, {f: 2, c: 22188}, 22193, 5930 22217, 22237, 22244, 22282, 22293, 22307, 22319, {f: 2, c: 22323}, 22348, 5931 22384, 22412, 22428, 22456, 22502, 22509, {f: 2, c: 22517}, 22527, 22537, 5932 22560, 22578, 22652, 22656, 22697, 22734, 22736, 22740, 22746, 22761, 5933 22796, 22820, 22831, 22881, 22893, 22986, 22994, 23005, {f: 2, c: 23011}, 5934 23044, 23052, 23075, 23111, 23125, 23139, 23149, 23166, 23198, 23207, 5935 23212, 23219, 23264, 23296, 23321, 23333, 23341, 23361, 23420, 5936 {f: 2, c: 23422}, 23434, [11919, 23587], 23595, 23600, 23651, 23657, 23676, 5937 23755, 23762, 23796, 23844, 23846, 23875, 23878, 23882, 23954, 23956, 5938 23961, 23968, 24024, 24032, 24056, 24064, 24082, {f: 2, c: 24084}, 24088, 5939 24110, 24152, {f: 2, c: 24171}, 24232, 24234, {f: 2, c: 24254}, 0, 24274, 5940 24327, 24334, {f: 2, c: 24348}, 24354, 24360, 24374, 24379, 24384, 5941 [12089, 24400], 24408, 24420, 24457, 24476, 24487, 24484, 24495, 24504, 5942 [11926, 24516], 24521, 24545, 24553, 24557, 24572, 24599, 24602, 24627, 5943 24673, 24703, 24734, 24740, 24752, 24779, 24795, 24824, {f: 3, c: 24850}, 5944 24860, 24956, 24973, 24991, 25000, 25026, 25055, 25109, 25129, 25155, 5945 25158, [11928, 25164], 25169, 25174, 25284, 25340, 25354, 25357, 25368, 5946 25401, {f: 2, c: 25410}, 25445, 25460, 25469, 25476, 25479, 25488, 25502, 5947 25553, 25564, 25609, 25616, 25634, 25684, 25691, 25709, 25723, 5948 {f: 2, c: 25790}, 25829, 25847, 25851, 25860, 25878, 25881, 25927, 25959, 5949 25985, 25989, 26050, 26096, 26098, 26156, 26188, {f: 2, c: 26203}, 26209, 5950 26219, 0, 26276, 26312, 26348, 26373, 26387, 26419, 26440, 26444, 26486, 5951 26491, 26544, 26546, 26617, 26583, 26585, 26608, 26668, {f: 2, c: 26672}, 5952 26715, 26738, 26741, 26746, 26756, 26789, 26802, 26832, 26838, 26856, 5953 26861, {f: 2, c: 26864}, 26876, 26897, 26899, 26933, 26939, 26967, 26979, 5954 26994, {f: 2, c: 27007}, 27046, 27053, 27063, {f: 2, c: 27094}, 27137, 5955 27151, 27157, 27176, 27188, 27198, 27205, {f: 2, c: 27216}, 27222, 27227, 5956 27267, 27273, 27281, {f: 3, c: 27293}, 27356, 27367, 27372, 27422, 27428, 5957 27445, 27462, 27478, 27488, 27522, 27582, 27617, 27633, 27664, 27699, 5958 [11937, 27701], 11938, 27737, 27766, 27771, 27781, 27797, 27804, 27856, 5959 27860, 27862, 27872, {f: 2, c: 27883}, 27886, 27914, 27918, 27921, 27950, 5960 27991, 27998, 28005, 28034, 28095, 28100, 28106, 28118, 28137, 28194, 5961 28241, 28359, 28362, 28366, 28413, 28442, 28458, 28463, 28467, 28506, 5962 28510, 28514, 28541, 28555, 28557, 28562, 28564, 28570, {f: 2, c: 28583}, 5963 28598, 28634, 28638, 0, 28729, 28732, 0, 28756, {f: 2, c: 28765}, 28772, 5964 [11939, 28780], 28798, 28801, 28821, 28855, {f: 2, c: 28883}, 28888, 28892, 5965 28935, 28960, 28977, 29002, 29010, 29024, 29049, 29074, 0, 29131, 29139, 5966 29142, 29184, 29213, 29227, 29240, 29249, 29267, {f: 2, c: 29269}, 29276, 5967 29325, [11944, 29357], 29364, 29383, 29435, {f: 2, c: 29444}, 29480, 29489, 5968 29507, 29548, 29564, 29571, {f: 2, c: 29573}, 29589, {f: 3, c: 29598}, 5969 29606, 29611, 29621, 29623, 29628, 29647, 29657, 29673, 29684, 29693, 5970 29700, 29706, {f: 2, c: 29722}, 29732, 29736, 29740, {f: 3, c: 29743}, 5971 29753, 29764, 29767, 29771, 29773, 29777, 29783, 29798, 29803, 29809, 5972 29824, {f: 3, c: 29829}, 29840, 29848, 29852, 29856, 29859, 29864, 29867, 5973 29877, 29887, 29896, 29914, 29918, 30030, 30073, 30081, 30096, 5974 [12135, 30098], 30099, 30132, 30180, 30201, 30208, 30218, {f: 2, c: 30229}, 5975 30233, 30238, 30253, 30261, 30275, 30283, 30309, 30317, 30319, 30321, 5976 30324, {f: 2, c: 30372}, 30405, 30412, 30444, 30460, 30516, 30518, 30556, 5977 {f: 2, c: 30559}, 30578, 30589, 30613, 30634, 30694, 30704, 30708, 30726, 5978 30754, {f: 2, c: 30765}, 30768, 30773, 30824, 30878, 30920, 30924, 30926, 5979 30948, {f: 2, c: 30944}, 30962, 30967, 30971, 31025, 0, [11949, 31035], 5980 31037, 31045, {f: 2, c: 31067}, 31115, 31126, 31128, [12145, 31160], 31163, 5981 31178, 31194, 31235, 31241, 31249, 31262, 31277, 31289, 31301, 31308, 5982 31325, 0, 31341, 31352, 31392, 31395, 31411, {f: 2, c: 31419}, 31430, 5983 31495, 31508, 31527, 31537, 31559, 31566, 31584, 31593, 31597, 31602, 5984 31633, 31663, 31703, 31705, 31755, 31759, 31776, 31782, 31793, 31798, 5985 31825, 31833, 31847, 31854, 31856, 31932, 31935, {f: 2, c: 31944}, 31959, 5986 31961, 31965, 31979, {f: 3, c: 32007}, 32019, 32029, 32035, 32065, 32083, 5987 32089, 32093, 32122, 32134, {f: 2, c: 32139}, 32204, 32235, 32241, 32249, 5988 32264, 32273, 32277, 32288, 32327, 32354, 32366, 32371, 32397, 32401, 5989 32408, 32580, 32591, [11947, 11954, 32594], [11953, 32595], 32609, 32657, 5990 32703, 32718, 32735, 32741, 32748, {f: 2, c: 32750}, 32762, 32782, 32785, 5991 32788, 32804, 32806, 32826, 32828, 32864, 32881, 32885, 32926, 32934, 5992 32939, {f: 2, c: 32983}, 33046, 33048, 33082, 33098, 33100, 33153, 33156, 5993 33204, 33231, 33273, 33283, 33313, 33330, 33332, 33350, 33355, 33359, 5994 33422, 33454, 33463, 33470, 33478, 33534, 33603, 33617, 33621, 33670, 5995 33677, 33682, 33688, 33705, {f: 2, c: 33727}, 33770, 33807, 33809, 33866, 5996 33910, 33960, 33967, 33984, 33986, 34032, 34045, 34060, 34100, 34142, 5997 34191, 34231, 34254, 34221, 34322, 34345, 34386, 34403, 34412, 34415, 5998 34426, 34445, 34449, 34456, {f: 2, c: 34471}, 34554, 34557, 34571, 34579, 5999 34585, 34590, 34600, 34622, 34673, 34696, 34713, {f: 2, c: 34732}, 34741, 6000 34774, 34795, 34797, 34817, 0, 34822, 34827, 34836, 34844, 34902, 34911, 6001 [11970, 34916], 34968, 34986, {f: 2, c: 35005}, 35018, 35026, 35035, 6002 {f: 2, c: 35056}, 35078, {f: 3, c: 35096}, 35111, 35120, 35134, 35195, 6003 35284, 35286, 35301, 35313, 35335, 35343, 35349, 35362, 35406, 35455, 6004 35572, 35615, 35639, {f: 2, c: 35651}, 35668, 35740, 35742, 35911, 35924, 6005 35955, 36004, 36057, 36065, 36088, 36094, 36123, 36201, 36204, 36228, 6006 36237, 36245, 36262, 36294, 36302, 36324, 36332, 36384, 36427, 36460, 6007 36464, 36474, 36498, 36526, 36531, 36561, 36564, 36601, 36631, 36662, 6008 36774, [12193, 36789], [11981, 36790], 0, 36832, 36836, 36854, 36866, 6009 36908, 36932, 37000, 37013, 37017, 37019, 37026, 37044, 37079, 37085, 6010 37108, 37143, 37148, 37169, 37178, 37181, 37192, 37211, 37217, 37220, 6011 37262, 37278, 37288, {f: 2, c: 37293}, 37298, 37308, 37360, 37367, 37371, 6012 37383, 37416, 37427, 37432, 37443, 37447, 37455, 37472, 37570, 6013 {f: 2, c: 37579}, 37599, 37645, 37653, 37663, 37671, 37703, 37714, 0, 6014 37738, 37741, 37787, 37818, 37801, 37825, 37834, 37858, 37882, 37885, 6015 37903, 37940, 37951, 37973, 37995, 38002, [11986, 38264], 38310, 38313, 0, 6016 38324, 38333, 38362, [11983, 11990, 38429], 38465, 38488, 38532, 38564, 6017 38569, 38610, 195060, 38622, 38633, 38641, 38658, 38665, 38746, 38755, 6018 38766, 38771, 38810, 38818, {f: 2, c: 38837}, 38873, 38878, 38900, 38922, 6019 38926, 38942, 38947, 38955, 38974, {f: 2, c: 38994}, 39001, 39020, 39096, 6020 39098, 39103, 39112, 39141, {f: 2, c: 39218}, 39232, 39245, 39260, 39263, 6021 39345, {f: 2, c: 39353}, 39369, 39426, 39446, 39460, 39463, 6022 {f: 2, c: 39469}, 39478, 39480, 39498, 39510, {f: 2, c: 39605}, 39673, 6023 39683, 39712, {f: 2, c: 39731}, 39795, 39801, 39847, 39873, 39879, 39895, 6024 39911, 39915, 39927, 39930, 39933, 39947, 39975, 39978, 39990, 40001, 6025 40019, 40035, 40048, 40055, 40194, 40258, 40263, 40291, 40297, 40316, 6026 40318, 40333, 40369, 40387, 40391, 40406, 40415, 40427, 40436, 40469, 6027 40477, 40612, 40616, 40620, 40679, 40686, 40720, 40722, 40727, 40729, 6028 40751, 40759, 40761, 40769, 40773, 40791, 40808, 40817, 40821, 40848, 6029 40852, 40866, 0, 13317, 194564, 22048, 24267, 11925, 0, 144954, 0, 28665, 6030 28390, 29107, [11940, 64073], {s: 4}, [11980, 64102], 0, 23986, 0, 20435, 6031 20697, 20720, 20931, 22134, 27220, 27905, 28112, 28226, 28377, 29668, 6032 29729, 30060, 30801, 34805, 144382, 29608, 15091, 13531, 17420, 16010, 0, 6033 0, 19432, 0, 16090, 15138, 0, 17786, 16531, 0, 18021, 16643, 17043, 18094, 6034 13448, 140809, {f: 3, c: 63584}, 63610, 63615, {s: 23}, {f: 2, c: 8836}, 6035 {f: 2, c: 8842}, 8713, 0, {f: 2, c: 8965}, {s: 9}, {f: 2, c: 8741}, 6036 {s: 14}, 8802, 0, 8773, 8776, {f: 2, c: 8822}, {s: 4}, 8487, {s: 209}, 6037 {f: 2, c: 8922}, 8533, 8984, {f: 2, c: 7742}, {f: 2, c: 504}, 470, 472, 6038 474, 476, 260, 728, 317, 346, 350, 356, 377, 379, 261, 731, 318, 347, 711, 6039 351, 357, 378, 733, 380, 340, 258, 313, 262, 268, 280, 270, 323, 327, 336, 6040 344, 368, 354, 341, 259, 314, 263, 269, 281, 271, 273, 324, 328, 337, 345, 6041 369, 355, 729, 264, 284, 292, 308, 348, 364, 265, 285, 293, 309, 349, 365, 6042 625, 651, 638, 620, 622, 633, 648, 598, 627, 637, 642, 656, 635, 621, 607, 6043 626, 669, 654, 609, 624, 641, 295, 661, 660, 614, 664, 450, 595, 599, 644, 6044 608, 403, 616, 649, 600, 604, 606, 592, 623, 650, 612, 594, 653, 613, 674, 6045 673, 597, 657, 634, 615, 865, 712, 716, 721, 8255, 783, {f: 5, c: 741}, 0, 6046 0, 805, 812, 825, 796, {f: 2, c: 799}, 829, 809, 815, 734, 804, 816, 828, 6047 820, {f: 2, c: 797}, {f: 2, c: 792}, 810, {f: 2, c: 826}, 794, {s: 3}, 6048 {f: 2, c: 610}, 618, 628, 630, 632, 640, 655, 665, 668, 671, 688, 690, 695, 6049 704, {f: 2, c: 736}, {s: 6}, 8862, {s: 287}, 12348, 12543, 0, 6050 {f: 2, c: 12310}, 9838, 9835, {f: 2, c: 10548}, 10687, 0, 12448, 0, 6051 {f: 2, c: 10746}, {s: 13}, 962, {f: 10, c: 9461}, {f: 2, c: 9750}, 9649, 6052 {f: 10, c: 12784}, 0, {f: 6, c: 12794}, {f: 15, c: 9150}, 0, 0, 10003, 0, 6053 9251, 9166, {f: 4, c: 9680}, {f: 2, c: 8263}, 0, 8273, 8258, 6054 {f: 16, c: 12688}, {s: 13}, {f: 2, c: 9136}, {f: 12, c: 9842}, 6055 {f: 2, c: 12441}, 8413, {s: 450}, 20296, 20319, 20330, 20332, 20494, 20504, 6056 20545, 20722, 20688, 20742, 20739, 20789, 20821, 20823, 13493, 20938, 6057 20962, 21079, 21196, 21206, 21243, 21276, 21347, 21405, 21522, 21631, 6058 21640, 21840, 21889, 21933, 21966, 22075, 22174, 22185, 22195, 22391, 6059 22396, 135963, 22479, 22500, 22628, 22665, 136302, 22738, 22752, 34369, 6060 22923, 22930, 22979, 23059, 23143, 23159, 23172, 23236, 137405, 23421, 6061 23443, 23570, 64060, 136884, 23674, 23695, 23711, 23715, 23722, 23760, 6062 138804, 23821, 23879, 23937, 23972, 23975, 24011, 24158, 24313, 24320, 6063 24322, 24355, 24381, 24404, 24445, 24589, 24596, 24600, 24629, 24647, 6064 24733, 24788, 24797, 24875, 25020, 25017, 25122, 25178, 25199, 25302, 6065 25468, 25573, 25721, 25796, 25808, 25897, 26013, 26170, 26146, 26155, 6066 26160, 26163, 26184, 143812, {f: 2, c: 26231}, 26253, 26299, 26331, 26344, 6067 26439, 26497, 26515, 26520, 26523, 26620, 26653, 26787, 26890, 26953, 6068 144836, 26946, 26980, 27045, 27087, 15286, 15299, 27113, 27125, 145215, 6069 27195, 145251, 27284, 27301, 15375, 27419, 27436, 27495, 27561, 27565, 6070 27607, 27647, 27653, 27764, 27800, 27899, 27846, 27953, 27961, 27967, 6071 27992, 28052, 28074, 28123, 28125, 28228, 28254, 28337, 28353, 28432, 6072 28505, 28513, 28542, 28556, 28576, 28604, 28615, 28618, 28656, 28750, 6073 28789, 28836, 28900, 28971, 28958, 28974, 29009, 29032, 29061, 29063, 6074 29114, 29124, 29205, 15935, 29339, 149489, 29479, 29520, 29542, 29602, 6075 29739, 29766, 29794, 29805, 29862, 29865, 29897, 29951, 29975, 16242, 6076 30158, 30210, 30216, 30308, 30337, 30365, 30378, 30390, 30414, 30420, 6077 30438, 30449, 30474, 30489, {f: 2, c: 30541}, 30586, 30592, 30612, 30688, 6078 152718, 30787, 30830, 30896, 152846, 30893, 30976, 31004, 31022, 31028, 6079 31046, 31097, 31176, 153457, 31188, 31198, 31211, 31213, 31365, 154052, 6080 31438, 31485, 31506, 31533, 31547, 31599, 31745, 31795, 155041, 31853, 6081 31865, 31887, 31892, 31904, 31957, 32049, 32092, 32131, 32166, 32194, 6082 32296, 32663, 32731, 32821, 32823, 32970, 32992, 33011, 33120, 6083 {f: 2, c: 33127}, 33133, 33211, 33226, 33239, 17499, 33376, 33396, 158463, 6084 33441, {f: 2, c: 33443}, 33449, 33471, 33493, 33533, 33536, 33570, 33581, 6085 33594, 33607, 33661, 33703, 33743, 33745, 33761, 33793, 33798, 33887, 6086 33904, 33907, 33925, 33950, 33978, 159296, 34098, 34078, 34095, 34148, 6087 34170, 34188, 34210, 34251, 34285, 34303, {f: 2, c: 34308}, 34320, 159988, 6088 34328, 34360, 34391, 34402, 17821, 34421, 34488, 34556, 34695, 17898, 6089 34826, 34832, 35022, 161412, 35122, 35129, 35136, 35220, 35318, 35399, 6090 35421, 35425, 35445, 35536, 35654, 35673, 35689, 35741, 35913, 35944, 6091 36271, 36305, 36311, 36387, 36413, 36475, 164471, 18500, 36602, 36638, 6092 36653, 36692, 164813, 36840, 36846, 36872, 36909, 37015, 37043, 37054, 6093 {f: 2, c: 37060}, 37063, 37103, 37140, 37142, {f: 2, c: 37154}, 37167, 6094 37172, 37251, 37361, 37705, {f: 2, c: 37732}, 37795, 37855, 37892, 37939, 6095 37962, 37987, 38001, 38286, 38303, 38316, 38326, 38347, 38352, 38355, 6096 18864, 38366, 38565, 38639, 38734, 38805, 38830, 38842, 38849, 38857, 6097 38875, 38998, 39143, 39256, 39427, 39617, 39619, 39630, 39638, 39682, 6098 39688, 19479, 39725, 39774, 39782, 39812, 39818, 39838, 39886, 39909, 6099 39928, 39971, {f: 2, c: 40015}, 40037, {f: 2, c: 40221}, 40259, 40274, 6100 40330, 40342, 40384, 40364, 40380, 172432, 40423, 40455, 40606, 40623, 6101 40855, 131209, 19970, 19983, 19986, 20009, 20014, 20039, 131234, 20049, 6102 13318, 131236, 20073, 20125, 13356, 20156, 20163, 20168, 20203, 20186, 6103 20209, 20213, 20246, 20324, 20279, 20286, 20312, 131603, {f: 2, c: 20343}, 6104 20354, 20357, 20454, 20402, 20421, 20427, 20434, 13418, 20466, 20499, 6105 20508, 20558, 20563, 20579, 20643, 20616, {f: 2, c: 20626}, 20629, 20650, 6106 131883, 20657, {f: 2, c: 20666}, 20676, 20679, 20723, 131969, 20686, 6107 131953, 20692, 20705, 13458, 132089, 20759, 132170, 20832, 132361, 20851, 6108 20867, 20875, 13500, 20888, 20899, 20909, 13511, 132566, 20979, 21010, 6109 21014, 132943, 21077, 21084, 21100, 21111, 21124, 21122, 133127, 21144, 6110 133178, 21156, {f: 2, c: 21178}, 21194, 21201, 133305, 21239, 21301, 21314, 6111 133500, 133533, 21351, 21370, 21412, 21428, 133843, 21431, 21440, 133917, 6112 {f: 2, c: 13661}, 21461, 13667, 21492, 21540, 21544, 13678, 21571, 21602, 6113 21612, 21653, 21664, 21670, 21678, 21687, 21690, 21699, 134469, 21740, 6114 21743, 21745, 21747, {f: 2, c: 21760}, 21769, 21820, 21825, 13734, 21831, 6115 13736, 21860, 134625, 21885, 21890, 21905, 13765, 21970, 134805, 134765, 6116 21951, 21961, 21964, 21969, 21981, 13786, 21986, 134756, 21993, 22056, 6117 135007, 22023, 22032, 22064, 13812, 22077, 22080, 22087, 22110, 22112, 6118 22125, 13829, 22152, 22156, 22173, 22184, 22194, 22213, 22221, 22239, 6119 22248, {f: 2, c: 22262}, 135681, 135765, 22313, 135803, {f: 2, c: 22341}, 6120 22349, 135796, 22376, 22383, {f: 3, c: 22387}, 22395, 135908, 135895, 6121 22426, {f: 2, c: 22429}, 22440, 22487, 135933, 22476, 135990, 136004, 6122 22494, 22512, 13898, 22520, 22523, 22525, 22532, 22558, 22567, 22585, 6123 136132, 22601, 22604, 22631, {f: 2, c: 22666}, 22669, {f: 2, c: 22671}, 6124 22676, 22685, 22698, 22705, 136301, 22723, 22733, 22754, {f: 2, c: 22771}, 6125 {f: 2, c: 22789}, 22797, 22804, 136663, 13969, 22845, 13977, 22854, 13974, 6126 158761, 22879, 136775, {f: 2, c: 22901}, 22908, 22943, 22958, 22972, 22984, 6127 22989, 23006, 23015, 23022, 136966, 137026, 14031, 23053, 23063, 23079, 6128 23085, 23141, 23162, 23179, 23196, {f: 2, c: 23199}, 23202, 23217, 23221, 6129 23226, 23231, 23258, 23260, 23269, 23280, 23278, 23285, 23304, 23319, 6130 23348, 23372, 23378, 23400, 23407, 23425, 23428, 137667, 23446, 23468, 6131 {f: 2, c: 14177}, 23502, 23510, 14188, 14187, 23537, 23549, 14197, 23555, 6132 23593, 138326, 23647, {f: 2, c: 23655}, 23664, 138541, 138565, 138616, 6133 138594, 23688, 23690, 14273, 138657, 138652, 23712, 23714, 23719, 138642, 6134 23725, 23733, 138679, 23753, 138720, 138803, 23814, 23824, 23851, 23837, 6135 23840, 23857, 23865, 14312, 23905, 23914, 14324, 23920, 139038, 14333, 6136 23944, 14336, 23959, 23984, 23988, 139126, 24017, 24023, 139258, 24036, 6137 24041, 14383, 14390, 14400, 24095, 24126, 24137, 14428, 24150, 14433, 6138 {f: 2, c: 24173}, 139643, 24229, 24236, 24249, 24262, 24281, 140062, 24317, 6139 24328, 140205, 24350, 24391, 24419, 24434, 24446, 24463, 24482, 24519, 6140 24523, {f: 3, c: 24530}, 24546, {f: 2, c: 24558}, 24563, 14615, 24610, 6141 24612, 14618, 24652, 24725, 24744, 141043, 24753, 24766, 24776, 24793, 6142 24814, 24821, 24848, 24857, 24862, 24890, 14703, 24897, 24902, 24928, 6143 141403, {f: 2, c: 24978}, 24983, 24997, 25005, 141483, 25045, 25053, 25077, 6144 141711, 25123, 25170, 25185, 25188, 25211, 25197, 25203, 25241, 25301, 6145 142008, 25341, 25347, 25360, {f: 2, c: 142159}, 25394, 25397, 6146 {f: 2, c: 25403}, 25409, 25412, 25422, 142150, 25433, 142365, 142246, 6147 25452, 25497, 142372, 25492, 25533, {f: 2, c: 25556}, 25568, 6148 {f: 2, c: 25579}, 25586, 25630, 25637, 25641, 25647, 25690, 25693, 25715, 6149 25725, 25735, 25745, 25759, {f: 2, c: 25803}, 25813, 25815, 142817, 25828, 6150 25855, 14958, 25871, 25876, 14963, 25886, 25906, 25924, 25940, 25963, 6151 25978, 25988, 25994, 26034, 26037, 26040, 26047, 26057, 26068, 15062, 6152 26105, 26108, 26116, 26120, 26145, 26154, 26181, 26193, 26190, 15082, 6153 143811, 143861, 143798, 26218, {f: 2, c: 26220}, 26235, 26240, 26256, 6154 26258, 15118, 26285, 26289, 26293, 15130, 15132, 15063, 26369, 26386, 6155 144242, 26393, 144339, 144338, 26445, 26452, 26461, 144336, 144356, 144341, 6156 26484, 144346, 26514, 144351, 33635, 26640, 26563, 26568, 26578, 26587, 6157 26615, 144458, 144465, 144459, 26648, 26655, 26669, 144485, 26675, 26683, 6158 26686, 26693, 26697, 26700, 26709, 26711, 15223, 26731, 26734, 26748, 6159 26754, 26768, 26774, 15213, {f: 3, c: 26776}, 26780, {f: 2, c: 26794}, 6160 26804, 26811, 26875, 144612, 144730, 26819, 26821, 26828, 26841, 6161 {f: 2, c: 26852}, 26860, 26871, 26883, 26887, 15239, 144788, 15245, 26950, 6162 26985, 26988, 27002, 27026, 15268, 27030, 27056, 27066, 27068, 27072, 6163 27089, 144953, 144967, 144952, 27107, {f: 2, c: 27118}, 27123, 15309, 6164 27124, 27134, 27153, 27162, 27165, 145180, {f: 2, c: 27186}, 27199, 27209, 6165 27258, 27214, 27218, 27236, 145164, 27275, 15344, 27297, 145252, 27307, 6166 27325, 27334, 27348, 27344, 27357, 145407, 145383, {f: 3, c: 27377}, 27389, 6167 145444, 27403, {f: 3, c: 27407}, 145469, 27415, 15398, 27439, 27466, 27480, 6168 27500, 27509, [11934, 27514], 27521, 27547, 27566, 146072, 27581, 6169 {f: 3, c: 27591}, 27610, {f: 2, c: 27622}, 27630, 27650, 27658, 27662, 6170 27702, 146559, 27725, 27739, 27757, 27780, 27785, 15555, 27796, 27799, 6171 27821, 27842, 15570, 27868, 27881, 27885, 146688, 27904, 27940, 6172 {f: 2, c: 27942}, 27751, 27951, 27964, 27995, 28000, 28016, 6173 {f: 2, c: 28032}, 28042, 28045, 28049, 28056, 146752, 146938, 146937, 6174 146899, 28075, 28078, 28084, 28098, 27956, 28104, 28110, 28127, 28150, 6175 28214, 28190, 15633, 28210, {f: 2, c: 28232}, {f: 2, c: 28235}, 28239, 6176 {f: 2, c: 28243}, 28247, 28259, 15646, 28307, 28327, 28340, 28355, 28469, 6177 28395, 28409, 28411, 28426, 28428, 28440, 28453, 28470, 28476, 147326, 6178 28498, 28503, 28512, 28520, 28560, 28566, 28606, 28575, 28581, 28591, 6179 15716, {f: 2, c: 28616}, 28649, 147606, 28668, 28672, 28682, 28707, 147715, 6180 28730, 28739, 28743, 28747, 15770, 28773, 28777, 28782, 28790, 28806, 6181 28823, 147910, 28831, 28849, 147966, 28908, 28874, 28881, 28931, 28934, 6182 28936, 28940, 15808, 28975, 29008, 29011, 29022, 15828, 29078, 29056, 6183 29083, 29088, 29090, {f: 2, c: 29102}, 148412, 29145, 29148, 29191, 15877, 6184 29236, 29241, 29250, 29271, 29283, 149033, {f: 2, c: 29294}, 29304, 29311, 6185 29326, 149157, 29358, 29360, 29377, 15968, 29388, 15974, 15976, 29427, 6186 29434, 29447, 29458, {f: 2, c: 29464}, 16003, 29497, 29484, 29491, 29501, 6187 29522, 16020, 29547, 149654, {f: 2, c: 29550}, 29553, 29569, 29578, 29588, 6188 29592, 29596, 29605, 29625, 29631, 29637, 29643, 29665, 29671, 29689, 6189 29715, 29690, 29697, 29779, 29760, 29763, 29778, 29789, 29825, 29832, 6190 150093, 29842, 29847, 29849, 29857, 29861, 29866, 29881, 29883, 29882, 6191 29910, 29912, 29931, 150358, 29946, 150383, 29984, 29988, 29994, 16215, 6192 150550, {f: 2, c: 30013}, 30016, 30024, 30032, 30034, 30066, 30065, 30074, 6193 {f: 2, c: 30077}, 30092, 16245, 30114, 16247, 30128, 30135, 6194 {f: 2, c: 30143}, 30150, 30159, 30163, 30173, {f: 2, c: 30175}, 30183, 6195 30190, 30193, 30211, 30232, 30215, 30223, 16302, 151054, 30227, 6196 {f: 2, c: 30235}, 151095, 30245, 30248, 30268, 30259, 151146, 16329, 30273, 6197 151179, 30281, 30293, 16343, 30318, 30357, 30369, 30368, {f: 2, c: 30375}, 6198 30383, 151626, 30409, 151637, 30440, 151842, 30487, 30490, 30509, 30517, 6199 151977, 16441, 152037, 152013, 30552, 152094, 30588, 152140, 16472, 30618, 6200 30623, 30626, 30628, {f: 2, c: 30686}, 30692, 30698, 30700, 30715, 152622, 6201 30725, 30729, 30733, 30745, 30764, 30791, 30826, 152793, 30858, 30868, 6202 30884, 30877, 30879, 30907, 30933, 30950, {f: 2, c: 30969}, 30974, 152999, 6203 30992, 31003, 31013, 31050, 31064, 16645, 31079, 31090, 31125, 31137, 6204 31145, 31156, 31170, 31175, {f: 2, c: 31180}, 31190, 16712, 153513, 153524, 6205 16719, 31242, 31253, 31259, 16739, 31288, 31303, 31318, 31321, 31324, 6206 31327, 31335, 31338, 31349, 31362, 31370, 31376, 31404, 154068, 16820, 6207 31417, 31422, 16831, 31436, 31464, 31476, 154340, 154339, 154353, 31549, 6208 31530, {f: 2, c: 31534}, 16870, 16883, 31615, 31553, 16878, 31573, 31609, 6209 31588, 31590, 31603, 154546, 16903, 31632, 31643, 16910, 31669, 31676, 6210 31685, 31690, 154699, 154724, 31700, 31702, 31706, 31722, 31728, 31747, 6211 31758, 31813, 31818, 31831, 31838, 31841, 31849, 31855, 155182, 155222, 6212 155237, 31910, 155234, {f: 2, c: 31926}, 155352, 31940, 155330, 31949, 6213 155368, 155427, 31974, 155484, 31989, 32003, 17094, 32018, 32030, 155616, 6214 155604, {f: 2, c: 32061}, 32064, 32071, 155660, 155643, 17110, 32090, 6215 32106, 32112, 17117, 32127, 155671, 32136, 32151, 155744, 32157, 32167, 6216 32170, 32182, 32192, 32215, 32217, 32230, 17154, 155885, 64088, 32272, 6217 32279, 32285, 32295, 32300, 32325, 32373, 32382, {f: 2, c: 32390}, 17195, 6218 32410, 17219, 32572, 32571, 32574, 32579, 13505, 156272, 156294, 6219 {f: 2, c: 32611}, 32621, {f: 2, c: 32637}, 32656, 20859, 146702, 32662, 6220 32668, 32685, 156674, 32707, 32719, 32739, 32754, 32778, 32776, 32790, 6221 32812, 32816, 32835, 32870, 32891, 32921, 32924, 32932, 32935, 32952, 6222 157310, 32965, 32981, 32998, 33037, 33013, 33019, 17390, 33077, 33054, 6223 17392, 33060, 33063, 33068, 157469, 33085, 17416, 33129, 17431, 17436, 6224 33157, 17442, 33176, 33202, 33217, 33219, 33238, 33243, 157917, 33252, 6225 157930, 33260, 33277, 33279, 158063, 33284, 158173, 33305, 33314, 158238, 6226 33340, 33353, 33349, 158296, 17526, 17530, 33367, 158348, 33372, 33379, 6227 158391, 17553, 33405, 33407, 33411, 33418, 33427, {f: 2, c: 33447}, 33458, 6228 33460, 33466, 33468, 33506, 33512, 33527, {f: 2, c: 33543}, 33548, 33620, 6229 33563, 33565, 33584, 33596, 33604, 33623, 17598, 17620, 17587, 6230 {f: 2, c: 33684}, 33691, 33693, 33737, 33744, 33748, 33757, 33765, 33785, 6231 33813, 158835, 33815, 33849, 33871, {f: 2, c: 33873}, {f: 2, c: 33881}, 6232 33884, 158941, 33893, 33912, 33916, 33921, 17677, 33943, 33958, 33982, 6233 17672, {f: 2, c: 33998}, 34003, 159333, 34023, 34026, 34031, 34033, 34042, 6234 34075, {f: 2, c: 34084}, 34091, 34127, 34159, 17731, 34129, 6235 {f: 2, c: 34145}, 159636, 34171, 34173, 34175, 34177, 34182, 34195, 34205, 6236 34207, 159736, {f: 2, c: 159734}, 34236, 34247, 34250, {f: 2, c: 34264}, 6237 34271, 34273, 34278, 34294, 34304, 34321, 34334, 34337, 34340, 34343, 6238 160013, 34361, 34364, 160057, 34368, 34387, 34390, 34423, 34439, 34441, 6239 {f: 2, c: 34460}, 34481, 34483, 34497, 34499, 34513, 34517, 34519, 34531, 6240 34534, 17848, 34565, 34567, 34574, 34576, 34591, 34593, 34595, 34609, 6241 34618, 34624, 34627, 34641, 34648, {f: 2, c: 34660}, 34674, 34684, 160731, 6242 160730, 34727, 34697, 34699, 34707, 34720, 160766, 17893, 34750, 160784, 6243 34753, 34766, 34783, 160841, 34787, {f: 2, c: 34789}, 34794, 34835, 34856, 6244 34862, 34866, 34876, 17935, 34890, 34904, 161301, 161300, 34921, 161329, 6245 34927, 34976, 35004, 35008, 161427, 35025, 35027, 17985, 35073, 161550, 6246 35127, 161571, 35138, 35141, 35145, 161618, 35170, 35209, 35216, 35231, 6247 35248, 35255, 35288, 35307, 18081, 35315, 35325, 35327, 18095, 35345, 6248 35348, 162181, 35361, 35381, 35390, 35397, 35405, 35416, 35502, 35472, 6249 35511, 35543, 35580, 162436, 35594, 35589, 35597, 35612, 35629, 18188, 6250 35665, 35678, 35702, 35713, 35723, {f: 2, c: 35732}, 35897, 162739, 35901, 6251 162750, 162759, 35909, 35919, 35927, 35945, 35949, 163000, 35987, 35986, 6252 35993, 18276, 35995, 36054, 36053, 163232, 36081, 163344, 36105, 36110, 6253 36296, 36313, 36364, 18429, 36349, 36358, 163978, 36372, 36374, 6254 {f: 2, c: 36385}, 36391, 164027, 18454, 36406, 36409, 36436, 36450, 36461, 6255 36463, 36504, 36510, 36533, 36539, 164482, 18510, 164595, 36608, 36616, 6256 36651, 36672, 36682, 36696, 164876, 36772, 36788, 164949, 36801, 36806, 6257 64036, 36810, 36813, 36819, 36821, 36849, 36853, 36859, 36876, 36919, 6258 165227, 36931, 36957, {f: 2, c: 165320}, 36997, 37004, 37008, 37025, 18613, 6259 37040, 37046, 37059, 37064, 165591, 37084, 37087, 165626, 37110, 37106, 6260 37120, 37099, {f: 2, c: 37118}, 37124, 37126, 37144, 37150, 37175, 37177, 6261 {f: 2, c: 37190}, 37207, 37209, 37236, 37241, 37253, 37299, 37302, 6262 {f: 2, c: 37315}, 166217, 166214, 37356, 37377, {f: 2, c: 37398}, 166251, 6263 37442, 37450, 37462, 37473, 37477, 37480, 166280, {f: 2, c: 37500}, 37503, 6264 37513, 37517, 37527, 37529, 37535, 37547, {f: 2, c: 166330}, 37554, 6265 {f: 2, c: 37567}, 37574, 37582, 37605, 37649, 166430, 166441, 37623, 37673, 6266 166513, 166467, 37713, 37722, 37739, 37745, 37747, 37793, 166553, 166605, 6267 37768, 37771, 37775, 37790, 37877, 166628, 166621, 37873, 37831, 37852, 6268 37863, 37897, {f: 2, c: 37910}, 37883, 37938, 37947, 166849, 166895, 37997, 6269 37999, 38265, 38278, {f: 2, c: 38284}, 167184, 167281, 38344, 167419, 6270 167455, 38444, {f: 2, c: 38451}, 167478, 38460, 38497, 167561, 38530, 6271 167659, 38554, 167730, 18919, 38579, 38586, 38589, 18938, 167928, 38616, 6272 38618, 38621, 18948, 38676, 38691, 18985, 38710, 38721, 38727, 38743, 6273 38747, 38762, 168608, 168625, 38806, 38814, {f: 2, c: 38833}, 38846, 38860, 6274 38865, 38868, 38872, 38881, 38897, 38916, 38925, 38932, 38934, 19132, 6275 169104, {f: 2, c: 38962}, 38949, 38983, 39014, 39083, 39085, 39088, 169423, 6276 39095, {f: 2, c: 39099}, 39106, 39111, 39115, 39137, 39139, 39146, 6277 {f: 2, c: 39152}, 39155, 39176, 19259, 169712, {f: 2, c: 39190}, 169753, 6278 {f: 3, c: 39194}, 169808, 39217, {f: 3, c: 39226}, 39233, 39238, 39246, 6279 39264, 39331, 39334, 39357, 39359, 39363, 39380, 39385, 39390, 170182, 6280 39408, 39417, 39420, 39434, 39441, 39450, 39456, 39473, 39492, 39500, 6281 39512, 19394, 39599, 19402, 39607, 19410, 39609, 170610, 39622, 39632, 6282 39634, 39637, 39648, 39653, 39657, 39692, 39696, 39698, 39702, 39708, 6283 39723, 39741, 19488, 39755, 39779, 39781, {f: 2, c: 39787}, 6284 {f: 2, c: 39798}, 39846, 39852, 171483, 39858, 39864, 39870, 39923, 39896, 6285 39901, 39914, 39919, 39918, 171541, 171658, 171593, 39958, 6286 {f: 3, c: 39960}, 39965, 39970, 39977, 171716, 39985, 39991, 40005, 40028, 6287 171753, {f: 2, c: 40009}, 171739, 40020, 40024, 40027, 40029, 40031, 6288 {f: 3, c: 40041}, {f: 2, c: 40045}, 40050, 40053, 40058, 40166, 40178, 6289 40203, [171982, 171991], 40209, {f: 2, c: 40215}, 172079, 19652, 172058, 6290 40242, 19665, 40266, 40287, 40290, 172281, 172162, 40307, {f: 2, c: 40310}, 6291 40324, 40345, 40353, 40383, 40373, 40377, 40381, 40393, 40410, 40416, 6292 40419, 19719, 40458, 40450, 40461, 40476, 40571, 139800, 40576, 40581, 6293 40603, 172940, 40637, 173111, 40671, 40703, 40706, 19831, 40707, 40762, 6294 40765, 40774, 40787, 40789, 40792, 173553, 40797, 173570, 40809, 40813, 6295 40816, 173746, 11948, 13844, 14509, 15820, 16348, 17854, 17936, 19326, 6296 19512, 19681, 19980, {f: 2, c: 20003}, 20089, 20211, 20236, 20249, 20267, 6297 20270, 20273, 20356, 20382, 20407, 20484, 20492, 20556, 20575, 20578, 6298 20599, 20622, 20638, 20642, 20675, 20712, 20721, 20734, 20743, 6299 {f: 3, c: 20748}, 20787, 20792, 20852, 20868, 20920, 20922, 20936, 20943, 6300 20945, {f: 2, c: 20947}, 20952, 20959, 20997, 21030, 21032, 21035, 6301 {f: 2, c: 21041}, 21045, 21052, 21082, 21088, 21102, {f: 2, c: 21112}, 6302 21130, 21132, 21217, 21225, 21233, 21251, 21265, 21279, 21293, 21298, 6303 21309, 21349, 21357, 21369, 21374, 21396, 21401, 21418, 21423, 21434, 6304 21441, {f: 2, c: 21444}, 21472, 21523, 21546, 21553, {f: 2, c: 21556}, 6305 21580, 21671, 21674, 21681, 21691, 21710, 21738, 21756, 21765, 21768, 6306 21781, 21799, 21802, 21814, 21841, 21862, 21903, 21906, 21908, 21924, 6307 21938, 21955, 21958, 21971, 21979, 21996, 21998, 22001, 22006, 22008, 6308 22021, 22029, {f: 2, c: 22033}, 22060, 22069, 22073, 22093, 22100, 22149, 6309 22175, 22182, 22199, 22220, 22223, 22233, 22241, 22251, 22253, 22257, 6310 22279, 22284, {f: 2, c: 22298}, 22301, 22316, 22318, {f: 2, c: 22333}, 6311 22367, 22379, 22381, 22394, 22403, 22423, 22446, 22485, 22503, 22541, 6312 22566, 22605, 22607, 22623, 22637, 22655, 22657, 22680, 22716, 22815, 6313 22819, 22873, 22905, 22935, 22959, 22963, 23007, 23025, 23032, 23218, 6314 23224, 23274, 23286, 23323, 23325, 23329, 23352, 23479, 23511, 23520, 6315 23583, 23594, 23596, 23606, 23641, 23644, 23661, 23773, 23809, 23860, 6316 23869, 23897, 23934, 23939, 24007, 24057, 24104, 24114, 24117, 24155, 6317 24168, 24170, 24183, 24192, 24203, 24243, 24253, 24273, {f: 2, c: 24276}, 6318 24397, 24492, 24554, 24583, 24649, 24660, 24679, 24763, 24772, 24829, 6319 24842, 24854, 24874, 24886, 24926, 24932, 24955, 24957, 24959, 24989, 6320 25016, 25052, 25058, 25061, 25064, 25092, 25095, 25137, 25145, 25149, 6321 25210, 25232, 25256, 25306, 25332, 25366, 25386, 25398, 25414, 25419, 6322 25427, 25457, 25461, 25471, 25474, 25482, {f: 2, c: 25518}, 25578, 6323 {f: 2, c: 25592}, 25618, 25624, 25632, 25636, 25642, 25653, 25661, 25663, 6324 25682, 25695, 25716, 25744, {f: 2, c: 25752}, 25772, 25779, 25837, 25840, 6325 25883, 25887, 25902, 25929, 25952, 26002, 26005, 26036, 26046, 26056, 6326 26062, 26064, 26079, 26238, {f: 2, c: 26251}, 26291, 26304, 26319, 26405, 6327 26421, 26453, 26496, 26511, 26513, 26532, 26545, 26549, 26558, 26664, 6328 26758, 26859, 26869, 26903, 26931, 26936, 26971, 26981, 27048, 27051, 6329 27055, 27109, 27121, 27210, 27221, 27239, 27249, 27311, {f: 2, c: 27336}, 6330 27395, 27451, 27455, {f: 2, c: 27517}, 27568, 27639, 27641, 27652, 27657, 6331 27661, 27692, 27722, 27730, 27732, 27769, 27820, 27828, 27858, 28001, 6332 28028, 28089, 28144, 28229, 28275, 28283, 28285, 28297, 28348, 6333 {f: 2, c: 28378}, 28454, 28457, 28464, 28551, 28573, 28590, 28599, 28685, 6334 28704, 28745, 28824, 28848, {f: 2, c: 28885}, 28997, 29106, 29172, 29207, 6335 29215, 29251, {f: 2, c: 29263}, 29274, 29280, 29288, 29303, 29316, 29385, 6336 29413, 29428, 29442, 29451, 29470, 29474, {f: 2, c: 29498}, 29517, 29528, 6337 29543, 29810, 29871, 29919, 29924, 29940, 29947, 29974, 29985, 30015, 6338 30046, 30105, 30116, 30145, 30148, 30156, 30167, 30172, 30177, 30191, 6339 30212, 30220, 30237, 30258, 30264, 30277, 30282, 30303, 30381, 30397, 6340 30425, 30443, 30448, 30457, 30464, 30478, 30498, 30504, 30511, 30521, 6341 30526, 30533, 30538, 30543, 30558, 30564, 30567, 30572, 30596, 6342 {f: 2, c: 30604}, 30614, 30631, 30639, 30647, 30654, 30665, 30673, 30681, 6343 30705, 30775, 30812, 30846, 30872, 30881, 30897, 30899, 30921, 30931, 6344 30988, 31007, {f: 2, c: 31015}, 31039, 31042, 31060, 31083, 31100, 31147, 6345 31172, 31210, 31234, 31244, 31280, 31290, 31300, 31360, 31366, 31380, 6346 31413, 31421, 31486, 31531, 31607, 31648, 31660, 31664, 31720, 31730, 6347 31736, 31740, 31742, 31753, 31784, 31791, 31810, {f: 2, c: 31826}, 6348 {f: 3, c: 31835}, 31858, 31869, 31879, 31902, 31930, 31943, 31955, 31962, 6349 32060, 32077, 32130, 32133, 32141, 32145, 32158, 32179, 32185, 32208, 6350 32229, {f: 2, c: 32245}, 32303, 32310, 32324, 32367, 32376, 32385, 32573, 6351 32603, 32605, 32613, 32625, {f: 2, c: 32639}, 32651, 32674, 6352 {f: 3, c: 32765}, 32775, 32781, 32798, 32825, 32904, 32910, 32975, 32980, 6353 33005, 33008, 33015, 33018, 33022, 33027, 33047, 33072, 33111, 33135, 6354 33139, 33163, 33168, 33179, 33182, 33227, 33237, {f: 2, c: 33245}, 33249, 6355 33263, 33270, 33280, 33291, {f: 2, c: 33299}, 33306, 33338, 33348, 33389, 6356 33412, 33417, 33425, 33450, 33456, 33488, 33514, 33519, 33526, 33622, 6357 33656, 33784, 33788, 33880, 33939, 33969, 33981, 34043, 34118, 34134, 6358 34141, 34181, 34200, 34370, 34374, 34496, 34580, 34594, 34606, 34617, 6359 34653, 34683, 34700, 34702, {f: 2, c: 34711}, 34718, 34723, 34734, 34751, 6360 34761, 34778, 34840, 34843, 34861, 34874, 34885, 34891, 34894, 34901, 6361 34906, 34926, {f: 3, c: 34970}, 35021, 35040, 35055, {f: 2, c: 35086}, 6362 35110, 35125, 35162, 35164, 35179, 35184, 35196, 35237, 35253, 35260, 6363 35285, 35401, 35415, 35431, 35454, 35462, 35478, 35510, 35529, 35537, 6364 35549, 35564, 35573, 35590, 35599, 35601, 35653, 35666, 35693, 35704, 6365 35708, 35710, 35717, 35743, 35915, 35923, 35963, 36026, 36037, 36041, 6366 36050, 36076, 36085, 36087, 36097, 36099, 36119, 36124, 36206, 36241, 6367 36255, 36267, 36274, 36309, 36327, {f: 2, c: 36337}, 36340, 36353, 36363, 6368 36390, 36401, {f: 2, c: 36416}, 36429, 36431, 36444, 36449, 36457, 36465, 6369 36469, 36471, 36489, 36496, 36501, 36506, 36519, 36521, 36525, 36584, 6370 36592, 36615, 36632, 36645, 36647, 36652, 36661, 36666, 36675, 36679, 6371 36689, 36693, {f: 3, c: 36768}, 36773, 36868, 36891, 36911, 36940, 36955, 6372 36976, 36980, 36985, 37003, 37016, 37024, 37042, 37053, 37065, 37104, 6373 37125, 37157, 37210, 37223, 37242, 37258, 37265, 37269, 37296, 37307, 6374 37309, 37314, 37317, 37376, 37385, 37411, 37494, 37518, 37551, 6375 {f: 2, c: 37563}, 37569, 37571, 37573, 37576, 37652, 37683, 37686, 37720, 6376 37759, 37762, 37770, 37819, 37836, 37862, 37881, 37890, {f: 2, c: 37901}, 6377 37934, 37964, 38280, 38305, 38335, 38342, 38345, {f: 2, c: 38353}, 38368, 6378 38372, 38374, 38436, 38449, 38456, 38461, 38484, 38516, 38523, 38527, 6379 38529, 38531, 38537, 38550, 38574, 38659, 38683, {f: 2, c: 38689}, 38696, 6380 38705, 38759, 38774, 38781, 38783, 38809, 38815, 38828, 38841, 38861, 6381 38880, 38895, 38919, 38950, 38958, {f: 2, c: 39010}, 39092, 39109, 39170, 6382 39185, 39189, 39221, 39240, 39252, 39262, 39393, 39436, 39440, 39459, 6383 39489, 39505, {f: 2, c: 39613}, 39681, 39689, 39691, {f: 2, c: 39693}, 6384 39705, 39733, 39752, 39765, 39784, 39808, 39814, 39824, 39837, 39856, 6385 39871, 39880, 39935, 39938, 39964, 39989, 40004, 40022, 40033, 40040, 6386 40240, 40253, 40298, 40315, 40421, 40425, 40435, 40570, {f: 3, c: 40578}, 6387 40624, 40676, 40688, 40690, 40713, 40719, 40724, 40731, 40738, 40742, 6388 {f: 2, c: 40746}, 40756, 40794, 40815, 40862, 40869, 131317, 151044, 6389 151538, 163187, 194581, 194630, 194713, 194726, 194789, 195038, 13790, 6390 {s: 4}, 172722, 0, 0, 131416, {s: 4}, 132529, 0, 0, 132844, {s: 6}, 134488, 6391 {s: 21}, 154060, {s: 9}, 14756, 14776, 142914, 0, 0, 14940, 0, 0, 143339, 6392 0, 0, 162228, 0, 15044, 15051, {s: 5}, 14981, {s: 8}, 15347, 27384, {s: 5}, 6393 15665, {s: 9}, 147531, 0, 15936, 14497, {s: 34}, 158878, {s: 12}, 18207, 6394 162876, {s: 4}, 18462, {s: 71}, 39709, 39724, 20482, 20958, 21255, 23532, 6395 63784, 26142, 63785, 28746, 64021, 21857, 27706, 31328, 156492, 34819, 6396 38315, 38741, 171581, 173594], 6397 'Adobe-Korea1': [{f: 95, c: 32}, 8361, 8208, 169, 0, 0, [12288, 12644], 6398 {f: 2, c: 12289}, 12539, 8229, [8230, 8943], 168, 12291, {f: 2, c: 8211}, 6399 8214, 65340, 65374, {f: 2, c: 8216}, {f: 2, c: 8220}, {f: 2, c: 12308}, 6400 {f: 10, c: 12296}, 177, 215, 247, 8800, {f: 2, c: 8804}, 8734, 8756, 176, 6401 {f: 2, c: 8242}, 8451, 8491, {f: 2, c: 65504}, 65509, 9794, 9792, 8736, 6402 8869, 8978, 8706, 8711, 8801, 8786, 167, 8251, 9734, 9733, 9675, 9679, 6403 9678, 9671, 9670, 9633, 9632, 9651, 9650, 9661, 9660, 8594, 6404 {f: 2, c: 8592}, {f: 2, c: 8595}, 12307, 171, 187, 8730, 8765, 8733, 8757, 6405 {f: 2, c: 8747}, 8712, 8715, {f: 2, c: 8838}, {f: 2, c: 8834}, 8746, 8745, 6406 {f: 2, c: 8743}, 65506, 8658, 8660, 8704, 8707, 180, 732, 711, 728, 733, 6407 730, 729, 184, 731, 161, 191, 8758, 8750, 8721, 8719, 164, 8457, 8240, 6408 9665, 9664, 9655, 9654, 9828, {f: 2, c: 9824}, 9829, 9831, 9827, 9673, 6409 9672, 9635, {f: 2, c: 9680}, 9618, {f: 2, c: 9636}, 9640, 9639, 9638, 9641, 6410 9832, 9743, 9742, 9756, 9758, 182, {f: 2, c: 8224}, 8597, 8599, 8601, 8598, 6411 8600, 9837, {f: 2, c: 9833}, 9836, 12927, 12828, 8470, 13255, 8482, 13250, 6412 13272, 8481, {f: 59, c: 65281}, 65510, {f: 33, c: 65341}, 65507, 6413 {f: 51, c: 12593}, {f: 42, c: 12645}, {f: 10, c: 8560}, {f: 10, c: 8544}, 6414 {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945}, {f: 7, c: 963}, 9472, 6415 9474, 9484, 9488, 9496, 9492, 9500, 9516, 9508, 9524, 9532, 9473, 9475, 6416 9487, 9491, 9499, 9495, 9507, 9523, 9515, 9531, 9547, 9504, 9519, 9512, 6417 9527, 9535, 9501, 9520, 9509, 9528, 9538, 9490, 9489, 9498, 9497, 9494, 6418 9493, 9486, 9485, {f: 2, c: 9502}, {f: 2, c: 9505}, {f: 2, c: 9510}, 6419 {f: 2, c: 9513}, {f: 2, c: 9517}, {f: 2, c: 9521}, {f: 2, c: 9525}, 6420 {f: 2, c: 9529}, {f: 2, c: 9533}, {f: 2, c: 9536}, {f: 8, c: 9539}, 6421 {f: 3, c: 13205}, 8467, 13208, 13252, {f: 4, c: 13219}, {f: 10, c: 13209}, 6422 13258, {f: 3, c: 13197}, 13263, {f: 2, c: 13192}, 13256, {f: 2, c: 13223}, 6423 {f: 10, c: 13232}, {f: 5, c: 13184}, {f: 6, c: 13242}, {f: 5, c: 13200}, 6424 8486, {f: 2, c: 13248}, {f: 3, c: 13194}, 13270, 13253, {f: 3, c: 13229}, 6425 13275, {f: 4, c: 13225}, 13277, 13264, 13267, 13251, 13257, 13276, 13254, 6426 198, 208, 170, 294, 306, 319, 321, 216, 338, 186, 222, 358, 330, 6427 {f: 28, c: 12896}, {f: 26, c: 9424}, {f: 15, c: 9312}, 189, 6428 {f: 2, c: 8531}, 188, 190, {f: 4, c: 8539}, 230, 273, 240, 295, 305, 307, 6429 312, 320, 322, 248, 339, 223, 254, 359, 331, 329, {f: 28, c: 12800}, 6430 {f: 26, c: 9372}, {f: 15, c: 9332}, 185, {f: 2, c: 178}, 8308, 8319, 6431 {f: 4, c: 8321}, {f: 83, c: 12353}, {f: 86, c: 12449}, {f: 6, c: 1040}, 6432 1025, {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, {f: 2, c: 44032}, 44036, 6433 {f: 4, c: 44039}, {f: 8, c: 44048}, {f: 5, c: 44057}, 44064, 44068, 6434 {f: 2, c: 44076}, {f: 3, c: 44079}, {f: 2, c: 44088}, 44092, 44096, 44107, 6435 44109, 44116, 44120, 44124, {f: 2, c: 44144}, 44148, {f: 2, c: 44151}, 6436 44154, {f: 2, c: 44160}, {f: 4, c: 44163}, {f: 4, c: 44169}, 44176, 44180, 6437 {f: 2, c: 44188}, {f: 3, c: 44191}, {f: 3, c: 44200}, 44204, 6438 {f: 2, c: 44207}, {f: 2, c: 44216}, {f: 3, c: 44219}, 44225, 44228, 44232, 6439 44236, 44245, 44247, {f: 2, c: 44256}, 44260, {f: 2, c: 44263}, 44266, 6440 44268, {f: 3, c: 44271}, 44275, {f: 2, c: 44277}, {f: 2, c: 44284}, 44288, 6441 44292, 44294, {f: 2, c: 44300}, 44303, 44305, 44312, 44316, 44320, 44329, 6442 {f: 2, c: 44332}, {f: 2, c: 44340}, 44344, 44348, {f: 2, c: 44356}, 44359, 6443 44361, 44368, 44372, 44376, 44385, 44387, {f: 2, c: 44396}, 44400, 6444 {f: 4, c: 44403}, {f: 3, c: 44411}, 44415, {f: 2, c: 44417}, 6445 {f: 2, c: 44424}, 44428, 44432, {f: 2, c: 44444}, 44452, 44471, 6446 {f: 2, c: 44480}, 44484, 44488, {f: 2, c: 44496}, 44499, 44508, 44512, 6447 44516, {f: 2, c: 44536}, 44540, {f: 3, c: 44543}, {f: 2, c: 44552}, 44555, 6448 44557, 44564, {f: 2, c: 44592}, 44596, {f: 2, c: 44599}, 44602, 6449 {f: 2, c: 44608}, 44611, {f: 2, c: 44613}, 44618, {f: 3, c: 44620}, 44624, 6450 44628, 44630, {f: 2, c: 44636}, {f: 3, c: 44639}, 44645, {f: 2, c: 44648}, 6451 44652, 44656, {f: 2, c: 44664}, {f: 3, c: 44667}, {f: 2, c: 44676}, 44684, 6452 {f: 3, c: 44732}, 44736, 44740, {f: 2, c: 44748}, {f: 3, c: 44751}, 6453 {f: 2, c: 44760}, 44764, 44776, 44779, 44781, 44788, 44792, 44796, 6454 {f: 2, c: 44807}, 44813, 44816, {f: 2, c: 44844}, 44848, 44850, 44852, 6455 {f: 2, c: 44860}, 44863, {f: 3, c: 44865}, {f: 2, c: 44872}, 44880, 6456 {f: 2, c: 44892}, {f: 2, c: 44900}, 44921, 44928, 44932, 44936, 6457 {f: 2, c: 44944}, 44949, 44956, {f: 2, c: 44984}, 44988, 44992, 6458 {f: 3, c: 44999}, 45003, {f: 2, c: 45005}, 45012, 45020, {f: 2, c: 45032}, 6459 {f: 2, c: 45040}, 45044, 45048, {f: 2, c: 45056}, 45060, 45068, 45072, 6460 45076, {f: 2, c: 45084}, 45096, {f: 2, c: 45124}, 45128, 45130, 45132, 6461 45134, {f: 3, c: 45139}, 45143, 45145, 45149, {f: 2, c: 45180}, 45184, 6462 45188, {f: 2, c: 45196}, 45199, 45201, {f: 3, c: 45208}, 45212, 6463 {f: 4, c: 45215}, {f: 2, c: 45224}, {f: 5, c: 45227}, 45233, 6464 {f: 3, c: 45235}, 45240, 45244, {f: 2, c: 45252}, {f: 3, c: 45255}, 6465 {f: 2, c: 45264}, 45268, 45272, 45280, 45285, {f: 2, c: 45320}, 6466 {f: 2, c: 45323}, 45328, {f: 2, c: 45330}, {f: 2, c: 45336}, 6467 {f: 3, c: 45339}, {f: 3, c: 45347}, 45352, 45356, {f: 2, c: 45364}, 6468 {f: 3, c: 45367}, {f: 2, c: 45376}, 45380, 45384, {f: 2, c: 45392}, 6469 {f: 2, c: 45396}, 45400, 45404, 45408, {f: 2, c: 45432}, 45436, 45440, 6470 45442, {f: 2, c: 45448}, 45451, 45453, {f: 3, c: 45458}, 45464, 45468, 6471 45480, 45516, 45520, 45524, {f: 2, c: 45532}, 45535, {f: 2, c: 45544}, 6472 45548, 45552, 45561, 45563, 45565, {f: 2, c: 45572}, 45576, 6473 {f: 2, c: 45579}, {f: 2, c: 45588}, 45591, 45593, 45600, 45620, 45628, 6474 45656, 45660, 45664, {f: 2, c: 45672}, {f: 2, c: 45684}, 45692, 6475 {f: 2, c: 45700}, 45705, {f: 2, c: 45712}, 45716, {f: 3, c: 45720}, 6476 {f: 2, c: 45728}, 45731, {f: 2, c: 45733}, 45738, 45740, 45744, 45748, 6477 {f: 2, c: 45768}, 45772, 45776, 45778, {f: 2, c: 45784}, 45787, 45789, 6478 45794, {f: 3, c: 45796}, 45800, {f: 5, c: 45803}, {f: 3, c: 45811}, 6479 {f: 5, c: 45815}, {f: 3, c: 45823}, 45828, 45832, {f: 2, c: 45840}, 6480 {f: 3, c: 45843}, 45852, {f: 3, c: 45908}, 45912, {f: 2, c: 45915}, 6481 {f: 2, c: 45918}, {f: 2, c: 45924}, 45927, 45929, 45931, 45934, 6482 {f: 2, c: 45936}, 45940, 45944, {f: 2, c: 45952}, {f: 3, c: 45955}, 45964, 6483 45968, 45972, {f: 2, c: 45984}, 45992, 45996, {f: 2, c: 46020}, 46024, 6484 {f: 2, c: 46027}, 46030, 46032, {f: 2, c: 46036}, 46039, 46041, 46043, 6485 46045, 46048, 46052, 46056, 46076, 46096, 46104, 46108, 46112, 6486 {f: 2, c: 46120}, 46123, 46132, {f: 2, c: 46160}, 46164, 46168, 6487 {f: 2, c: 46176}, 46179, 46181, 46188, 46208, 46216, 46237, 46244, 46248, 6488 46252, 46261, 46263, 46265, 46272, 46276, 46280, 46288, 46293, 6489 {f: 2, c: 46300}, 46304, {f: 2, c: 46307}, 46310, {f: 2, c: 46316}, 46319, 6490 46321, 46328, {f: 2, c: 46356}, 46360, {f: 2, c: 46363}, {f: 2, c: 46372}, 6491 {f: 4, c: 46375}, {f: 2, c: 46384}, 46388, 46392, {f: 2, c: 46400}, 6492 {f: 3, c: 46403}, {f: 3, c: 46411}, 46416, 46420, {f: 2, c: 46428}, 6493 {f: 3, c: 46431}, {f: 2, c: 46496}, 46500, 46504, {f: 2, c: 46506}, 6494 {f: 2, c: 46512}, {f: 3, c: 46515}, {f: 3, c: 46523}, 46528, 46532, 6495 {f: 2, c: 46540}, {f: 3, c: 46543}, 46552, 46572, {f: 2, c: 46608}, 46612, 6496 46616, 46629, 46636, 46644, 46664, 46692, 46696, {f: 2, c: 46748}, 46752, 6497 46756, {f: 2, c: 46763}, 46769, 46804, 46832, 46836, 46840, 6498 {f: 2, c: 46848}, 46853, {f: 2, c: 46888}, 46892, {f: 2, c: 46895}, 6499 {f: 2, c: 46904}, 46907, 46916, 46920, 46924, {f: 2, c: 46932}, 46944, 6500 46948, 46952, {f: 2, c: 46960}, 46963, 46965, {f: 2, c: 46972}, 46976, 6501 46980, {f: 2, c: 46988}, {f: 4, c: 46991}, {f: 4, c: 46998}, 47004, 47008, 6502 {f: 2, c: 47016}, {f: 3, c: 47019}, {f: 2, c: 47028}, 47032, 47047, 47049, 6503 {f: 2, c: 47084}, 47088, 47092, {f: 2, c: 47100}, {f: 3, c: 47103}, 6504 {f: 3, c: 47111}, 47116, 47120, {f: 2, c: 47128}, 47131, 47133, 6505 {f: 2, c: 47140}, 47144, 47148, {f: 2, c: 47156}, {f: 3, c: 47159}, 47168, 6506 47172, 47185, 47187, {f: 2, c: 47196}, 47200, 47204, {f: 2, c: 47212}, 6507 47215, 47217, 47224, 47228, 47245, 47272, 47280, 47284, 47288, 6508 {f: 2, c: 47296}, 47299, 47301, 47308, 47312, 47316, 47325, 47327, 47329, 6509 {f: 2, c: 47336}, 47340, 47344, {f: 2, c: 47352}, 47355, 47357, 47364, 6510 47384, 47392, {f: 2, c: 47420}, 47424, 47428, 47436, 47439, 47441, 6511 {f: 2, c: 47448}, 47452, 47456, {f: 2, c: 47464}, 47467, 47469, 6512 {f: 2, c: 47476}, 47480, 47484, {f: 2, c: 47492}, 47495, {f: 2, c: 47497}, 6513 {f: 2, c: 47501}, {f: 2, c: 47532}, 47536, 47540, {f: 2, c: 47548}, 47551, 6514 47553, {f: 2, c: 47560}, 47564, {f: 5, c: 47566}, {f: 2, c: 47576}, 47579, 6515 {f: 2, c: 47581}, 47585, {f: 3, c: 47587}, 47592, 47596, {f: 2, c: 47604}, 6516 {f: 4, c: 47607}, {f: 2, c: 47616}, 47624, 47637, {f: 2, c: 47672}, 47676, 6517 47680, 47682, {f: 2, c: 47688}, 47691, {f: 2, c: 47693}, {f: 3, c: 47699}, 6518 47704, 47708, {f: 2, c: 47716}, {f: 3, c: 47719}, {f: 2, c: 47728}, 47732, 6519 47736, {f: 3, c: 47747}, 47751, 47756, {f: 2, c: 47784}, {f: 2, c: 47787}, 6520 47792, 47794, {f: 2, c: 47800}, 47803, 47805, 47812, 47816, 6521 {f: 2, c: 47832}, 47868, 47872, 47876, 47885, 47887, 47889, 47896, 47900, 6522 47904, 47913, 47915, {f: 3, c: 47924}, 47928, {f: 4, c: 47931}, 6523 {f: 2, c: 47940}, 47943, 47945, 47949, {f: 2, c: 47951}, 47956, 47960, 6524 47969, 47971, 47980, 48008, 48012, 48016, 48036, 48040, 48044, 48052, 6525 48055, 48064, 48068, 48072, 48080, 48083, {f: 2, c: 48120}, 48124, 6526 {f: 2, c: 48127}, 48130, {f: 2, c: 48136}, {f: 3, c: 48139}, 48143, 48145, 6527 {f: 5, c: 48148}, {f: 5, c: 48155}, {f: 2, c: 48164}, 48167, 48169, 48173, 6528 {f: 2, c: 48176}, 48180, 48184, {f: 2, c: 48192}, {f: 3, c: 48195}, 48201, 6529 {f: 2, c: 48204}, 48208, 48221, {f: 2, c: 48260}, 48264, {f: 2, c: 48267}, 6530 48270, {f: 2, c: 48276}, 48279, {f: 2, c: 48281}, {f: 2, c: 48288}, 48292, 6531 {f: 2, c: 48295}, {f: 2, c: 48304}, {f: 3, c: 48307}, {f: 2, c: 48316}, 6532 48320, 48324, 48333, {f: 3, c: 48335}, 48341, 48344, 48348, 6533 {f: 3, c: 48372}, 48376, 48380, {f: 2, c: 48388}, 48391, 48393, 48400, 6534 48404, 48420, 48428, 48448, {f: 2, c: 48456}, 48460, 48464, 6535 {f: 2, c: 48472}, 48484, 48488, {f: 2, c: 48512}, 48516, {f: 4, c: 48519}, 6536 {f: 2, c: 48528}, 48531, 48533, {f: 2, c: 48537}, 48540, 48548, 48560, 6537 48568, {f: 2, c: 48596}, 48600, 48604, 48617, 48624, 48628, 48632, 48640, 6538 48643, 48645, {f: 2, c: 48652}, 48656, 48660, {f: 2, c: 48668}, 48671, 6539 {f: 2, c: 48708}, 48712, 48716, 48718, {f: 2, c: 48724}, 48727, 6540 {f: 3, c: 48729}, {f: 2, c: 48736}, 48740, 48744, 48746, {f: 2, c: 48752}, 6541 {f: 3, c: 48755}, {f: 3, c: 48763}, 48768, 48772, {f: 2, c: 48780}, 6542 {f: 3, c: 48783}, {f: 2, c: 48792}, 48808, {f: 2, c: 48848}, 48852, 6543 {f: 2, c: 48855}, 48864, {f: 3, c: 48867}, 48876, 48897, {f: 2, c: 48904}, 6544 {f: 2, c: 48920}, {f: 3, c: 48923}, {f: 2, c: 48960}, 48964, 48968, 6545 {f: 2, c: 48976}, 48981, 49044, 49072, 49093, {f: 2, c: 49100}, 49104, 6546 49108, 49116, 49119, 49121, 49212, 49233, 49240, 49244, 49248, 6547 {f: 2, c: 49256}, {f: 2, c: 49296}, 49300, 49304, {f: 2, c: 49312}, 49315, 6548 49317, {f: 2, c: 49324}, {f: 2, c: 49327}, {f: 4, c: 49331}, 6549 {f: 2, c: 49340}, {f: 3, c: 49343}, 49349, {f: 2, c: 49352}, 49356, 49360, 6550 {f: 2, c: 49368}, {f: 3, c: 49371}, {f: 2, c: 49380}, 49384, 49388, 6551 {f: 2, c: 49396}, 49399, 49401, 49408, 49412, 49416, 49424, 49429, 6552 {f: 5, c: 49436}, {f: 2, c: 49443}, {f: 2, c: 49446}, {f: 2, c: 49452}, 6553 {f: 3, c: 49455}, 49462, {f: 2, c: 49464}, 49468, 49472, {f: 2, c: 49480}, 6554 {f: 3, c: 49483}, {f: 2, c: 49492}, 49496, 49500, {f: 2, c: 49508}, 6555 {f: 3, c: 49511}, 49520, 49524, 49528, 49541, {f: 3, c: 49548}, 49552, 6556 49556, 49558, {f: 2, c: 49564}, 49567, 49569, 49573, {f: 2, c: 49576}, 6557 49580, 49584, 49597, 49604, 49608, 49612, 49620, {f: 2, c: 49623}, 49632, 6558 49636, 49640, {f: 2, c: 49648}, 49651, {f: 2, c: 49660}, 49664, 49668, 6559 {f: 2, c: 49676}, 49679, 49681, {f: 2, c: 49688}, 49692, {f: 2, c: 49695}, 6560 {f: 2, c: 49704}, 49707, 49709, 49711, {f: 2, c: 49713}, 49716, 49736, 6561 {f: 2, c: 49744}, 49748, 49752, 49760, 49765, {f: 2, c: 49772}, 49776, 6562 49780, {f: 2, c: 49788}, 49791, 49793, {f: 2, c: 49800}, 49808, 49816, 6563 49819, 49821, {f: 2, c: 49828}, 49832, {f: 2, c: 49836}, {f: 2, c: 49844}, 6564 49847, 49849, {f: 2, c: 49884}, 49888, {f: 2, c: 49891}, {f: 3, c: 49899}, 6565 49903, 49905, 49910, {f: 2, c: 49912}, {f: 2, c: 49915}, 49920, 6566 {f: 2, c: 49928}, {f: 2, c: 49932}, {f: 3, c: 49939}, 49944, 49948, 6567 {f: 2, c: 49956}, {f: 2, c: 49960}, 49989, {f: 2, c: 50024}, 50028, 50032, 6568 50034, {f: 2, c: 50040}, {f: 2, c: 50044}, 50052, 50056, 50060, 50112, 6569 {f: 2, c: 50136}, 50140, {f: 2, c: 50143}, 50146, {f: 2, c: 50152}, 50157, 6570 {f: 2, c: 50164}, 50168, 50184, 50192, 50212, 50220, 50224, 50228, 6571 {f: 2, c: 50236}, 50248, {f: 2, c: 50276}, 50280, 50284, {f: 2, c: 50292}, 6572 50297, 50304, 50324, 50332, 50360, 50364, 50409, {f: 2, c: 50416}, 50420, 6573 50424, 50426, {f: 3, c: 50431}, 50444, 50448, 50452, 50460, 6574 {f: 2, c: 50472}, 50476, 50480, {f: 2, c: 50488}, 50491, 50493, 6575 {f: 2, c: 50500}, {f: 3, c: 50504}, {f: 3, c: 50508}, {f: 3, c: 50515}, 6576 {f: 3, c: 50519}, {f: 2, c: 50525}, {f: 2, c: 50528}, 50532, 50536, 6577 {f: 2, c: 50544}, {f: 3, c: 50547}, {f: 2, c: 50556}, 50560, 50564, 50567, 6578 {f: 2, c: 50572}, 50575, 50577, 50581, {f: 2, c: 50583}, 50588, 50592, 6579 50601, {f: 2, c: 50612}, {f: 2, c: 50616}, {f: 4, c: 50619}, 6580 {f: 7, c: 50628}, 50636, 50638, {f: 2, c: 50640}, 50644, 50648, 6581 {f: 2, c: 50656}, 50659, 50661, {f: 3, c: 50668}, 50672, 50676, 6582 {f: 2, c: 50678}, {f: 6, c: 50684}, {f: 4, c: 50693}, 50700, 50704, 6583 {f: 2, c: 50712}, {f: 2, c: 50715}, {f: 2, c: 50724}, 50728, 6584 {f: 3, c: 50732}, 50736, {f: 3, c: 50739}, 50743, 50745, 50747, 6585 {f: 2, c: 50752}, 50756, 50760, {f: 2, c: 50768}, {f: 3, c: 50771}, 6586 {f: 2, c: 50780}, 50784, 50796, 50799, 50801, {f: 2, c: 50808}, 50812, 6587 50816, {f: 2, c: 50824}, 50827, 50829, {f: 2, c: 50836}, 50840, 50844, 6588 {f: 2, c: 50852}, 50855, 50857, {f: 2, c: 50864}, 50868, {f: 3, c: 50872}, 6589 {f: 2, c: 50880}, 50883, 50885, {f: 2, c: 50892}, 50896, 50900, 6590 {f: 2, c: 50908}, {f: 2, c: 50912}, {f: 2, c: 50920}, 50924, 50928, 6591 {f: 2, c: 50936}, 50941, {f: 2, c: 50948}, 50952, 50956, {f: 2, c: 50964}, 6592 50967, 50969, {f: 2, c: 50976}, 50980, 50984, {f: 2, c: 50992}, 50995, 6593 50997, 50999, {f: 2, c: 51004}, 51008, 51012, 51018, {f: 2, c: 51020}, 6594 51023, {f: 8, c: 51025}, 51036, 51040, 51048, 51051, {f: 2, c: 51060}, 6595 51064, {f: 3, c: 51068}, {f: 3, c: 51075}, {f: 4, c: 51079}, 51086, 6596 {f: 2, c: 51088}, 51092, {f: 3, c: 51094}, 51098, {f: 2, c: 51104}, 6597 {f: 4, c: 51107}, {f: 2, c: 51116}, 51120, 51124, {f: 2, c: 51132}, 6598 {f: 3, c: 51135}, {f: 2, c: 51144}, 51148, 51150, 51152, 51160, 51165, 6599 51172, 51176, 51180, {f: 2, c: 51200}, 51204, 51208, 51210, 6600 {f: 2, c: 51216}, 51219, {f: 2, c: 51221}, {f: 2, c: 51228}, 51232, 51236, 6601 {f: 2, c: 51244}, 51247, 51249, 51256, 51260, 51264, {f: 2, c: 51272}, 6602 {f: 2, c: 51276}, 51284, {f: 2, c: 51312}, 51316, 51320, 51322, 6603 {f: 2, c: 51328}, 51331, {f: 3, c: 51333}, {f: 3, c: 51339}, 51348, 51357, 6604 51359, 51361, 51368, {f: 2, c: 51388}, 51396, 51400, 51404, 6605 {f: 2, c: 51412}, 51415, 51417, {f: 2, c: 51424}, 51428, 51445, 6606 {f: 2, c: 51452}, 51456, {f: 3, c: 51460}, {f: 2, c: 51468}, 51471, 51473, 6607 51480, 51500, 51508, {f: 2, c: 51536}, 51540, 51544, {f: 2, c: 51552}, 6608 51555, 51564, 51568, 51572, 51580, {f: 2, c: 51592}, 51596, 51600, 6609 {f: 2, c: 51608}, 51611, 51613, {f: 2, c: 51648}, 51652, {f: 2, c: 51655}, 6610 51658, {f: 2, c: 51664}, 51667, {f: 2, c: 51669}, {f: 2, c: 51673}, 6611 {f: 2, c: 51676}, 51680, 51682, 51684, 51687, {f: 2, c: 51692}, 6612 {f: 3, c: 51695}, {f: 2, c: 51704}, 51708, 51712, {f: 2, c: 51720}, 6613 {f: 3, c: 51723}, 51732, 51736, 51753, {f: 2, c: 51788}, 51792, 51796, 6614 {f: 2, c: 51804}, {f: 3, c: 51807}, 51816, 51837, 51844, 51864, 6615 {f: 2, c: 51900}, 51904, 51908, {f: 2, c: 51916}, 51919, 51921, 51923, 6616 {f: 2, c: 51928}, 51936, 51948, 51956, 51976, 51984, 51988, 51992, 6617 {f: 2, c: 52000}, 52033, {f: 2, c: 52040}, 52044, 52048, {f: 2, c: 52056}, 6618 52061, 52068, {f: 2, c: 52088}, 52124, 52152, 52180, 52196, 52199, 52201, 6619 {f: 2, c: 52236}, 52240, 52244, {f: 2, c: 52252}, {f: 2, c: 52257}, 6620 {f: 3, c: 52263}, 52268, 52270, 52272, {f: 2, c: 52280}, {f: 4, c: 52283}, 6621 {f: 2, c: 52292}, 52296, 52300, {f: 2, c: 52308}, {f: 3, c: 52311}, 52320, 6622 52324, 52326, 52328, 52336, 52341, {f: 2, c: 52376}, 52380, 52384, 6623 {f: 2, c: 52392}, {f: 3, c: 52395}, {f: 2, c: 52404}, 52408, 52412, 6624 {f: 2, c: 52420}, 52423, 52425, 52432, 52436, 52452, 52460, 52464, 52481, 6625 {f: 2, c: 52488}, 52492, 52496, {f: 2, c: 52504}, 52507, 52509, 52516, 6626 52520, 52524, 52537, 52572, 52576, 52580, {f: 2, c: 52588}, 52591, 52593, 6627 52600, 52616, {f: 2, c: 52628}, 52632, 52636, {f: 2, c: 52644}, 52647, 6628 52649, 52656, 52676, 52684, 52688, 52712, 52716, 52720, {f: 2, c: 52728}, 6629 52731, 52733, 52740, 52744, 52748, 52756, 52761, {f: 2, c: 52768}, 52772, 6630 52776, {f: 2, c: 52784}, 52787, 52789, {f: 2, c: 52824}, 52828, 6631 {f: 3, c: 52831}, {f: 2, c: 52840}, 52843, 52845, {f: 2, c: 52852}, 52856, 6632 52860, {f: 2, c: 52868}, 52871, 52873, {f: 2, c: 52880}, 52884, 52888, 6633 {f: 2, c: 52896}, {f: 3, c: 52899}, {f: 2, c: 52908}, 52929, 6634 {f: 2, c: 52964}, 52968, {f: 2, c: 52971}, {f: 2, c: 52980}, 6635 {f: 3, c: 52983}, {f: 2, c: 52992}, 52996, 53000, {f: 2, c: 53008}, 53011, 6636 53013, 53020, 53024, 53028, {f: 2, c: 53036}, {f: 3, c: 53039}, 53048, 6637 {f: 2, c: 53076}, 53080, 53084, {f: 2, c: 53092}, 53095, 53097, 6638 {f: 2, c: 53104}, 53108, 53112, 53120, 53125, 53132, 53153, 53160, 53168, 6639 53188, {f: 2, c: 53216}, 53220, 53224, {f: 2, c: 53232}, 53235, 53237, 6640 53244, 53248, 53252, 53265, 53272, 53293, {f: 2, c: 53300}, 53304, 53308, 6641 {f: 2, c: 53316}, 53319, 53321, 53328, 53332, 53336, 53344, 6642 {f: 2, c: 53356}, 53360, 53364, {f: 2, c: 53372}, 53377, {f: 2, c: 53412}, 6643 53416, 53420, {f: 2, c: 53428}, 53431, 53433, {f: 2, c: 53440}, 53444, 6644 {f: 2, c: 53448}, {f: 2, c: 53456}, {f: 3, c: 53459}, {f: 2, c: 53468}, 6645 53472, 53476, {f: 2, c: 53484}, {f: 3, c: 53487}, 53496, 53517, 6646 {f: 2, c: 53552}, 53556, 53560, 53562, {f: 2, c: 53568}, {f: 3, c: 53571}, 6647 {f: 2, c: 53580}, 53584, 53588, {f: 2, c: 53596}, 53599, 53601, 53608, 6648 53612, 53628, 53636, 53640, {f: 2, c: 53664}, 53668, 53672, 6649 {f: 2, c: 53680}, 53683, 53685, 53690, 53692, 53696, 53720, 53748, 53752, 6650 53767, 53769, 53776, {f: 2, c: 53804}, 53808, 53812, {f: 2, c: 53820}, 6651 53823, 53825, 53832, 53852, 53860, {f: 2, c: 53888}, 53892, 53896, 6652 {f: 2, c: 53904}, 53909, 53916, 53920, 53924, 53932, 53937, 6653 {f: 2, c: 53944}, 53948, {f: 2, c: 53951}, 53954, {f: 2, c: 53960}, 53963, 6654 53972, 53976, 53980, {f: 2, c: 53988}, {f: 2, c: 54000}, 54004, 54008, 6655 {f: 2, c: 54016}, 54019, 54021, {f: 3, c: 54028}, 54032, 54036, 54038, 6656 {f: 2, c: 54044}, {f: 3, c: 54047}, 54053, {f: 2, c: 54056}, 54060, 54064, 6657 {f: 2, c: 54072}, {f: 3, c: 54075}, {f: 2, c: 54084}, {f: 2, c: 54140}, 6658 54144, 54148, {f: 2, c: 54156}, {f: 3, c: 54159}, {f: 2, c: 54168}, 54172, 6659 54176, {f: 2, c: 54184}, 54187, 54189, 54196, 54200, 54204, 6660 {f: 2, c: 54212}, {f: 2, c: 54216}, 54224, 54232, 54241, 54243, 6661 {f: 2, c: 54252}, 54256, 54260, {f: 2, c: 54268}, 54271, 54273, 54280, 6662 54301, 54336, 54340, 54364, 54368, 54372, 54381, 54383, {f: 2, c: 54392}, 6663 54396, {f: 2, c: 54399}, 54402, {f: 2, c: 54408}, 54411, 54413, 54420, 6664 54441, 54476, 54480, 54484, 54492, 54495, 54504, 54508, 54512, 54520, 6665 54523, 54525, 54532, 54536, 54540, {f: 2, c: 54548}, 54551, 6666 {f: 2, c: 54588}, 54592, 54596, {f: 2, c: 54604}, 54607, 54609, 6667 {f: 2, c: 54616}, 54620, 54624, 54629, {f: 2, c: 54632}, 54635, 54637, 6668 {f: 2, c: 54644}, 54648, 54652, {f: 2, c: 54660}, {f: 3, c: 54663}, 54672, 6669 54693, {f: 2, c: 54728}, 54732, 54736, 54738, {f: 2, c: 54744}, 54747, 6670 54749, {f: 2, c: 54756}, 54760, 54764, {f: 2, c: 54772}, 54775, 54777, 6671 {f: 2, c: 54784}, 54788, 54792, {f: 2, c: 54800}, {f: 3, c: 54803}, 54812, 6672 54816, 54820, 54829, {f: 2, c: 54840}, 54844, 54848, 54853, 6673 {f: 2, c: 54856}, 54859, 54861, 54865, {f: 2, c: 54868}, 54872, 54876, 6674 54887, 54889, {f: 2, c: 54896}, 54900, 54915, 54917, {f: 2, c: 54924}, 6675 54928, 54932, 54941, 54943, 54945, 54952, 54956, 54960, 54969, 54971, 6676 {f: 2, c: 54980}, 54984, 54988, 54993, 54996, 54999, 55001, 55008, 55012, 6677 55016, 55024, 55029, {f: 2, c: 55036}, 55040, 55044, 55057, 6678 {f: 2, c: 55064}, 55068, 55072, {f: 2, c: 55080}, 55083, 55085, 6679 {f: 2, c: 55092}, 55096, 55100, 55108, 55111, 55113, {f: 2, c: 55120}, 6680 55124, {f: 4, c: 55126}, {f: 2, c: 55136}, 55139, 55141, 55145, 55148, 6681 55152, 55156, {f: 2, c: 55164}, 55169, {f: 2, c: 55176}, 55180, 55184, 6682 {f: 2, c: 55192}, 55195, 55197, 20285, 20339, 20551, 20729, 21152, 21487, 6683 21621, 21733, 22025, 23233, 23478, 26247, {f: 2, c: 26550}, 26607, 27468, 6684 29634, 30146, 31292, 33499, 33540, 34903, 34952, 35382, [36040, 63747], 6685 36303, 36603, 36838, 39381, 21051, 21364, 21508, 24682, 24932, 27580, 6686 29647, 33050, 35258, [12179, 35282], 38307, 20355, 21002, 22718, 22904, 6687 23014, [12082, 24178], 24185, 25031, 25536, 26438, 26604, 26751, 28567, 6688 30286, 30475, 30965, 31240, 31487, 31777, 32925, [12169, 33390], 33393, 6689 35563, 38291, 20075, 21917, 26359, 28212, 30883, 31469, 33883, 35088, 6690 34638, 38824, 21208, 22350, 22570, 23884, 24863, 25022, 25121, 25954, 6691 26577, 27204, 28187, [12130, 29976], 30131, 30435, 30640, 32058, 37039, 6692 {f: 2, c: 37969}, 40853, 21283, 23724, 30002, 32987, 37440, 38296, 21083, 6693 22536, 23004, 23713, 23831, 24247, 24378, 24394, 24951, 27743, 30074, 6694 30086, 31968, 32115, 32177, 32652, 33108, 33313, 34193, 35137, 35611, 6695 37628, [38477, 64009], 40007, 20171, 20215, 20491, 20977, 22607, 24887, 6696 24894, 24936, 25913, 27114, 28433, 30117, 30342, 30422, 31623, 33445, 6697 33995, 37799, 38283, 21888, 23458, 22353, 31923, 32697, 37301, 20520, 6698 21435, 23621, 24040, 25298, 25454, 25818, 25831, 28192, 28844, 31067, 6699 36317, 36382, 36989, 37445, 37624, 20094, 20214, 20581, [12081, 24062], 6700 24314, 24838, 26967, 33137, 34388, 36423, 37749, 39467, 20062, 20625, 6701 26480, 26688, 20745, 21133, 21138, 27298, 30652, 37392, 40660, 21163, 6702 24623, 36850, 20552, 25001, 25581, 25802, 26684, 27268, 28608, 33160, 6703 35233, 38548, 22533, 29309, [12125, 29356], 29956, 32121, 32365, 32937, 6704 [12178, 35211, 64010], 35700, 36963, 40273, 25225, 27770, 28500, 32080, 6705 32570, 35363, 20860, 24906, 31645, 35609, 37463, 37772, 20140, 20435, 6706 20510, 20670, 20742, 21185, 21197, 21375, 22384, 22659, 24218, 24465, 6707 24950, 25004, 25806, 25964, 26223, 26299, [26356, 63745], 26775, 28039, 6708 28805, 28913, 29855, 29861, 29898, 30169, 30828, 30956, 31455, 31478, 6709 32069, 32147, 32789, 32831, 33051, 33686, 35686, 36629, 36885, 37857, 6710 38915, 38968, 39514, 39912, 20418, 21843, 22586, [22865, 63753], 23395, 6711 23622, 24760, 25106, 26690, 26800, 26856, 28330, 30028, 30328, 30926, 6712 31293, 31995, 32363, 32380, 35336, 35489, 35903, 38542, 40388, 21476, 6713 21481, 21578, 21617, 22266, 22993, 23396, 23611, 24235, 25335, 25911, 6714 25925, 25970, 26272, 26543, 27073, 27837, 30204, 30352, 30590, 31295, 6715 32660, 32771, 32929, 33167, 33510, 33533, 33776, 34241, 34865, 34996, 6716 35493, 36764, 37678, 38599, 39015, [12220, 39640], [12238, 40723], 21741, 6717 26011, 26354, 26767, 31296, [12181, 35895], 40288, 22256, 22372, 23825, 6718 26118, 26801, 26829, 28414, 29736, 34974, 39908, 27752, [12219, 39592], 6719 20379, 20844, 20849, 21151, 23380, [12079, 24037], 24656, 24685, 25329, 6720 25511, 25915, 29657, 31354, 34467, 36002, 38799, [20018, 63749], 23521, 6721 [12093, 25096], 26524, [12128, 29916], 31185, 33747, 35463, 35506, 36328, 6722 36942, 37707, 38982, [24275, 64011], 27112, 34303, 37101, 20896, 23448, 6723 23532, 24931, 26874, 27454, 28748, 29743, 29912, 31649, 32592, 33733, 6724 35264, 36011, 38364, 39208, 21038, 24669, 25324, 36866, 20362, 20809, 6725 21281, 22745, 24291, 26336, 27960, 28826, 29378, 29654, 31568, 33009, 6726 37979, 21350, 25499, 32619, 20054, 20608, 22602, 22750, 24618, 24871, 6727 25296, 27088, 39745, 23439, 32024, 32945, 36703, 20132, 20689, 21676, 6728 21932, 23308, 23968, 24039, 25898, 25934, 26657, 27211, 29409, 30350, 6729 30703, 32094, 32761, 33184, 34126, 34527, 36611, 36686, 37066, 39171, 6730 39509, 39851, 19992, 20037, 20061, 20167, 20465, 20855, 21246, 21312, 6731 [12061, 21475], [21477, 63750], 21646, 22036, 22389, 22434, 23495, 23943, 6732 24272, 25084, 25304, 25937, 26552, 26601, 27083, 27472, 27590, 27628, 6733 27714, 28317, 28792, 29399, 29590, 29699, 30655, 30697, 31350, 32127, 6734 32777, [12165, 33276], 33285, 33290, 33503, 34914, 35635, 36092, 36544, 6735 36881, 37041, 37476, 37558, 39378, 39493, 40169, 40407, 6736 [12244, 40860, 63751, 63752], 22283, 23616, 33738, 38816, 38827, 40628, 6737 21531, 31384, 32676, 35033, 36557, 37089, 22528, 23624, 25496, 31391, 6738 23470, [12088, 24339], 31353, 31406, 33422, 36524, 20518, 21048, 21240, 6739 21367, 22280, 25331, 25458, 27402, 28099, 30519, 21413, 29527, 34152, 6740 36470, 38357, 26426, 27331, 28528, 35437, 36556, 39243, 26231, 27512, 6741 36020, [12225, 39740], 21483, 22317, 22862, 25542, 27131, 29674, 30789, 6742 31418, 31429, 31998, 33909, 35215, 36211, 36917, 38312, 21243, 22343, 6743 30023, 31584, 33740, 37406, 27224, 20811, 21067, 21127, 25119, 26840, 6744 26997, 38553, 20677, 21156, 21220, 25027, [12100, 26020], 26681, 27135, 6745 29822, 31563, 33465, 33771, 35250, 35641, 36817, 39241, 20170, 22935, 6746 25810, 26129, 27278, 29748, 31105, 31165, 33449, {f: 2, c: 34942}, 35167, 6747 37670, 20235, 21450, 24613, 25201, 27762, 32026, 32102, 20120, 20834, 6748 30684, 32943, 20225, 20238, 20854, 20864, 21980, 22120, 22331, 22522, 6749 22524, 22804, 22855, 22931, 23492, 23696, 23822, [12080, 24049], 24190, 6750 24524, 25216, 26071, 26083, {f: 2, c: 26398}, 26462, 26827, 26820, 27231, 6751 27450, 27683, 27773, 27778, 28103, 29592, 29734, 29738, 29826, 29859, 6752 30072, 30079, 30849, 30959, 31041, {f: 2, c: 31047}, 31098, 31637, 32000, 6753 32186, 32648, 32774, 32813, 32908, 35352, 35663, [35912, 63744], 36215, 6754 37665, 37668, 39138, 39249, {f: 2, c: 39438}, 39525, 40594, 32202, 20342, 6755 21513, 25326, 26708, [12198, 37329, 63754], 21931, 20794, 23068, 25062, 6756 [25295, 63835], 25343, 37027, [35582, 63837], 26262, 29014, 38627, 25423, 6757 25466, 21335, 26511, 26976, 28275, 30007, 32013, 34930, 22218, 23064, 6758 20035, 20839, [22856, 63756], 26608, 32784, [12069, 22899, 63873], 6759 [24180, 63886], [25754, 63889], [31178, 63893], [24565, 63907], 24684, 6760 25288, [25467, 63908], [23527, 63839, 63914], 23511, 21162, 22900, 24361, 6761 [24594, 63840], 29785, 39377, 28611, 33215, 36786, 24817, 33126, 6762 [23615, 63933], 23273, 35365, [26491, 63944], [32016, 63951], 33021, 23612, 6763 [27877, 63971], [21311, 63979], [28346, 63980], 22810, [33590, 63998], 6764 [20025, 63838], 20150, 20294, 21934, 22296, 22727, 24406, 26039, 26086, 6765 27264, 27573, 28237, 30701, 31471, 31774, 32222, 34507, 34962, 37170, 6766 37723, 25787, 28606, 29562, 30136, 36948, 21846, 22349, 25018, 25812, 6767 26311, 28129, 28251, 28525, 28601, 30192, 32835, 33213, 34113, 35203, 6768 35527, 35674, 37663, 27795, 30035, 31572, 36367, 36957, 21776, 22530, 6769 22616, 24162, 25095, 25758, 26848, 30070, [31958, 64003], 34739, 40680, 6770 20195, 22408, 22382, [12068, 22823], 23565, 23729, 24118, 24453, 25140, 6771 25825, 29619, 33274, 34955, 36024, 38538, 40667, [23429, 64004], 24503, 6772 24755, 20498, [12049, 20992], 21040, 22294, 22581, 22615, 23566, 23648, 6773 23798, 23947, [24230, 64001], 24466, 24764, 25361, 25481, 25623, 26691, 6774 26873, 27330, 28120, 28193, 28372, 28644, 29182, 30428, 30585, 31153, 6775 31291, 33796, 35241, 36077, 36339, 36424, 36867, 36884, 36947, 37117, 6776 37709, 38518, 38876, 27602, 28678, 29272, 29346, 29544, 30563, 31167, 6777 31716, 32411, [35712, 63834], 22697, 24775, 25958, 26109, 26302, 27788, 6778 28958, 29129, 35930, 38931, 20077, 31361, 20189, 20908, 20941, 21205, 6779 21516, 24999, 26481, 26704, 26847, [27934, 64005], 28540, 30140, 30643, 6780 31461, 33012, 33891, 37509, 20828, [12099, 26007], 26460, 26515, 30168, 6781 31431, 33651, [12182, 35910], 36887, 38957, 23663, 33216, 33434, 36929, 6782 36975, 37389, 24471, 23965, 27225, 29128, 30331, 31561, 34276, 35588, 6783 37159, 39472, [21895, 63755], [25078, 63757], [30313, 63758], 6784 [32645, 63759], [34367, 63760], [34746, 63761], [35064, 63762], 6785 [37007, 63763], [27931, 63765], [28889, 63766], [29662, 63767], 32097, 6786 [33853, 63768], [37226, 63769], [39409, 63770], [20098, 63771], 6787 [21365, 63772], [27396, 63773], 27410, 28734, [29211, 63774], 6788 [34349, 63775], [40478, 63776], 21068, 36771, [23888, 63777], 25829, 25900, 6789 27414, [28651, 63778], 31811, 32412, [34253, 63779], [35172, 63780], 35261, 6790 [25289, 63781], [33240, 63782], [34847, 63783], [24266, 63784], 6791 [26391, 63785], [28010, 63786], [29436, 63787], 29701, 29807, 34690, 6792 [37086, 63788], [20358, 63789], 23821, 24480, 33802, [20919, 63790], 6793 [25504, 63861], [30053, 63862], [20142, 63863], 20486, [20841, 63864], 6794 [20937, 63865], [26753, 63866], 27153, 31918, 31921, [31975, 63867], 6795 [33391, 63868], [35538, 63869], 36635, [37327, 63870], 20406, 20791, 6796 [21237, 63871], [21570, 63872], [24300, 63874], 24942, 25150, 6797 [26053, 63875], 27354, [28670, 63876], [31018, 63877], 34268, 34851, 6798 [38317, 63878], 39522, [39530, 63879], [40599, 63880], [40654, 63881], 6799 [12050, 21147, 63882], [26310, 63883], [27511, 63884], 28701, 31019, 6800 [36706, 63885], 38722, [24976, 63887], [25088, 63888], 25891, 6801 [28451, 63890], [29001, 63891], [29833, 63892], [32244, 63894], 6802 [32879, 63895], [34030, 63897], [36646, 63896], [36899, 63898], 6803 [37706, 63899], 20925, [21015, 63900], [21155, 63901], 27916, 6804 [28872, 63903], [35010, 63904], [24265, 63906], 25986, [27566, 63909], 6805 28610, [31806, 63910], [29557, 63911], [20196, 63912], 20278, 6806 [22265, 63913], 23738, [23994, 63915], [24604, 63916], [29618, 63917], 6807 31533, [32666, 63919], 32718, [32838, 63920], 36894, [37428, 63921], 6808 [38646, 63922], [38728, 63923], [38936, 63924], 40801, [20363, 63925], 6809 28583, [31150, 63926], [37300, 63927], [38583, 63928], [21214, 63791], 6810 25736, [25796, 63792], [27347, 63793], 28510, 28696, [29200, 63794], 6811 [30439, 63795], [12156, 32769, 63796], [34310, 63797], [34396, 63798], 6812 [36335, 63799], 36613, [38706, 63800], [39791, 63801], [40442, 63802], 6813 [12228, 40565], [30860, 63803], [31103, 63804], [32160, 63805], 6814 [33737, 63806], [37636, 63807], [12229, 40575, 63808], 40595, 6815 [35542, 63809], [22751, 63810], [24324, 63811], 26407, 28711, 29903, 6816 [31840, 63812], [32894, 63813], 20769, 28712, [29282, 63814], 6817 [30922, 63815], [36034, 63816], 36058, 36084, [38647, 63817], 6818 [20102, 63930], [20698, 63931], [23534, 63932], 24278, [26009, 63934], 6819 [29134, 63936], [30274, 63937], 30637, 32842, [34044, 63938], 6820 [36988, 63939], 39719, [12243, 40845, 63940], [22744, 63818], 23105, 6821 [23650, 63819], [27155, 63820], [28122, 63821], [28431, 63822], 30267, 6822 [32047, 63823], [32311, 63824], 34078, 35128, 37860, [38475, 63825], 6823 [21129, 63943], 26066, [26611, 63945], 27060, [27969, 63946], 6824 [28316, 63947], 28687, [29705, 63948], 29792, [30041, 63949], 30244, 6825 [30827, 63950], 35628, [39006, 63952], [20845, 63953], [25134, 63954], 6826 [38520, 63955], 20374, [20523, 63956], [23833, 63957], [28138, 63958], 6827 32184, [36650, 63959], [24459, 63960], [24900, 63961], [26647, 63962], 6828 [38534, 63964], [21202, 63826], [32907, 63827], [20956, 63828], 6829 [20940, 63829], 26974, [31260, 63830], [32190, 63831], [33777, 63832], 6830 [38517, 63833], 20442, [21033, 63965], 21400, [21519, 63966], 21774, 6831 [23653, 63967], 24743, [26446, 63969], [26792, 63970], 28012, 29313, 29432, 6832 [29702, 63972], 29827, [30178, 63973], 31852, [32633, 63974], 32696, 33673, 6833 [35023, 63975], [35041, 63976], [12197, 37324, 63977], 37328, 6834 [38626, 63978], 39881, [21533, 63981], 28542, [29136, 63982], 6835 [29848, 63983], [34298, 63984], 36522, [38563, 63985], [40023, 63986], 6836 [40607, 63987], [26519, 63988], [28107, 63989], 29747, [33256, 63990], 6837 38678, 30764, [12148, 31435, 63991], [31520, 63992], [31890, 63993], 25705, 6838 29802, 30194, 30908, 30952, [12218, 39340], 39764, [12231, 40635], 23518, 6839 24149, 28448, 33180, 33707, 37000, 19975, 21325, 23081, 24018, 24398, 6840 24930, 25405, 26217, 26364, 28415, 28459, 28771, 30622, 33836, 34067, 6841 34875, 36627, 39237, 39995, 21788, 25273, 26411, 27819, 33545, 35178, 6842 38778, 20129, 22916, {f: 2, c: 24536}, 26395, 32178, 32596, 33426, 33579, 6843 33725, 36638, 37017, 22475, 22969, 23186, 23504, 26151, 26522, 26757, 6844 27599, 29028, 32629, 36023, 36067, 36993, 39749, 33032, 35978, 38476, 6845 39488, [12230, 40613], 23391, 27667, 29467, 30450, 30431, 33804, 20906, 6846 35219, 20813, 20885, 21193, 26825, 27796, 30468, 30496, 32191, 32236, 6847 [12207, 38754], 40629, 28357, 34065, 20901, 21517, 21629, 26126, 26269, 6848 26919, 28319, [12139, 30399], 30609, 33559, 33986, 34719, 37225, 37528, 6849 40180, 34946, 20398, 20882, 21215, 22982, 24125, 24917, {f: 2, c: 25720}, 6850 26286, 26576, 27169, 27597, [12113, 27611], 29279, 29281, 29761, 30520, 6851 [12141, 30683], 32791, 33468, 33541, 35584, 35624, 35980, [12106, 26408], 6852 27792, 29287, [12140, 30446], 30566, 31302, 40361, 27519, 27794, 22818, 6853 26406, 33945, 21359, 22675, 22937, 24287, 25551, 26164, 26483, 28218, 6854 29483, 31447, 33495, 37672, 21209, 24043, 25006, 25035, 25098, 25287, 6855 25771, [12102, 26080], 26969, 27494, [12111, 27595], 28961, 29687, 30045, 6856 32326, 33310, 33538, 34154, 35491, 36031, 38695, 40289, 22696, 40664, 6857 20497, 21006, 21563, 21839, [12098, 25991], 27766, {f: 2, c: 32010}, 32862, 6858 34442, [12200, 38272], 38639, 21247, 27797, 29289, 21619, 23194, 23614, 6859 23883, 24396, 24494, 26410, 26806, 26979, 28220, 28228, 30473, 6860 [12150, 31859], 32654, 34183, 35598, 36855, 38753, 40692, 23735, 24758, 6861 24845, 25003, 25935, {f: 2, c: 26107}, 27665, 27887, 29599, 29641, 32225, 6862 38292, 23494, 34588, 35600, 21085, 21338, 25293, 25615, 25778, 26420, 6863 27192, 27850, 29632, 29854, 31636, 31893, 32283, 33162, 33334, 34180, 6864 36843, 38649, 39361, 20276, 21322, 21453, 21467, 25292, 25644, 25856, 6865 26001, 27075, 27886, 28504, 29677, 30036, 30242, 30436, 30460, 30928, 6866 [30971, 63844], 31020, 32070, 33324, 34784, 36820, 38930, 39151, 21187, 6867 25300, 25765, 28196, 28497, 30332, 36299, 37297, 37474, 39662, 39747, 6868 20515, 20621, 22346, 22952, 23592, 24135, 24439, 25151, 25918, 6869 [12101, 26041], 26049, 26121, 26507, 27036, 28354, 30917, 32033, 32938, 6870 33152, 33323, 33459, 33953, 34444, 35370, 35607, 37030, 38450, 40848, 6871 20493, 20467, 22521, 24472, 25308, 25490, 26479, 28227, 28953, 30403, 6872 32972, 32986, {f: 2, c: 35060}, 35097, 36064, 36649, 37197, 38506, 20271, 6873 20336, 24091, 26575, 26658, [12137, 30333], 30334, 39748, 24161, 27146, 6874 29033, 29140, 30058, 32321, 34115, 34281, 39132, 20240, 31567, 32624, 6875 38309, 20961, 24070, 26805, 27710, 27726, 27867, 29359, 31684, 33539, 6876 27861, 29754, 20731, 21128, 22721, 25816, 27287, 29863, 30294, 30887, 6877 34327, 38370, 38713, 21342, 24321, 35722, 36776, 36783, 37002, 21029, 6878 30629, 40009, 40712, 19993, 20482, 20853, 23643, 24183, 26142, 26170, 6879 26564, 26821, 28851, 29953, 30149, 31177, 31453, 36647, 39200, 39432, 6880 20445, 22561, 22577, 23542, 26222, 27493, 27921, 28282, 28541, 29668, 6881 29995, 33769, 35036, 35091, 35676, 36628, 20239, 20693, 21264, 6882 [12056, 21340], 23443, [24489, 63846], 26381, 31119, 33145, 33583, 34068, 6883 35079, 35206, 36665, [36667, 64007], 39333, 39954, 26412, 20086, 20472, 6884 22857, 23553, {f: 2, c: 23791}, 25447, 26834, 28925, 29090, 29739, 32299, 6885 34028, 34562, 36898, 37586, 40179, [19981, 63847], 20184, 20463, 20613, 6886 21078, 21103, 21542, 21648, 22496, 22827, 23142, 23386, 23413, 23500, 6887 24220, 25206, 25975, 26023, 28014, 28325, [12119, 29238], 31526, 31807, 6888 [12152, 32566], {f: 2, c: 33104}, 33178, 33344, 33433, 33705, 35331, 36000, 6889 36070, 36091, 36212, 36282, 37096, 37340, [12201, 38428], 38468, 39385, 6890 40167, [21271, 63843], 20998, 21545, 22132, 22707, 22868, 22894, 24575, 6891 24996, 25198, 26128, 27774, 28954, 30406, 31881, 31966, 32027, 33452, 6892 36033, 38640, 20315, 24343, 24447, 25282, 23849, 26379, 26842, 30844, 6893 32323, 40300, 19989, 20633, [12052, 21269], 21290, 21329, 22915, 23138, 6894 24199, 24754, 24970, 25161, 25209, 26000, 26503, 27047, [12112, 27604], 6895 {f: 3, c: 27606}, 27832, 29749, 30202, 30738, 30865, 31189, 31192, 31875, 6896 32203, 32737, 32933, 33086, 33218, 33778, 34586, 35048, 35513, 35692, 6897 36027, 37145, [12206, 38750], [12214, 39131], [12240, 40763], 22188, 23338, 6898 24428, 25996, 27315, 27567, 27996, 28657, 28693, 29277, 29613, 36007, 6899 36051, 38971, 24977, 27703, 32856, 39425, 20045, 20107, 20123, 20181, 6900 20282, 20284, 20351, 20447, 20735, 21490, 21496, 21766, 21987, 22235, 6901 [12064, 22763], 22882, 23057, 23531, 23546, 23556, 24051, 24107, 24473, 6902 24605, 25448, 26012, 26031, 26614, 26619, 26797, 27515, 27801, 27863, 6903 28195, 28681, 29509, 30722, 31038, 31040, 31072, 31169, 31721, 32023, 6904 32114, 32902, 33293, 33678, 34001, 34503, 35039, 35408, 35422, 35613, 6905 36060, 36198, 36781, 37034, 39164, 39391, 40605, 21066, 26388, 20632, 6906 21034, [12077, 23665], 25955, 27733, 29642, 29987, 30109, 31639, 33948, 6907 37240, 38704, 20087, 25746, [27578, 63856], 29022, 34217, 19977, 26441, 6908 26862, 28183, 33439, 34072, 34923, 25591, 28545, 37394, 39087, 19978, 6909 20663, 20687, 20767, 21830, 21930, 22039, 23360, 23577, 23776, 24120, 6910 24202, 24224, 24258, 24819, 26705, 27233, 28248, 29245, 29248, 6911 [29376, 63994], 30456, 31077, 31665, 32724, 35059, 35316, 35443, 35937, 6912 36062, 38684, [22622, 63852], 29885, 36093, 21959, 31329, [32034, 63850], 6913 [12170, 33394], 29298, [12131, 29983], 29989, 31513, 22661, 22779, 23996, 6914 24207, 24246, 24464, 24661, 25234, 25471, 25933, 26257, 26329, 26360, 6915 26646, 26866, 29312, 29790, 31598, 32110, 32214, 32626, 32997, 33298, 6916 34223, 35199, 35475, 36893, 37604, [12233, 40653], [12239, 40736], 6917 [12067, 22805], 22893, 24109, 24796, 26132, 26227, 26512, 27728, 28101, 6918 28511, [12143, 30707], 30889, 33990, 37323, 37675, 20185, 20682, 20808, 6919 21892, 23307, 23459, 25159, 25982, 26059, 28210, 29053, 29697, 29764, 6920 29831, 29887, 30316, 31146, 32218, 32341, 32680, 33146, 33203, 33337, 6921 34330, 34796, 35445, 36323, 36984, 37521, 37925, 39245, 39854, 21352, 6922 23633, 26964, 27844, 27945, 28203, [12166, 33292], 34203, 35131, 35373, 6923 [35498, 63855, 63905], 38634, 40807, 21089, 26297, 27570, 32406, 34814, 6924 36109, 38275, 38493, 25885, 28041, 29166, 22478, 22995, 23468, 24615, 6925 24826, 25104, 26143, 26207, 29481, 29689, 30427, [30465, 63853], 31596, 6926 32854, 32882, 33125, 35488, 37266, 19990, 21218, 27506, 27927, 31237, 6927 31545, 32048, 36016, 21484, 22063, 22609, 23477, [12073, 23567], 23569, 6928 24034, 25152, 25475, 25620, 26157, 26803, 27836, 28040, 28335, 28703, 6929 28836, 29138, 29990, 30095, 30094, 30233, 31505, 31712, 31787, 32032, 6930 32057, 34092, 34157, 34311, 35380, 36877, 36961, 37045, 37559, 38902, 6931 39479, 20439, 23660, 26463, 28049, 31903, 32396, 35606, 36118, 36895, 6932 23403, 24061, 25613, 33984, 36956, 39137, [29575, 63841, 63963], 23435, 6933 24730, 26494, 28126, 35359, 35494, 36865, 38924, 21047, 28753, 30862, 6934 37782, 34928, 37335, 20462, 21463, 22013, 22234, 22402, 22781, 23234, 6935 23432, 23723, 23744, 24101, 24833, 25101, [12095, 25163], 25480, 25628, 6936 25910, [25976, 63849], 27193, 27530, [12116, 27700], 27929, 28465, 29159, 6937 29417, 29560, 29703, 29874, 30246, 30561, 31168, 31319, 31466, 31929, 6938 32143, 32172, 32353, 32670, 33065, 33585, 33936, 34010, 34282, 34966, 6939 35504, 35728, 36664, 36930, 36995, 37228, 37526, 37561, 38539, 6940 {f: 2, c: 38567}, 38614, 38656, 38920, [12216, 39318], 39635, 39706, 21460, 6941 22654, 22809, 23408, 23487, 28113, 28506, 29087, 29729, 29881, 32901, 6942 33789, 24033, 24455, 24490, 24642, 26092, 26642, 26991, 27219, 27529, 6943 27957, 28147, 29667, 30462, 30636, 31565, 32020, 33059, 33308, 33600, 6944 34036, 34147, 35426, 35524, 37255, 37662, 38918, 39348, 25100, 34899, 6945 36848, 37477, 23815, 23847, 23913, 29791, 33181, 34664, 28629, 6946 [25342, 63859], 32722, 35126, 35186, 19998, 20056, 20711, 21213, 21319, 6947 25215, 26119, 32361, 34821, 38494, 20365, 21273, 22070, 22987, 23204, 6948 [12075, 23608], 23630, 23629, 24066, 24337, 24643, 26045, 26159, 26178, 6949 26558, 26612, 29468, [12142, 30690], [12144, 31034], 32709, 33940, 33997, 6950 35222, 35430, 35433, 35553, [12183, 35925], 35962, 22516, 23508, 24335, 6951 24687, 25325, 26893, 27542, 28252, 29060, 31698, 34645, [35672, 63996], 6952 36606, [12215, 39135], 39166, 20280, 20353, 20449, 21627, 23072, 23480, 6953 24892, 26032, 26216, 29180, 30003, 31070, 32051, 33102, [12162, 33251], 6954 33688, 34218, 34254, 34563, 35338, [12189, 36523], [12191, 36763], 36805, 6955 22833, 23460, 23526, 24713, 23529, 23563, [12092, 24515], 27777, 28145, 6956 28683, 29978, 33455, 35574, [20160, 63997], [12055, 21313], 38617, 6957 [12114, 27663], 20126, 20420, 20818, 21854, 23077, 23784, 25105, 6958 [12123, 29273], 33469, 33706, 34558, 34905, 35357, 38463, 38597, 39187, 6959 40201, 40285, 22538, 23731, 23997, 24132, [24801, 63929], 24853, 25569, 6960 [27138, 63764, 63836, 63935], 28197, 37122, 37716, 38990, 39952, 40823, 6961 23433, 23736, 25353, 26191, 26696, 30524, 38593, 38797, 38996, 39839, 6962 26017, 35585, 36555, 38332, 21813, 23721, 24022, 24245, 26263, 30284, 6963 33780, 38343, 22739, 25276, 29390, 40232, 20208, 22830, 24591, 26171, 6964 27523, 31207, 40230, 21395, 21696, 22467, 23830, 24859, 26326, 28079, 6965 30861, 33406, 38552, 38724, 21380, 25212, 25494, 28082, 32266, 33099, 6966 38989, 27387, 32588, 40367, 40474, 20063, 20539, 20918, 22812, 24825, 6967 25590, 26928, 29242, 32822, 37326, 24369, 32004, [33509, 63860], 33903, 6968 33979, 34277, 36493, 20335, 22756, 23363, 24665, 25562, 25880, 25965, 6969 26264, 26954, 27171, 27915, 28673, 29036, 30162, 30221, 31155, 31344, 6970 [12154, 32650], 35140, 35731, 37312, 38525, 39178, 22276, 24481, 26044, 6971 28417, 30208, 31142, 35486, 39341, [12226, 39770], 40812, 20740, 25014, 6972 25233, 27277, 33222, 20547, 22576, 24422, 28937, [12180, 35328], 35578, 6973 23420, 34326, 20474, 20796, 22196, 22852, 25513, 28153, 23978, 26989, 6974 20870, 20104, 20313, 22914, 27487, 27741, 29877, 30998, 33287, 33349, 6975 33593, 36671, 36701, 39192, 20134, 22495, 24441, [26131, 63968], 30123, 6976 32377, 35695, 36870, 39515, 22181, 22567, 23032, 23071, 23476, 24310, 6977 25424, 25403, 26941, 27783, 27839, 28046, 28051, 28149, 28436, 28895, 6978 28982, 29017, 29123, 29141, 30799, 30831, 31605, 32227, 32303, 34893, 6979 36575, 37467, 40182, 24709, 28037, 29105, 38321, 21421, 26579, 28814, 6980 28976, 29744, 33398, 33490, 38331, 39653, 40573, 26308, 29121, 6981 [33865, 63854], 22603, 23992, 24433, 26144, 26254, 27001, 27054, 27704, 6982 27891, 28214, 28481, 28634, 28699, 28719, 29008, 29151, 29552, 29787, 6983 29908, 30408, 31310, 32403, 33521, 35424, 36814, 37704, 38681, 20034, 6984 20522, 21000, 21473, 26355, 27757, 28618, 29450, 30591, 31330, 33454, 6985 34269, 34306, 35028, 35427, 35709, 35947, 37555, 38675, 38928, 20116, 6986 20237, 20425, 20658, 21320, 21566, 21555, 21978, 22626, 22714, 22887, 6987 23067, 23524, 24735, 25034, 25942, 26111, 26212, 26791, 27738, 28595, 6988 28879, 29100, 29522, 31613, 34568, 35492, 39986, 40711, 23627, 27779, 6989 29508, [12127, 29577], 37434, 28331, 29797, 30239, 31337, 32277, 34314, 6990 20800, 22725, 25793, 29934, 29973, 30320, 32705, 37013, 38605, 39252, 6991 28198, [12129, 29926], {f: 2, c: 31401}, 33253, 34521, 34680, 35355, 23113, 6992 23436, 23451, 26785, 26880, 28003, 29609, 29715, 29740, 30871, 32233, 6993 32747, 33048, 33109, 33694, 35916, [38446, 63942], 38929, [12104, 26352], 6994 24448, 26106, 26505, 27754, 29579, 20525, 23043, 27498, 30702, 22806, 6995 23916, 24013, 29477, 30031, 20709, 20985, 22575, 22829, 22934, 23002, 6996 23525, 23970, 25303, 25622, 25747, 25854, 26332, 27208, 29183, 29796, 6997 31368, 31407, 32327, 32350, 32768, 33136, 34799, 35201, 35616, 36953, 6998 36992, 39250, 24958, 27442, 28020, 32287, 35109, 36785, 20433, 20653, 6999 20887, 21191, 22471, 22665, 23481, 24248, 24898, 27029, 28044, 28263, 7000 28342, 29076, 29794, [12132, 29992], 29996, 32883, 33592, 33993, 36362, 7001 37780, 37854, 20110, 20305, 20598, 20778, [12060, 21448], 21451, 21491, 7002 23431, 23507, 23588, 24858, 24962, 26100, [12124, 29275], 29591, 29760, 7003 30402, 31056, 31121, 31161, 32006, [12155, 32701], 33419, 34261, 34398, 7004 36802, 36935, 37109, 37354, 38533, [12204, 38632], 38633, 21206, 24423, 7005 26093, 26161, 26671, 29020, 31286, 37057, 38922, 20113, 27218, 27550, 7006 28560, 29065, 32792, 33464, 34131, 36939, 38549, 38642, 38907, 34074, 7007 39729, 20112, 29066, 38596, 20803, 21407, 21729, 22291, 22290, 22435, 7008 23195, 23236, 23491, 24616, 24895, 25588, 27781, 27961, 28274, 28304, 7009 29232, 29503, 29783, 33489, 34945, 36677, 36960, 38498, 39000, 40219, 7010 [12105, 26376], 36234, 37470, 20301, 20553, 20702, 21361, 22285, 22996, 7011 23041, 23561, 24944, 26256, 28205, 29234, 29771, 32239, 32963, 33806, 7012 33894, 34111, 34655, 34907, 35096, 35586, 36949, [12209, 38859], 39759, 7013 20083, 20369, 20754, 20842, 21807, 21929, 23418, 23461, {f: 2, c: 24188}, 7014 24254, 24736, 24799, {f: 2, c: 24840}, 25540, 25912, 26377, 26580, 26586, 7015 {f: 2, c: 26977}, 27833, 27943, 28216, 28641, {f: 2, c: 29494}, 29788, 7016 30001, 30290, 32173, 33278, 33848, 35029, 35480, 35547, 35565, 36400, 7017 36418, 36938, 36926, 36986, [12195, 37193], 37321, 37742, 22537, 27603, 7018 [12161, 32905], 32946, 20801, 22891, 23609, 28516, 29607, 32996, 36103, 7019 37399, 38287, [12160, 32895], 25102, 28700, 32104, 34701, 22432, 24681, 7020 24903, 27575, 35518, 37504, 38577, [12036, 20057], 21535, 28139, 34093, 7021 38512, [12211, 38899], 39150, 25558, 27875, [12194, 37009], 20957, 25033, 7022 33210, 40441, 20381, 20506, 20736, 23452, 24847, 25087, 25836, 26885, 7023 27589, 30097, 30691, 32681, 33380, 34191, 34811, [12176, 34915], 35516, 7024 35696, 37291, [12038, 20108], 20197, 20234, 22839, 23016, 24050, 24347, 7025 24411, 24609, 29246, 29669, [30064, 63842], 30157, 31227, [12157, 32780], 7026 [12159, 32819], 32900, 33505, 33617, 36029, 36019, 36999, 39156, 39180, 7027 28727, 30410, 32714, 32716, 32764, 35610, [12040, 20154], 20161, 20995, 7028 21360, [21693, 63902], 22240, 23035, 23493, 24341, 24525, 28270, 32106, 7029 33589, 34451, 35469, 38765, 38775, [12032, 19968], 20314, 20350, 22777, 7030 [12103, 26085], 28322, 36920, 37808, 39353, 20219, 22764, 22922, 23001, 7031 24641, 31252, 33615, 36035, [12042, 20837], 21316, 20173, 21097, 23381, 7032 33471, 20180, [21050, 63999], 21672, 22985, 23039, [12070, 23376], 23383, 7033 23388, 24675, 24904, 28363, [28825, 63995], 29038, 29574, 29943, 30133, 7034 30913, 32043, 32773, [12163, 33258], 33576, 34071, 34249, 35566, 36039, 7035 38604, 20316, 21242, 22204, 26027, 26152, 28796, 28856, 29237, 32189, 7036 33421, 37196, 38592, 40306, 23409, 26855, 27544, 28538, 30430, 23697, 7037 26283, 28507, 31668, 31786, 34870, 38620, 19976, 20183, 21280, 22580, 7038 22715, 22767, 22892, 23559, 24115, 24196, 24373, 25484, 26290, 26454, 7039 27167, 27299, 27404, 28479, 29254, 29520, 29835, 31456, 31911, 33144, 7040 33247, 33255, 33674, 33900, 34083, 34196, 34255, 35037, 36115, 37292, 7041 [12199, 38263], 38556, 20877, 21705, 22312, 23472, 25165, 26448, 26685, 7042 26771, 28221, 28371, 28797, 32289, 35009, 36001, 36617, 40779, 40782, 7043 29229, 31631, 35533, 37658, 20295, 20302, 20786, 21632, 22992, 24213, 7044 25269, 26485, 26990, 27159, 27822, 28186, 29401, 29482, 30141, 31672, 7045 32053, 33511, 33785, 33879, 34295, 35419, 36015, 36487, 36889, 37048, 7046 38606, 40799, 21219, 21514, 23265, 23490, 25688, 25973, 28404, 29380, 7047 30340, 31309, 31515, 31821, 32318, 32735, 33659, 35627, 36042, 7048 [12186, 36196], 36321, 36447, 36842, 36857, 36969, 37841, 20291, 20346, 7049 20659, 20840, 20856, 21069, 21098, 22625, 22652, 22880, 23560, 23637, 7050 24283, 24731, 25136, 26643, 27583, 27656, 28593, 29006, 29728, 7051 [12133, 30000], 30008, 30033, 30322, 31564, 31627, 31661, 31686, 32399, 7052 35438, 36670, 36681, 37439, 37523, 37666, 37931, 38651, 39002, 39019, 7053 39198, [20999, 64000], 25130, 25240, 27993, 30308, 31434, 31680, 32118, 7054 21344, 23742, 24215, 28472, 28857, 31896, 38673, 39822, 40670, 25509, 7055 25722, 34678, 19969, 20117, 20141, 20572, 20597, 21576, 22979, 23450, 7056 24128, 24237, 24311, 24449, 24773, 25402, 25919, 25972, 26060, 26230, 7057 26232, 26622, 26984, 27273, 27491, 27712, 28096, 28136, 28191, 28254, 7058 28702, 28833, 29582, 29693, 30010, 30555, 30855, 31118, 31243, 31357, 7059 31934, 32142, 33351, 35330, 35562, 35998, 37165, 37194, 37336, 37478, 7060 37580, 37664, 38662, 38742, 38748, 38914, [12237, 40718], 21046, 21137, 7061 21884, 22564, 24093, 24351, 24716, 25552, 26799, 28639, 31085, 31532, 7062 33229, 34234, 35069, 35576, 36420, 37261, 38500, 38555, 38717, 38988, 7063 [12241, 40778], 20430, 20806, 20939, 21161, 22066, 24340, 24427, 25514, 7064 25805, 26089, 26177, 26362, 26361, 26397, 26781, 26839, 27133, 28437, 7065 28526, 29031, 29157, [12118, 29226], 29866, 30522, 31062, 31066, 31199, 7066 31264, 31381, 31895, 31967, 32068, 32368, 32903, 34299, 34468, 35412, 7067 35519, 36249, 36481, 36896, 36973, 37347, 38459, 38613, [12227, 40165], 7068 26063, 31751, [12188, 36275], 37827, 23384, 23562, 21330, 25305, 29469, 7069 20519, 23447, 24478, 24752, 24939, 26837, 28121, 29742, 31278, 32066, 7070 32156, 32305, 33131, 36394, 36405, 37758, 37912, 20304, 22352, 24038, 7071 24231, 25387, 32618, 20027, 20303, 20367, 20570, 23005, 32964, 21610, 7072 21608, 22014, 22863, 23449, 24030, 24282, 26205, 26417, 26609, 26666, 7073 27880, 27954, 28234, 28557, 28855, 29664, 30087, 31820, 32002, 32044, 7074 32162, [12168, 33311], 34523, 35387, 35461, [12187, 36208], 36490, 36659, 7075 36913, 37198, 37202, 37956, 39376, [12149, 31481], 31909, 20426, 20737, 7076 20934, 22472, 23535, 23803, 26201, 27197, 27994, 28310, 28652, 28940, 7077 30063, 31459, 34850, 36897, 36981, 38603, 39423, 33537, 20013, 20210, 7078 34886, 37325, 21373, 27355, 26987, 27713, 33914, 22686, 24974, 26366, 7079 25327, 28893, 29969, 30151, 32338, 33976, 35657, 36104, 20043, 21482, 7080 21675, 22320, 22336, 24535, 25345, 25351, 25711, [12096, 25903], 26088, 7081 26234, 26525, 26547, [12108, 27490], 27744, 27802, 28460, 30693, 30757, 7082 31049, 31063, 32025, 32930, 33026, [12164, 33267], 33437, 33463, 34584, 7083 35468, 36100, 36286, 36978, 30452, 31257, 31287, 32340, 32887, 21767, 7084 21972, 22645, 25391, 25634, 26185, 26187, 26733, 27035, 27524, 27941, 7085 28337, 29645, 29800, 29857, 30043, 30137, 30433, 30494, 30603, 31206, 7086 32265, 32285, 33275, 34095, 34967, 35386, 36049, 36587, 7087 [12192, 36784, 63857], 36914, 37805, 38499, 38515, 38663, 20356, 21489, 7088 23018, 23241, 24089, 26702, 29894, 30142, 31209, 31378, 33187, 34541, 7089 36074, 36300, 36845, 26015, 26389, 22519, 28503, 32221, 36655, 37878, 7090 38598, 24501, 25074, 28548, 19988, 20376, 20511, 21449, 21983, 23919, 7091 24046, 27425, 27492, 30923, 31642, 36425, [12190, 36554, 63746], 36974, 7092 25417, 25662, 30528, 31364, 37679, 38015, 40810, 25776, 28591, 29158, 7093 29864, 29914, 31428, 31762, 32386, 31922, 32408, 35738, 36106, 38013, 7094 39184, 39244, 21049, 23519, 25830, 26413, 32046, 20717, [21443, 63851], 7095 22649, {f: 2, c: 24920}, 25082, 26028, 31449, 35730, 35734, 20489, 20513, 7096 21109, 21809, 23100, 24288, 24432, 24884, 25950, 26124, 26166, 26274, 7097 27085, 28356, 28466, 29462, 30241, 31379, 33081, 33369, 33750, 33980, 7098 20661, 22512, 23488, 23528, 24425, 25505, 30758, 32181, 33756, 34081, 7099 37319, 37365, 20874, 26613, 31574, 36012, 20932, 22971, 24765, 34389, 7100 20508, 21076, 23610, 24957, 25114, [25299, 64002], 25842, 26021, 28364, 7101 30240, 33034, 36448, 38495, 38587, 20191, 21315, 21912, 22825, 24029, 7102 25797, 27849, 28154, 29588, 31359, [12167, 33307], 34214, 36068, 36368, 7103 36983, 37351, 38369, 38433, 38854, 20984, 21746, 21894, 24505, 25764, 7104 28552, 32180, 36639, 36685, 37941, 20681, 23574, 27838, 28155, 29979, 7105 30651, 31805, 31844, 35449, 35522, 22558, 22974, 24086, 25463, 29266, 7106 30090, 30571, 35548, 36028, 36626, 24307, 26228, 28152, 32893, 33729, 7107 35531, [12205, 38737], 39894, 21059, 26367, 28053, 28399, 32224, 35558, 7108 36910, 36958, 39636, 21021, 21119, 21736, 24980, 25220, 25307, 26786, 7109 26898, 26970, 27189, 28818, 28966, 30813, 30977, 30990, 31186, 31245, 7110 32918, [12171, 33400], 33493, 33609, 34121, 35970, 36229, 37218, 37259, 7111 37294, 20419, 22225, 29165, 30679, 34560, 35320, [12072, 23544], 24534, 7112 26449, 37032, 21474, 22618, 23541, 24740, 24961, 25696, 32317, 32880, 7113 34085, 37507, 25774, 20652, 23828, 26368, 22684, 25277, 25512, 26894, 7114 27000, 27166, 28267, 30394, 31179, 33467, 33833, 35535, 36264, 36861, 7115 37138, 37195, 37276, 37648, 37656, 37786, 38619, 39478, 39949, 19985, 7116 30044, 31069, 31482, 31569, 31689, 32302, 33988, 36441, 36468, 36600, 7117 36880, 26149, 26943, 29763, 20986, 26414, 40668, 20805, 24544, 27798, 7118 34802, 34909, 34935, 24756, 33205, 33795, 36101, 21462, 21561, 22068, 7119 23094, 23601, 28810, 32736, 32858, 33030, 33261, 36259, 37257, 39519, 7120 40434, 20596, 20164, 21408, 24827, 28204, 23652, 20360, 20516, 21988, 7121 23769, 24159, 24677, 26772, 27835, 28100, 29118, 30164, 30196, 30305, 7122 31258, 31305, 32199, 32251, 32622, 33268, 34473, 36636, 38601, 39347, 7123 [12242, 40786], 21063, 21189, 39149, 35242, 19971, 26578, 28422, 20405, 7124 23522, 26517, [27784, 63858], 28024, 29723, 30759, 37341, 37756, 34756, 7125 31204, 31281, 24555, 20182, 21668, 21822, 22702, 22949, 24816, 25171, 7126 25302, 26422, 26965, 33333, 38464, 39345, 39389, 20524, 21331, 21828, 7127 22396, 25176, 25826, 26219, 26589, 28609, 28655, 29730, 29752, 35351, 7128 37944, 21585, 22022, 22374, 24392, 24986, 27470, 28760, 28845, 32187, 7129 35477, 22890, 33067, 25506, 30472, 32829, 36010, 22612, 25645, 27067, 7130 23445, 24081, 28271, 34153, 20812, 21488, 22826, 24608, 24907, 27526, 7131 27760, 27888, 31518, 32974, 33492, 36294, 37040, 39089, 25799, 28580, 7132 25745, 25860, 20814, 21520, [12063, 22303], 35342, 24927, 26742, 30171, 7133 31570, 32113, 36890, 22534, 27084, 33151, 35114, 36864, 38969, 20600, 7134 22871, 22956, 25237, 36879, 39722, 24925, 29305, 38358, 22369, 23110, 7135 24052, 25226, 25773, 25850, 26487, 27874, 27966, 29228, 29750, 30772, 7136 32631, 33453, 36315, 38935, 21028, 22338, 26495, 29256, 29923, 36009, 7137 36774, 37393, 38442, [12043, 20843], 21485, 25420, 20329, 21764, 24726, 7138 25943, 27803, 28031, 29260, 29437, 31255, 35207, [12185, 35997], 24429, 7139 28558, 28921, 33192, 24846, [20415, 63845], 20559, 25153, [12122, 29255], 7140 31687, 32232, 32745, 36941, 38829, 39449, 36022, 22378, 24179, 26544, 7141 33805, 35413, 21536, 23318, 24163, 24290, 24330, 25987, 32954, 34109, 7142 38281, 38491, 20296, 21253, 21261, 21263, 21638, 21754, 22275, 24067, 7143 24598, 25243, 25265, 25429, 27873, 28006, 30129, 30770, 32990, 33071, 7144 33502, 33889, 33970, 34957, 35090, 36875, 37610, 39165, 39825, 24133, 7145 [26292, 64006], 26333, 28689, 29190, 20469, 21117, 24426, 24915, 26451, 7146 27161, 28418, 29922, 31080, 34920, 35961, 39111, 39108, 39491, 21697, 7147 31263, 26963, 35575, 35914, [12213, 39080], 39342, 24444, 25259, 30130, 7148 [12138, 30382], 34987, 36991, 38466, 21305, 24380, 24517, [27852, 63848], 7149 29644, 30050, [12134, 30091], 31558, 33534, 39325, 20047, 36924, 19979, 7150 20309, 21414, 22799, 24264, 26160, 27827, 29781, 33655, 34662, 36032, 7151 36944, 38686, 39957, 22737, 23416, 34384, 35604, 40372, 23506, 24680, 7152 24717, 26097, 27735, 28450, 28579, 28698, 32597, 32752, {f: 2, c: 38289}, 7153 38480, 38867, 21106, 36676, 20989, 21547, 21688, 21859, 21898, 27323, 7154 28085, 32216, 33382, 37532, 38519, 40569, 21512, 21704, 30418, 34532, 7155 38308, 38356, 38492, 20130, 20233, 23022, 23270, 24055, 24658, 25239, 7156 26477, 26689, 27782, 28207, 32568, 32923, 33322, 38917, 20133, 20565, 7157 21683, 22419, 22874, 23401, 23475, 25032, 26999, 28023, 28707, 34809, 7158 35299, 35442, 35559, 36994, 39405, 39608, 21182, 26680, 20502, 24184, 7159 26447, 33607, [12175, 34892, 64008], 20139, 21521, 22190, 29670, 37141, 7160 38911, 39177, 39255, [12217, 39321], 22099, 22687, 34395, 35377, 25010, 7161 27382, 29563, 36562, 27463, 38570, 39511, 22869, 29184, 36203, 7162 [12208, 38761], 20436, 23796, 24358, 25080, 26203, 27883, 28843, 7163 [12126, 29572], 29625, 29694, 30505, 30541, 32067, 32098, 32291, 33335, 7164 34898, 36066, 37449, 39023, 23377, [12147, 31348], [12174, 34880], 7165 [12212, 38913], 23244, 20448, 21332, 22846, 23805, 25406, 28025, 29433, 7166 33029, 33031, 33698, 37583, 38960, 20136, 20804, 21009, 22411, 24418, 7167 27842, 28366, 28677, 28752, 28847, 29074, 29673, [29801, 63918], 33610, 7168 34722, 34913, 36872, 37026, 37795, 39336, 20846, 24407, 24800, 24935, 7169 26291, 34137, 36426, 37295, 38795, 20046, 20114, 21628, 22741, 22778, 7170 22909, 23733, 24359, [12094, 25142], 25160, 26122, 26215, 27627, 28009, 7171 28111, 28246, 28408, 28564, 28640, 28649, 28765, 29392, 29733, 29786, 7172 29920, 30355, 31068, 31946, 32286, 32993, 33446, 33899, 33983, 34382, 7173 34399, 34676, 35703, 35946, 37804, 38912, 39013, 24785, 25110, 37239, 7174 23130, 26127, 28151, 28222, 29759, 39746, 24573, 24794, 31503, 21700, 7175 24344, 27742, 27859, 27946, 28888, 32005, 34425, 35340, 40251, 21270, 7176 21644, 23301, 27194, [12117, 28779], 30069, 31117, [12146, 31166], 33457, 7177 33775, 35441, 35649, 36008, 38772, 25844, 25899, {f: 2, c: 30906}, 31339, 7178 20024, 21914, 22864, 23462, 24187, 24739, 25563, 27489, 26213, 26707, 7179 28185, 29029, 29872, 32008, 36996, 39529, 39973, 27963, [28369, 63748], 7180 29502, 35905, 38346, 20976, 24140, 24488, 24653, 24822, 24880, 24908, 7181 {f: 2, c: 26179}, 27045, 27841, 28255, 28361, 28514, 29004, 29852, 30343, 7182 31681, 31783, 33618, 34647, 36945, 38541, [12232, 40643], 21295, 22238, 7183 24315, 24458, 24674, 24724, 25079, 26214, 26371, 27292, 28142, 28590, 7184 28784, 29546, 32362, 33214, 33588, 34516, 35496, 36036, 21123, 29554, 7185 23446, 27243, 37892, 21742, 22150, 23389, 25928, 25989, 26313, 26783, 7186 28045, 28102, [12120, 29243], 32948, 37237, 39501, 20399, 20505, 21402, 7187 21518, 21564, 21897, 21957, 24127, 24460, 26429, 29030, 29661, 36869, 7188 21211, 21235, 22628, 22734, 28932, 29071, 29179, 34224, 35347, 7189 [26248, 63941], 34216, 21927, 26244, 29002, 33841, 21321, 21913, 27585, 7190 24409, 24509, 25582, 26249, 28999, 35569, 36637, 40638, 20241, 25658, 7191 28875, 30054, 34407, 24676, 35662, 40440, 20807, 20982, 21256, 27958, 7192 33016, [12234, 40657], 26133, 27427, 28824, 30165, 21507, 23673, 32007, 7193 35350, [12107, 27424], 27453, 27462, 21560, 24688, 27965, 32725, 33288, 7194 20694, 20958, 21916, 22123, 22221, 23020, 23305, 24076, 24985, 24984, 7195 25137, 26206, 26342, 29081, {f: 2, c: 29113}, 29351, 31143, 31232, 32690, 7196 35440, {s: 163}, {f: 4, c: 12310}, {s: 14}, 8223, 8219, {f: 2, c: 8314}, 7197 {s: 7}, 8316, 0, {f: 2, c: 8317}, {s: 23}, 700, {s: 44}, 8942, 8759, 7198 {s: 20}, {f: 10, c: 10122}, {s: 36}, {f: 26, c: 9398}, {s: 61}, 7199 {f: 2, c: 8826}, {f: 2, c: 8910}, {f: 2, c: 8832}, {f: 4, c: 8816}, 0, 7200 8842, 0, 8843, {f: 2, c: 8822}, 8825, {f: 2, c: 8922}, {s: 5}, 8773, 8771, 7201 8776, 0, 8868, {s: 78}, 8244, {s: 11}, 9839, {s: 4}, 8258, {s: 4}, 10045, 7202 0, 0, 8226, {s: 4}, {f: 2, c: 8249}, {s: 16}, 10010, 10006, 0, 9711, 7203 {s: 3}, 10070, 0, 9676, {s: 24}, 9775, {s: 6}, 12320, 0, {f: 10, c: 10102}, 7204 {s: 17}, 12306, 12342, {s: 13}, 8710, 0, 8735, 0, {f: 2, c: 8741}, 0, 8787, 7205 8785, {f: 2, c: 8806}, 8723, {f: 3, c: 8853}, 0, 8980, 0, 0, 8802, 0, 9649, 7206 0, 8738, 8784, 0, 0, 8867, 0, 0, {f: 2, c: 8814}, 8837, 8836, 8713, 8716, 7207 {f: 2, c: 8891}, 8794, 8966, {s: 6}, 12958, 0, 8252, {s: 11}, 9702, {s: 3}, 7208 9663, 9653, 9657, 9667, {s: 4}, 9674, 12849, 12857, 13259, {f: 5, c: 9327}, 7209 {s: 18}, 8656, 8655, 8653, {s: 37}, 8657, 8659, {s: 8}, 8626, 8625, 0, 7210 8628, 8624, 8627, {s: 14}, 8636, 8640, {s: 10}, {f: 2, c: 8644}, {s: 144}, 7211 {f: 5, c: 9347}, {s: 33}, 12948, {s: 15}, 12965, {s: 93}, 8672, 8674, 8673, 7212 8675, {s: 4}, 8678, 8680, 8679, 8681, {s: 20}, 9757, 9759, {s: 76}, 12944, 7213 {f: 6, c: 12938}, {s: 15}, {f: 2, c: 12318}, 8246, 0, 8245, {s: 3}, 12540, 7214 0, 0, {f: 2, c: 44034}, {f: 2, c: 44037}, {f: 5, c: 44043}, 44056, 7215 {f: 2, c: 44062}, {f: 3, c: 44065}, {f: 7, c: 44069}, 44078, 7216 {f: 6, c: 44082}, {f: 2, c: 44090}, {f: 3, c: 44093}, {f: 10, c: 44097}, 7217 44108, {f: 6, c: 44110}, {f: 3, c: 44117}, {f: 3, c: 44121}, 7218 {f: 19, c: 44125}, {f: 2, c: 44146}, {f: 2, c: 44149}, 44153, 7219 {f: 5, c: 44155}, 44162, {f: 2, c: 44167}, {f: 3, c: 44173}, 7220 {f: 3, c: 44177}, {f: 7, c: 44181}, 44190, {f: 6, c: 44194}, 44203, 7221 {f: 2, c: 44205}, {f: 7, c: 44209}, 44218, {f: 3, c: 44222}, 7222 {f: 2, c: 44226}, {f: 3, c: 44229}, {f: 3, c: 44233}, {f: 8, c: 44237}, 7223 44246, {f: 8, c: 44248}, {f: 2, c: 44258}, {f: 2, c: 44261}, 44265, 44267, 7224 {f: 2, c: 44269}, 44274, 44276, {f: 5, c: 44279}, {f: 2, c: 44286}, 7225 {f: 3, c: 44289}, 44293, {f: 5, c: 44295}, 44302, 44304, {f: 6, c: 44306}, 7226 {f: 3, c: 44313}, {f: 3, c: 44317}, {f: 8, c: 44321}, {f: 2, c: 44330}, 7227 {f: 6, c: 44334}, {f: 2, c: 44342}, {f: 3, c: 44345}, {f: 7, c: 44349}, 7228 44358, 44360, {f: 6, c: 44362}, {f: 3, c: 44369}, {f: 3, c: 44373}, 7229 {f: 8, c: 44377}, 44386, {f: 8, c: 44388}, {f: 2, c: 44398}, 7230 {f: 2, c: 44401}, {f: 4, c: 44407}, 44414, 44416, {f: 5, c: 44419}, 7231 {f: 2, c: 44426}, {f: 3, c: 44429}, {f: 11, c: 44433}, {f: 6, c: 44446}, 7232 {f: 18, c: 44453}, {f: 8, c: 44472}, {f: 2, c: 44482}, {f: 3, c: 44485}, 7233 {f: 7, c: 44489}, 44498, {f: 8, c: 44500}, {f: 3, c: 44509}, 7234 {f: 3, c: 44513}, {f: 19, c: 44517}, {f: 2, c: 44538}, {f: 2, c: 44541}, 7235 {f: 6, c: 44546}, 44554, 44556, {f: 6, c: 44558}, {f: 27, c: 44565}, 7236 {f: 2, c: 44594}, {f: 2, c: 44597}, 44601, {f: 5, c: 44603}, 44610, 44612, 7237 {f: 3, c: 44615}, 44619, 44623, {f: 3, c: 44625}, 44629, {f: 5, c: 44631}, 7238 44638, {f: 3, c: 44642}, {f: 2, c: 44646}, {f: 2, c: 44650}, 7239 {f: 3, c: 44653}, {f: 7, c: 44657}, 44666, {f: 6, c: 44670}, 7240 {f: 6, c: 44678}, {f: 47, c: 44685}, 44735, {f: 3, c: 44737}, 7241 {f: 7, c: 44741}, 44750, {f: 6, c: 44754}, {f: 2, c: 44762}, 7242 {f: 11, c: 44765}, {f: 2, c: 44777}, 44780, {f: 6, c: 44782}, 7243 {f: 3, c: 44789}, {f: 3, c: 44793}, {f: 10, c: 44797}, {f: 4, c: 44809}, 7244 {f: 2, c: 44814}, {f: 27, c: 44817}, {f: 2, c: 44846}, 44849, 44851, 7245 {f: 7, c: 44853}, 44862, 44864, {f: 4, c: 44868}, {f: 6, c: 44874}, 7246 {f: 11, c: 44881}, {f: 6, c: 44894}, {f: 19, c: 44902}, {f: 6, c: 44922}, 7247 {f: 3, c: 44929}, {f: 3, c: 44933}, {f: 7, c: 44937}, {f: 3, c: 44946}, 7248 {f: 6, c: 44950}, {f: 27, c: 44957}, {f: 2, c: 44986}, {f: 3, c: 44989}, 7249 {f: 6, c: 44993}, 45002, 45004, {f: 5, c: 45007}, {f: 7, c: 45013}, 7250 {f: 11, c: 45021}, {f: 6, c: 45034}, {f: 2, c: 45042}, {f: 3, c: 45045}, 7251 {f: 7, c: 45049}, {f: 2, c: 45058}, {f: 7, c: 45061}, {f: 3, c: 45069}, 7252 {f: 3, c: 45073}, {f: 7, c: 45077}, {f: 10, c: 45086}, {f: 27, c: 45097}, 7253 {f: 2, c: 45126}, 45129, 45131, 45133, {f: 4, c: 45135}, 45142, 45144, 7254 {f: 3, c: 45146}, {f: 30, c: 45150}, {f: 2, c: 45182}, {f: 3, c: 45185}, 7255 {f: 7, c: 45189}, 45198, 45200, {f: 6, c: 45202}, 45211, {f: 2, c: 45213}, 7256 {f: 5, c: 45219}, 45226, 45232, 45234, {f: 2, c: 45238}, {f: 3, c: 45241}, 7257 {f: 7, c: 45245}, 45254, {f: 6, c: 45258}, {f: 2, c: 45266}, 7258 {f: 3, c: 45269}, {f: 7, c: 45273}, {f: 4, c: 45281}, {f: 34, c: 45286}, 7259 45322, {f: 3, c: 45325}, 45329, {f: 4, c: 45332}, 45338, {f: 5, c: 45342}, 7260 {f: 2, c: 45350}, {f: 3, c: 45353}, {f: 7, c: 45357}, 45366, 7261 {f: 6, c: 45370}, {f: 2, c: 45378}, {f: 3, c: 45381}, {f: 7, c: 45385}, 7262 {f: 2, c: 45394}, {f: 2, c: 45398}, {f: 3, c: 45401}, {f: 3, c: 45405}, 7263 {f: 23, c: 45409}, {f: 2, c: 45434}, {f: 3, c: 45437}, 45441, 7264 {f: 5, c: 45443}, 45450, 45452, {f: 4, c: 45454}, {f: 3, c: 45461}, 7265 {f: 3, c: 45465}, {f: 11, c: 45469}, {f: 35, c: 45481}, {f: 3, c: 45517}, 7266 {f: 3, c: 45521}, {f: 7, c: 45525}, 45534, {f: 8, c: 45536}, 7267 {f: 2, c: 45546}, {f: 3, c: 45549}, {f: 8, c: 45553}, 45562, 45564, 7268 {f: 6, c: 45566}, {f: 2, c: 45574}, {f: 2, c: 45577}, {f: 7, c: 45581}, 7269 45590, 45592, {f: 6, c: 45594}, {f: 19, c: 45601}, {f: 7, c: 45621}, 7270 {f: 27, c: 45629}, {f: 3, c: 45657}, {f: 3, c: 45661}, {f: 7, c: 45665}, 7271 {f: 10, c: 45674}, {f: 6, c: 45686}, {f: 7, c: 45693}, {f: 3, c: 45702}, 7272 {f: 6, c: 45706}, {f: 2, c: 45714}, {f: 3, c: 45717}, {f: 5, c: 45723}, 7273 45730, 45732, {f: 3, c: 45735}, 45739, {f: 3, c: 45741}, {f: 3, c: 45745}, 7274 {f: 19, c: 45749}, {f: 2, c: 45770}, {f: 3, c: 45773}, 45777, 7275 {f: 5, c: 45779}, 45786, 45788, {f: 4, c: 45790}, 45795, 45799, 7276 {f: 2, c: 45801}, {f: 3, c: 45808}, 45814, {f: 3, c: 45820}, 7277 {f: 2, c: 45826}, {f: 3, c: 45829}, {f: 7, c: 45833}, 45842, 7278 {f: 6, c: 45846}, {f: 55, c: 45853}, 45911, {f: 2, c: 45913}, 45917, 7279 {f: 4, c: 45920}, 45926, 45928, 45930, {f: 2, c: 45932}, 45935, 7280 {f: 2, c: 45938}, {f: 3, c: 45941}, {f: 7, c: 45945}, 45954, 7281 {f: 6, c: 45958}, {f: 3, c: 45965}, {f: 3, c: 45969}, {f: 11, c: 45973}, 7282 {f: 6, c: 45986}, {f: 3, c: 45993}, {f: 23, c: 45997}, {f: 2, c: 46022}, 7283 {f: 2, c: 46025}, 46029, 46031, {f: 3, c: 46033}, 46038, 46040, 46042, 7284 46044, {f: 2, c: 46046}, {f: 3, c: 46049}, {f: 3, c: 46053}, 7285 {f: 19, c: 46057}, {f: 19, c: 46077}, {f: 7, c: 46097}, {f: 3, c: 46105}, 7286 {f: 3, c: 46109}, {f: 7, c: 46113}, 46122, {f: 8, c: 46124}, 7287 {f: 27, c: 46133}, {f: 2, c: 46162}, {f: 3, c: 46165}, {f: 7, c: 46169}, 7288 46178, 46180, {f: 6, c: 46182}, {f: 19, c: 46189}, {f: 7, c: 46209}, 7289 {f: 20, c: 46217}, {f: 6, c: 46238}, {f: 3, c: 46245}, {f: 3, c: 46249}, 7290 {f: 8, c: 46253}, 46262, 46264, {f: 6, c: 46266}, {f: 3, c: 46273}, 7291 {f: 3, c: 46277}, {f: 7, c: 46281}, {f: 4, c: 46289}, {f: 6, c: 46294}, 7292 {f: 2, c: 46302}, {f: 2, c: 46305}, 46309, {f: 5, c: 46311}, 46318, 46320, 7293 {f: 6, c: 46322}, {f: 27, c: 46329}, {f: 2, c: 46358}, {f: 2, c: 46361}, 7294 {f: 7, c: 46365}, 46374, {f: 5, c: 46379}, {f: 2, c: 46386}, 7295 {f: 3, c: 46389}, {f: 7, c: 46393}, 46402, {f: 5, c: 46406}, 7296 {f: 2, c: 46414}, {f: 3, c: 46417}, {f: 7, c: 46421}, 46430, 7297 {f: 62, c: 46434}, {f: 2, c: 46498}, {f: 3, c: 46501}, 46505, 7298 {f: 4, c: 46508}, 46514, {f: 5, c: 46518}, {f: 2, c: 46526}, 7299 {f: 3, c: 46529}, {f: 7, c: 46533}, 46542, {f: 6, c: 46546}, 7300 {f: 19, c: 46553}, {f: 35, c: 46573}, {f: 2, c: 46610}, {f: 3, c: 46613}, 7301 {f: 12, c: 46617}, {f: 6, c: 46630}, {f: 7, c: 46637}, {f: 19, c: 46645}, 7302 {f: 27, c: 46665}, {f: 3, c: 46693}, {f: 51, c: 46697}, {f: 2, c: 46750}, 7303 {f: 3, c: 46753}, {f: 6, c: 46757}, {f: 4, c: 46765}, {f: 34, c: 46770}, 7304 {f: 27, c: 46805}, {f: 3, c: 46833}, {f: 3, c: 46837}, {f: 7, c: 46841}, 7305 {f: 3, c: 46850}, {f: 34, c: 46854}, {f: 2, c: 46890}, {f: 2, c: 46893}, 7306 {f: 7, c: 46897}, 46906, {f: 8, c: 46908}, {f: 3, c: 46917}, 7307 {f: 3, c: 46921}, {f: 7, c: 46925}, {f: 10, c: 46934}, {f: 3, c: 46945}, 7308 {f: 3, c: 46949}, {f: 7, c: 46953}, 46962, 46964, {f: 6, c: 46966}, 7309 {f: 2, c: 46974}, {f: 3, c: 46977}, {f: 7, c: 46981}, 46990, 7310 {f: 3, c: 46995}, {f: 2, c: 47002}, {f: 3, c: 47005}, {f: 7, c: 47009}, 7311 47018, {f: 6, c: 47022}, {f: 2, c: 47030}, {f: 14, c: 47033}, 47048, 7312 {f: 34, c: 47050}, {f: 2, c: 47086}, {f: 3, c: 47089}, {f: 7, c: 47093}, 7313 47102, {f: 5, c: 47106}, {f: 2, c: 47114}, {f: 3, c: 47117}, 7314 {f: 7, c: 47121}, 47130, 47132, {f: 6, c: 47134}, {f: 2, c: 47142}, 7315 {f: 3, c: 47145}, {f: 7, c: 47149}, 47158, {f: 6, c: 47162}, 7316 {f: 3, c: 47169}, {f: 12, c: 47173}, 47186, {f: 8, c: 47188}, 7317 {f: 2, c: 47198}, {f: 3, c: 47201}, {f: 7, c: 47205}, 47214, 47216, 7318 {f: 6, c: 47218}, {f: 3, c: 47225}, {f: 16, c: 47229}, {f: 26, c: 47246}, 7319 {f: 7, c: 47273}, {f: 3, c: 47281}, {f: 3, c: 47285}, {f: 7, c: 47289}, 7320 47298, 47300, {f: 6, c: 47302}, {f: 3, c: 47309}, {f: 3, c: 47313}, 7321 {f: 8, c: 47317}, 47326, 47328, {f: 6, c: 47330}, {f: 2, c: 47338}, 7322 {f: 3, c: 47341}, {f: 7, c: 47345}, 47354, 47356, {f: 6, c: 47358}, 7323 {f: 19, c: 47365}, {f: 7, c: 47385}, {f: 27, c: 47393}, {f: 2, c: 47422}, 7324 {f: 3, c: 47425}, {f: 7, c: 47429}, {f: 2, c: 47437}, 47440, 7325 {f: 6, c: 47442}, {f: 2, c: 47450}, {f: 3, c: 47453}, {f: 7, c: 47457}, 7326 47466, 47468, {f: 6, c: 47470}, {f: 2, c: 47478}, {f: 3, c: 47481}, 7327 {f: 7, c: 47485}, 47494, 47496, {f: 2, c: 47499}, {f: 29, c: 47503}, 7328 {f: 2, c: 47534}, {f: 3, c: 47537}, {f: 7, c: 47541}, 47550, 47552, 7329 {f: 6, c: 47554}, {f: 2, c: 47562}, 47565, {f: 5, c: 47571}, 47578, 47580, 7330 {f: 2, c: 47583}, 47586, {f: 2, c: 47590}, {f: 3, c: 47593}, 7331 {f: 7, c: 47597}, 47606, {f: 5, c: 47611}, {f: 6, c: 47618}, 7332 {f: 12, c: 47625}, {f: 34, c: 47638}, {f: 2, c: 47674}, {f: 3, c: 47677}, 7333 47681, {f: 5, c: 47683}, 47690, 47692, {f: 4, c: 47695}, {f: 2, c: 47702}, 7334 {f: 3, c: 47705}, {f: 7, c: 47709}, 47718, {f: 6, c: 47722}, 7335 {f: 2, c: 47730}, {f: 3, c: 47733}, {f: 10, c: 47737}, 47750, 7336 {f: 4, c: 47752}, {f: 27, c: 47757}, 47786, {f: 3, c: 47789}, 47793, 7337 {f: 5, c: 47795}, 47802, 47804, {f: 6, c: 47806}, {f: 3, c: 47813}, 7338 {f: 15, c: 47817}, {f: 34, c: 47834}, {f: 3, c: 47869}, {f: 3, c: 47873}, 7339 {f: 8, c: 47877}, 47886, 47888, {f: 6, c: 47890}, {f: 3, c: 47897}, 7340 {f: 3, c: 47901}, {f: 8, c: 47905}, 47914, {f: 8, c: 47916}, 47927, 7341 {f: 2, c: 47929}, {f: 5, c: 47935}, 47942, 47944, {f: 3, c: 47946}, 47950, 7342 {f: 3, c: 47953}, {f: 3, c: 47957}, {f: 8, c: 47961}, 47970, 7343 {f: 8, c: 47972}, {f: 27, c: 47981}, {f: 3, c: 48009}, {f: 3, c: 48013}, 7344 {f: 19, c: 48017}, {f: 3, c: 48037}, {f: 3, c: 48041}, {f: 7, c: 48045}, 7345 {f: 2, c: 48053}, {f: 8, c: 48056}, {f: 3, c: 48065}, {f: 3, c: 48069}, 7346 {f: 7, c: 48073}, {f: 2, c: 48081}, {f: 36, c: 48084}, {f: 2, c: 48122}, 7347 {f: 2, c: 48125}, 48129, {f: 5, c: 48131}, 48138, 48142, 48144, 7348 {f: 2, c: 48146}, {f: 2, c: 48153}, {f: 4, c: 48160}, 48166, 48168, 7349 {f: 3, c: 48170}, {f: 2, c: 48174}, {f: 2, c: 48178}, {f: 3, c: 48181}, 7350 {f: 7, c: 48185}, 48194, {f: 3, c: 48198}, {f: 2, c: 48202}, 7351 {f: 2, c: 48206}, {f: 12, c: 48209}, {f: 38, c: 48222}, {f: 2, c: 48262}, 7352 {f: 2, c: 48265}, 48269, {f: 5, c: 48271}, 48278, 48280, {f: 5, c: 48283}, 7353 {f: 2, c: 48290}, {f: 2, c: 48293}, {f: 7, c: 48297}, 48306, 7354 {f: 6, c: 48310}, {f: 2, c: 48318}, {f: 3, c: 48321}, {f: 8, c: 48325}, 7355 48334, {f: 3, c: 48338}, {f: 2, c: 48342}, {f: 3, c: 48345}, 7356 {f: 23, c: 48349}, 48375, {f: 3, c: 48377}, {f: 7, c: 48381}, 48390, 48392, 7357 {f: 6, c: 48394}, {f: 3, c: 48401}, {f: 15, c: 48405}, {f: 7, c: 48421}, 7358 {f: 19, c: 48429}, {f: 7, c: 48449}, {f: 2, c: 48458}, {f: 3, c: 48461}, 7359 {f: 7, c: 48465}, {f: 10, c: 48474}, {f: 3, c: 48485}, {f: 23, c: 48489}, 7360 {f: 2, c: 48514}, {f: 2, c: 48517}, {f: 5, c: 48523}, 48530, 48532, 7361 {f: 3, c: 48534}, 48539, {f: 7, c: 48541}, {f: 11, c: 48549}, 7362 {f: 7, c: 48561}, {f: 27, c: 48569}, {f: 2, c: 48598}, {f: 3, c: 48601}, 7363 {f: 12, c: 48605}, {f: 6, c: 48618}, {f: 3, c: 48625}, {f: 3, c: 48629}, 7364 {f: 7, c: 48633}, {f: 2, c: 48641}, 48644, {f: 6, c: 48646}, 7365 {f: 2, c: 48654}, {f: 3, c: 48657}, {f: 7, c: 48661}, 48670, 7366 {f: 36, c: 48672}, {f: 2, c: 48710}, {f: 3, c: 48713}, 48717, 7367 {f: 5, c: 48719}, 48726, 48728, {f: 4, c: 48732}, {f: 2, c: 48738}, 7368 {f: 3, c: 48741}, 48745, {f: 5, c: 48747}, 48754, {f: 5, c: 48758}, 7369 {f: 2, c: 48766}, {f: 3, c: 48769}, {f: 7, c: 48773}, 48782, 7370 {f: 6, c: 48786}, {f: 14, c: 48794}, {f: 39, c: 48809}, {f: 2, c: 48850}, 7371 {f: 2, c: 48853}, {f: 7, c: 48857}, {f: 2, c: 48865}, {f: 6, c: 48870}, 7372 {f: 20, c: 48877}, {f: 6, c: 48898}, {f: 14, c: 48906}, 48922, 7373 {f: 34, c: 48926}, {f: 2, c: 48962}, {f: 3, c: 48965}, {f: 7, c: 48969}, 7374 {f: 3, c: 48978}, {f: 62, c: 48982}, {f: 27, c: 49045}, {f: 20, c: 49073}, 7375 {f: 6, c: 49094}, {f: 2, c: 49102}, {f: 3, c: 49105}, {f: 7, c: 49109}, 7376 {f: 2, c: 49117}, 49120, {f: 90, c: 49122}, {f: 20, c: 49213}, 7377 {f: 6, c: 49234}, {f: 3, c: 49241}, {f: 3, c: 49245}, {f: 7, c: 49249}, 7378 {f: 38, c: 49258}, {f: 2, c: 49298}, {f: 3, c: 49301}, {f: 7, c: 49305}, 7379 49314, 49316, {f: 6, c: 49318}, 49326, {f: 2, c: 49329}, {f: 5, c: 49335}, 7380 49342, {f: 3, c: 49346}, {f: 2, c: 49350}, {f: 2, c: 49354}, 7381 {f: 3, c: 49357}, {f: 7, c: 49361}, 49370, {f: 6, c: 49374}, 7382 {f: 2, c: 49382}, {f: 3, c: 49385}, {f: 7, c: 49389}, 49398, 49400, 7383 {f: 6, c: 49402}, {f: 3, c: 49409}, {f: 3, c: 49413}, {f: 7, c: 49417}, 7384 {f: 4, c: 49425}, {f: 6, c: 49430}, {f: 2, c: 49441}, 49445, 7385 {f: 4, c: 49448}, 49454, {f: 4, c: 49458}, 49463, {f: 2, c: 49466}, 7386 {f: 3, c: 49469}, {f: 7, c: 49473}, 49482, {f: 6, c: 49486}, 7387 {f: 2, c: 49494}, {f: 3, c: 49497}, {f: 7, c: 49501}, 49510, 7388 {f: 6, c: 49514}, {f: 3, c: 49521}, {f: 3, c: 49525}, {f: 12, c: 49529}, 7389 {f: 6, c: 49542}, 49551, {f: 3, c: 49553}, 49557, {f: 5, c: 49559}, 49566, 7390 49568, {f: 3, c: 49570}, {f: 2, c: 49574}, {f: 2, c: 49578}, 7391 {f: 3, c: 49581}, {f: 12, c: 49585}, {f: 6, c: 49598}, {f: 3, c: 49605}, 7392 {f: 3, c: 49609}, {f: 7, c: 49613}, {f: 2, c: 49621}, {f: 7, c: 49625}, 7393 {f: 3, c: 49633}, {f: 3, c: 49637}, {f: 7, c: 49641}, 49650, 7394 {f: 8, c: 49652}, {f: 2, c: 49662}, {f: 3, c: 49665}, {f: 7, c: 49669}, 7395 49678, 49680, {f: 6, c: 49682}, {f: 2, c: 49690}, {f: 2, c: 49693}, 7396 {f: 7, c: 49697}, 49706, 49708, 49710, 49712, 49715, {f: 19, c: 49717}, 7397 {f: 7, c: 49737}, {f: 2, c: 49746}, {f: 3, c: 49749}, {f: 7, c: 49753}, 7398 {f: 4, c: 49761}, {f: 6, c: 49766}, {f: 2, c: 49774}, {f: 3, c: 49777}, 7399 {f: 7, c: 49781}, 49790, 49792, {f: 6, c: 49794}, {f: 6, c: 49802}, 7400 {f: 7, c: 49809}, {f: 2, c: 49817}, 49820, {f: 6, c: 49822}, 7401 {f: 2, c: 49830}, {f: 3, c: 49833}, {f: 6, c: 49838}, 49846, 49848, 7402 {f: 34, c: 49850}, {f: 2, c: 49886}, {f: 2, c: 49889}, {f: 6, c: 49893}, 7403 49902, 49904, {f: 4, c: 49906}, 49911, 49914, {f: 3, c: 49917}, 7404 {f: 7, c: 49921}, {f: 2, c: 49930}, {f: 5, c: 49934}, {f: 2, c: 49942}, 7405 {f: 3, c: 49945}, {f: 7, c: 49949}, {f: 2, c: 49958}, {f: 27, c: 49962}, 7406 {f: 34, c: 49990}, {f: 2, c: 50026}, {f: 3, c: 50029}, 50033, 7407 {f: 5, c: 50035}, {f: 2, c: 50042}, {f: 6, c: 50046}, {f: 3, c: 50053}, 7408 {f: 3, c: 50057}, {f: 51, c: 50061}, {f: 23, c: 50113}, {f: 2, c: 50138}, 7409 {f: 2, c: 50141}, 50145, {f: 5, c: 50147}, {f: 3, c: 50154}, 7410 {f: 6, c: 50158}, {f: 2, c: 50166}, {f: 15, c: 50169}, {f: 7, c: 50185}, 7411 {f: 19, c: 50193}, {f: 7, c: 50213}, {f: 3, c: 50221}, {f: 3, c: 50225}, 7412 {f: 7, c: 50229}, {f: 10, c: 50238}, {f: 27, c: 50249}, {f: 2, c: 50278}, 7413 {f: 3, c: 50281}, {f: 7, c: 50285}, {f: 3, c: 50294}, {f: 6, c: 50298}, 7414 {f: 19, c: 50305}, {f: 7, c: 50325}, {f: 27, c: 50333}, {f: 3, c: 50361}, 7415 {f: 44, c: 50365}, {f: 6, c: 50410}, {f: 2, c: 50418}, {f: 3, c: 50421}, 7416 50425, {f: 4, c: 50427}, {f: 10, c: 50434}, {f: 3, c: 50445}, 7417 {f: 3, c: 50449}, {f: 7, c: 50453}, {f: 11, c: 50461}, {f: 2, c: 50474}, 7418 {f: 3, c: 50477}, {f: 7, c: 50481}, 50490, 50492, {f: 6, c: 50494}, 7419 {f: 2, c: 50502}, 50507, {f: 4, c: 50511}, 50518, {f: 3, c: 50522}, 50527, 7420 {f: 2, c: 50530}, {f: 3, c: 50533}, {f: 7, c: 50537}, 50546, 7421 {f: 6, c: 50550}, {f: 2, c: 50558}, {f: 3, c: 50561}, {f: 2, c: 50565}, 7422 {f: 4, c: 50568}, 50574, 50576, {f: 3, c: 50578}, 50582, {f: 3, c: 50585}, 7423 {f: 3, c: 50589}, {f: 8, c: 50593}, {f: 10, c: 50602}, {f: 2, c: 50614}, 7424 50618, {f: 5, c: 50623}, 50635, 50637, 50639, {f: 2, c: 50642}, 7425 {f: 3, c: 50645}, {f: 7, c: 50649}, 50658, 50660, {f: 6, c: 50662}, 50671, 7426 {f: 3, c: 50673}, 50677, {f: 4, c: 50680}, {f: 3, c: 50690}, 7427 {f: 3, c: 50697}, {f: 3, c: 50701}, {f: 7, c: 50705}, 50714, 7428 {f: 7, c: 50717}, {f: 2, c: 50726}, {f: 3, c: 50729}, 50735, 7429 {f: 2, c: 50737}, 50742, 50744, 50746, {f: 4, c: 50748}, {f: 2, c: 50754}, 7430 {f: 3, c: 50757}, {f: 7, c: 50761}, 50770, {f: 6, c: 50774}, 7431 {f: 2, c: 50782}, {f: 11, c: 50785}, {f: 2, c: 50797}, 50800, 7432 {f: 6, c: 50802}, {f: 2, c: 50810}, {f: 3, c: 50813}, {f: 7, c: 50817}, 7433 50826, 50828, {f: 6, c: 50830}, {f: 2, c: 50838}, {f: 3, c: 50841}, 7434 {f: 7, c: 50845}, 50854, 50856, {f: 6, c: 50858}, {f: 2, c: 50866}, 7435 {f: 3, c: 50869}, {f: 5, c: 50875}, 50882, 50884, {f: 6, c: 50886}, 7436 {f: 2, c: 50894}, {f: 3, c: 50897}, {f: 7, c: 50901}, {f: 2, c: 50910}, 7437 {f: 6, c: 50914}, {f: 2, c: 50922}, {f: 3, c: 50925}, {f: 7, c: 50929}, 7438 {f: 3, c: 50938}, {f: 6, c: 50942}, {f: 2, c: 50950}, {f: 3, c: 50953}, 7439 {f: 7, c: 50957}, 50966, 50968, {f: 6, c: 50970}, {f: 2, c: 50978}, 7440 {f: 3, c: 50981}, {f: 7, c: 50985}, 50994, 50996, 50998, {f: 4, c: 51000}, 7441 {f: 2, c: 51006}, {f: 3, c: 51009}, {f: 5, c: 51013}, 51019, 51022, 51024, 7442 {f: 3, c: 51033}, {f: 3, c: 51037}, {f: 7, c: 51041}, {f: 2, c: 51049}, 7443 {f: 8, c: 51052}, {f: 2, c: 51062}, {f: 3, c: 51065}, {f: 4, c: 51071}, 7444 51078, {f: 3, c: 51083}, 51087, {f: 2, c: 51090}, 51093, 51097, 7445 {f: 5, c: 51099}, 51106, {f: 5, c: 51111}, {f: 2, c: 51118}, 7446 {f: 3, c: 51121}, {f: 7, c: 51125}, 51134, {f: 6, c: 51138}, 7447 {f: 2, c: 51146}, 51149, 51151, {f: 7, c: 51153}, {f: 4, c: 51161}, 7448 {f: 6, c: 51166}, {f: 3, c: 51173}, {f: 3, c: 51177}, {f: 19, c: 51181}, 7449 {f: 2, c: 51202}, {f: 3, c: 51205}, 51209, {f: 5, c: 51211}, 51218, 51220, 7450 {f: 5, c: 51223}, {f: 2, c: 51230}, {f: 3, c: 51233}, {f: 7, c: 51237}, 7451 51246, 51248, {f: 6, c: 51250}, {f: 3, c: 51257}, {f: 3, c: 51261}, 7452 {f: 7, c: 51265}, {f: 2, c: 51274}, {f: 6, c: 51278}, {f: 27, c: 51285}, 7453 {f: 2, c: 51314}, {f: 3, c: 51317}, 51321, {f: 5, c: 51323}, 51330, 51332, 7454 {f: 3, c: 51336}, {f: 6, c: 51342}, {f: 8, c: 51349}, 51358, 51360, 7455 {f: 6, c: 51362}, {f: 19, c: 51369}, {f: 6, c: 51390}, {f: 3, c: 51397}, 7456 {f: 3, c: 51401}, {f: 7, c: 51405}, 51414, 51416, {f: 6, c: 51418}, 7457 {f: 2, c: 51426}, {f: 16, c: 51429}, {f: 6, c: 51446}, {f: 2, c: 51454}, 7458 {f: 3, c: 51457}, {f: 5, c: 51463}, 51470, 51472, {f: 6, c: 51474}, 7459 {f: 19, c: 51481}, {f: 7, c: 51501}, {f: 27, c: 51509}, {f: 2, c: 51538}, 7460 {f: 3, c: 51541}, {f: 7, c: 51545}, 51554, {f: 8, c: 51556}, 7461 {f: 3, c: 51565}, {f: 3, c: 51569}, {f: 7, c: 51573}, {f: 11, c: 51581}, 7462 {f: 2, c: 51594}, {f: 3, c: 51597}, {f: 7, c: 51601}, 51610, 51612, 7463 {f: 34, c: 51614}, {f: 2, c: 51650}, {f: 2, c: 51653}, 51657, 7464 {f: 5, c: 51659}, 51666, 51668, {f: 2, c: 51671}, 51675, {f: 2, c: 51678}, 7465 51681, 51683, {f: 2, c: 51685}, {f: 4, c: 51688}, 51694, {f: 6, c: 51698}, 7466 {f: 2, c: 51706}, {f: 3, c: 51709}, {f: 7, c: 51713}, 51722, 7467 {f: 6, c: 51726}, {f: 3, c: 51733}, {f: 16, c: 51737}, {f: 34, c: 51754}, 7468 {f: 2, c: 51790}, {f: 3, c: 51793}, {f: 7, c: 51797}, 51806, 7469 {f: 6, c: 51810}, {f: 20, c: 51817}, {f: 6, c: 51838}, {f: 19, c: 51845}, 7470 {f: 35, c: 51865}, {f: 2, c: 51902}, {f: 3, c: 51905}, {f: 7, c: 51909}, 7471 51918, 51920, 51922, {f: 4, c: 51924}, {f: 6, c: 51930}, {f: 11, c: 51937}, 7472 {f: 7, c: 51949}, {f: 19, c: 51957}, {f: 7, c: 51977}, {f: 3, c: 51985}, 7473 {f: 3, c: 51989}, {f: 7, c: 51993}, {f: 31, c: 52002}, {f: 6, c: 52034}, 7474 {f: 2, c: 52042}, {f: 3, c: 52045}, {f: 7, c: 52049}, {f: 3, c: 52058}, 7475 {f: 6, c: 52062}, {f: 19, c: 52069}, {f: 34, c: 52090}, {f: 27, c: 52125}, 7476 {f: 27, c: 52153}, {f: 15, c: 52181}, {f: 2, c: 52197}, 52200, 7477 {f: 34, c: 52202}, {f: 2, c: 52238}, {f: 3, c: 52241}, {f: 7, c: 52245}, 7478 {f: 3, c: 52254}, {f: 4, c: 52259}, {f: 2, c: 52266}, 52269, 52271, 7479 {f: 7, c: 52273}, 52282, {f: 5, c: 52287}, {f: 2, c: 52294}, 7480 {f: 3, c: 52297}, {f: 7, c: 52301}, 52310, {f: 6, c: 52314}, 7481 {f: 3, c: 52321}, 52325, 52327, {f: 7, c: 52329}, {f: 4, c: 52337}, 7482 {f: 34, c: 52342}, {f: 2, c: 52378}, {f: 3, c: 52381}, {f: 7, c: 52385}, 7483 52394, {f: 6, c: 52398}, {f: 2, c: 52406}, {f: 3, c: 52409}, 7484 {f: 7, c: 52413}, 52422, 52424, {f: 6, c: 52426}, {f: 3, c: 52433}, 7485 {f: 15, c: 52437}, {f: 7, c: 52453}, {f: 3, c: 52461}, {f: 16, c: 52465}, 7486 {f: 6, c: 52482}, {f: 2, c: 52490}, {f: 3, c: 52493}, {f: 7, c: 52497}, 7487 52506, 52508, {f: 6, c: 52510}, {f: 3, c: 52517}, {f: 3, c: 52521}, 7488 {f: 12, c: 52525}, {f: 34, c: 52538}, {f: 3, c: 52573}, {f: 3, c: 52577}, 7489 {f: 7, c: 52581}, 52590, 52592, {f: 6, c: 52594}, {f: 15, c: 52601}, 7490 {f: 11, c: 52617}, {f: 2, c: 52630}, {f: 3, c: 52633}, {f: 7, c: 52637}, 7491 52646, 52648, {f: 6, c: 52650}, {f: 19, c: 52657}, {f: 7, c: 52677}, 7492 {f: 3, c: 52685}, {f: 23, c: 52689}, {f: 3, c: 52713}, {f: 3, c: 52717}, 7493 {f: 7, c: 52721}, 52730, 52732, {f: 6, c: 52734}, {f: 3, c: 52741}, 7494 {f: 3, c: 52745}, {f: 7, c: 52749}, {f: 4, c: 52757}, {f: 6, c: 52762}, 7495 {f: 2, c: 52770}, {f: 3, c: 52773}, {f: 7, c: 52777}, 52786, 52788, 7496 {f: 34, c: 52790}, {f: 2, c: 52826}, {f: 2, c: 52829}, {f: 6, c: 52834}, 7497 52842, 52844, {f: 6, c: 52846}, {f: 2, c: 52854}, {f: 3, c: 52857}, 7498 {f: 7, c: 52861}, 52870, 52872, {f: 6, c: 52874}, {f: 2, c: 52882}, 7499 {f: 3, c: 52885}, {f: 7, c: 52889}, 52898, {f: 6, c: 52902}, 7500 {f: 19, c: 52910}, {f: 34, c: 52930}, {f: 2, c: 52966}, {f: 2, c: 52969}, 7501 {f: 7, c: 52973}, 52982, {f: 6, c: 52986}, {f: 2, c: 52994}, 7502 {f: 3, c: 52997}, {f: 7, c: 53001}, 53010, 53012, {f: 6, c: 53014}, 7503 {f: 3, c: 53021}, {f: 3, c: 53025}, {f: 7, c: 53029}, 53038, 7504 {f: 6, c: 53042}, {f: 27, c: 53049}, {f: 2, c: 53078}, {f: 3, c: 53081}, 7505 {f: 7, c: 53085}, 53094, 53096, {f: 6, c: 53098}, {f: 2, c: 53106}, 7506 {f: 3, c: 53109}, {f: 7, c: 53113}, {f: 4, c: 53121}, {f: 6, c: 53126}, 7507 {f: 20, c: 53133}, {f: 6, c: 53154}, {f: 7, c: 53161}, {f: 19, c: 53169}, 7508 {f: 27, c: 53189}, {f: 2, c: 53218}, {f: 3, c: 53221}, {f: 7, c: 53225}, 7509 53234, 53236, {f: 6, c: 53238}, {f: 3, c: 53245}, {f: 3, c: 53249}, 7510 {f: 12, c: 53253}, {f: 6, c: 53266}, {f: 20, c: 53273}, {f: 6, c: 53294}, 7511 {f: 2, c: 53302}, {f: 3, c: 53305}, {f: 7, c: 53309}, 53318, 53320, 7512 {f: 6, c: 53322}, {f: 3, c: 53329}, {f: 3, c: 53333}, {f: 7, c: 53337}, 7513 {f: 11, c: 53345}, {f: 2, c: 53358}, {f: 3, c: 53361}, {f: 7, c: 53365}, 7514 {f: 3, c: 53374}, {f: 34, c: 53378}, {f: 2, c: 53414}, {f: 3, c: 53417}, 7515 {f: 7, c: 53421}, 53430, 53432, {f: 6, c: 53434}, {f: 2, c: 53442}, 7516 {f: 3, c: 53445}, {f: 6, c: 53450}, 53458, {f: 6, c: 53462}, 7517 {f: 2, c: 53470}, {f: 3, c: 53473}, {f: 7, c: 53477}, 53486, 7518 {f: 6, c: 53490}, {f: 20, c: 53497}, {f: 34, c: 53518}, {f: 2, c: 53554}, 7519 {f: 3, c: 53557}, 53561, {f: 5, c: 53563}, 53570, {f: 6, c: 53574}, 7520 {f: 2, c: 53582}, {f: 3, c: 53585}, {f: 7, c: 53589}, 53598, 53600, 7521 {f: 6, c: 53602}, {f: 3, c: 53609}, {f: 15, c: 53613}, {f: 7, c: 53629}, 7522 {f: 3, c: 53637}, {f: 23, c: 53641}, {f: 2, c: 53666}, {f: 3, c: 53669}, 7523 {f: 7, c: 53673}, 53682, 53684, {f: 4, c: 53686}, 53691, {f: 3, c: 53693}, 7524 {f: 23, c: 53697}, {f: 27, c: 53721}, {f: 3, c: 53749}, {f: 14, c: 53753}, 7525 53768, {f: 6, c: 53770}, {f: 27, c: 53777}, {f: 2, c: 53806}, 7526 {f: 3, c: 53809}, {f: 7, c: 53813}, 53822, 53824, {f: 6, c: 53826}, 7527 {f: 19, c: 53833}, {f: 7, c: 53853}, {f: 27, c: 53861}, {f: 2, c: 53890}, 7528 {f: 3, c: 53893}, {f: 7, c: 53897}, {f: 3, c: 53906}, {f: 6, c: 53910}, 7529 {f: 3, c: 53917}, {f: 3, c: 53921}, {f: 7, c: 53925}, {f: 4, c: 53933}, 7530 {f: 6, c: 53938}, {f: 2, c: 53946}, {f: 2, c: 53949}, 53953, 7531 {f: 5, c: 53955}, 53962, {f: 8, c: 53964}, {f: 3, c: 53973}, 7532 {f: 3, c: 53977}, {f: 7, c: 53981}, {f: 10, c: 53990}, {f: 2, c: 54002}, 7533 {f: 3, c: 54005}, {f: 7, c: 54009}, 54018, 54020, {f: 6, c: 54022}, 54031, 7534 {f: 3, c: 54033}, 54037, {f: 5, c: 54039}, 54046, {f: 3, c: 54050}, 7535 {f: 2, c: 54054}, {f: 2, c: 54058}, {f: 3, c: 54061}, {f: 7, c: 54065}, 7536 54074, {f: 6, c: 54078}, {f: 54, c: 54086}, {f: 2, c: 54142}, 7537 {f: 3, c: 54145}, {f: 7, c: 54149}, 54158, {f: 6, c: 54162}, 7538 {f: 2, c: 54170}, {f: 3, c: 54173}, {f: 7, c: 54177}, 54186, 54188, 7539 {f: 6, c: 54190}, {f: 3, c: 54197}, {f: 3, c: 54201}, {f: 7, c: 54205}, 7540 {f: 2, c: 54214}, {f: 6, c: 54218}, {f: 7, c: 54225}, {f: 8, c: 54233}, 7541 54242, {f: 8, c: 54244}, {f: 2, c: 54254}, {f: 3, c: 54257}, 7542 {f: 7, c: 54261}, 54270, 54272, {f: 6, c: 54274}, {f: 20, c: 54281}, 7543 {f: 34, c: 54302}, {f: 3, c: 54337}, {f: 23, c: 54341}, {f: 3, c: 54365}, 7544 {f: 3, c: 54369}, {f: 8, c: 54373}, 54382, {f: 8, c: 54384}, 7545 {f: 2, c: 54394}, {f: 2, c: 54397}, 54401, {f: 5, c: 54403}, 54410, 54412, 7546 {f: 6, c: 54414}, {f: 20, c: 54421}, {f: 34, c: 54442}, {f: 3, c: 54477}, 7547 {f: 3, c: 54481}, {f: 7, c: 54485}, {f: 2, c: 54493}, {f: 8, c: 54496}, 7548 {f: 3, c: 54505}, {f: 3, c: 54509}, {f: 7, c: 54513}, {f: 2, c: 54521}, 7549 54524, {f: 6, c: 54526}, {f: 3, c: 54533}, {f: 3, c: 54537}, 7550 {f: 7, c: 54541}, 54550, {f: 36, c: 54552}, {f: 2, c: 54590}, 7551 {f: 3, c: 54593}, {f: 7, c: 54597}, 54606, 54608, {f: 6, c: 54610}, 7552 {f: 2, c: 54618}, {f: 3, c: 54621}, {f: 4, c: 54625}, {f: 2, c: 54630}, 7553 54634, 54636, {f: 6, c: 54638}, {f: 2, c: 54646}, {f: 3, c: 54649}, 7554 {f: 7, c: 54653}, 54662, {f: 6, c: 54666}, {f: 20, c: 54673}, 7555 {f: 34, c: 54694}, {f: 2, c: 54730}, {f: 3, c: 54733}, 54737, 7556 {f: 5, c: 54739}, 54746, 54748, {f: 6, c: 54750}, {f: 2, c: 54758}, 7557 {f: 3, c: 54761}, {f: 7, c: 54765}, 54774, 54776, {f: 6, c: 54778}, 7558 {f: 2, c: 54786}, {f: 3, c: 54789}, {f: 7, c: 54793}, 54802, 7559 {f: 6, c: 54806}, {f: 3, c: 54813}, {f: 3, c: 54817}, {f: 8, c: 54821}, 7560 {f: 10, c: 54830}, {f: 2, c: 54842}, {f: 3, c: 54845}, {f: 4, c: 54849}, 7561 {f: 2, c: 54854}, 54858, 54860, {f: 3, c: 54862}, {f: 2, c: 54866}, 7562 {f: 2, c: 54870}, {f: 3, c: 54873}, {f: 10, c: 54877}, 54888, 7563 {f: 6, c: 54890}, {f: 2, c: 54898}, {f: 14, c: 54901}, 54916, 7564 {f: 6, c: 54918}, {f: 2, c: 54926}, {f: 3, c: 54929}, {f: 8, c: 54933}, 7565 54942, 54944, {f: 6, c: 54946}, {f: 3, c: 54953}, {f: 3, c: 54957}, 7566 {f: 8, c: 54961}, 54970, {f: 8, c: 54972}, {f: 2, c: 54982}, 7567 {f: 3, c: 54985}, {f: 4, c: 54989}, {f: 2, c: 54994}, {f: 2, c: 54997}, 7568 55000, {f: 6, c: 55002}, {f: 3, c: 55009}, {f: 3, c: 55013}, 7569 {f: 7, c: 55017}, {f: 4, c: 55025}, {f: 6, c: 55030}, {f: 2, c: 55038}, 7570 {f: 3, c: 55041}, {f: 12, c: 55045}, {f: 6, c: 55058}, {f: 2, c: 55066}, 7571 {f: 3, c: 55069}, {f: 7, c: 55073}, 55082, 55084, {f: 6, c: 55086}, 7572 {f: 2, c: 55094}, {f: 3, c: 55097}, {f: 7, c: 55101}, {f: 2, c: 55109}, 7573 55112, {f: 6, c: 55114}, {f: 2, c: 55122}, 55125, {f: 6, c: 55130}, 55138, 7574 55140, {f: 3, c: 55142}, {f: 2, c: 55146}, {f: 3, c: 55149}, 7575 {f: 3, c: 55153}, {f: 7, c: 55157}, {f: 3, c: 55166}, {f: 6, c: 55170}, 7576 {f: 2, c: 55178}, {f: 3, c: 55181}, {f: 7, c: 55185}, 55194, 55196, 7577 {f: 6, c: 55198}], 7578 'Adobe-CNS1': [{f: 95, c: 32}, {s: 3}, 12288, 65292, {f: 2, c: 12289}, 65294, 7579 8226, 65307, 65306, 65311, 65281, 65072, 8230, 8229, 65104, 65380, 65106, 7580 183, {f: 4, c: 65108}, 65372, 8211, 65073, 8212, {s: 4}, {f: 2, c: 65288}, 7581 {f: 2, c: 65077}, 65371, 65373, {f: 2, c: 65079}, {f: 2, c: 12308}, 7582 {f: 2, c: 65081}, {f: 2, c: 12304}, {f: 2, c: 65083}, {f: 2, c: 12298}, 7583 {f: 2, c: 65085}, {f: 2, c: 12296}, {f: 2, c: 65087}, {f: 2, c: 12300}, 7584 {f: 2, c: 65089}, {f: 2, c: 12302}, {f: 2, c: 65091}, {f: 6, c: 65113}, 7585 {f: 2, c: 8216}, {f: 2, c: 8220}, {f: 2, c: 12317}, 8245, 8242, 65283, 7586 65286, 65290, 8251, 167, 12291, 9675, 9679, 9651, 9650, 9678, 9734, 9733, 7587 9671, 9670, 9633, 9632, 9661, 9660, 12963, 8453, 8254, 0, 65343, 0, 7588 {f: 2, c: 65097}, {f: 2, c: 65101}, {f: 2, c: 65099}, {f: 3, c: 65119}, 7589 65291, 65293, 215, 247, 177, 8730, 65308, 65310, 65309, {f: 2, c: 8806}, 7590 8800, 8734, 8786, 8801, {f: 5, c: 65122}, 8764, {f: 2, c: 8745}, 8869, 7591 8736, 8735, 8895, 13266, 13265, 8747, 8750, 8757, 8756, 9792, 9794, 9793, 7592 9737, 8593, 8595, 8594, 8592, {f: 2, c: 8598}, 8601, 8600, 8741, 8739, 0, 7593 0, 65295, 65340, 65284, 165, 12306, {f: 2, c: 162}, 65285, 65312, 8451, 7594 8457, {f: 3, c: 65129}, 13269, {f: 3, c: 13212}, 13262, 13217, 7595 {f: 2, c: 13198}, 13252, 176, [20825, 58834], [20827, 58835], 7596 [20830, 58837], [20829, 58836], 20833, 20835, 21991, [29929, 58044], 7597 [31950, 58191], {f: 8, c: 9601}, 9615, 9614, 9613, 9612, 9611, 9610, 9609, 7598 9532, 9524, 9516, 9508, 9500, 9620, 9472, 9474, 9621, 9484, 9488, 9492, 7599 9496, {f: 2, c: 9581}, 9584, 9583, 9552, 9566, 9578, 9569, {f: 2, c: 9698}, 7600 9701, 9700, {f: 3, c: 9585}, {f: 10, c: 65296}, {f: 10, c: 8544}, 7601 {f: 9, c: 12321}, 0, [21316, 57443], 0, {f: 26, c: 65313}, 7602 {f: 26, c: 65345}, {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945}, 7603 {f: 7, c: 963}, {f: 37, c: 12549}, 729, 714, 711, 715, [9312, 63153], 7604 [9313, 63154], [9314, 63155], [9315, 63156], [9316, 63157], [9317, 63158], 7605 [9318, 63159], [9319, 63160], [9320, 63161], [9321, 63162], [9332, 63163], 7606 [9333, 63164], [9334, 63165], [9335, 63166], [9336, 63167], [9337, 63168], 7607 [9338, 63169], [9339, 63170], [9340, 63171], [9341, 63172], [8560, 63173], 7608 [8561, 63174], [8562, 63175], [8563, 63176], [8564, 63177], [8565, 63178], 7609 [8566, 63179], [8567, 63180], [8568, 63181], [8569, 63182], [12033, 20008], 7610 [12034, 20022, 63183], [12035, 20031, 63184], [12037, 20101, 63185], 7611 [12039, 20128, 63186], [12044, 20866, 63187], [12045, 20886, 63188], 7612 [12046, 20907, 63189], [12051, 21241, 63190], [12054, 21304, 63191], 7613 [12057, 21353, 63192], [12059, 21430, 63193], 7614 [12065, 12066, 22786, 22794, 63194], [12071, 23424, 63195], 7615 [12078, 24027, 63196], [12083, 24186, 63197], [12084, 24191, 63198], 7616 [12085, 24308], [12089, 24400, 63200], [12090, 24417, 63201], 7617 [12097, 25908, 63202], [12102, 26080], [12135, 30098, 63204], 7618 [12136, 30326], [12193, 36789, 63206], [12202, 38582], {f: 32, c: 9216}, 7619 9249, [12032, 19968], [12036, 20057], 19969, 19971, 20035, 20061, 20102, 7620 [12038, 20108], [12040, 20154], [12041, 20799], [12042, 20837], 7621 [12043, 20843], [12047, 20960], [12049, 20992], 20993, [12050, 21147], 7622 [12052, 21269], [12055, 21313], [12056, 21340], [12060, 21448], 19977, 7623 19979, 19976, 19978, 20011, 20024, 20961, 20037, 20040, 20063, 20062, 7624 20110, 20129, [20800, 64012], 20995, 21242, 21315, 21449, [12061, 21475], 7625 [12063, 22303], [12064, 22763], [12067, 22805], [12068, 22823], 7626 [12069, 22899], [12070, 23376], 23377, 23379, [12072, 23544], 7627 [12073, 23567], [12074, 23586], [12075, 23608], [12077, 23665], 24029, 7628 [12079, 24037], [12080, 24049], {f: 2, c: 24050}, [12081, 24062], 7629 [12082, 24178], [12086, 24318], [12087, 24331], [12088, 24339], 25165, 7630 19985, 19984, 19981, 20013, 20016, 20025, 20043, 23609, 20104, 20113, 7631 20117, 20114, 20116, 20130, 20161, 20160, 20163, {f: 2, c: 20166}, 20173, 7632 {f: 2, c: 20170}, 20164, 20803, 20801, 20839, {f: 2, c: 20845}, 20844, 7633 20887, 20982, {f: 3, c: 20998}, 21243, {f: 2, c: 21246}, 21270, 21305, 7634 21320, 21319, 21317, 21342, 21380, 21451, 21450, 21453, 22764, 22825, 7635 22827, 22826, 22829, 23380, 23569, 23588, 23610, 23663, 24052, 24187, 7636 24319, {f: 2, c: 24340}, [12092, 24515], [12093, 25096], [12094, 25142], 7637 [12095, 25163], 25166, [12096, 25903], [12098, 25991], [12099, 26007], 7638 [12100, 26020], [12101, 26041], [12103, 26085], [12104, 26352], 7639 [12105, 26376], [12106, 26408], [12107, 27424], [12108, 27490], 7640 [12109, 27513], [12111, 27595], [12112, 27604], [12113, 27611], 7641 [12114, 27663], [12116, 27700], [12117, 28779], [12118, 29226], 7642 [12119, 29238], [12120, 29243], [12122, 29255], [12123, 29273], 7643 [12124, 29275], [12125, 29356], 29579, 19993, 19990, 19989, 19988, 19992, 7644 20027, 20045, 20047, 20046, 20197, 20184, {f: 4, c: 20180}, 7645 {f: 2, c: 20195}, 20185, 20190, 20805, 20804, {f: 2, c: 20873}, 20908, 7646 {f: 2, c: 20985}, 20984, 21002, 21152, 21151, [21253, 57435], 21254, 21271, 7647 21277, 20191, 21322, 21321, 21345, 21344, 21359, 21358, 21435, 21487, 7648 21476, 21491, 21484, 21486, 21481, 21480, 21500, 21496, 21493, 21483, 7649 21478, 21482, 21490, 21489, 21488, 21477, 21485, 21499, 22235, 22234, 7650 22806, 22830, 22833, 22900, 22902, 23381, 23427, 23612, 24040, 24039, 7651 24038, {f: 2, c: 24066}, 24179, 24188, 24321, 24344, 24343, 24517, 25098, 7652 {f: 2, c: 25171}, 25170, 25169, 26021, 26086, 26414, 26412, 7653 {f: 2, c: 26410}, 26413, 27491, 27597, 27665, 27664, 27704, 27713, 27712, 7654 27710, 29359, [12126, 29572], [12127, 29577], [12128, 29916], 7655 [12129, 29926], [12130, 29976], [12131, 29983], [12132, 29992], 29993, 7656 [12133, 30000], {f: 3, c: 30001}, [12134, 30091], [12137, 30333], 7657 [12138, 30382], [12139, 30399], [12140, 30446], [12141, 30683], 7658 [12142, 30690], [12143, 30707], [12144, 31034], [12146, 31166], 7659 [12147, 31348], [12148, 31435], {f: 2, c: 19998}, {f: 2, c: 20050}, 20073, 7660 20121, 20132, 20134, 20133, 20223, 20233, 20249, 20234, 20245, 20237, 7661 {f: 2, c: 20240}, 20239, 20210, 20214, 20219, 20208, 20211, 20221, 20225, 7662 20235, 20809, 20807, 20806, 20808, 20840, 20849, 20877, 20912, 21015, 7663 {f: 2, c: 21009}, 21006, 21014, 21155, 21256, 21281, 21280, 7664 {f: 2, c: 21360}, 21513, 21519, 21516, 21514, 21520, 21505, 21515, 21508, 7665 21521, 21517, 21512, 21507, 21518, 21510, 21522, 22240, 22238, 22237, 7666 22323, 22320, 22312, 22317, 22316, 22319, 22313, {f: 2, c: 22809}, 7667 {f: 2, c: 22839}, 22916, 22904, 22915, 22909, 22905, 22914, 22913, 7668 {f: 2, c: 23383}, {f: 2, c: 23431}, 23429, 23433, 23546, 23574, 23673, 7669 24030, 24070, 24182, 24180, 24335, 24347, 24537, 24534, 25102, 7670 {f: 2, c: 25100}, 25104, 25187, 25179, 25176, 25910, 26089, 26088, 7671 {f: 2, c: 26092}, {f: 2, c: 26354}, 26377, 26429, 26420, 26417, 26421, 7672 27425, 27492, 27515, 27670, 27741, 27735, 27737, {f: 2, c: 27743}, 27728, 7673 27733, 27745, 27739, {f: 2, c: 27725}, 28784, 29279, 29277, 30334, 7674 [12149, 31481], [12150, 31859], [12151, 31992], [12152, 32566], 7675 [12154, 32650], [12155, 32701], [12156, 32769], 32771, [12157, 32780], 7676 [12158, 32786], [12159, 32819], [12160, 32895], [12161, 32905], 7677 {f: 2, c: 32907}, [12162, 33251], [12163, 33258], [12164, 33267], 7678 [12165, 33276], [12166, 33292], [12167, 33307], [12168, 33311], 7679 [12169, 33390], [12170, 33394], 33406, [12173, 34411], [12174, 34880], 7680 [12175, 34892], [12176, 34915], 35199, 38433, 20018, 20136, 20301, 20303, 7681 20295, 20311, 20318, 20276, 20315, 20309, 20272, {f: 2, c: 20304}, 20285, 7682 20282, 20280, 20291, 20308, 20284, 20294, 20323, 20316, 20320, 20271, 7683 20302, 20278, 20313, 20317, 20296, 20314, 20812, 20811, 20813, 20853, 7684 {f: 2, c: 20918}, 21029, 21028, {f: 2, c: 21033}, 21032, 21163, 7685 {f: 2, c: 21161}, 21164, 21283, 21363, 21365, 21533, 21549, 21534, 21566, 7686 21542, 21582, 21543, 21574, 21571, 21555, 21576, 21570, 21531, 21545, 7687 21578, 21561, 21563, 21560, 21550, {f: 2, c: 21557}, 21536, 21564, 21568, 7688 21553, 21547, 21535, 21548, 22250, 22256, 22244, 22251, 22346, 22353, 7689 22336, 22349, 22343, 22350, 22334, 22352, 22351, 22331, 22767, 22846, 7690 22941, 22930, 22952, 22942, 22947, 22937, 22934, 22925, 22948, 22931, 7691 22922, 22949, 23389, 23388, {f: 2, c: 23386}, 23436, 23435, 23439, 23596, 7692 {f: 2, c: 23616}, 23615, 23614, {f: 2, c: 23696}, 23700, 23692, 24043, 7693 24076, 24207, 24199, 24202, 24311, 24324, 24351, 24420, 24418, 24439, 7694 24441, 24536, 24524, 24535, 24525, 24561, 24555, 24568, 24554, 25106, 7695 25105, 25220, 25239, 25238, 25216, 25206, 25225, 25197, 25226, 25212, 7696 25214, 25209, 25203, 25234, 25199, 25240, 25198, 25237, 25235, 25233, 7697 25222, 25913, 25915, 25912, 26097, 26356, 26463, {f: 4, c: 26446}, 26460, 7698 26454, [26462, 57801], 26441, 26438, 26464, 26451, 26455, 27493, 27599, 7699 27714, 27742, 27801, 27777, {f: 2, c: 27784}, 27781, 27803, 27754, 27770, 7700 27792, 27760, 27788, 27752, 27798, 27794, 27773, 27779, 27762, 27774, 7701 27764, 27782, 27766, 27789, 27796, 27800, 27778, 28790, {f: 2, c: 28796}, 7702 28792, 29282, 29281, 29280, 29380, 29378, 29590, 29996, 29995, 7703 {f: 2, c: 30007}, 30338, 30447, 30691, 31169, 31168, 31167, 31350, 31995, 7704 32597, 32918, 32915, 32925, 32920, 32923, 32922, 32946, 33391, 33426, 7705 33419, 33421, [12178, 35211], [12179, 35282], [12180, 35328], 7706 [12181, 35895], [12182, 35910], [12183, 35925], [12185, 35997], 7707 [12186, 36196], [12187, 36208], [12188, 36275], [12189, 36523], 7708 [12190, 36554], [12191, 36763], [12192, 36784], 36802, 36806, 36805, 36804, 7709 24033, [12194, 37009], 37026, 37034, 37030, 37027, [12195, 37193], 7710 [12196, 37318], [12197, 37324], 38450, 38446, 38449, 38442, 38444, 20006, 7711 20054, 20083, 20107, 20123, 20126, {f: 2, c: 20139}, 20335, 20381, 20365, 7712 20339, 20351, 20332, 20379, 20363, 20358, 20355, 20336, 20341, 20360, 7713 20329, 20347, 20374, 20350, 20367, 20369, 20346, 20820, 20818, 20821, 7714 20841, 20855, 20854, 20856, 20925, 20989, 21051, 21048, 21047, 21050, 7715 21040, 21038, 21046, 21057, 21182, 21179, 21330, 21332, 21331, 21329, 7716 21350, {f: 3, c: 21367}, 21462, 21460, 21463, 21619, 21621, 21654, 21624, 7717 21653, 21632, 21627, 21623, 21636, 21650, 21638, 21628, 21648, 21617, 7718 21622, 21644, 21658, 21602, 21608, 21643, 21629, 21646, 22266, 22403, 7719 22391, 22378, 22377, 22369, 22374, 22372, 22396, 22812, 22857, 7720 {f: 2, c: 22855}, 22852, 22868, 22974, 22971, 22996, 22969, 22958, 22993, 7721 22982, 22992, 22989, 22987, 22995, 22986, 22959, 22963, 22994, 22981, 7722 23391, 23396, 23395, 23447, 23450, 23448, 23452, 23449, 23451, 23578, 7723 23624, {f: 2, c: 23621}, 23735, 23713, 23736, 23721, 23723, 23729, 23731, 7724 24088, 24090, 24086, 24085, 24091, 24081, 24184, 24218, 24215, 24220, 7725 {f: 2, c: 24213}, 24310, {f: 2, c: 24358}, 24361, {f: 2, c: 24448}, 24447, 7726 24444, 24541, 24544, 24573, 24565, 24575, 24591, 24596, 24623, 24629, 7727 24598, 24618, 24597, 24609, 24615, 24617, 24619, 24603, 25110, 25109, 7728 25151, 25150, 25152, 25215, 25289, 25292, 25284, 25279, 25282, 25273, 7729 25298, 25307, 25259, {f: 2, c: 25299}, 25291, 25288, 25256, 25277, 25276, 7730 [25296, 60582], 25305, 25287, 25293, 25269, 25306, 25265, 25304, 7731 {f: 2, c: 25302}, 25286, 25260, [25294, 61010], 25918, 26023, 26044, 26106, 7732 26132, 26131, 26124, 26118, 26114, 26126, 26112, 26127, 26133, 26122, 7733 26119, 26381, 26379, 26477, 26507, 26517, 26481, 26524, 26483, 26487, 7734 26503, 26525, 26519, {f: 2, c: 26479}, 26495, 26505, 26494, 26512, 26485, 7735 26522, 26515, 26492, 26474, 26482, 27427, {f: 2, c: 27494}, 27519, 27667, 7736 27675, 27875, 27880, 27891, 27825, 27852, 27877, 27827, {f: 2, c: 27837}, 7737 27836, 27874, 27819, 27861, 27859, 27832, 27844, 27833, 27841, 27822, 7738 27863, 27845, 27889, 27839, 27835, 27873, 27867, 27850, 27820, 27887, 7739 27868, 27862, 27872, 28821, 28814, 28818, 28810, 28825, {f: 2, c: 29228}, 7740 29240, 29256, 29287, 29289, 29376, 29390, 29401, 29399, 29392, 29609, 7741 29608, 29599, 29611, 29605, 30013, 30109, {f: 2, c: 30105}, 30340, 30402, 7742 30450, 30452, 30693, 30717, 31038, {f: 2, c: 31040}, 31177, 31176, 31354, 7743 31353, 31482, 31998, 32596, 32652, 32651, [32773, 58236], 32954, 32933, 7744 32930, 32945, 32929, 32939, 32937, 32948, 32938, 32943, 33253, 33278, 7745 33293, 33459, 33437, 33433, 33453, 33469, 33439, 33465, 33457, 33452, 7746 33445, 33455, 33464, 33443, 33456, 33470, 33463, 34382, 34417, 21021, 7747 34920, 36555, 36814, 36820, 36817, 37045, 37048, 37041, 37046, 37319, 7748 [12198, 37329], [12199, 38263], [12200, 38272], [12201, 38428], 38464, 7749 38463, 38459, 38468, 38466, [12203, 38585], [12204, 38632], 38738, 7750 [12206, 38750], 20127, {f: 2, c: 20141}, 20449, 20405, 20399, 20415, 20448, 7751 20433, 20431, 20445, 20419, 20406, 20440, 20447, 20426, 20439, 20398, 7752 20432, 20420, 20418, 20442, 20430, 20446, 20407, 20823, 20882, 20881, 7753 20896, 21070, 21059, 21066, 21069, 21068, 21067, 21063, 21191, 21193, 7754 21187, 21185, 21261, 21335, 21371, 21402, 21467, 21676, 21696, 21672, 7755 21710, 21705, 21688, 21670, 21683, 21703, 21698, 21693, 21674, 21697, 7756 21700, 21704, 21679, 21675, 21681, 21691, 21673, 21671, 21695, 22271, 7757 22402, 22411, 22432, 22435, 22434, 22478, 22446, 22419, 22869, 22865, 7758 22863, 22862, 22864, 23004, 23000, 23039, 23011, 23016, 23043, 23013, 7759 23018, 23002, 23014, 23041, 23035, 23401, 23459, 23462, 23460, 23458, 7760 23461, 23553, {f: 2, c: 23630}, 23629, 23627, 23769, 23762, 24055, 24093, 7761 24101, 24095, 24189, 24224, 24230, 24314, 24328, 24365, 24421, 24456, 7762 24453, {f: 2, c: 24458}, 24455, 24460, 24457, 24594, 24605, 24608, 24613, 7763 24590, 24616, 24653, 24688, 24680, [24674, 60712], 24646, 24643, 24684, 7764 24683, 24682, 24676, 25153, 25308, 25366, 25353, 25340, 25325, 25345, 7765 25326, 25341, 25351, 25329, 25335, 25327, 25324, 25342, 25332, 25361, 7766 25346, 25919, 25925, 26027, 26045, 26082, 26149, 26157, 26144, 26151, 7767 26159, 26143, 26152, 26161, 26148, 26359, 26623, 26579, 26609, 26580, 7768 26576, 26604, 26550, 26543, 26613, 26601, 26607, 26564, 26577, 26548, 7769 26586, 26597, 26552, 26575, 26590, 26611, 26544, 26585, 26594, 26589, 7770 26578, 27498, 27523, 27526, 27573, 27602, 27607, 27679, 27849, 27915, 7771 27954, 27946, 27969, 27941, 27916, 27953, 27934, 27927, 27963, 7772 {f: 2, c: 27965}, 27958, 27931, 27893, 27961, 27943, 27960, 27945, 27950, 7773 27957, 27918, 27947, 28843, 28858, 28851, 28844, 28847, 28845, 28856, 7774 28846, 28836, 29232, 29298, 29295, 29300, 29417, {f: 2, c: 29408}, 29623, 7775 29642, 29627, 29618, 29645, 29632, 29619, 29978, 29997, 30031, 30028, 7776 30030, 30027, 30123, {f: 2, c: 30116}, {f: 2, c: 30114}, 30328, 7777 {f: 3, c: 30342}, 30408, 30406, 30403, 30405, 30465, 30457, 30456, 30473, 7778 30475, 30462, 30460, 30471, 30684, 30722, 30740, {f: 2, c: 30732}, 31046, 7779 31049, 31048, 31047, {f: 2, c: 31161}, {f: 2, c: 31185}, 31179, 31359, 7780 31361, 31487, 31485, 31869, 32002, 32005, 32000, 32009, 32007, 32004, 7781 32006, 32568, 32654, 32703, 32784, 32781, 32785, 32822, 32982, 32997, 7782 32986, {f: 2, c: 32963}, 32972, 32993, 32987, 32974, 32990, 32996, 32989, 7783 33268, 33314, 33511, 33539, 33541, 33507, 33499, 33510, 33540, 33509, 7784 33538, 33545, 33490, 33495, 33521, 33537, 33500, 33492, 33489, 33502, 7785 33491, 33503, 33519, 33542, 34384, 34425, 34427, 34426, 34893, 34923, 7786 35201, 35284, 35336, {f: 2, c: 35330}, 35998, 36000, 36212, 36211, 36276, 7787 36557, 36556, 36848, 36838, 36834, 36842, 36837, 36845, 36843, 36836, 7788 36840, 37066, 37070, 37057, 37059, 37195, 37194, 37325, 38274, 38480, 7789 {f: 3, c: 38475}, [12207, 38754], [12208, 38761], [12209, 38859], 7790 [12210, 38893], [12211, 38899], [12212, 38913], [12213, 39080], 7791 [12214, 39131], [12215, 39135], [12216, 39318], [12217, 39321], 20056, 7792 20147, {f: 2, c: 20492}, 20515, 20463, 20518, 20517, 20472, [20521, 57375], 7793 20502, 20486, 20540, 20511, 20506, 20498, 20497, 20474, 20480, 20500, 7794 20520, 20465, 20513, 20491, 20505, 20504, 20467, 20462, 20525, 20522, 7795 20478, 20523, 20489, 20860, {f: 2, c: 20900}, 20898, 20941, 20940, 20934, 7796 20939, 21078, 21084, 21076, 21083, 21085, 21290, [21375, 57459], 21407, 7797 21405, 21471, 21736, 21776, 21761, 21815, 21756, 21733, 21746, 21766, 7798 21754, 21780, 21737, 21741, 21729, 21769, 21742, 21738, 21734, 21799, 7799 21767, 21757, 21775, {f: 2, c: 22275}, 22466, 22484, 22475, 22467, 22537, 7800 22799, {f: 2, c: 22871}, 22874, 23057, 23064, 23068, 23071, 23067, 23059, 7801 23020, 23072, 23075, 23081, 23077, 23052, 23049, 23403, 23640, 23472, 7802 23475, 23478, 23476, 23470, 23477, 23481, 23480, 23556, 23633, 23637, 7803 23632, 23789, 23805, 23803, 23786, 23784, 23792, 23798, 23809, 23796, 7804 24046, 24109, 24107, 24235, 24237, 24231, 24369, 24466, 24465, 24464, 7805 24665, 24675, 24677, 24656, 24661, 24685, 24681, 24687, 24708, 24735, 7806 24730, 24717, 24724, 24716, 24709, 24726, 25159, 25331, 25352, 25343, 7807 25422, 25406, 25391, 25429, 25410, 25414, 25423, 25417, 25402, 25424, 7808 25405, {f: 2, c: 25386}, 25384, 25421, 25420, {f: 2, c: 25928}, 26009, 7809 26049, 26053, 26178, 26185, 26191, 26179, 26194, 26188, 26181, 26177, 7810 26360, {f: 2, c: 26388}, 26391, 26657, 26680, 26696, 26694, 26707, 26681, 7811 26690, 26708, 26665, 26803, 26647, 26700, 26705, 26685, 26612, 26704, 7812 26688, 26684, 26691, 26666, 26693, 26643, 26648, 26689, 27530, 27529, 7813 27575, 27683, {f: 2, c: 27687}, 27686, 27684, 27888, 28010, 28053, 28040, 7814 28039, 28006, 28024, 28023, 27993, 28051, 28012, 28041, 28014, 27994, 7815 28020, 28009, 28044, 28042, 28025, 28037, 28005, 28052, 28874, 28888, 7816 28900, 28889, 28872, 28879, 29241, 29305, 29436, 29433, 29437, 29432, 7817 29431, 29574, 29677, 29705, 29678, 29664, 29674, 29662, 30036, 30045, 7818 30044, 30042, 30041, 30142, 30149, 30151, {f: 2, c: 30130}, 30141, 30140, 7819 30137, 30146, 30136, 30347, 30384, 30410, {f: 2, c: 30413}, 30505, 7820 {f: 2, c: 30495}, 30504, 30697, 30768, 30759, 30776, 30749, 30772, 30775, 7821 30757, 30765, 30752, 30751, 30770, 31061, 31056, 31072, 31071, 31062, 7822 31070, 31069, 31063, 31066, 31204, [31203, 60418], 31207, 31199, 31206, 7823 31209, 31192, 31364, 31368, 31449, 31494, 31505, 31881, 32033, 32023, 7824 32011, 32010, 32032, 32034, 32020, 32016, 32021, 32026, 32028, 32013, 7825 32025, 32027, 32570, 32607, 32660, 32709, 32705, 32774, 32772, 32792, 7826 32789, 32793, 32791, 32829, 32831, 33009, 33026, 33008, 33029, 33005, 7827 33012, 33030, 33016, 33011, 33032, 33021, 33034, 33020, 33007, 33261, 7828 33260, 33280, 33296, {f: 2, c: 33322}, 33320, 33324, 33467, 33579, 33618, 7829 33620, 33610, 33592, 33616, 33609, 33589, 33588, 33615, 33586, 33593, 7830 33590, 33559, 33600, 33585, 33576, 33603, 34388, 34442, 34474, 34451, 7831 34468, 34473, 34444, 34467, 34460, 34928, 34935, {f: 2, c: 34945}, 34941, 7832 34937, 35352, 35344, 35342, 35340, 35349, 35338, 35351, 35347, 35350, 7833 35343, 35345, 35912, 35962, 35961, {f: 2, c: 36001}, [36215, 58442], 36524, 7834 36562, 36564, 36559, 36785, 36865, 36870, 36855, 36864, 36858, 36852, 7835 36867, 36861, 36869, 36856, 37013, 37089, 37085, 37090, 37202, 37197, 7836 37196, 37336, 37341, 37335, 37340, 37337, 38275, {f: 2, c: 38498}, 38497, 7837 38491, 38493, 38500, 38488, 38494, 38587, 39138, [12218, 39340], 7838 [12219, 39592], [12220, 39640], [12222, 39717], [12224, 39730], 7839 [12225, 39740], 20094, 20602, [20605, 57382], 20572, 20551, 20547, 20556, 7840 20570, 20553, 20581, 20598, 20558, 20565, 20597, 20596, 20599, 20559, 7841 20495, 20591, 20589, 20828, 20885, 20976, 21098, 21103, 21202, 21209, 7842 21208, 21205, 21264, 21263, 21273, {f: 2, c: 21311}, 21310, 21443, 26364, 7843 21830, 21866, 21862, 21828, 21854, 21857, 21827, 21834, 21809, 21846, 7844 21839, 21845, 21807, 21860, 21816, 21806, 21852, 21804, 21859, 21811, 7845 21825, 21847, 22280, 22283, 22281, 22495, 22533, 22538, 22534, 22496, 7846 22500, 22522, 22530, 22581, 22519, 22521, 22816, 22882, 23094, 23105, 7847 23113, 23142, 23146, 23104, 23100, 23138, 23130, 23110, 23114, 23408, 7848 23495, 23493, 23492, 23490, 23487, 23494, 23561, 23560, 23559, 23648, 7849 {f: 2, c: 23644}, 23815, 23814, 23822, 23835, 23830, 23842, 23825, 23849, 7850 23828, 23833, 23844, 23847, 23831, 24034, 24120, 24118, 24115, 24119, 7851 {f: 2, c: 24247}, 24246, 24245, 24254, 24373, 24375, 24407, 24428, 24425, 7852 24427, 24471, 24473, 24478, 24472, 24481, 24480, 24476, 24703, 24739, 7853 24713, 24736, 24744, 24779, 24756, 24806, 24765, 24773, 24763, 24757, 7854 24796, 24764, 24792, 24789, 24774, 24799, 24760, 24794, 24775, 7855 {f: 2, c: 25114}, 25160, 25504, 25511, 25458, 25494, 25506, 25509, 25463, 7856 25447, 25496, 25514, 25457, 25513, 25481, 25475, 25499, 25451, 25512, 7857 25476, 25480, 25497, 25505, 25516, 25490, 25487, 25472, 25467, 25449, 7858 25448, 25466, 25949, 25942, 25937, 25945, 25943, 21855, 25935, 25944, 7859 25941, 25940, 26012, 26011, 26028, 26063, {f: 2, c: 26059}, 26062, 26205, 7860 26202, 26212, 26216, 26214, 26206, 26361, 21207, 26395, 26753, 26799, 7861 26786, 26771, 26805, 26751, 26742, 26801, 26791, 26775, 26800, 26755, 7862 26820, 26797, 26758, 26757, 26772, 26781, 26792, 26783, 26785, 26754, 7863 27442, 27578, {f: 2, c: 27627}, 27691, 28046, 28092, 28147, 28121, 28082, 7864 28129, 28108, 28132, 28155, 28154, 28165, 28103, 28107, 28079, 28113, 7865 28078, 28126, 28153, 28088, 28151, 28149, 28101, 28114, 28186, 28085, 7866 28122, 28139, 28120, 28138, 28145, 28142, 28136, 28102, 28100, 28074, 7867 28140, 28095, 28134, 28921, {f: 2, c: 28937}, 28925, 28911, 29245, 29309, 7868 29313, 29468, 29467, 29462, 29459, 29465, 29575, 29701, 29706, 29699, 7869 29702, 29694, 29709, 29920, {f: 2, c: 29942}, 29980, 29986, 7870 {f: 2, c: 30053}, 30050, 30064, 30095, {f: 2, c: 30164}, 30133, 30154, 7871 30157, 30350, 30420, 30418, 30427, 30519, 30526, 30524, 30518, 30520, 7872 30522, 30827, 30787, 30798, 31077, 31080, 31085, 31227, 31378, 31381, 7873 31520, 31528, 31515, 31532, 31526, 31513, 31518, 31534, 31890, 31895, 7874 31893, 32070, 32067, 32113, 32046, 32057, 32060, 32064, 32048, 32051, 7875 32068, 32047, 32066, 32050, 32049, 32573, 32670, 32666, 32716, 32718, 7876 32722, 32796, 32842, 32838, 33071, 33046, 33059, 33067, 33065, 33072, 7877 33060, 33282, 33333, 33335, 33334, 33337, 33678, 33694, 33688, 33656, 7878 33698, 33686, 33725, 33707, 33682, 33674, 33683, 33673, 33696, 33655, 7879 {f: 2, c: 33659}, 33670, 33703, 34389, 24426, 34503, 34496, 34486, 34500, 7880 34485, 34502, 34507, 34481, 34479, 34505, 34899, 34974, 34952, 34987, 7881 34962, 34966, 34957, 34955, 35219, 35215, 35370, 35357, 35363, 35365, 7882 35377, 35373, 35359, 35355, 35362, 35913, 35930, 36009, 36012, 36011, 7883 36008, 36010, 36007, 36199, 36198, 36286, 36282, 36571, 36575, 36889, 7884 36877, 36890, 36887, 36899, 36895, 36893, 36880, 36885, 36894, 36896, 7885 36879, 36898, 36886, 36891, 36884, 37096, 37101, [37117, 58488], 37207, 7886 37326, 37365, 37350, 37347, 37351, 37357, 37353, 38281, 38506, 38517, 7887 38515, 38520, 38512, 38516, {f: 2, c: 38518}, 38508, 38592, 38634, 38633, 7888 31456, 31455, {f: 2, c: 38914}, [12226, 39770], [12227, 40165], 7889 [12228, 40565], [12229, 40575], [12230, 40613], [12231, 40635], 20642, 7890 20621, 20613, 20633, 20625, 20608, 20630, 20632, 20634, 26368, 20977, 7891 21106, {f: 2, c: 21108}, 21097, 21214, 21213, 21211, 21338, 21413, 21883, 7892 21888, 21927, 21884, 21898, 21917, 21912, 21890, 21916, 21930, 21908, 7893 21895, 21899, 21891, 21939, 21934, 21919, 21822, 21938, 21914, 21947, 7894 21932, 21937, 21886, 21897, 21931, 21913, 22285, 22575, 22570, 22580, 7895 22564, {f: 2, c: 22576}, 22561, 22557, 22560, {f: 2, c: 22777}, 22880, 7896 [23159, 57587], 23194, 23167, 23186, 23195, 23207, 23411, 23409, 23506, 7897 23500, 23507, 23504, {f: 2, c: 23562}, 23601, 23884, 23888, 23860, 23879, 7898 24061, 24133, 24125, 24128, 24131, 24190, 24266, {f: 2, c: 24257}, 24260, 7899 24380, 24429, {f: 2, c: 24489}, 24488, 24785, 24801, 24754, 24758, 24800, 7900 24860, 24867, 24826, 24853, 24816, 24827, 24820, 24936, 24817, 24846, 7901 24822, 24841, 24832, 24850, 25119, 25161, 25507, 25484, 25551, 25536, 7902 25577, 25545, 25542, 25549, 25554, 25571, 25552, 25569, 25558, 7903 {f: 2, c: 25581}, 25462, 25588, 25578, 25563, 25682, 25562, 25593, 25950, 7904 25958, {f: 2, c: 25954}, 26001, 26000, 26031, 26222, 26224, [26228, 57786], 7905 26230, 26223, 26257, 26234, 26238, 26231, {f: 2, c: 26366}, 26399, 26397, 7906 26874, 26837, 26848, 26840, 26839, 26885, 26847, 26869, 26862, 26855, 7907 26873, 26834, 26866, 26851, 26827, 26829, 26893, 26898, 26894, 26825, 7908 26842, 26990, 26875, 27454, 27450, 27453, 27544, 27542, 27580, 27631, 7909 {f: 2, c: 27694}, 27692, [28207, 57904], 28216, 28244, 28193, 28210, 28263, 7910 28234, 28192, 28197, 28195, 28187, 28251, 28248, 28196, 28246, 28270, 7911 28205, 28198, 28271, 28212, 28237, 28218, 28204, 28227, [28189, 57901], 7912 28222, 28363, 28297, 28185, 28238, 28259, 28228, 28274, 28265, 28255, 7913 {f: 2, c: 28953}, 28966, 28976, 28961, 28982, [29038, 57958], 28956, 29260, 7914 29316, 29312, 29494, 29477, 29492, 29481, 29754, 29738, 29747, 29730, 7915 29733, {f: 2, c: 29749}, 29748, 29743, 29723, 29734, 29736, 7916 {f: 2, c: 29989}, 30059, 30058, 30178, 30171, 30179, 30169, 30168, 30174, 7917 30176, {f: 2, c: 30331}, 30358, 30355, 30388, 30428, 30543, 30701, 30813, 7918 30828, 30831, 31245, 31240, 31243, 31237, 31232, 31384, 31383, 31382, 7919 31461, 31459, 31561, 31574, 31558, 31568, 31570, 31572, 31565, 31563, 7920 31567, [31569, 60510], 31903, 31909, 32094, 32080, 32104, 32085, 32043, 7921 32110, 32114, 32097, 32102, 32098, 32112, 32115, 21892, {f: 2, c: 32724}, 7922 32779, 32850, 32901, 33109, 33108, 33099, 33105, 33102, 33081, 33094, 7923 33086, 33100, 33107, 33140, 33298, 33308, 33769, 33795, 33784, 33805, 7924 33760, 33733, 33803, [33729, 58309], 33775, 33777, 33780, 33879, 33802, 7925 33776, 33804, 33740, 33789, 33778, 33738, 33848, 33806, 33796, 33756, 7926 33799, 33748, 33759, 34395, 34527, 34521, 34541, 34516, 34523, 34532, 7927 34512, 34526, 34903, {f: 2, c: 35009}, 34993, 35203, 35222, 35387, 35424, 7928 35413, 35422, 35388, 35393, 35412, 35419, 35408, 35398, 35380, 35386, 7929 35382, 35414, 35937, 35970, 36015, 36028, 36019, 36029, 36033, 36027, 7930 36032, 36020, 36023, 36022, 36031, 36024, 36234, 36229, 36225, 36302, 7931 36317, 36299, 36314, 36305, 36300, 36315, 36294, 36603, 36600, 36604, 7932 36764, 36910, 36917, 36913, 36920, 36914, 36918, 37122, 37109, 37129, 7933 37118, 37219, 37221, 37327, {f: 2, c: 37396}, 37411, 37385, 37406, 37389, 7934 37392, 37383, 37393, 38292, 38287, 38283, 38289, 38291, 38290, 38286, 7935 38538, 38542, 38539, 38525, {f: 2, c: 38533}, 38541, 38514, 38532, 38593, 7936 38597, 38596, {f: 2, c: 38598}, 38639, 38642, 38860, {f: 2, c: 38917}, 7937 38920, 39143, 39146, 39151, 39145, 39154, 39149, 39342, 39341, 7938 [12232, 40643], [12233, 40653], [12234, 40657], 20098, 20653, 20661, 7939 {f: 2, c: 20658}, 20677, 20670, 20652, 20663, 20667, 20655, 20679, 21119, 7940 21111, 21117, 21215, 21222, 21220, {f: 2, c: 21218}, 21295, 21983, 21992, 7941 21971, 21990, 21966, 21980, 21959, 21969, {f: 2, c: 21987}, 21999, 21978, 7942 21985, {f: 2, c: 21957}, 21989, 21961, {f: 2, c: 22290}, 22622, 22609, 7943 22616, 22615, 22618, 22612, 22635, 22604, 22637, 22602, 22626, 22610, 7944 22603, 22887, 23233, 23241, 23244, 23230, 23229, 23228, 23219, 23234, 7945 23218, 23913, 23919, 24140, 24185, 24265, 24264, 24338, 24409, 24492, 7946 24494, 24858, 24847, 24904, 24863, 24819, 24859, 24825, 24833, 24840, 7947 24910, 24908, 24900, 24909, 24894, 24884, 24871, 24845, 24838, 24887, 7948 {f: 2, c: 25121}, 25619, 25662, 25630, 25642, 25645, 25661, 25644, 25615, 7949 25628, 25620, 25613, 25654, {f: 2, c: 25622}, 25606, 25964, 26015, 26032, 7950 26263, 26249, {f: 2, c: 26247}, 26262, 26244, 26264, 26253, 26371, 27028, 7951 26989, 26970, 26999, 26976, 26964, 26997, 26928, 27010, 26954, 26984, 7952 26987, 26974, 26963, 27001, 27014, 26973, 26979, 26971, 27463, 27506, 7953 27584, 27583, 27603, 27645, 28322, 28335, 28371, 28342, 28354, 28304, 7954 28317, 28359, 28357, 28325, 28312, 28348, 28346, 28331, 28369, 28310, 7955 28316, 28356, 28372, 28330, 28327, 28340, 29006, 29017, 29033, 29028, 7956 29001, 29031, 29020, 29036, 29030, 29004, 29029, 29022, 28998, 29032, 7957 29014, 29242, 29266, 29495, 29509, 29503, 29502, 29807, 29786, 29781, 7958 29791, 29790, 29761, 29759, 29785, 29787, [29788, 58019], 30070, 30072, 7959 30208, 30192, 30209, 30194, 30193, 30202, 30207, 30196, 30195, 7960 {f: 2, c: 30430}, 30555, 30571, 30566, 30558, 30563, 30585, 30570, 30572, 7961 30556, 30565, 30568, 30562, 30702, 30862, 30896, {f: 2, c: 30871}, 30860, 7962 30857, 30844, 30865, 30867, 30847, 31098, 31103, 31105, 33836, 31165, 7963 31260, 31258, 31264, 31252, 31263, 31262, {f: 2, c: 31391}, 31607, 31680, 7964 31584, 31598, 31591, 31921, 31923, 31925, 32147, 32121, 32145, 32129, 7965 32143, 32091, 32622, {f: 2, c: 32617}, 32626, 32681, 32680, 32676, 32854, 7966 32856, 32902, 32900, 33137, 33136, 33144, 33125, 33134, 33139, 33131, 7967 {f: 2, c: 33145}, 33126, 33285, 33351, 33922, 33911, 33853, 33841, 33909, 7968 33894, 33899, 33865, 33900, 33883, 33852, 33845, 33889, 33891, 33897, 7969 33901, 33862, 34398, 34396, 34399, 34553, 34579, 34568, 34567, 34560, 7970 34558, 34555, {f: 2, c: 34562}, 34566, 34570, 34905, 35039, 35028, 35033, 7971 35036, 35032, 35037, 35041, 35018, 35029, 35026, 35228, 35299, 35435, 7972 {f: 2, c: 35442}, 35430, 35433, 35440, 35463, 35452, 35427, 35488, 35441, 7973 35461, 35437, 35426, 35438, 35436, 35449, 35451, 35390, 35432, 35938, 7974 35978, 35977, 36042, {f: 2, c: 36039}, 36036, 36018, 36035, 36034, 36037, 7975 36321, 36319, 36328, 36335, 36339, 36346, 36330, 36324, 36326, 36530, 7976 36611, 36617, 36606, 36618, 36767, 36786, 36939, 36938, 36947, 36930, 7977 36948, 36924, 36949, 36944, 36935, 36943, 36942, 36941, 36945, 36926, 7978 36929, 37138, 37143, 37228, 37226, 37225, 37321, 37431, 37463, 37432, 7979 37437, 37440, 37438, 37467, 37451, 37476, 37457, 37428, 37449, 37453, 7980 37445, 37433, 37439, 37466, 38296, 38552, {f: 2, c: 38548}, 38605, 38603, 7981 {f: 2, c: 38601}, 38647, 38651, 38649, 38646, 38742, 38772, 38774, 7982 {f: 2, c: 38928}, 38931, 38922, 38930, 38924, 39164, 39156, 7983 {f: 2, c: 39165}, 39347, 39345, 39348, 39649, 40169, 40578, [12237, 40718], 7984 [12238, 40723], [12239, 40736], 20711, 20718, 20709, 20694, [20717, 60903], 7985 20698, 20693, 20687, 20689, 20721, 20686, 20713, 20834, 20979, 21123, 7986 21122, 21297, 21421, 22014, 22016, 22043, 22039, 22013, 22036, 22022, 7987 22025, {f: 2, c: 22029}, 22007, 22038, 22047, 22024, 22032, 22006, 22296, 7988 22294, 22645, 22654, 22659, 22675, 22666, 22649, 22661, 22653, 22781, 7989 22821, 22818, 22820, 22890, 22889, 23265, 23270, 23273, 23255, 23254, 7990 23256, 23267, 23413, 23518, 23527, 23521, {f: 2, c: 23525}, 23528, 23522, 7991 23524, 23519, 23565, 23650, 23940, 23943, 24155, 24163, 24149, 24151, 7992 24148, 24275, 24278, 24330, 24390, 24432, 24505, 24903, 24895, 24907, 7993 24951, {f: 2, c: 24930}, 24927, 24922, 24920, 24949, 25130, 25735, 25688, 7994 25684, 25764, 25720, 25695, 25722, 25681, 25703, 25652, 25709, 25723, 7995 25970, 26017, 26071, 26070, 26274, 26280, 26269, 27036, 27048, 27029, 7996 27073, 27054, 27091, 27083, 27035, 27063, 27067, 27051, 27060, 27088, 7997 27085, 27053, 27084, 27046, 27075, 27043, 27465, 27468, 27699, 28467, 7998 28436, 28414, 28435, 28404, 28457, 28478, 28448, 28460, 28431, 28418, 7999 28450, 28415, 28399, 28422, 28465, 28472, 28466, 28451, 28437, 28459, 8000 28463, 28552, 28458, 28396, 28417, 28402, 28364, 28407, 29076, 29081, 8001 29053, 29066, 29060, 29074, 29246, 29330, 29334, 29508, 29520, 29796, 8002 29795, 29802, 29808, 29805, 29956, 30097, 30247, 30221, 30219, 30217, 8003 30227, 30433, 30435, 30596, 30589, 30591, 30561, 30913, 30879, 30887, 8004 30899, 30889, 30883, {f: 2, c: 31118}, 31117, 31278, 31281, 31402, 31401, 8005 31469, 31471, 31649, 31637, 31627, 31605, 31639, 31645, 31636, 31631, 8006 [31672, 58170], 31623, 31620, 31929, {f: 2, c: 31933}, 32187, 32176, 32156, 8007 {f: 2, c: 32189}, 32160, 32202, 32180, 32178, 32177, 32186, 32162, 32191, 8008 32181, 32184, 32173, [32210, 58202], 32199, 32172, 32624, {f: 2, c: 32736}, 8009 32735, 32862, 32858, 32903, 33104, 33152, 33167, 33160, 33162, 33151, 8010 33154, 33255, 33274, 33287, 33300, 33310, 33355, 33993, 33983, 33990, 8011 33988, 33945, 33950, 33970, 33948, 33995, 33976, 33984, 34003, 33936, 8012 33980, 34001, 33994, 34623, 34588, 34619, 34594, 34597, 34612, 34584, 8013 34645, 34615, 34601, 35059, 35074, 35060, 35065, 35064, 35069, 35048, 8014 35098, 35055, 35494, 35468, 35486, 35491, 35469, 35489, 35475, 35492, 8015 35498, 35493, 35496, 35480, 35473, 35482, 35495, 35946, 35981, 35980, 8016 36051, {f: 2, c: 36049}, 36203, 36249, 36245, 36348, 36628, 36626, 36629, 8017 36627, 36771, 36960, 36952, 36956, 36963, 36953, 36958, 36962, 36957, 8018 36955, 37145, 37144, 37150, 37237, 37240, 37239, 37236, 37496, 37548, 8019 37504, 37509, 37528, 37526, 37499, 37523, 37532, 37544, 37500, 37521, 8020 38305, {f: 2, c: 38312}, 38307, 38309, 38308, 38553, 38556, 38555, 38604, 8021 38610, 38656, 38780, 38789, 38902, {f: 2, c: 38935}, 39087, 39089, 39171, 8022 39173, 39180, 39177, 39361, {f: 2, c: 39599}, 39654, {f: 2, c: 39745}, 8023 40180, 40182, 40179, 40636, [12240, 40763], [12241, 40778], 20740, 20736, 8024 20731, 20725, 20729, 20738, {f: 2, c: 20744}, 20741, 20956, 8025 {f: 3, c: 21127}, 21133, 21130, 21232, 21426, 22062, 22075, 22073, 22066, 8026 22079, 22068, 22057, 22099, 22094, 22103, 22132, 22070, {f: 2, c: 22063}, 8027 22656, 22687, 22686, 22707, 22684, 22702, 22697, 22694, 22893, 23305, 8028 23291, 23307, 23285, 23308, 23304, 23534, 23532, 23529, 23531, 8029 {f: 2, c: 23652}, 23965, 23956, 24162, 24159, 24161, 24290, 24282, 24287, 8030 24285, 24291, 24288, 24392, 24433, 24503, 24501, 24950, 24935, 24942, 8031 24925, 24917, 24962, 24956, 24944, 24939, 24958, 24999, 24976, 25003, 8032 24974, 25004, 24986, 24996, 24980, 25006, 25134, 25705, 25711, 25721, 8033 25758, 25778, 25736, [25744, 57745], 25776, 25765, 25747, 25749, 25769, 8034 25746, 25774, 25773, 25771, 25754, 25772, 25753, 25762, 25779, 25973, 8035 {f: 2, c: 25975}, 26286, 26283, 26292, 26289, 27171, 27167, 27112, 27137, 8036 27166, 27161, 27133, 27169, 27155, 27146, 27123, 27138, 27141, 27117, 8037 27153, 27472, 27470, 27556, {f: 2, c: 27589}, 28479, 28540, 28548, 28497, 8038 28518, 28500, 28550, 28525, 28507, 28536, 28526, 28558, 28538, 28528, 8039 28516, 28567, 28504, 28373, 28527, 28512, 28511, 29087, 29100, 29105, 8040 29096, 29270, 29339, 29518, 29527, 29801, 29835, 29827, 29822, 29824, 8041 30079, 30240, 30249, 30239, 30244, 30246, {f: 2, c: 30241}, 30362, 30394, 8042 30436, 30606, 30599, 30604, 30609, 30603, 30923, 30917, 30906, 30922, 8043 30910, 30933, 30908, 30928, 31295, 31292, 31296, 31293, 31287, 31291, 8044 31407, 31406, 31661, 31665, 31684, 31668, {f: 2, c: 31686}, 31681, 31648, 8045 31692, 31946, 32224, 32244, 32239, 32251, 32216, 32236, 32221, 32232, 8046 32227, 32218, 32222, 32233, 32158, 32217, 32242, 32249, 32629, 32631, 8047 32687, 32745, 32806, {f: 3, c: 33179}, 33184, 33178, 33176, 34071, 34109, 8048 34074, 34030, {f: 2, c: 34092}, 34067, 34065, 34083, 34081, 34068, 34028, 8049 34085, 34047, 34054, 34690, 34676, 34678, 34656, 34662, 34680, 34664, 8050 34649, 34647, 34636, 34643, 34907, 34909, 35088, 35079, {f: 2, c: 35090}, 8051 35093, 35082, 35516, 35538, 35527, 35524, 35477, 35531, 35576, 35506, 8052 35529, 35522, 35519, 35504, 35542, 35533, 35510, 35513, 35547, 35916, 8053 35918, 35948, 36064, 36062, 36070, 36068, {f: 2, c: 36076}, 8054 {f: 2, c: 36066}, 36060, 36074, 36065, 36205, 36255, 36259, 36395, 36368, 8055 36381, 36386, 36367, 36393, 36383, 36385, 36382, 36538, 36637, 36635, 8056 36639, 36649, 36646, 36650, 36636, 36638, 36645, 36969, 36974, 36968, 8057 36973, 36983, 37168, 37165, 37159, 37169, 37255, 37257, 37259, 37251, 8058 37573, 37563, 37559, 37610, 37604, 37569, 37555, 37564, 37586, 37575, 8059 37616, 37554, 38317, 38321, 38660, {f: 2, c: 38662}, 38665, 38752, 38797, 8060 38795, 38799, 38945, 38955, 38940, 39091, 39178, 39187, 39186, 39192, 8061 39389, 39376, 39391, 39387, 39377, 39381, 39378, 39385, 39607, 8062 {f: 2, c: 39662}, 39719, 39749, 39748, 39799, 39791, 40198, 40201, 40195, 8063 40617, 40638, 40654, 22696, [12242, 40786], 20754, 20760, 20756, 20752, 8064 20757, 20864, 20906, 20957, 21137, 21139, 21235, 22105, 22123, 22137, 8065 22121, 22116, 22136, 22122, 22120, 22117, 22129, 22127, 22124, 22114, 8066 22134, 22721, 22718, 22727, 22725, 22894, 23325, 23348, 23416, 23536, 8067 23566, 24394, 25010, 24977, 25001, 24970, 25037, 25014, 25022, 25034, 8068 25032, 25136, 25797, 25793, 25803, {f: 2, c: 25787}, 25818, 25796, 25799, 8069 25794, 25805, 25791, 25810, 25812, 25790, 25972, 26310, 26313, 26297, 8070 26308, 26311, 26296, 27197, 27192, 27194, 27225, 27243, 27224, 27193, 8071 27204, 27234, 27233, 27211, 27207, 27189, 27231, 27208, 27481, 27511, 8072 27653, 28610, 28593, 28577, 28611, 28580, 28609, 28583, 28595, 28608, 8073 28601, [28598, 60318], 28582, 28576, 28596, 29118, 29129, 29136, 29138, 8074 29128, 29141, 29113, 29134, 29145, 29148, {f: 2, c: 29123}, 29544, 29852, 8075 29859, 29848, 29855, 29854, 29922, {f: 2, c: 29964}, 30260, 30264, 30266, 8076 30439, 30437, 30624, {f: 2, c: 30622}, 30629, 30952, 30938, 30956, 30951, 8077 31142, {f: 2, c: 31309}, 31302, 31308, 31307, 31418, 31705, 31761, 31689, 8078 31716, 31707, 31713, 31721, 31718, {f: 2, c: 31957}, 32266, 32273, 32264, 8079 32283, 32291, 32286, [32285, 58211], 32265, 32272, 32633, 32690, 8080 {f: 2, c: 32752}, 32750, [32808, 58239], 33203, 33193, 33192, 33275, 33288, 8081 {f: 2, c: 33368}, 34122, 34137, 34120, {f: 2, c: 34152}, 34115, 34121, 8082 34157, 34154, 34142, 34691, 34719, 34718, 34722, 34701, 34913, 35114, 8083 35122, 35109, 35115, 35105, 35242, [35238, 58391], 35558, 35578, 35563, 8084 35569, 35584, 35548, 35559, 35566, 35582, {f: 2, c: 35585}, 35575, 35565, 8085 35571, 35574, 35580, 35947, 35949, 35987, 36084, 36420, 36401, 36404, 8086 36418, 36409, 36405, 36667, 36655, 36664, 36659, 36776, 36774, 36981, 8087 36980, 36984, 36978, 36988, 36986, 37172, 37266, 37664, 37686, 37624, 8088 37683, 37679, 37666, 37628, 37675, 37636, 37658, 37648, 37670, 37665, 8089 37653, 37678, 37657, 38331, {f: 2, c: 38567}, 38570, 38613, 38670, 38673, 8090 38678, 38669, 38675, 38671, 38747, [38748, 58565], 38758, 38808, 38960, 8091 38968, 38971, 38967, 38957, 38969, 38948, 39184, 39208, 39198, 39195, 8092 39201, 39194, 39405, 39394, 39409, 39608, 39612, 39675, 39661, 39720, 8093 39825, 40213, 40227, 40230, 40232, 40210, 40219, 40664, 40660, 8094 [12243, 40845], [12244, 40860], 20778, 20767, 20769, 20786, 21237, 22158, 8095 22144, 22160, 22149, 22151, 22159, 22741, 22739, 22737, 22734, 23344, 8096 23338, 23332, 23418, 23607, 23656, 23996, 23994, 23997, 23992, 24171, 8097 24396, 24509, 25033, 25026, 25031, 25062, 25035, 25138, 25140, 25806, 8098 25802, 25816, 25824, 25840, 25830, 25836, 25841, 25826, 25837, 8099 {f: 2, c: 25986}, 26329, 26326, 27264, 27284, 27268, 27298, 27292, 27355, 8100 27299, 27262, 27287, 27280, 27296, 27484, 27566, 27610, 27656, 28632, 8101 28657, {f: 2, c: 28639}, 28635, 28644, 28651, 28655, 28544, 28652, 28641, 8102 28649, 28629, 28654, 28656, 29159, [29151, 60361], 29166, 29158, 29157, 8103 29165, 29164, 29172, 29152, 29237, 29254, 29552, 29554, 29865, 29872, 8104 29862, 29864, 30278, 30274, 30284, 30442, 30643, 30634, 30640, 30636, 8105 30631, 30637, 30703, 30967, 30970, 30964, 30959, 30977, 31143, 31146, 8106 31319, 31423, 31751, 31757, 31742, 31735, 31756, 31712, 31968, 31964, 8107 31966, 31970, 31967, 31961, 31965, 32302, 32318, 32326, 32311, 32306, 8108 32323, 32299, 32317, 32305, 32325, 32321, 32308, 32313, 32328, 32309, 8109 32319, 32303, 32580, 32755, 32764, {f: 2, c: 32881}, 32880, 32879, 32883, 8110 33222, 33219, 33210, 33218, 33216, 33215, 33213, 33225, 33214, 33256, 8111 33289, 33393, 34218, 34180, 34174, 34204, 34193, 34196, 34223, 34203, 8112 34183, 34216, 34186, 34214, 34407, 34752, 34769, 34739, 34770, 34758, 8113 34731, 34747, 34746, 34760, 34763, 35131, 35126, 35140, 35128, 35133, 8114 35244, 35598, 35607, 35609, 35611, 35594, 35616, 35613, 35588, 35600, 8115 35905, 35903, 35955, 36090, 36093, 36092, 36088, 36091, 36264, 36425, 8116 36427, 36424, 36426, 36676, 36670, 36674, 36677, 36671, 36991, 36989, 8117 36996, {f: 2, c: 36993}, 36992, 37177, 37283, 37278, 37276, 37709, 37762, 8118 37672, 37749, 37706, 37733, 37707, 37656, 37758, 37740, 37723, 37744, 8119 37722, 37716, {f: 3, c: 38346}, 38344, 38342, 38577, 38584, 38614, 38684, 8120 38686, 38816, 38867, 38982, 39094, 39221, 39425, 39423, 39854, 39851, 8121 39850, 39853, 40251, 40255, 40587, 40655, 40670, {f: 2, c: 40668}, 40667, 8122 40766, 40779, 21474, 22165, 22190, 22745, 22744, 23352, 24413, 25059, 8123 25139, 25844, 25842, 25854, 25862, {f: 2, c: 25850}, 25847, 26039, 26332, 8124 26406, 27315, 27308, 27331, 27323, 27320, 27330, {f: 2, c: 27310}, 27487, 8125 27512, 27567, 28681, 28683, 28670, 28678, 28666, 28689, 28687, 8126 {f: 2, c: 29179}, 29182, 29176, 29559, 29557, 29863, 29887, 29973, 30294, 8127 30296, 30290, 30653, 30655, {f: 2, c: 30651}, 30990, 31150, 8128 {f: 2, c: 31329}, 31328, {f: 2, c: 31428}, 31787, 31783, 31786, 31774, 8129 31779, 31777, 31975, {f: 2, c: 32340}, 32350, 32346, 32353, 32338, 32345, 8130 32584, 32761, 32763, 32887, 32886, 33229, 33231, 33290, 34255, 34217, 8131 34253, 34256, 34249, 34224, 34234, 34233, 34799, 34796, 34802, 34784, 8132 35206, 35250, 35316, 35624, 35641, 35628, 35627, 35920, 36101, 36441, 8133 36451, 36454, 36452, 36447, 36437, 36544, 36681, 36685, 36999, 36995, 8134 37000, {f: 2, c: 37291}, 37328, 37780, 37770, 37782, 37794, 37811, 37806, 8135 37804, 37808, 37784, 37786, 37783, 38356, 38358, 38352, 38357, 38626, 8136 38620, 38617, 38619, 38622, 38692, 38819, 38822, 38829, 38905, 38989, 8137 38991, 38988, 38990, 38995, 39098, {f: 2, c: 39230}, 39229, 39214, 39333, 8138 39438, 39617, 39683, 39686, 39759, 39758, 39757, 39882, 39881, 39933, 8139 39880, 39872, 40273, 40285, 40288, 40672, 40725, 40748, 20787, 22181, 8140 22184, {f: 2, c: 22750}, 22754, 23541, 40848, 24300, 25074, 25079, 25078, 8141 25077, 25856, 25871, 26336, 26333, 27365, 27357, 27354, 27347, 28699, 8142 28703, 28712, 28698, 28701, 28693, 28696, 29190, 29197, 29272, 29346, 8143 29560, 29562, 29885, 29898, 29923, 30087, 30086, 30303, 30305, 30663, 8144 31001, 31153, 31339, 31337, {f: 2, c: 31806}, 31800, 31805, 31799, 31808, 8145 32363, 32365, 32377, {f: 2, c: 32361}, 32371, 32645, 32694, 32697, 32696, 8146 33240, 34281, 34269, 34282, 34261, {f: 2, c: 34276}, 34295, 34811, 34821, 8147 34829, 34809, 34814, 35168, 35167, 35158, 35166, 35649, 35676, 35672, 8148 35657, 35674, {f: 2, c: 35662}, 35654, 35673, 36104, 36106, 36476, 36466, 8149 36487, 36470, 36460, 36474, 36468, 36692, 36686, 36781, {f: 2, c: 37002}, 8150 37297, 37294, 37857, 37841, 37855, 37827, 37832, {f: 2, c: 37852}, 37846, 8151 37858, 37837, 37848, 37860, 37847, 37864, 38364, 38580, 38627, 38698, 8152 38695, 38753, 38876, 38907, 39006, 39000, 39003, 39100, 39237, 39241, 8153 39446, 39449, 39693, 39912, 39911, 39894, 39899, 40329, 40289, 40306, 8154 40298, 40300, 40594, 40599, 40595, 40628, 21240, 22199, 22198, 22196, 8155 22204, 22756, 23360, 23363, 23421, 23542, 24009, 25080, 25082, 25880, 8156 25876, 25881, 26342, 26407, 27372, 28734, 28720, 28722, 29200, 29563, 8157 29903, 30306, 30309, 31014, 31018, 31020, 31019, 31431, 31478, 31820, 8158 31811, 31821, {f: 2, c: 31983}, 36782, 32381, 32380, 32386, 32588, 32768, 8159 33242, 33382, 34299, 34297, 34321, 34298, 34310, 34315, 34311, 34314, 8160 {f: 2, c: 34836}, 35172, 35258, 35320, 35696, 35692, 35686, 35695, 35679, 8161 35691, 36111, 36109, 36489, 36481, 36485, 36482, 37300, 37323, 37912, 8162 37891, 37885, 38369, 38704, 39108, 39250, 39249, 39336, 39467, 39472, 8163 39479, 39477, 39955, 39949, 40569, 40629, 40680, 40751, 40799, 40803, 8164 40801, {f: 2, c: 20791}, 22209, 22208, 22210, 22804, 23660, 24013, 25084, 8165 25086, 25885, 25884, 26005, 26345, 27387, 27396, 27386, 27570, 28748, 8166 29211, 29351, 29910, 29908, 30313, 30675, 31824, 32399, 32396, 32700, 8167 34327, 34349, 34330, 34851, 34850, 34849, 34847, 35178, 35180, 35261, 8168 35700, 35703, 35709, 36115, 36490, 36493, 36491, 36703, 36783, 37306, 8169 37934, 37939, 37941, 37946, 37944, 37938, 37931, 38370, {f: 2, c: 38712}, 8170 38706, [38911, 58586], 39015, 39013, 39255, 39493, 39491, 39488, 39486, 8171 39631, 39764, 39761, 39981, 39973, 40367, 40372, 40386, 40376, 40605, 8172 40687, 40729, 40796, {f: 2, c: 40806}, 20796, 20795, 22216, 22218, 22217, 8173 23423, 24020, 24018, 24398, 25087, 25892, 27402, 27489, 28753, 28760, 8174 29568, 29924, 30090, 30318, 30316, 31155, 31840, 31839, 32894, 32893, 8175 33247, 35186, 35183, 35324, 35712, {f: 2, c: 36118}, 36497, 36499, 36705, 8176 37192, 37956, {f: 2, c: 37969}, {f: 2, c: 38717}, 38851, 38849, 39019, 8177 39253, 39509, 39501, 39634, 39706, 40009, 39985, 39998, 39995, 40403, 8178 40407, 40756, 40812, 40810, 40852, 22220, 24022, 25088, 25891, 25899, 8179 25898, 26348, 27408, 29914, 31434, 31844, 31843, 31845, 32403, 32406, 8180 32404, 33250, 34360, 34367, 34865, 35722, 37008, 37007, 37987, 37984, 8181 37988, 38760, 39023, 39260, {f: 2, c: 39514}, 39511, {f: 2, c: 39635}, 8182 39633, 40020, 40023, 40022, 40421, 40607, 40692, 22225, 22761, 25900, 8183 28766, {f: 2, c: 30321}, [30679, 60226], 32592, 32648, 34870, 34873, 34914, 8184 35731, 35730, 35734, 33399, 36123, 37312, 37994, 38722, 38728, 38724, 8185 38854, 39024, 39519, 39714, 39768, 40031, {f: 2, c: 40441}, 8186 {f: 2, c: 40572}, 40711, 40823, 40818, 24307, 27414, 28771, 31852, 31854, 8187 34875, 35264, 36513, 37313, 38002, 38000, 39025, 39262, 39638, 39715, 8188 40652, 28772, 30682, 35738, 38007, 38857, 39522, 39525, 32412, 35740, 8189 36522, 37317, {f: 2, c: 38013}, 38012, {f: 2, c: 40055}, 40695, 35924, 8190 38015, 40474, 29224, 39530, 39729, 40475, 40478, 31858, 20034, 20060, 8191 [12048, 20981], [12053, 21274], [12058, 21378], 19975, 19980, 20039, 20109, 8192 [12062, 22231], [12076, 23662], [12091, 24435], 19983, 20871, 19982, 20014, 8193 20115, 20162, 20169, 20168, 20888, 21244, 21356, 21433, 22304, 22787, 8194 22828, [23568, 60417], 24063, 26081, [12110, 27571], 27596, [12115, 27668], 8195 [12121, 29247], 20017, 20028, 20200, 20188, 20201, 20193, 20189, 20186, 8196 21004, 21001, 21276, 21324, {f: 2, c: 22306}, 22807, 22831, 23425, 23428, 8197 23570, 23611, 23668, 23667, 24068, 24192, 24194, 24521, 25097, 25168, 8198 27669, 27702, 27715, 27711, 27707, 29358, 29360, 29578, [12145, 31160], 8199 32906, 38430, 20238, 20248, 20268, 20213, 20244, 20209, 20224, 20215, 8200 20232, 20253, 20226, 20229, 20258, 20243, 20228, 20212, 20242, 20913, 8201 21011, 21008, 21158, 21282, 21279, 21325, 21386, 21511, 22241, 22239, 8202 22318, 22314, 22324, 22844, 22912, 22908, 22917, 22907, 22910, 22903, 8203 22911, 23382, 23573, 23589, 23676, {f: 2, c: 23674}, 23678, 24031, 8204 [24181, 57646], 24196, 24322, 24346, 24436, 24533, 24532, 24527, 25180, 8205 25182, 25188, 25185, 25190, 25186, 25177, 25184, 25178, 25189, 25911, 8206 26095, 26094, 26430, 26425, 26424, 26427, 26426, 26431, 26428, 26419, 8207 27672, 27718, 27730, 27740, 27727, [27722, 60796], 27732, {f: 2, c: 27723}, 8208 28785, 29278, {f: 2, c: 29364}, 29582, 29994, 30335, 31349, [12153, 32593], 8209 [12171, 33400], 33404, 33408, 33405, 33407, [12172, 34381], [12177, 35198], 8210 37017, [37015, 59347], 37016, 37019, 37012, 38434, 38436, 38432, 38435, 8211 20310, 20283, 20322, 20297, 20307, 20324, 20286, 20327, 20306, 20319, 8212 20289, 20312, 20269, 20275, 20287, 20321, 20879, 20921, 21020, 21022, 8213 21025, {f: 2, c: 21165}, 21257, 21347, 21362, {f: 2, c: 21390}, 21552, 8214 21559, 21546, 21588, 21573, 21529, 21532, 21541, 21528, 21565, 21583, 8215 21569, 21544, 21540, 21575, 22254, 22247, 22245, 22337, 22341, 22348, 8216 22345, 22347, 22354, 22790, 22848, 22950, 22936, 22944, 22935, 22926, 8217 22946, 22928, 22927, 22951, 22945, 23438, 23442, 23592, 23594, 23693, 8218 23695, 23688, 23691, 23689, 23698, 23690, 23686, 23699, 23701, 24032, 8219 24074, 24078, 24203, 24201, 24204, 24200, 24205, 24325, 24349, 24440, 8220 24438, 24530, 24529, 24528, 24557, 24552, 24558, 24563, 24545, 24548, 8221 24547, 24570, 24559, 24567, 24571, 24576, 24564, 25146, 25219, 25228, 8222 {f: 2, c: 25230}, 25236, 25223, 25201, 25211, 25210, 25200, 25217, 25224, 8223 25207, 25213, 25202, 25204, 26096, 26100, 26099, 26098, 26101, 26437, 8224 26439, 26457, 26453, 26444, 26440, 26461, 26445, 26458, 26443, 27600, 8225 {f: 2, c: 27673}, 27768, 27751, 27755, 27780, 27787, 27791, 27761, 27759, 8226 27753, 27802, 27757, 27783, 27797, [27804, 57900], 27750, 27763, 27749, 8227 27771, 27790, 28788, 28794, 29283, 29375, 29373, 29379, 29382, 29377, 8228 29370, 29381, 29589, 29591, {f: 2, c: 29587}, 29586, 30010, 30009, 8229 {f: 2, c: 30100}, 30337, 31037, 32820, 32917, 32921, 32912, 32914, 32924, 8230 33424, 33423, 33413, 33422, 33425, 33427, 33418, {f: 2, c: 33411}, 8231 [12184, 35960], 36809, 36799, 37023, 37025, 37029, 37022, 37031, 37024, 8232 38448, 38440, 38447, 38445, 20019, 20376, 20348, 20357, 20349, 20352, 8233 20359, 20342, 20340, 20361, 20356, 20343, 20300, 20375, 20330, 20378, 8234 20345, 20353, 20344, 20368, 20380, 20372, 20382, 20370, 20354, 20373, 8235 20331, 20334, 20894, 20924, 20926, 21045, {f: 2, c: 21042}, 21062, 21041, 8236 21180, {f: 2, c: 21258}, 21308, 21394, 21396, 21639, 21631, 21633, 21649, 8237 21634, 21640, 21611, 21626, 21630, 21605, 21612, 21620, 21606, 21645, 8238 21615, 21601, 21600, 21656, 21603, 21607, 21604, 22263, 22265, 22383, 8239 22386, 22381, 22379, 22385, 22384, 22390, 22400, 22389, 22395, 8240 {f: 2, c: 22387}, 22370, 22376, 22397, 22796, 22853, 22965, 22970, 22991, 8241 22990, 22962, 22988, 22977, 22966, 22972, 22979, 22998, 22961, 22973, 8242 22976, 22984, 22964, 22983, 23394, 23397, 23443, 23445, 23620, 23623, 8243 23726, 23716, 23712, 23733, 23727, 23720, 23724, 23711, 23715, 23725, 8244 23714, 23722, 23719, 23709, 23717, 23734, 23728, 23718, 24087, 24084, 8245 24089, 24360, {f: 3, c: 24354}, 24404, 24450, 24446, 24445, 24542, 24549, 8246 24621, 24614, 24601, 24626, 24587, 24628, 24586, 24599, 24627, 24602, 8247 24606, 24620, 24610, 24589, 24592, 24622, 24595, 24593, 24588, 24585, 8248 24604, 25108, 25149, 25261, 25268, 25297, 25278, 25258, 25270, 25290, 8249 25262, 25267, 25263, 25275, 25257, 25264, 25272, 25917, 26024, 26043, 8250 26121, 26108, 26116, 26130, 26120, 26107, 26115, 26123, 26125, 26117, 8251 26109, 26129, 26128, 26358, 26378, 26501, 26476, 26510, 26514, 26486, 8252 26491, 26520, 26502, 26500, 26484, 26509, 26508, 26490, 26527, 26513, 8253 26521, 26499, 26493, 26497, {f: 2, c: 26488}, 26516, 27429, 27520, 27518, 8254 27614, 27677, 27795, 27884, 27883, 27886, 27865, 27830, 27860, 27821, 8255 27879, 27831, 27856, 27842, 27834, 27843, 27846, 27885, 27890, 27858, 8256 27869, 27828, 27786, 27805, 27776, 27870, 27840, 27952, 27853, 27847, 8257 27824, 27897, 27855, 27881, 27857, 28820, 28824, 28805, 28819, 28806, 8258 28804, 28817, 28822, 28802, 28826, 28803, 29290, 29398, 29387, 29400, 8259 29385, 29404, 29394, 29396, 29402, 29388, 29393, 29604, 29601, 29613, 8260 29606, 29602, 29600, 29612, 29597, 29917, 29928, {f: 2, c: 30015}, 30014, 8261 30092, 30104, 30383, 30451, 30449, 30448, 30453, 30712, 30716, 30713, 8262 30715, 30714, 30711, 31042, 31039, 31173, 31352, 31355, 31483, 31861, 8263 31997, 32821, 32911, 32942, 32931, 32952, 32949, 32941, 33312, 33440, 8264 33472, 33451, 33434, 33432, 33435, 33461, 33447, 33454, 33468, 33438, 8265 33466, 33460, 33448, 33441, 33449, 33474, 33444, 33475, 33462, 33442, 8266 34416, 34415, {f: 2, c: 34413}, 35926, 36818, 36811, 36819, 36813, 36822, 8267 36821, 36823, 37042, 37044, 37039, 37043, 37040, 38457, 38461, 38460, 8268 38458, 38467, 20429, 20421, 20435, 20402, 20425, 20427, 20417, 20436, 8269 20444, 20441, [20411, 60346], 20403, 20443, 20423, 20438, 20410, 20416, 8270 20409, 20460, 21060, 21065, 21184, 21186, 21309, 21372, 21399, 21398, 8271 21401, 21400, 21690, 21665, 21677, 21669, 21711, 21699, 33549, 21687, 8272 21678, 21718, 21686, {f: 2, c: 21701}, 21664, 21616, 21692, 21666, 21694, 8273 21618, 21726, 21680, 22453, {f: 2, c: 22430}, 22436, 22412, 22423, 22429, 8274 22427, 22420, 22424, 22415, 22425, 22437, 22426, 22421, 22772, 22797, 8275 22867, 23009, 23006, 23022, 23040, 23025, 23005, 23034, 23037, 23036, 8276 23030, 23012, 23026, 23031, 23003, 23017, 23027, 23029, 23008, 23038, 8277 23028, 23021, 23464, 23628, 23760, 23768, 23756, 23767, 23755, 23771, 8278 23774, 23770, 23753, 23751, 23754, 23766, {f: 2, c: 23763}, 23759, 23752, 8279 23750, 23758, 23775, 23800, 24057, {f: 3, c: 24097}, 24096, 24100, 24240, 8280 24228, 24226, 24219, 24227, 24229, 24327, 24366, 24406, 24454, 24631, 8281 24633, 24660, 24690, 24670, 24645, 24659, 24647, 24649, 24667, 24652, 8282 24640, 24642, 24671, 24612, 24644, 24664, 24678, 24686, {f: 2, c: 25154}, 8283 25295, 25357, 25355, 25333, 25358, 25347, 25323, 25337, 25359, 25356, 8284 25336, 25334, 25344, {f: 2, c: 25363}, 25338, 25365, 25339, 25328, 25921, 8285 25923, 26026, 26047, 26166, 26145, 26162, 26165, 26140, 26150, 26146, 8286 26163, 26155, 26170, 26141, 26164, 26169, 26158, {f: 2, c: 26383}, 26561, 8287 26610, 26568, 26554, 26588, 26555, 26616, 26584, 26560, 26551, 26565, 8288 26603, 26596, 26591, 26549, 26573, 26547, 26615, 26614, 26606, 26595, 8289 26562, 26553, 26574, 26599, 26608, 26546, 26620, 26566, 26605, 26572, 8290 26542, 26598, 26587, 26618, {f: 2, c: 26569}, 26563, 26602, 26571, 27432, 8291 27522, 27524, 27574, 27606, 27608, 27616, {f: 2, c: 27680}, 27944, 27956, 8292 27949, 27935, 27964, 27967, 27922, 27914, 27866, 27955, 27908, 27929, 8293 27962, 27930, 27921, 27904, 27933, 27970, 27905, 27928, 27959, 27907, 8294 27919, 27968, 27911, 27936, 27948, 27912, 27938, 27913, 27920, 28855, 8295 28831, 28862, 28849, 28848, 28833, {f: 2, c: 28852}, 28841, 29249, 8296 {f: 2, c: 29257}, 29292, 29296, 29299, 29294, 29386, 29412, 29416, 29419, 8297 29407, 29418, 29414, 29411, 29573, 29644, 29634, 29640, 29637, 29625, 8298 29622, 29621, 29620, 29675, 29631, 29639, 29630, 29635, 29638, 29624, 8299 29643, 29932, 29934, 29998, {f: 2, c: 30023}, 30119, 30122, 30329, 30404, 8300 30472, {f: 3, c: 30467}, 30474, 30455, 30459, 30458, {f: 2, c: 30695}, 8301 30726, {f: 2, c: 30737}, 30725, 30736, 30735, 30734, [30729, 58095], 30723, 8302 30739, 31050, 31052, 31051, 31045, 31044, 31189, 31181, 31183, 31190, 8303 31182, 31360, 31358, 31441, {f: 2, c: 31488}, 31866, {f: 2, c: 31864}, 8304 {f: 3, c: 31871}, 32003, 32008, 32001, 32600, 32657, 32653, 32702, 32775, 8305 {f: 2, c: 32782}, 32788, 32823, 32984, 32967, 32992, 32977, 32968, 32962, 8306 32976, 32965, 32995, 32985, 32988, 32970, 32981, 32969, 32975, 32983, 8307 32998, 32973, 33279, 33313, 33428, 33497, 33534, 33529, 33543, 33512, 8308 33536, 33493, 33594, 33515, 33494, 33524, 33516, 33505, 33522, 33525, 8309 33548, 33531, 33526, 33520, 33514, 33508, 33504, 33530, 33523, 33517, 8310 34423, 34420, 34428, 34419, 34881, 34894, 34919, 34922, 34921, 35283, 8311 35332, 35335, 36210, 36835, 36833, 36846, 36832, 37105, 37053, 37055, 8312 37077, 37061, 37054, 37063, 37067, 37064, [37332, 60294], 37331, 38484, 8313 38479, 38481, 38483, 38474, 38478, 20510, 20485, 20487, 20499, 20514, 8314 20528, 20507, 20469, 20468, 20531, 20535, 20524, {f: 2, c: 20470}, 20503, 8315 20508, 20512, 20519, 20533, 20527, 20529, 20494, 20826, 20884, 20883, 8316 20938, {f: 2, c: 20932}, 20936, 20942, 21089, 21082, 21074, 8317 {f: 2, c: 21086}, 21077, 21090, 21197, 21262, 21406, 21798, 21730, 21783, 8318 21778, 21735, 21747, 21732, 21786, 21759, 21764, 21768, 21739, 21777, 8319 21765, 21745, 21770, 21755, {f: 2, c: 21751}, 21728, 21774, 21763, 21771, 8320 {f: 2, c: 22273}, 22476, 22578, 22485, 22482, 22458, 22470, 22461, 22460, 8321 22456, 22454, 22463, 22471, 22480, 22457, 22465, 22798, 22858, 23065, 8322 23062, {f: 2, c: 23085}, 23061, 23055, 23063, 23050, 23070, 23091, 23404, 8323 23463, 23469, 23468, 23555, 23638, 23636, 23788, 23807, 23790, 23793, 8324 23799, 23808, 23801, 24105, 24104, 24232, 24238, 24234, 24236, 24371, 8325 24368, 24423, 24669, 24666, 24679, 24641, 24738, 24712, 24704, 24722, 8326 24705, 24733, 24707, 24725, 24731, 24727, 24711, 24732, 24718, 25113, 8327 25158, 25330, 25360, 25430, 25388, {f: 2, c: 25412}, 25398, 25411, 25572, 8328 25401, 25419, 25418, 25404, 25385, 25409, 25396, 25432, 25428, 25433, 8329 25389, 25415, 25395, 25434, 25425, 25400, 25431, 25408, 25416, 25930, 8330 25926, 26054, {f: 2, c: 26051}, 26050, 26186, 26207, 26183, 26193, 8331 {f: 2, c: 26386}, 26655, 26650, 26697, {f: 2, c: 26674}, 26683, 26699, 8332 26703, 26646, 26673, 26652, 26677, 26667, 26669, 26671, 26702, 26692, 8333 26676, 26653, 26642, 26644, 26662, 26664, 26670, 26701, 26682, 26661, 8334 26656, 27436, 27439, 27437, 27441, 27444, 27501, 32898, 27528, 27622, 8335 27620, 27624, 27619, 27618, 27623, 27685, 28026, {f: 2, c: 28003}, 28022, 8336 27917, 28001, 28050, 27992, 28002, 28013, 28015, 28049, 28045, 28143, 8337 28031, 28038, 27998, [28007, 59078], 28000, 28055, 28016, 28028, 27999, 8338 28034, 28056, 27951, 28008, 28043, 28030, 28032, 28036, 27926, 28035, 8339 28027, 28029, 28021, 28048, 28892, 28883, 28881, 28893, 28875, 32569, 8340 28898, 28887, 28882, 28894, 28896, 28884, 28877, {f: 3, c: 28869}, 28890, 8341 28878, 28897, 29250, 29304, 29303, 29302, 29440, 29434, 29428, 29438, 8342 29430, 29427, 29435, 29441, 29651, 29657, 29669, 29654, 29628, 29671, 8343 29667, 29673, 29660, 29650, 29659, 29652, 29661, 29658, {f: 2, c: 29655}, 8344 29672, {f: 2, c: 29918}, {f: 2, c: 29940}, 29985, 30043, 30047, 30128, 8345 30145, 30139, 30148, 30144, 30143, 30134, 30138, 30346, 30409, 30493, 8346 30491, 30480, 30483, 30482, 30499, 30481, 30485, {f: 2, c: 30489}, 30498, 8347 30503, 30755, 30764, 30754, 30773, 30767, 30760, 30766, 30763, 30753, 8348 30761, 30771, 30762, 30769, 31060, 31067, 31055, 31068, 31059, 31058, 8349 31057, {f: 2, c: 31211}, 31200, 31214, 31213, 31210, 31196, 31198, 31197, 8350 31366, 31369, 31365, {f: 2, c: 31371}, 31370, 31367, 31448, 31504, 31492, 8351 31507, 31493, 31503, 31496, 31498, 31502, 31497, 31506, 31876, 31889, 8352 31882, 31884, 31880, 31885, 31877, 32030, 32029, 32017, 32014, 32024, 8353 32022, 32019, 32031, 32018, 32015, 32012, 32604, 32609, 32606, 32608, 8354 32605, 32603, 32662, 32658, 32707, 32706, 32704, 32790, 32830, 32825, 8355 33018, 33010, 33017, 33013, 33025, 33019, 33024, 33281, 33327, 33317, 8356 33587, 33581, 33604, 33561, 33617, 33573, 33622, 33599, 33601, 33574, 8357 33564, 33570, 33602, 33614, 33563, 33578, 33544, 33596, 33613, 33558, 8358 33572, 33568, 33591, 33583, 33577, 33607, 33605, 33612, 33619, 33566, 8359 33580, 33611, 33575, 33608, 34387, 34386, 34466, 34472, 34454, 34445, 8360 34449, 34462, 34439, 34455, 34438, 34443, 34458, 34437, 34469, 34457, 8361 34465, 34471, 34453, 34456, 34446, 34461, 34448, 34452, {f: 2, c: 34883}, 8362 34925, {f: 2, c: 34933}, 34930, 34944, 34929, 34943, 34927, 34947, 34942, 8363 34932, 34940, 35346, 35911, 35927, 35963, 36004, 36003, 36214, 36216, 8364 36277, 36279, 36278, 36561, 36563, 36862, 36853, 36866, 36863, 36859, 8365 36868, 36860, 36854, 37078, 37088, {f: 2, c: 37081}, 37091, 37087, 37093, 8366 37080, 37083, 37079, 37084, 37092, 37200, {f: 2, c: 37198}, 37333, 37346, 8367 37338, 38492, 38495, 38588, 39139, [12221, 39647], [12223, 39727], 20095, 8368 20592, 20586, 20577, 20574, 20576, 20563, 20555, 20573, 20594, 20552, 8369 20557, 20545, 20571, 20554, 20578, 20501, 20549, 20575, 20585, 20587, 8370 {f: 2, c: 20579}, 20550, 20544, 20590, 20595, 20567, 20561, 20944, 21099, 8371 21101, 21100, 21102, 21206, 21203, 21293, 21404, {f: 2, c: 21877}, 21820, 8372 21837, 21840, 21812, 21802, 21841, 21858, 21814, 21813, 21808, 21842, 8373 21829, 21772, 21810, 21861, 21838, 21817, 21832, 21805, 21819, 21824, 8374 21835, 22282, 22279, 22523, 22548, 22498, 22518, 22492, 22516, 22528, 8375 22509, 22525, 22536, 22520, 22539, 22515, 22479, 22535, 22510, 22499, 8376 22514, 22501, 22508, 22497, 22542, 22524, 22544, 22503, 22529, 22540, 8377 22513, 22505, 22512, 22541, 22532, 22876, 23136, 23128, 23125, 8378 [23143, 60437], 23134, 23096, 23093, 23149, 23120, 23135, 23141, 23148, 8379 23123, 23140, 23127, 23107, 23133, 23122, 23108, 23131, 23112, 23182, 8380 23102, 23117, 23097, 23116, 23152, 23145, 23111, 23121, 23126, 23106, 8381 23132, 23410, 23406, 23489, 23488, 23641, 23838, 23819, 23837, 23834, 8382 23840, 23820, 23848, 23821, 23846, 23845, 23823, 23856, 23826, 23843, 8383 23839, 23854, 24126, 24116, 24241, 24244, 24249, {f: 2, c: 24242}, 24374, 8384 24376, 24475, 24470, 24479, 24714, 24720, 24710, 24766, 24752, 24762, 8385 {f: 2, c: 24787}, 24783, 24804, 24793, 24797, 24776, 24753, 24795, 24759, 8386 24778, 24767, 24771, 24781, 24768, 25394, 25445, 25482, 25474, 25469, 8387 25533, 25502, 25517, 25501, 25495, 25515, 25486, 25455, 25479, 25488, 8388 25454, 25519, 25461, 25500, 25453, 25518, 25468, 25508, 25403, 25503, 8389 25464, 25477, 25473, 25489, 25485, 25456, 25939, 26061, 26213, 26209, 8390 26203, 26201, 26204, 26210, 26392, 26745, 26759, 26768, 26780, 8391 {f: 2, c: 26733}, 26798, 26795, 26966, 26735, 26787, 26796, 26793, 26741, 8392 26740, 26802, 26767, 26743, 26770, 26748, 26731, 26738, 26794, 26752, 8393 26737, 26750, 26779, 26774, 26763, 26784, 26761, 26788, 26744, 26747, 8394 26769, 26764, 26762, 26749, 27446, 27443, {f: 2, c: 27447}, 27537, 27535, 8395 {f: 2, c: 27533}, 27532, 27690, 28096, 28075, 28084, 28083, 28276, 28076, 8396 28137, 28130, 28087, 28150, 28116, 28160, 28104, 28128, 28127, 28118, 8397 28094, 28133, {f: 2, c: 28124}, 28123, 28148, 28106, 28093, 28141, 28144, 8398 28090, 28117, 28098, 28111, 28105, 28112, 28146, 28115, 28157, 28119, 8399 28109, 28131, 28091, 28922, 28941, 28919, 28951, 28916, 28940, 28912, 8400 28932, 28915, 28944, 28924, 28927, 28934, 28947, 28928, 28920, 28918, 8401 28939, 28930, 28942, 29310, {f: 2, c: 29307}, 29311, 29469, 29463, 29447, 8402 29457, 29464, 29450, 29448, 29439, 29455, 29470, 29576, 29686, 29688, 8403 29685, 29700, 29697, 29693, 29703, 29696, 29690, 29692, 29695, 29708, 8404 29707, 29684, 29704, 30052, 30051, 30158, 30162, 30159, {f: 2, c: 30155}, 8405 30161, 30160, 30351, 30345, 30419, 30521, 30511, 30509, {f: 2, c: 30513}, 8406 30516, 30515, 30525, 30501, 30523, 30517, 30792, 30802, 30793, 30797, 8407 30794, 30796, 30758, 30789, 30800, 31076, 31079, {f: 2, c: 31081}, 31075, 8408 31083, 31073, 31163, 31226, 31224, {f: 2, c: 31222}, 31375, 31380, 31376, 8409 31541, 31547, 31540, 31525, 31536, 31522, 31524, 31539, 31512, 31530, 8410 31517, 31537, 31531, 31533, 31535, 31538, 31544, 31514, 31523, 31892, 8411 31896, 31894, 31907, 32053, 32061, 32056, 32054, 32058, 32069, 32044, 8412 32041, 32065, 32071, {f: 2, c: 32062}, 32074, 32059, 32040, 32611, 32661, 8413 {f: 2, c: 32668}, 32667, {f: 2, c: 32714}, 32717, {f: 2, c: 32720}, 32711, 8414 32719, 32713, 32799, 32798, 32795, 32839, 32835, 32840, 33048, 33061, 8415 33049, 33051, 33069, 33055, 33068, 33054, 33057, 33045, 33063, 33053, 8416 33058, 33297, 33336, 33331, 33338, 33332, 33330, 33396, 33680, 33699, 8417 33704, 33677, 33658, 33651, 33700, 33652, 33679, 33665, 33685, 33689, 8418 33653, 33684, 33705, 33661, 33667, 33676, 33693, 33691, 33706, 33675, 8419 33662, 33701, 33711, 33672, 33687, 33712, 33663, 33702, 33671, 33710, 8420 33654, 34393, 34390, 34495, 34487, 34498, 34497, 34501, 34490, 34480, 8421 34504, 34489, 34483, 34488, 34508, 34484, {f: 2, c: 34491}, 34499, 8422 {f: 2, c: 34493}, 34898, 34953, 34965, 34984, 34978, 34986, 34970, 34961, 8423 34977, 34975, 34968, 34983, 34969, 34971, 34967, 34980, 34988, 34956, 8424 34963, 34958, 35202, 35286, 35289, 35285, 35376, 35367, 35372, 35358, 8425 35897, 35899, {f: 2, c: 35932}, 35965, 36005, 36221, 36219, 36217, 36284, 8426 36290, 36281, 36287, 36289, 36568, 36574, 36573, 36572, 36567, 8427 {f: 2, c: 36576}, 36900, 36875, 36881, 36892, 36876, 36897, 37103, 37098, 8428 37104, 37108, {f: 2, c: 37106}, 37076, {f: 2, c: 37099}, 37097, 37206, 8429 37208, 37210, 37203, 37205, 37356, 37364, 37361, 37363, 37368, 37348, 8430 37369, {f: 2, c: 37354}, 37367, 37352, 37358, 38266, 38278, 38280, 38524, 8431 38509, 38507, 38513, 38511, 38591, 38762, 38916, 39141, 39319, 20635, 8432 20629, 20628, 20638, 20619, 20643, 20611, 20620, 20622, 20637, 20584, 8433 20636, 20626, 20610, 20615, 20831, 20948, 21266, 21265, 21412, 21415, 8434 21905, 21928, 21925, 21933, 21879, 22085, 21922, 21907, 21896, 21903, 8435 21941, 21889, 21923, 21906, 21924, 21885, 21900, 21926, 21887, 21909, 8436 21921, 21902, 22284, 22569, 22583, 22553, 22558, 22567, 22563, 22568, 8437 22517, 22600, 22565, 22556, 22555, 22579, 22591, 22582, 22574, 22585, 8438 22584, 22573, 22572, 22587, 22881, 23215, 23188, 23199, 23162, 23202, 8439 23198, 23160, 23206, 23164, 23205, 23212, 23189, 23214, 23095, 23172, 8440 23178, 23191, 23171, 23179, 23209, 23163, 23165, 23180, 23196, 23183, 8441 23187, 23197, 23530, 23501, 23499, 23508, 23505, 23498, 23502, 23564, 8442 23600, 23863, 23875, 23915, 23873, 23883, 23871, 23861, 23889, 23886, 8443 23893, 23859, 23866, 23890, 23869, 23857, 23897, 23874, 23865, 23881, 8444 23864, 23868, 23858, 23862, 23872, 23877, 24132, 24129, [24408, 57673], 8445 24486, 24485, 24491, 24777, 24761, 24780, 24802, 24782, 24772, 24852, 8446 24818, 24842, 24854, 24837, 24821, 24851, 24824, 24828, 24830, 24769, 8447 24835, 24856, 24861, 24848, 24831, 24836, 24843, 25162, 25492, 25521, 8448 25520, 25550, 25573, 25576, 25583, 25539, 25757, 25587, 25546, 25568, 8449 25590, 25557, 25586, 25589, 25697, 25567, 25534, 25565, 25564, 25540, 8450 25560, 25555, 25538, 25543, 25548, 25547, 25544, 25584, 25559, 25561, 8451 25906, 25959, 25962, 25956, 25948, 25960, 25957, 25996, {f: 2, c: 26013}, 8452 26030, 26064, 26066, 26236, 26220, 26235, 26240, 26225, 26233, 26218, 8453 26226, 26369, 26892, 26835, 26884, 26844, 26922, 26860, 26858, 26865, 8454 26895, 26838, 26871, 26859, 26852, 26870, 26899, 26896, 26867, 26849, 8455 26887, 26828, 26888, 26992, 26804, 26897, 26863, 26822, 26900, 26872, 8456 26832, 26877, 26876, 26856, 26891, 26890, 26903, 26830, 26824, 8457 {f: 2, c: 26845}, 26854, 26868, 26833, 26886, 26836, 26857, 26901, 26917, 8458 26823, 27449, 27451, 27455, 27452, 27540, 27543, 27545, 27541, 27581, 8459 27632, {f: 2, c: 27634}, 27696, 28156, {f: 2, c: 28230}, 28191, 28233, 8460 28296, {f: 2, c: 28220}, 28229, 28258, 28203, 28223, 28225, 28253, 28275, 8461 28188, 28211, 28235, 28224, 28241, 28219, 28163, 28206, 28254, 28264, 8462 28252, 28257, 28209, 28200, 28256, 28273, 28267, 28217, 28194, 28208, 8463 28243, 28261, 28199, 28280, 28260, 28279, 28245, 28281, 28242, 28262, 8464 {f: 2, c: 28213}, 28250, 28960, 28958, 28975, 28923, 28974, 28977, 28963, 8465 28965, 28962, 28978, 28959, 28968, 28986, 28955, 29259, 29274, 8466 {f: 2, c: 29320}, 29318, 29317, 29323, 29458, 29451, 29488, 29474, 29489, 8467 29491, 29479, 29490, 29485, 29478, 29475, 29493, 29452, 29742, 29740, 8468 29744, 29739, 29718, 29722, 29729, 29741, 29745, 29732, 29731, 29725, 8469 29737, 29728, 29746, 29947, 29999, 30063, 30060, 30183, 30170, 30177, 8470 30182, 30173, 30175, 30180, 30167, 30357, 30354, 30426, {f: 2, c: 30534}, 8471 30532, 30541, 30533, 30538, 30542, {f: 2, c: 30539}, 30686, 30700, 30816, 8472 {f: 2, c: 30820}, 30812, 30829, 30833, 30826, 30830, 30832, 30825, 30824, 8473 30814, 30818, 31092, 31091, 31090, 31088, 31234, 31242, 31235, 31244, 8474 31236, 31385, 31462, 31460, 31562, 31559, 31556, 31560, 31564, 31566, 8475 31552, 31576, 31557, 31906, 31902, 31912, 31905, 32088, 32111, 32099, 8476 32083, 32086, 32103, 32106, 32079, 32109, 32092, 32107, 32082, 32084, 8477 32105, 32081, 32095, 32078, {f: 2, c: 32574}, {f: 2, c: 32613}, 32674, 8478 {f: 2, c: 32672}, 32727, 32849, {f: 2, c: 32847}, 33022, 32980, 33091, 8479 33098, 33106, 33103, 33095, 33085, 33101, 33082, 33254, 33262, 8480 {f: 3, c: 33271}, 33284, {f: 2, c: 33340}, 33343, 33397, 33595, 8481 [33743, 60382], 33785, 33827, 33728, 33768, 33810, 33767, 33764, 33788, 8482 33782, 33808, 33734, 33736, 33771, 33763, 33727, 33793, 33757, 33765, 8483 33752, 33791, 33761, 33739, 33742, 33750, 33781, 33737, 33801, 8484 [33807, 58332], 33758, 33809, 33798, 33730, 33779, 33749, 33786, 33735, 8485 33745, 33770, 33811, 33690, 33731, 33772, 33774, 33732, 33787, 33751, 8486 33762, 33819, 33755, 33790, 34520, 34530, 34534, 34515, 34531, 34522, 8487 34538, 34525, 34539, 34524, 34540, 34537, 34519, 34536, 34513, 34888, 8488 34902, 34901, 35002, 35031, 35001, 35000, 35008, 35006, 34998, 35004, 8489 34999, 35005, 34994, 35073, 35017, 35221, 35224, 35223, 35293, 8490 {f: 2, c: 35290}, 35406, 35405, 35385, 35417, 35392, {f: 2, c: 35415}, 8491 {f: 2, c: 35396}, 35410, 35400, 35409, 35402, 35404, 35407, 35935, 35969, 8492 35968, 36026, 36030, 36016, 36025, 36021, 36228, 36224, 36233, 36312, 8493 36307, 36301, 36295, 36310, 36316, 36303, 36309, 36313, 36296, 36311, 8494 36293, 36591, 36599, 36602, 36601, 36582, 36590, 36581, 36597, 8495 {f: 2, c: 36583}, 36598, 36587, 36593, 36588, 36596, 36585, 36909, 36916, 8496 36911, 37126, 37164, [37124, 60367], 37119, 37116, 37128, 37113, 37115, 8497 37121, 37120, 37127, 37125, 37123, 37217, 37220, 37215, 37218, 37216, 8498 37377, 37386, 37413, 37379, 37402, 37414, 37391, 37388, 37376, 37394, 8499 37375, 37373, 37382, 37380, 37415, 37378, 37404, 37412, 37401, 37399, 8500 37381, 37398, 38267, 38285, 38284, 38288, 38535, 38526, {f: 2, c: 38536}, 8501 38531, 38528, 38594, 38600, 38595, 38641, 38640, 38764, 38768, 38766, 8502 38919, 39081, 39147, 40166, [12235, 40697], {f: 2, c: 20099}, 20150, 20669, 8503 20671, 20678, 20654, 20676, 20682, 20660, 20680, 20674, 20656, 20673, 8504 20666, 20657, 20683, 20681, 20662, 20664, 20951, 21114, 21112, 8505 {f: 2, c: 21115}, 21955, 21979, 21964, 21968, 21963, 21962, 21981, 8506 [21952, 64013], 21972, 21956, 21993, 21951, 21970, 21901, 21967, 21973, 8507 21986, 21974, 21960, 22002, 21965, 21977, 21954, 22292, 22611, 22632, 8508 22628, 22607, 22605, 22601, 22639, 22613, 22606, 22621, 22617, 22629, 8509 22619, 22589, 22627, 22641, 22780, 23239, 23236, 23243, 23226, 23224, 8510 23217, 23221, 23216, 23231, 23240, 23227, 23238, 23223, 23232, 23242, 8511 23220, 23222, 23245, 23225, 23184, 23510, {f: 2, c: 23512}, 23583, 23603, 8512 23921, 23907, 23882, 23909, 23922, 23916, 23902, 23912, 23911, 23906, 8513 24048, 24143, 24142, 24138, 24141, 24139, 24261, 24268, 24262, 24267, 8514 24263, 24384, 24495, 24493, 24823, {f: 2, c: 24905}, 24875, 24901, 24886, 8515 24882, 24878, 24902, 24879, 24911, 24873, 24896, 25120, 37224, 25123, 8516 25125, 25124, 25541, 25585, 25579, 25616, 25618, 25609, 25632, 25636, 8517 25651, 25667, 25631, 25621, 25624, 25657, 25655, {f: 2, c: 25634}, 25612, 8518 25638, 25648, 25640, 25665, 25653, 25647, 25610, 25626, 25664, 25637, 8519 25639, 25611, 25575, 25627, 25646, 25633, 25614, 25967, 26002, 26067, 8520 26246, 26252, 26261, 26256, 26251, 26250, 26265, 26260, 26232, 26400, 8521 26982, 26975, 26936, 26958, 26978, 26993, 26943, 26949, 26986, 26937, 8522 26946, 26967, 26969, 27002, {f: 2, c: 26952}, 26933, 26988, 26931, 26941, 8523 26981, 26864, 27000, 26932, 26985, 26944, 26991, 26948, 26998, 26968, 8524 26945, 26996, 26956, 26939, 26955, 26935, 26972, 26959, 26961, 26930, 8525 26962, 26927, 27003, 26940, 27462, 27461, 27459, 27458, 27464, 27457, 8526 27547, {f: 2, c: 27643}, 27641, {f: 2, c: 27639}, 28315, 28374, 28360, 8527 28303, 28352, 28319, {f: 2, c: 28307}, 28320, 28337, 28345, 28358, 28370, 8528 28349, 28353, 28318, 28361, 28343, 28336, 28365, 28326, 28367, 28338, 8529 28350, 28355, 28380, 28376, 28313, 28306, 28302, 28301, 28324, 28321, 8530 28351, 28339, 28368, 28362, 28311, 28334, 28323, 28999, 29012, 29010, 8531 29027, 29024, 28993, 29021, [29026, 61080], 29042, 29048, 29034, 29025, 8532 28994, 29016, 28995, 29003, 29040, 29023, 29008, 29011, 28996, 29005, 8533 29018, 29263, 29325, 29324, 29329, 29328, 29326, 29500, 29506, 29499, 8534 29498, 29504, 29514, 29513, 29764, {f: 2, c: 29770}, 29778, 29777, 29783, 8535 29760, {f: 2, c: 29775}, 29774, 29762, 29766, 29773, 29780, 29921, 29951, 8536 29950, 29949, 29981, 30073, 30071, 27011, 30191, 30223, 30211, 30199, 8537 30206, 30204, [30201, 60782], 30200, 30224, 30203, 30198, 30189, 30197, 8538 30205, 30361, 30389, 30429, 30549, {f: 2, c: 30559}, 30546, 30550, 30554, 8539 30569, 30567, 30548, 30553, 30573, 30688, 30855, 30874, 30868, 30863, 8540 30852, 30869, {f: 2, c: 30853}, 30881, 30851, 30841, 30873, 30848, 30870, 8541 30843, 31100, 31106, 31101, 31097, 31249, {f: 2, c: 31256}, 31250, 31255, 8542 31253, 31266, 31251, 31259, 31248, 31395, 31394, 31390, 31467, 31590, 8543 31588, 31597, 31604, 31593, 31602, 31589, 31603, 31601, 31600, 31585, 8544 31608, 31606, 31587, 31922, 31924, 31919, 32136, 32134, 32128, 32141, 8545 32127, 32133, 32122, 32142, 32123, 32131, 32124, 32140, 32148, 32132, 8546 32125, 32146, 32621, 32619, {f: 2, c: 32615}, 32620, 32678, 32677, 32679, 8547 {f: 2, c: 32731}, 32801, 33124, 33120, 33143, 33116, 33129, 33115, 33122, 8548 33138, 26401, 33118, 33142, 33127, 33135, 33092, 33121, 33309, 33353, 8549 33348, 33344, 33346, 33349, 34033, 33855, 33878, 33910, 33913, 33935, 8550 33933, 33893, 33873, 33856, 33926, 33895, 33840, 33869, 33917, 33882, 8551 33881, 33908, 33907, 33885, 34055, 33886, 33847, 33850, 33844, 33914, 8552 33859, 33912, 33842, 33861, 33833, 33753, 33867, 33839, 33858, 33837, 8553 33887, 33904, 33849, 33870, 33868, 33874, 33903, 33989, 33934, 33851, 8554 33863, 33846, 33843, 33896, 33918, 33860, 33835, 33888, 33876, 33902, 8555 33872, 34571, 34564, 34551, 34572, 34554, 34518, 34549, 34637, 34552, 8556 34574, 34569, 34561, 34550, 34573, 34565, 35030, 35019, {f: 2, c: 35021}, 8557 35038, 35035, 35034, 35020, 35024, 35205, 35227, 35295, 35301, 35300, 8558 35297, 35296, 35298, 35292, 35302, 35446, 35462, 35455, 35425, 35391, 8559 35447, 35458, 35460, 35445, 35459, 35457, 35444, 35450, 35900, 35915, 8560 35914, 35941, 35940, 35942, 35974, {f: 2, c: 35972}, 36044, 8561 {f: 2, c: 36200}, 36241, 36236, {f: 2, c: 36238}, 36237, {f: 2, c: 36243}, 8562 36240, 36242, 36336, 36320, 36332, 36337, 36334, 36304, 36329, 36323, 8563 36322, 36327, 36338, 36331, 36340, 36614, 36607, 36609, 36608, 36613, 8564 {f: 2, c: 36615}, 36610, [36619, 60507], 36946, 36927, 36932, 36937, 36925, 8565 37136, 37133, 37135, 37137, 37142, 37140, 37131, 37134, {f: 2, c: 37230}, 8566 37448, 37458, 37424, 37434, 37478, 37427, 37477, 37470, 37507, 37422, 8567 37450, 37446, 37485, 37484, 37455, 37472, 37479, 37487, 37430, 37473, 8568 37488, 37425, 37460, 37475, 37456, 37490, 37454, 37459, 37452, 37462, 8569 37426, 38303, 38300, 38302, 38299, {f: 2, c: 38546}, 38545, 38551, 38606, 8570 38650, 38653, 38648, 38645, 38771, {f: 2, c: 38775}, 38770, 38927, 8571 {f: 2, c: 38925}, 39084, 39158, 39161, 39343, 39346, 39344, 39349, 39597, 8572 39595, 39771, 40170, 40173, 40167, 40576, [12236, 40701], 20710, 20692, 8573 20695, 20712, 20723, 20699, 20714, 20701, 20708, 20691, 20716, 20720, 8574 20719, 20707, 20704, 20952, {f: 2, c: 21120}, 21225, 21227, 21296, 21420, 8575 22055, 22037, 22028, 22034, 22012, 22031, 22044, 22017, 22035, 22018, 8576 22010, 22045, 22020, 22015, 22009, 22665, 22652, 22672, 22680, 22662, 8577 22657, 22655, 22644, 22667, 22650, 22663, 22673, 22670, 22646, 22658, 8578 22664, 22651, 22676, 22671, 22782, 22891, 23260, 23278, 23269, 23253, 8579 23274, 23258, 23277, 23275, 23283, 23266, 23264, 23259, 23276, 23262, 8580 23261, 23257, 23272, 23263, 23415, 23520, 23523, 23651, 23938, 23936, 8581 23933, 23942, 23930, 23937, 23927, 23946, 23945, 23944, 23934, 23932, 8582 23949, 23929, 23935, {f: 2, c: 24152}, 24147, 24280, 24273, 24279, 24270, 8583 24284, 24277, 24281, 24274, 24276, 24388, 24387, 24431, 24502, 24876, 8584 24872, 24897, 24926, 24945, 24947, {f: 2, c: 24914}, 24946, 24940, 24960, 8585 24948, 24916, 24954, 24923, 24933, 24891, 24938, 24929, 24918, 25129, 8586 25127, 25131, 25643, 25677, 25691, 25693, 25716, 25718, {f: 2, c: 25714}, 8587 25725, 25717, 25702, 25766, 25678, 25730, 25694, 25692, 25675, 25683, 8588 25696, 25680, 25727, 25663, 25708, 25707, 25689, 25701, 25719, 25971, 8589 26016, 26273, 26272, 26271, 26373, 26372, 26402, 27057, 27062, 27081, 8590 27040, 27086, 27030, 27056, 27052, 27068, 27025, 27033, 27022, 27047, 8591 27021, 27049, 27070, 27055, 27071, 27076, 27069, 27044, 27092, 27065, 8592 27082, 27034, 27087, 27059, 27027, 27050, 27041, 27038, 27097, 27031, 8593 27024, 27074, 27061, 27045, 27078, 27466, 27469, 27467, {f: 3, c: 27550}, 8594 {f: 2, c: 27587}, 27646, 28366, 28405, 28401, 28419, 28453, 28408, 28471, 8595 28411, 28462, 28425, 28494, {f: 2, c: 28441}, 28455, 28440, 28475, 28434, 8596 28397, 28426, 28470, 28531, 28409, 28398, 28461, 28480, 28464, 28476, 8597 28469, 28395, 28423, 28430, 28483, 28421, 28413, 28406, 28473, 28444, 8598 28412, 28474, 28447, 28429, 28446, 28424, 28449, 29063, 29072, 29065, 8599 29056, 29061, 29058, 29071, 29051, 29062, 29057, 29079, 29252, 29267, 8600 29335, 29333, 29331, 29507, 29517, 29521, 29516, 29794, 29811, 29809, 8601 29813, 29810, 29799, 29806, 29952, {f: 2, c: 29954}, 30077, 30096, 30230, 8602 30216, 30220, 30229, 30225, 30218, 30228, 30392, 30593, 30588, 30597, 8603 30594, 30574, 30592, 30575, 30590, 30595, 30898, 30890, 30900, 30893, 8604 30888, 30846, 30891, 30878, 30885, 30880, 30892, 30882, 30884, 31128, 8605 {f: 2, c: 31114}, 31126, 31125, 31124, 31123, 31127, 31112, 31122, 31120, 8606 31275, 31306, 31280, 31279, 31272, 31270, 31400, {f: 2, c: 31403}, 31470, 8607 31624, 31644, 31626, 31633, 31632, 31638, 31629, 31628, 31643, 31630, 8608 31621, 31640, 21124, 31641, 31652, 31618, 31931, 31935, 31932, 31930, 8609 32167, 32183, 32194, 32163, 32170, 32193, 32192, 32197, 32157, 32206, 8610 32196, 32198, {f: 2, c: 32203}, 32175, 32185, 32150, 32188, 32159, 32166, 8611 32174, 32169, 32161, 32201, 32627, {f: 2, c: 32738}, 32741, 32734, 32804, 8612 32861, 32860, 33161, 33158, 33155, 33159, 33165, 33164, 33163, 33301, 8613 33943, 33956, 33953, 33951, 33978, 33998, 33986, 33964, 33966, 33963, 8614 33977, 33972, 33985, 33997, 33962, 33946, 33969, 34000, 33949, 33959, 8615 33979, 33954, 33940, 33991, 33996, 33947, 33961, 33967, [33960, 58327], 8616 34006, 33944, 33974, 33999, 33952, 34007, 34004, 34002, 34011, 33968, 8617 33937, 34401, 34611, 34595, 34600, 34667, 34624, 34606, 34590, 34593, 8618 34585, 34587, 34627, 34604, 34625, 34622, 34630, 34592, 34610, 34602, 8619 34605, 34620, 34578, 34618, 34609, 34613, 34626, {f: 2, c: 34598}, 34616, 8620 34596, 34586, 34608, 34577, 35063, 35047, {f: 2, c: 35057}, 35066, 35070, 8621 35054, 35068, 35062, 35067, 35056, 35052, 35051, 35229, 35233, 35231, 8622 35230, 35305, 35307, 35304, 35499, 35481, 35467, 35474, 35471, 35478, 8623 35901, {f: 2, c: 35944}, 36053, 36047, 36055, 36246, 36361, 36354, 36351, 8624 36365, 36349, 36362, 36355, 36359, 36358, 36357, 36350, 36352, 36356, 8625 {f: 2, c: 36624}, 36622, 36621, 37155, 37148, 37152, 37154, 37151, 37149, 8626 37146, 37156, 37153, 37147, 37242, 37234, 37241, 37235, 37541, 37540, 8627 37494, 37531, 37498, 37536, 37524, 37546, 37517, 37542, 37530, 37547, 8628 37497, 37527, 37503, 37539, 37614, 37518, 37506, 37525, 37538, 37501, 8629 37512, 37537, 37514, 37510, 37516, 37529, 37543, 37502, 37511, 37545, 8630 37533, 37515, 37421, 38558, 38561, 38655, 38744, 38781, 38778, 38782, 8631 38787, 38784, 38786, 38779, 38788, 38785, 38783, 38862, 38861, 38934, 8632 {f: 2, c: 39085}, 39170, 39168, 39175, 39325, 39324, 39363, 39353, 39355, 8633 39354, 39362, 39357, 39367, 39601, 39651, 39655, {f: 2, c: 39742}, 8634 {f: 2, c: 39776}, 39775, {f: 2, c: 40177}, 40181, 40615, 20735, 20739, 8635 20784, 20728, {f: 2, c: 20742}, 20726, 20734, {f: 2, c: 20747}, 20733, 8636 20746, {f: 2, c: 21131}, 21233, 21231, 22088, 22082, 22092, 22069, 22081, 8637 22090, 22089, 22086, 22104, 22106, 22080, 22067, 22077, 22060, 22078, 8638 22072, 22058, 22074, 22298, 22699, 22685, 22705, 22688, 22691, 22703, 8639 22700, 22693, 22689, 22783, 23295, 23284, 23293, 23287, 23286, 23299, 8640 23288, 23298, 23289, 23297, 23303, 23301, 23311, 23655, 23961, 23959, 8641 23967, 23954, 23970, 23955, 23957, 23968, 23964, 23969, 23962, 23966, 8642 24169, 24157, 24160, 24156, 32243, 24283, 24286, 24289, 24393, 24498, 8643 24971, 24963, 24953, 25009, 25008, 24994, 24969, 24987, 24979, 25007, 8644 25005, 24991, 24978, 25002, 24993, 24973, 24934, 25011, 25133, 25710, 8645 25712, 25750, 25760, 25733, 25751, 25756, 25743, 25739, 25738, 25740, 8646 25763, 25759, 25704, 25777, 25752, 25974, 25978, 25977, 25979, 8647 {f: 2, c: 26034}, 26293, 26288, 26281, 26290, 26295, 26282, 26287, 27136, 8648 27142, 27159, 27109, 27128, 27157, 27121, 27108, 27168, 27135, 27116, 8649 27106, 27163, 27165, 27134, 27175, 27122, 27118, 27156, 27127, 27111, 8650 27200, 27144, 27110, 27131, 27149, 27132, 27115, 27145, 27140, 27160, 8651 27173, 27151, 27126, 27174, 27143, 27124, 27158, 27473, 27557, 27555, 8652 27554, 27558, 27649, 27648, 27647, 27650, 28481, 28454, 28542, 28551, 8653 28614, 28562, 28557, 28553, 28556, 28514, 28495, 28549, 28506, 28566, 8654 28534, 28524, 28546, 28501, 28530, 28498, 28496, 28503, 28564, 28563, 8655 28509, 28416, 28513, 28523, 28541, 28519, 28560, 28499, 28555, 28521, 8656 28543, 28565, 28515, 28535, 28522, 28539, 29106, 29103, 29083, 29104, 8657 29088, 29082, 29097, 29109, 29085, 29093, 29086, 29092, 29089, 29098, 8658 29084, 29095, 29107, 29336, 29338, 29528, 29522, {f: 3, c: 29534}, 29533, 8659 29531, 29537, 29530, 29529, 29538, 29831, {f: 2, c: 29833}, 29830, 29825, 8660 29821, 29829, 29832, 29820, [29817, 58868], 29960, 29959, 30078, 30245, 8661 30238, 30233, 30237, 30236, 30243, 30234, 30248, 30235, {f: 3, c: 30364}, 8662 30363, 30605, 30607, 30601, 30600, 30925, 30907, 30927, 30924, 30929, 8663 30926, 30932, 30920, {f: 2, c: 30915}, 30921, 31130, 31137, 31136, 31132, 8664 31138, [31131, 59175], 27510, 31289, 31410, 31412, 31411, 31671, 31691, 8665 31678, 31660, 31694, 31663, 31673, 31690, 31669, 31941, 31944, 31948, 8666 31947, 32247, 32219, 32234, 32231, 32215, 32225, 32259, 32250, 32230, 8667 32246, 32241, 32240, 32238, 32223, 32630, 32684, 32688, 32685, 32749, 8668 32747, 32746, 32748, 32742, 32744, 32868, 32871, 33187, 33183, 33182, 8669 33173, 33186, 33177, 33175, 33302, 33359, 33363, 33362, 33360, 33358, 8670 33361, 34084, 34107, 34063, 34048, 34089, 34062, 34057, 34061, 34079, 8671 34058, 34087, 34076, 34043, 34091, 34042, 34056, 34060, 34036, 34090, 8672 34034, 34069, 34039, 34027, 34035, 34044, 34066, 34026, 34025, 34070, 8673 34046, 34088, 34077, 34094, 34050, 34045, 34078, 34038, 34097, 34086, 8674 {f: 2, c: 34023}, 34032, 34031, 34041, 34072, 34080, 34096, 34059, 34073, 8675 34095, 34402, 34646, {f: 2, c: 34659}, 34679, 34785, 34675, 34648, 34644, 8676 34651, 34642, 34657, 34650, 34641, 34654, 34669, 34666, 34640, 34638, 8677 34655, 34653, 34671, 34668, 34682, 34670, 34652, 34661, 34639, 34683, 8678 34677, 34658, 34663, 34665, 34906, 35077, 35084, 35092, 35083, 8679 {f: 3, c: 35095}, 35078, 35094, 35089, 35086, 35081, 35234, 35236, 35235, 8680 35309, 35312, 35308, 35535, 35526, 35512, 35539, 35537, {f: 2, c: 35540}, 8681 35515, 35543, 35518, 35520, 35525, 35544, 35523, 35514, 35517, 35545, 8682 35902, 35917, 35983, 36069, 36063, 36057, 36072, 36058, 36061, 36071, 8683 36256, 36252, 36257, 36251, 36384, 36387, 36389, 36388, 36398, 36373, 8684 36379, 36374, 36369, 36377, {f: 2, c: 36390}, 36372, 36370, 36376, 36371, 8685 36380, 36375, 36378, 36652, 36644, 36632, 36634, 36640, 36643, 8686 {f: 2, c: 36630}, 36979, 36976, 36975, 36967, 36971, 37167, 37163, 8687 {f: 2, c: 37161}, 37170, 37158, 37166, {f: 2, c: 37253}, 37258, 8688 {f: 2, c: 37249}, 37252, 37248, 37584, {f: 2, c: 37571}, 37568, 37593, 8689 37558, 37583, 37617, 37599, 37592, 37609, 37591, 37597, 37580, 37615, 8690 37570, 37608, 37578, 37576, 37582, 37606, 37581, 37589, 37577, 37600, 8691 37598, 37607, 37585, 37587, 37557, 37601, 37669, 37574, 37556, 38268, 8692 38316, 38315, 38318, 38320, 38564, 38562, 38611, 38661, 38664, 38658, 8693 38746, 38794, 38798, 38792, 38864, 38863, 38942, 38941, 38950, 38953, 8694 38952, 38944, 38939, 38951, 39090, 39176, 39162, 39185, 39188, 8695 {f: 2, c: 39190}, 39189, 39388, 39373, 39375, {f: 2, c: 39379}, 39374, 8696 39369, [39382, 60270], 39384, 39371, 39383, 39372, 39603, 39660, 39659, 8697 39667, 39666, 39665, 39750, 39747, 39783, 39796, 39793, 39782, 39798, 8698 39797, 39792, 39784, 39780, 39788, 40188, 40186, 40189, 40191, 40183, 8699 40199, 40192, 40185, 40187, 40200, 40197, 40196, 40579, 40659, 8700 {f: 2, c: 40719}, 20764, 20755, 20759, 20762, 20753, 20958, 21300, 21473, 8701 22128, 22112, 22126, 22131, 22118, 22115, 22125, 22130, 22110, 22135, 8702 22300, 22299, 22728, 22717, 22729, 22719, 22714, 22722, 22716, 22726, 8703 23319, 23321, 23323, 23329, 23316, 23315, 23312, 23318, [23336, 59539], 8704 23322, 23328, 23326, 23535, 23980, 23985, 23977, 23975, 23989, 23984, 8705 23982, 23978, 23976, 23986, 23981, 23983, 23988, {f: 2, c: 24167}, 24166, 8706 24175, 24297, 24295, 24294, 24296, 24293, 24395, 24508, 24507, 24989, 8707 25000, 24982, 25029, 25012, 25030, 25025, 25036, 25018, 25023, 25016, 8708 24972, 25815, 25814, 25808, 25807, 25801, 25789, 25737, 25795, 25819, 8709 25843, 25817, 25907, 25983, 25980, 26018, 26312, 26302, 26304, 8710 {f: 2, c: 26314}, 26319, 26301, 26299, 26298, 26316, 26403, 27188, 27238, 8711 27209, 27239, 27186, 27240, 27198, 27229, 27245, 27254, 27227, 27217, 8712 27176, 27226, 27195, 27199, 27201, 27242, 27236, 27216, 27215, 27220, 8713 27247, 27241, 27232, 27196, 27230, 27222, 27221, {f: 2, c: 27213}, 27206, 8714 27477, 27476, 27478, 27559, {f: 2, c: 27562}, 27592, 27591, 27652, 27651, 8715 27654, 28589, 28619, 28579, 28615, 28604, 28622, 28616, 28510, 28612, 8716 28605, 28574, 28618, 28584, 28676, 28581, 28590, 28602, 28588, 28586, 8717 28623, 28607, 28600, 28578, 28617, 28587, 28621, 28591, 28594, 28592, 8718 29125, 29122, 29119, 29112, 29142, {f: 2, c: 29120}, 29131, 29140, 29130, 8719 29127, 29135, 29117, 29144, 29116, 29126, {f: 2, c: 29146}, 8720 {f: 2, c: 29341}, 29545, {f: 2, c: 29542}, 29548, 29541, 29547, 29546, 8721 29823, 29850, 29856, 29844, 29842, 29845, 29857, 29963, 30080, 30255, 8722 30253, 30257, 30269, 30259, 30268, 30261, 30258, 30256, 30395, 30438, 8723 30618, 30621, 30625, 30620, 30619, {f: 2, c: 30626}, 30613, 30617, 30615, 8724 30941, 30953, 30949, 30954, 30942, 30947, 30939, {f: 2, c: 30945}, 30957, 8725 {f: 2, c: 30943}, 31140, 31300, 31304, 31303, 31414, 31416, 31413, 31409, 8726 31415, 31710, 31715, 31719, 31709, 31701, 31717, 31706, 31720, 31737, 8727 31700, 31722, 31714, 31708, 31723, 31704, 31711, 31954, 31956, 31959, 8728 {f: 2, c: 31952}, 32274, 32289, 32279, 32268, {f: 2, c: 32287}, 32275, 8729 32270, 32284, 32277, 32282, 32290, 32267, 32271, 32278, 32269, 32276, 8730 32293, 32292, 32579, {f: 2, c: 32635}, 32634, 32689, 32751, 32810, 32809, 8731 32876, 33201, 33190, 33198, 33209, 33205, 33195, 33200, 33196, 33204, 8732 33202, 33207, 33191, 33266, {f: 3, c: 33365}, 34134, 34117, 34155, 34125, 8733 34131, 34145, 34136, 34112, 34118, 34148, 34113, 34146, 34116, 34129, 8734 34119, 34147, 34110, 34139, 34161, 34126, 34158, 34165, 34133, 34151, 8735 34144, 34188, 34150, 34141, 34132, 34149, 34156, 34403, 34405, 34404, 8736 34724, 34715, 34703, 34711, 34707, 34706, 34696, 34689, 34710, 34712, 8737 34681, 34695, 34723, 34693, {f: 2, c: 34704}, 34717, 34692, 34708, 34716, 8738 34714, 34697, 35102, 35110, 35120, {f: 2, c: 35117}, 35111, 35121, 35106, 8739 35113, 35107, 35119, 35116, 35103, 35313, 35552, 35554, 35570, 8740 {f: 2, c: 35572}, 35549, 35604, 35556, 35551, 35568, 35528, 35550, 35553, 8741 35560, 35583, 35567, 35579, {f: 2, c: 35985}, 35984, 36085, 36078, 36081, 8742 36080, 36083, 36204, 36206, 36261, 36263, 36403, 36414, 36408, 36416, 8743 36421, 36406, {f: 2, c: 36412}, 36417, 36400, 36415, 36541, [36662, 60329], 8744 36654, 36661, 36658, 36665, 36663, 36660, 36982, 36985, 36987, 36998, 8745 37114, 37171, {f: 2, c: 37173}, 37267, {f: 2, c: 37264}, 37261, 37263, 8746 37671, 37662, 37640, 37663, 37638, 37647, 37754, 37688, 37692, 37659, 8747 37667, 37650, 37633, 37702, 37677, 37646, 37645, 37579, 37661, 37626, 8748 37651, 37625, 37623, 37684, 37634, 37668, 37631, 37673, 37689, 37685, 8749 37674, 37652, 37644, 37643, 37630, 37641, 37632, 37627, 37654, 38332, 8750 38349, 38334, {f: 2, c: 38329}, 38326, 38335, 38325, 38333, 38569, 38612, 8751 38667, 38674, 38672, 38809, 38807, 38804, 38896, 38904, 38965, 38959, 8752 38962, 39204, 39199, 39207, 39209, 39326, 39406, 39404, 39397, 39396, 8753 39408, 39395, 39402, 39401, 39399, 39609, 39615, 39604, 39611, 39670, 8754 39674, 39673, 39671, 39731, 39808, 39813, 39815, 39804, 39806, 39803, 8755 39810, 39827, 39826, 39824, 39802, 39829, 39805, 39816, 40229, 40215, 8756 40224, 40222, 40212, 40233, 40221, 40216, 40226, 40208, 40217, 40223, 8757 40584, {f: 2, c: 40582}, 40622, 40621, {f: 2, c: 40661}, 40698, 40722, 8758 40765, 20774, 20773, 20770, 20772, 20768, 20777, 21236, 22163, 8759 {f: 2, c: 22156}, 22150, 22148, 22147, 22142, 22146, 22143, 22145, 22742, 8760 22740, 22735, 22738, 23341, 23333, 23346, 23331, 23340, 23335, 23334, 8761 23343, 23342, 23419, {f: 2, c: 23537}, 23991, 24172, 24170, 24510, 25027, 8762 25013, 25020, 25063, 25056, 25061, 25060, 25064, 25054, 25839, 25833, 8763 25827, 25835, 25828, 25832, 25985, 25984, 26038, 26074, 26322, 27277, 8764 27286, 27265, 27301, 27273, 27295, 27291, 27297, 27294, 27271, 27283, 8765 27278, 27285, 27267, 27304, 27300, 27281, 27263, 27302, 27290, 27269, 8766 27276, 27282, 27483, 27565, 27657, 28620, 28585, 28660, 28628, 28643, 8767 28636, 28653, 28647, 28646, 28638, 28658, 28637, 28642, 28648, 29153, 8768 29169, 29160, 29170, 29156, 29168, 29154, 29555, {f: 2, c: 29550}, 29847, 8769 29874, 29867, 29840, 29866, 29869, 29873, 29861, 29871, {f: 3, c: 29968}, 8770 29967, 30084, 30275, {f: 2, c: 30280}, 30279, 30372, 30441, 30645, 30635, 8771 30642, 30647, 30646, 30644, 30641, 30632, 30704, 30963, 30973, 30978, 8772 {f: 2, c: 30971}, 30975, 30962, 30981, 30969, 30974, 30980, 31147, 31144, 8773 31324, 31323, 31318, 31320, 31316, 31322, 31422, {f: 2, c: 31424}, 31749, 8774 31759, 31730, 31744, 31743, 31739, 31758, 31732, 31755, 31731, 31746, 8775 31753, 31747, 31745, 31736, 31741, [31750, 58176], {f: 2, c: 31728}, 31760, 8776 31754, 31976, 32301, 32316, 32322, 32307, 38984, 32312, 32298, 32329, 8777 32320, 32327, 32297, 32332, 32304, 32315, 32310, 32324, 32314, 32581, 8778 32639, 32638, 32637, 32756, 32754, 32812, 33211, 33220, 33228, 33226, 8779 33221, 33223, 33212, 33257, 33371, 33370, 33372, 34179, 34176, 34191, 8780 34215, 34197, 34208, 34187, 34211, 34171, 34212, 34202, 34206, 34167, 8781 34172, 34185, 34209, 34170, 34168, 34135, 34190, 34198, 34182, 34189, 8782 34201, 34205, 34177, 34210, 34178, 34184, 34181, 34169, 34166, 34200, 8783 34192, 34207, 34408, 34750, 34730, 34733, 34757, 34736, 34732, 34745, 8784 34741, 34748, 34734, 34761, 34755, 34754, 34764, 34743, 34735, 34756, 8785 34762, 34740, 34742, 34751, 34744, 34749, 34782, 34738, 35125, 35123, 8786 35132, 35134, 35137, 35154, 35127, 35138, 35245, 35247, 35246, 8787 {f: 2, c: 35314}, 35614, 35608, 35606, 35601, 35589, 35595, 35618, 35599, 8788 35602, 35605, 35591, 35597, 35592, 35590, 35612, 35603, 35610, 35919, 8789 35952, 35954, 35953, 35951, 35989, 35988, 36089, 36207, 36430, 36429, 8790 36435, 36432, 36428, 36423, 36675, 36672, 36997, 36990, 37176, 37274, 8791 37282, 37275, 37273, 37279, 37281, 37277, 37280, 37793, 37763, 37807, 8792 37732, 37718, 37703, 37756, 37720, 37724, 37750, 37705, {f: 2, c: 37712}, 8793 37728, 37741, 37775, 37708, 37738, 37753, 37719, 37717, 37714, 37711, 8794 37745, 37751, 37755, 37729, 37726, 37731, 37735, 37710, 37721, 38343, 8795 38336, 38345, 38339, 38341, 38327, 38574, 38576, 38572, 38688, 38687, 8796 38680, 38685, 38681, 38810, 38817, 38812, 38814, 38813, 38869, 38868, 8797 38897, 38977, 38980, 38986, 38985, 38981, 38979, 39205, {f: 2, c: 39211}, 8798 39210, 39219, 39218, 39215, 39213, 39217, 39216, 39320, 39331, 39329, 8799 39426, 39418, 39412, 39415, 39417, 39416, 39414, 39419, {f: 2, c: 39421}, 8800 39420, 39427, 39614, 39678, 39677, 39681, 39676, 39752, 39834, 39848, 8801 39838, 39835, 39846, 39841, 39845, 39844, 39814, 39842, 39840, 39855, 8802 40243, 40257, 40295, 40246, {f: 2, c: 40238}, 40241, 40248, 40240, 40261, 8803 {f: 2, c: 40258}, 40254, 40247, 40256, 40253, 32757, 40237, 40586, 40585, 8804 40589, 40624, 40648, 40666, 40699, 40703, 40740, 40739, 40738, 40788, 8805 [12245, 40864], 20785, {f: 2, c: 20781}, 22168, 22172, 22167, 22170, 22173, 8806 22169, 22896, 23356, {f: 2, c: 23657}, 24000, {f: 2, c: 24173}, 25048, 8807 25055, {f: 2, c: 25069}, 25073, 25066, 25072, 25067, 25046, 25065, 25855, 8808 25860, 25853, 25848, 25857, 25859, 25852, 26004, 26075, {f: 2, c: 26330}, 8809 26328, 27333, 27321, 27325, 27361, 27334, 27322, {f: 2, c: 27318}, 27335, 8810 27316, 27309, 27486, 27593, 27659, 28679, {f: 2, c: 28684}, 28673, 28677, 8811 28692, 28686, {f: 2, c: 28671}, 28667, 28710, 28668, 28663, 28682, 8812 [29185, 60224], 29183, 29177, 29187, 29181, 29558, 29880, 29888, 29877, 8813 29889, 29886, 29878, 29883, 29890, 29972, 29971, 30300, 30308, 30297, 8814 30288, 30291, 30295, 30298, 30374, 30397, 30444, 30658, 30650, 30988, 8815 {f: 2, c: 30995}, 30985, 30992, 30994, 30993, 31149, 31148, 31327, 31772, 8816 31785, 31769, 31776, 31775, 31789, 31773, 31782, 31784, 31778, 31781, 8817 31792, 32348, 32336, 32342, 32355, 32344, 32354, 32351, 32337, 32352, 8818 32343, 32339, 32693, 32691, {f: 2, c: 32759}, 32885, {f: 2, c: 33233}, 8819 33232, 33375, 33374, 34228, 34246, 34240, 34243, 34242, 34227, 34229, 8820 34237, 34247, 34244, 34239, 34251, 34254, 34248, 34245, 34225, 34230, 8821 34258, 34340, 34232, 34231, 34238, 34409, 34791, 34790, 34786, 34779, 8822 34795, 34794, 34789, 34783, 34803, 34788, 34772, 34780, 34771, 34797, 8823 34776, 34787, 34775, 34777, 34817, 34804, 34792, 34781, 35155, 35147, 8824 35151, 35148, 35142, {f: 2, c: 35152}, 35145, 35626, 35623, 35619, 35635, 8825 35632, 35637, 35655, 35631, 35644, 35646, 35633, 35621, 35639, 35622, 8826 35638, 35630, 35620, 35643, 35645, 35642, 35906, 35957, 35993, 35992, 8827 35991, 36094, 36100, 36098, 36096, 36444, 36450, 36448, 36439, 36438, 8828 36446, 36453, 36455, 36443, 36442, 36449, 36445, 36457, 36436, 8829 {f: 3, c: 36678}, 36683, 37160, {f: 2, c: 37178}, 37182, 37288, 37285, 8830 37287, 37295, 37290, 37813, 37772, 37778, 37815, 37787, 37789, 37769, 8831 37799, 37774, 37802, 37790, 37798, 37781, 37768, 37785, 37791, 37760, 8832 37773, 37809, 37777, 37810, 37796, 37800, 37812, 37795, {f: 2, c: 38354}, 8833 38353, 38579, 38615, 38618, 24002, 38623, 38616, 38621, 38691, 38690, 8834 38693, 38828, 38830, 38824, 38827, 38820, 38826, 38818, 38821, 38871, 8835 38873, 38870, 38872, 38906, {f: 3, c: 38992}, 39096, 39233, 39228, 39226, 8836 39439, 39435, 39433, 39437, 39428, 39441, 39434, 39429, 39431, 39430, 8837 39616, 39644, 39688, {f: 2, c: 39684}, 39721, 39733, 39754, 39756, 39755, 8838 39879, 39878, 39875, 39871, 39873, 39861, 39864, 39891, 39862, 39876, 8839 39865, 39869, 40284, 40275, 40271, 40266, 40283, 40267, 40281, 40278, 8840 40268, 40279, 40274, 40276, 40287, 40280, 40282, 40590, 40588, 40671, 8841 40705, 40704, [40726, 58693], 40741, 40747, 40746, 40745, 40744, 40780, 8842 40789, {f: 2, c: 20788}, 21142, 21239, 21428, 22187, 22189, 8843 {f: 2, c: 22182}, 22186, 22188, 22746, 22749, 22747, 22802, 8844 {f: 3, c: 23357}, 24003, 24176, 24511, 25083, 25863, 25872, 25869, 25865, 8845 25868, 25870, 25988, 26078, 26077, 26334, 27367, 27360, 27340, 27345, 8846 27353, 27339, 27359, 27356, 27344, 27371, 27343, 27341, 27358, 27488, 8847 27568, 27660, 28697, 28711, 28704, 28694, 28715, {f: 3, c: 28705}, 28713, 8848 28695, 28708, 28700, 29196, 29194, 29191, 29186, 29189, {f: 2, c: 29349}, 8849 29348, 29347, 29345, 29899, 29893, 29879, 29891, 29974, 30304, 8850 {f: 2, c: 30665}, 30660, 30705, 31005, 31003, 31009, 31004, 30999, 31006, 8851 31152, {f: 2, c: 31335}, 31795, 31804, 31801, 31788, 31803, 31980, 31978, 8852 32374, 32373, 32376, 32368, 32375, 32367, 32378, 32370, 32372, 32360, 8853 32587, 32586, 32643, 32646, 32695, {f: 2, c: 32765}, 32888, 33239, 33237, 8854 33291, 33380, 33377, 33379, 34283, 34289, 34285, 34265, 34273, 34280, 8855 34266, 34263, 34284, 34290, 34296, 34264, 34271, 34275, 34268, 34257, 8856 34288, 34278, 34287, 34270, 34274, 34816, 34810, 34819, {f: 2, c: 34806}, 8857 34825, 34828, 34827, 34822, 34812, 34824, 34815, 34826, 34818, 35170, 8858 {f: 2, c: 35162}, 35159, 35169, 35164, 35160, 35165, 35161, 35208, 35255, 8859 35254, 35318, 35664, 35656, 35658, 35648, 35667, 35670, 35668, 35659, 8860 35669, 35665, 35650, 35666, 35671, 35907, 35959, 35958, 35994, 8861 {f: 2, c: 36102}, 36105, 36268, 36266, 36269, 36267, 36461, 36472, 36467, 8862 36458, 36463, 36475, 36546, 36690, 36689, {f: 2, c: 36687}, 36691, 36788, 8863 37184, 37183, 37296, 37293, 37854, 37831, 37839, 37826, 37850, 37840, 8864 37881, 37868, 37836, 37849, 37801, 37862, 37834, 37844, 37870, 37859, 8865 37845, 37828, 37838, 37824, 37842, 37797, 37863, 38269, {f: 2, c: 38362}, 8866 38625, 38697, {f: 2, c: 38699}, 38696, 38694, 38835, 38839, 38838, 8867 {f: 3, c: 38877}, 39004, 39001, 39005, 38999, 39103, 39101, 39099, 39102, 8868 39240, 39239, 39235, {f: 2, c: 39334}, 39450, 39445, 39461, 39453, 39460, 8869 39451, 39458, 39456, 39463, 39459, 39454, 39452, 39444, 39618, 39691, 8870 39690, 39694, 39692, 39735, {f: 2, c: 39914}, 39904, 39902, 39908, 39910, 8871 39906, 39920, 39892, 39895, 39916, 39900, 39897, 39909, 39893, 39905, 8872 39898, 40311, 40321, 40330, 40324, 40328, 40305, 40320, 40312, 40326, 8873 {f: 2, c: 40331}, 40317, 40299, {f: 2, c: 40308}, 40304, 40297, 40325, 8874 40307, 40315, 40322, 40303, 40313, 40319, 40327, 40296, 40596, 40593, 8875 40640, 40700, 40749, {f: 2, c: 40768}, 40781, {f: 3, c: 40790}, 21303, 8876 22194, 22197, 22195, 22755, 23365, {f: 2, c: 24006}, {f: 2, c: 24302}, 8877 {f: 2, c: 24512}, 25081, 25879, 25878, 25877, 25875, 26079, 26344, 8878 {f: 2, c: 26339}, 27379, 27376, 27370, 27368, 27385, 27377, 8879 {f: 2, c: 27374}, 28732, 28725, 28719, 28727, 28724, 28721, 28738, 28728, 8880 28735, 28730, 28729, 28714, 28736, 28731, 28723, 28737, {f: 2, c: 29203}, 8881 29352, 29565, 29564, 29882, 30379, 30378, 30398, 30445, 30668, 8882 {f: 2, c: 30670}, 30669, 30706, 31013, 31011, {f: 2, c: 31015}, 31012, 8883 31017, 31154, 31342, {f: 2, c: 31340}, 31479, 31817, 31816, 31818, 31815, 8884 31813, 31982, 32379, 32382, 32385, 32384, 32698, 32767, 32889, 33243, 8885 33241, {f: 2, c: 33384}, 34338, 34303, 34305, 34302, 34331, 34304, 34294, 8886 34308, 34313, 34309, 34316, 34301, 34841, {f: 2, c: 34832}, 34839, 34835, 8887 34838, 35171, 35174, 35257, 35319, 35680, 35690, 35677, 35688, 35683, 8888 35685, 35687, 35693, 36270, 36486, 36488, 36484, 36697, {f: 2, c: 36694}, 8889 36693, 36696, 36698, 37005, 37187, 37185, 37303, 37301, {f: 2, c: 37298}, 8890 37899, 37907, 37883, 37920, 37903, 37908, 37886, 37909, 37904, 37928, 8891 37913, 37901, 37877, 37888, 37879, 37895, 37902, 37910, 37906, 37882, 8892 37897, 37880, 37948, 37898, 37887, 37884, 37900, 37878, 37905, 37894, 8893 38366, 38368, 38367, {f: 2, c: 38702}, 38841, 38843, {f: 2, c: 38909}, 8894 39008, {f: 2, c: 39010}, 39007, {f: 2, c: 39105}, 39248, 39246, 39257, 8895 39244, 39243, 39251, 39474, 39476, 39473, 39468, 39466, 39478, 39465, 8896 39470, 39480, 39469, 39623, 39626, 39622, 39696, 39698, 39697, 39947, 8897 39944, 39927, 39941, 39954, 39928, 40000, 39943, 39950, 39942, 39959, 8898 39956, 39945, 40351, 40345, 40356, 40349, 40338, 40344, 40336, 40347, 8899 40352, 40340, 40348, 40362, 40343, 40353, 40346, 40354, 40360, 40350, 8900 40355, 40383, 40361, 40342, {f: 2, c: 40358}, 40601, 40603, 40602, 40677, 8901 40676, 40679, 40678, 40752, 40750, 40795, 40800, 40798, 40797, 40793, 8902 40849, 20794, 20793, 21144, 21143, 22211, {f: 2, c: 22205}, 23368, 23367, 8903 24011, 24015, 24305, 25085, 25883, 27394, 27388, 27395, 27384, 27392, 8904 {f: 2, c: 28739}, 28746, {f: 2, c: 28744}, {f: 2, c: 28741}, 29213, 29210, 8905 29209, 29566, 29975, 30314, 30672, 31021, 31025, 31023, 31828, 31827, 8906 31986, 32394, [32391, 60229], 32392, 32395, 32390, 32397, 32589, 32699, 8907 32816, 33245, 34328, 34346, 34342, 34335, 34339, 34332, 34329, 34343, 8908 34350, 34337, 34336, 34345, 34334, 34341, 34857, 34845, 34843, 34848, 8909 34852, 34844, 34859, 34890, 35181, 35177, 35182, 35179, 35322, 35705, 8910 35704, 35653, {f: 2, c: 35706}, 36112, 36116, 36271, 36494, 36492, 36702, 8911 36699, 36701, 37190, {f: 2, c: 37188}, 37305, 37951, 37947, 37942, 37929, 8912 37949, 37936, 37945, 37930, 37943, 37932, 37952, 37937, 38373, 38372, 8913 38371, 38709, 38714, 38847, 38881, 39012, 39113, 39110, 39104, 39256, 8914 39254, 39481, 39485, 39494, 39492, 39490, 39489, 39482, 39487, 39629, 8915 39701, {f: 2, c: 39703}, 39702, 39738, 39762, 39979, 39965, 39964, 39980, 8916 39971, {f: 2, c: 39976}, 39972, 39969, 40375, 40374, 40380, 40385, 40391, 8917 40394, 40399, 40382, 40389, 40387, 40379, 40373, 40398, {f: 2, c: 40377}, 8918 40364, 40392, 40369, 40365, 40396, 40371, 40397, 40370, 40570, 40604, 8919 40683, 40686, 40685, 40731, 40728, 40730, 40753, 40782, 40805, 40804, 8920 40850, 20153, 22214, 22213, 22219, 22897, {f: 2, c: 23371}, 24021, 24017, 8921 24306, 25889, 25888, 25894, 25890, 27403, {f: 2, c: 27400}, 27661, 8922 {f: 3, c: 28757}, 28754, {f: 2, c: 29214}, 29353, 29567, 29912, 29909, 8923 29913, 29911, 30317, 30381, 31029, 31156, {f: 2, c: 31344}, 31831, 31836, 8924 31833, 31835, 31834, 31988, 31985, 32401, 32591, 32647, 33246, 33387, 8925 {f: 2, c: 34356}, 34355, 34348, 34354, 34358, 34860, 34856, 34854, 34858, 8926 34853, 35185, 35263, 35262, 35323, 35710, 35716, 35714, 35718, 35717, 8927 35711, 36117, 36501, 36500, 36506, 36498, 36496, {f: 2, c: 36502}, 36704, 8928 36706, 37191, 37964, 37968, {f: 2, c: 37962}, 37967, 37959, 37957, 8929 {f: 2, c: 37960}, 37958, 38719, 38883, 39018, 39017, 39115, 39252, 39259, 8930 39502, {f: 2, c: 39507}, 39500, 39503, 39496, 39498, 39497, 39506, 39504, 8931 39632, 39705, 39723, 39739, 39766, 39765, 40006, 40008, 39999, 40004, 8932 39993, 39987, 40001, 39996, 39991, 39988, 39986, 39997, 39990, 40411, 8933 40402, 40414, 40410, 40395, 40400, 40412, 40401, 40415, 40425, 40409, 8934 40408, 40406, 40437, 40405, 40413, 40630, 40688, 40757, 40755, 40754, 8935 40770, 40811, 40853, 40866, 20797, 21145, 22760, 22759, 22898, 23373, 8936 24024, 34863, 24399, 25089, {f: 2, c: 25091}, 25897, 25893, 26006, 26347, 8937 {f: 2, c: 27409}, 27407, 27594, 28763, 28762, 29218, 29570, 29569, 29571, 8938 30320, 30676, 31847, 31846, 32405, 33388, 34362, 34368, 34361, 34364, 8939 34353, 34363, 34366, 34864, 34866, 34862, 34867, 35190, 35188, 35187, 8940 35326, 35724, 35726, 35723, 35720, 35909, 36121, 36504, 36708, 36707, 8941 37308, 37986, 37973, 37981, 37975, 37982, {f: 2, c: 38852}, 38912, 39510, 8942 39513, {f: 3, c: 39710}, 40018, 40024, 40016, 40010, 40013, 40011, 40021, 8943 40025, 40012, 40014, 40443, 40439, 40431, 40419, 40427, 40440, 40420, 8944 40438, 40417, 40430, 40422, 40434, [40432, 60370], 40418, 40428, 40436, 8945 40435, 40424, 40429, 40642, 40656, {f: 2, c: 40690}, 40710, 40732, 40760, 8946 40759, 40758, 40771, 40783, 40817, 40816, {f: 2, c: 40814}, 22227, 22221, 8947 23374, 23661, 25901, {f: 2, c: 26349}, 27411, 28767, 28769, 28765, 28768, 8948 29219, 29915, 29925, 30677, 31032, 31159, 31158, 31850, 32407, 32649, 8949 33389, 34371, 34872, 34871, 34869, 34891, {f: 2, c: 35732}, 8950 {f: 3, c: 36510}, 36509, 37310, 37309, 37314, 37995, {f: 2, c: 37992}, 8951 38629, 38726, 38723, 38727, 38855, 38885, 39518, 39637, 39769, 40035, 8952 40039, 40038, 40034, 40030, 40032, 40450, 40446, 40455, 40451, 40454, 8953 40453, {f: 2, c: 40448}, 40457, 40447, 40445, 40452, 40608, 40734, 40774, 8954 {f: 3, c: 40820}, 22228, 25902, 26040, {f: 2, c: 27416}, 27415, 27418, 8955 28770, 29222, 29354, {f: 2, c: 30680}, 31033, 31849, 31851, 31990, 32410, 8956 32408, 32411, 32409, {f: 2, c: 33248}, {f: 3, c: 34374}, {f: 2, c: 35193}, 8957 35196, 35195, 35327, {f: 2, c: 35736}, 36517, 36516, 36515, 37998, 37997, 8958 37999, 38001, 38003, 38729, 39026, 39263, 40040, 40046, 40045, 40459, 8959 40461, 40464, 40463, 40466, 40465, 40609, 40693, 40713, 40775, 40824, 8960 40827, 40826, 40825, 22302, 28774, 31855, 34876, 36274, 36518, 37315, 8961 38004, 38008, 38006, 38005, 39520, [39726, 60830], 40052, 40051, 40049, 8962 40053, 40468, 40467, 40694, 40714, 40868, 28776, 28773, 31991, 34410, 8963 34878, 34877, 34879, 35742, 35996, 36521, 36553, 38731, {f: 2, c: 39027}, 8964 39116, 39265, 39339, 39524, {f: 2, c: 39526}, 39716, 40469, 40471, 40776, 8965 25095, 27422, 29223, 34380, 36520, 38018, {f: 2, c: 38016}, 39529, 39528, 8966 40473, 34379, 35743, 38019, 40057, 40631, 30325, 39531, 40058, 40477, 8967 {f: 2, c: 28777}, 29225, 40612, 40830, 40777, 40856, {s: 97}, 65075, 0, 8968 65076, 65103, [168, 776, 63208], [710, 63209, 65342], [12541, 63210], 8969 [12542, 63211], [12445, 63212], [12446, 63213], 0, [12293, 63216], 8970 [12294, 63217], [12295, 63218], [12540, 63219], [63220, 65339], 8971 [63221, 65341], [10045, 63222], [12353, 63223], [12354, 63224], 8972 [12355, 63225], [12356, 63226], [12357, 63227], [12358, 63228], 8973 [12359, 63229], [12360, 63230], [12361, 63231], [12362, 63232], 8974 [12363, 63233], [12364, 63234], [12365, 63235], [12366, 63236], 8975 [12367, 63237], [12368, 63238], [12369, 63239], [12370, 63240], 8976 [12371, 63241], [12372, 63242], [12373, 63243], [12374, 63244], 8977 [12375, 63245], [12376, 63246], [12377, 63247], [12378, 63248], 8978 [12379, 63249], [12380, 63250], [12381, 63251], [12382, 63252], 8979 [12383, 63253], [12384, 63254], [12385, 63255], [12386, 63256], 8980 [12387, 63257], [12388, 63258], [12389, 63259], [12390, 63260], 8981 [12391, 63261], [12392, 63262], [12393, 63263], [12394, 63264], 8982 [12395, 63265], [12396, 63266], [12397, 63267], [12398, 63268], 8983 [12399, 63269], [12400, 63270], [12401, 63271], [12402, 63272], 8984 [12403, 63273], [12404, 63274], [12405, 63275], [12406, 63276], 8985 [12407, 63277], [12408, 63278], [12409, 63279], [12410, 63280], 8986 [12411, 63281], [12412, 63282], [12413, 63283], [12414, 63284], 8987 [12415, 63285], [12416, 63286], [12417, 63287], [12418, 63288], 8988 [12419, 63289], [12420, 63290], [12421, 63291], [12422, 63292], 8989 [12423, 63293], [12424, 63294], [12425, 63295], [12426, 63296], 8990 [12427, 63297], [12428, 63298], [12429, 63299], [12430, 63300], 8991 [12431, 63301], [12432, 63302], [12433, 63303], [12434, 63304], 8992 [12435, 63305], [12449, 63306], [12450, 63307], [12451, 63308], 8993 [12452, 63309], [12453, 63310], [12454, 63311], [12455, 63312], 8994 [12456, 63313], [12457, 63314], [12458, 63315], [12459, 63316], 8995 [12460, 63317], [12461, 63318], [12462, 63319], [12463, 63320], 8996 [12464, 63321], [12465, 63322], [12466, 63323], [12467, 63324], 8997 [12468, 63325], [12469, 63326], [12470, 63327], [12471, 63328], 8998 [12472, 63329], [12473, 63330], [12474, 63331], [12475, 63332], 8999 [12476, 63333], [12477, 63334], [12478, 63335], [12479, 63336], 9000 [12480, 63337], [12481, 63338], [12482, 63339], [12483, 63340], 9001 [12484, 63341], [12485, 63342], [12486, 63343], [12487, 63344], 9002 [12488, 63345], [12489, 63346], [12490, 63347], [12491, 63348], 9003 [12492, 63349], [12493, 63350], [12494, 63351], [12495, 63352], 9004 [12496, 63353], [12497, 63354], [12498, 63355], [12499, 63356], 9005 [12500, 63357], [12501, 63358], [12502, 63359], [12503, 63360], 9006 [12504, 63361], [12505, 63362], [12506, 63363], [12507, 63364], 9007 [12508, 63365], [12509, 63366], [12510, 63367], [12511, 63368], 9008 [12512, 63369], [12513, 63370], [12514, 63371], [12515, 63372], 9009 [12516, 63373], [12517, 63374], [12518, 63375], [12519, 63376], 9010 [12520, 63377], [12521, 63378], [12522, 63379], [12523, 63380], 9011 [12524, 63381], [12525, 63382], [12526, 63383], [12527, 63384], 9012 [12528, 63385], [12529, 63386], [12530, 63387], [12531, 63388], 9013 [12532, 63389], [12533, 63390], [12534, 63391], [1040, 63392], 9014 [1041, 63393], [1042, 63394], [1043, 63395], [1044, 63396], [1045, 63397], 9015 [1025, 63398], [1046, 63399], [1047, 63400], [1048, 63401], [1049, 63402], 9016 [1050, 63403], [1051, 63404], [1052, 63405], [1053, 63406], [1054, 63407], 9017 [1055, 63408], [1056, 63409], [1057, 63410], [1058, 63411], [1059, 63412], 9018 [1060, 63413], [1061, 63414], [1062, 63415], [1063, 63416], [1064, 63417], 9019 [1065, 63418], [1066, 63419], [1067, 63420], [1068, 63421], [1069, 63422], 9020 [1070, 63423], [1071, 63424], [1072, 63425], [1073, 63426], [1074, 63427], 9021 [1075, 63428], [1076, 63429], [1077, 63430], [1105, 63431], [1078, 63432], 9022 [1079, 63433], [1080, 63434], [1081, 63435], [1082, 63436], [1083, 63437], 9023 [1084, 63438], [1085, 63439], [1086, 63440], [1087, 63441], [1088, 63442], 9024 [1089, 63443], [1090, 63444], [1091, 63445], [1092, 63446], [1093, 63447], 9025 [1094, 63448], [1095, 63449], [1096, 63450], [1097, 63451], [1098, 63452], 9026 [1099, 63453], [1100, 63454], [1101, 63455], [1102, 63456], [1103, 63457], 9027 [8679, 63458], [8632, 63459], [8633, 63460], [20033, 63461], 9028 [63462, 131276], [20058, 63463], [63464, 131210], [20994, 63465], 9029 [17553, 63466], 63467, [20872, 63468], [13853, 63469], [63470, 161287], 9030 {s: 40}, [172, 63511, 65506], [63512, 65508], [63513, 65287], 9031 [63514, 65282], [12849, 63515], [8470, 63516], [8481, 63517], 30849, 9032 [37561, 58501], 35023, 22715, 24658, 31911, 23290, 9556, 9574, 9559, 9568, 9033 9580, 9571, 9562, 9577, 9565, 9554, 9572, 9557, {s: 3}, 9560, 9575, 9563, 9034 9555, 9573, 9558, 9567, 9579, 9570, 9561, 9576, 9564, 9553, {s: 5}, 9619, 9035 {s: 26}, [58129, 147159], [22462, 58130], [58131, 159443], [28990, 58132], 9036 [58133, 153568], [27042, 58135], [58136, 166889], [23412, 58137], 9037 [31305, 58138], [58139, 153825], [58140, 169177], [31333, 58141], 9038 [31357, 58142], [58143, 154028], [31419, 58144], [31408, 58145], 9039 [31426, 58146], [31427, 58147], [29137, 58148], [58149, 156813], 9040 [16842, 58150], [31450, 58151], [31453, 58152], [31466, 58153], 9041 [16879, 58154], [21682, 58155], [58156, 154625], [31499, 58157], 9042 [31573, 58158], [31529, 58159], [58160, 152334], [58161, 154878], 9043 [31650, 58162], [31599, 58163], [33692, 58164], [58165, 154548], 9044 [58166, 158847], [31696, 58167], [33825, 58168], [31634, 58169], 0, 9045 [58171, 154912], 0, [33938, 58174], [31738, 58175], 0, [31797, 58177], 9046 [58178, 154817], [31812, 58179], [31875, 58180], [58181, 149634], 9047 [31910, 58182], [58184, 148856], [31945, 58185], [31943, 58186], 9048 [31974, 58187], 0, [31987, 58189], [31989, 58190], [32359, 58192], 9049 [17693, 58193], [58194, 159300], [32093, 58195], [58196, 159446], 9050 [32137, 58198], [32171, 58199], [28981, 58200], [32179, 58201], 32214, 9051 [58203, 147543], [58204, 155689], [32228, 58205], [15635, 58206], 9052 [32245, 58207], [58208, 137209], [32229, 58209], [58210, 164717], 0, 9053 [58212, 155937], [58213, 155994], [32366, 58214], 0, [17195, 58216], 9054 [37996, 58217], [32295, 58218], [32576, 58219], [32577, 58220], 9055 [32583, 58221], [31030, 58222], [58223, 156368], [39393, 58224], 9056 [32663, 58225], [58226, 156497], [32675, 58227], [58228, 136801], 9057 [58229, 131176], [17756, 58230], [58231, 145254], [58233, 164666], 9058 [32762, 58234], [58235, 156809], 0, [32776, 58237], [32797, 58238], 0, 9059 [32815, 58240], [58241, 172167], [58242, 158915], [32827, 58243], 9060 [32828, 58244], [32865, 58245], [58246, 141076], [18825, 58247], 9061 [58248, 157222], [58249, 146915], [58250, 157416], [26405, 58251], 9062 [32935, 58252], [58253, 166472], [33031, 58254], [33050, 58255], 9063 [22704, 58256], [58257, 141046], [27775, 58258], [58259, 156824], 9064 [25831, 58261], [58262, 136330], [33304, 58263], [58264, 137310], 9065 [27219, 58265], [58266, 150117], [58267, 150165], [17530, 58268], 9066 [33321, 58269], [58271, 158290], [58272, 146814], [20473, 58273], 9067 [58274, 136445], [34018, 58275], [33634, 58276], 0, [58278, 149927], 9068 [58279, 144688], [58280, 137075], [58281, 146936], [33450, 58282], 9069 [26907, 58283], [58284, 194964], [16859, 58285], [34123, 58286], 9070 [33488, 58287], [33562, 58288], [58289, 134678], [58290, 137140], 9071 [14017, 58291], [58292, 143741], [58293, 144730], [33403, 58294], 9072 [33506, 58295], [33560, 58296], [58297, 147083], [58298, 159139], 9073 [58299, 158469], [58300, 158615], [58301, 144846], [15807, 58302], 9074 [33565, 58303], [21996, 58304], [33669, 58305], [17675, 58306], 9075 [58307, 159141], [33708, 58308], 0, [33747, 58310], [58312, 159444], 9076 [27223, 58313], [34138, 58314], [13462, 58315], [58316, 159298], 9077 [33880, 58318], [58319, 154596], [33905, 58320], [15827, 58321], 9078 [17636, 58322], [27303, 58323], [33866, 58324], [31064, 58326], 0, 9079 [58328, 158614], [58329, 159351], [58330, 159299], [34014, 58331], 0, 9080 [33681, 58333], [17568, 58334], [33939, 58335], [34020, 58336], 9081 [58337, 154769], [16960, 58338], [58339, 154816], [17731, 58340], 9082 [34100, 58341], [23282, 58342], 0, [17703, 58344], [34163, 58345], 9083 [17686, 58346], [26559, 58347], [34326, 58348], [58349, 165413], 9084 [58350, 165435], [34241, 58351], [58352, 159880], [34306, 58353], 9085 [58354, 136578], [58355, 159949], [58356, 194994], [17770, 58357], 9086 [34344, 58358], [13896, 58359], [58360, 137378], [21495, 58361], 9087 [58362, 160666], [34430, 58363], 0, [58365, 172280], [34798, 58366], 9088 [58367, 142375], [34737, 58368], [34778, 58369], [34831, 58370, 60990], 9089 [22113, 58371], [34412, 58372], [26710, 58373], [17935, 58374], 9090 [34885, 58375], [34886, 58376], [58377, 161248], [58378, 146873], 9091 [58379, 161252], [34910, 58380], [34972, 58381], [18011, 58382], 9092 [34996, 58383], [34997, 58384], [35013, 58386], [58388, 161551], 9093 [35207, 58389], {s: 3}, [35239, 58393], [35260, 58394], [58395, 166437], 9094 [35303, 58396], [58397, 162084], [58398, 162493], [35484, 58399], 9095 [30611, 58400], [37374, 58401], [35472, 58402], [58403, 162393], 9096 [31465, 58404], [58405, 162618], [18195, 58407], [58408, 162616], 9097 [29052, 58409], [35596, 58410], [35615, 58411], [58412, 152624], 9098 [58413, 152933], [35647, 58414], 0, [35661, 58416], [35497, 58417], 9099 [58418, 150138], [35728, 58419], [35739, 58420], [35503, 58421], 9100 [58422, 136927], [17941, 58423], [34895, 58424], [35995, 58425], 9101 [58426, 163156], [58427, 163215], [58428, 195028], [14117, 58429], 9102 [58430, 163155], [36054, 58431], [58432, 163224], [58433, 163261], 9103 [36114, 58434], [36099, 58435], [58436, 137488], [36059, 58437], 9104 [28764, 58438], [36113, 58439], [16080, 58441], 0, [36265, 58443], 9105 [58444, 163842], [58445, 135188], [58446, 149898], [15228, 58447], 9106 [58448, 164284], [58449, 160012], [31463, 58450], [36525, 58451], 9107 [36534, 58452], [36547, 58453], [37588, 58454], [36633, 58455], 9108 [36653, 58456], [58457, 164709], [58458, 164882], [36773, 58459], 9109 [37635, 58460], [58461, 172703], [58462, 133712], [36787, 58463], 0, 9110 [58465, 166366], [58466, 165181], [58467, 146875], [24312, 58468], 9111 [58469, 143970], [36857, 58470], 0, [58474, 140069], [14720, 58475], 9112 [58476, 159447], [36919, 58477], [58478, 165180], [58479, 162494], 9113 [36961, 58480], [58481, 165228], [58482, 165387], [37032, 58483], 9114 [58484, 165651], [37060, 58485], [58486, 165606], [37038, 58487], 0, 9115 [37223, 58489], [37289, 58491], [37316, 58492], [31916, 58493], 9116 [58494, 166195], [58495, 138889], [37390, 58496], [27807, 58497], 9117 [37441, 58498], [37474, 58499], [58500, 153017], [58502, 166598], 9118 [58503, 146587], [58504, 166668], [58505, 153051], [58506, 134449], 9119 [37676, 58507], [37739, 58508], [58509, 166625], [58510, 166891], 9120 [23235, 58512], [58513, 166626], [58514, 166629], [18789, 58515], 9121 [37444, 58516], [58517, 166892], [58518, 166969], [58519, 166911], 9122 [37747, 58520], [37979, 58521], [36540, 58522], [38277, 58523], 9123 [38310, 58524], [37926, 58525], [38304, 58526], [28662, 58527], 9124 [17081, 58528], [58530, 165592], [58531, 135804], [58532, 146990], 9125 [18911, 58533], [27676, 58534], [38523, 58535], [38550, 58536], 9126 [16748, 58537], [38563, 58538], [58539, 159445], [25050, 58540], 58541, 9127 [30965, 58542], [58543, 166624], [38589, 58544], [21452, 58545], 9128 [18849, 58546], [58547, 158904], [58548, 131700], [58549, 156688], 9129 [58550, 168111], [58551, 168165], [58552, 150225], [58553, 137493], 9130 [58554, 144138], [38705, 58555], [34370, 58556], [38710, 58557], 9131 [18959, 58558], [17725, 58559], [17797, 58560], [58561, 150249], 9132 [28789, 58562], [23361, 58563], [38683, 58564], 0, [58566, 168405], 9133 [38743, 58567], [23370, 58568], [58569, 168427], [38751, 58570], 9134 [37925, 58571], [20688, 58572], [58573, 143543], [58574, 143548], 9135 [38793, 58575], [38815, 58576], [38833, 58577], [38846, 58578], 9136 [38848, 58579], [38866, 58580], [38880, 58581], [58582, 152684], 9137 [38894, 58583], [29724, 58584], [58585, 169011], 0, [38901, 58587], 9138 [58588, 168989], [58589, 162170], [19153, 58590], [38964, 58591], 9139 [38963, 58592], [38987, 58593], [39014, 58594], [15118, 58595], 9140 [58596, 160117], [15697, 58597], [58598, 132656], [58599, 147804], 9141 [58600, 153350], [39114, 58601], [39095, 58602], [39112, 58603], 9142 [39111, 58604], [19199, 58605], [58606, 159015], [58607, 136915], 9143 [21936, 58608], [39137, 58609], [39142, 58610], [39148, 58611], 9144 [37752, 58612], [39225, 58613], [58614, 150057], [19314, 58615], 9145 [58616, 170071], [58617, 170245], [39413, 58618], [39436, 58619], 9146 [39483, 58620], [39440, 58621], [39512, 58622], [58623, 153381], 9147 [14020, 58624], [58625, 168113], [58626, 170965], [39648, 58627], 9148 [39650, 58628], [58629, 170757], [39668, 58630], [19470, 58631], 9149 [39700, 58632], [39725, 58633], [58634, 165376], [20532, 58635], 9150 [39732, 58636], [14531, 58638], [58639, 143485], [39760, 58640], 9151 [39744, 58641], [58642, 171326], [23109, 58643], [58644, 137315], 9152 [39822, 58645], [39938, 58647], [39935, 58648], [39948, 58649], 9153 [58650, 171624], [40404, 58651], [58652, 171959], [58653, 172434], 9154 [58654, 172459], [58655, 172257], [58656, 172323], [58657, 172511], 9155 [40318, 58658], [40323, 58659], [58660, 172340], [40462, 58661], 9156 [40388, 58663], [58665, 172435], [58666, 172576], [58667, 137531], 9157 [58668, 172595], [40249, 58669], [58670, 172217], [58671, 172724], 9158 [40592, 58672], [40597, 58673], [40606, 58674], [40610, 58675], 9159 [19764, 58676], [40618, 58677], [40623, 58678], [58679, 148324], 9160 [40641, 58680], [15200, 58681], [14821, 58682], [15645, 58683], 9161 [20274, 58684], [14270, 58685], [58686, 166955], [40706, 58687], 9162 [40712, 58688], [19350, 58689], [37924, 58690], [58691, 159138], 9163 [40727, 58692, 60836], 0, [40761, 58694], [22175, 58695], [22154, 58696], 9164 [40773, 58697], [39352, 58698], [58699, 168075], [38898, 58700], 9165 [33919, 58701], 0, [40809, 58703], [31452, 58704], [40846, 58705], 9166 [29206, 58706], [19390, 58707], [58708, 149877], [58709, 149947], 9167 [29047, 58710], [58711, 150008], [58712, 148296], [58713, 150097], 9168 [29598, 58714], [58715, 166874], [58716, 137466], [31135, 58717], 9169 [58718, 166270], [58719, 167478], [37737, 58720], [37875, 58721], 9170 [58722, 166468], [37612, 58723], [37761, 58724], [37835, 58725], 9171 [58726, 166252], [58727, 148665], [29207, 58728], [16107, 58729], 9172 [30578, 58730], [31299, 58731], [28880, 58732], [58733, 148595], 9173 [58734, 148472], [29054, 58735], [58736, 137199], [28835, 58737], 9174 [58738, 137406], [58739, 144793], [16071, 58740], [58741, 137349], 9175 [58742, 152623], [58743, 137208], [14114, 58744], [58745, 136955], 9176 [58746, 137273], [14049, 58747], [58748, 137076], [58749, 137425], 9177 [58750, 155467], [14115, 58751], [58752, 136896], [22363, 58753], 9178 [58754, 150053], [58755, 136190], [58756, 135848], [58757, 136134], 9179 [58758, 136374], [34051, 58759, 58761], [58760, 145062], 0, [33877, 58762], 9180 [58763, 149908], [58764, 160101], [58765, 146993], [58766, 152924], 9181 [58767, 147195], [58768, 159826], [17652, 58769], [58770, 145134], 9182 [58771, 170397], [58772, 159526], [26617, 58773], [14131, 58774], 9183 [15381, 58775], [15847, 58776], [22636, 58777], [58778, 137506], 9184 [26640, 58779], [16471, 58780], [58781, 145215], [58782, 147681], 9185 [58783, 147595], [58784, 147727], [58785, 158753], [21707, 58786], 9186 [22174, 58787], [58788, 157361], [22162, 58789], [58790, 135135], 9187 [58791, 134056], [58792, 134669], 0, [58794, 166675], [37788, 58795], 9188 [20216, 58796], [20779, 58797], [14361, 58798], [58799, 148534], 9189 [20156, 58800], [58801, 132197], 0, [20299, 58803], [20362, 58804], 9190 [58805, 153169], [23144, 58806], [58807, 131499], [58808, 132043], 9191 [14745, 58809], [58810, 131850], [58811, 132116], [13365, 58812], 9192 [20265, 58813], [58814, 131776], [58815, 167603], [58816, 131701], 9193 [35546, 58817], [58818, 131596], [20120, 58819], [20685, 58820], 9194 [20749, 58821], [20386, 58822], [20227, 58823], [58824, 150030], 9195 [58825, 147082], [20290, 58826], [20526, 58827], [20588, 58828], 9196 [20609, 58829], [20428, 58830], [20453, 58831], [20568, 58832], 9197 [20732, 58833], [28278, 58838], [58839, 144789], [58840, 147001], 9198 [58841, 147135], [28018, 58842], [58843, 137348], [58844, 147081], 9199 [20904, 58845], [20931, 58846], [58847, 132576], [17629, 58848], 9200 [58849, 132259], [58850, 132242], [58851, 132241], [36218, 58852], 9201 [58853, 166556], [58854, 132878], [21081, 58855], [21156, 58856], 9202 [58857, 133235], [21217, 58858], 0, [18042, 58860], [29068, 58861], 9203 [58862, 148364], [58863, 134176], [58864, 149932], [58865, 135396], 9204 [27089, 58866], [58867, 134685], 0, [16094, 58869], [29849, 58870], 9205 [29716, 58871], [29782, 58872], [29592, 58873], [19342, 58874], 9206 [58875, 150204], [58876, 147597], [21456, 58877], [13700, 58878], 9207 [29199, 58879], [58880, 147657], [21940, 58881], [58882, 131909], 9208 [21709, 58883], [58884, 134086], [22301, 58885], [37469, 58886], 9209 [38644, 58887], [22493, 58889], [22413, 58890], [22399, 58891], 9210 [13886, 58892], [22731, 58893], [23193, 58894], [58895, 166470], 9211 [58896, 136954], [58897, 137071], [58898, 136976], [23084, 58899], 9212 [22968, 58900], [23166, 58902], [23247, 58903], [23058, 58904], 9213 [58905, 153926], [58906, 137715], [58907, 137313], [58908, 148117], 9214 [14069, 58909], [27909, 58910], [29763, 58911], [23073, 58912], 9215 [58913, 155267], [23169, 58914], [58915, 166871], [58916, 132115], 9216 [37856, 58917], [29836, 58918], [58919, 135939], [28933, 58920], 9217 [18802, 58921], [37896, 58922], [58923, 166395], [37821, 58924], 9218 [14240, 58925], [23582, 58926], [23710, 58927], [24158, 58928], 9219 [24136, 58929], [58930, 137622], [58931, 137596], [58932, 146158], 9220 [24269, 58933], [23375, 58934], [58935, 137475], [58936, 137476], 9221 [14081, 58937], [58938, 137376], [14045, 58939], [58940, 136958], 9222 [14035, 58941], [33066, 58942], [58943, 166471], [58944, 138682], 9223 [58945, 144498], [58946, 166312], [24332, 58947, 60916], [24334, 58948], 9224 [58949, 137511], [58950, 137131], [23147, 58951], [58952, 137019], 9225 [23364, 58953], [58955, 161277], [34912, 58956], [24702, 58957], 9226 [58958, 141408], [58959, 140843], [24539, 58960], [16056, 58961], 9227 [58962, 140719], [58963, 140734], [58964, 168072], [58965, 159603], 9228 [25024, 58966], [58967, 131134], [58968, 131142], [58969, 140827], 9229 [24985, 58970], [24984, 58971], [24693, 58972], [58973, 142491], 9230 [58974, 142599], [58975, 149204], [58976, 168269], [25713, 58977], 9231 [58978, 149093], [58979, 142186], [14889, 58980], [58981, 142114], 9232 [58982, 144464], [58983, 170218], [58984, 142968], [25399, 58985], 9233 [25782, 58987], [25393, 58988], [25553, 58989], [58990, 149987], 9234 [58991, 142695], [25252, 58992], [58993, 142497], [25659, 58994], 9235 [25963, 58995], [26994, 58996], [15348, 58997], [58998, 143502], 9236 [58999, 144045], [59000, 149897], [59001, 144043], [21773, 59002], 9237 [59003, 144096], [59004, 137433], [59005, 169023], [26318, 59006], 9238 [59007, 144009], [59008, 143795], [15072, 59009], [59011, 152964], 9239 [59012, 166690], [59013, 152975], [59014, 136956], [59015, 152923], 9240 [59016, 152613], [30958, 59017], [59018, 143619], [59019, 137258], 9241 [59020, 143924], [13412, 59021], [59022, 143887], [59023, 143746], 9242 [59024, 148169], [26254, 59025], [59026, 159012], [26219, 59027], 9243 [19347, 59028], [26160, 59029], [59030, 161904], [59031, 138731], 9244 [26211, 59032], [59033, 144082], [59034, 144097], [26142, 59035], 9245 [59036, 153714], [14545, 59037], [59038, 145466], [59039, 145340], 9246 [15257, 59040], [59041, 145314], [59042, 144382], [29904, 59043], 9247 [15254, 59044], [59046, 149034], [26806, 59047], 0, [15300, 59049], 9248 [27326, 59050], [59052, 145365], [59053, 148615], [27187, 59054], 9249 [27218, 59055], [27337, 59056], [27397, 59057], [59058, 137490], 9250 [25873, 59059], [26776, 59060], [27212, 59061], [15319, 59062], 9251 [27258, 59063], [27479, 59064], [59065, 147392], [59066, 146586], 9252 [37792, 59067], [37618, 59068], [59069, 166890], [59070, 166603], 9253 [37513, 59071], [59072, 163870], [59073, 166364], [37991, 59074], 9254 [28069, 59075], [28427, 59076], 0, [59079, 147327], [15759, 59080], 9255 [28164, 59081], [59082, 147516], [23101, 59083], [28170, 59084], 9256 [22599, 59085], [27940, 59086], [30786, 59087], [28987, 59088], 9257 [59089, 148250], [59090, 148086], [28913, 59091], [29264, 59092, 61085], 9258 [29319, 59093], [29332, 59094], [59095, 149391], [59096, 149285], 9259 [20857, 59097], [59098, 150180], [59099, 132587], [29818, 59100], 9260 [59101, 147192], [59102, 144991], [59103, 150090], [59104, 149783], 9261 [59105, 155617], [16134, 59106], [16049, 59107], [59108, 150239], 9262 [59109, 166947], [59110, 147253], [24743, 59111], [16115, 59112], 9263 [29900, 59113], [29756, 59114], [37767, 59115], [29751, 59116], 9264 [17567, 59117], [59118, 159210], [17745, 59119], [30083, 59120], 9265 [16227, 59121], [59122, 150745], [59123, 150790], [16216, 59124], 9266 [30037, 59125], [30323, 59126], [59127, 173510], 0, [29800, 59129, 61070], 9267 [59130, 166604], [59131, 149931], [59132, 149902], [15099, 59133], 9268 [15821, 59134], [59135, 150094], [16127, 59136], [59137, 149957], 9269 [59138, 149747], [37370, 59139], [22322, 59140], [37698, 59141], 9270 [59142, 166627], [59143, 137316], [20703, 59144], [59145, 152097], 9271 [59146, 152039], [30584, 59147], [59148, 143922], [30478, 59149], 9272 [30479, 59150], [30587, 59151], [59152, 149143], [59153, 145281], 9273 [14942, 59154], [59155, 149744], [29752, 59156], [29851, 59157], 9274 [16063, 59158], [59159, 150202], [59160, 150215], [16584, 59161], 9275 [59162, 150166], [59163, 156078], [37639, 59164], [59165, 152961], 9276 [30750, 59166], [30861, 59167], [30856, 59168], [30930, 59169], 9277 [29648, 59170], [31065, 59171], [59172, 161601], [59173, 153315], 9278 [16654, 59174], 0, 0, [31141, 59177], [27181, 59178], [59179, 147194], 9279 [31290, 59180], [31220, 59181], [16750, 59182], [59183, 136934], 9280 [16690, 59184], [37429, 59185], [31217, 59186], [59187, 134476], 9281 [59188, 149900], [59189, 131737], [59190, 146874], [59191, 137070], 9282 [13719, 59192], [21867, 59193], [13680, 59194], [13994, 59195], 9283 [59196, 131540], [59197, 134157], [31458, 59198], [23129, 59199], 9284 [59200, 141045], [59201, 154287], [59202, 154268], [23053, 59203], 9285 [59204, 131675], [30960, 59205], [23082, 59206], [59207, 154566], 9286 [31486, 59208], [16889, 59209], [31837, 59210], [31853, 59211], 9287 [16913, 59212], [59213, 154547], [59214, 155324], [59215, 155302], 9288 [31949, 59216], [59217, 150009], [59218, 137136], [31886, 59219], 9289 [31868, 59220], [31918, 59221], [27314, 59222], [32220, 59223], 9290 [32263, 59224], [32211, 59225], [32590, 59226], [59227, 156257], 9291 [59228, 155996], [59229, 162632], [32151, 59230], [59231, 155266], 9292 [17002, 59232], [59233, 158581], [59234, 133398], [26582, 59235], 9293 [59236, 131150], [59237, 144847], [22468, 59238], [59239, 156690], 9294 [59240, 156664], [32733, 59242], [31527, 59243], [59244, 133164], 9295 [59245, 154345], [59246, 154947], [31500, 59247], [59248, 155150], 9296 [39398, 59249], [34373, 59250], [39523, 59251], [27164, 59252], 9297 [59253, 144447], [59255, 150007], [59256, 157101], [39455, 59257], 9298 [59258, 157088], 0, [59260, 160039], [59261, 158929], [17642, 59262], 9299 [33079, 59263], [17410, 59264], [32966, 59265], [33033, 59266], 9300 [33090, 59267], [59268, 157620], [39107, 59269], [59270, 158274], 9301 [33378, 59271], [33381, 59272], [59273, 158289], [33875, 59274], 9302 [59275, 159143], [34320, 59276], [59277, 160283], [23174, 59278], 9303 [16767, 59279], [59280, 137280], [23339, 59281], [59282, 137377], 9304 [23268, 59283], [59284, 137432], [34464, 59285], [59286, 195004], 9305 [59287, 146831], [34861, 59288], [59289, 160802], [23042, 59290], 9306 [34926, 59291], [20293, 59292], [34951, 59293], [35007, 59294], 9307 [35046, 59295], [35173, 59296], [35149, 59297], [59298, 153219], 9308 [35156, 59299], [59300, 161669], [59301, 161668], [59302, 166901], 9309 [59303, 166873], [59304, 166812], [59305, 166393], [16045, 59306], 9310 [33955, 59307], [18165, 59308], [18127, 59309], [14322, 59310], 9311 [35389, 59311], [35356, 59312], [59313, 169032], [24397, 59314], 9312 [37419, 59315], [59316, 148100], [26068, 59317], [28969, 59318], 9313 [28868, 59319], [59320, 137285], [40301, 59321], [35999, 59322], 9314 [36073, 59323], [59324, 163292], [22938, 59325], [30659, 59326], 9315 [23024, 59327], [14036, 59329], [36394, 59330], [36519, 59331], 9316 [59332, 150537], [36656, 59333], [36682, 59334], [17140, 59335], 9317 [27736, 59336], [28603, 59337], [59338, 140065], [18587, 59339], 9318 [28537, 59340], [28299, 59341], [59342, 137178], [39913, 59343], 9319 [14005, 59344], [59345, 149807], [37051, 59346], 0, [21873, 59348], 9320 [18694, 59349], [37307, 59350], [37892, 59351], [59352, 166475], 9321 [16482, 59353], [59354, 166652], [37927, 59355], [59356, 166941], 9322 [59357, 166971], [34021, 59358], [35371, 59359], [38297, 59360], 9323 [38311, 59361], [38295, 59362], [38294, 59363], [59364, 167220], 9324 [29765, 59365], [16066, 59366], [59367, 149759], [59368, 150082], 9325 [59369, 148458], [16103, 59370], [59371, 143909], [38543, 59372], 9326 [59373, 167655], [59374, 167526], [59375, 167525], [16076, 59376], 9327 [59377, 149997], [59378, 150136], [59379, 147438], [29714, 59380], 9328 [29803, 59381], [16124, 59382], [38721, 59383], [59384, 168112], 9329 [26695, 59385], [18973, 59386], [59387, 168083], [59388, 153567], 0, 9330 [37736, 59390], [59391, 166281], [59392, 166950], [59393, 166703], 9331 [59394, 156606], [37562, 59395], [23313, 59396], [35689, 59397], 9332 [18748, 59398], [29689, 59399], [59400, 147995], [38811, 59401], 0, 9333 [39224, 59403], [59404, 134950], [24001, 59405], [59406, 166853], 9334 [59407, 150194], [38943, 59408], [59409, 169178], [37622, 59410], 9335 [59411, 169431], [37349, 59412], [17600, 59413], [59414, 166736], 9336 [59415, 150119], [59416, 166756], [39132, 59417], [59418, 166469], 9337 [16128, 59419], [37418, 59420], [18725, 59421], [33812, 59422], 9338 [39227, 59423], [39245, 59424], [59425, 162566], [15869, 59426], 0, 9339 [19311, 59428], [39338, 59429], [39516, 59430], [59431, 166757], 9340 [59432, 153800], [27279, 59433], [39457, 59434], [23294, 59435], 9341 [39471, 59436], [59437, 170225], [19344, 59438], [59439, 170312], 9342 [39356, 59440], [19389, 59441], [19351, 59442], [37757, 59443], 9343 [22642, 59444], [59445, 135938], [22562, 59446], [59447, 149944], 9344 [59448, 136424], [30788, 59449], [59450, 141087], [59451, 146872], 9345 [26821, 59452], [15741, 59453], [37976, 59454], [14631, 59455], 9346 [24912, 59456], [59457, 141185], [59458, 141675], [24839, 59459], 9347 [40015, 59460], [40019, 59461], [40059, 59462], [39989, 59463], 9348 [39952, 59464], [39807, 59465], [39887, 59466], [59467, 171565], 9349 [39839, 59468], [59469, 172533], [59470, 172286], [40225, 59471], 9350 [19630, 59472], [59473, 147716], [40472, 59474], [19632, 59475], 9351 [40204, 59476], [59477, 172468], [59478, 172269], [59479, 172275], 9352 [59480, 170287], [40357, 59481], [33981, 59482], [59483, 159250], 9353 [59484, 159711], [59485, 158594], [34300, 59486], [17715, 59487], 9354 [59488, 159140], [59489, 159364], [59490, 159216], [33824, 59491], 9355 [34286, 59492], [59493, 159232], [59494, 145367], [59495, 155748], 9356 [31202, 59496], [59497, 144796], [59498, 144960], [59500, 149982], 9357 [15714, 59501], [37851, 59502], [37566, 59503], [37704, 59504], 9358 [59505, 131775], [30905, 59506], [37495, 59507], [37965, 59508], 9359 [20452, 59509], [13376, 59510], [36964, 59511], [59512, 152925], 9360 [30781, 59513], [30804, 59514], [30902, 59515], [30795, 59516], 9361 [59517, 137047], [59518, 143817], [59519, 149825], [13978, 59520], 9362 [20338, 59521], [28634, 59522], [28633, 59523], 0, [28702, 59524, 59525], 9363 [21524, 59526], [59527, 147893], [22459, 59528], [22771, 59529], 9364 [22410, 59530], [40214, 59531], [22487, 59532], [28980, 59533], 9365 [13487, 59534], [59535, 147884], [29163, 59536], [59537, 158784], 9366 [59538, 151447], 0, [59540, 137141], [59541, 166473], [24844, 59542], 9367 [23246, 59543], [23051, 59544], [17084, 59545], [59546, 148616], 9368 [14124, 59547], [19323, 59548], [59549, 166396], [37819, 59550], 9369 [37816, 59551], [59552, 137430], [59553, 134941], [33906, 59554], 9370 [59555, 158912], [59556, 136211], [59557, 148218], [59558, 142374], 9371 [59559, 148417], [22932, 59560], [59561, 146871], [59562, 157505], 9372 [32168, 59563], [59564, 155995], [59565, 155812], [59566, 149945], 9373 [59567, 149899], [59568, 166394], [37605, 59569], [29666, 59570], 9374 [16105, 59571], [29876, 59572], [59573, 166755], [59574, 137375], 9375 [16097, 59575], [59576, 150195], [27352, 59577], [29683, 59578], 9376 [29691, 59579], [16086, 59580], [59581, 150078], [59582, 150164], 9377 [59583, 137177], [59584, 150118], [59585, 132007], [59586, 136228], 9378 [59587, 149989], [29768, 59588], [59589, 149782], [28837, 59590], 9379 [59591, 149878], [37508, 59592], [29670, 59593], [37727, 59594], 9380 [59595, 132350], [37681, 59596], [59597, 166606], [59598, 166422], 9381 [37766, 59599], [59600, 166887], [59601, 153045], [18741, 59602], 9382 [59603, 166530], [29035, 59604], [59605, 149827], [59606, 134399], 9383 [22180, 59607], [59608, 132634], [59609, 134123], [59610, 134328], 9384 [21762, 59611], [31172, 59612], [59613, 137210], [32254, 59614], 9385 [59615, 136898], [59616, 150096], [59617, 137298], [17710, 59618], 9386 [37889, 59619], [14090, 59620], [59621, 166592], [59622, 149933], 9387 [22960, 59623], [59624, 137407], [59625, 137347], [59626, 160900], 9388 [23201, 59627], [14050, 59628], [59629, 146779], [14000, 59630], 9389 [37471, 59631], [23161, 59632], [59633, 166529], [59634, 137314], 9390 [37748, 59635], [15565, 59636], [59637, 133812], [19094, 59638], 9391 [14730, 59639], [20724, 59640], [15721, 59641], [15692, 59642], 9392 [59643, 136092], [29045, 59644], [17147, 59645], [59646, 164376], 9393 [28175, 59647], [59648, 168164], [17643, 59649], [27991, 59650], 9394 [59651, 163407], [28775, 59652], [27823, 59653], [15574, 59654], 9395 [59655, 147437], [59656, 146989], [28162, 59657], [28428, 59658], 9396 [15727, 59659], [59660, 132085], [30033, 59661], [14012, 59662], 9397 [13512, 59663], [18048, 59664], [16090, 59665], [18545, 59666], 9398 [22980, 59667], [37486, 59668], [18750, 59669], [36673, 59670], 9399 [59671, 166940], [59672, 158656], [22546, 59673], [22472, 59674], 9400 [14038, 59675], [59676, 136274], [28926, 59677], [59678, 148322], 9401 [59679, 150129], [59680, 143331], [59681, 135856], [59682, 140221], 9402 [26809, 59683], [26983, 59684], [59685, 136088], [59686, 144613], 9403 [59687, 162804], [59688, 145119], [59689, 166531], [59690, 145366], 9404 [59691, 144378], [59692, 150687], [27162, 59693], [59694, 145069], 9405 [59695, 158903], [33854, 59696], [17631, 59697], [17614, 59698], 9406 [59699, 159014], [59700, 159057], [59701, 158850], [59702, 159710], 0, 0, 9407 [33597, 59705], [59706, 137018], [33773, 59707], [59708, 158848], 9408 [59709, 159827], [59710, 137179], [22921, 59711], [23170, 59712], 9409 [59713, 137139], [23137, 59714], [23153, 59715], [59716, 137477], 9410 [59717, 147964], [14125, 59718], [23023, 59719], [59720, 137020], 9411 [14023, 59721], [29070, 59722], [37776, 59723], [26266, 59724], 9412 [59725, 148133], [23150, 59726], [23083, 59727], [59728, 148115], 9413 [27179, 59729], [59730, 147193], [59731, 161590], [59732, 148571], 9414 [59733, 148170], [28957, 59734], [59735, 148057], [59736, 166369], 9415 [20400, 59737], [59738, 159016], [23746, 59739], [59740, 148686], 9416 [59741, 163405], [59742, 148413], [27148, 59743], [59744, 148054], 9417 [59745, 135940], 0, [28979, 59747], [59748, 148457], [15781, 59749], 9418 [27871, 59750], [59751, 194597], [23019, 59754], [24412, 59757], 9419 [59764, 144128], [31955, 59776], [59783, 162548], [59786, 153334], 9420 [59790, 162584], [36972, 59791], [33270, 59795], [30476, 59797], 9421 [27810, 59799], [22269, 59800], [22633, 59828], [26465, 59832], 9422 [23646, 59838], [22770, 59841], [28857, 59843], [26627, 59853], 9423 [36795, 59859], [36796, 59861], [20001, 59871], [31545, 59898], 9424 [15820, 59902], [29482, 57990, 59909], [30048, 59912], [22586, 59920], 9425 [33446, 59932], [27018, 59940], [24803, 59944], [20206, 59984], 9426 [39364, 60002], [40639, 60023], [21249, 60025], [26528, 60038], 9427 [24808, 60046], [20916, 60053], [31363, 60064], [39994, 60075], 9428 [31432, 60093], [26906, 60098], [22956, 60100], [22592, 60102], 9429 [21610, 60114], [24807, 60123], [22138, 60125], [26965, 60132], 9430 [39983, 60133], [34725, 60134], [23584, 60141], [24075, 60143], 9431 [26398, 60147], [33965, 60157], [35713, 60161], [20088, 60166], 9432 [25283, 60176], [26709, 60180], 0, [33533, 60190], [35237, 60194], 9433 [36768, 60196], [38840, 60198], [38983, 60200], [39613, 60201], 9434 [24497, 60218], [26184, 60219], [26303, 60220], [60221, 162425], 0, 9435 [60225, 149946], 0, 0, [60230, 131910], [26382, 60232], [26904, 60233], 9436 [60235, 161367], [60236, 155618], [60239, 161278], [60240, 139418], 9437 [18640, 60241], [19128, 60242], [60244, 166554], [60247, 147515], 9438 [60250, 150085], [60251, 132554], [20946, 60252], [60253, 132625], 9439 [22943, 60254], [60255, 138920], [15294, 60256], [60257, 146687], 9440 [14747, 60262], [60264, 165352], [60265, 170441], [14178, 60266], 9441 [60267, 139715], [35678, 60268], [60269, 166734], 0, [29193, 60274], 9442 [60276, 134264], [60280, 132985], [36570, 60281], [21135, 60283], 9443 [29041, 60285], [60288, 147274], [60289, 150183], [21948, 60290], 9444 [60293, 158546], [13427, 60295], [60297, 161330], [18200, 60299], 9445 [60303, 149823], [20582, 60305], [13563, 60306], [60307, 144332], 0, 9446 [18300, 60310], [60311, 166216], [60315, 138640], 0, [60320, 162834], 9447 [36950, 60321], [60323, 151450], [35682, 60324], [23899, 60327], 9448 [60328, 158711], 0, [60331, 137500], [35562, 60332], [60333, 150006], 9449 [60335, 147439], [19392, 60337], [60340, 141083], [37989, 60341], 9450 [60342, 153569], [24981, 60343], [23079, 60344], [60345, 194765], 0, 9451 [60348, 148769], [20074, 60350], [60351, 149812], [38486, 60352], 9452 [28047, 60353], [60354, 158909], [35191, 60356], [60359, 156689], 0, 9453 [31554, 60363], [60364, 168128], [60365, 133649], 0, [31301, 60369], 9454 [39462, 60372], [13919, 60374], [60375, 156777], [60376, 131105], 9455 [31107, 60377], [23852, 60380], [60381, 144665], 0, [18128, 60384], 9456 [30011, 60386], [34917, 60387], [22710, 60389], [14108, 60390], 9457 [60391, 140685], [15444, 60394], [37505, 60397], [60398, 139642], 9458 [37680, 60400], [60402, 149968], [27705, 60403], [60406, 134904], 9459 [34855, 60407], [35061, 60408], [60409, 141606], [60410, 164979], 9460 [60411, 137137], [28344, 60412], [60413, 150058], [60414, 137248], 9461 [14756, 60415], 0, 0, [17727, 60419], [26294, 60420], [60421, 171181], 9462 [60422, 170148], [35139, 60423], [16607, 60427], [60428, 136714], 9463 [14753, 60429], [60430, 145199], [60431, 164072], [60432, 136133], 9464 [29101, 60433], [33638, 60434], [60436, 168360], 0, [19639, 60438], 9465 [60439, 159919], [60440, 166315], [60445, 147834], [31555, 60446], 9466 [31102, 60447], [28597, 60449], [60450, 172767], [27139, 60451], 9467 [60452, 164632], [21410, 60453], [60454, 159239], [37823, 60455], 9468 [26678, 60456], [38749, 59389, 60457], [60458, 164207], [60460, 158133], 9469 [60461, 136173], [60462, 143919], [23941, 60464], [60465, 166960], 9470 [22293, 60467], [38947, 60468], [60469, 166217], [23979, 60470], 9471 [60471, 149896], [26046, 60472], [27093, 60473], [21458, 60474], 9472 [60475, 150181], [60476, 147329], [15377, 60477], [26422, 60478], 9473 [60482, 139169], [13770, 60490], [18682, 60493], 0, [30728, 60496], 9474 [37461, 60497], [17394, 60499], [17375, 60501], [23032, 60505], 0, 9475 [22155, 60518], [60520, 169449], [36882, 60541], [21953, 60546], 9476 [17673, 60551], [32383, 60552], [28502, 60553], [27313, 60554], 9477 [13540, 60556], [60558, 161949], [14138, 60559], 0, [60562, 163876], 9478 [60565, 162366], [15851, 60567], [60569, 146615], [60574, 156248], 9479 [22207, 60575], [36366, 60577], [23405, 60578], [25566, 60581], 0, 9480 [25904, 60585], [22061, 60586], [21530, 60588], [60591, 171416], 9481 [19581, 60592], [22050, 60593], [22046, 60594], [32585, 60595], 9482 [22901, 60597], [60598, 146752], [34672, 60599], [33047, 60604], 9483 [40286, 60605], [36120, 60606], [30267, 60607], [40005, 60608], 9484 [30286, 60609], [30649, 60610], [37701, 60611], [21554, 60612], 9485 [33096, 60613], [33527, 60614], [22053, 60615], [33074, 60616], 9486 [33816, 60617], [32957, 60618], [21994, 60619], [31074, 60620], 9487 [22083, 60621], [21526, 60622], [60623, 134813], [13774, 60624], 9488 [22021, 57509, 60625], [22001, 60626], [26353, 60627], [60628, 164578], 9489 [13869, 60629], [30004, 60630], [22000, 60631], [21946, 60632], 9490 [21655, 60633], [21874, 60634], [60635, 134209], [60636, 134294], 9491 [24272, 57652, 60637], [60639, 134774], [60640, 142434], [60641, 134818], 9492 [40619, 60642], [32090, 60643], 0, [60645, 135285], [25245, 60646], 9493 [38765, 60647], [21652, 60648], [36045, 60649], [29174, 60650], 9494 [37238, 60651], [25596, 60652], [25529, 60653], [25598, 60654], 9495 [21865, 60655], [60656, 142147], [40050, 60657], [60658, 143027], 9496 [20890, 60659], [13535, 60660], [60661, 134567], [20903, 60662], 9497 [21581, 60663], [21790, 60664], [21779, 60665], [30310, 60666], 9498 [36397, 60667], [60668, 157834], [30129, 60669], [32950, 60670], 9499 [34820, 60671], 0, [35015, 60673], [33206, 60674], [33820, 60675], 9500 [17644, 60677], [29444, 60678], [33547, 60681], [22139, 60683], 9501 [37232, 60690], [37384, 60692], [60696, 134905], [29286, 60697], 9502 [18254, 60699], [60701, 163833], [16634, 60703], [40029, 60704], 9503 [25887, 60705], [18675, 60707], [60708, 149472], [60709, 171388], 0, 9504 [60713, 161187], 60715, [60716, 155720], [29091, 60718], [32398, 60719], 9505 [40272, 60720], [13687, 60723], [27826, 60725], [21351, 60726], 9506 [14812, 60728], [60731, 149016], [33325, 60734], [21579, 60735], 60739, 9507 [14930, 60740], [29556, 60742], [60743, 171692], [19721, 60744], 9508 [39917, 60745], 0, [19547, 60748], [60751, 171998], [33884, 60752], 9509 [60754, 160434], [25390, 60757], [32037, 60758], [14890, 60761], 9510 [36872, 60762], [21196, 60763], [15988, 60764], [13946, 60765], 9511 [17897, 60766], [60767, 132238], [30272, 60768], [23280, 60769], 9512 [60770, 134838], [30842, 60771], [18358, 60772], [22695, 60773], 9513 [16575, 60774], [22140, 60775], [39819, 60776], [23924, 60777], 9514 [30292, 60778], [60779, 173108], [40581, 60780], [19681, 60781], 0, 9515 [14331, 60783], [24857, 60784], [60786, 148466], 60787, [22109, 60788], 9516 [60792, 171526], [21044, 60793], [13741, 60795], 0, [40316, 60797], 9517 [31830, 60798], [39737, 60799], [22494, 60800], [23635, 60802], 9518 [25811, 60803], [60804, 169168], [60805, 156469], [34477, 60807], 9519 [60808, 134440], [60811, 134513], 60812, [20990, 60813], [60814, 139023], 9520 [23950, 60815], [38659, 60816], [60817, 138705], [40577, 60818], 9521 [36940, 60819], [31519, 60820], [39682, 60821], [23761, 60822], 9522 [31651, 60823], [25192, 60824], [25397, 60825], [39679, 60826], 9523 [31695, 60827], [39722, 60828], [31870, 60829], 0, [31810, 60831], 9524 [31878, 60832], [39957, 60833], [31740, 60834], [39689, 60835], 0, 39982, 9525 [40794, 60839], [21875, 60840], [23491, 60841], [20477, 60842], 9526 [40600, 60843], [20466, 60844], [21088, 60845], [21201, 60847], 9527 [22375, 60848], [20566, 60849], [22967, 60850], [24082, 60851], 9528 [38856, 60852], [40363, 60853], [36700, 60854], [21609, 60855], 9529 [38836, 60856], [39232, 60857], [38842, 60858], [21292, 60859], 9530 [24880, 60860], [26924, 60861], [21466, 60862], [39946, 60863], 9531 [40194, 60864], [19515, 60865], [38465, 60866], [27008, 60867], 9532 [20646, 60868], [30022, 60869], [60870, 137069], [39386, 60871], 9533 [21107, 60872], 60873, [37209, 60874], [38529, 60875], [37212, 60876], 9534 60877, [37201, 60878], [60879, 167575], [25471, 60880], [27338, 60882], 9535 [22033, 60883], [37262, 60884], [30074, 60885], [25221, 60886], 9536 [29519, 60888], [31856, 60889], [60890, 154657], 60892, [30422, 60894], 9537 [39837, 60895], [20010, 60896], [60897, 134356], [33726, 60898], 9538 [34882, 60899], 60900, [23626, 60901], [27072, 60902], 0, 0, 9539 [21023, 60905], [24053, 60906], [20174, 60907], [27697, 60908], 9540 [60909, 131570], [20281, 60910], [21660, 60911], 0, [21146, 60913], 9541 [36226, 60914], [13822, 60915], 0, [13811, 60917], 60918, [27474, 60919], 9542 [37244, 60920], [40869, 60921], [39831, 60922], [38958, 60923], 9543 [39092, 60924], [39610, 60925], [40616, 60926], [40580, 60927], 9544 [31508, 60929], 60930, [27642, 60931], [34840, 60932], [32632, 60933], 9545 60934, [22048, 60935], [60936, 173642], [36471, 60937], [40787, 60938], 9546 60939, [36308, 60940], [36431, 60941], [40476, 60942], [36353, 60943], 9547 [25218, 60944], [60945, 164733], [36392, 60946], [36469, 60947], 9548 [31443, 60948], [31294, 60950], [30936, 60951], [27882, 60952], 9549 [35431, 60953], [30215, 60954], [40742, 60956], [27854, 60957], 9550 [34774, 60958], [30147, 60959], [60960, 172722], [30803, 60961], 9551 [36108, 60963], [29410, 60964], [29553, 60965], [35629, 60966], 9552 [29442, 60967], [29937, 60968], [36075, 60969], [60970, 150203], 9553 [34351, 60971], [24506, 60972], [34976, 60973], [17591, 60974], 60975, 9554 [60977, 159237], 60978, [35454, 60979], [60980, 140571], 60981, 9555 [24829, 60982], [30311, 60983], [39639, 60984], [40260, 60985], 9556 [37742, 58859, 60986], [39823, 60987], [34805, 60988], 60989, 0, 9557 [36087, 60991], [29484, 60992], [38689, 60993], [39856, 60994], 9558 [13782, 60995], [29362, 60996], [19463, 60997], [31825, 60998], 9559 [39242, 60999], [24921, 61001], [19460, 61002], [40598, 61003], 9560 [24957, 61004], 61005, [22367, 61006], [24943, 61007], [25254, 61008], 9561 [25145, 61009], 0, [14940, 61011], [25058, 61012], [21418, 61013], 9562 [25444, 61015], [26626, 61016], [13778, 61017], [23895, 61018], 9563 [36826, 61020], [61021, 167481], 61022, [20697, 61023], [30982, 61025], 9564 [21298, 61026], [38456, 61027], [61028, 134971], [16485, 61029], 61030, 9565 [30718, 61031], 61032, [31938, 61033], [61034, 155418], [31962, 61035], 9566 [31277, 61036], [32870, 61037], [32867, 61038], [32077, 61039], 9567 [29957, 61040], [29938, 61041], [35220, 61042], [33306, 61043], 9568 [26380, 61044], [32866, 61045], [61046, 160902], [32859, 61047], 9569 [29936, 61048], [33027, 61049], [30500, 61050], [35209, 61051], 9570 [61052, 157644], [30035, 61053], [34729, 61055], [34766, 61056], 9571 [33224, 61057], [34700, 61058], [35401, 61059], [36013, 61060], 9572 [35651, 61061], [30507, 61062], [29944, 61063], [34010, 61064], 9573 [27058, 61066], [36262, 61067], 61068, [35241, 58392, 61069], 0, 9574 [28089, 61071], [34753, 61072], [61073, 147473], [29927, 61074], 9575 [15835, 61075], [29046, 61076], [24740, 57702, 61077], [24988, 61078], 9576 [15569, 61079], 0, [24695, 61081], 61082, [32625, 61083], 0, 9577 [24809, 61086], [19326, 61087], [57344, 132423], [37595, 57345], 9578 [57346, 132575], [57347, 147397], [34124, 57348], [17077, 57349], 9579 [29679, 57350], [20917, 57351], [13897, 57352], [57353, 149826], 9580 [57354, 166372], [37700, 57355], [57356, 137691], [33518, 57357], 9581 [57358, 146632], [30780, 57359], [26436, 57360], [25311, 57361], 9582 [57362, 149811], [57363, 166314], [57364, 131744], [57365, 158643], 9583 [57366, 135941], [20395, 57367], [57368, 140525], [20488, 57369], 9584 [57370, 159017], [57371, 162436], [57372, 144896], [57373, 150193], 9585 [57374, 140563], 0, [57376, 131966], [24484, 57377], [57378, 131968], 9586 [57379, 131911], [28379, 57380], [57381, 132127], 20702, [20737, 57383], 9587 [13434, 57384], [20750, 57385], [39020, 57386], [14147, 57387], 9588 [33814, 57388], [57389, 149924], [57390, 132231], [20832, 57391], 9589 [57392, 144308], [20842, 57393], [57394, 134143], [57395, 139516], 9590 [57396, 131813], [57397, 140592], [57398, 132494], [57399, 143923], 9591 [57400, 137603], [23426, 57401], [34685, 57402], [57403, 132531], 9592 [57404, 146585], [20914, 57405], [20920, 57406], [40244, 57407], 9593 [20937, 57408], [20943, 57409], [20945, 57410], [15580, 57411], 9594 [20947, 57412], [57413, 150182], [20915, 57414], 0, 0, [20973, 57417], 9595 [33741, 57418], [26942, 57419], [57420, 145197], [24443, 57421], 9596 [21003, 57422], [21030, 57423], [21052, 57424], [21173, 57425], 9597 [21079, 57426], [21140, 57427], [21177, 57428], [21189, 57429], 9598 [31765, 57430], [34114, 57431], [21216, 57432], [34317, 57433], 9599 [57434, 158483], 0, [57436, 166622], [21833, 57437], [28377, 57438], 9600 [57439, 147328], [57440, 133460], [57441, 147436], [21299, 57442], 0, 9601 [57444, 134114], [27851, 57445], [57446, 136998], [26651, 57447], 9602 [29653, 57448], [24650, 57449], [16042, 57450], [14540, 57451], 9603 [57452, 136936], [29149, 57453], [17570, 57454], [21357, 57455], 9604 [21364, 57456], [57457, 165547], [21374, 57458], 0, [57460, 136598], 9605 [57461, 136723], [30694, 57462], [21395, 57463], [57464, 166555], 9606 [21408, 57465], [21419, 57466], [21422, 57467], [29607, 57468], 9607 [57469, 153458], [16217, 57470], [29596, 57471], [21441, 57472], 9608 [21445, 57473], [27721, 57474], [20041, 57475], [22526, 57476], 9609 [21465, 57477], [15019, 57478], [57479, 134031], [21472, 57480], 9610 [57481, 147435], [57482, 142755], [21494, 57483], [57484, 134263], 9611 [21523, 57485], [28793, 57486], [21803, 57487], [26199, 57488], 9612 [27995, 57489], [21613, 57490], [57491, 158547], [57492, 134516], 9613 [21853, 57493], [21647, 57494], [21668, 57495], [18342, 57496], 9614 [57497, 136973], [57498, 134877], [15796, 57499], [57500, 134477], 9615 [57501, 166332], [57502, 140952], [21831, 57503], [19693, 57504], 9616 [21551, 57505], [29719, 57506], [21894, 57507], [21929, 57508], 0, 9617 [57510, 137431], [57511, 147514], [17746, 57512], [57513, 148533], 9618 [26291, 57514], [57515, 135348], [22071, 57516], [26317, 57517], 9619 [57518, 144010], [26276, 57519], 0, [22093, 57521], [22095, 57522], 9620 [30961, 57523], [22257, 57524], [38791, 57525], [21502, 57526], 9621 [22272, 57527], [22255, 57528], [22253, 57529], [57530, 166758], 9622 [13859, 57531], [57532, 135759], [22342, 57533], [57534, 147877], 9623 [27758, 57535], [28811, 57536], [22338, 57537], [14001, 57538], 9624 [57539, 158846], [22502, 57540], [57541, 136214], [22531, 57542], 9625 [57543, 136276], [57544, 148323], [22566, 57545], [57546, 150517], 0, 9626 [22698, 57548], [13665, 57549], [22752, 57550], [22748, 57551], 9627 [57552, 135740], [22779, 57553], [23551, 57554], [22339, 57555], 9628 [57556, 172368], [57557, 148088], [37843, 57558], [13729, 57559], 9629 [22815, 57560], [26790, 57561], [14019, 57562], [28249, 57563], 9630 [57564, 136766], [23076, 57565], 0, [57567, 136850], [34053, 57568], 9631 [22985, 57569], [57570, 134478], [57571, 158849], [57572, 159018], 9632 [57573, 137180], [23001, 57574], [57575, 137211], [57576, 137138], 9633 [57577, 159142], [28017, 57578], [57579, 137256], [57580, 136917], 9634 [23033, 57581], [57582, 159301], [23211, 57583], [23139, 57584], 9635 [14054, 57585], [57586, 149929], 0, [14088, 57588], [23190, 57589], 9636 [29797, 57590], [23251, 57591], [57592, 159649], [57593, 140628], 9637 [57595, 137489], [14130, 57596], [57597, 136888], [24195, 57598], 9638 [21200, 57599], [23414, 57600], [25992, 57601], [23420, 57602], 9639 [57603, 162318], [16388, 57604], [18525, 57605], [57606, 131588], 9640 [23509, 57607], [57609, 137780], [57610, 154060], [57611, 132517], 9641 [23539, 57612], [23453, 57613], [19728, 57614], [23557, 57615], 9642 [57616, 138052], [23571, 57617], [29646, 57618], [23572, 57619], 9643 [57620, 138405], [57621, 158504], [23625, 57622], [18653, 57623], 9644 [23685, 57624], [23785, 57625], [23791, 57626], [23947, 57627], 9645 [57628, 138745], [57629, 138807], [23824, 57630], [23832, 57631], 9646 [23878, 57632], [57633, 138916], [23738, 57634], [24023, 57635], 9647 [33532, 57636], [14381, 57637], [57638, 149761], [57639, 139337], 9648 [57640, 139635], [33415, 57641], [14390, 57642], [15298, 57643], 9649 [24110, 57644], [27274, 57645], 0, 57647, [57648, 148668], [57649, 134355], 9650 [21414, 57650], [20151, 57651], 0, [21416, 57653], [57654, 137073], 9651 [24073, 57655], 57656, [57657, 164994], [24313, 57658], [24315, 57659], 9652 [14496, 57660], [24316, 57661], [26686, 57662], [37915, 57663], 9653 [24333, 57664], [57665, 131521], [57666, 194708], [15070, 57667], 9654 [57669, 135994], [24378, 57670], [57671, 157832], [57672, 140240], 9655 [57674, 140401], [24419, 57675], [57677, 159342], [24434, 57678], 9656 [37696, 57679], [57680, 166454], [24487, 57681], [23990, 57682], 9657 [15711, 57683], [57684, 152144], [57685, 139114], [57686, 159992], 9658 [57687, 140904], [37334, 57688], [57689, 131742], [57690, 166441], 9659 [24625, 57691], [26245, 57692], [14691, 57694], [15815, 57695], 9660 [13881, 57696], [22416, 57697], [57698, 141236], [31089, 57699], 9661 [15936, 57700], [24734, 57701], 0, 0, [57704, 149890], [57705, 149903], 9662 [57706, 162387], [29860, 57707], [20705, 57708], [23200, 57709], 9663 [24932, 57710], [24898, 57712], [57713, 194726], [57714, 159442], 9664 [24961, 57715], [20980, 57716], [57717, 132694], [24967, 57718], 9665 [23466, 57719], [57720, 147383], [57721, 141407], [25043, 57722], 9666 [57723, 166813], [57724, 170333], [25040, 57725], [14642, 57726], 9667 [57727, 141696], [57728, 141505], [24611, 57729], [24924, 57730], 9668 [25886, 57731], [25483, 57732], [57733, 131352], [25285, 57734], 9669 [57735, 137072], [25301, 57736], [57737, 142861], [25452, 57738], 9670 [57739, 149983], [14871, 57740], [25656, 57741], [25592, 57742], 9671 [57743, 136078], [57744, 137212], [28554, 57746], [57747, 142902], 0, 9672 [57750, 153373], [25825, 57751], [25829, 57752], [38011, 57753], 9673 [14950, 57754], [25658, 57755], [14935, 57756], [25933, 57757], 9674 [28438, 57758], [57759, 150056], [57760, 150051], [25989, 57761], 9675 [25965, 57762], [25951, 57763], 0, [26037, 57765], [57766, 149824], 9676 [19255, 57767], [26065, 57768], [16600, 57769], [57770, 137257], 57771, 9677 [26083, 57772], [24543, 57773], [57774, 144384], [26136, 57775], 9678 [57776, 143863], [57777, 143864], [26180, 57778], [57779, 143780], 9679 [57780, 143781], [26187, 57781], [57782, 134773], [26215, 57783], 9680 [57784, 152038], [26227, 57785], 0, [57788, 143921], [57789, 165364], 9681 [57790, 143816], [57791, 152339], [30661, 57792], [57793, 141559], 9682 [39332, 57794], [26370, 57795], [57796, 148380], [57797, 150049], 9683 [27130, 57799], [57800, 145346], 0, [26471, 57802], [26466, 57803], 9684 [57804, 147917], [57805, 168173], [26583, 57806], [17641, 57807], 9685 [26658, 57808], [28240, 57809], [37436, 57810], [26625, 57811], 9686 [57812, 144358], [57813, 159136], [26717, 57814], [57815, 144495], 9687 [27105, 57816], [27147, 57817], [57818, 166623], [26995, 57819], 9688 [26819, 57820], [57821, 144845], [26881, 57822], [26880, 57823], 9689 [14849, 57825], [57826, 144956], [15232, 57827], [26540, 57828], 9690 [26977, 57829], [57830, 166474], [17148, 57831], [26934, 57832], 9691 [27032, 57833], [15265, 57834], [57835, 132041], [33635, 57836], 9692 [20624, 57837], [27129, 57838], [57839, 144985], [57840, 139562], 9693 [27205, 57841], [57842, 145155], [27293, 57843], [15347, 57844], 9694 [26545, 57845], [27336, 57846], [57847, 168348], [15373, 57848], 9695 [27421, 57849], [57850, 133411], [24798, 57851, 60308], [27445, 57852], 9696 [27508, 57853], [57854, 141261], [28341, 57855], [57856, 146139], 0, 9697 [57858, 137560], [14144, 57859], [21537, 57860], [57861, 146266], 9698 [27617, 57862], [57863, 147196], [27612, 57864], [27703, 57865], 9699 [57866, 140427], [57867, 149745], [57868, 158545], [27738, 57869], 9700 [33318, 57870], [27769, 57871], [57872, 146876], [17605, 57873], 9701 [57874, 146877], [57875, 147876], [57876, 149772], [57877, 149760], 9702 [57878, 146633], [14053, 57879], [15595, 57880], [57881, 134450], 9703 [39811, 57882], [57883, 143865], [57884, 140433], [32655, 57885], 9704 [26679, 57886], [57887, 159013], [57888, 159137], [57889, 159211], 9705 [28054, 57890], [27996, 57891], [28284, 57892], [28420, 57893], 9706 [57894, 149887], [57895, 147589], [57896, 159346], [34099, 57897], 9707 [57898, 159604], [20935, 57899], 0, 0, [33838, 57902], [57903, 166689], 0, 9708 [57905, 146991], [29779, 57906], [57907, 147330], [31180, 57908], 9709 [28239, 57909], [23185, 57910], [57911, 143435], [28664, 57912], 9710 [14093, 57913], [28573, 57914], [57915, 146992], [28410, 57916], 9711 [57917, 136343], [57918, 147517], [17749, 57919], [37872, 57920], 9712 [28484, 57921], [28508, 57922], [15694, 57923], [28532, 57924], 9713 [57925, 168304], [15675, 57926], [28575, 57927], [57928, 147780], 9714 [28627, 57929], [57930, 147601], [57931, 147797], [57932, 147513], 9715 [57933, 147440], [57934, 147380], [57935, 147775], [20959, 57936], 9716 [57937, 147798], [57938, 147799], [57939, 147776], [57940, 156125], 9717 [28747, 57941], [28798, 57942], [28839, 57943], 0, [28876, 57945], 9718 [28885, 57946], [28886, 57947], [28895, 57948], [16644, 57949], 9719 [15848, 57950], [29108, 57951], [29078, 57952], [57953, 148087], 9720 [28971, 57954], [28997, 57955], [23176, 57956], [29002, 57957], 0, 9721 [57960, 148325], [29007, 57961], [37730, 57962], [57963, 148161], 9722 [28972, 57964], [57965, 148570], [57966, 150055], [57967, 150050], 9723 [29114, 57968], [57969, 166888], [28861, 57970], [29198, 57971], 9724 [37954, 57972], [29205, 57973], [22801, 57974], [37955, 57975], 9725 [29220, 57976], [37697, 57977], [57978, 153093], [29230, 57979], 9726 [29248, 57980], [57981, 149876], [26813, 57982], [29269, 57983], 9727 [29271, 57984], [15957, 57985], [57986, 143428], [26637, 57987], 9728 [28477, 57988], [29314, 57989], 0, [29483, 57991], [57992, 149539], 9729 [57993, 165931], [18669, 57994], [57995, 165892], [29480, 57996], 9730 [29486, 57997], [29647, 57998], [29610, 57999], [58000, 134202], 9731 [58001, 158254], [29641, 58002], [29769, 58003], [58004, 147938], 9732 [58005, 136935], [58006, 150052], [26147, 58007], [14021, 58008], 9733 [58009, 149943], [58010, 149901], [58011, 150011], [29687, 58012], 9734 [29717, 58013], [26883, 58014], [58015, 150054], [29753, 58016], 9735 [16087, 58018], 0, [58020, 141485], [29792, 58021], [58022, 167602], 9736 [29767, 58023], [29668, 58024], [29814, 58025], [33721, 58026], 9737 [29804, 58027], [29812, 58029], [37873, 58030], [27180, 58031], 9738 [29826, 58032], [18771, 58033], [58034, 150156], [58035, 147807], 9739 [58036, 150137], [58037, 166799], [23366, 58038], [58039, 166915], 9740 [58040, 137374], [29896, 58041], [58042, 137608], [29966, 58043], 9741 [29982, 58045], [58046, 167641], [58047, 137803], [23511, 58048], 9742 [58049, 167596], [37765, 58050], [30029, 58051], [30026, 58052], 9743 [30055, 58053], [30062, 58054], [58055, 151426], [16132, 58056], 9744 [58057, 150803], [30094, 58058], [29789, 58059], [30110, 58060], 9745 [30132, 58061], [30210, 58062], [30252, 58063], [30289, 58064], 9746 [30287, 58065], [30319, 58066], 58067, [58068, 156661], [30352, 58069], 9747 [33263, 58070], [14328, 58071], [58072, 157969], [58073, 157966], 9748 [30369, 58074], [30373, 58075], [30391, 58076], [30412, 58077], 9749 [58078, 159647], [33890, 58079], [58080, 151709], [58081, 151933], 9750 [58082, 138780], [30494, 58083], [30502, 58084], [30528, 58085], 9751 [25775, 58086], [58087, 152096], [30552, 58088], [58089, 144044], 9752 [30639, 58090], [58091, 166244], [58092, 166248], [58093, 136897], 9753 [30708, 58094], 0, [26826, 58098], [30895, 58099], [30919, 58100], 9754 [30931, 58101], [38565, 58102], [31022, 58103], [58104, 153056], 9755 [30935, 58105], [31028, 58106], [30897, 58107], [58108, 161292], 9756 [36792, 58109], [34948, 58110], [58113, 140828], [31110, 58114], 9757 [35072, 58115], [26882, 58116], [31104, 58117], [58118, 153687], 9758 [31133, 58119], [58120, 162617], [31036, 58121], [31145, 58122], 9759 [28202, 58123], [58124, 160038], [16040, 58125], [31174, 58126], 9760 [58127, 168205], [31188, 58128], 0, [21797, 62526], 0, [62528, 134210], 9761 [62529, 134421], [62530, 151851], [21904, 62531], [62532, 142534], 9762 [14828, 62533], [62534, 131905], [36422, 62535], [62536, 150968], 9763 [62537, 169189], 0, [62539, 164030], [30586, 62540], [62541, 142392], 9764 [14900, 62542], [18389, 62543], [62544, 164189], [62545, 158194], 9765 [62546, 151018], [25821, 62547], [62548, 134524], [62549, 135092], 9766 [62550, 134357], 0, [25741, 62552], [36478, 62553], [62554, 134806], 0, 9767 [62556, 135012], [62557, 142505], [62558, 164438], [62559, 148691], 0, 9768 [62561, 134470], [62562, 170573], [62563, 164073], [18420, 62564], 9769 [62565, 151207], [62566, 142530], [39602, 62567], [14951, 62568], 9770 [62569, 169460], [16365, 62570], [13574, 62571], [62572, 152263], 9771 [62573, 169940], 0, [62575, 142660], [40302, 62576], [38933, 62577], 0, 9772 [17369, 62579], 0, [25780, 62581], [21731, 62582], 0, [62584, 142282], 0, 9773 [14843, 62586], 0, [62588, 157402], [62589, 157462], [62590, 162208], 9774 [25834, 62591], [62592, 151634], [62593, 134211], [36456, 62594], 0, 9775 [62596, 166732], [62597, 132913], 0, [18443, 62599], [62600, 131497], 9776 [16378, 62601], [22643, 62602], [62603, 142733], 0, [62605, 148936], 9777 [62606, 132348], [62607, 155799], [62608, 134988], 0, [21881, 62610], 0, 9778 [17338, 62612], 0, [19124, 62614], [62615, 141926], [62616, 135325], 9779 [33194, 62617], [39157, 62618], [62619, 134556], [25465, 62620], 9780 [14846, 62621], [62622, 141173], [36288, 62623], [22177, 62624], 9781 [25724, 62625], [15939, 62626], 0, [62628, 173569], [62629, 134665], 9782 [62630, 142031], 0, 0, [62633, 135368], [62634, 145858], [14738, 62635], 9783 [14854, 62636], [62637, 164507], [13688, 62638], [62639, 155209], 9784 [62640, 139463], 0, 0, [62643, 142514], [62644, 169760], [13500, 62645], 9785 [27709, 62646], [62647, 151099], 0, 0, [62650, 161140], [62651, 142987], 9786 [62652, 139784], [62653, 173659], [62654, 167117], [62655, 134778], 9787 [62656, 134196], [62683, 161337], [62684, 142286], [62687, 142417], 9788 [14872, 62689], [62691, 135367], [62693, 173618], [62695, 167122], 9789 [62696, 167321], [62697, 167114], [38314, 62698], 0, [62706, 161630], 9790 [28992, 62708], 0, [20822, 62385], 0, [20616, 62487], 0, [13459, 62489], 9791 [20870, 62491], [24130, 63037], [20997, 62495], [21031, 62436], 9792 [21113, 62497], 0, [13651, 62504], [21442, 62505], [21343, 62715], 0, 9793 [21823, 62520], 0, [21976, 59986], [13789, 62722], [22049, 63067], 0, 9794 [22100, 60044], [60148, 135291], 0, [60153, 135379], 0, [61095, 135934], 0, 9795 0, [14265, 60104], [23745, 61099], [23829, 63066], [23894, 63030], 9796 [14392, 63036], [20097, 62477], [24253, 63038], [14612, 63042], 9797 [25017, 63050], [25232, 63054], [25368, 63056], [25690, 63063], 9798 [25745, 62381], [33133, 62709], [33156, 59922], [33171, 59924], 9799 [26624, 63080], [15292, 63093], [29327, 60517], [29389, 59781], 0, 9800 [29497, 59785], [30018, 59811], [30172, 59817], [16320, 59818], 9801 [60278, 151205], [16343, 59820], 0, 30336, [30348, 59824, 151388], 9802 [16552, 59845], [30777, 59846], [16643, 59855], [31377, 59863], 9803 [31771, 59876], [31981, 59884], [32659, 62658], [32686, 59892], 0, 9804 [33535, 59936], [22623, 59981], [34482, 59960], 0, [34699, 59963], 9805 [35143, 59969], 0, [35369, 59972], 0, [36465, 59988], [60484, 164233], 9806 [36528, 59990], 0, [37214, 62443], [37260, 62441], [39182, 60051], 9807 [39196, 60054], 0, 0, [39809, 60066], [40384, 60080], [40339, 60078], 9808 [40620, 60085], [19857, 60540], 0, 37818, [40571, 60084], [28809, 63148], 9809 [29512, 59788], 0, [31129, 59858], [36791, 59997], 0, [39234, 60056], 9810 {s: 193}, 8364, {s: 4}, [12443, 63518], [12444, 63519], [11904, 63520], 9811 {f: 5, c: 62211}, [62216, 131340], 62217, [62218, 131281], [62219, 131277], 9812 {f: 2, c: 62220}, [62222, 131275], [62223, 139240], 62224, [62225, 131274], 9813 {f: 4, c: 62226}, [62230, 131342], {f: 2, c: 62231}, {f: 2, c: 62776}, 9814 [62778, 138177], [62779, 194680], [12205, 38737, 62780], [62781, 131206], 9815 [20059, 62782], [20155, 62783], [13630, 62784], [23587, 62785], 9816 [24401, 62786], [24516, 62787], [14586, 62788], [25164, 62789], 9817 [25909, 62790], [27514, 62791], [27701, 62792], [27706, 62793], 9818 [28780, 62794], [29227, 62795], [20012, 62796], [29357, 62797], 9819 [62798, 149737], [32594, 62799], [31035, 62800], [31993, 62801], 9820 [32595, 62802], [62803, 156266], [13505, 62804], [62806, 156491], 9821 [32770, 62807], [32896, 62808], [62809, 157202], [62810, 158033], 9822 [21341, 62811], [34916, 62812], [35265, 62813], [62814, 161970], 9823 [35744, 62815], [36125, 62816], [38021, 62817], [38264, 62818], 9824 [38271, 62819], [38376, 62820], [62821, 167439], [38886, 62822], 9825 [39029, 62823], [39118, 62824], [39134, 62825], [39267, 62826], 9826 [62827, 170000], [40060, 62828], [40479, 62829], [40644, 62830], 9827 [27503, 62831], [62832, 63751], [20023, 62833], [62834, 131207], 9828 [38429, 62835], [25143, 62836], [38050, 62837], [11908, 63521], 9829 [11910, 63522], [11911, 63523], [11912, 63524], [11914, 63525], 9830 [11916, 63526], [11917, 63527], [11925, 63528], [11932, 63529], 9831 [11941, 63531], [11943, 63532], [11946, 63533], [11948, 63534], 9832 [11950, 63535], [11958, 63536], [11964, 63537], [11966, 63538], 9833 [11978, 63540], [11980, 63541], [11981, 63542], [11983, 63543], 9834 [11990, 63544], [11991, 63545], [11998, 63546], [62368, 172969], 9835 [62369, 135493], [25866, 62371], [20029, 62374], [28381, 62375], 9836 [40270, 62376], [37343, 62377], [62380, 161589], [20250, 62382], 9837 [20264, 62383], [20392, 62384], [20852, 62386], [20892, 62387], 9838 [20964, 62388], [21153, 62389], [21160, 62390], [21307, 62391], 9839 [21326, 62392], [21457, 62393], [21464, 62394], [22242, 62395], 9840 [22768, 62396], [22788, 62397], [22791, 62398], [22834, 62399], 9841 [22836, 62400], [23398, 62401], [23454, 62402], [23455, 62403], 9842 [23706, 62404], [24198, 62405], [24635, 62406], [25993, 62407], 9843 [26622, 62408], [26628, 62409], [26725, 62410], [27982, 62411], 9844 [28860, 62412], [30005, 62413], [32420, 62414], [32428, 62415], 9845 [32442, 62416], [32455, 62417], [32463, 62418], [32479, 62419], 9846 [32518, 62420], [32567, 62421], [33402, 62422], [33487, 62423], 9847 [33647, 62424], [35270, 62425], [35774, 62426], [35810, 62427], 9848 [36710, 62428], [36711, 62429], [36718, 62430], [29713, 62431], 9849 [31996, 62432], [32205, 62433], [26950, 62434], [31433, 62435], 9850 [30904, 62442], [32956, 62444], [36107, 62446], [33014, 62447], 9851 [62448, 133607], [32927, 62451], [40647, 62452], [19661, 62453], 9852 [40393, 62454], [40460, 62455], [19518, 62456], [62457, 171510], 9853 [62458, 159758], [40458, 62459], [62460, 172339], [13761, 62461], 9854 [28314, 62463], [33342, 62464], [29977, 62465], [18705, 62467], 9855 [39532, 62468], [39567, 62469], [40857, 62470], [31111, 62471], 9856 [62472, 164972], [62473, 138698], [62474, 132560], [62475, 142054], 9857 [20004, 62476], [20096, 62478], [20103, 62479], [20159, 62480], 9858 [20203, 62481], [20279, 62482], [13388, 62483], [20413, 62484], 9859 [15944, 62485], [20483, 62486], [13437, 62488], [13477, 62490], 9860 [22789, 62492], [20955, 62493], [20988, 62494], [20105, 62496], 9861 [21136, 62498], [21287, 62499], [13767, 62500], [21417, 62501], 9862 [13649, 62502], [21424, 62503], [21539, 62506], [13677, 62507], 9863 [13682, 62508], [13953, 62509], [21651, 62510], [21667, 62511], 9864 [21684, 62512], [21689, 62513], [21712, 62514], [21743, 62515], 9865 [21784, 62516], [21795, 62517], [21800, 62518], [13720, 62519], 9866 [13733, 62521], [13759, 62522], [21975, 62523], [13765, 62524], 9867 [62525, 163204], [16467, 62538], [62551, 135412], [62555, 134155], 9868 [62574, 161992], [62580, 155813], [62583, 142668], [62585, 135287], 9869 [62587, 135279], [62595, 139681], [62609, 134550], [16571, 62611], 9870 [62631, 142537], [22098, 62641], [62642, 134961], [62657, 157724], 9871 [62659, 135375], [62660, 141315], [62661, 141625], [13819, 62662], 9872 [62663, 152035], [62664, 134796], [62665, 135053], [62666, 134826], 9873 [16275, 62667], [62668, 134960], [62669, 134471], [62670, 135503], 9874 [62671, 134732], [62673, 134827], [62674, 134057], [62675, 134472], 9875 [62676, 135360], [62677, 135485], [16377, 62678], [62679, 140950], 9876 [25650, 62680], [62681, 135085], [62682, 144372], [62685, 134526], 9877 [62686, 134527], [62688, 142421], [62690, 134808], [62692, 134958], 9878 [62694, 158544], [21708, 62699], [33476, 62700], [21945, 62701], 9879 [62703, 171715], [39974, 62704], [39606, 62705], [62707, 142830], 9880 [33004, 62710], [23580, 62711], [62712, 157042], [33076, 62713], 9881 [14231, 62714], [62716, 164029], [37302, 62717], [62718, 134906], 9882 [62719, 134671], [62720, 134775], [62721, 134907], [62723, 151019], 9883 [13833, 62724], [62725, 134358], [22191, 62726], [62727, 141237], 9884 [62728, 135369], [62729, 134672], [62730, 134776], [62731, 135288], 9885 [62732, 135496], [62733, 164359], [62734, 136277], [62735, 134777], 9886 [62736, 151120], [62737, 142756], [23124, 62738], [62739, 135197], 9887 [62740, 135198], [62741, 135413], [62742, 135414], [22428, 62743], 9888 [62744, 134673], [62745, 161428], [62746, 164557], [62747, 135093], 9889 [62748, 134779], [62749, 151934], [14083, 62750], [62751, 135094], 9890 [62752, 135552], [62753, 152280], [62754, 172733], [62755, 149978], 9891 [62756, 137274], [62757, 147831], [62758, 164476], [22681, 62759], 9892 [21096, 62760], [13850, 62761], [62762, 153405], [31666, 62763], 9893 [23400, 62764], [18432, 62765], [19244, 62766], [40743, 62767], 9894 [18919, 62768], [39967, 62769], [39821, 62770], [62771, 154484], 9895 [62772, 143677], [22011, 62773], [13810, 62774], [22153, 62775], 9896 [23870, 63028], [23880, 63029], [15868, 63031], [14351, 63032], 9897 [23972, 63033], [23993, 63034], [14368, 63035], [24357, 63039], 9898 [24451, 63040], [14600, 63041], [14655, 63043], [14669, 63044], 9899 [24791, 63045], [24893, 63046], [23781, 63047], [14729, 63048], 9900 [25015, 63049], [25039, 63051], [14776, 63052], [25132, 63053], 9901 [25317, 63055], [14840, 63057], [22193, 63058], [14851, 63059], 9902 [25570, 63060], [25595, 63061], [25607, 63062], [14923, 63064], 9903 [25792, 63065], [40863, 63068], [14999, 63069], [25990, 63070], 9904 [15037, 63071], [26111, 63072], [26195, 63073], [15090, 63074], 9905 [26258, 63075], [15138, 63076], [26390, 63077], [15170, 63078], 9906 [26532, 63079], [15192, 63081], [26698, 63082], [26756, 63083], 9907 [15218, 63084], [15217, 63085], [15227, 63086], [26889, 63087], 9908 [26947, 63088], [29276, 63089], [26980, 63090], [27039, 63091], 9909 [27013, 63092], [27094, 63094], [15325, 63095], [27237, 63096], 9910 [27252, 63097], [27249, 63098], [27266, 63099], [15340, 63100], 9911 [27289, 63101], [15346, 63102], [27307, 63103], [27317, 63104], 9912 [27348, 63105], [27382, 63106], [27521, 63107], [27585, 63108], 9913 [27626, 63109], [27765, 63110], [27818, 63111], [15563, 63112], 9914 [27906, 63113], [27910, 63114], [27942, 63115], [28033, 63116], 9915 [15599, 63117], [28068, 63118], [28081, 63119], [28181, 63120], 9916 [28184, 63121], [28201, 63122], [28294, 63123], [63124, 166336], 9917 [28347, 63125], [28386, 63126], [28378, 63127], [40831, 63128], 9918 [28392, 63129], [28393, 63130], [28452, 63131], [28468, 63132], 9919 [15686, 63133], [63134, 147265], [28545, 63135], [28606, 63136], 9920 [15722, 63137], [15733, 63138], [29111, 63139], [23705, 63140], 9921 [15754, 63141], [28716, 63142], [15761, 63143], [28752, 63144], 9922 [28756, 63145], [28783, 63146], [28799, 63147], [63149, 131877], 9923 [17345, 63150], [13809, 63151], [63152, 134872], [13902, 58134], 9924 [15789, 58172], [58173, 154725], [26237, 58183], [31860, 58188], 9925 [29837, 58197], [32402, 58215], [17667, 58232], [58260, 151480], 9926 [58270, 133901], [58277, 158474], [13438, 58311], [58317, 143087], 9927 [58325, 146613], [58343, 159385], [34673, 58364], [25537, 58385], 9928 [30583, 58387], [35210, 58390], [58406, 147343], [35660, 58415], 9929 [58440, 150729], [18730, 58464], [58471, 172052], [58472, 165564], 9930 [58473, 165121], [15088, 58490], [28815, 58511], [58529, 140922], 9931 [58637, 158120], [58646, 148043], [26760, 58662], [58664, 139611], 9932 [40802, 58702], [37830, 58793], [58802, 131967], [37734, 58888], 9933 [37519, 58901], [34324, 58954], [58986, 173147], [16784, 59010], 9934 [26511, 59045], [26654, 59048], [14435, 59051], [59077, 149996], 9935 [15129, 59128], [33942, 59176], [59241, 149858], [14818, 59254], 9936 [33920, 59259], [17262, 59328], [38769, 59402], [39323, 59427], 9937 [18733, 59499], [28439, 59703], [59704, 160009], [28838, 59746], 9938 [59752, 150095], [32357, 59753], [23855, 59755], [15859, 59756], 9939 [59758, 150109], [59759, 137183], [32164, 59760], [33830, 59761], 9940 [21637, 59762], [59763, 146170], [59765, 131604], [22398, 59766], 9941 [59767, 133333], [59768, 132633], [16357, 59769], [59770, 139166], 9942 [59771, 172726], [28675, 59772], [59773, 168283], [23920, 59774], 9943 [29583, 59775], [59777, 166489], [59778, 168992], [20424, 59779], 9944 [32743, 59780], [29456, 59782], [29496, 59784], [29505, 59787], 9945 [16041, 59789], [29173, 59792], [59793, 149746], [29665, 59794], 9946 [16074, 59796], [16081, 59798], [29721, 59801], [29726, 59802], 9947 [29727, 59803], [16098, 59804], [16112, 59805], [16116, 59806], 9948 [16122, 59807], [29907, 59808], [16142, 59809], [16211, 59810], 9949 [30061, 59812], [30066, 59813], [30093, 59814], [16252, 59815], 9950 [30152, 59816], [30285, 59819], [30324, 59821], [16348, 59822], 9951 [30330, 59823], [29064, 59825], [22051, 59826], [35200, 59827], 9952 [16413, 59829], [30531, 59830], [16441, 59831], [16453, 59833], 9953 [13787, 59834], [30616, 59835], [16490, 59836], [16495, 59837], 9954 [30654, 59839], [30667, 59840], [30744, 59842], [30748, 59844], 9955 [30791, 59847], [30801, 59848], [30822, 59849], [33864, 59850], 9956 [59851, 152885], [31027, 59852], [31026, 59854], [16649, 59856], 9957 [31121, 59857], [31238, 59860], [16743, 59862], [16818, 59864], 9958 [31420, 59865], [33401, 59866], [16836, 59867], [31439, 59868], 9959 [31451, 59869], [16847, 59870], [31586, 59872], [31596, 59873], 9960 [31611, 59874], [31762, 59875], [16992, 59877], [17018, 59878], 9961 [31867, 59879], [31900, 59880], [17036, 59881], [31928, 59882], 9962 [17044, 59883], [36755, 59885], [28864, 59886], [59887, 134351], 9963 [32207, 59888], [32212, 59889], [32208, 59890], [32253, 59891], 9964 [32692, 59893], [29343, 59894], [17303, 59895], [32800, 59896], 9965 [32805, 59897], [32814, 59899], [32817, 59900], [32852, 59901], 9966 [22452, 59903], [28832, 59904], [32951, 59905], [33001, 59906], 9967 [17389, 59907], [33036, 59908], [33038, 59910], [33042, 59911], 9968 [33044, 59913], [17409, 59914], [15161, 59915], [33110, 59916], 9969 [33113, 59917], [33114, 59918], [17427, 59919], [33148, 59921], 9970 [17445, 59923], [17453, 59925], [33189, 59926], [22511, 59927], 9971 [33217, 59928], [33252, 59929], [33364, 59930], [17551, 59931], 9972 [33398, 59933], [33482, 59934], [33496, 59935], [17584, 59937], 9973 [33623, 59938], [38505, 59939], [33797, 59941], [28917, 59942], 9974 [33892, 59943], [33928, 59945], [17668, 59946], [33982, 59947], 9975 [34017, 59948], [34040, 59949], [34064, 59950], [34104, 59951], 9976 [34130, 59952], [17723, 59953], [34159, 59954], [34160, 59955], 9977 [34272, 59956], [17783, 59957], [34418, 59958], [34450, 59959], 9978 [34543, 59961], [38469, 59962], [17926, 59964], [17943, 59965], 9979 [34990, 59966], [35071, 59967], [35108, 59968], [35217, 59970], 9980 [59971, 162151], [35384, 59973], [35476, 59974], [35508, 59975], 9981 [35921, 59976], [36052, 59977], [36082, 59978], [36124, 59979], 9982 [18328, 59980], [36291, 59982], [18413, 59983], [36410, 59985], 9983 [22356, 59987], [22005, 59989], [18487, 59991], [36558, 59992], 9984 [36578, 59993], [36580, 59994], [36589, 59995], [36594, 59996], 9985 [36801, 59998], [36810, 59999], [36812, 60000], [36915, 60001], 9986 [18605, 60003], [39136, 60004], [37395, 60005], [18718, 60006], 9987 [37416, 60007], [37464, 60008], [37483, 60009], [37553, 60010], 9988 [37550, 60011], [37567, 60012], [37603, 60013], [37611, 60014], 9989 [37619, 60015], [37620, 60016], [37629, 60017], [37699, 60018], 9990 [37764, 60019], [37805, 60020], [18757, 60021], [18769, 60022], 9991 [37911, 60024], [37917, 60026], [37933, 60027], [37950, 60028], 9992 [18794, 60029], [37972, 60030], [38009, 60031], [38189, 60032], 9993 [38306, 60033], [18855, 60034], [38388, 60035], [38451, 60036], 9994 [18917, 60037], [18980, 60039], [38720, 60040], [18997, 60041], 9995 [38834, 60042], [38850, 60043], [19172, 60045], [39097, 60047], 9996 [19225, 60048], [39153, 60049], [22596, 60050], [39193, 60052], 9997 [39223, 60055], [39261, 60057], [39266, 60058], [19312, 60059], 9998 [39365, 60060], [19357, 60061], [39484, 60062], [39695, 60063], 9999 [39785, 60065], [39901, 60067], [39921, 60068], [39924, 60069], 10000 [19565, 60070], [39968, 60071], [14191, 60072], [60073, 138178], 10001 [40265, 60074], [40702, 60076], [22096, 60077], [40381, 60079], 10002 [40444, 60081], [38134, 60082], [36790, 60083], [40625, 60086], 10003 [40637, 60087], [40646, 60088], [38108, 60089], [40674, 60090], 10004 [40689, 60091], [40696, 60092], [40772, 60094], [60095, 131220], 10005 [60096, 131767], [60097, 132000], [38083, 60099], [60101, 132311], 10006 [38081, 60103], [60105, 132565], [60106, 132629], [60107, 132726], 10007 [60108, 136890], [22359, 60109], [29043, 60110], [60111, 133826], 10008 [60112, 133837], [60113, 134079], [60115, 194619], [60116, 134091], 10009 [21662, 60117], [60118, 134139], [60119, 134203], [60120, 134227], 10010 [60121, 134245], [60122, 134268], [60124, 134285], [60126, 134325], 10011 [60127, 134365], [60128, 134381], [60129, 134511], [60130, 134578], 10012 [60131, 134600], [60135, 134660], [60136, 134670], [60137, 134871], 10013 [60138, 135056], [60139, 134957], [60140, 134771], [60142, 135100], 10014 [60144, 135260], [60145, 135247], [60146, 135286], [60149, 135304], 10015 [60150, 135318], [13895, 60151], [60152, 135359], [60154, 135471], 10016 [60155, 135483], [21348, 60156], [60158, 135907], [60159, 136053], 10017 [60160, 135990], [60162, 136567], [60163, 136729], [60164, 137155], 10018 [60165, 137159], [28859, 60167], [60168, 137261], [60169, 137578], 10019 [60170, 137773], [60171, 137797], [60172, 138282], [60173, 138352], 10020 [60174, 138412], [60175, 138952], [60177, 138965], [60178, 139029], 10021 [29080, 60179], [60181, 139333], [27113, 60182], [14024, 60183], 10022 [60184, 139900], [60185, 140247], [60186, 140282], [60187, 141098], 10023 [60188, 141425], [60189, 141647], [60191, 141671], [60192, 141715], 10024 [60193, 142037], [60195, 142056], [60197, 142094], [60199, 142143], 10025 [60202, 142412], [60204, 142472], [60205, 142519], [60206, 154600], 10026 [60207, 142600], [60208, 142610], [60209, 142775], [60210, 142741], 10027 [60211, 142914], [60212, 143220], [60213, 143308], [60214, 143411], 10028 [60215, 143462], [60216, 144159], [60217, 144350], [60222, 144743], 10029 [60223, 144883], [60227, 144922], [60228, 145174], [22709, 60231], 10030 [60234, 146087], [60237, 146961], [60238, 147129], [60243, 147737], 10031 [60245, 148206], [60246, 148237], [60248, 148276], [60249, 148374], 10032 [60258, 148484], [60259, 148694], [22408, 60260], [60261, 149108], 10033 [60263, 149295], [60271, 149522], [60272, 149755], [60273, 150037], 10034 [60275, 150208], [22885, 60277], [60279, 151430], [60282, 151596], 10035 [22335, 60284], [60286, 152217], [60287, 152601], [60291, 152646], 10036 [60292, 152686], [60296, 152895], [60298, 152926], [60300, 152930], 10037 [60301, 152934], [60302, 153543], [60304, 153693], [60309, 153859], 10038 [60312, 154286], [60313, 154505], [60314, 154630], [22433, 60316], 10039 [29009, 60317], [60319, 155906], [60322, 156082], [60325, 156674], 10040 [60326, 156746], [60330, 156804], [60334, 156808], [60336, 156946], 10041 [60338, 157119], [60339, 157365], [22201, 60347], [60349, 157436], 10042 [13848, 60355], [60357, 157593], [60358, 157806], [60360, 157790], 10043 [60362, 157895], [60366, 157990], [60368, 158009], [60371, 158202], 10044 [60373, 158253], [60378, 158260], [60379, 158555], [60383, 158621], 10045 [60385, 158884], [60388, 159150], [60392, 159819], [60393, 160205], 10046 [60395, 160384], [60396, 160389], [60399, 160395], [60401, 160486], 10047 [38047, 60404], [60405, 160848], [14009, 60416], [60424, 161740], 10048 [60425, 161880], [22230, 60426], [60435, 162269], [60441, 162301], 10049 [60442, 162314], [60443, 162571], [60444, 163174], [60448, 163849], 10050 [60459, 163875], [60463, 163912], [60466, 163971], [60479, 163984], 10051 [60480, 164084], [60481, 164142], [60483, 164175], [60485, 164271], 10052 [60486, 164378], [60487, 164614], [60488, 164655], [60489, 164746], 10053 [60491, 164968], [60492, 165546], [25574, 60494], [60495, 166230], 10054 [60498, 166328], [60500, 166375], [60502, 166376], [60503, 166726], 10055 [60504, 166868], [60506, 166921], [60508, 167877], [60509, 168172], 10056 [60511, 168208], [60512, 168252], [15863, 60513], [60514, 168286], 10057 [60515, 150218], [36816, 60516], [60519, 169191], [60521, 169392], 10058 [60522, 169400], [60523, 169778], [60524, 170193], [60525, 170313], 10059 [60526, 170346], [60527, 170435], [60528, 170536], [60529, 170766], 10060 [60530, 171354], [60531, 171419], [32415, 60532], [60533, 171768], 10061 [60534, 171811], [19620, 60535], [38215, 60536], [60537, 172691], 10062 [29090, 60538], [60539, 172799], [60542, 173515], [19868, 60543], 10063 [60544, 134300], [36798, 60545], [36794, 60547], [60548, 140464], 10064 [36793, 60549], [60550, 150163], [20202, 60555], [60557, 166700], 10065 [36480, 60560], [60561, 137205], [60563, 166764], [60564, 166809], 10066 [60566, 157359], [60568, 161365], [60570, 153141], [60571, 153942], 10067 [20122, 60572], [60573, 155265], [60576, 134765], [60579, 147080], 10068 [60580, 150686], [60583, 137206], [60584, 137339], [60587, 154698], 10069 [60589, 152337], [15814, 60590], [60596, 155352], [19996, 60600], 10070 [60601, 135146], [60602, 134473], [60603, 145082], [60638, 151880], 10071 [21982, 60644], [34694, 60672], [60676, 135361], [60679, 149254], 10072 [23440, 60680], [60682, 157843], [60684, 141044], [60685, 163119], 10073 [60686, 147875], [60687, 163187], [60688, 159440], [60689, 160438], 10074 [60691, 135641], [60693, 146684], [60694, 173737], [60695, 134828], 10075 [60698, 138402], [60700, 151490], [60702, 135147], [60706, 142752], 10076 [60710, 135148], [60711, 134666], [60714, 135149], [60717, 135559], 10077 [19994, 60721], [19972, 60722], [23309, 60724], [13996, 60727], 10078 [21373, 60729], [13989, 60730], [22682, 60732], [60733, 150382], 10079 [22442, 60736], [60737, 154261], [60738, 133497], [60741, 140389], 10080 [60746, 146686], [60747, 171824], [60749, 151465], [60750, 169374], 10081 [60753, 146870], [60755, 157619], [60756, 145184], [60759, 147191], 10082 [60760, 146988], [60785, 143578], [60789, 135849], [22439, 60790], 10083 [60791, 149859], [60794, 159918], [60801, 137068], [60806, 160100], 10084 [60809, 159010], [60810, 150242], [39963, 60837], [60838, 149822], 10085 [15878, 60846], [60881, 159011], [60887, 132092], [60891, 146685], 10086 [60893, 149785], [22394, 60904], [21722, 60912], [29050, 60928], 10087 [60949, 150135], [60955, 166490], [60962, 194624], [60976, 137275], 10088 [61000, 155993], [61014, 144373], [61019, 166850], [61024, 138566], 10089 [61054, 159441], [13877, 61065], [61084, 166701], [21024, 61088], 10090 [15384, 61089], [61090, 146631], [61091, 155351], [61092, 161366], 10091 [61093, 152881], [61094, 137540], [61096, 170243], [61097, 159196], 10092 [61098, 159917], [61100, 156077], [61101, 166415], [61102, 145015], 10093 [61103, 131310], [61104, 157766], [61105, 151310], [17762, 61106], 10094 [23327, 61107], [61108, 156492], [40784, 61109], [40614, 61110], 10095 [61111, 156267], [20962, 57415], [21314, 57416], [26285, 57520], 10096 [22620, 57547], [21843, 57566], [15749, 57594], [24928, 57608], 10097 [18606, 57668], [38845, 57676], [57693, 137335], [24755, 57703], 10098 [33828, 57711], [38932, 57748], [57749, 147596], [57764, 143486], 10099 [57787, 138813], [15147, 57798], [15666, 57824], [57857, 132021], 10100 [28801, 57944], [23708, 57959], [58017, 132547], [14128, 58028], 10101 [58096, 136054], [58097, 150034], [58111, 166699], [58112, 155779], 10102 [256, 62233], [193, 62234], [461, 62235], [192, 62236], [274, 62237], 10103 [201, 62238], [282, 62239], [200, 62240], [332, 62241], [211, 62242], 10104 [465, 62243], [210, 62244], 62245, [7870, 62246], 62247, [7872, 62248], 10105 [202, 62249], [257, 62250], [225, 62251], [462, 62252], [224, 62253], 10106 [593, 62254], [275, 62255], [233, 62256], [283, 62257], [232, 62258], 10107 [299, 62259], [237, 62260], [464, 62261], [236, 62262], [333, 62263], 10108 [243, 62264], [466, 62265], [242, 62266], [363, 62267], [250, 62268], 10109 [468, 62269], [249, 62270], [470, 62271], [472, 62272], [474, 62273], 10110 [476, 62274], [252, 62275], 62276, [7871, 62277], 62278, [7873, 62279], 10111 [234, 62280], [609, 62281], [643, 63551], [592, 63552], [603, 63553], 10112 [596, 63554], [629, 63555], [339, 63556], [248, 63557], [331, 63558], 10113 [650, 63559], [618, 63560], {f: 2, c: 62282}, [11933, 63530], 10114 [11974, 63539], [12003, 63547], 20539, 28158, [62841, 171123], 62842, 10115 [15817, 62843], 34959, [62845, 147790], 28791, 23797, [19232, 62848], 10116 [62849, 152013], [13657, 62850], [62851, 154928], 24866, [62853, 166450], 10117 36775, 37366, 29073, 26393, 29626, [62859, 144001], [62860, 172295], 10118 [15499, 62861], [62862, 137600], [19216, 62863], 30948, 29698, 20910, 10119 [62867, 165647], [16393, 62868], 27235, [62870, 172730], [16931, 62871], 10120 34319, 31274, [62875, 170311], [62876, 166634], 38741, 28749, 21284, 10121 [62880, 139390], 37876, 30425, [62883, 166371], 62884, 30685, 20131, 20464, 10122 20668, 20015, 20247, 62891, 21556, 32139, 22674, 22736, [62896, 138678], 10123 24210, 24217, 24514, [62900, 141074], 25995, [62902, 144377], 26905, 27203, 10124 [62905, 146531], 27903, 29184, [62909, 148741], 29580, [16091, 62911], 10125 [62912, 150035], 23317, 29881, 35715, [62916, 154788], [62917, 153237], 10126 31379, 31724, 31939, 32364, 33528, 34199, 62924, 34960, 62926, 36537, 10127 62928, 36815, 34143, 39392, 37409, 62933, [62934, 167353], [62935, 136255], 10128 [16497, 62936], [17058, 62937], 23066, 39016, 26475, [17014, 62944], 22333, 10129 34262, [62948, 149883], 33471, [62950, 160013], [19585, 62951], 10130 [62952, 159092], 23931, [62954, 158485], [62955, 159678], {f: 2, c: 62956}, 10131 23446, 62959, 32347], 10132 'Adobe-GB1': [{f: 95, c: 32}, {f: 3, c: 12288}, [183, 12539], 713, 711, 168, 10133 12291, 12293, 8212, 65374, 8214, [8230, 8943], {f: 2, c: 8216}, 10134 {f: 2, c: 8220}, {f: 2, c: 12308}, {f: 8, c: 12296}, {f: 2, c: 12310}, 10135 {f: 2, c: 12304}, 177, 215, 247, 8758, {f: 2, c: 8743}, 8721, 8719, 8746, 10136 8745, 8712, 8759, 8730, 8869, 8741, 8736, 8978, 8857, 8747, 8750, 8801, 10137 8780, 8776, 8765, 8733, 8800, {f: 2, c: 8814}, {f: 2, c: 8804}, 8734, 8757, 10138 8756, 9794, 9792, 176, {f: 2, c: 8242}, 8451, 65284, 164, {f: 2, c: 65504}, 10139 8240, 167, 8470, 9734, 9733, 9675, 9679, 9678, 9671, 9670, 9633, 9632, 10140 9651, 9650, 8251, 8594, {f: 2, c: 8592}, 8595, 12307, {f: 20, c: 9352}, 10141 {f: 20, c: 9332}, {f: 10, c: 9312}, {f: 10, c: 12832}, {f: 12, c: 8544}, 10142 {f: 3, c: 65281}, 65509, {f: 89, c: 65285}, 65507, {f: 83, c: 12353}, 10143 {f: 86, c: 12449}, {f: 17, c: 913}, {f: 7, c: 931}, {f: 17, c: 945}, 10144 {f: 7, c: 963}, {f: 7, c: 59277}, {f: 2, c: 65077}, {f: 2, c: 65081}, 10145 {f: 2, c: 65087}, {f: 2, c: 65085}, {f: 4, c: 65089}, {f: 2, c: 59284}, 10146 {f: 2, c: 65083}, {f: 2, c: 65079}, 65073, 59286, {f: 2, c: 65075}, 10147 {f: 6, c: 1040}, 1025, {f: 32, c: 1046}, 1105, {f: 26, c: 1078}, 257, 225, 10148 462, 224, 275, 233, 283, 232, 299, 237, 464, 236, 333, 243, 466, 242, 363, 10149 250, 468, 249, 470, 472, 474, 476, 252, 234, 593, 7743, 324, 328, 505, 609, 10150 {f: 37, c: 12549}, 0, {f: 76, c: 9472}, {s: 126}, 21834, 38463, 22467, 10151 25384, 21710, 21769, 21696, 30353, 30284, 34108, 30702, 33406, 30861, 10152 29233, 38552, 38797, 27688, 23433, 20474, 25353, 26263, 23736, 33018, 10153 26696, 32942, 26114, 30414, 20985, 25942, 29100, 32753, 34948, 20658, 10154 22885, 25034, 28595, 33453, 25420, 25170, 21485, 21543, 31494, 10155 [12043, 20843], 30116, 24052, 25300, 36299, 38774, 25226, 32793, 22365, 10156 38712, 32610, 29240, [12137, 30333], 26575, 30334, 25670, 20336, 36133, 10157 25308, 31255, 26001, 29677, 25644, 25203, 33324, 39041, 26495, 29256, 10158 25198, 25292, 20276, 29923, 21322, 21150, 32458, 37030, 24110, 26758, 10159 27036, 33152, 32465, 26834, 30917, 34444, 38225, 20621, 35876, 33502, 10160 32990, 21253, 35090, 21093, 34180, 38649, 20445, 22561, 39281, 23453, 10161 25265, 25253, 26292, 35961, 40077, 29190, 26479, 30865, 24754, 21329, 10162 21271, 36744, 32972, 36125, 38049, 20493, 29384, 22791, 24811, 28953, 10163 34987, 22868, 33519, 26412, 31528, 23849, 32503, 29997, 27893, 36454, 10164 36856, 36924, [12240, 40763], [12112, 27604], 37145, 31508, 24444, 30887, 10165 34006, 34109, 27605, 27609, 27606, 24065, 24199, 30201, 38381, 25949, 10166 24330, 24517, 36767, 22721, 33218, 36991, 38491, 38829, 36793, 32534, 10167 36140, 25153, 20415, 21464, 21342, {f: 2, c: 36776}, 36779, 36941, 26631, 10168 24426, 33176, 34920, 40150, 24971, 21035, 30250, 24428, 25996, 28626, 10169 28392, 23486, 25672, 20853, 20912, 26564, 19993, 31177, 39292, 28851, 10170 30149, 24182, 29627, 33760, 25773, 25320, 38069, 27874, 21338, 21187, 10171 25615, 38082, 31636, 20271, 24091, 33334, 33046, 33162, 28196, 27850, 10172 39539, 25429, [12056, 21340], 21754, 34917, 22496, 19981, 24067, 27493, 10173 31807, 37096, 24598, 25830, 29468, 35009, 26448, 25165, 36130, 30572, 10174 36393, 37319, 24425, 33756, 34081, 39184, 21442, 34453, 27531, 24813, 10175 24808, 28799, 33485, 33329, 20179, 27815, 34255, 25805, 31961, 27133, 10176 26361, 33609, 21397, 31574, 20391, 20876, 27979, 23618, 36461, 25554, 10177 21449, 33580, 33590, 26597, 30900, 25661, 23519, 23700, 24046, 35815, 10178 25286, 26612, 35962, 25600, 25530, 34633, 39307, 35863, 32544, 38130, 10179 20135, 38416, 39076, 26124, 29462, 22330, 23581, 24120, 38271, 20607, 10180 32928, [12058, 21378], 25950, 30021, 21809, 20513, 36229, 25220, 38046, 10181 26397, 22066, 28526, 24034, 21557, 28818, 36710, 25199, 25764, 25507, 10182 24443, 28552, 37108, [12162, 33251], [12192, 36784], 23576, 26216, 24561, 10183 27785, 38472, 36225, 34924, 25745, 31216, 22478, 27225, 25104, 21576, 10184 20056, 31243, 24809, 28548, 35802, 25215, 36894, 39563, 31204, 21507, 10185 30196, 25345, 21273, 27744, 36831, 24347, 39536, 32827, 40831, 20360, 10186 23610, [12186, 36196], 32709, 26021, 28861, 20805, 20914, [12173, 34411], 10187 23815, 23456, 25277, 37228, 30068, 36364, 31264, 24833, 31609, 20167, 10188 32504, 30597, 19985, 33261, 21021, 20986, 27249, 21416, 36487, 38148, 10189 38607, 28353, 38500, 26970, 30784, 20648, 30679, 25616, 35302, 22788, 10190 25571, 24029, 31359, 26941, 20256, 33337, 21912, 20018, 30126, 31383, 10191 24162, 24202, 38383, 21019, 21561, 28810, 25462, 38180, 22402, 26149, 10192 26943, 37255, 21767, 28147, 32431, 34850, 25139, 32496, 30133, 33576, 10193 30913, 38604, 36766, 24904, 29943, 35789, 27492, 21050, 36176, 27425, 10194 32874, 33905, 22257, 21254, 20174, 19995, 20945, 31895, 37259, 31751, 10195 20419, 36479, 31713, 31388, 25703, 23828, 20652, 33030, 30209, 31929, 10196 28140, 32736, 26449, 23384, [12072, 23544], 30923, 25774, 25619, 25514, 10197 25387, 38169, 25645, 36798, 31572, 30249, 25171, [12068, 22823], 21574, 10198 [12109, 27513], 20643, 25140, 24102, 27526, 20195, 36151, 34955, 24453, 10199 36910, 24608, 32829, 25285, 20025, 21333, 37112, 25528, 32966, 26086, 10200 27694, 20294, 24814, 28129, 35806, 24377, 34507, 24403, 25377, 20826, 10201 33633, 26723, [12049, 20992], 25443, 36424, 20498, 23707, 31095, 23548, 10202 21040, 31291, 24764, 36947, 30423, 24503, 24471, 30340, 36460, 28783, 10203 30331, 31561, 30634, 20979, 37011, 22564, 20302, 28404, 36842, 25932, 10204 31515, 29380, 28068, 32735, 23265, 25269, 24213, 22320, 33922, 31532, 10205 24093, 24351, 36882, 32532, 39072, 25474, 28359, 30872, 28857, 20856, 10206 38747, 22443, 30005, 20291, 30008, 24215, 24806, 22880, 28096, 27583, 10207 30857, 21500, 38613, 20939, 20993, 25481, 21514, 38035, 35843, 36300, 10208 29241, 30879, 34678, 36845, 35853, 21472, 19969, 30447, 21486, 38025, 10209 39030, [12237, 40718], 38189, 23450, 35746, 20002, 19996, 20908, 33891, 10210 25026, 21160, 26635, 20375, 24683, 20923, 27934, 20828, 25238, 10211 [12099, 26007], 38497, [12182, 35910], 36887, 30168, 37117, 30563, 27602, 10212 29322, 29420, 35835, 22581, 30585, 36172, 26460, 38208, 32922, 24230, 10213 28193, 22930, 31471, 30701, 38203, 27573, 26029, 32526, 22534, 20817, 10214 38431, 23545, 22697, 21544, 36466, 25958, 39039, 22244, 38045, 30462, 10215 36929, 25479, 21702, 22810, 22842, 22427, 36530, 26421, 36346, 33333, 10216 21057, 24816, 22549, 34558, 23784, 40517, 20420, 39069, 35769, 23077, 10217 24694, 21380, 25212, 36943, 37122, 39295, 24681, [12157, 32780], 10218 [12041, 20799], [12159, 32819], 23572, 39285, 27953, [12038, 20108], 36144, 10219 21457, 32602, 31567, 20240, 20047, 38400, 27861, 29648, 34281, 24070, 10220 30058, 32763, 27146, 30718, 38034, 32321, 20961, 28902, 21453, 36820, 10221 33539, 36137, 29359, 39277, 27867, 22346, 33459, [12101, 26041], 32938, 10222 25151, 38450, 22952, 20223, 35775, 32442, 25918, 33778, [12206, 38750], 10223 21857, 39134, 32933, 21290, 35837, 21536, 32954, 24223, 27832, 36153, 10224 33452, 37210, 21545, 27675, 20998, 32439, 22367, 28954, 27774, 31881, 10225 22859, 20221, 24575, 24868, 31914, 20016, 23553, 26539, 34562, 23792, 10226 38155, 39118, 30127, 28925, 36898, 20911, 32541, 35773, 22857, 20964, 10227 20315, 21542, 22827, 25975, 32932, 23413, 25206, 25282, 36752, 24133, 10228 27679, 31526, 20239, 20440, 26381, 28014, 28074, 31119, 34993, 24343, 10229 29995, 25242, 36741, 20463, 37340, 26023, 33071, 33105, 24220, 33104, 10230 36212, 21103, 35206, 36171, 22797, 20613, 20184, [12201, 38428], 10231 [12119, 29238], 33145, 36127, 23500, 35747, 38468, 22919, 32538, 21648, 10232 22134, 22030, 35813, 25913, 27010, 38041, 30422, 28297, [12082, 24178], 10233 [12130, 29976], 26438, 26577, 31487, 32925, 36214, 24863, 31174, 25954, 10234 36195, 20872, 21018, 38050, 32568, 32923, 32434, 23703, 28207, 26464, 10235 31705, 30347, [12220, 39640], 33167, 32660, 31957, 25630, 38224, 31295, 10236 21578, 21733, 27468, 25601, [12093, 25096], 40509, 33011, 30105, 21106, 10237 [12208, 38761], 33883, 26684, 34532, 38401, 38548, 38124, 20010, 21508, 10238 32473, 26681, 36319, 32789, 26356, 24218, 32697, 22466, 32831, 26775, 10239 [12079, 24037], 25915, 21151, 24685, 40858, 20379, 36524, 20844, 23467, 10240 [12088, 24339], 24041, 27742, 25329, 36129, 20849, 38057, 21246, 27807, 10241 33503, 29399, 22434, 26500, 36141, 22815, 36764, 33735, 21653, 31629, 10242 20272, 27837, 23396, 22993, [12238, 40723], 21476, 34506, [12219, 39592], 10243 [12181, 35895], 32929, 25925, 39038, 22266, 38599, 21038, [12128, 29916], 10244 21072, 23521, 25346, 35074, 20054, 25296, 24618, 26874, 20851, 23448, 10245 20896, 35266, 31649, 39302, 32592, 24815, 28748, 36143, 20809, 10246 [12084, 24191], 36891, 29808, 35268, 22317, 30789, 24402, 40863, 38394, 10247 36712, [12225, 39740], 35809, 30328, 26690, 26588, 36330, 36149, 21053, 10248 36746, 28378, 26829, 38149, 37101, 22269, 26524, 35065, 36807, 21704, 10249 39608, 23401, 28023, 27686, 20133, 23475, 39559, 37219, 25000, 37039, 10250 38889, 21547, 28085, 23506, 20989, 21898, 32597, 32752, 25788, 25421, 10251 26097, 25022, 24717, 28938, 27735, 27721, 22831, 26477, 33322, 22741, 10252 22158, 35946, 27627, 37085, 22909, 32791, 21495, 28009, 21621, 21917, 10253 33655, 33743, 26680, [12146, 31166], 21644, 20309, 21512, 30418, 35977, 10254 38402, 27827, 28088, 36203, 35088, 40548, 36154, 22079, [12234, 40657], 10255 30165, 24456, 29408, 24680, 21756, 20136, 27178, 34913, 24658, 36720, 10256 21700, 28888, 34425, 40511, 27946, 23439, 24344, 32418, 21897, 20399, 10257 29492, 21564, 21402, 20505, 21518, 21628, 20046, 24573, 29786, 22774, 10258 33899, 32993, 34676, 29392, 31946, 28246, 24359, 34382, 21804, 25252, 10259 20114, 27818, 25143, 33457, 21719, 21326, 29502, 28369, 30011, 21010, 10260 21270, 35805, 27088, 24458, 24576, 28142, 22351, 27426, 29615, 26707, 10261 36824, 32531, 25442, 24739, 21796, 30186, 35938, 28949, 28067, 23462, 10262 24187, 33618, 24908, 40644, 30970, 34647, 31783, 30343, 20976, 24822, 10263 29004, 26179, 24140, 24653, 35854, 28784, 25381, 36745, 24509, 24674, 10264 34516, 22238, 27585, 24724, 24935, 21321, 24800, 26214, 36159, 31229, 10265 20250, 28905, 27719, 35763, 35826, 32472, 33636, 26127, 23130, 39746, 10266 27985, 28151, 35905, 27963, 20249, [12117, 28779], 33719, 25110, 24785, 10267 38669, 36135, 31096, 20987, 22334, 22522, 26426, 30072, 31293, 31215, 10268 31637, 32908, 39269, 36857, 28608, 35749, 40481, 23020, 32489, 32521, 10269 21513, 26497, 26840, 36753, 31821, 38598, 21450, 24613, 30142, 27762, 10270 21363, 23241, 32423, 25380, [12047, 20960], 33034, [12080, 24049], 34015, 10271 25216, 20864, 23395, 20238, 31085, 21058, 24760, 27982, 23492, 23490, 10272 35745, 35760, 26082, 24524, 38469, 22931, 32487, 32426, 22025, 26551, 10273 22841, 20339, 23478, 21152, 33626, 39050, 36158, 30002, 38078, 20551, 10274 31292, 20215, 26550, 39550, 23233, 27516, 30417, 22362, 23574, 31546, 10275 38388, 29006, 20860, 32937, 33392, 22904, 32516, 33575, 26816, 26604, 10276 30897, 30839, 25315, 25441, 31616, 20461, 21098, 20943, 33616, 27099, 10277 37492, 36341, 36145, 35265, 38190, 31661, 20214, 20581, 33328, 21073, 10278 39279, 28176, 28293, 28071, 24314, 20725, 23004, 23558, 27974, 27743, 10279 30086, 33931, 26728, 22870, 35762, 21280, 37233, 38477, 34121, 26898, 10280 30977, 28966, 33014, 20132, 37066, 27975, 39556, 23047, 22204, 25605, 10281 38128, 30699, 20389, 33050, 29409, [12179, 35282], 39290, 32564, 32478, 10282 21119, 25945, 37237, 36735, 36739, 21483, 31382, 25581, 25509, 30342, 10283 31224, 34903, 38454, 25130, 21163, 33410, 26708, 26480, 25463, 30571, 10284 31469, 27905, 32467, 35299, 22992, 25106, 34249, 33445, 30028, 20511, 10285 20171, 30117, 35819, 23626, [12081, 24062], 31563, [12100, 26020], 10286 [12198, 37329], 20170, 27941, 35167, 32039, 38182, 20165, 35880, 36827, 10287 38771, 26187, 31105, 36817, 28908, 28024, 23613, 21170, 33606, 20834, 10288 33550, 30555, 26230, 40120, 20140, 24778, 31934, 31923, 32463, 20117, 10289 35686, 26223, 39048, 38745, 22659, 25964, 38236, 24452, 30153, 38742, 10290 31455, 31454, 20928, 28847, 31384, 25578, 31350, 32416, 29590, 10291 [12210, 38893], 20037, 28792, 20061, 37202, 21417, 25937, 26087, 10292 [12165, 33276], 33285, 21646, 23601, 30106, 38816, 25304, 29401, 30141, 10293 23621, 39545, 33738, 23616, 21632, 30697, 20030, 27822, 32858, 25298, 10294 25454, 24040, 20855, 36317, 36382, 38191, 20465, 21477, 24807, 28844, 10295 21095, 25424, 40515, 23071, 20518, 30519, 21367, 32482, 25733, 25899, 10296 25225, 25496, 20500, 29237, 35273, 20915, 35776, 32477, 22343, 33740, 10297 38055, 20891, 21531, 23803, 20426, 31459, 27994, 37089, 39567, 21888, 10298 21654, 21345, 21679, 24320, 25577, 26999, 20975, 24936, 21002, 22570, 10299 21208, 22350, 30733, 30475, 24247, 24951, 31968, 25179, 25239, 20130, 10300 28821, 32771, 25335, 28900, 38752, 22391, 33499, 26607, 26869, 30933, 10301 39063, 31185, 22771, 21683, 21487, 28212, 20811, 21051, 23458, 35838, 10302 32943, 21827, 22438, 24691, 22353, 21549, 31354, 24656, 23380, 25511, 10303 25248, [12061, 21475], 25187, 23495, 26543, 21741, 31391, 33510, 37239, 10304 24211, 35044, 22840, 22446, 25358, 36328, 33007, 22359, 31607, 20393, 10305 24555, 23485, 27454, 21281, 31568, 29378, 26694, 30719, 30518, 26103, 10306 20917, 20111, 30420, 23743, 31397, 33909, 22862, 39745, 20608, 39304, 10307 24871, 28291, 22372, 26118, 25414, 22256, 25324, 25193, 24275, 38420, 10308 22403, 25289, 21895, 34593, 33098, 36771, 21862, 33713, 26469, 36182, 10309 34013, 23146, 26639, 25318, 31726, 38417, 20848, 28572, 35888, 25597, 10310 35272, 25042, 32518, 28866, 28389, 29701, 27028, 29436, 24266, 37070, 10311 26391, 28010, 25438, 21171, 29282, [12156, 32769], 20332, 23013, 37226, 10312 28889, 28061, 21202, 20048, 38647, 38253, 34174, 30922, 32047, 20769, 10313 22418, 25794, 32907, 31867, 27882, 26865, 26974, 20919, 21400, 26792, 10314 29313, 40654, 31729, 29432, 31163, 28435, 29702, 26446, [12197, 37324], 10315 40100, 31036, 33673, 33620, 21519, 26647, 20029, 21385, 21169, 30782, 10316 21382, 21033, 20616, 20363, 20432, 30178, [12148, 31435], 31890, 27813, 10317 [12202, 38582], [12050, 21147], 29827, 21737, 20457, 32852, 33714, 36830, 10318 38256, 24265, 24604, 28063, 24088, 25947, 33080, 38142, 24651, 28860, 10319 32451, 31918, 20937, 26753, 31921, 33391, 20004, 36742, 37327, 26238, 10320 20142, 35845, 25769, 32842, 20698, 30103, 29134, 23525, 36797, 28518, 10321 20102, 25730, 38243, 24278, 26009, 21015, 35010, 28872, 21155, 29454, 10322 29747, 26519, 30967, 38678, 20020, 37051, 40158, 28107, 20955, 36161, 10323 21533, 25294, 29618, 33777, 38646, 40836, 38083, 20278, 32666, 20940, 10324 28789, 38517, 23725, 39046, 21478, 20196, 28316, 29705, 27060, 30827, 10325 39311, 30041, 21016, 30244, 27969, 26611, 20845, 40857, 32843, 21657, 10326 31548, 31423, 38534, 22404, 25314, 38471, 27004, 23044, 25602, 31699, 10327 28431, 38475, 33446, 21346, 39045, 24208, 28809, 25523, 21348, 34383, 10328 40065, 40595, 30860, 38706, 36335, 36162, [12229, 40575], 28510, 31108, 10329 24405, 38470, 25134, 39540, 21525, 38109, 20387, 26053, 23653, 23649, 10330 32533, 34385, 27695, 24459, 29575, 28388, 32511, 23782, 25371, 23402, 10331 28390, 21365, 20081, 25504, 30053, 25249, 36718, 20262, 20177, 27814, 10332 32438, 35770, 33821, 34746, 32599, 36923, 38179, 31657, 39585, 35064, 10333 33853, 27931, 39558, 32476, 22920, [12231, 40635], 29595, 30721, 34434, 10334 39532, 39554, 22043, 21527, 22475, 20080, 40614, 21334, 36808, 33033, 10335 30610, 39314, 34542, 28385, 34067, 26364, 24930, 28459, 35881, 33426, 10336 33579, 30450, 27667, 24537, 33725, 29483, 33541, 38170, [12113, 27611], 10337 [12141, 30683], 38086, 21359, 33538, 20882, 24125, 35980, 36152, 20040, 10338 29611, 26522, 26757, 37238, 38665, 29028, 27809, 30473, 23186, 38209, 10339 27599, 32654, 26151, 23504, 22969, 23194, 38376, 38391, 20204, 33804, 10340 33945, 27308, 30431, 38192, 29467, 26790, 23391, 30511, 37274, 38753, 10341 31964, 36855, 35868, 24357, [12150, 31859], 31192, 35269, 27852, 34588, 10342 23494, 24130, 26825, 30496, 32501, 20885, 20813, 21193, 23081, 32517, 10343 [12207, 38754], 33495, 25551, 30596, 34256, 31186, 28218, 24217, 22937, 10344 34065, 28781, 27665, 25279, [12139, 30399], 25935, 24751, 38397, 26126, 10345 34719, 40483, 38125, 21517, 21629, 35884, {f: 2, c: 25720}, 34321, 27169, 10346 33180, 30952, 25705, 39764, 25273, 26411, 33707, 22696, 40664, 27819, 10347 28448, 23518, 38476, 35851, 29279, 26576, 25287, 29281, 20137, 22982, 10348 27597, 22675, 26286, 24149, 21215, 24917, [12106, 26408], [12140, 30446], 10349 30566, 29287, 31302, 25343, 21738, 21584, 38048, 37027, 23068, 32435, 10350 27670, 20035, 22902, 32784, 22856, 21335, 30007, 38590, 22218, 25376, 10351 33041, 24700, 38393, 28118, 21602, 39297, 20869, 23273, 33021, 22958, 10352 38675, 20522, 27877, 23612, 25311, 20320, 21311, 33147, 36870, 28346, 10353 34091, 25288, 24180, 30910, 25781, 25467, 24565, 23064, 37247, 40479, 10354 23615, 25423, 32834, 23421, 21870, 38218, 38221, 28037, 24744, 26592, 10355 29406, 20957, 23425, 25319, 27870, [12124, 29275], 25197, 38062, 32445, 10356 33043, 27987, 20892, 24324, 22900, 21162, 24594, [12069, 22899], 26262, 10357 34384, 30111, 25386, 25062, 31983, 35834, 21734, 27431, 40485, 27572, 10358 34261, 21589, 20598, 27812, 21866, 36276, 29228, 24085, 24597, 29750, 10359 25293, 25490, 29260, 24472, 28227, 27966, 25856, 28504, 30424, 30928, 10360 30460, 30036, 21028, 21467, 20051, 24222, 26049, 32810, 32982, 25243, 10361 21638, 21032, 28846, 34957, 36305, 27873, 21624, 32986, 22521, 35060, 10362 36180, 38506, 37197, 20329, 27803, 21943, 30406, 30768, 25256, 28921, 10363 28558, 24429, 34028, 26842, 30844, 31735, 33192, 26379, 40527, 25447, 10364 30896, 22383, 30738, 38713, 25209, 25259, 21128, 29749, 27607, 21860, 10365 33086, 30130, [12138, 30382], 21305, 30174, 20731, 23617, 35692, 31687, 10366 20559, [12122, 29255], 39575, 39128, 28418, 29922, 31080, 25735, 30629, 10367 25340, 39057, 36139, 21697, 32856, 20050, 22378, 33529, 33805, 24179, 10368 20973, 29942, 35780, 23631, 22369, 27900, 39047, 23110, 30772, 39748, 10369 36843, 31893, 21078, 25169, 38138, 20166, 33670, 33889, 33769, 33970, 10370 22484, 26420, 22275, 26222, 28006, 35889, 26333, 28689, 26399, 27450, 10371 26646, 25114, 22971, 19971, 20932, 28422, 26578, 27791, 20854, 26827, 10372 22855, 27495, 30054, 23822, 33040, 40784, 26071, 31048, 31041, 39569, 10373 36215, 23682, 20062, 20225, 21551, 22865, 30732, 22120, [12115, 27668], 10374 36804, 24323, 27773, 27875, 35755, 25488, 24688, 27965, 29301, 25190, 10375 38030, 38085, 21315, 36801, 31614, 20191, 35878, 20094, 40660, 38065, 10376 38067, 21069, 28508, 36963, 27973, 35892, 22545, 23884, [12107, 27424], 10377 27465, 26538, 21595, 33108, 32652, 22681, 34103, 24378, 25250, 27207, 10378 38201, 25970, 24708, 26725, 30631, 20052, 20392, 24039, 38808, 25772, 10379 32728, 23789, 20431, 31373, 20999, 33540, 19988, 24623, 31363, 38054, 10380 20405, 20146, 31206, 29748, 21220, 33465, 25810, 31165, 23517, 27777, 10381 38738, 36731, 27682, 20542, 21375, 28165, 25806, 26228, 27696, 24773, 10382 39031, 35831, 24198, 29756, 31351, 31179, 19992, 37041, 29699, 27714, 10383 22234, 37195, 27845, 36235, 21306, 34502, 26354, 36527, 23624, 39537, 10384 28192, 21462, 23094, 40843, 36259, 21435, 22280, 39079, 26435, 37275, 10385 27849, 20840, 30154, 25331, [12125, 29356], 21048, 21149, 32570, 28820, 10386 30264, 21364, 40522, 27063, 30830, 38592, 35033, 32676, 28982, 29123, 10387 20873, 26579, 29924, 22756, 25880, 22199, 35753, 39286, 25200, 32469, 10388 24825, 28909, 22764, 20161, [12040, 20154], 24525, 38887, 20219, 35748, 10389 20995, 22922, 32427, 25172, 20173, [12103, 26085], 25102, 33592, 33993, 10390 33635, 34701, 29076, 28342, 23481, 32466, 20887, 25545, 26580, 10391 [12161, 32905], 33593, 34837, 20754, 23418, 22914, 36785, 20083, 27741, 10392 [12042, 20837], 35109, 36719, 38446, 34122, 29790, 38160, 38384, 28070, 10393 33509, 24369, 25746, 27922, 33832, 33134, 40131, 22622, 36187, 19977, 10394 21441, 20254, 25955, 26705, 21971, 20007, 25620, 39578, 25195, 23234, 10395 29791, [12170, 33394], 28073, 26862, 20711, 33678, 30722, 26432, 21049, 10396 27801, 32433, 20667, 21861, 29022, 31579, 26194, 29642, 33515, 26441, 10397 [12077, 23665], 21024, 29053, 34923, 38378, 38485, 25797, 36193, 33203, 10398 21892, 27733, 25159, 32558, 22674, 20260, 21830, 36175, 26188, 19978, 10399 23578, 35059, 26786, 25422, 31245, 28903, 33421, 21242, 38902, 23569, 10400 21736, 37045, 32461, 22882, 36170, 34503, [12166, 33292], 33293, 36198, 10401 25668, 23556, 24913, 28041, 31038, 35774, 30775, 30003, 21627, 20280, 10402 [12189, 36523], 28145, 23072, 32453, 31070, 27784, 23457, 23158, 29978, 10403 32958, 24910, 28183, 22768, [12131, 29983], 29989, 29298, 21319, 32499, 10404 30465, 30427, 21097, 32988, 22307, 24072, 22833, 29422, 26045, 28287, 10405 35799, [12075, 23608], 34417, [12055, 21313], [12143, 30707], 25342, 26102, 10406 20160, [12215, 39135], 34432, 23454, 35782, 21490, [12142, 30690], 20351, 10407 23630, 39542, 22987, 24335, [12144, 31034], [12064, 22763], 19990, 26623, 10408 20107, 25325, 35475, 36893, 21183, 26159, 21980, 22124, 36866, 20181, 10409 20365, 37322, 39280, [12114, 27663], 24066, 24643, 23460, 35270, 35797, 10410 25910, [12095, 25163], [12216, 39318], 23432, 23551, 25480, 21806, 21463, 10411 30246, 20861, 34092, 26530, 26803, 27530, 25234, 36755, 21460, 33298, 10412 28113, 30095, 20070, 36174, 23408, 29087, 34223, 26257, 26329, 32626, 10413 34560, [12233, 40653], [12239, 40736], 23646, 26415, 36848, 26641, 26463, 10414 25101, 31446, 22661, 24246, 25968, 28465, 24661, 21047, 32781, 25684, 10415 34928, 29993, 24069, 26643, 25332, 38684, 21452, 29245, 35841, 10416 [12116, 27700], 30561, 31246, 21550, 30636, 39034, 33308, 35828, 30805, 10417 26388, 28865, 26031, 25749, 22070, 24605, 31169, 21496, 19997, 27515, 10418 32902, 23546, 21987, 22235, 20282, 20284, 39282, 24051, 26494, 32824, 10419 24578, 39042, 36865, 23435, 35772, 35829, 25628, 33368, 25822, 22013, 10420 33487, 37221, 20439, 32032, 36895, 31903, 20723, 22609, 28335, 23487, 10421 35785, 32899, 37240, 33948, 31639, 34429, 38539, 38543, 32485, 39635, 10422 30862, 23681, 31319, 36930, 38567, 31071, 23385, 25439, 31499, 34001, 10423 26797, 21766, 32553, 29712, 32034, 38145, 25152, 22604, 20182, 23427, 10424 22905, 22612, 29549, 25374, 36427, 36367, 32974, 33492, 25260, 21488, 10425 27888, 37214, 22826, 24577, 27760, 22349, 25674, 36138, 30251, 28393, 10426 22363, 27264, 30192, 28525, 35885, 35848, 22374, 27631, 34962, 30899, 10427 25506, 21497, 28845, 27748, 22616, 25642, 22530, 26848, 33179, 21776, 10428 31958, 20504, 36538, 28108, 36255, 28907, 25487, 28059, 28372, 32486, 10429 33796, 26691, 36867, 28120, 38518, 35752, 22871, 29305, 34276, 33150, 10430 30140, 35466, 26799, 21076, 36386, 38161, 25552, 39064, 36420, 21884, 10431 20307, 26367, 22159, 24789, 28053, 21059, 23625, 22825, 28155, 22635, 10432 [12133, 30000], 29980, 24684, 33300, 33094, 25361, 26465, 36834, 30522, 10433 36339, 36148, 38081, 24086, 21381, 21548, 28867, 27712, 24311, 20572, 10434 20141, 24237, 25402, 33351, 36890, 26704, 37230, 30643, 21516, 38108, 10435 24420, 31461, 26742, 25413, 31570, 32479, 30171, 20599, 25237, 22836, 10436 36879, 20984, 31171, 31361, 22270, 24466, 36884, 28034, 23648, 10437 [12063, 22303], 21520, 20820, 28237, 22242, 25512, 39059, 33151, 34581, 10438 35114, 36864, 21534, 23663, 33216, 25302, 25176, 33073, 40501, 38464, 10439 39534, 39548, 26925, 22949, 25299, 21822, 25366, 21703, 34521, 27964, 10440 23043, [12129, 29926], 34972, 27498, 22806, 35916, 24367, 28286, 29609, 10441 39037, 20024, 28919, 23436, 30871, 25405, 26202, 30358, 24779, 23451, 10442 23113, 19975, 33109, 27754, 29579, 20129, 26505, [12153, 32593], 24448, 10443 26106, 26395, 24536, 22916, 23041, 24013, 24494, 21361, 38886, 36829, 10444 26693, 22260, 21807, 24799, 20026, 28493, 32500, 33479, 33806, 22996, 10445 20255, 20266, 23614, 32428, 26410, 34074, 21619, 30031, 32963, 21890, 10446 39759, 20301, 28205, 35859, 23561, 24944, 21355, 30239, 28201, 34442, 10447 [12098, 25991], 38395, 32441, 21563, 31283, 32010, 38382, 21985, 32705, 10448 29934, 25373, 34583, 28065, 31389, 25105, 26017, 21351, 25569, 27779, 10449 24043, 21596, 38056, 20044, 27745, 35820, 23627, [12102, 26080], 33436, 10450 26791, 21566, 21556, [12111, 27595], 27494, 20116, 25410, 21320, 33310, 10451 20237, 20398, 22366, 25098, 38654, 26212, 29289, 21247, 21153, 24735, 10452 35823, 26132, 29081, 26512, 35199, 30802, 30717, 26224, 22075, 21560, 10453 38177, 29306, 31232, 24687, 24076, 24713, 33181, [12067, 22805], 24796, 10454 29060, 28911, 28330, 27728, 29312, 27268, 34989, 24109, 20064, 23219, 10455 21916, 38115, 27927, 31995, 38553, 25103, 32454, 30606, 34430, 21283, 10456 38686, 36758, 26247, 23777, 20384, 29421, 19979, 21414, 22799, 21523, 10457 25472, 38184, 20808, 20185, 40092, 32420, 21688, 36132, 34900, 33335, 10458 38386, 28046, 24358, 23244, 26174, 38505, 29616, 29486, 21439, 33146, 10459 39301, 32673, 23466, 38519, 38480, 32447, 30456, 21410, 38262, 10460 [12217, 39321], 31665, 35140, 28248, 20065, 32724, 31077, 35814, 24819, 10461 21709, 20139, 39033, 24055, 27233, 20687, 21521, 35937, 33831, 30813, 10462 38660, 21066, 21742, 22179, 38144, 28040, 23477, 28102, 26195, 10463 [12073, 23567], 23389, 26657, 32918, 21880, 31505, 25928, 26964, 20123, 10464 27463, 34638, 38795, 21327, 25375, 25658, 37034, 26012, 32961, 35856, 10465 20889, 26800, 21368, 34809, 25032, 27844, 27899, 35874, 23633, 34218, 10466 33455, 38156, 27427, [12191, 36763], 26032, 24571, [12092, 24515], 20449, 10467 34885, 26143, 33125, 29481, 24826, 20852, 21009, 22411, 24418, 37026, 10468 [12175, 34892], 37266, 24184, 26447, 24615, 22995, 20804, 20982, 33016, 10469 21256, 27769, 38596, 29066, 20241, 20462, 32670, 26429, 21957, 38152, 10470 31168, 34966, 32483, 22687, 25100, 38656, 34394, 22040, 39035, 24464, 10471 35768, 33988, 37207, 21465, 26093, 24207, 30044, 24676, 32110, 23167, 10472 32490, 32493, 36713, 21927, 23459, 24748, 26059, [12126, 29572], 36873, 10473 30307, 30505, 32474, 38772, 34203, 23398, [12147, 31348], 38634, 10474 [12174, 34880], 21195, 29071, 24490, 26092, 35810, 23547, 39535, 24033, 10475 27529, 27739, 35757, 35759, 36874, 36805, 21387, 25276, 40486, 40493, 10476 21568, 20011, 33469, [12123, 29273], 34460, 23830, 34905, 28079, 38597, 10477 21713, 20122, 35766, 28937, 21693, 38409, 28895, 28153, 30416, 20005, 10478 30740, 34578, 23721, 24310, [12180, 35328], 39068, 38414, 28814, 27839, 10479 22852, 25513, 30524, 34893, 28436, 33395, 22576, 29141, 21388, 30746, 10480 38593, 21761, 24422, 28976, 23476, 35866, 39564, 27523, 22830, 40495, 10481 31207, 26472, 25196, 20335, 30113, [12154, 32650], 27915, 38451, 27687, 10482 20208, 30162, 20859, 26679, 28478, 36992, 33136, 22934, 29814, 25671, 10483 23591, 36965, 31377, 35875, 23002, 21676, 33280, 33647, 35201, 32768, 10484 26928, 22094, 32822, 29239, 37326, 20918, 20063, 39029, 25494, 19994, 10485 21494, 26355, 33099, 22812, 28082, [12032, 19968], 22777, 21307, 25558, 10486 38129, 20381, 20234, [12176, 34915], 39056, 22839, 36951, 31227, 20202, 10487 33008, 30097, 27778, 23452, 23016, 24413, 26885, 34433, 20506, 24050, 10488 [12036, 20057], 30691, 20197, 33402, 25233, 26131, [12194, 37009], 23673, 10489 20159, 24441, 33222, 36920, 32900, 30123, 20134, 35028, 24847, 27589, 10490 24518, 20041, 30410, 28322, 35811, 35758, 35850, 35793, 24322, 32764, 10491 32716, 32462, 33589, 33643, 22240, 27575, [12211, 38899], 38452, 23035, 10492 21535, 38134, 28139, 23493, 39278, 23609, 24341, 38544, 21360, 33521, 10493 27185, 23156, 40560, 24212, 32552, 33721, {f: 2, c: 33828}, 33639, 34631, 10494 36814, 36194, 30408, 24433, 39062, 30828, 26144, 21727, 25317, 20323, 10495 33219, 30152, 24248, 38605, 36362, 34553, 21647, 27891, 28044, 27704, 10496 24703, 21191, [12132, 29992], 24189, 20248, 24736, 24551, 23588, 30001, 10497 37038, 38080, 29369, 27833, 28216, [12195, 37193], 26377, 21451, 21491, 10498 20305, 37321, 35825, [12060, 21448], 24188, 36802, 28132, 20110, 30402, 10499 27014, 34398, 24858, 33286, 20313, 20446, 36926, 40060, 24841, 28189, 10500 28180, 38533, 20104, 23089, [12204, 38632], 19982, 23679, 31161, 23431, 10501 35821, [12155, 32701], [12127, 29577], 22495, 33419, 37057, 21505, 36935, 10502 21947, 23786, 24481, 24840, 27442, 29425, 32946, 35465, 28020, 23507, 10503 35029, 39044, 35947, 39533, 40499, 28170, 20900, 20803, 22435, 34945, 10504 21407, 25588, 36757, 22253, 21592, 22278, 29503, 28304, 32536, 36828, 10505 33489, 24895, 24616, 38498, [12104, 26352], 32422, 36234, 36291, 38053, 10506 23731, 31908, [12105, 26376], 24742, 38405, 32792, 20113, 37095, 21248, 10507 38504, 20801, 36816, 34164, 37213, 26197, 38901, 23381, 21277, 30776, 10508 26434, 26685, 21705, 28798, 23472, 36733, 20877, 22312, 21681, 25874, 10509 26242, 36190, 36163, 33039, 33900, 36973, 31967, 20991, 34299, 26531, 10510 26089, 28577, 34468, 36481, 22122, 36896, 30338, 28790, 29157, 36131, 10511 25321, 21017, 27901, 36156, 24590, 22686, 24974, 26366, 36192, 25166, 10512 21939, 28195, 26413, 36711, 38113, 38392, 30504, 26629, 27048, 21643, 10513 20045, 28856, 35784, 25688, 25995, 23429, 31364, 20538, 23528, 30651, 10514 27617, 35449, 31896, 27838, 30415, 26025, 36759, 23853, 23637, 34360, 10515 26632, 21344, 25112, 31449, 28251, 32509, 27167, 31456, 24432, 28467, 10516 24352, 25484, 28072, 26454, 19976, 24080, 36134, 20183, 32960, 30260, 10517 38556, 25307, 26157, 25214, 27836, 36213, 29031, 32617, 20806, 32903, 10518 21484, 36974, 25240, 21746, 34544, 36761, 32773, 38167, 34071, 36825, 10519 27993, 29645, 26015, 30495, 29956, 30759, 33275, 36126, 38024, 20390, 10520 26517, 30137, 35786, 38663, 25391, 38215, 38453, 33976, 25379, 30529, 10521 24449, 29424, 20105, 24596, 25972, 25327, 27491, 25919, 24103, 30151, 10522 37073, 35777, 33437, 26525, [12096, 25903], 21553, 34584, 30693, 32930, 10523 33026, 27713, 20043, 32455, 32844, 30452, 26893, 27542, 25191, 20540, 10524 20356, 22336, 25351, [12108, 27490], 36286, 21482, 26088, 32440, 24535, 10525 25370, 25527, [12164, 33267], 33268, 32622, 24092, 23769, 21046, 26234, 10526 31209, 31258, 36136, 28825, 30164, 28382, 27835, 31378, 20013, 30405, 10527 24544, 38047, 34935, 32456, 31181, 32959, 37325, 20210, 20247, 10528 [12168, 33311], 21608, 24030, 27954, 35788, 31909, 36724, 32920, 24090, 10529 21650, 30385, 23449, 26172, 39588, 29664, 26666, 34523, 26417, 29482, 10530 35832, 35803, 36880, [12149, 31481], 28891, 29038, 25284, 30633, 22065, 10531 20027, 33879, 26609, 21161, 34496, 36142, 38136, 31569, 20303, 27880, 10532 31069, 39547, 25235, [12118, 29226], 25341, 19987, 30742, 36716, 25776, 10533 36186, 31686, 26729, 24196, 35013, 22918, 25758, 22766, 29366, 26894, 10534 38181, 36861, 36184, 22368, 32512, 35846, 20934, 25417, 25305, 21331, 10535 26700, 29730, 33537, 37196, 21828, 30528, 28796, 27978, 20857, 21672, 10536 36164, 23039, 28363, 28100, 23388, 32043, 20180, 31869, 28371, 10537 [12070, 23376], [12163, 33258], 28173, 23383, 39683, 26837, 36394, 23447, 10538 32508, 24635, 32437, 37049, [12187, 36208], 22863, 25549, 31199, 10539 [12188, 36275], 21330, 26063, 31062, 35781, 38459, 32452, 38075, 32386, 10540 22068, 37257, 26368, 32618, 23562, 36981, 26152, 24038, 20304, 26590, 10541 20570, 20316, 22352, 24231, 20109, 19980, 20800, 19984, 24319, 21317, 10542 19989, 20120, 19998, [12224, 39730], 23404, 22121, [12033, 20008], 31162, 10543 [12035, 20031], [12052, 21269], 20039, 22829, [12120, 29243], 21358, 27664, 10544 22239, 32996, 39319, 27603, 30590, 40727, [12034, 20022], 20127, 40720, 10545 20060, 20073, 20115, 33416, 23387, 21868, 22031, 20164, 21389, 21405, 10546 21411, 21413, 21422, 38757, 36189, [12053, 21274], 21493, 21286, 21294, 10547 21310, 36188, 21350, 21347, 20994, 21000, 21006, 21037, 21043, 10548 {f: 2, c: 21055}, 21068, 21086, 21089, 21084, 33967, 21117, 21122, 21121, 10549 21136, 21139, [12044, 20866], 32596, 20155, 20163, 20169, 20162, 20200, 10550 20193, 20203, 20190, 20251, 20211, 20258, 20324, 20213, 20261, 20263, 10551 20233, 20267, 20318, 20327, 25912, 20314, 20317, 20319, 20311, 20274, 10552 20285, 20342, 20340, 20369, 20361, 20355, 20367, 20350, 20347, 20394, 10553 20348, 20396, 20372, 20454, 20456, 20458, 20421, 20442, 20451, 20444, 10554 20433, 20447, 20472, 20521, 20556, 20467, 20524, 20495, 20526, 20525, 10555 20478, 20508, 20492, 20517, 20520, 20606, 20547, 20565, 20552, 20558, 10556 20588, 20603, 20645, 20647, 20649, 20666, 20694, 20742, 20717, 20716, 10557 20710, 20718, 20743, 20747, 20189, 27709, 20312, 20325, 20430, 10558 [12245, 40864], 27718, 31860, 20846, 24061, 40649, 39320, 20865, 22804, 10559 [12051, 21241], 21261, 35335, 21264, 20971, 22809, 20821, [12039, 20128], 10560 20822, 20147, 34926, 34980, 20149, 33044, 35026, 31104, 23348, 34819, 10561 32696, [12046, 20907], 20913, 20925, 20924, 20935, [12045, 20886], 20898, 10562 20901, 35744, {f: 2, c: 35750}, 35754, {f: 2, c: 35764}, 35767, 10563 {f: 2, c: 35778}, 35787, 35791, 35790, {f: 3, c: 35794}, 35798, 10564 {f: 2, c: 35800}, 35804, {f: 2, c: 35807}, 35812, {f: 2, c: 35816}, 35822, 10565 35824, 35827, 35830, 35833, 35836, {f: 2, c: 35839}, 35842, 35844, 35847, 10566 35852, 35855, {f: 2, c: 35857}, {f: 3, c: 35860}, 35865, 35867, 35864, 10567 35869, {f: 3, c: 35871}, 35877, 35879, {f: 2, c: 35882}, {f: 2, c: 35886}, 10568 {f: 2, c: 35890}, {f: 2, c: 35893}, [12057, 21353], 21370, 38429, 38434, 10569 38433, 38449, 38442, 38461, 38460, 38466, 38473, 38484, 38495, 38503, 10570 38508, 38514, 38516, 38536, 38541, 38551, 38576, 37015, 37019, 37021, 10571 37017, 37036, 37025, 37044, 37043, 37046, 37050, 37048, 37040, 37071, 10572 37061, 37054, 37072, 37060, 37063, 37075, 37094, 37090, 37084, 37079, 10573 37083, 37099, 37103, 37118, 37124, 37154, 37150, 37155, 37169, 37167, 10574 37177, 37187, 37190, 21005, 22850, 21154, {f: 2, c: 21164}, 21182, 21759, 10575 21200, 21206, 21232, 21471, 29166, 30669, [12085, 24308], [12048, 20981], 10576 20988, [12223, 39727], [12059, 21430], 24321, 30042, 24047, 22348, 22441, 10577 22433, 22654, 22716, 22725, 22737, 22313, 22316, 22314, 22323, 22329, 10578 {f: 2, c: 22318}, 22364, 22331, 22338, 22377, 22405, 22379, 22406, 22396, 10579 22395, 22376, 22381, 22390, 22387, 22445, 22436, 22412, 22450, 22479, 10580 22439, 22452, 22419, 22432, 22485, 22488, 22490, 22489, 22482, 22456, 10581 22516, 22511, 22520, 22500, 22493, 22539, 22541, 22525, 22509, 22528, 10582 22558, 22553, 22596, 22560, 22629, 22636, 22657, 22665, 22682, 22656, 10583 39336, 40729, 25087, 33401, 33405, 33407, 33423, 33418, 33448, 33412, 10584 33422, 33425, 33431, 33433, 33451, 33464, 33470, 33456, 33480, 33482, 10585 33507, 33432, 33463, 33454, {f: 2, c: 33483}, 33473, 33449, 33460, 33441, 10586 33450, 33439, 33476, 33486, 33444, 33505, 33545, 33527, 33508, 33551, 10587 33543, 33500, 33524, 33490, 33496, 33548, 33531, 33491, 33553, 33562, 10588 33542, {f: 2, c: 33556}, 33504, 33493, 33564, 33617, {f: 2, c: 33627}, 10589 33544, 33682, 33596, 33588, 33585, 33691, 33630, 33583, 33615, 33607, 10590 33603, 33631, 33600, 33559, 33632, 33581, 33594, 33587, 33638, 33637, 10591 33640, 33563, 33641, 33644, 33642, {f: 2, c: 33645}, 33712, 33656, 10592 {f: 2, c: 33715}, 33696, 33706, 33683, 33692, 33669, 33660, 33718, 33705, 10593 33661, 33720, 33659, 33688, 33694, 33704, 33722, 33724, 33729, 33793, 10594 33765, 33752, 22535, 33816, 33803, 33757, 33789, 33750, 33820, 33848, 10595 33809, 33798, 33748, 33759, 33807, 33795, {f: 2, c: 33784}, 33770, 33733, 10596 33728, 33830, 33776, 33761, 33884, 33873, 33882, 33881, 33907, 10597 {f: 2, c: 33927}, 33914, 33929, 33912, 33852, 33862, 33897, 33910, 33932, 10598 33934, 33841, 33901, 33985, 33997, 34000, 34022, 33981, 34003, 33994, 10599 33983, 33978, 34016, 33953, 33977, 33972, 33943, 34021, 34019, 34060, 10600 29965, 34104, 34032, 34105, 34079, 34106, 34134, 34107, 34047, 34044, 10601 34137, 34120, 34152, 34148, 34142, 34170, 30626, 34115, 34162, 34171, 10602 34212, 34216, 34183, 34191, 34169, 34222, 34204, 34181, 34233, 34231, 10603 34224, 34259, 34241, 34268, 34303, 34343, 34309, 34345, 34326, 34364, 10604 [12086, 24318], 24328, 22844, 22849, 32823, 22869, 22874, 22872, 21263, 10605 [12074, 23586], 23589, 23596, 23604, 25164, 25194, 25247, 25275, 25290, 10606 25306, 25303, 25326, 25378, 25334, 25401, 25419, 25411, 25517, 25590, 10607 25457, 25466, 25486, 25524, 25453, 25516, 25482, 25449, 25518, 25532, 10608 25586, 25592, 25568, 25599, 25540, 25566, 25550, 25682, 25542, 25534, 10609 25669, 25665, 25611, 25627, 25632, 25612, 25638, 25633, 25694, 25732, 10610 25709, 25750, 25722, {f: 2, c: 25783}, 25753, 25786, 25792, 25808, 25815, 10611 25828, 25826, 25865, 25893, 25902, [12087, 24331], 24530, 29977, 24337, 10612 21343, 21489, 21501, 21481, 21480, 21499, 21522, 21526, 21510, 21579, 10613 {f: 3, c: 21586}, 21590, 21571, 21537, 21591, 21593, 21539, 21554, 21634, 10614 21652, 21623, 21617, 21604, {f: 2, c: 21658}, 21636, 21622, 21606, 21661, 10615 21712, 21677, 21698, 21684, 21714, 21671, 21670, {f: 2, c: 21715}, 21618, 10616 21667, 21717, 21691, 21695, 21708, {f: 2, c: 21721}, 21724, 10617 {f: 2, c: 21673}, 21668, 21725, 21711, 21726, 21787, 21735, 21792, 21757, 10618 21780, 21747, {f: 2, c: 21794}, 21775, 21777, 21799, 21802, 21863, 21903, 10619 21941, 21833, 21869, 21825, 21845, 21823, 21840, 21820, 21815, 21846, 10620 {f: 3, c: 21877}, 21811, 21808, 21852, 21899, 21970, 21891, 21937, 21945, 10621 21896, 21889, 21919, 21886, 21974, 21905, 21883, 21983, {f: 2, c: 21949}, 10622 21908, 21913, 21994, 22007, 21961, 22047, 21969, {f: 2, c: 21995}, 21972, 10623 21990, 21981, 21956, 21999, 21989, {f: 2, c: 22002}, {f: 2, c: 21964}, 10624 21992, 22005, 21988, 36756, 22046, 22024, 22028, 22017, 22052, 22051, 10625 22014, 22016, 22055, 22061, 22104, 22073, 22103, 22060, 22093, 22114, 10626 22105, 22108, 22092, 22100, 22150, 22116, 22129, 22123, {f: 2, c: 22139}, 10627 22149, 22163, 22191, 22228, [12062, 22231], 22237, 22241, 22261, 22251, 10628 22265, 22271, 22276, 22282, 22281, 22300, 24079, 24089, 24084, 24081, 10629 24113, {f: 2, c: 24123}, 24119, 24132, 24148, 24155, 24158, 24161, 23692, 10630 23674, 23693, 23696, 23702, 23688, {f: 2, c: 23704}, 23697, 23706, 23708, 10631 23733, 23714, 23741, 23724, 23723, 23729, 23715, 23745, 23735, 23748, 10632 23762, 23780, 23755, 23781, {f: 2, c: 23810}, 23847, 23846, 23854, 23844, 10633 23838, 23814, 23835, 23896, 23870, 23860, 23869, 23916, 23899, 23919, 10634 23901, 23915, 23883, 23882, 23913, 23924, 23938, 23961, 23965, 35955, 10635 23991, 24005, [12091, 24435], 24439, 24450, 24455, 24457, 24460, 24469, 10636 24473, 24476, 24488, 24493, 24501, 24508, 34914, [12090, 24417], 29357, 10637 29360, 29364, {f: 2, c: 29367}, 29379, 29377, 29390, 29389, 29394, 29416, 10638 29423, 29417, 29426, 29428, 29431, 29441, 29427, 29443, {f: 2, c: 29434}, 10639 29463, 29459, 29473, 29450, 29470, 29469, 29461, 29474, 29497, 29477, 10640 29484, 29496, 29489, 29520, 29517, 29527, 29536, 29548, 29551, 29566, 10641 [12167, 33307], 22821, 39143, 22820, [12065, 22786], 39267, 10642 {f: 6, c: 39271}, 39284, 39287, 39293, 39296, 39300, 39303, 39306, 39309, 10643 {f: 2, c: 39312}, {f: 3, c: 39315}, 24192, 24209, 24203, 24214, 24229, 10644 24224, 24249, 24245, 24254, 24243, 36179, 24274, 24273, 24283, 24296, 10645 24298, 33210, 24516, 24521, 24534, 24527, 24579, 24558, 24580, 24545, 10646 24548, 24574, {f: 2, c: 24581}, 24554, 24557, 24568, 24601, 24629, 24614, 10647 24603, 24591, 24589, 24617, 24619, 24586, 24639, 24609, {f: 2, c: 24696}, 10648 24699, 24698, 24642, 24682, 24701, 24726, 24730, 24749, 24733, 24707, 10649 24722, 24716, 24731, 24812, 24763, 24753, 24797, 24792, 24774, 24794, 10650 24756, 24864, 24870, 24853, 24867, 24820, 24832, 24846, 24875, 24906, 10651 24949, 25004, 24980, 24999, 25015, 25044, 25077, 24541, 38579, 38377, 10652 38379, 38385, 38387, {f: 2, c: 38389}, 38396, 38398, {f: 2, c: 38403}, 10653 38406, 38408, {f: 4, c: 38410}, 38415, 38418, {f: 3, c: 38421}, 10654 {f: 2, c: 38425}, 20012, [12121, 29247], 25109, 27701, 27732, 27740, 27722, 10655 27811, 27781, 27792, 27796, 27788, {f: 2, c: 27752}, 27764, 27766, 27782, 10656 27817, 27856, 27860, 27821, {f: 2, c: 27895}, 27889, 27863, 27826, 27872, 10657 27862, 27898, 27883, 27886, 27825, 27859, 27887, 27902, 27961, 27943, 10658 27916, 27971, 27976, 27911, 27908, 27929, 27918, 27947, 27981, 27950, 10659 27957, 27930, 27983, 27986, 27988, 27955, 28049, 28015, 28062, 28064, 10660 27998, {f: 2, c: 28051}, 27996, 28000, 28028, 28003, 28186, 28103, 28101, 10661 28126, 28174, 28095, 28128, 28177, 28134, 28125, 28121, 28182, 28075, 10662 28172, 28078, 28203, 28270, 28238, 28267, 28338, 28255, 28294, 10663 {f: 2, c: 28243}, 28210, 28197, 28228, 28383, 28337, 28312, 28384, 28461, 10664 28386, 28325, 28327, 28349, 28347, 28343, 28375, 28340, 28367, 28303, 10665 28354, 28319, 28514, {f: 2, c: 28486}, 28452, 28437, 28409, 28463, 28470, 10666 28491, 28532, 28458, 28425, 28457, 28553, 28557, 28556, 28536, 28530, 10667 28540, 28538, 28625, 28617, 28583, 28601, 28598, 28610, 28641, 28654, 10668 28638, 28640, 28655, 28698, 28707, 28699, 28729, 28725, 28751, 28766, 10669 [12071, 23424], 23428, 23445, 23443, 23461, 23480, 29999, 39582, 25652, 10670 23524, 23534, 35120, 23536, 36423, 35591, 36790, 36819, 36821, 36837, 10671 36846, 36836, 36841, 36838, 36851, 36840, 36869, 36868, 36875, 36902, 10672 36881, 36877, 36886, 36897, {f: 2, c: 36917}, 36909, 36911, 36932, 10673 {f: 2, c: 36945}, 36944, 36968, 36952, 36962, 36955, 26297, 36980, 36989, 10674 36994, 37000, 36995, 37003, [12089, 24400], 24407, 24406, 24408, 23611, 10675 21675, 23632, 23641, 23409, 23651, 23654, 32700, 24362, 24361, 24365, 10676 33396, 24380, 39739, [12076, 23662], 22913, 22915, 22925, {f: 2, c: 22953}, 10677 22947, 22935, 22986, 22955, 22942, 22948, 22994, 22962, 22959, 22999, 10678 22974, {f: 2, c: 23045}, 23005, 23048, 23011, 23000, 23033, 23052, 23049, 10679 23090, 23092, 23057, 23075, 23059, 23104, 23143, 23114, 23125, 23100, 10680 23138, 23157, 33004, 23210, 23195, 23159, 23162, 23230, 23275, 23218, 10681 23250, 23252, 23224, 23264, 23267, 23281, 23254, 23270, 23256, 23260, 10682 23305, 23319, 23318, 23346, 23351, 23360, 23573, 23580, 23386, 23397, 10683 23411, 23377, 23379, 23394, 39541, {f: 2, c: 39543}, 39546, 39551, 39549, 10684 {f: 2, c: 39552}, 39557, 39560, 39562, 39568, {f: 2, c: 39570}, 39574, 10685 39576, {f: 3, c: 39579}, {f: 2, c: 39583}, {f: 2, c: 39586}, 39589, 39591, 10686 32415, 32417, 32419, 32421, {f: 2, c: 32424}, 32429, 32432, 32446, 10687 {f: 3, c: 32448}, 32457, {f: 2, c: 32459}, 32464, 32468, 32471, 32475, 10688 {f: 2, c: 32480}, 32488, 32491, {f: 2, c: 32494}, {f: 2, c: 32497}, 32525, 10689 32502, {f: 2, c: 32506}, 32510, {f: 3, c: 32513}, {f: 2, c: 32519}, 10690 {f: 2, c: 32523}, 32527, {f: 2, c: 32529}, 32535, 32537, 32540, 32539, 10691 32543, {f: 7, c: 32545}, {f: 4, c: 32554}, {f: 5, c: 32559}, 32565, 10692 [12083, 24186], 30079, [12078, 24027], 30014, 37013, 29582, 29585, 29614, 10693 29602, 29599, 29647, 29634, 29649, 29623, 29619, 29632, 29641, 29640, 10694 29669, 29657, 39036, 29706, 29673, 29671, 29662, 29626, 29682, 29711, 10695 29738, 29787, 29734, 29733, 29736, 29744, 29742, 29740, 29723, 29722, 10696 29761, 29788, 29783, 29781, 29785, 29815, 29805, 29822, 29852, 29838, 10697 {f: 2, c: 29824}, 29831, 29835, 29854, {f: 2, c: 29864}, 29840, 29863, 10698 29906, 29882, {f: 3, c: 38890}, 26444, 26451, 26462, 26440, 26473, 26533, 10699 26503, 26474, 26483, 26520, 26535, 26485, 26536, 26526, 26541, 26507, 10700 26487, 26492, 26608, 26633, 26584, 26634, 26601, 26544, 26636, 26585, 10701 26549, 26586, 26547, 26589, 26624, 26563, 26552, 26594, 26638, 26561, 10702 26621, {f: 2, c: 26674}, {f: 2, c: 26720}, 26702, 26722, 26692, 26724, 10703 26755, 26653, 26709, 26726, 26689, 26727, 26688, 26686, 26698, 26697, 10704 26665, 26805, 26767, 26740, 26743, 26771, 26731, 26818, 26990, 26876, 10705 {f: 2, c: 26911}, 26873, 26916, 26864, 26891, 26881, 26967, 26851, 26896, 10706 26993, 26937, 26976, 26946, 26973, 27012, 26987, 27008, 27032, 27000, 10707 26932, 27084, {f: 2, c: 27015}, 27086, 27017, 26982, 26979, 27001, 27035, 10708 27047, 27067, 27051, 27053, 27092, 27057, 27073, 27082, 27103, 27029, 10709 27104, 27021, 27135, 27183, 27117, {f: 2, c: 27159}, 27237, 27122, 27204, 10710 27198, 27296, 27216, 27227, 27189, 27278, 27257, 27197, 27176, 27224, 10711 27260, 27281, 27280, 27305, 27287, 27307, 29495, 29522, {f: 2, c: 27521}, 10712 27527, 27524, {f: 2, c: 27538}, 27533, {f: 2, c: 27546}, 27553, 27562, 10713 36715, 36717, {f: 3, c: 36721}, {f: 2, c: 36725}, 36728, 36727, 10714 {f: 2, c: 36729}, 36732, 36734, {f: 2, c: 36737}, 36740, 36743, 36747, 10715 {f: 3, c: 36749}, 36760, 36762, 36558, 25099, 25111, 25115, 25119, 25122, 10716 25121, 25125, 25124, 25132, 33255, 29935, 29940, 29951, 29967, 29969, 10717 29971, [12097, 25908], {f: 3, c: 26094}, 26122, 26137, 26482, 26115, 26133, 10718 26112, 28805, 26359, 26141, 26164, 26161, 26166, 26165, 32774, 26207, 10719 26196, 26177, 26191, 26198, 26209, 26199, 26231, 26244, 26252, 26279, 10720 26269, 26302, {f: 2, c: 26331}, 26342, 26345, {f: 2, c: 36146}, 36150, 10721 36155, 36157, 36160, {f: 2, c: 36165}, {f: 2, c: 36168}, 36167, 36173, 10722 36181, 36185, 35271, {f: 3, c: 35274}, {f: 4, c: 35278}, 29294, 29343, 10723 29277, 29286, 29295, {f: 2, c: 29310}, 29316, 29323, 29325, 29327, 29330, 10724 25352, 25394, 25520, 25663, 25816, 32772, 27626, 27635, 27645, 27637, 10725 27641, 27653, 27655, 27654, 27661, 27669, {f: 3, c: 27672}, 27681, 27689, 10726 27684, 27690, 27698, 25909, 25941, 25963, 29261, 29266, 29270, 29232, 10727 34402, 21014, 32927, 32924, 32915, 32956, 26378, 32957, 32945, 32939, 10728 32941, 32948, 32951, {f: 4, c: 32999}, 32987, 32962, 32964, 32985, 32973, 10729 32983, 26384, 32989, 33003, 33009, 33012, 33005, {f: 2, c: 33037}, 33010, 10730 33020, 26389, 33042, 35930, 33078, 33054, 33068, 33048, 33074, 33096, 10731 33100, 33107, 33140, {f: 2, c: 33113}, 33137, 33120, 33129, 10732 {f: 2, c: 33148}, 33133, 33127, 22605, 23221, 33160, 33154, 33169, 28373, 10733 33187, 33194, 33228, 26406, 33226, 33211, 33217, 33190, 27428, 27447, 10734 27449, 27459, 27462, 27481, {f: 3, c: 39121}, 39125, {f: 2, c: 39129}, 10735 [12110, 27571], 24384, 27586, 35315, 26000, 40785, 26003, 26044, 26054, 10736 26052, 26051, 26060, 26062, 26066, 26070, 28800, 28828, 28822, 28829, 10737 28859, 28864, 28855, 28843, 28849, 28904, 28874, 28944, 28947, 28950, 10738 28975, 28977, 29043, 29020, 29032, 28997, 29042, 29002, 29048, 29050, 10739 29080, 29107, 29109, 29096, 29088, 29152, 29140, 29159, 29177, 29213, 10740 29224, 28780, 28952, 29030, 29113, 25150, 25149, 25155, {f: 2, c: 25160}, 10741 31035, 31040, 31046, 31049, {f: 2, c: 31067}, 31059, 31066, 31074, 31063, 10742 31072, 31087, 31079, 31098, 31109, 31114, 31130, 31143, 31155, 24529, 10743 24528, 24636, 24669, 24666, 24679, 24641, 24665, 24675, 24747, 24838, 10744 24845, 24925, 25001, 24989, 25035, 25041, 25094, 32896, [12160, 32895], 10745 27795, 27894, 28156, 30710, 30712, 30720, 30729, {f: 2, c: 30743}, 30737, 10746 26027, 30765, {f: 2, c: 30748}, {f: 3, c: 30777}, 30751, 30780, 30757, 10747 30764, 30755, 30761, 30798, 30829, {f: 2, c: 30806}, 30758, 30800, 30791, 10748 30796, 30826, 30875, 30867, 30874, 30855, 30876, 30881, 30883, 30898, 10749 30905, 30885, 30932, 30937, 30921, 30956, 30962, 30981, 30964, 30995, 10750 31012, 31006, 31028, 40859, [12235, 40697], {f: 2, c: 40699}, 30449, 30468, 10751 30477, 30457, {f: 2, c: 30471}, 30490, 30498, 30489, 30509, 30502, 30517, 10752 30520, {f: 2, c: 30544}, 30535, 30531, 30554, 30568, 30562, 30565, 30591, 10753 30605, 30589, 30592, 30604, 30609, {f: 2, c: 30623}, 30640, 30645, 30653, 10754 30010, 30016, 30030, 30027, 30024, 30043, 30066, 30073, 30083, 32600, 10755 32609, 32607, 35400, 32616, 32628, 32625, 32633, 32641, 32638, 30413, 10756 30437, 34866, {f: 3, c: 38021}, 38027, 38026, {f: 2, c: 38028}, 10757 {f: 2, c: 38031}, 38036, 38039, 38037, {f: 3, c: 38042}, {f: 2, c: 38051}, 10758 38059, 38058, 38061, 38060, {f: 2, c: 38063}, 38066, 38068, 10759 {f: 5, c: 38070}, {f: 2, c: 38076}, 38079, 38084, {f: 7, c: 38088}, 10760 {f: 3, c: 38096}, {f: 3, c: 38101}, 38105, 38104, 38107, {f: 3, c: 38110}, 10761 38114, {f: 2, c: 38116}, {f: 2, c: 38119}, 38122, 38121, 38123, 10762 {f: 2, c: 38126}, {f: 3, c: 38131}, 38135, 38137, {f: 2, c: 38140}, 38143, 10763 38147, 38146, {f: 2, c: 38150}, {f: 2, c: 38153}, {f: 3, c: 38157}, 10764 {f: 5, c: 38162}, 38168, 38171, {f: 3, c: 38173}, 38178, {f: 2, c: 38186}, 10765 38185, 38188, {f: 2, c: 38193}, 38196, {f: 3, c: 38198}, 38204, 10766 {f: 2, c: 38206}, 38210, 38197, {f: 3, c: 38212}, 38217, 38220, 10767 {f: 2, c: 38222}, {f: 3, c: 38226}, {f: 4, c: 38230}, 38235, 10768 {f: 2, c: 38238}, 38237, {f: 2, c: 38241}, {f: 9, c: 38244}, 38255, 10769 {f: 3, c: 38257}, 38202, 30695, 30700, 38601, 31189, 31213, 31203, 31211, 10770 31238, 23879, 31235, 31234, 31262, 31252, 31289, 31287, 31313, 40655, 10771 39333, 31344, 30344, 30350, 30355, 30361, 30372, 29918, 29920, 29996, 10772 40480, 40482, {f: 5, c: 40488}, 40498, 40497, 40502, 40504, 40503, 10773 {f: 2, c: 40505}, 40510, {f: 2, c: 40513}, 40516, {f: 4, c: 40518}, 10774 {f: 2, c: 40523}, 40526, 40529, 40533, 40535, {f: 3, c: 40538}, 40542, 10775 40547, {f: 7, c: 40550}, 40561, 40557, 40563, [12135, 30098], 30100, 30102, 10776 30112, 30109, 30124, 30115, {f: 2, c: 30131}, 30136, 30148, 30129, 30128, 10777 30147, 30146, 30166, 30157, 30179, 30184, 30182, 30180, 30187, 30183, 10778 30211, 30193, 30204, 30207, 30224, 30208, 30213, 30220, 30231, 30218, 10779 30245, 30232, 30229, 30233, 30235, 30268, 30242, 30240, 30272, 30253, 10780 30256, 30271, 30261, 30275, 30270, 30259, 30285, 30302, 30292, 30300, 10781 30294, 30315, 30319, 32714, 31462, {f: 2, c: 31352}, 31360, 31366, 31368, 10782 31381, 31398, 31392, 31404, 31400, 31405, 31411, 34916, 34921, 34930, 10783 34941, 34943, 34946, 34978, 35014, 34999, 35004, 35017, 35042, 35022, 10784 35043, 35045, 35057, 35098, 35068, 35048, 35070, 35056, 35105, 35097, 10785 35091, 35099, 35082, 35124, 35115, 35126, 35137, 35174, 35195, 10786 [12134, 30091], 32997, 30386, 30388, 30684, [12158, 32786], 32788, 32790, 10787 32796, 32800, 32802, {f: 3, c: 32805}, 32809, 32808, 32817, 32779, 32821, 10788 32835, 32838, 32845, 32850, 32873, 32881, 35203, 39032, 39040, 39043, 10789 39049, {f: 2, c: 39052}, 39055, 39060, {f: 2, c: 39066}, {f: 2, c: 39070}, 10790 {f: 2, c: 39073}, {f: 2, c: 39077}, [12172, 34381], 34388, 34412, 34414, 10791 34431, 34426, 34428, 34427, 34472, 34445, 34443, 34476, 34461, 34471, 10792 34467, 34474, 34451, 34473, 34486, 34500, 34485, 34510, 34480, 34490, 10793 34481, 34479, 34505, 34511, 34484, 34537, {f: 2, c: 34545}, 34541, 34547, 10794 34512, 34579, 34526, 34548, 34527, 34520, 34513, 34563, 34567, 34552, 10795 34568, 34570, 34573, 34569, 34595, 34619, 34590, 34597, 34606, 34586, 10796 34622, 34632, 34612, 34609, 34601, 34615, 34623, 34690, 34594, 10797 {f: 2, c: 34685}, 34683, 34656, 34672, 34636, 34670, 34699, 34643, 34659, 10798 34684, 34660, 34649, 34661, 34707, 34735, 34728, 34770, 34758, 34696, 10799 34693, 34733, 34711, 34691, 34731, 34789, 34732, 34741, 34739, 34763, 10800 34771, 34749, 34769, 34752, 34762, 34779, 34794, 34784, 34798, 34838, 10801 34835, 34814, 34826, 34843, 34849, 34873, 34876, [12152, 32566], 32578, 10802 {f: 2, c: 32580}, 33296, 31482, 31485, 31496, {f: 2, c: 31491}, 31509, 10803 31498, 31531, 31503, 31559, 31544, 31530, 31513, 31534, 31537, 31520, 10804 31525, 31524, 31539, 31550, 31518, 31576, 31578, 31557, 31605, 31564, 10805 31581, 31584, 31598, 31611, 31586, 31602, 31601, 31632, {f: 2, c: 31654}, 10806 31672, 31660, 31645, 31656, 31621, 31658, 31644, 31650, 31659, 31668, 10807 31697, 31681, 31692, 31709, 31706, {f: 2, c: 31717}, 31722, 31756, 31742, 10808 31740, 31759, 31766, 31755, 31775, 31786, 31782, 31800, 31809, 31808, 10809 33278, {f: 2, c: 33281}, 33284, 33260, 34884, {f: 3, c: 33313}, 33325, 10810 33327, 33320, 33323, 33336, 33339, {f: 2, c: 33331}, 33342, 33348, 33353, 10811 33355, 33359, 33370, 33375, 33384, 34942, 34949, 34952, 35032, 35039, 10812 35166, 32669, 32671, 32679, {f: 2, c: 32687}, 32690, 31868, 25929, 31889, 10813 31901, 31900, 31902, 31906, 31922, {f: 2, c: 31932}, 31937, 31943, 10814 {f: 2, c: 31948}, 31944, 31941, 31959, 31976, [12169, 33390], 26280, 32703, 10815 32718, 32725, 32741, 32737, 32742, 32745, 32750, 32755, [12151, 31992], 10816 32119, 32166, 32174, 32327, 32411, 40632, 40628, 36211, 36228, 36244, 10817 36241, 36273, 36199, 36205, 35911, 35913, 37194, 37200, {f: 2, c: 37198}, 10818 37220, 37218, 37217, 37232, 37225, 37231, {f: 2, c: 37245}, 37234, 37236, 10819 37241, 37260, 37253, 37264, 37261, 37265, {f: 2, c: 37282}, 37290, 10820 {f: 3, c: 37293}, 37301, 37300, 37306, [12183, 35925], 40574, 36280, 36331, 10821 36357, 36441, 36457, 36277, 36287, 36284, 36282, 36292, {f: 2, c: 36310}, 10822 36314, 36318, {f: 2, c: 36302}, 36315, 36294, 36332, {f: 2, c: 36343}, 10823 36323, 36345, 36347, 36324, 36361, 36349, 36372, 36381, 36383, 36396, 10824 36398, 36387, 36399, 36410, 36416, 36409, 36405, 36413, 36401, 36425, 10825 {f: 2, c: 36417}, {f: 2, c: 36433}, 36426, 36464, 36470, 36476, 36463, 10826 36468, 36485, 36495, 36500, 36496, 36508, 36510, [12184, 35960], 35970, 10827 35978, 35973, 35992, 35988, 26011, 35286, 35294, 35290, 35292, 35301, 10828 35307, 35311, 35390, 35622, 38739, 38633, 38643, 38639, 38662, 38657, 10829 38664, 38671, 38670, 38698, 38701, 38704, 38718, 40832, 40835, 10830 {f: 6, c: 40837}, 40844, 40702, 40715, 40717, [12203, 38585], 10831 {f: 2, c: 38588}, 38606, 38610, 30655, 38624, 37518, 37550, 37576, 37694, 10832 37738, 37834, 37775, 37950, 37995, 40063, 40066, {f: 4, c: 40069}, 31267, 10833 40075, 40078, {f: 3, c: 40080}, {f: 2, c: 40084}, {f: 2, c: 40090}, 10834 {f: 6, c: 40094}, {f: 5, c: 40101}, 40107, {f: 2, c: 40109}, 10835 {f: 8, c: 40112}, {f: 4, c: 40122}, {f: 4, c: 40132}, {f: 7, c: 40138}, 10836 {f: 3, c: 40147}, {f: 3, c: 40151}, {f: 2, c: 40156}, 40159, 40162, 38780, 10837 38789, {f: 2, c: 38801}, 38804, 38831, 38827, 38819, 38834, 38836, 39601, 10838 39600, 39607, 40536, 39606, 39610, 39612, 39617, 39616, 39621, 39618, 10839 {f: 2, c: 39627}, 39633, 39749, 39747, 39751, 39753, 39752, 39757, 39761, 10840 39144, 39181, 39214, 39253, 39252, [12221, 39647], 39649, 39654, 39663, 10841 39659, 39675, 39661, 39673, 39688, 39695, 39699, 39711, 39715, 10842 {f: 2, c: 40637}, 32315, 40578, {f: 2, c: 40583}, 40587, 40594, 37846, 10843 40605, 40607, {f: 3, c: 40667}, 40672, 40671, 40674, 40681, 40679, 40677, 10844 40682, 40687, 40738, 40748, 40751, 40761, 40759, {f: 2, c: 40765}, 40772, 10845 12295, {s: 13}, 30362, 34297, 31001, 24859, 39599, 35158, 22761, 32631, 10846 25850, 25943, 38930, 36774, 32070, 24171, 32129, 37770, 35607, 39165, 10847 23542, 22577, 39825, 36649, [12185, 35997], 37575, 29437, 20633, 24970, 10848 32179, 31558, 30050, 25987, 24163, 38281, 37002, 32232, 36022, 35722, 10849 36783, 36782, 27161, 40009, 30303, 28693, 28657, 36051, 25839, 39173, 10850 25765, 37474, 37457, 39361, 35036, 36001, 21443, 34870, 27544, 24922, 10851 24920, 29158, 33980, 33369, 20489, 28356, 21408, 20596, 28204, 23652, 10852 35435, 25881, 25723, 34796, 39262, 35730, 32399, 37855, 29987, 38369, 10853 39019, 22580, 22039, [12199, 38263], 20767, 33144, 24288, 26274, 37396, 10854 [12190, 36554], 24505, 22645, 38515, 35183, 31281, 25074, 35488, 39425, 10855 36978, 39347, [12242, 40786], 29118, 34909, 34802, 23541, 30087, 36490, 10856 31820, 32162, 37276, 37604, 38619, 30990, 20786, 35320, 34389, 20659, 10857 30241, 38358, 21109, 37656, 32020, 32189, 36781, 35422, 36060, 32880, 10858 24478, 21474, 36517, 31428, 37679, 36948, 24118, 36024, 25812, 21934, 10859 37170, 25763, 33213, 24986, 35477, 24392, 30070, 25803, 40680, 34153, 10860 27284, 25623, 23798, 31153, 23566, 29128, 37159, 25973, 28364, 36958, 10861 32224, 39003, 40670, 22666, 38651, 28593, 37347, 35519, 35548, 37336, 10862 38914, 37664, 35330, 26481, 21205, 26847, 20941, [12222, 39717], 29346, 10863 29544, 35712, 36077, 37709, 37723, 26039, 32222, 38538, 23565, 22136, 10864 38931, 37389, 22890, 22702, 40285, 38989, 35355, 24801, 39187, 20818, 10865 29246, 39180, 36019, 30332, 32624, 38309, 31020, 37353, 29033, 31684, 10866 36009, 39151, 35370, 32033, [12214, 39131], 35513, 24290, 36027, 32027, 10867 22707, 22894, 24996, 31966, 35920, 26963, 37586, [12213, 39080], 30219, 10868 39342, 32299, 35575, 40179, 33178, 36667, 25771, 36628, 36070, 24489, 10869 36000, 35331, 23142, 32283, 35442, 37411, 33995, 24185, 36245, 36123, 10870 23713, 21083, 37628, 32177, 23831, 37804, 25841, 40255, 38307, 37499, 10871 20491, 32102, 40852, 38799, 36002, 37390, 28317, 27083, 36092, 34865, 10872 39015, 21102, 38364, 35264, 39208, 24931, 36011, 24291, 35215, 27512, 10873 [12244, 40860], 38312, 36556, 35437, 27331, 36020, 21130, 36645, 37707, 10874 22283, 36942, 39405, 38867, 28450, 34399, 38305, 40372, 36032, 36703, 10875 40251, 32005, 22778, 35703, 28396, 22057, 33775, 30059, 21123, 35441, 10876 25079, 22750, 27489, 29872, 36996, 32233, 35594, 25582, 36637, 36036, 10877 31330, 26371, 29172, 21295, 35569, 35496, 32362, 33911, 28222, 29554, 10878 36008, 31117, 25802, 27231, 31309, 39249, 35663, 40388, 32318, 32221, 10879 26997, 36655, 32026, 25824, 24190, 34186, 21137, 28639, 35336, 35352, 10880 38555, 32380, 32000, 22846, 33698, 38960, 36040, 37440, 20729, 39381, 10881 27570, 30435, 22533, 31627, 38291, 33393, 32216, 32365, 27298, 40572, 10882 25536, 25791, 31777, 20745, 34214, 27323, 37970, 36368, 36068, 10883 [12178, 35211], 37749, 33382, 21133, 39198, 28472, 28666, 28567, 23559, 10884 28479, 34083, 27123, 22892, 35611, 37292, 33184, 28550, 39509, 23308, 10885 25898, 37496, 30703, 20709, 39171, 32371, 32094, 36686, 36611, 38542, 10886 31680, 28500, 32080, 35489, 32202, 37670, 20677, 35641, 36914, 29180, 10887 30433, 21185, 33686, 39912, 39514, 32147, 38968, 37857, 24465, 30169, 10888 31478, 31998, 33290, 39378, 33289, 25818, 37624, 25084, 21127, 40273, 10889 32121, 35258, 35363, 32118, 37406, 36557, 39423, 38283, 20977, 38982, 10890 27579, 35506, 22718, 25031, 25715, 24235, 35122, 35463, 22602, 20744, 10891 23532, 31014, 26336, 34407, 24011, 31418, 39243, 28528, 25844, 38346, 10892 34847, 33240, 33802, 20358, 36084, 34253, 27396, 25876, 31811, 38348, 10893 34349, 28734, 35733, 25900, 35261, 25078, 32412, 29211, 28651, 25736, 10894 21214, 28551, 27138, 37939, 22744, 39006, 31852, 38626, 28757, 35023, 10895 39881, 31150, 40599, 21426, 21237, 31019, 27511, 28701, 38584, 20486, 10896 32879, 34030, 36899, 37934, 24976, 28451, 31806, 25986, 33225, 37832, 10897 25088, 29001, 32244, 31975, 20841, 36635, 35538, 30274, 36988, 37904, 10898 29557, 33256, 37168, 40023, 36035, 40801, 37428, 38728, 23994, 38936, 10899 39230, 21129, [12243, 40845], 32894, 22184, 31840, 22751, 25871, 38580, 10900 27155, 23105, 25695, 31757, 34310, 30439, 39025, 24300, 29200, 25796, 10901 28407, 34396, 39791, 36034, 37682, 38520, 39522, 37569, 23650, 32311, 10902 24942, 28670, 32209, 24018, 25891, 23423, 28772, 20098, 25476, 36650, 10903 20523, 20374, 28138, 32184, 35542, 34367, 32645, 37007, 38012, 31854, 10904 39486, 39409, 32097, 23229, 29802, 30908, 34718, [12218, 39340], 39393, 10905 21966, 36023, [12230, 40613], 36067, 36993, 30622, 39237, 34875, 28415, 10906 35646, 37672, 37466, 36031, 37762, [12200, 38272], 24758, 20497, 37683, 10907 22818, 35598, 24396, 35219, 32191, 32236, 24287, 28357, 25003, 38313, 10908 40180, 37528, 35628, 35584, 30045, 37385, 32013, 38627, 25747, 33126, 10909 24817, 39719, 39186, 25836, 33193, 25862, 37312, [12227, 40165], 32886, 10910 22169, 38007, 37811, 27320, 29552, 23527, 25840, 28632, 37397, 32016, 10911 33215, 28611, 36786, 30247, 35582, 27472, 40407, 27590, 22036, 28442, 10912 30436, 40848, 36064, 22132, 40300, 39449, 39108, 38971, 36007, 34315, 10913 24977, 35413, 28497, 38935, 25778, 37610, 20693, 27192, 35676, 33229, 10914 [12241, 40778], 39438, 35912, 21843, 27683, 35350, 29309, 37370, 37467, 10915 36983, 31805, 35609, 37666, 37463, 28154, 35700, 22649, 27085, 21958, 10916 22715, 34196, 25654, 37740, 27211, 21932, 20689, 32761, 31429, 31434, 10917 27453, 35242, 23522, 36629, 27691, 20670, 38915, 35531, 24950, 29898, 10918 31406, 36264, 21312, 36544, 39493, 40818, 39028, 27402, 21240, 40306, 10919 30906, 35731, 39250, 25854, 32350, 29105, 38860, 35469, 32009, 27054, 10920 32104, 36575, 37613, 38287, 28516, 28753, 34217, 39955, 36093, 20632, 10921 21930, 39479, 25475, 28544, 27578, 32023, 31721, 26348, 38275, 38493, 10922 36109, 32341, 20663, 36062, 29138, 32057, 36050, 25448, 25885, 25086, 10923 35373, 32051, 23529, 23352, 33102, 28402, 32882, 32361, 21213, 32854, 10924 24107, 29509, 28629, 35433, 26178, 34645, 23526, 35672, 39387, 21218, 10925 36969, 37323, 39166, 35222, 35430, 22781, 29560, 27166, 36664, 26360, 10926 36118, 23660, 34899, 27193, 31466, 25976, 24101, 38617, 35504, 38918, 10927 35500, 30889, 29197, 32114, 39164, 39686, 32883, 24939, 38924, 35359, 10928 35494, 25851, 34311, 35380, 32901, 38614, 38568, 32143, 27506, 23403, 10929 25613, 32302, 29795, 37782, 29562, 25787, 33274, 24907, 25892, 36010, 10930 30321, 28760, 22727, 35674, 35527, 22022, 28271, 29145, 28644, 32295, 10931 35342, 39472, 35588, 37563, 38988, 39636, 26781, 36028, 37941, 24307, 10932 32893, 28916, 37509, 32113, 38957, 22294, 22615, 22296, 38973, 40213, 10933 39345, 39389, 27234, 31402, 35178, 24398, 28771, 38929, 33836, 32178, 10934 [12209, 38859], 36949, 22285, 29234, 28656, 32173, 33894, 20553, 20702, 10935 32239, 35586, 34907, 32862, 32011, 31337, 21839, 25790, 34680, 28198, 10936 31401, 21978, 37794, 28879, 35491, 28961, 34154, 22626, 38695, 21209, 10937 35492, 37675, 29351, 35186, 32722, 37521, 25138, 32048, 34662, 36676, 10938 23805, 20448, 29433, 22151, 37697, 39854, 32406, 36066, 37532, 38289, 10939 39023, 38570, 29694, 29563, 32291, 39201, 25010, 32171, 38002, 37129, 10940 35443, 38911, 38917, 34157, 22210, 37559, 26313, 22063, 21332, 25406, 10941 33029, 35559, 23531, 28681, 35613, 37573, 37313, 33288, 37561, 32137, 10942 38920, 35377, 32210, 32396, 36562, 25080, 36984, 30316, 32098, 23416, 10943 21211, 35426, 23563, 39348, 35347, 35338, 36956, 22739, 40201, 40232, 10944 21854, 20126, 35357, 38329, 40573, 22196, 38996, 38331, 33399, 21421, 10945 30831, 35578, 39511, 40230, 26954, 25562, 30221, 38525, 30306, 39178, 10946 27171, 22575, 35617, 34277, 29242, [12212, 38913], 26989, 33865, 37291, 10947 37541, 38948, 36986, 20736, 34811, 34269, 20740, 25014, 32681, 35427, 10948 35696, 35516, 35695, 32377, 34093, 38512, 37504, 39154, 38577, 27387, 10949 23344, 40441, 25033, 32403, 29801, 34722, 29151, 29074, 34821, 36111, 10950 31310, 21938, 25793, 20653, 30320, 36404, 20778, 24962, 37109, 37438, 10951 29494, 35480, 36671, 39192, [12226, 39770], 28417, 33287, 23996, 35486, 10952 39729, 29508, 35709, 38928, 39341, 40219, 28149, 36677, 22290, 21729, 10953 22291, 32227, 36960, 39000, 32004, 36493, 38000, 38322, 38642, 37142, 10954 38549, 36939, 34292, 37270, 26248, 38620, 36617, 25890, 26283, 36106, 10955 36124, 33247, 38015, 26839, 31432, 36012, 25799, 21063, 28580, 36042, 10956 36104, 36555, 37720, 38296, 35408, 40779, 20661, 27656, 30430, 26028, 10957 36670, 23940, 26855, 25136, 32187, 24373, 28466, 24115, 36076, 33081, 10958 36249, 34756, 36685, 37754, 36889, 35998, 37341, 20597, 35386, 37806, 10959 38499, 24128, 30309, 37165, 35657, 32340, 32887, 22519, 34937, 32025, 10960 25711, 25842, 24159, 36074, 28399, 37912, 32066, 31278, 33131, 34886, 10961 35589, 36600, 30394, 26205, 39519, 35576, 35461, 29165, 30682, 22225, 10962 36015, 37956, 31689, 39376, 23560, 30938, 36681, 36090, 27137, 33674, 10963 35037, 22941, 22767, 29376, 37648, 36101, 22684, 32180, 35524, 28310, 10964 28609, 36039, 28460, 32156, 32317, 32305, 37138, 35419, 32068, 38013, 10965 21959, 21401, 21428, 38760, 36107, 21293, 21297, 36094, 21060, 21132, 10966 21108, 20660, 20480, 20630, 20757, 20738, 20756, 20796, 20791, 20712, 10967 20674, 20795, 20752, 20794, 20681, 31988, 40652, 22213, 40172, 35131, 10968 33248, 35329, 35344, 35340, 35349, 35635, 35406, 35365, 35393, 35382, 10969 35398, 35412, 35416, 35410, 35462, 35460, 35455, 35440, 35452, 35445, 10970 35436, 35438, 35533, 35554, 35425, 35482, 35493, {f: 2, c: 35473}, 35535, 10971 35537, 35529, 35547, 35543, 35522, 35510, 35574, 35563, 35604, 35585, 10972 35556, 35565, 35580, 35571, 35558, 35566, 35550, 35624, 35740, 35606, 10973 35610, 35600, 35627, 35629, 35670, 35673, 35662, 35742, 35691, 35734, 10974 38488, 37178, 37140, 37172, 37087, 37174, 37126, 37192, 33467, 21233, 10975 24048, 22538, 22745, 22754, 22752, 22746, 22497, 22607, 22550, 22610, 10976 22557, 22628, 34188, 34131, 34294, 33703, 33799, 34031, 33511, 34338, 10977 34086, 22603, 29026, 34136, 34045, 34126, 34184, 34234, 29334, 28366, 10978 34113, 34254, 34130, 33984, 33874, 33892, 33940, 33845, 34207, 34133, 10979 40367, 33939, 32264, 34118, 34146, 34078, 39488, 34362, 37795, 34167, 10980 34334, 34298, 34308, 34282, 34330, 22889, 23607, 25451, 25718, 25759, 10981 25681, 25692, 25779, 25860, 25878, 25847, 25852, 25883, 22064, 22072, 10982 22216, 22182, 21764, 21692, 22144, 22109, 22112, 22069, 22006, 22118, 10983 22130, 22156, 22117, 22044, 22062, 21993, 22038, 22208, 22029, 22195, 10984 22209, 22127, 36705, 22198, 22165, 22279, 24131, 24172, 24152, 24151, 10985 23943, 23796, 23888, 23852, 23975, 23968, 23959, 23821, 23992, 23937, 10986 24020, 24480, 29559, 29505, 29546, 29499, 29547, 29568, 29564, 39136, 10987 39219, 39145, 39228, {f: 2, c: 39146}, 39149, 39156, 39177, 39185, 39195, 10988 39223, 39231, 39235, {f: 3, c: 39240}, 39244, 39266, 24289, 36065, 25082, 10989 25006, 24938, 24894, 24757, 24884, 25036, 24927, 25064, 24827, 24887, 10990 24818, 24947, 24860, 24978, 38274, 38278, 38344, 38286, 38292, 38284, 10991 38373, 38317, 38315, 39726, 38316, 38334, 38326, 39721, 38335, 38333, 10992 38332, 38339, 38347, 38356, 38352, 38357, 38366, 28739, 28505, 28711, 10993 28696, 28668, 28039, 28025, 28254, 28590, 28687, 28408, 28527, 28150, 10994 28543, 28678, 28576, 28683, 28775, 28740, 28677, 28535, 28704, 28703, 10995 28722, 28712, 28765, 39467, 36999, 36885, 37008, 23656, 24371, 23285, 10996 23255, 23296, 23149, 23304, 23372, 23207, 23291, 23307, 23329, 23338, 10997 23321, 39380, 39391, 39385, 39478, 39515, 39377, 39384, 39501, 39498, 10998 39394, 39530, 39439, 39437, 39429, 39490, 39469, 39446, 39489, 39470, 10999 39480, {f: 2, c: 39491}, 39503, 39525, 39524, 31993, 32006, 32002, 11000 {f: 2, c: 32007}, 32394, 32028, 32021, 32019, 32058, 32050, 32049, 32272, 11001 32060, 32064, 32063, 32093, 32078, 32115, 32134, 32131, 32136, 32190, 11002 32186, 32203, 32212, 32196, 32158, 32172, 32185, 32163, 32176, 32199, 11003 32217, 32215, 32249, 32242, 32354, 32230, 32246, 32241, 32267, 32225, 11004 32265, 32285, 32287, 32286, 32301, 32266, 32273, 32381, 32313, 32309, 11005 32306, 32326, 32325, 32392, 32346, 32338, 32366, 32382, 32368, 32367, 11006 32408, 29859, 29771, 29903, 38922, 29885, 29759, 29833, 29862, 29908, 11007 29914, 38873, 38878, 38876, 27050, 27370, 26776, 26838, 27141, 26783, 11008 27355, 27379, 27368, 27359, 27273, 26895, 27208, 26984, 27071, 27194, 11009 27292, 27410, 27422, 27357, 27111, 27407, 27414, 27372, 27354, 27384, 11010 27315, 27367, 27299, 27347, 27358, 27556, 27550, 27566, 27563, 27567, 11011 36564, 36571, 36594, 36603, 36708, 36601, 36604, 36587, 36580, 36706, 11012 36602, 36606, 36618, 36615, 36613, 36626, 36646, {f: 2, c: 36638}, 36636, 11013 36659, 36678, 36692, 25108, 25127, 29964, 26311, 26308, 26249, 26326, 11014 36033, 36016, 36026, 36029, 36100, 36018, 36037, 36112, 36049, 36058, 11015 36053, 36075, 36071, 36091, 35224, 35244, 35233, 35263, 35238, 35247, 11016 35250, 35255, 27647, 27660, 27692, 29272, 26407, 33110, 33242, 33051, 11017 33214, 33121, 33231, 27487, {f: 2, c: 39086}, 39094, 39100, 39110, 39112, 11018 36674, 40783, 26005, 29036, 29010, 29079, 29121, 29148, 29182, 31152, 11019 31118, 31146, 25055, 24932, 25059, 25095, 28585, 30959, 30893, 30824, 11020 30904, 31018, 31025, 30820, 30973, 30951, 30947, 40853, 30616, 30558, 11021 30652, 32646, 32648, {f: 3, c: 37330}, 37337, 37335, 37333, 37367, 37351, 11022 37348, 37702, 37365, 37369, 37384, 37414, 37445, 37393, 37392, 37377, 11023 37415, 37380, 37413, 37376, 37434, 37478, 37431, 37427, 37461, 37437, 11024 37432, 37470, {f: 2, c: 37484}, 37439, 37984, 37424, 37449, 37448, 37453, 11025 37422, 37433, 37944, 37548, 37536, 37498, 37546, 37614, 37583, 37891, 11026 37603, 37946, 37553, 37542, 37799, 37526, 37580, 37545, 37877, 37523, 11027 37503, 37801, 37530, 37658, 37547, 37507, 37899, 37544, 37539, 37906, 11028 37688, 37617, 37847, 37605, 37616, 37615, 37608, 37564, 37597, 37622, 11029 {f: 2, c: 37926}, 37571, 37599, 37606, 37650, 37638, 37737, 37659, 37696, 11030 37633, 37653, 37678, 37699, {f: 2, c: 37639}, 37663, 37657, 37733, 37703, 11031 37750, 37716, 37732, 37802, 37744, 37764, 37860, 37848, 37928, 37767, 11032 37836, 37784, 37816, 37823, 37798, 37808, 37813, 37964, 37858, 11033 {f: 2, c: 37852}, 37837, 37854, 37827, 37831, 37841, 37908, 37917, 37879, 11034 37989, 37907, 37997, 37920, 38009, 37881, 37913, 37962, 37938, 37951, 11035 37972, 37987, 37758, 31329, 40169, 40182, 40199, 40198, 40227, 40327, 11036 40469, 40221, 40223, 40421, 40239, 40409, 40240, 40258, 40478, 40275, 11037 40477, 40288, 40274, 40435, 40284, 40289, 40339, 40298, 40303, 40329, 11038 40344, 40346, 40384, 40357, 40361, 40386, 40380, 40474, 40403, 40410, 11039 40431, 40422, 40434, 40440, 40460, 40442, 40475, 30308, 30296, 30311, 11040 30210, {f: 2, c: 30278}, 30281, 30238, 30267, {f: 2, c: 30317}, 30313, 11041 30322, 31431, 31414, 35168, 35123, 35165, 35143, 35128, 35172, 30392, 11042 32814, 32812, 32889, 32885, 38919, {f: 2, c: 38926}, 38945, 38940, 28481, 11043 38950, 38967, 38990, 38995, 39027, 39010, 39001, 39013, 39020, 39024, 11044 34787, 34822, 34566, 34851, 34806, 34554, 34799, 34692, 34832, 34760, 11045 34833, 34747, 34766, 32588, 31716, 31591, 31849, 31731, 31744, 31691, 11046 31836, 31774, 31787, 31779, 31850, 31839, 33380, 33387, 35018, 32677, 11047 31986, 31990, 31965, 32310, 40617, 36274, 37317, 37315, 40570, 36489, 11048 36428, 36498, 36474, 36437, 36506, 36491, 36499, 36497, 36513, 36451, 11049 36522, 36518, 35316, 35318, 38746, 38722, 38717, 38724, 40788, 40799, 11050 40793, 40800, 40796, 40806, 40812, 40810, 40823, [12236, 40701], 40703, 11051 40713, 35726, 38014, 37864, 39799, 39796, 39809, 39811, 39822, 40056, 11052 31308, 39826, 40031, 39824, 39853, 39834, 39850, 39838, 40045, 39851, 11053 39837, 40024, 39873, 40058, 39985, 39993, 39971, 39991, 39872, 39882, 11054 39879, 39933, 39894, {f: 2, c: 39914}, 39905, 39908, 39911, 39901, 39906, 11055 39920, 39899, 39924, 39892, 40029, 39944, 39952, 39949, 39954, 39945, 11056 39935, 39968, 39986, 39981, 39976, 39973, 39977, 39987, 39998, 40008, 11057 39995, 39989, 40005, 40022, 40020, 40018, 40039, 38851, 38845, 38857, 11058 40379, 39631, 39638, 39637, 39768, 39758, 39255, 39260, 39714, 40695, 11059 40690, 35180, 38342, 37686, 24390, 34068, 32404, 40803, 22137, 40725, 11060 22081, 39662, 35079, 31296, 39091, 38308, 39693, 36852, 24409, 31339, 11061 39138, 20642, 34193, 20760, 25458, 21067, 30543, 32397, 26310, 30637, 11062 [12228, 40565], 22217, 40692, 28635, 25054, 30663, 28720, 40629, 34890, 11063 38370, 38854, 31844, 32308, 38822, 40623, 22220, 39089, 27311, 32590, 11064 31984, 20418, 32363, 40569, 22190, 39706, 33903, 31142, 31858, 39634, 11065 38587, 32251, 35069, 30787, {f: 10, c: 8560}, {f: 2, c: 714}, 729, 8211, 11066 8213, 8229, 8245, 8453, 8457, {f: 4, c: 8598}, 8725, 8735, 8739, 8786, 11067 {f: 2, c: 8806}, 8895, {f: 36, c: 9552}, {f: 15, c: 9601}, {f: 3, c: 9619}, 11068 {f: 2, c: 9660}, {f: 4, c: 9698}, 9737, 8853, 12306, {f: 2, c: 12317}, 11069 {f: 9, c: 12321}, 12963, {f: 2, c: 13198}, {f: 3, c: 13212}, 13217, 13252, 11070 13262, {f: 2, c: 13265}, 13269, 65072, 65506, 65508, 8481, 12849, 8208, 11071 12540, {f: 2, c: 12443}, {f: 2, c: 12541}, 12294, {f: 2, c: 12445}, 11072 {f: 10, c: 65097}, {f: 4, c: 65108}, {f: 14, c: 65113}, {f: 4, c: 65128}, 11073 12350, {f: 12, c: 12272}, 19970, {f: 3, c: 19972}, 19983, 19986, 19991, 11074 {f: 3, c: 19999}, 20003, 20006, 20009, {f: 2, c: 20014}, 20017, 20019, 11075 20021, 20023, 20028, {f: 3, c: 20032}, 20036, 20038, 20042, 20049, 20053, 11076 20055, {f: 2, c: 20058}, {f: 4, c: 20066}, {f: 2, c: 20071}, 11077 {f: 6, c: 20074}, 20082, {f: 10, c: 20084}, {f: 3, c: 20095}, 11078 {f: 2, c: 20099}, [12037, 20101], 20103, 20106, 20112, {f: 2, c: 20118}, 11079 20121, {f: 2, c: 20124}, 20131, 20138, {f: 3, c: 20143}, 20148, 11080 {f: 4, c: 20150}, {f: 3, c: 20156}, 20168, 20172, {f: 2, c: 20175}, 20178, 11081 {f: 3, c: 20186}, 20192, 20194, {f: 2, c: 20198}, 20201, {f: 3, c: 20205}, 11082 20209, 20212, {f: 3, c: 20216}, 20220, 20222, 20224, {f: 7, c: 20226}, 11083 {f: 2, c: 20235}, {f: 5, c: 20242}, {f: 2, c: 20252}, 20257, 20259, 11084 {f: 2, c: 20264}, {f: 3, c: 20268}, 20273, 20275, 20277, 20279, 20281, 11085 20283, {f: 5, c: 20286}, {f: 2, c: 20292}, {f: 6, c: 20295}, 20306, 20308, 11086 20310, {f: 2, c: 20321}, 20326, 20328, {f: 2, c: 20330}, {f: 2, c: 20333}, 11087 {f: 2, c: 20337}, 20341, {f: 4, c: 20343}, 20349, {f: 3, c: 20352}, 20357, 11088 20359, 20362, 20364, 20366, 20368, {f: 2, c: 20370}, 20373, 11089 {f: 3, c: 20376}, 20380, {f: 2, c: 20382}, {f: 2, c: 20385}, 20388, 20395, 11090 20397, {f: 5, c: 20400}, {f: 9, c: 20406}, {f: 2, c: 20416}, 11091 {f: 4, c: 20422}, {f: 3, c: 20427}, {f: 5, c: 20434}, 20441, 20443, 20450, 11092 {f: 2, c: 20452}, 20455, {f: 2, c: 20459}, 20464, 20466, {f: 4, c: 20468}, 11093 20473, {f: 3, c: 20475}, 20479, {f: 5, c: 20481}, {f: 2, c: 20487}, 20490, 11094 20494, 20496, 20499, {f: 3, c: 20501}, 20507, {f: 2, c: 20509}, 20512, 11095 {f: 3, c: 20514}, 20519, {f: 11, c: 20527}, 20539, 20541, {f: 4, c: 20543}, 11096 {f: 3, c: 20548}, {f: 2, c: 20554}, 20557, {f: 5, c: 20560}, 11097 {f: 4, c: 20566}, 20571, {f: 8, c: 20573}, {f: 6, c: 20582}, 11098 {f: 7, c: 20589}, {f: 3, c: 20600}, {f: 2, c: 20604}, {f: 4, c: 20609}, 11099 {f: 2, c: 20614}, {f: 4, c: 20617}, {f: 8, c: 20622}, 20631, 11100 {f: 8, c: 20634}, 20644, 20646, {f: 2, c: 20650}, {f: 4, c: 20654}, 20662, 11101 {f: 2, c: 20664}, {f: 2, c: 20668}, {f: 3, c: 20671}, {f: 2, c: 20675}, 11102 {f: 3, c: 20678}, {f: 5, c: 20682}, 20688, {f: 3, c: 20690}, 11103 {f: 3, c: 20695}, {f: 3, c: 20699}, {f: 6, c: 20703}, {f: 3, c: 20713}, 11104 {f: 4, c: 20719}, 20724, {f: 3, c: 20726}, 20730, {f: 4, c: 20732}, 20737, 11105 20739, 20741, 20746, {f: 4, c: 20748}, 20753, 20755, {f: 2, c: 20758}, 11106 {f: 6, c: 20761}, 20768, {f: 8, c: 20770}, {f: 7, c: 20779}, 11107 {f: 4, c: 20787}, {f: 2, c: 20792}, {f: 2, c: 20797}, 20802, 20807, 20810, 11108 20812, {f: 3, c: 20814}, 20819, {f: 3, c: 20823}, 20827, {f: 5, c: 20829}, 11109 {f: 2, c: 20835}, {f: 2, c: 20838}, 20842, 20847, 20850, 20858, 11110 {f: 2, c: 20862}, {f: 2, c: 20867}, {f: 2, c: 20870}, {f: 2, c: 20874}, 11111 {f: 4, c: 20878}, {f: 2, c: 20883}, 20888, 20890, {f: 3, c: 20893}, 20897, 11112 20899, {f: 5, c: 20902}, {f: 2, c: 20909}, 20916, {f: 3, c: 20920}, 11113 {f: 2, c: 20926}, {f: 3, c: 20929}, 20933, 20936, 20938, 20942, 20944, 11114 {f: 9, c: 20946}, 20956, {f: 2, c: 20958}, {f: 2, c: 20962}, 11115 {f: 6, c: 20965}, 20972, 20974, 20978, 20980, 20983, 20990, 11116 {f: 2, c: 20996}, 21001, {f: 2, c: 21003}, {f: 2, c: 21007}, 11117 {f: 3, c: 21011}, 21020, {f: 2, c: 21022}, {f: 3, c: 21025}, 11118 {f: 3, c: 21029}, 21034, 21036, 21039, {f: 2, c: 21041}, {f: 2, c: 21044}, 11119 21052, 21054, {f: 2, c: 21061}, {f: 2, c: 21064}, {f: 2, c: 21070}, 11120 {f: 2, c: 21074}, 21077, {f: 4, c: 21079}, 21085, {f: 2, c: 21087}, 11121 {f: 3, c: 21090}, 21094, 21096, {f: 3, c: 21099}, {f: 2, c: 21104}, 21107, 11122 {f: 7, c: 21110}, 21118, 21120, {f: 3, c: 21124}, 21131, {f: 2, c: 21134}, 11123 21138, {f: 7, c: 21140}, 21148, {f: 4, c: 21156}, {f: 3, c: 21166}, 11124 {f: 10, c: 21172}, 21184, 21186, {f: 3, c: 21188}, 21192, 21194, 11125 {f: 4, c: 21196}, 21201, {f: 2, c: 21203}, 21207, 21210, 21212, 11126 {f: 2, c: 21216}, 21219, {f: 11, c: 21221}, {f: 3, c: 21234}, 11127 {f: 2, c: 21238}, {f: 3, c: 21243}, {f: 4, c: 21249}, 21255, 11128 {f: 4, c: 21257}, 21262, {f: 4, c: 21265}, 21272, {f: 2, c: 21275}, 11129 {f: 2, c: 21278}, 21282, {f: 2, c: 21284}, {f: 3, c: 21287}, 11130 {f: 2, c: 21291}, 21296, {f: 6, c: 21298}, [12054, 21304], 11131 {f: 2, c: 21308}, 21314, 21316, 21318, {f: 3, c: 21323}, 21328, 11132 {f: 2, c: 21336}, 21339, 21341, 21349, 21352, 21354, {f: 2, c: 21356}, 11133 21362, 21366, 21369, {f: 4, c: 21371}, {f: 2, c: 21376}, 21379, 11134 {f: 2, c: 21383}, 21386, {f: 7, c: 21390}, {f: 2, c: 21398}, 11135 {f: 2, c: 21403}, 21406, 21409, 21412, 21415, {f: 3, c: 21418}, 11136 {f: 3, c: 21423}, 21427, 21429, {f: 4, c: 21431}, {f: 3, c: 21436}, 21440, 11137 {f: 4, c: 21444}, {f: 3, c: 21454}, {f: 2, c: 21458}, 21461, 21466, 11138 {f: 3, c: 21468}, 21473, 21479, 21492, 21498, {f: 3, c: 21502}, 21506, 11139 21509, 21511, 21515, 21524, {f: 3, c: 21528}, 21532, 21538, 11140 {f: 2, c: 21540}, 21546, 21552, 21555, {f: 2, c: 21558}, 21562, 21565, 11141 21567, {f: 2, c: 21569}, {f: 2, c: 21572}, 21575, 21577, {f: 4, c: 21580}, 11142 21585, 21594, {f: 5, c: 21597}, 21603, 21605, 21607, {f: 8, c: 21609}, 11143 21620, {f: 2, c: 21625}, {f: 2, c: 21630}, 21633, 21635, 21637, 11144 {f: 4, c: 21639}, 21645, 21649, 21651, {f: 2, c: 21655}, 21660, 11145 {f: 5, c: 21662}, 21669, 21678, 21680, 21682, {f: 3, c: 21685}, 11146 {f: 2, c: 21689}, 21694, 21699, 21701, {f: 2, c: 21706}, 21718, 21720, 11147 21723, 21728, {f: 3, c: 21730}, {f: 2, c: 21739}, {f: 3, c: 21743}, 11148 {f: 6, c: 21748}, 21755, 21758, 21760, {f: 2, c: 21762}, 21765, 21768, 11149 {f: 5, c: 21770}, {f: 2, c: 21778}, {f: 6, c: 21781}, {f: 4, c: 21788}, 11150 21793, {f: 2, c: 21797}, {f: 2, c: 21800}, 21803, 21805, 21810, 11151 {f: 3, c: 21812}, {f: 4, c: 21816}, 21821, 21824, 21826, 21829, 11152 {f: 2, c: 21831}, {f: 4, c: 21835}, {f: 2, c: 21841}, 21844, 11153 {f: 5, c: 21847}, 21853, {f: 2, c: 21855}, {f: 2, c: 21858}, 11154 {f: 2, c: 21864}, 21867, {f: 6, c: 21871}, {f: 2, c: 21881}, 21885, 21887, 11155 {f: 2, c: 21893}, {f: 3, c: 21900}, 21904, {f: 2, c: 21906}, 11156 {f: 3, c: 21909}, {f: 2, c: 21914}, 21918, {f: 7, c: 21920}, 11157 {f: 2, c: 21928}, 21931, 21933, {f: 2, c: 21935}, 21940, 21942, 21944, 11158 21946, 21948, {f: 5, c: 21951}, 21960, {f: 2, c: 21962}, {f: 2, c: 21967}, 11159 21973, {f: 3, c: 21975}, 21979, 21982, 21984, 21986, 21991, 11160 {f: 2, c: 21997}, {f: 2, c: 22000}, 22004, {f: 5, c: 22008}, 22015, 11161 {f: 4, c: 22018}, 22023, {f: 2, c: 22026}, {f: 4, c: 22032}, 22037, 11162 {f: 2, c: 22041}, 22045, {f: 3, c: 22048}, {f: 2, c: 22053}, 22056, 11163 {f: 2, c: 22058}, 22067, 22071, 22074, {f: 3, c: 22076}, 22080, 11164 {f: 10, c: 22082}, {f: 5, c: 22095}, {f: 2, c: 22101}, {f: 2, c: 22106}, 11165 {f: 2, c: 22110}, 22113, 22115, 22119, {f: 2, c: 22125}, 22128, 22131, 11166 22133, 22135, 22138, {f: 3, c: 22141}, {f: 4, c: 22145}, {f: 4, c: 22152}, 11167 22157, {f: 3, c: 22160}, 22164, {f: 3, c: 22166}, {f: 9, c: 22170}, 11168 {f: 2, c: 22180}, 22183, {f: 5, c: 22185}, {f: 3, c: 22192}, 22197, 11169 {f: 4, c: 22200}, {f: 3, c: 22205}, {f: 2, c: 22211}, {f: 2, c: 22214}, 11170 22219, {f: 4, c: 22221}, {f: 2, c: 22226}, {f: 2, c: 22229}, 11171 {f: 2, c: 22232}, 22236, 22243, {f: 6, c: 22245}, 22252, {f: 2, c: 22254}, 11172 {f: 2, c: 22258}, {f: 3, c: 22262}, {f: 2, c: 22267}, {f: 3, c: 22272}, 11173 22277, 22284, {f: 4, c: 22286}, {f: 2, c: 22292}, 22295, {f: 3, c: 22297}, 11174 {f: 2, c: 22301}, {f: 3, c: 22304}, {f: 4, c: 22308}, 22315, 11175 {f: 2, c: 22321}, {f: 5, c: 22324}, {f: 2, c: 22332}, 22335, 22337, 11176 {f: 4, c: 22339}, {f: 2, c: 22344}, 22347, {f: 5, c: 22354}, 11177 {f: 2, c: 22360}, {f: 2, c: 22370}, 22373, 22375, 22380, 22382, 11178 {f: 3, c: 22384}, {f: 2, c: 22388}, {f: 3, c: 22392}, {f: 5, c: 22397}, 11179 {f: 4, c: 22407}, {f: 5, c: 22413}, {f: 7, c: 22420}, {f: 4, c: 22428}, 11180 22437, 22440, 22442, 22444, {f: 3, c: 22447}, 22451, {f: 3, c: 22453}, 11181 {f: 9, c: 22457}, {f: 7, c: 22468}, {f: 2, c: 22476}, {f: 2, c: 22480}, 11182 22483, {f: 2, c: 22486}, {f: 2, c: 22491}, 22494, {f: 2, c: 22498}, 11183 {f: 8, c: 22501}, 22510, {f: 4, c: 22512}, {f: 2, c: 22517}, 11184 {f: 2, c: 22523}, {f: 2, c: 22526}, 22529, {f: 2, c: 22531}, 11185 {f: 2, c: 22536}, 22540, {f: 3, c: 22542}, {f: 3, c: 22546}, 11186 {f: 2, c: 22551}, {f: 3, c: 22554}, 22559, {f: 2, c: 22562}, 11187 {f: 5, c: 22565}, {f: 4, c: 22571}, {f: 2, c: 22578}, {f: 14, c: 22582}, 11188 {f: 5, c: 22597}, 22606, 22608, 22611, {f: 2, c: 22613}, {f: 5, c: 22617}, 11189 {f: 3, c: 22623}, 22627, {f: 5, c: 22630}, {f: 8, c: 22637}, 11190 {f: 3, c: 22646}, {f: 4, c: 22650}, 22655, 22658, 22660, {f: 3, c: 22662}, 11191 {f: 7, c: 22667}, {f: 5, c: 22676}, 22683, 22685, {f: 8, c: 22688}, 11192 {f: 4, c: 22698}, {f: 4, c: 22703}, {f: 7, c: 22708}, 22717, 11193 {f: 2, c: 22719}, {f: 3, c: 22722}, 22726, {f: 9, c: 22728}, 22738, 22740, 11194 {f: 2, c: 22742}, {f: 3, c: 22747}, 22753, 22755, {f: 4, c: 22757}, 22762, 11195 22765, {f: 2, c: 22769}, {f: 2, c: 22772}, {f: 2, c: 22775}, 11196 {f: 2, c: 22779}, {f: 4, c: 22782}, 22787, {f: 2, c: 22789}, 11197 {f: 2, c: 22792}, [12066, 22794], {f: 2, c: 22795}, 22798, 11198 {f: 4, c: 22800}, {f: 2, c: 22807}, 22811, {f: 2, c: 22813}, 11199 {f: 2, c: 22816}, 22819, 22822, 22824, 22828, 22832, {f: 2, c: 22834}, 11200 {f: 2, c: 22837}, 22843, 22845, {f: 2, c: 22847}, 22851, {f: 2, c: 22853}, 11201 22858, {f: 2, c: 22860}, 22864, {f: 2, c: 22866}, 22873, {f: 5, c: 22875}, 11202 22881, {f: 2, c: 22883}, {f: 3, c: 22886}, 22891, 22893, {f: 4, c: 22895}, 11203 22901, 22903, {f: 3, c: 22906}, {f: 3, c: 22910}, 22917, 22921, 11204 {f: 2, c: 22923}, {f: 4, c: 22926}, {f: 2, c: 22932}, 22936, 11205 {f: 3, c: 22938}, {f: 4, c: 22943}, {f: 2, c: 22950}, {f: 2, c: 22956}, 11206 {f: 2, c: 22960}, {f: 6, c: 22963}, 22970, {f: 2, c: 22972}, 11207 {f: 7, c: 22975}, {f: 3, c: 22983}, {f: 4, c: 22988}, {f: 2, c: 22997}, 11208 23001, 23003, {f: 5, c: 23006}, 23012, {f: 2, c: 23014}, {f: 3, c: 23017}, 11209 {f: 12, c: 23021}, 23034, {f: 3, c: 23036}, 23040, 23042, {f: 2, c: 23050}, 11210 {f: 4, c: 23053}, 23058, {f: 4, c: 23060}, {f: 3, c: 23065}, 11211 {f: 2, c: 23069}, {f: 2, c: 23073}, 23076, {f: 3, c: 23078}, 11212 {f: 7, c: 23082}, 23091, 23093, {f: 5, c: 23095}, {f: 3, c: 23101}, 11213 {f: 4, c: 23106}, {f: 2, c: 23111}, {f: 10, c: 23115}, {f: 4, c: 23126}, 11214 {f: 7, c: 23131}, {f: 3, c: 23139}, {f: 2, c: 23144}, {f: 2, c: 23147}, 11215 {f: 6, c: 23150}, {f: 2, c: 23160}, {f: 4, c: 23163}, {f: 18, c: 23168}, 11216 {f: 7, c: 23187}, {f: 11, c: 23196}, {f: 2, c: 23208}, {f: 7, c: 23211}, 11217 23220, {f: 2, c: 23222}, {f: 4, c: 23225}, {f: 2, c: 23231}, 11218 {f: 6, c: 23235}, {f: 2, c: 23242}, {f: 5, c: 23245}, 23251, 23253, 11219 {f: 3, c: 23257}, {f: 3, c: 23261}, 23266, {f: 2, c: 23268}, 11220 {f: 2, c: 23271}, 23274, {f: 5, c: 23276}, {f: 3, c: 23282}, 11221 {f: 5, c: 23286}, {f: 4, c: 23292}, {f: 7, c: 23297}, 23306, 11222 {f: 9, c: 23309}, 23320, {f: 7, c: 23322}, {f: 8, c: 23330}, 11223 {f: 5, c: 23339}, 23345, 23347, {f: 2, c: 23349}, {f: 7, c: 23353}, 11224 {f: 11, c: 23361}, {f: 3, c: 23373}, 23378, 23382, 23390, {f: 2, c: 23392}, 11225 {f: 2, c: 23399}, {f: 3, c: 23405}, 23410, 23412, {f: 2, c: 23414}, 23417, 11226 {f: 2, c: 23419}, 23422, 23426, 23430, 23434, {f: 2, c: 23437}, 11227 {f: 3, c: 23440}, 23444, 23446, 23455, {f: 3, c: 23463}, {f: 4, c: 23468}, 11228 {f: 2, c: 23473}, 23479, {f: 3, c: 23482}, {f: 2, c: 23488}, 23491, 11229 {f: 4, c: 23496}, {f: 3, c: 23501}, 23505, {f: 9, c: 23508}, 23520, 23523, 11230 23530, 23533, 23535, {f: 4, c: 23537}, 23543, {f: 2, c: 23549}, 23552, 11231 {f: 2, c: 23554}, 23557, 23564, 23568, {f: 2, c: 23570}, 23575, 23577, 11232 23579, {f: 4, c: 23582}, 23587, 23590, {f: 4, c: 23592}, {f: 4, c: 23597}, 11233 {f: 2, c: 23602}, {f: 2, c: 23605}, {f: 2, c: 23619}, {f: 2, c: 23622}, 11234 {f: 2, c: 23628}, {f: 3, c: 23634}, {f: 3, c: 23638}, {f: 4, c: 23642}, 11235 23647, 23655, {f: 3, c: 23657}, 23661, 23664, {f: 7, c: 23666}, 11236 {f: 4, c: 23675}, 23680, {f: 5, c: 23683}, {f: 3, c: 23689}, 11237 {f: 2, c: 23694}, {f: 2, c: 23698}, 23701, {f: 4, c: 23709}, 11238 {f: 5, c: 23716}, 23722, {f: 3, c: 23726}, 23730, 23732, 23734, 11239 {f: 4, c: 23737}, 23742, 23744, {f: 2, c: 23746}, {f: 6, c: 23749}, 11240 {f: 6, c: 23756}, {f: 6, c: 23763}, {f: 7, c: 23770}, {f: 2, c: 23778}, 11241 23783, 23785, {f: 2, c: 23787}, {f: 2, c: 23790}, {f: 3, c: 23793}, 23797, 11242 {f: 4, c: 23799}, 23804, {f: 4, c: 23806}, {f: 2, c: 23812}, 11243 {f: 5, c: 23816}, {f: 5, c: 23823}, 23829, {f: 3, c: 23832}, 11244 {f: 2, c: 23836}, {f: 5, c: 23839}, 23845, 23848, {f: 2, c: 23850}, 11245 {f: 5, c: 23855}, {f: 8, c: 23861}, {f: 8, c: 23871}, {f: 2, c: 23880}, 11246 {f: 3, c: 23885}, {f: 7, c: 23889}, {f: 2, c: 23897}, 23900, 11247 {f: 11, c: 23902}, 23914, {f: 2, c: 23917}, {f: 4, c: 23920}, 11248 {f: 12, c: 23925}, 23939, {f: 2, c: 23941}, {f: 15, c: 23944}, 23960, 11249 {f: 3, c: 23962}, {f: 2, c: 23966}, {f: 6, c: 23969}, {f: 15, c: 23976}, 11250 23993, 23995, {f: 8, c: 23997}, {f: 5, c: 24006}, 24012, {f: 4, c: 24014}, 11251 24019, {f: 6, c: 24021}, 24028, {f: 2, c: 24031}, {f: 2, c: 24035}, 24042, 11252 {f: 2, c: 24044}, {f: 2, c: 24053}, {f: 5, c: 24056}, {f: 2, c: 24063}, 11253 24068, 24071, {f: 3, c: 24073}, {f: 2, c: 24077}, {f: 2, c: 24082}, 24087, 11254 {f: 7, c: 24094}, {f: 3, c: 24104}, 24108, {f: 2, c: 24111}, 24114, 11255 {f: 2, c: 24116}, {f: 2, c: 24121}, {f: 2, c: 24126}, 24129, 11256 {f: 6, c: 24134}, {f: 7, c: 24141}, 24150, {f: 2, c: 24153}, 11257 {f: 2, c: 24156}, 24160, {f: 7, c: 24164}, {f: 5, c: 24173}, 24181, 24183, 11258 {f: 3, c: 24193}, 24197, {f: 2, c: 24200}, {f: 3, c: 24204}, 24210, 24216, 11259 24219, 24221, {f: 4, c: 24225}, {f: 3, c: 24232}, 24236, {f: 5, c: 24238}, 11260 24244, {f: 4, c: 24250}, {f: 10, c: 24255}, {f: 6, c: 24267}, 11261 {f: 2, c: 24276}, {f: 4, c: 24279}, {f: 3, c: 24284}, {f: 4, c: 24292}, 11262 24297, 24299, {f: 6, c: 24301}, 24309, {f: 2, c: 24312}, {f: 3, c: 24315}, 11263 {f: 3, c: 24325}, 24329, {f: 3, c: 24332}, 24336, 24338, 24340, 24342, 11264 {f: 2, c: 24345}, {f: 3, c: 24348}, {f: 4, c: 24353}, 24360, 11265 {f: 2, c: 24363}, 24366, 24368, 24370, 24372, {f: 3, c: 24374}, 24379, 11266 {f: 3, c: 24381}, {f: 5, c: 24385}, 24391, {f: 3, c: 24393}, 24397, 24399, 11267 24401, 24404, {f: 3, c: 24410}, {f: 3, c: 24414}, 24419, 24421, 11268 {f: 2, c: 24423}, 24427, {f: 2, c: 24430}, 24434, {f: 3, c: 24436}, 24440, 11269 24442, {f: 3, c: 24445}, 24451, 24454, {f: 3, c: 24461}, {f: 2, c: 24467}, 11270 24470, {f: 2, c: 24474}, 24477, 24479, {f: 6, c: 24482}, {f: 2, c: 24491}, 11271 {f: 6, c: 24495}, 24502, 24504, {f: 2, c: 24506}, {f: 5, c: 24510}, 11272 {f: 2, c: 24519}, {f: 2, c: 24522}, 24526, {f: 3, c: 24531}, 11273 {f: 3, c: 24538}, {f: 2, c: 24542}, {f: 2, c: 24546}, {f: 2, c: 24549}, 11274 {f: 2, c: 24552}, 24556, {f: 2, c: 24559}, {f: 3, c: 24562}, 11275 {f: 2, c: 24566}, {f: 2, c: 24569}, 24572, {f: 3, c: 24583}, 11276 {f: 2, c: 24587}, {f: 2, c: 24592}, 24595, {f: 2, c: 24599}, 24602, 11277 {f: 2, c: 24606}, {f: 3, c: 24610}, {f: 3, c: 24620}, {f: 5, c: 24624}, 11278 {f: 5, c: 24630}, {f: 2, c: 24637}, 24640, {f: 7, c: 24644}, 24652, 11279 {f: 2, c: 24654}, 24657, {f: 2, c: 24659}, {f: 3, c: 24662}, 11280 {f: 2, c: 24667}, {f: 4, c: 24670}, {f: 2, c: 24677}, 24686, 11281 {f: 2, c: 24689}, {f: 2, c: 24692}, 24695, 24702, {f: 3, c: 24704}, 11282 {f: 4, c: 24709}, {f: 2, c: 24714}, {f: 4, c: 24718}, 24723, 24725, 11283 {f: 3, c: 24727}, 24732, 24734, {f: 2, c: 24737}, {f: 2, c: 24740}, 24743, 11284 {f: 2, c: 24745}, 24750, 24752, 24755, 24759, {f: 2, c: 24761}, 11285 {f: 8, c: 24765}, {f: 3, c: 24775}, {f: 5, c: 24780}, {f: 3, c: 24786}, 11286 {f: 2, c: 24790}, 24793, 24795, 24798, {f: 4, c: 24802}, 24810, 24821, 11287 {f: 2, c: 24823}, {f: 4, c: 24828}, {f: 4, c: 24834}, 24839, 11288 {f: 3, c: 24842}, {f: 5, c: 24848}, {f: 4, c: 24854}, {f: 2, c: 24861}, 11289 {f: 2, c: 24865}, 24869, {f: 3, c: 24872}, {f: 8, c: 24876}, 11290 {f: 2, c: 24885}, {f: 6, c: 24888}, {f: 8, c: 24896}, 24905, 24909, 11291 {f: 2, c: 24911}, {f: 3, c: 24914}, {f: 2, c: 24918}, 24921, 11292 {f: 2, c: 24923}, 24926, {f: 2, c: 24928}, {f: 2, c: 24933}, 24937, 11293 {f: 2, c: 24940}, 24943, {f: 2, c: 24945}, 24948, {f: 10, c: 24952}, 11294 {f: 7, c: 24963}, {f: 2, c: 24972}, 24975, 24979, {f: 5, c: 24981}, 11295 {f: 2, c: 24987}, {f: 6, c: 24990}, {f: 2, c: 24997}, 25002, 25005, 11296 {f: 3, c: 25007}, {f: 3, c: 25011}, {f: 6, c: 25016}, {f: 3, c: 25023}, 11297 {f: 4, c: 25027}, {f: 4, c: 25037}, 25043, {f: 9, c: 25045}, 11298 {f: 3, c: 25056}, {f: 2, c: 25060}, 25063, {f: 9, c: 25065}, 11299 {f: 2, c: 25075}, 25081, 25083, 25085, {f: 5, c: 25089}, 25097, 25107, 11300 25113, {f: 3, c: 25116}, 25120, 25123, 25126, {f: 2, c: 25128}, 25131, 11301 25133, 25135, 25137, 25141, [12094, 25142], {f: 5, c: 25144}, 25154, 11302 {f: 3, c: 25156}, 25162, {f: 2, c: 25167}, {f: 3, c: 25173}, 11303 {f: 2, c: 25177}, {f: 7, c: 25180}, {f: 2, c: 25188}, 25192, 11304 {f: 2, c: 25201}, {f: 2, c: 25204}, {f: 2, c: 25207}, {f: 2, c: 25210}, 11305 25213, {f: 3, c: 25217}, {f: 4, c: 25221}, {f: 6, c: 25227}, 25236, 25241, 11306 {f: 3, c: 25244}, 25251, {f: 2, c: 25254}, {f: 2, c: 25257}, 11307 {f: 4, c: 25261}, {f: 3, c: 25266}, {f: 3, c: 25270}, 25274, 25278, 11308 {f: 2, c: 25280}, 25283, 25291, 25295, 25297, 25301, {f: 2, c: 25309}, 11309 {f: 2, c: 25312}, 25316, {f: 2, c: 25322}, 25328, 25330, 25333, 11310 {f: 4, c: 25336}, 25344, {f: 4, c: 25347}, {f: 4, c: 25354}, 11311 {f: 2, c: 25359}, {f: 4, c: 25362}, {f: 3, c: 25367}, 25372, 11312 {f: 2, c: 25382}, 25385, {f: 3, c: 25388}, {f: 2, c: 25392}, 11313 {f: 6, c: 25395}, {f: 2, c: 25403}, {f: 3, c: 25407}, 25412, 11314 {f: 2, c: 25415}, 25418, {f: 4, c: 25425}, {f: 8, c: 25430}, 25440, 11315 {f: 3, c: 25444}, 25450, 25452, {f: 2, c: 25455}, {f: 3, c: 25459}, 11316 {f: 2, c: 25464}, {f: 4, c: 25468}, 25473, {f: 2, c: 25477}, 25483, 25485, 11317 25489, {f: 3, c: 25491}, 25495, {f: 7, c: 25497}, 25505, 25508, 25510, 11318 25515, 25519, {f: 2, c: 25521}, {f: 2, c: 25525}, 25529, 25531, 25533, 11319 25535, {f: 3, c: 25537}, 25541, {f: 2, c: 25543}, {f: 3, c: 25546}, 25553, 11320 {f: 3, c: 25555}, {f: 3, c: 25559}, {f: 3, c: 25563}, 25567, 25570, 11321 {f: 5, c: 25572}, {f: 2, c: 25579}, {f: 3, c: 25583}, 25587, 25589, 25591, 11322 {f: 4, c: 25593}, 25598, {f: 2, c: 25603}, {f: 5, c: 25606}, 25614, 11323 {f: 2, c: 25617}, {f: 2, c: 25621}, {f: 3, c: 25624}, 25629, 25631, 11324 {f: 4, c: 25634}, {f: 3, c: 25639}, 25643, {f: 6, c: 25646}, 25653, 11325 {f: 3, c: 25655}, {f: 2, c: 25659}, 25662, 25664, {f: 2, c: 25666}, 25673, 11326 {f: 6, c: 25675}, 25683, {f: 3, c: 25685}, {f: 3, c: 25689}, 25693, 11327 {f: 7, c: 25696}, 25704, {f: 3, c: 25706}, 25710, {f: 3, c: 25712}, 11328 {f: 2, c: 25716}, 25719, {f: 6, c: 25724}, 25731, 25734, {f: 8, c: 25737}, 11329 25748, {f: 2, c: 25751}, {f: 4, c: 25754}, {f: 3, c: 25760}, 11330 {f: 3, c: 25766}, 25770, 25775, 25777, 25780, 25782, 25785, 25789, 25795, 11331 25798, {f: 2, c: 25800}, 25804, 25807, 25809, 25811, {f: 2, c: 25813}, 11332 25817, {f: 3, c: 25819}, 25823, 25825, 25827, 25829, {f: 5, c: 25831}, 11333 {f: 2, c: 25837}, 25843, {f: 2, c: 25845}, {f: 2, c: 25848}, 25853, 25855, 11334 {f: 3, c: 25857}, 25861, {f: 2, c: 25863}, {f: 5, c: 25866}, 11335 {f: 2, c: 25872}, 25875, 25877, 25879, 25882, 25884, {f: 4, c: 25886}, 11336 {f: 4, c: 25894}, 25901, {f: 4, c: 25904}, 25911, 25914, {f: 2, c: 25916}, 11337 {f: 5, c: 25920}, {f: 2, c: 25926}, {f: 2, c: 25930}, {f: 2, c: 25933}, 11338 25936, {f: 3, c: 25938}, 25944, 25946, 25948, {f: 3, c: 25951}, 11339 {f: 2, c: 25956}, {f: 4, c: 25959}, {f: 3, c: 25965}, 25969, 25971, 25974, 11340 {f: 9, c: 25977}, {f: 3, c: 25988}, {f: 3, c: 25992}, {f: 3, c: 25997}, 11341 26002, 26004, 26006, 26008, 26010, {f: 2, c: 26013}, 26016, 11342 {f: 2, c: 26018}, 26022, 26024, 26026, 26030, {f: 6, c: 26033}, 26040, 11343 {f: 2, c: 26042}, {f: 3, c: 26046}, 26050, {f: 4, c: 26055}, 26061, 11344 {f: 2, c: 26064}, {f: 3, c: 26067}, {f: 8, c: 26072}, 26081, 11345 {f: 2, c: 26083}, {f: 2, c: 26090}, {f: 4, c: 26098}, {f: 2, c: 26104}, 11346 {f: 5, c: 26107}, 26113, {f: 2, c: 26116}, {f: 3, c: 26119}, 26123, 26125, 11347 {f: 3, c: 26128}, {f: 3, c: 26134}, {f: 3, c: 26138}, 26142, 11348 {f: 4, c: 26145}, 26150, {f: 4, c: 26153}, 26158, 26160, {f: 2, c: 26162}, 11349 {f: 5, c: 26167}, 26173, {f: 2, c: 26175}, {f: 7, c: 26180}, 11350 {f: 2, c: 26189}, {f: 2, c: 26192}, {f: 2, c: 26200}, {f: 2, c: 26203}, 11351 26206, 26208, {f: 2, c: 26210}, 26213, 26215, {f: 5, c: 26217}, 11352 {f: 3, c: 26225}, 26229, {f: 2, c: 26232}, {f: 3, c: 26235}, 11353 {f: 3, c: 26239}, 26243, {f: 2, c: 26245}, {f: 2, c: 26250}, 11354 {f: 4, c: 26253}, {f: 4, c: 26258}, {f: 5, c: 26264}, {f: 4, c: 26270}, 11355 {f: 4, c: 26275}, {f: 2, c: 26281}, {f: 2, c: 26284}, {f: 5, c: 26287}, 11356 {f: 4, c: 26293}, {f: 4, c: 26298}, {f: 5, c: 26303}, 26309, 26312, 11357 {f: 12, c: 26314}, {f: 2, c: 26327}, 26330, {f: 2, c: 26334}, 11358 {f: 5, c: 26337}, {f: 2, c: 26343}, {f: 2, c: 26346}, {f: 3, c: 26349}, 11359 26353, {f: 2, c: 26357}, {f: 2, c: 26362}, 26365, {f: 2, c: 26369}, 11360 {f: 4, c: 26372}, 26380, {f: 2, c: 26382}, {f: 3, c: 26385}, 26390, 11361 {f: 3, c: 26392}, 26396, 26398, {f: 6, c: 26400}, 26409, 26414, 26416, 11362 {f: 2, c: 26418}, {f: 4, c: 26422}, {f: 2, c: 26427}, {f: 2, c: 26430}, 11363 26433, {f: 2, c: 26436}, 26439, {f: 2, c: 26442}, 26445, 26450, 11364 {f: 2, c: 26452}, {f: 5, c: 26455}, 26461, {f: 3, c: 26466}, 11365 {f: 2, c: 26470}, {f: 2, c: 26475}, 26478, 26484, 26486, {f: 4, c: 26488}, 11366 26493, 26496, {f: 2, c: 26498}, {f: 2, c: 26501}, 26504, 26506, 11367 {f: 4, c: 26508}, {f: 4, c: 26513}, 26518, 26521, 26523, {f: 3, c: 26527}, 11368 26532, 26534, 26537, 26540, 26542, {f: 2, c: 26545}, 26548, 11369 {f: 8, c: 26553}, 26562, {f: 10, c: 26565}, {f: 3, c: 26581}, 26587, 26591, 11370 26593, {f: 2, c: 26595}, {f: 3, c: 26598}, {f: 2, c: 26602}, 11371 {f: 2, c: 26605}, 26610, {f: 8, c: 26613}, 26622, {f: 4, c: 26625}, 26630, 11372 26637, 26640, 26642, {f: 2, c: 26644}, {f: 5, c: 26648}, {f: 3, c: 26654}, 11373 {f: 7, c: 26658}, {f: 7, c: 26667}, {f: 3, c: 26676}, {f: 2, c: 26682}, 11374 26687, 26695, 26699, 26701, 26703, 26706, {f: 10, c: 26710}, 26730, 11375 {f: 8, c: 26732}, 26741, {f: 9, c: 26744}, 26754, 26756, {f: 8, c: 26759}, 11376 {f: 3, c: 26768}, {f: 3, c: 26772}, {f: 4, c: 26777}, 26782, 11377 {f: 2, c: 26784}, {f: 3, c: 26787}, {f: 4, c: 26793}, 26798, 11378 {f: 2, c: 26801}, 26804, {f: 10, c: 26806}, 26817, {f: 6, c: 26819}, 26826, 11379 26828, {f: 4, c: 26830}, {f: 2, c: 26835}, 26841, {f: 4, c: 26843}, 11380 {f: 2, c: 26849}, {f: 3, c: 26852}, {f: 6, c: 26856}, 26863, 11381 {f: 3, c: 26866}, {f: 3, c: 26870}, 26875, {f: 4, c: 26877}, 11382 {f: 3, c: 26882}, {f: 5, c: 26886}, 26892, 26897, {f: 12, c: 26899}, 11383 {f: 3, c: 26913}, {f: 8, c: 26917}, {f: 2, c: 26926}, {f: 3, c: 26929}, 11384 {f: 4, c: 26933}, {f: 3, c: 26938}, 26942, {f: 2, c: 26944}, 11385 {f: 7, c: 26947}, {f: 8, c: 26955}, {f: 2, c: 26965}, {f: 2, c: 26968}, 11386 {f: 2, c: 26971}, 26975, {f: 2, c: 26977}, {f: 2, c: 26980}, 26983, 11387 {f: 2, c: 26985}, 26988, {f: 2, c: 26991}, {f: 3, c: 26994}, 26998, 11388 {f: 2, c: 27002}, {f: 3, c: 27005}, 27009, 27011, 27013, {f: 3, c: 27018}, 11389 {f: 6, c: 27022}, {f: 2, c: 27030}, {f: 2, c: 27033}, {f: 10, c: 27037}, 11390 27049, 27052, {f: 2, c: 27055}, {f: 2, c: 27058}, {f: 2, c: 27061}, 11391 {f: 3, c: 27064}, {f: 3, c: 27068}, 27072, {f: 8, c: 27074}, 27087, 11392 {f: 3, c: 27089}, {f: 6, c: 27093}, {f: 3, c: 27100}, {f: 6, c: 27105}, 11393 {f: 5, c: 27112}, {f: 4, c: 27118}, {f: 9, c: 27124}, 27134, 27136, 11394 {f: 2, c: 27139}, {f: 4, c: 27142}, {f: 8, c: 27147}, {f: 3, c: 27156}, 11395 {f: 4, c: 27162}, 27168, 27170, {f: 4, c: 27172}, 27177, {f: 4, c: 27179}, 11396 27184, {f: 3, c: 27186}, {f: 2, c: 27190}, {f: 2, c: 27195}, 11397 {f: 5, c: 27199}, {f: 2, c: 27205}, {f: 2, c: 27209}, {f: 4, c: 27212}, 11398 {f: 7, c: 27217}, 27226, {f: 3, c: 27228}, 27232, {f: 2, c: 27235}, 11399 {f: 11, c: 27238}, {f: 7, c: 27250}, {f: 2, c: 27258}, {f: 3, c: 27261}, 11400 {f: 3, c: 27265}, {f: 4, c: 27269}, {f: 4, c: 27274}, 27279, 11401 {f: 2, c: 27282}, {f: 2, c: 27285}, {f: 4, c: 27288}, {f: 3, c: 27293}, 11402 27297, {f: 5, c: 27300}, 27306, {f: 2, c: 27309}, {f: 3, c: 27312}, 11403 {f: 4, c: 27316}, {f: 2, c: 27321}, {f: 7, c: 27324}, {f: 15, c: 27332}, 11404 {f: 6, c: 27348}, 27356, {f: 7, c: 27360}, 27369, 27371, {f: 6, c: 27373}, 11405 {f: 4, c: 27380}, {f: 2, c: 27385}, {f: 8, c: 27388}, {f: 5, c: 27397}, 11406 {f: 4, c: 27403}, {f: 2, c: 27408}, {f: 3, c: 27411}, {f: 7, c: 27415}, 11407 27423, {f: 2, c: 27429}, {f: 10, c: 27432}, {f: 4, c: 27443}, 27448, 11408 {f: 2, c: 27451}, {f: 4, c: 27455}, {f: 2, c: 27460}, 27464, 11409 {f: 2, c: 27466}, {f: 3, c: 27469}, {f: 8, c: 27473}, {f: 5, c: 27482}, 11410 27488, {f: 2, c: 27496}, {f: 7, c: 27499}, {f: 4, c: 27507}, 27514, 11411 {f: 4, c: 27517}, 27525, 27528, 27532, {f: 4, c: 27534}, {f: 2, c: 27540}, 11412 27543, 27545, {f: 2, c: 27548}, {f: 2, c: 27551}, {f: 2, c: 27554}, 11413 {f: 5, c: 27557}, {f: 2, c: 27564}, {f: 2, c: 27568}, 27574, 11414 {f: 2, c: 27576}, {f: 3, c: 27580}, 27584, {f: 2, c: 27587}, 11415 {f: 4, c: 27591}, 27596, 27598, {f: 2, c: 27600}, 27608, 27610, 11416 {f: 5, c: 27612}, {f: 8, c: 27618}, {f: 3, c: 27628}, {f: 3, c: 27632}, 11417 27636, {f: 3, c: 27638}, {f: 3, c: 27642}, 27646, {f: 5, c: 27648}, 11418 {f: 3, c: 27657}, 27662, 27666, 27671, {f: 3, c: 27676}, 27680, 27685, 11419 27693, 27697, 27699, {f: 2, c: 27702}, {f: 4, c: 27705}, {f: 2, c: 27710}, 11420 {f: 3, c: 27715}, 27720, {f: 5, c: 27723}, {f: 3, c: 27729}, 27734, 11421 {f: 3, c: 27736}, {f: 2, c: 27746}, {f: 3, c: 27749}, {f: 5, c: 27755}, 11422 27761, 27763, 27765, {f: 2, c: 27767}, {f: 3, c: 27770}, {f: 2, c: 27775}, 11423 27780, 27783, {f: 2, c: 27786}, {f: 2, c: 27789}, {f: 2, c: 27793}, 11424 {f: 4, c: 27797}, 27802, {f: 3, c: 27804}, 27808, 27810, 27816, 27820, 11425 {f: 2, c: 27823}, {f: 4, c: 27828}, 27834, {f: 4, c: 27840}, 11426 {f: 3, c: 27846}, 27851, {f: 3, c: 27853}, {f: 2, c: 27857}, 11427 {f: 3, c: 27864}, {f: 2, c: 27868}, 27871, 27876, {f: 2, c: 27878}, 27881, 11428 {f: 2, c: 27884}, 27890, 27892, 27897, {f: 2, c: 27903}, {f: 2, c: 27906}, 11429 {f: 2, c: 27909}, {f: 3, c: 27912}, 27917, {f: 3, c: 27919}, 11430 {f: 4, c: 27923}, 27928, {f: 2, c: 27932}, {f: 6, c: 27935}, 27942, 11431 {f: 2, c: 27944}, {f: 2, c: 27948}, {f: 2, c: 27951}, 27956, 11432 {f: 3, c: 27958}, 27962, {f: 2, c: 27967}, 27970, 27972, 27977, 27980, 11433 27984, {f: 4, c: 27989}, 27995, 27997, 27999, {f: 2, c: 28001}, 11434 {f: 2, c: 28004}, {f: 2, c: 28007}, {f: 3, c: 28011}, {f: 4, c: 28016}, 11435 {f: 2, c: 28021}, {f: 2, c: 28026}, {f: 5, c: 28029}, {f: 2, c: 28035}, 11436 28038, {f: 2, c: 28042}, 28045, {f: 2, c: 28047}, 28050, {f: 5, c: 28054}, 11437 28060, 28066, 28069, {f: 2, c: 28076}, {f: 2, c: 28080}, {f: 2, c: 28083}, 11438 {f: 2, c: 28086}, {f: 6, c: 28089}, {f: 3, c: 28097}, {f: 3, c: 28104}, 11439 {f: 4, c: 28109}, {f: 4, c: 28114}, 28119, {f: 3, c: 28122}, 28127, 11440 {f: 2, c: 28130}, 28133, {f: 3, c: 28135}, 28141, {f: 2, c: 28143}, 28146, 11441 28148, 28152, {f: 8, c: 28157}, {f: 4, c: 28166}, 28171, 28175, 11442 {f: 2, c: 28178}, 28181, {f: 2, c: 28184}, {f: 2, c: 28187}, 11443 {f: 2, c: 28190}, 28194, {f: 2, c: 28199}, 28202, 28206, {f: 2, c: 28208}, 11444 28211, {f: 3, c: 28213}, 28217, {f: 3, c: 28219}, {f: 4, c: 28223}, 11445 {f: 8, c: 28229}, {f: 4, c: 28239}, 28245, 28247, {f: 2, c: 28249}, 11446 {f: 2, c: 28252}, {f: 11, c: 28256}, {f: 2, c: 28268}, {f: 14, c: 28272}, 11447 {f: 3, c: 28288}, 28292, {f: 2, c: 28295}, {f: 5, c: 28298}, 11448 {f: 5, c: 28305}, 28311, {f: 3, c: 28313}, 28318, {f: 2, c: 28320}, 11449 {f: 2, c: 28323}, 28326, {f: 2, c: 28328}, {f: 4, c: 28331}, 28336, 28339, 11450 28341, {f: 2, c: 28344}, 28348, {f: 3, c: 28350}, 28355, 28358, 11451 {f: 3, c: 28360}, 28365, 28368, 28370, 28374, {f: 2, c: 28376}, 11452 {f: 3, c: 28379}, 28387, 28391, {f: 2, c: 28394}, {f: 2, c: 28397}, 11453 {f: 2, c: 28400}, 28403, {f: 2, c: 28405}, {f: 5, c: 28410}, 28416, 11454 {f: 3, c: 28419}, {f: 2, c: 28423}, {f: 5, c: 28426}, {f: 3, c: 28432}, 11455 {f: 4, c: 28438}, {f: 5, c: 28443}, 28449, {f: 4, c: 28453}, 28462, 28464, 11456 {f: 2, c: 28468}, 28471, {f: 5, c: 28473}, 28480, {f: 4, c: 28482}, 11457 {f: 3, c: 28488}, 28492, {f: 3, c: 28494}, {f: 2, c: 28498}, 11458 {f: 3, c: 28501}, {f: 2, c: 28506}, 28509, {f: 3, c: 28511}, 28515, 28517, 11459 {f: 6, c: 28519}, 28529, 28531, {f: 2, c: 28533}, 28537, 28539, 11460 {f: 2, c: 28541}, {f: 3, c: 28545}, 28549, {f: 2, c: 28554}, 11461 {f: 8, c: 28559}, {f: 4, c: 28568}, {f: 3, c: 28573}, {f: 2, c: 28578}, 11462 {f: 2, c: 28581}, 28584, {f: 4, c: 28586}, {f: 2, c: 28591}, 28594, 11463 {f: 2, c: 28596}, {f: 2, c: 28599}, {f: 6, c: 28602}, {f: 5, c: 28612}, 11464 {f: 7, c: 28618}, {f: 2, c: 28627}, {f: 2, c: 28630}, {f: 2, c: 28633}, 11465 {f: 2, c: 28636}, {f: 2, c: 28642}, {f: 6, c: 28645}, {f: 2, c: 28652}, 11466 {f: 8, c: 28658}, 28667, 28669, {f: 6, c: 28671}, {f: 2, c: 28679}, 28682, 11467 {f: 3, c: 28684}, 28688, {f: 3, c: 28690}, {f: 2, c: 28694}, 28697, 28700, 11468 28702, {f: 2, c: 28705}, {f: 3, c: 28708}, {f: 7, c: 28713}, 28721, 11469 {f: 2, c: 28723}, {f: 3, c: 28726}, {f: 4, c: 28730}, {f: 4, c: 28735}, 11470 {f: 7, c: 28741}, {f: 2, c: 28749}, 28752, {f: 3, c: 28754}, 11471 {f: 2, c: 28758}, {f: 4, c: 28761}, {f: 4, c: 28767}, {f: 2, c: 28773}, 11472 {f: 3, c: 28776}, 28782, {f: 4, c: 28785}, 28791, {f: 3, c: 28793}, 28797, 11473 {f: 4, c: 28801}, {f: 3, c: 28806}, {f: 3, c: 28811}, {f: 3, c: 28815}, 11474 28819, {f: 2, c: 28823}, {f: 2, c: 28826}, {f: 13, c: 28830}, 28848, 28850, 11475 {f: 3, c: 28852}, 28858, {f: 2, c: 28862}, {f: 4, c: 28868}, 28873, 11476 {f: 4, c: 28875}, {f: 8, c: 28880}, 28890, {f: 3, c: 28892}, 11477 {f: 4, c: 28896}, 28901, 28906, 28910, {f: 4, c: 28912}, {f: 2, c: 28917}, 11478 28920, {f: 3, c: 28922}, {f: 11, c: 28926}, {f: 5, c: 28939}, 11479 {f: 2, c: 28945}, 28948, 28951, {f: 6, c: 28955}, {f: 4, c: 28962}, 11480 {f: 8, c: 28967}, {f: 4, c: 28978}, {f: 14, c: 28983}, {f: 3, c: 28998}, 11481 29003, 29005, {f: 3, c: 29007}, {f: 9, c: 29011}, 29021, {f: 3, c: 29023}, 11482 29027, 29029, {f: 2, c: 29034}, 29037, {f: 3, c: 29039}, {f: 4, c: 29044}, 11483 29049, {f: 2, c: 29051}, {f: 6, c: 29054}, {f: 5, c: 29061}, 11484 {f: 4, c: 29067}, {f: 2, c: 29072}, 29075, {f: 2, c: 29077}, 11485 {f: 5, c: 29082}, {f: 7, c: 29089}, {f: 3, c: 29097}, {f: 4, c: 29101}, 11486 29106, 29108, {f: 3, c: 29110}, {f: 4, c: 29114}, {f: 2, c: 29119}, 29122, 11487 {f: 4, c: 29124}, {f: 5, c: 29129}, {f: 3, c: 29135}, 29139, 11488 {f: 3, c: 29142}, {f: 2, c: 29146}, {f: 2, c: 29149}, {f: 4, c: 29153}, 11489 {f: 5, c: 29160}, {f: 5, c: 29167}, {f: 4, c: 29173}, {f: 2, c: 29178}, 11490 29181, {f: 7, c: 29183}, {f: 6, c: 29191}, {f: 2, c: 29198}, 11491 {f: 10, c: 29201}, 29212, {f: 10, c: 29214}, 29225, 29227, 11492 {f: 3, c: 29229}, {f: 2, c: 29235}, 29244, {f: 7, c: 29248}, 11493 {f: 3, c: 29257}, {f: 4, c: 29262}, {f: 3, c: 29267}, 29271, 29274, 29276, 11494 29278, 29280, {f: 3, c: 29283}, 29288, {f: 4, c: 29290}, {f: 2, c: 29296}, 11495 {f: 2, c: 29299}, {f: 3, c: 29302}, {f: 2, c: 29307}, {f: 2, c: 29314}, 11496 {f: 5, c: 29317}, 29324, 29326, {f: 2, c: 29328}, {f: 3, c: 29331}, 11497 {f: 8, c: 29335}, {f: 2, c: 29344}, {f: 4, c: 29347}, {f: 4, c: 29352}, 11498 29358, {f: 3, c: 29361}, 29365, {f: 6, c: 29370}, {f: 3, c: 29381}, 11499 {f: 4, c: 29385}, 29391, 29393, {f: 4, c: 29395}, 29400, {f: 4, c: 29402}, 11500 29407, {f: 6, c: 29410}, {f: 2, c: 29418}, {f: 2, c: 29429}, 11501 {f: 3, c: 29438}, 29442, {f: 6, c: 29444}, {f: 3, c: 29451}, 11502 {f: 4, c: 29455}, 29460, {f: 3, c: 29464}, {f: 2, c: 29471}, 11503 {f: 2, c: 29475}, {f: 3, c: 29478}, 29485, {f: 2, c: 29487}, 11504 {f: 2, c: 29490}, 29493, 29498, {f: 2, c: 29500}, 29504, {f: 2, c: 29506}, 11505 {f: 7, c: 29510}, {f: 2, c: 29518}, 29521, {f: 4, c: 29523}, 11506 {f: 8, c: 29528}, {f: 7, c: 29537}, 29545, 29550, 29553, {f: 2, c: 29555}, 11507 29558, 29561, 29565, 29567, {f: 3, c: 29569}, {f: 2, c: 29573}, 29576, 11508 29578, {f: 2, c: 29580}, {f: 2, c: 29583}, {f: 4, c: 29586}, 11509 {f: 4, c: 29591}, {f: 3, c: 29596}, {f: 2, c: 29600}, {f: 6, c: 29603}, 11510 29610, {f: 2, c: 29612}, 29617, {f: 3, c: 29620}, {f: 2, c: 29624}, 11511 {f: 4, c: 29628}, 29633, {f: 5, c: 29635}, {f: 2, c: 29643}, 29646, 11512 {f: 7, c: 29650}, {f: 4, c: 29658}, 29663, {f: 4, c: 29665}, 29670, 29672, 11513 {f: 3, c: 29674}, {f: 4, c: 29678}, {f: 11, c: 29683}, {f: 4, c: 29695}, 11514 29700, {f: 2, c: 29703}, {f: 4, c: 29707}, {f: 9, c: 29713}, 11515 {f: 6, c: 29724}, {f: 2, c: 29731}, 29735, 29737, 29739, 29741, 29743, 11516 {f: 2, c: 29745}, {f: 5, c: 29751}, {f: 2, c: 29757}, 29760, 11517 {f: 9, c: 29762}, {f: 9, c: 29772}, 29782, 29784, 29789, {f: 3, c: 29792}, 11518 {f: 5, c: 29796}, {f: 2, c: 29803}, {f: 2, c: 29806}, {f: 5, c: 29809}, 11519 {f: 6, c: 29816}, 29823, 29826, {f: 3, c: 29828}, 29832, 29834, 11520 {f: 2, c: 29836}, 29839, {f: 11, c: 29841}, 29853, {f: 4, c: 29855}, 11521 {f: 2, c: 29860}, {f: 6, c: 29866}, {f: 9, c: 29873}, {f: 2, c: 29883}, 11522 {f: 12, c: 29886}, {f: 4, c: 29899}, {f: 2, c: 29904}, 29907, 11523 {f: 5, c: 29909}, 29915, 29917, 29919, 29921, 29925, {f: 7, c: 29927}, 11524 {f: 4, c: 29936}, 29941, {f: 7, c: 29944}, {f: 4, c: 29952}, 11525 {f: 7, c: 29957}, 29966, 29968, 29970, {f: 4, c: 29972}, 29979, 11526 {f: 2, c: 29981}, {f: 3, c: 29984}, 29988, {f: 2, c: 29990}, 29994, 29998, 11527 30004, 30006, 30009, {f: 2, c: 30012}, 30015, {f: 4, c: 30017}, 11528 {f: 2, c: 30022}, {f: 2, c: 30025}, 30029, {f: 4, c: 30032}, 11529 {f: 4, c: 30037}, {f: 4, c: 30046}, {f: 2, c: 30051}, {f: 3, c: 30055}, 11530 {f: 6, c: 30060}, 30067, 30069, 30071, {f: 5, c: 30074}, {f: 3, c: 30080}, 11531 {f: 2, c: 30084}, {f: 3, c: 30088}, {f: 3, c: 30092}, 30096, 30099, 30101, 11532 30104, {f: 2, c: 30107}, 30110, 30114, {f: 5, c: 30118}, 30125, 11533 {f: 2, c: 30134}, {f: 2, c: 30138}, {f: 3, c: 30143}, 30150, 11534 {f: 2, c: 30155}, {f: 4, c: 30158}, 30163, 30167, 30170, {f: 2, c: 30172}, 11535 {f: 3, c: 30175}, 30181, 30185, {f: 4, c: 30188}, {f: 2, c: 30194}, 11536 {f: 4, c: 30197}, {f: 2, c: 30202}, {f: 2, c: 30205}, 30212, 11537 {f: 4, c: 30214}, {f: 2, c: 30222}, {f: 4, c: 30225}, 30230, 30234, 11538 {f: 2, c: 30236}, 30243, 30248, 30252, {f: 2, c: 30254}, {f: 2, c: 30257}, 11539 {f: 2, c: 30262}, {f: 2, c: 30265}, 30269, 30273, {f: 2, c: 30276}, 30280, 11540 {f: 2, c: 30282}, {f: 6, c: 30286}, 30293, 30295, {f: 3, c: 30297}, 30301, 11541 {f: 2, c: 30304}, 30310, 30312, 30314, {f: 3, c: 30323}, [12136, 30326], 11542 30327, {f: 2, c: 30329}, {f: 3, c: 30335}, 30339, 30341, {f: 2, c: 30345}, 11543 {f: 2, c: 30348}, {f: 2, c: 30351}, 30354, {f: 2, c: 30356}, 11544 {f: 2, c: 30359}, {f: 9, c: 30363}, {f: 9, c: 30373}, {f: 2, c: 30383}, 11545 30387, {f: 3, c: 30389}, 30393, {f: 4, c: 30395}, {f: 2, c: 30400}, 11546 {f: 2, c: 30403}, 30407, 30409, {f: 2, c: 30411}, 30419, 30421, 11547 {f: 2, c: 30425}, {f: 2, c: 30428}, 30432, 30434, 30438, {f: 6, c: 30440}, 11548 30448, 30451, {f: 3, c: 30453}, {f: 2, c: 30458}, 30461, {f: 2, c: 30463}, 11549 {f: 2, c: 30466}, {f: 2, c: 30469}, 30474, 30476, {f: 11, c: 30478}, 11550 {f: 4, c: 30491}, 30497, {f: 3, c: 30499}, 30503, {f: 3, c: 30506}, 30510, 11551 {f: 5, c: 30512}, 30521, 30523, {f: 3, c: 30525}, 30530, {f: 3, c: 30532}, 11552 {f: 7, c: 30536}, {f: 8, c: 30546}, {f: 2, c: 30556}, {f: 2, c: 30559}, 11553 30564, 30567, {f: 2, c: 30569}, {f: 12, c: 30573}, {f: 3, c: 30586}, 11554 {f: 3, c: 30593}, {f: 6, c: 30598}, {f: 2, c: 30607}, {f: 5, c: 30611}, 11555 {f: 5, c: 30617}, 30625, {f: 2, c: 30627}, 30630, 30632, 30635, 11556 {f: 2, c: 30638}, {f: 2, c: 30641}, 30644, {f: 5, c: 30646}, 30654, 11557 {f: 7, c: 30656}, {f: 5, c: 30664}, {f: 9, c: 30670}, {f: 2, c: 30680}, 11558 {f: 5, c: 30685}, 30692, 30694, 30696, 30698, {f: 3, c: 30704}, 11559 {f: 2, c: 30708}, 30711, {f: 4, c: 30713}, {f: 6, c: 30723}, 11560 {f: 2, c: 30730}, {f: 3, c: 30734}, 30739, 30741, 30745, 30747, 30750, 11561 {f: 3, c: 30752}, 30756, 30760, {f: 2, c: 30762}, {f: 2, c: 30766}, 11562 {f: 3, c: 30769}, {f: 2, c: 30773}, 30781, 30783, {f: 2, c: 30785}, 30788, 11563 30790, {f: 4, c: 30792}, 30797, 30799, 30801, {f: 2, c: 30803}, 11564 {f: 5, c: 30808}, {f: 6, c: 30814}, {f: 3, c: 30821}, 30825, 11565 {f: 7, c: 30832}, {f: 4, c: 30840}, {f: 10, c: 30845}, 30856, 11566 {f: 2, c: 30858}, {f: 2, c: 30863}, 30866, {f: 3, c: 30868}, 30873, 11567 {f: 2, c: 30877}, 30880, 30882, 30884, 30886, 30888, {f: 3, c: 30890}, 11568 {f: 2, c: 30894}, {f: 3, c: 30901}, 30907, 30909, {f: 2, c: 30911}, 11569 {f: 3, c: 30914}, {f: 3, c: 30918}, {f: 4, c: 30924}, {f: 3, c: 30929}, 11570 {f: 3, c: 30934}, {f: 8, c: 30939}, {f: 3, c: 30948}, {f: 3, c: 30953}, 11571 {f: 2, c: 30957}, {f: 2, c: 30960}, 30963, {f: 2, c: 30965}, 11572 {f: 2, c: 30968}, {f: 2, c: 30971}, {f: 3, c: 30974}, {f: 3, c: 30978}, 11573 {f: 8, c: 30982}, {f: 4, c: 30991}, {f: 5, c: 30996}, {f: 4, c: 31002}, 11574 {f: 5, c: 31007}, 31013, {f: 3, c: 31015}, {f: 4, c: 31021}, 11575 {f: 2, c: 31026}, {f: 5, c: 31029}, 31037, 31039, {f: 4, c: 31042}, 31047, 11576 {f: 9, c: 31050}, {f: 2, c: 31060}, {f: 2, c: 31064}, 31073, 11577 {f: 2, c: 31075}, 31078, {f: 4, c: 31081}, 31086, {f: 7, c: 31088}, 31097, 11578 {f: 5, c: 31099}, {f: 2, c: 31106}, {f: 4, c: 31110}, {f: 2, c: 31115}, 11579 {f: 10, c: 31120}, {f: 11, c: 31131}, {f: 2, c: 31144}, {f: 3, c: 31147}, 11580 31151, 31154, {f: 4, c: 31156}, [12145, 31160], 31164, 31167, 31170, 11581 {f: 2, c: 31172}, {f: 2, c: 31175}, 31178, 31180, {f: 3, c: 31182}, 11582 {f: 2, c: 31187}, {f: 2, c: 31190}, {f: 6, c: 31193}, {f: 3, c: 31200}, 11583 31205, 31208, 31210, 31212, 31214, {f: 7, c: 31217}, {f: 2, c: 31225}, 11584 31228, {f: 2, c: 31230}, 31233, {f: 2, c: 31236}, {f: 4, c: 31239}, 31244, 11585 {f: 5, c: 31247}, {f: 2, c: 31253}, {f: 2, c: 31256}, {f: 3, c: 31259}, 11586 31263, {f: 2, c: 31265}, {f: 10, c: 31268}, {f: 2, c: 31279}, 31282, 11587 {f: 3, c: 31284}, 31288, 31290, 31294, {f: 5, c: 31297}, {f: 5, c: 31303}, 11588 {f: 2, c: 31311}, {f: 5, c: 31314}, {f: 9, c: 31320}, {f: 6, c: 31331}, 11589 31338, {f: 4, c: 31340}, {f: 3, c: 31345}, 31349, {f: 4, c: 31355}, 31362, 11590 31365, 31367, {f: 4, c: 31369}, {f: 3, c: 31374}, {f: 2, c: 31379}, 11591 {f: 3, c: 31385}, 31390, {f: 4, c: 31393}, 31399, 31403, {f: 4, c: 31407}, 11592 {f: 2, c: 31412}, {f: 3, c: 31415}, {f: 4, c: 31419}, {f: 4, c: 31424}, 11593 31430, 31433, {f: 10, c: 31436}, {f: 2, c: 31447}, {f: 4, c: 31450}, 11594 {f: 2, c: 31457}, 31460, {f: 3, c: 31463}, {f: 2, c: 31467}, 31470, 11595 {f: 6, c: 31472}, {f: 2, c: 31479}, {f: 2, c: 31483}, 31486, 11596 {f: 3, c: 31488}, 31493, 31495, 31497, {f: 3, c: 31500}, 31504, 11597 {f: 2, c: 31506}, {f: 3, c: 31510}, 31514, {f: 2, c: 31516}, 31519, 11598 {f: 3, c: 31521}, 31527, 31529, 31533, {f: 2, c: 31535}, 31538, 11599 {f: 4, c: 31540}, 31545, 31547, 31549, {f: 6, c: 31551}, 31560, 31562, 11600 {f: 2, c: 31565}, 31571, 31573, 31575, 31577, 31580, {f: 2, c: 31582}, 11601 31585, {f: 4, c: 31587}, {f: 6, c: 31592}, {f: 2, c: 31599}, 11602 {f: 2, c: 31603}, 31606, 31608, 31610, {f: 2, c: 31612}, 31615, 11603 {f: 4, c: 31617}, {f: 5, c: 31622}, 31628, {f: 2, c: 31630}, 11604 {f: 3, c: 31633}, 31638, {f: 4, c: 31640}, {f: 3, c: 31646}, 11605 {f: 3, c: 31651}, {f: 3, c: 31662}, {f: 2, c: 31666}, {f: 3, c: 31669}, 11606 {f: 7, c: 31673}, {f: 2, c: 31682}, 31685, 31688, 31690, {f: 4, c: 31693}, 11607 31698, {f: 5, c: 31700}, {f: 2, c: 31707}, {f: 3, c: 31710}, 11608 {f: 2, c: 31714}, {f: 2, c: 31719}, {f: 3, c: 31723}, {f: 2, c: 31727}, 11609 31730, {f: 3, c: 31732}, {f: 4, c: 31736}, 31741, 31743, {f: 6, c: 31745}, 11610 {f: 3, c: 31752}, 31758, {f: 6, c: 31760}, {f: 7, c: 31767}, 31776, 31778, 11611 {f: 2, c: 31780}, {f: 2, c: 31784}, {f: 12, c: 31788}, {f: 4, c: 31801}, 11612 31810, {f: 8, c: 31812}, {f: 14, c: 31822}, {f: 2, c: 31837}, 11613 {f: 3, c: 31841}, {f: 4, c: 31845}, 31851, 31853, {f: 3, c: 31855}, 11614 {f: 6, c: 31861}, {f: 11, c: 31870}, {f: 7, c: 31882}, {f: 2, c: 31891}, 11615 31894, {f: 3, c: 31897}, {f: 2, c: 31904}, 31907, {f: 4, c: 31910}, 11616 {f: 3, c: 31915}, {f: 2, c: 31919}, {f: 5, c: 31924}, {f: 2, c: 31930}, 11617 {f: 2, c: 31935}, {f: 3, c: 31938}, 31942, 31945, 31947, {f: 7, c: 31950}, 11618 31960, {f: 2, c: 31962}, {f: 6, c: 31969}, {f: 6, c: 31977}, 31985, 31987, 11619 31989, 31991, 31994, {f: 2, c: 31996}, 31999, 32001, 32003, 32012, 11620 {f: 2, c: 32014}, {f: 2, c: 32017}, 32022, 32024, {f: 3, c: 32029}, 11621 {f: 4, c: 32035}, {f: 3, c: 32040}, {f: 3, c: 32044}, {f: 5, c: 32052}, 11622 32059, {f: 2, c: 32061}, 32065, 32067, 32069, {f: 7, c: 32071}, 32079, 11623 {f: 12, c: 32081}, {f: 2, c: 32095}, {f: 3, c: 32099}, 32103, 11624 {f: 5, c: 32105}, {f: 2, c: 32111}, {f: 2, c: 32116}, 32120, 11625 {f: 7, c: 32122}, 32130, {f: 2, c: 32132}, 32135, {f: 5, c: 32138}, 11626 {f: 3, c: 32144}, {f: 8, c: 32148}, 32157, {f: 3, c: 32159}, 11627 {f: 2, c: 32164}, {f: 4, c: 32167}, 32175, {f: 3, c: 32181}, 32188, 11628 {f: 4, c: 32192}, {f: 2, c: 32197}, {f: 2, c: 32200}, {f: 5, c: 32204}, 11629 32211, {f: 2, c: 32213}, {f: 3, c: 32218}, 32223, 32226, {f: 2, c: 32228}, 11630 32231, {f: 2, c: 32234}, {f: 2, c: 32237}, 32240, 32243, 32245, 11631 {f: 2, c: 32247}, 32250, {f: 12, c: 32252}, {f: 4, c: 32268}, 11632 {f: 9, c: 32274}, 32284, {f: 3, c: 32288}, {f: 3, c: 32292}, 11633 {f: 3, c: 32296}, 32300, {f: 2, c: 32303}, 32307, 32312, 32314, 32316, 11634 {f: 2, c: 32319}, {f: 3, c: 32322}, {f: 10, c: 32328}, 32339, 11635 {f: 4, c: 32342}, {f: 3, c: 32347}, {f: 3, c: 32351}, {f: 6, c: 32355}, 11636 32364, {f: 2, c: 32369}, {f: 5, c: 32372}, {f: 2, c: 32378}, 11637 {f: 3, c: 32383}, {f: 5, c: 32387}, 32393, 32395, 32398, {f: 3, c: 32400}, 11638 32405, 32407, {f: 2, c: 32409}, {f: 2, c: 32413}, 32430, 32436, 11639 {f: 2, c: 32443}, 32470, 32484, 32492, 32505, 32522, 32528, 32542, 32567, 11640 32569, {f: 7, c: 32571}, 32579, {f: 6, c: 32582}, 32589, 32591, 11641 {f: 2, c: 32594}, 32598, 32601, {f: 4, c: 32603}, 32608, {f: 5, c: 32611}, 11642 {f: 3, c: 32619}, 32623, 32627, {f: 2, c: 32629}, 32632, {f: 4, c: 32634}, 11643 {f: 2, c: 32639}, {f: 3, c: 32642}, 32647, 32649, 32651, 32653, 11644 {f: 5, c: 32655}, {f: 5, c: 32661}, {f: 2, c: 32667}, 32672, 11645 {f: 2, c: 32674}, 32678, 32680, {f: 5, c: 32682}, 32689, {f: 5, c: 32691}, 11646 {f: 2, c: 32698}, 32702, 32704, {f: 3, c: 32706}, {f: 4, c: 32710}, 32715, 11647 32717, {f: 3, c: 32719}, 32723, {f: 2, c: 32726}, {f: 6, c: 32729}, 11648 {f: 3, c: 32738}, {f: 2, c: 32743}, {f: 4, c: 32746}, 32751, 32754, 11649 {f: 5, c: 32756}, 32762, {f: 3, c: 32765}, 32770, {f: 4, c: 32775}, 11650 {f: 2, c: 32782}, 32785, 32787, {f: 2, c: 32794}, {f: 3, c: 32797}, 32801, 11651 {f: 2, c: 32803}, 32811, 32813, {f: 2, c: 32815}, 32818, 32820, 11652 {f: 2, c: 32825}, 32828, 32830, {f: 2, c: 32832}, {f: 2, c: 32836}, 11653 {f: 3, c: 32839}, {f: 4, c: 32846}, 32851, 32853, 32855, 32857, 11654 {f: 3, c: 32859}, {f: 10, c: 32863}, {f: 4, c: 32875}, 32884, 32888, 11655 {f: 3, c: 32890}, {f: 2, c: 32897}, 32904, 32906, {f: 6, c: 32909}, 11656 {f: 2, c: 32916}, 32919, 32921, 32926, 32931, {f: 3, c: 32934}, 32940, 11657 32944, 32947, {f: 2, c: 32949}, {f: 2, c: 32952}, 32955, 32965, 11658 {f: 5, c: 32967}, {f: 7, c: 32975}, 32984, {f: 2, c: 32991}, 11659 {f: 2, c: 32994}, 32998, 33006, 33013, 33015, 33017, 33019, 11660 {f: 4, c: 33022}, {f: 2, c: 33027}, {f: 2, c: 33031}, {f: 2, c: 33035}, 11661 33045, 33047, 33049, {f: 2, c: 33052}, {f: 13, c: 33055}, {f: 2, c: 33069}, 11662 33072, {f: 3, c: 33075}, 33079, {f: 4, c: 33082}, {f: 7, c: 33087}, 33095, 11663 33097, 33101, 33103, 33106, {f: 2, c: 33111}, {f: 5, c: 33115}, 11664 {f: 3, c: 33122}, 33128, 33130, 33132, 33135, {f: 2, c: 33138}, 11665 {f: 3, c: 33141}, 33153, {f: 5, c: 33155}, 33161, {f: 4, c: 33163}, 33168, 11666 {f: 6, c: 33170}, 33177, {f: 2, c: 33182}, {f: 2, c: 33185}, 11667 {f: 2, c: 33188}, 33191, {f: 8, c: 33195}, {f: 6, c: 33204}, 33212, 11668 {f: 2, c: 33220}, {f: 2, c: 33223}, 33227, 33230, {f: 8, c: 33232}, 33241, 11669 {f: 4, c: 33243}, {f: 2, c: 33249}, {f: 3, c: 33252}, 33257, 33259, 11670 {f: 5, c: 33262}, {f: 5, c: 33269}, 33277, 33279, 33283, 33291, 11671 {f: 2, c: 33294}, 33297, 33299, {f: 6, c: 33301}, 33309, 33312, 11672 {f: 4, c: 33316}, 33321, 33326, 33330, 33338, {f: 2, c: 33340}, 11673 {f: 5, c: 33343}, {f: 2, c: 33349}, 33352, 33354, {f: 3, c: 33356}, 11674 {f: 8, c: 33360}, {f: 4, c: 33371}, {f: 4, c: 33376}, 33381, 33383, 11675 {f: 2, c: 33385}, {f: 2, c: 33388}, {f: 2, c: 33397}, [12171, 33400], 11676 {f: 2, c: 33403}, {f: 2, c: 33408}, 33411, {f: 3, c: 33413}, 33417, 33420, 11677 33424, {f: 4, c: 33427}, {f: 2, c: 33434}, 33438, 33440, {f: 2, c: 33442}, 11678 33447, 33458, {f: 2, c: 33461}, 33466, 33468, {f: 2, c: 33471}, 11679 {f: 2, c: 33474}, {f: 2, c: 33477}, 33481, 33488, 33494, {f: 2, c: 33497}, 11680 33501, 33506, {f: 3, c: 33512}, {f: 3, c: 33516}, 33520, {f: 2, c: 33522}, 11681 {f: 2, c: 33525}, 33528, 33530, {f: 5, c: 33532}, {f: 2, c: 33546}, 33549, 11682 33552, {f: 2, c: 33554}, 33558, {f: 2, c: 33560}, {f: 10, c: 33565}, 11683 {f: 2, c: 33577}, 33582, 33584, 33586, 33591, 33595, {f: 3, c: 33597}, 11684 {f: 2, c: 33601}, {f: 2, c: 33604}, 33608, {f: 5, c: 33610}, 33619, 11685 {f: 5, c: 33621}, 33629, 33634, {f: 7, c: 33648}, {f: 2, c: 33657}, 11686 {f: 7, c: 33662}, {f: 2, c: 33671}, {f: 3, c: 33675}, {f: 3, c: 33679}, 11687 {f: 2, c: 33684}, 33687, {f: 2, c: 33689}, 33693, 33695, 33697, 11688 {f: 4, c: 33699}, {f: 4, c: 33708}, 33717, 33723, {f: 2, c: 33726}, 11689 {f: 3, c: 33730}, 33734, {f: 2, c: 33736}, 33739, {f: 2, c: 33741}, 11690 {f: 4, c: 33744}, 33749, 33751, {f: 3, c: 33753}, 33758, {f: 3, c: 33762}, 11691 {f: 3, c: 33766}, {f: 4, c: 33771}, {f: 5, c: 33779}, {f: 3, c: 33786}, 11692 {f: 3, c: 33790}, 33794, 33797, {f: 2, c: 33800}, 33808, {f: 6, c: 33810}, 11693 {f: 3, c: 33817}, {f: 6, c: 33822}, {f: 3, c: 33833}, {f: 4, c: 33837}, 11694 {f: 3, c: 33842}, {f: 2, c: 33846}, {f: 3, c: 33849}, {f: 8, c: 33854}, 11695 {f: 2, c: 33863}, {f: 7, c: 33866}, {f: 4, c: 33875}, 33880, 11696 {f: 4, c: 33885}, 33890, 33893, {f: 2, c: 33895}, 33898, 33902, 33904, 11697 33906, 33908, 33913, {f: 7, c: 33915}, {f: 4, c: 33923}, 33930, 33933, 11698 {f: 4, c: 33935}, {f: 2, c: 33941}, 33944, {f: 2, c: 33946}, 11699 {f: 4, c: 33949}, {f: 13, c: 33954}, {f: 2, c: 33968}, 33971, 11700 {f: 3, c: 33973}, 33979, 33982, {f: 2, c: 33986}, {f: 4, c: 33989}, 33996, 11701 {f: 2, c: 33998}, 34002, {f: 2, c: 34004}, {f: 6, c: 34007}, 34014, 11702 {f: 2, c: 34017}, 34020, {f: 5, c: 34023}, 34029, {f: 11, c: 34033}, 34046, 11703 {f: 12, c: 34048}, {f: 4, c: 34061}, 34066, {f: 2, c: 34069}, 11704 {f: 2, c: 34072}, {f: 3, c: 34075}, 34080, 34082, {f: 2, c: 34084}, 11705 {f: 4, c: 34087}, {f: 9, c: 34094}, {f: 3, c: 34110}, 34114, 11706 {f: 2, c: 34116}, 34119, {f: 3, c: 34123}, {f: 3, c: 34127}, 34132, 34135, 11707 {f: 4, c: 34138}, {f: 3, c: 34143}, 34147, {f: 3, c: 34149}, 11708 {f: 2, c: 34155}, {f: 4, c: 34158}, 34163, {f: 2, c: 34165}, 34168, 11709 {f: 2, c: 34172}, {f: 5, c: 34175}, 34182, 34185, 34187, {f: 2, c: 34189}, 11710 34192, {f: 2, c: 34194}, {f: 6, c: 34197}, {f: 2, c: 34205}, 11711 {f: 4, c: 34208}, 34213, 34215, {f: 3, c: 34219}, {f: 6, c: 34225}, 34232, 11712 {f: 6, c: 34235}, {f: 7, c: 34242}, {f: 3, c: 34250}, {f: 2, c: 34257}, 11713 34260, {f: 6, c: 34262}, {f: 6, c: 34270}, {f: 3, c: 34278}, 11714 {f: 9, c: 34283}, 34293, {f: 2, c: 34295}, {f: 3, c: 34300}, 11715 {f: 4, c: 34304}, {f: 3, c: 34312}, {f: 5, c: 34316}, {f: 4, c: 34322}, 11716 {f: 3, c: 34327}, {f: 3, c: 34331}, {f: 3, c: 34335}, {f: 4, c: 34339}, 11717 34344, {f: 3, c: 34346}, {f: 10, c: 34350}, 34361, 34363, {f: 2, c: 34365}, 11718 {f: 13, c: 34368}, {f: 2, c: 34386}, {f: 4, c: 34390}, 34395, 34397, 11719 {f: 2, c: 34400}, {f: 4, c: 34403}, {f: 3, c: 34408}, 34413, 11720 {f: 2, c: 34415}, {f: 7, c: 34418}, {f: 7, c: 34435}, {f: 5, c: 34446}, 11721 34452, {f: 6, c: 34454}, {f: 5, c: 34462}, {f: 2, c: 34469}, 34475, 11722 {f: 2, c: 34477}, {f: 2, c: 34482}, {f: 3, c: 34487}, {f: 5, c: 34491}, 11723 {f: 3, c: 34497}, 34501, 34504, {f: 2, c: 34508}, {f: 2, c: 34514}, 11724 {f: 3, c: 34517}, 34522, {f: 2, c: 34524}, {f: 4, c: 34528}, 11725 {f: 4, c: 34533}, {f: 3, c: 34538}, 34543, {f: 3, c: 34549}, 11726 {f: 3, c: 34555}, 34559, 34561, {f: 2, c: 34564}, {f: 2, c: 34571}, 11727 {f: 4, c: 34574}, 34580, 34582, 34585, 34587, 34589, {f: 2, c: 34591}, 11728 34596, {f: 3, c: 34598}, {f: 4, c: 34602}, {f: 2, c: 34607}, 11729 {f: 2, c: 34610}, {f: 2, c: 34613}, {f: 3, c: 34616}, {f: 2, c: 34620}, 11730 {f: 7, c: 34624}, {f: 2, c: 34634}, 34637, {f: 4, c: 34639}, 34644, 34646, 11731 34648, {f: 6, c: 34650}, {f: 2, c: 34657}, {f: 7, c: 34663}, 34671, 11732 {f: 3, c: 34673}, 34677, 34679, {f: 2, c: 34681}, {f: 3, c: 34687}, 11733 {f: 2, c: 34694}, {f: 2, c: 34697}, 34700, {f: 5, c: 34702}, 11734 {f: 3, c: 34708}, {f: 6, c: 34712}, {f: 2, c: 34720}, {f: 5, c: 34723}, 11735 {f: 2, c: 34729}, 34734, {f: 3, c: 34736}, 34740, {f: 4, c: 34742}, 34748, 11736 {f: 2, c: 34750}, {f: 3, c: 34753}, 34757, 34759, 34761, {f: 2, c: 34764}, 11737 {f: 2, c: 34767}, {f: 7, c: 34772}, {f: 4, c: 34780}, {f: 2, c: 34785}, 11738 34788, {f: 4, c: 34790}, 34795, 34797, {f: 2, c: 34800}, {f: 3, c: 34803}, 11739 {f: 2, c: 34807}, 34810, {f: 2, c: 34812}, {f: 4, c: 34815}, 34820, 11740 {f: 3, c: 34823}, {f: 5, c: 34827}, 34834, 34836, {f: 4, c: 34839}, 11741 {f: 3, c: 34844}, 34848, {f: 13, c: 34852}, {f: 3, c: 34867}, 11742 {f: 2, c: 34871}, 34874, {f: 3, c: 34877}, {f: 3, c: 34881}, 11743 {f: 3, c: 34887}, 34891, {f: 5, c: 34894}, {f: 2, c: 34901}, 34904, 34906, 11744 34908, {f: 3, c: 34910}, {f: 2, c: 34918}, 34922, 34925, 34927, 34929, 11745 {f: 4, c: 34931}, 34936, {f: 3, c: 34938}, 34944, 34947, {f: 2, c: 34950}, 11746 {f: 2, c: 34953}, 34956, {f: 4, c: 34958}, {f: 3, c: 34963}, 11747 {f: 5, c: 34967}, {f: 5, c: 34973}, 34979, {f: 6, c: 34981}, 34988, 11748 {f: 3, c: 34990}, {f: 5, c: 34994}, {f: 4, c: 35000}, {f: 4, c: 35005}, 11749 {f: 2, c: 35011}, {f: 2, c: 35015}, {f: 3, c: 35019}, {f: 2, c: 35024}, 11750 35027, {f: 2, c: 35030}, {f: 2, c: 35034}, 35038, {f: 2, c: 35040}, 11751 {f: 2, c: 35046}, {f: 7, c: 35049}, 35058, {f: 3, c: 35061}, 11752 {f: 2, c: 35066}, {f: 3, c: 35071}, {f: 4, c: 35075}, {f: 2, c: 35080}, 11753 {f: 5, c: 35083}, 35089, {f: 5, c: 35092}, {f: 5, c: 35100}, 11754 {f: 3, c: 35106}, {f: 4, c: 35110}, {f: 4, c: 35116}, 35121, 35125, 35127, 11755 {f: 2, c: 35129}, {f: 5, c: 35132}, {f: 2, c: 35138}, {f: 2, c: 35141}, 11756 {f: 14, c: 35144}, {f: 6, c: 35159}, {f: 3, c: 35169}, 35173, 11757 {f: 3, c: 35175}, 35179, {f: 2, c: 35181}, {f: 2, c: 35184}, 11758 {f: 8, c: 35187}, {f: 2, c: 35196}, [12177, 35198], 35200, 35202, 11759 {f: 2, c: 35204}, {f: 4, c: 35207}, {f: 3, c: 35212}, {f: 3, c: 35216}, 11760 {f: 2, c: 35220}, 35223, {f: 8, c: 35225}, {f: 4, c: 35234}, 11761 {f: 3, c: 35239}, 35243, {f: 2, c: 35245}, {f: 2, c: 35248}, 11762 {f: 4, c: 35251}, {f: 2, c: 35256}, {f: 2, c: 35259}, 35262, 35267, 35277, 11763 {f: 3, c: 35283}, {f: 3, c: 35287}, 35291, 35293, {f: 4, c: 35295}, 35300, 11764 {f: 4, c: 35303}, {f: 3, c: 35308}, {f: 3, c: 35312}, 35317, 35319, 11765 {f: 7, c: 35321}, {f: 3, c: 35332}, 35337, 35339, 35341, 35343, 11766 {f: 2, c: 35345}, 35348, 35351, {f: 2, c: 35353}, 35356, 35358, 11767 {f: 3, c: 35360}, 35364, {f: 4, c: 35366}, {f: 2, c: 35371}, 11768 {f: 3, c: 35374}, {f: 2, c: 35378}, 35381, {f: 3, c: 35383}, 11769 {f: 3, c: 35387}, {f: 2, c: 35391}, {f: 4, c: 35394}, 35399, 11770 {f: 5, c: 35401}, 35407, 35409, 35411, {f: 2, c: 35414}, {f: 2, c: 35417}, 11771 {f: 2, c: 35420}, {f: 2, c: 35423}, {f: 2, c: 35428}, {f: 2, c: 35431}, 11772 35434, 35439, 35444, {f: 3, c: 35446}, {f: 2, c: 35450}, {f: 2, c: 35453}, 11773 {f: 4, c: 35456}, 35464, {f: 2, c: 35467}, {f: 3, c: 35470}, 35476, 11774 {f: 2, c: 35478}, 35481, {f: 3, c: 35483}, 35487, 35490, 35495, 11775 {f: 3, c: 35497}, {f: 3, c: 35501}, 35505, {f: 3, c: 35507}, 11776 {f: 2, c: 35511}, {f: 2, c: 35514}, {f: 2, c: 35517}, {f: 2, c: 35520}, 11777 35523, {f: 2, c: 35525}, 35528, 35530, 35532, 35534, 35536, 11778 {f: 3, c: 35539}, {f: 3, c: 35544}, 35549, {f: 3, c: 35551}, 35555, 35557, 11779 {f: 3, c: 35560}, 35564, {f: 2, c: 35567}, 35570, {f: 2, c: 35572}, 35577, 11780 35579, 35581, 35583, 35587, 35590, {f: 2, c: 35592}, {f: 3, c: 35595}, 11781 35599, {f: 3, c: 35601}, 35605, 35608, 35612, {f: 3, c: 35614}, 11782 {f: 4, c: 35618}, 35623, {f: 2, c: 35625}, {f: 5, c: 35630}, 11783 {f: 5, c: 35636}, {f: 4, c: 35642}, {f: 10, c: 35647}, {f: 4, c: 35658}, 11784 {f: 6, c: 35664}, 35671, 35675, {f: 9, c: 35677}, {f: 4, c: 35687}, 11785 {f: 2, c: 35693}, {f: 3, c: 35697}, {f: 2, c: 35701}, {f: 5, c: 35704}, 11786 {f: 2, c: 35710}, {f: 9, c: 35713}, {f: 3, c: 35723}, {f: 3, c: 35727}, 11787 35732, {f: 5, c: 35735}, 35741, 35743, 35756, 35761, 35771, 35783, 35792, 11788 35818, 35849, 35870, {f: 9, c: 35896}, {f: 4, c: 35906}, {f: 2, c: 35914}, 11789 {f: 3, c: 35917}, {f: 4, c: 35921}, {f: 4, c: 35926}, {f: 6, c: 35931}, 11790 {f: 7, c: 35939}, {f: 7, c: 35948}, {f: 4, c: 35956}, {f: 7, c: 35963}, 11791 {f: 2, c: 35971}, {f: 3, c: 35974}, 35979, {f: 7, c: 35981}, 11792 {f: 3, c: 35989}, {f: 4, c: 35993}, 35999, {f: 4, c: 36003}, 11793 {f: 2, c: 36013}, 36017, 36021, 36025, 36030, 36038, 36041, 11794 {f: 6, c: 36043}, 36052, {f: 4, c: 36054}, 36059, 36061, 36063, 36069, 11795 {f: 2, c: 36072}, {f: 6, c: 36078}, {f: 5, c: 36085}, {f: 5, c: 36095}, 11796 {f: 2, c: 36102}, 36105, 36108, 36110, {f: 5, c: 36113}, {f: 4, c: 36119}, 11797 36128, {f: 2, c: 36177}, 36183, 36191, 36197, {f: 3, c: 36200}, 36204, 11798 {f: 2, c: 36206}, {f: 2, c: 36209}, {f: 9, c: 36216}, {f: 2, c: 36226}, 11799 {f: 4, c: 36230}, {f: 5, c: 36236}, {f: 2, c: 36242}, {f: 3, c: 36246}, 11800 {f: 5, c: 36250}, {f: 3, c: 36256}, {f: 4, c: 36260}, {f: 8, c: 36265}, 11801 {f: 2, c: 36278}, 36281, 36283, 36285, {f: 3, c: 36288}, 36293, 11802 {f: 4, c: 36295}, 36301, 36304, {f: 4, c: 36306}, {f: 2, c: 36312}, 36316, 11803 {f: 3, c: 36320}, {f: 3, c: 36325}, 36329, {f: 2, c: 36333}, 11804 {f: 3, c: 36336}, 36340, 36342, 36348, {f: 7, c: 36350}, {f: 3, c: 36358}, 11805 36363, {f: 2, c: 36365}, {f: 3, c: 36369}, {f: 8, c: 36373}, 11806 {f: 2, c: 36384}, {f: 5, c: 36388}, 36395, 36397, 36400, {f: 2, c: 36402}, 11807 {f: 3, c: 36406}, {f: 2, c: 36411}, {f: 2, c: 36414}, 36419, 11808 {f: 2, c: 36421}, {f: 4, c: 36429}, {f: 2, c: 36435}, {f: 3, c: 36438}, 11809 {f: 9, c: 36442}, {f: 2, c: 36452}, {f: 2, c: 36455}, {f: 2, c: 36458}, 11810 36462, 36465, 36467, 36469, {f: 3, c: 36471}, 36475, {f: 2, c: 36477}, 11811 36480, {f: 3, c: 36482}, 36486, 36488, 36492, 36494, {f: 5, c: 36501}, 11812 36507, 36509, {f: 2, c: 36511}, {f: 3, c: 36514}, {f: 3, c: 36519}, 11813 {f: 2, c: 36525}, {f: 2, c: 36528}, {f: 7, c: 36531}, {f: 5, c: 36539}, 11814 {f: 9, c: 36545}, {f: 3, c: 36559}, 36563, {f: 6, c: 36565}, 11815 {f: 3, c: 36572}, {f: 4, c: 36576}, {f: 6, c: 36581}, {f: 6, c: 36588}, 11816 {f: 5, c: 36595}, 36605, {f: 4, c: 36607}, 36612, 36614, 36616, 11817 {f: 7, c: 36619}, 36627, {f: 5, c: 36630}, {f: 5, c: 36640}, 11818 {f: 2, c: 36647}, {f: 4, c: 36651}, {f: 3, c: 36656}, {f: 4, c: 36660}, 11819 {f: 2, c: 36665}, {f: 2, c: 36668}, {f: 2, c: 36672}, 36675, 11820 {f: 2, c: 36679}, {f: 3, c: 36682}, {f: 5, c: 36687}, {f: 10, c: 36693}, 11821 36704, 36707, 36709, 36714, 36736, 36748, 36754, 36765, {f: 3, c: 36768}, 11822 {f: 2, c: 36772}, 36775, 36778, 36780, {f: 2, c: 36787}, [12193, 36789], 11823 {f: 2, c: 36791}, {f: 3, c: 36794}, {f: 2, c: 36799}, 36803, 36806, 11824 {f: 5, c: 36809}, 36815, 36818, {f: 2, c: 36822}, 36826, {f: 2, c: 36832}, 11825 36835, 36839, 36844, 36847, {f: 2, c: 36849}, {f: 2, c: 36853}, 11826 {f: 3, c: 36858}, {f: 2, c: 36862}, {f: 2, c: 36871}, 36876, 36878, 36883, 11827 36888, 36892, {f: 2, c: 36900}, {f: 6, c: 36903}, {f: 2, c: 36912}, 11828 {f: 2, c: 36915}, 36919, {f: 2, c: 36921}, 36925, {f: 2, c: 36927}, 36931, 11829 {f: 2, c: 36933}, {f: 3, c: 36936}, 36940, 36950, {f: 2, c: 36953}, 36957, 11830 36959, 36961, 36964, {f: 2, c: 36966}, {f: 3, c: 36970}, {f: 3, c: 36975}, 11831 36979, 36982, 36985, 36987, 36990, {f: 2, c: 36997}, 37001, 11832 {f: 3, c: 37004}, 37010, 37012, 37014, 37016, 37018, 37020, 11833 {f: 3, c: 37022}, {f: 2, c: 37028}, {f: 3, c: 37031}, 37035, 37037, 37042, 11834 37047, {f: 2, c: 37052}, {f: 2, c: 37055}, {f: 2, c: 37058}, 37062, 11835 {f: 2, c: 37064}, {f: 3, c: 37067}, 37074, {f: 3, c: 37076}, 11836 {f: 3, c: 37080}, 37086, 37088, {f: 3, c: 37091}, {f: 2, c: 37097}, 37100, 11837 37102, {f: 4, c: 37104}, {f: 2, c: 37110}, {f: 4, c: 37113}, 11838 {f: 3, c: 37119}, 37123, 37125, {f: 2, c: 37127}, {f: 8, c: 37130}, 37139, 11839 37141, {f: 2, c: 37143}, {f: 4, c: 37146}, {f: 3, c: 37151}, 11840 {f: 3, c: 37156}, {f: 5, c: 37160}, 37166, 37171, 37173, {f: 2, c: 37175}, 11841 {f: 8, c: 37179}, {f: 2, c: 37188}, 37191, 37201, {f: 4, c: 37203}, 11842 {f: 2, c: 37208}, {f: 2, c: 37211}, {f: 2, c: 37215}, {f: 3, c: 37222}, 11843 37227, 37229, 37235, {f: 3, c: 37242}, {f: 5, c: 37248}, 37254, 37256, 11844 37258, {f: 2, c: 37262}, {f: 3, c: 37267}, {f: 3, c: 37271}, 11845 {f: 5, c: 37277}, {f: 6, c: 37284}, {f: 4, c: 37296}, {f: 4, c: 37302}, 11846 {f: 5, c: 37307}, 37314, 37316, [12196, 37318], 37320, 37328, 37334, 11847 {f: 2, c: 37338}, {f: 5, c: 37342}, {f: 2, c: 37349}, 37352, 11848 {f: 11, c: 37354}, 37366, 37368, {f: 5, c: 37371}, {f: 2, c: 37378}, 11849 {f: 3, c: 37381}, {f: 3, c: 37386}, 37391, {f: 2, c: 37394}, 11850 {f: 8, c: 37398}, {f: 4, c: 37407}, 37412, {f: 6, c: 37416}, 37423, 11851 {f: 2, c: 37425}, {f: 2, c: 37429}, {f: 2, c: 37435}, {f: 4, c: 37441}, 11852 {f: 2, c: 37446}, {f: 3, c: 37450}, {f: 3, c: 37454}, {f: 3, c: 37458}, 11853 37462, {f: 2, c: 37464}, {f: 2, c: 37468}, {f: 3, c: 37471}, 11854 {f: 3, c: 37475}, {f: 5, c: 37479}, {f: 6, c: 37486}, {f: 3, c: 37493}, 11855 37497, {f: 3, c: 37500}, {f: 2, c: 37505}, 37508, {f: 8, c: 37510}, 11856 {f: 2, c: 37519}, 37522, {f: 2, c: 37524}, 37527, 37529, 37531, 11857 {f: 3, c: 37533}, {f: 2, c: 37537}, 37540, 37543, 37549, {f: 2, c: 37551}, 11858 {f: 5, c: 37554}, 37560, 37562, {f: 4, c: 37565}, 37570, 37572, 37574, 11859 {f: 3, c: 37577}, {f: 2, c: 37581}, {f: 2, c: 37584}, {f: 10, c: 37587}, 11860 37598, {f: 3, c: 37600}, 37607, 37609, {f: 2, c: 37611}, {f: 4, c: 37618}, 11861 37623, {f: 3, c: 37625}, {f: 4, c: 37629}, {f: 4, c: 37634}, 11862 {f: 7, c: 37641}, 37649, {f: 2, c: 37651}, {f: 2, c: 37654}, 11863 {f: 3, c: 37660}, 37665, {f: 3, c: 37667}, 37671, {f: 2, c: 37673}, 11864 {f: 2, c: 37676}, {f: 2, c: 37680}, {f: 2, c: 37684}, 37687, 11865 {f: 5, c: 37689}, 37695, 37698, {f: 2, c: 37700}, {f: 3, c: 37704}, 37708, 11866 {f: 6, c: 37710}, {f: 3, c: 37717}, {f: 2, c: 37721}, {f: 8, c: 37724}, 11867 {f: 3, c: 37734}, 37739, {f: 3, c: 37741}, {f: 4, c: 37745}, 11868 {f: 3, c: 37751}, {f: 3, c: 37755}, {f: 3, c: 37759}, 37763, 11869 {f: 2, c: 37765}, {f: 2, c: 37768}, {f: 4, c: 37771}, {f: 6, c: 37776}, 11870 37783, {f: 9, c: 37785}, {f: 2, c: 37796}, 37800, 37803, 37805, 37807, 11871 {f: 2, c: 37809}, 37812, {f: 2, c: 37814}, {f: 6, c: 37817}, 11872 {f: 3, c: 37824}, {f: 3, c: 37828}, 37833, 37835, {f: 3, c: 37838}, 11873 {f: 4, c: 37842}, {f: 3, c: 37849}, 37856, 37859, {f: 3, c: 37861}, 11874 {f: 12, c: 37865}, 37878, 37880, {f: 9, c: 37882}, {f: 7, c: 37892}, 11875 {f: 4, c: 37900}, 37905, {f: 3, c: 37909}, {f: 3, c: 37914}, 11876 {f: 2, c: 37918}, {f: 5, c: 37921}, {f: 5, c: 37929}, {f: 3, c: 37935}, 11877 37940, {f: 2, c: 37942}, 37945, {f: 3, c: 37947}, {f: 4, c: 37952}, 11878 {f: 5, c: 37957}, 37963, {f: 5, c: 37965}, 37971, {f: 11, c: 37973}, 11879 {f: 2, c: 37985}, 37988, {f: 5, c: 37990}, 37996, {f: 2, c: 37998}, 38001, 11880 {f: 4, c: 38003}, 38008, {f: 2, c: 38010}, {f: 5, c: 38016}, 38033, 38038, 11881 38040, 38087, 38095, {f: 2, c: 38099}, 38106, 38118, 38139, 38172, 38176, 11882 38183, 38195, 38205, 38211, 38216, 38219, 38229, 38234, 38240, 38254, 11883 {f: 2, c: 38260}, {f: 7, c: 38264}, 38273, {f: 2, c: 38276}, 11884 {f: 2, c: 38279}, 38282, 38285, 38288, 38290, {f: 3, c: 38293}, 11885 {f: 8, c: 38297}, 38306, {f: 2, c: 38310}, 38314, {f: 4, c: 38318}, 11886 {f: 3, c: 38323}, {f: 2, c: 38327}, 38330, {f: 3, c: 38336}, 11887 {f: 2, c: 38340}, 38343, 38345, {f: 3, c: 38349}, {f: 3, c: 38353}, 11888 {f: 5, c: 38359}, 38365, {f: 2, c: 38367}, {f: 2, c: 38371}, 11889 {f: 2, c: 38374}, 38380, 38399, 38407, 38419, 38424, 38427, 38430, 38432, 11890 {f: 7, c: 38435}, {f: 3, c: 38443}, {f: 2, c: 38447}, {f: 4, c: 38455}, 11891 38462, 38465, 38467, 38474, {f: 2, c: 38478}, {f: 3, c: 38481}, 11892 {f: 2, c: 38486}, {f: 2, c: 38489}, 38492, 38494, 38496, {f: 2, c: 38501}, 11893 38507, {f: 3, c: 38509}, 38513, {f: 4, c: 38521}, {f: 7, c: 38526}, 38535, 11894 38537, 38540, {f: 3, c: 38545}, 38550, 38554, {f: 10, c: 38557}, 38569, 11895 {f: 5, c: 38571}, 38578, 38581, 38583, 38586, 38591, {f: 2, c: 38594}, 11896 38600, {f: 2, c: 38602}, {f: 2, c: 38608}, {f: 2, c: 38611}, 11897 {f: 2, c: 38615}, 38618, {f: 3, c: 38621}, 38625, {f: 4, c: 38628}, 11898 {f: 4, c: 38635}, {f: 2, c: 38640}, {f: 2, c: 38644}, 38648, 38650, 11899 {f: 2, c: 38652}, 38655, {f: 2, c: 38658}, 38661, {f: 3, c: 38666}, 11900 {f: 3, c: 38672}, {f: 2, c: 38676}, {f: 5, c: 38679}, 38685, 11901 {f: 8, c: 38687}, {f: 2, c: 38696}, {f: 2, c: 38699}, {f: 2, c: 38702}, 11902 38705, {f: 5, c: 38707}, {f: 3, c: 38714}, {f: 3, c: 38719}, 38723, 11903 {f: 3, c: 38725}, {f: 8, c: 38729}, [12205, 38737], {f: 2, c: 38740}, 11904 {f: 2, c: 38743}, {f: 2, c: 38748}, 38751, {f: 2, c: 38755}, 11905 {f: 2, c: 38758}, {f: 9, c: 38762}, 38773, {f: 5, c: 38775}, 11906 {f: 8, c: 38781}, {f: 5, c: 38790}, 38796, 38798, 38800, 38803, 11907 {f: 3, c: 38805}, {f: 7, c: 38809}, {f: 2, c: 38817}, {f: 2, c: 38820}, 11908 {f: 4, c: 38823}, 38828, 38830, {f: 2, c: 38832}, 38835, {f: 8, c: 38837}, 11909 {f: 5, c: 38846}, {f: 2, c: 38852}, {f: 2, c: 38855}, 38858, 11910 {f: 6, c: 38861}, {f: 5, c: 38868}, {f: 2, c: 38874}, 38877, 11911 {f: 7, c: 38879}, 38888, {f: 5, c: 38894}, 38900, {f: 8, c: 38903}, 38912, 11912 38916, 38921, 38923, 38925, {f: 3, c: 38932}, {f: 3, c: 38937}, 11913 {f: 4, c: 38941}, {f: 2, c: 38946}, 38949, {f: 6, c: 38951}, 11914 {f: 2, c: 38958}, {f: 6, c: 38961}, {f: 2, c: 38969}, 38972, 11915 {f: 8, c: 38974}, {f: 5, c: 38983}, {f: 4, c: 38991}, {f: 3, c: 38997}, 11916 39002, {f: 2, c: 39004}, {f: 3, c: 39007}, {f: 2, c: 39011}, 39014, 11917 {f: 3, c: 39016}, {f: 2, c: 39021}, 39026, 39051, 39054, 39058, 39061, 11918 39065, 39075, {f: 5, c: 39081}, 39088, 39090, {f: 2, c: 39092}, 11919 {f: 5, c: 39095}, {f: 7, c: 39101}, 39109, 39111, {f: 5, c: 39113}, 11920 {f: 2, c: 39119}, 39124, {f: 2, c: 39126}, {f: 2, c: 39132}, 39137, 11921 {f: 4, c: 39139}, 39148, 39150, {f: 2, c: 39152}, 39155, {f: 7, c: 39157}, 11922 {f: 4, c: 39167}, 39172, {f: 3, c: 39174}, 39179, {f: 2, c: 39182}, 11923 {f: 4, c: 39188}, {f: 2, c: 39193}, {f: 2, c: 39196}, {f: 2, c: 39199}, 11924 {f: 6, c: 39202}, {f: 5, c: 39209}, {f: 4, c: 39215}, {f: 3, c: 39220}, 11925 {f: 4, c: 39224}, 39229, {f: 3, c: 39232}, 39236, {f: 2, c: 39238}, 11926 {f: 4, c: 39245}, 39251, 39254, {f: 4, c: 39256}, 39261, {f: 3, c: 39263}, 11927 39268, 39270, 39283, {f: 2, c: 39288}, 39291, 39294, {f: 2, c: 39298}, 11928 39305, 39308, 39310, {f: 11, c: 39322}, {f: 2, c: 39334}, {f: 3, c: 39337}, 11929 {f: 2, c: 39343}, 39346, {f: 12, c: 39349}, {f: 14, c: 39362}, 39379, 11930 {f: 2, c: 39382}, 39386, 39388, 39390, 39392, {f: 10, c: 39395}, 11931 {f: 3, c: 39406}, {f: 13, c: 39410}, 39424, {f: 3, c: 39426}, 11932 {f: 7, c: 39430}, {f: 6, c: 39440}, {f: 2, c: 39447}, {f: 17, c: 39450}, 11933 39468, 39471, {f: 5, c: 39473}, {f: 5, c: 39481}, 39487, {f: 4, c: 39494}, 11934 {f: 2, c: 39499}, 39502, {f: 5, c: 39504}, 39510, {f: 2, c: 39512}, 11935 {f: 3, c: 39516}, {f: 2, c: 39520}, 39523, {f: 4, c: 39526}, 39531, 39538, 11936 39555, 39561, {f: 2, c: 39565}, {f: 2, c: 39572}, 39577, 39590, 11937 {f: 6, c: 39593}, {f: 4, c: 39602}, 39609, 39611, {f: 3, c: 39613}, 11938 {f: 2, c: 39619}, {f: 5, c: 39622}, {f: 2, c: 39629}, 39632, 39639, 11939 {f: 6, c: 39641}, 39648, {f: 4, c: 39650}, {f: 4, c: 39655}, 39660, 11940 {f: 9, c: 39664}, 39674, {f: 7, c: 39676}, {f: 2, c: 39684}, 39687, 11941 {f: 4, c: 39689}, 39694, {f: 3, c: 39696}, {f: 6, c: 39700}, 11942 {f: 4, c: 39707}, {f: 2, c: 39712}, 39716, 39718, 39720, {f: 4, c: 39722}, 11943 39728, {f: 8, c: 39731}, {f: 4, c: 39741}, 39750, {f: 3, c: 39754}, 39760, 11944 {f: 2, c: 39762}, {f: 3, c: 39765}, 39769, {f: 20, c: 39771}, 11945 {f: 4, c: 39792}, {f: 2, c: 39797}, {f: 9, c: 39800}, 39810, 11946 {f: 10, c: 39812}, 39823, {f: 7, c: 39827}, {f: 2, c: 39835}, 11947 {f: 11, c: 39839}, 39852, {f: 17, c: 39855}, {f: 5, c: 39874}, 39880, 11948 {f: 9, c: 39883}, 39893, {f: 4, c: 39895}, 39900, {f: 3, c: 39902}, 39907, 11949 {f: 2, c: 39909}, 39913, {f: 4, c: 39916}, {f: 3, c: 39921}, 11950 {f: 8, c: 39925}, 39934, {f: 8, c: 39936}, {f: 3, c: 39946}, 11951 {f: 2, c: 39950}, 39953, {f: 12, c: 39956}, {f: 2, c: 39969}, 39972, 11952 {f: 2, c: 39974}, {f: 3, c: 39978}, {f: 3, c: 39982}, 39988, 39990, 39992, 11953 39994, {f: 2, c: 39996}, {f: 6, c: 39999}, {f: 2, c: 40006}, 11954 {f: 8, c: 40010}, 40019, 40021, {f: 4, c: 40025}, 40030, {f: 7, c: 40032}, 11955 {f: 5, c: 40040}, {f: 10, c: 40046}, 40057, 40059, {f: 2, c: 40061}, 40064, 11956 {f: 2, c: 40067}, {f: 2, c: 40073}, 40076, 40079, 40083, {f: 4, c: 40086}, 11957 40093, 40106, 40108, 40111, 40121, {f: 5, c: 40126}, {f: 2, c: 40136}, 11958 {f: 2, c: 40145}, {f: 2, c: 40154}, {f: 2, c: 40160}, {f: 2, c: 40163}, 11959 {f: 3, c: 40166}, {f: 2, c: 40170}, {f: 6, c: 40173}, 40181, 11960 {f: 15, c: 40183}, 40200, {f: 11, c: 40202}, {f: 5, c: 40214}, 40220, 11961 40222, {f: 3, c: 40224}, {f: 2, c: 40228}, 40231, {f: 6, c: 40233}, 11962 {f: 10, c: 40241}, {f: 3, c: 40252}, {f: 2, c: 40256}, {f: 14, c: 40259}, 11963 {f: 8, c: 40276}, {f: 2, c: 40286}, {f: 8, c: 40290}, 40299, 11964 {f: 2, c: 40301}, {f: 2, c: 40304}, {f: 20, c: 40307}, 40328, 11965 {f: 9, c: 40330}, {f: 4, c: 40340}, 40345, {f: 10, c: 40347}, 11966 {f: 3, c: 40358}, {f: 5, c: 40362}, {f: 4, c: 40368}, {f: 6, c: 40373}, 11967 {f: 3, c: 40381}, 40385, 40387, {f: 14, c: 40389}, {f: 3, c: 40404}, 40408, 11968 {f: 10, c: 40411}, {f: 8, c: 40423}, {f: 2, c: 40432}, {f: 4, c: 40436}, 11969 {f: 17, c: 40443}, {f: 8, c: 40461}, {f: 4, c: 40470}, 40476, 40484, 40487, 11970 40494, 40496, 40500, {f: 2, c: 40507}, 40512, 40525, 40528, 11971 {f: 3, c: 40530}, 40534, 40537, 40541, {f: 4, c: 40543}, 40549, 11972 {f: 2, c: 40558}, 40562, 40564, {f: 3, c: 40566}, 40571, {f: 2, c: 40576}, 11973 {f: 4, c: 40579}, {f: 2, c: 40585}, {f: 6, c: 40588}, {f: 3, c: 40596}, 11974 {f: 5, c: 40600}, 40606, {f: 5, c: 40608}, {f: 2, c: 40615}, 11975 {f: 5, c: 40618}, {f: 4, c: 40624}, {f: 2, c: 40630}, {f: 2, c: 40633}, 11976 40636, {f: 4, c: 40639}, [12232, 40643], {f: 4, c: 40645}, 11977 {f: 2, c: 40650}, 40656, {f: 2, c: 40658}, {f: 3, c: 40661}, 11978 {f: 2, c: 40665}, 40673, {f: 2, c: 40675}, 40678, {f: 4, c: 40683}, 11979 {f: 2, c: 40688}, 40691, {f: 2, c: 40693}, 40696, 40698, {f: 9, c: 40704}, 11980 40714, 40716, 40719, {f: 2, c: 40721}, 40724, 40726, 40728, 11981 {f: 6, c: 40730}, 40737, {f: 9, c: 40739}, {f: 2, c: 40749}, 11982 {f: 7, c: 40752}, 40760, 40762, 40764, {f: 5, c: 40767}, {f: 5, c: 40773}, 11983 {f: 3, c: 40780}, 40787, {f: 4, c: 40789}, {f: 2, c: 40794}, 11984 {f: 2, c: 40797}, 40802, {f: 2, c: 40804}, {f: 3, c: 40807}, 40811, 11985 {f: 5, c: 40813}, {f: 4, c: 40819}, {f: 7, c: 40824}, {f: 2, c: 40833}, 11986 {f: 2, c: 40846}, {f: 3, c: 40849}, {f: 3, c: 40854}, {f: 2, c: 40861}, 11987 {f: 5, c: 40865}, 63788, {f: 3, c: 64013}, 64017, {f: 2, c: 64019}, 64024, 11988 {f: 3, c: 64031}, {f: 2, c: 64035}, {f: 3, c: 64039}, 11905, 11989 [59414, 131207], [59415, 131209], [59416, 131276], 11908, 13427, 13383, 11990 11912, 11915, 59422, 13726, 13850, 13838, 11916, 11927, 14702, 14616, 11991 59430, 14799, 14815, 14963, 14800, {f: 2, c: 59435}, 15182, 15470, 15584, 11992 11943, [59441, 136663], 59442, 11946, 16470, 16735, 11950, 17207, 11955, 11993 {f: 2, c: 11958}, [59451, 141711], 17329, 17324, 11963, 17373, 17622, 11994 18017, 17996, [59459, 132361], 18211, 18217, 18300, 18317, 11978, 18759, 11995 18810, 18813, {f: 2, c: 18818}, {f: 2, c: 18821}, 18847, 18843, 18871, 11996 18870, [59476, 133533], [59477, 147966], 19619, {f: 3, c: 19615}, 19575, 11997 19618, {f: 7, c: 19731}, 19886, 59492, {s: 226}, 8364, 165, 0, 0, 12351, 11998 {s: 17}, 12436, {s: 14}, 12535, 12537, 12536, 12538, 0, {f: 3, c: 12339}, 11999 {f: 3, c: 12344}, {f: 3, c: 12586}, {f: 24, c: 12704}, 11904, 12000 {f: 2, c: 11906}, {f: 3, c: 11909}, {f: 2, c: 11913}, {f: 10, c: 11917}, 12001 {f: 2, c: 11928}, {f: 12, c: 11931}, {f: 2, c: 11944}, {f: 3, c: 11947}, 12002 {f: 4, c: 11951}, {f: 2, c: 11956}, {f: 3, c: 11960}, {f: 14, c: 11964}, 12003 {f: 41, c: 11979}, {f: 71, c: 13312}, {f: 43, c: 13384}, 12004 {f: 298, c: 13428}, {f: 111, c: 13727}, {f: 11, c: 13839}, 12005 {f: 765, c: 13851}, {f: 85, c: 14617}, {f: 96, c: 14703}, 12006 {f: 14, c: 14801}, {f: 147, c: 14816}, {f: 218, c: 14964}, 12007 {f: 287, c: 15183}, {f: 113, c: 15471}, {f: 885, c: 15585}, 12008 {f: 264, c: 16471}, {f: 471, c: 16736}, {f: 116, c: 17208}, 12009 {f: 4, c: 17325}, {f: 43, c: 17330}, {f: 248, c: 17374}, 12010 {f: 373, c: 17623}, {f: 20, c: 17997}, {f: 193, c: 18018}, 12011 {f: 5, c: 18212}, {f: 82, c: 18218}, {f: 16, c: 18301}, {f: 441, c: 18318}, 12012 {f: 50, c: 18760}, {f: 2, c: 18811}, {f: 4, c: 18814}, 18820, 12013 {f: 20, c: 18823}, {f: 3, c: 18844}, {f: 22, c: 18848}, {f: 703, c: 18872}, 12014 {f: 39, c: 19576}, {f: 111, c: 19620}, {f: 148, c: 19738}, 12015 {f: 7, c: 19887}] 12016 }; 12017 12018 12019 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 12020 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ 12021 12022 'use strict'; 12023 12024 var ColorSpace = (function ColorSpaceClosure() { 12025 // Constructor should define this.numComps, this.defaultColor, this.name 12026 function ColorSpace() { 12027 error('should not call ColorSpace constructor'); 12028 } 12029 12030 ColorSpace.prototype = { 12031 // Input: array of size numComps representing color component values 12032 // Output: array of rgb values, each value ranging from [0.1] 12033 getRgb: function ColorSpace_getRgb(color) { 12034 error('Should not call ColorSpace.getRgb: ' + color); 12035 }, 12036 // Input: Uint8Array of component values, each value scaled to [0,255] 12037 // Output: Uint8Array of rgb values, each value scaled to [0,255] 12038 getRgbBuffer: function ColorSpace_getRgbBuffer(input) { 12039 error('Should not call ColorSpace.getRgbBuffer: ' + input); 12040 } 12041 }; 12042 12043 ColorSpace.parse = function ColorSpace_parse(cs, xref, res) { 12044 var IR = ColorSpace.parseToIR(cs, xref, res); 12045 if (IR instanceof AlternateCS) 12046 return IR; 12047 12048 return ColorSpace.fromIR(IR); 12049 }; 12050 12051 ColorSpace.fromIR = function ColorSpace_fromIR(IR) { 12052 var name = isArray(IR) ? IR[0] : IR; 12053 12054 switch (name) { 12055 case 'DeviceGrayCS': 12056 return new DeviceGrayCS(); 12057 case 'DeviceRgbCS': 12058 return new DeviceRgbCS(); 12059 case 'DeviceCmykCS': 12060 return new DeviceCmykCS(); 12061 case 'PatternCS': 12062 var basePatternCS = IR[1]; 12063 if (basePatternCS) 12064 basePatternCS = ColorSpace.fromIR(basePatternCS); 12065 return new PatternCS(basePatternCS); 12066 case 'IndexedCS': 12067 var baseIndexedCS = IR[1]; 12068 var hiVal = IR[2]; 12069 var lookup = IR[3]; 12070 return new IndexedCS(ColorSpace.fromIR(baseIndexedCS), hiVal, lookup); 12071 case 'AlternateCS': 12072 var numComps = IR[1]; 12073 var alt = IR[2]; 12074 var tintFnIR = IR[3]; 12075 12076 return new AlternateCS(numComps, ColorSpace.fromIR(alt), 12077 PDFFunction.fromIR(tintFnIR)); 12078 case 'LabCS': 12079 var whitePoint = IR[1].WhitePoint; 12080 var blackPoint = IR[1].BlackPoint; 12081 var range = IR[1].Range; 12082 return new LabCS(whitePoint, blackPoint, range); 12083 default: 12084 error('Unkown name ' + name); 12085 } 12086 return null; 12087 }; 12088 12089 ColorSpace.parseToIR = function ColorSpace_parseToIR(cs, xref, res) { 12090 if (isName(cs)) { 12091 var colorSpaces = res.get('ColorSpace'); 12092 if (isDict(colorSpaces)) { 12093 var refcs = colorSpaces.get(cs.name); 12094 if (refcs) 12095 cs = refcs; 12096 } 12097 } 12098 12099 cs = xref.fetchIfRef(cs); 12100 var mode; 12101 12102 if (isName(cs)) { 12103 mode = cs.name; 12104 this.mode = mode; 12105 12106 switch (mode) { 12107 case 'DeviceGray': 12108 case 'G': 12109 return 'DeviceGrayCS'; 12110 case 'DeviceRGB': 12111 case 'RGB': 12112 return 'DeviceRgbCS'; 12113 case 'DeviceCMYK': 12114 case 'CMYK': 12115 return 'DeviceCmykCS'; 12116 case 'Pattern': 12117 return ['PatternCS', null]; 12118 default: 12119 error('unrecognized colorspace ' + mode); 12120 } 12121 } else if (isArray(cs)) { 12122 mode = cs[0].name; 12123 this.mode = mode; 12124 12125 switch (mode) { 12126 case 'DeviceGray': 12127 case 'G': 12128 return 'DeviceGrayCS'; 12129 case 'DeviceRGB': 12130 case 'RGB': 12131 return 'DeviceRgbCS'; 12132 case 'DeviceCMYK': 12133 case 'CMYK': 12134 return 'DeviceCmykCS'; 12135 case 'CalGray': 12136 return 'DeviceGrayCS'; 12137 case 'CalRGB': 12138 return 'DeviceRgbCS'; 12139 case 'ICCBased': 12140 var stream = xref.fetchIfRef(cs[1]); 12141 var dict = stream.dict; 12142 var numComps = dict.get('N'); 12143 if (numComps == 1) 12144 return 'DeviceGrayCS'; 12145 if (numComps == 3) 12146 return 'DeviceRgbCS'; 12147 if (numComps == 4) 12148 return 'DeviceCmykCS'; 12149 break; 12150 case 'Pattern': 12151 var basePatternCS = cs[1]; 12152 if (basePatternCS) 12153 basePatternCS = ColorSpace.parseToIR(basePatternCS, xref, res); 12154 return ['PatternCS', basePatternCS]; 12155 case 'Indexed': 12156 case 'I': 12157 var baseIndexedCS = ColorSpace.parseToIR(cs[1], xref, res); 12158 var hiVal = cs[2] + 1; 12159 var lookup = xref.fetchIfRef(cs[3]); 12160 return ['IndexedCS', baseIndexedCS, hiVal, lookup]; 12161 case 'Separation': 12162 case 'DeviceN': 12163 var name = cs[1]; 12164 var numComps = 1; 12165 if (isName(name)) 12166 numComps = 1; 12167 else if (isArray(name)) 12168 numComps = name.length; 12169 var alt = ColorSpace.parseToIR(cs[2], xref, res); 12170 var tintFnIR = PDFFunction.getIR(xref, xref.fetchIfRef(cs[3])); 12171 return ['AlternateCS', numComps, alt, tintFnIR]; 12172 case 'Lab': 12173 var params = cs[1].getAll(); 12174 return ['LabCS', params]; 12175 default: 12176 error('unimplemented color space object "' + mode + '"'); 12177 } 12178 } else { 12179 error('unrecognized color space object: "' + cs + '"'); 12180 } 12181 return null; 12182 }; 12183 /** 12184 * Checks if a decode map matches the default decode map for a color space. 12185 * This handles the general decode maps where there are two values per 12186 * component. e.g. [0, 1, 0, 1, 0, 1] for a RGB color. 12187 * This does not handle Lab, Indexed, or Pattern decode maps since they are 12188 * slightly different. 12189 * @param {Array} decode Decode map (usually from an image). 12190 * @param {Number} n Number of components the color space has. 12191 */ 12192 ColorSpace.isDefaultDecode = function ColorSpace_isDefaultDecode(decode, n) { 12193 if (!decode) 12194 return true; 12195 12196 if (n * 2 !== decode.length) { 12197 warning('The decode map is not the correct length'); 12198 return true; 12199 } 12200 for (var i = 0, ii = decode.length; i < ii; i += 2) { 12201 if (decode[i] != 0 || decode[i + 1] != 1) 12202 return false; 12203 } 12204 return true; 12205 }; 12206 12207 return ColorSpace; 12208 })(); 12209 12210 /** 12211 * Alternate color space handles both Separation and DeviceN color spaces. A 12212 * Separation color space is actually just a DeviceN with one color component. 12213 * Both color spaces use a tinting function to convert colors to a base color 12214 * space. 12215 */ 12216 var AlternateCS = (function AlternateCSClosure() { 12217 function AlternateCS(numComps, base, tintFn) { 12218 this.name = 'Alternate'; 12219 this.numComps = numComps; 12220 this.defaultColor = []; 12221 for (var i = 0; i < numComps; ++i) 12222 this.defaultColor.push(1); 12223 this.base = base; 12224 this.tintFn = tintFn; 12225 } 12226 12227 AlternateCS.prototype = { 12228 getRgb: function AlternateCS_getRgb(color) { 12229 var tinted = this.tintFn(color); 12230 return this.base.getRgb(tinted); 12231 }, 12232 getRgbBuffer: function AlternateCS_getRgbBuffer(input, bits) { 12233 var tintFn = this.tintFn; 12234 var base = this.base; 12235 var scale = 1 / ((1 << bits) - 1); 12236 var length = input.length; 12237 var pos = 0; 12238 var baseNumComps = base.numComps; 12239 var baseBuf = new Uint8Array(baseNumComps * length); 12240 var numComps = this.numComps; 12241 var scaled = []; 12242 12243 for (var i = 0; i < length; i += numComps) { 12244 for (var z = 0; z < numComps; ++z) 12245 scaled[z] = input[i + z] * scale; 12246 12247 var tinted = tintFn(scaled); 12248 for (var j = 0; j < baseNumComps; ++j) 12249 baseBuf[pos++] = 255 * tinted[j]; 12250 } 12251 return base.getRgbBuffer(baseBuf, 8); 12252 }, 12253 isDefaultDecode: function AlternateCS_isDefaultDecode(decodeMap) { 12254 return ColorSpace.isDefaultDecode(decodeMap, this.numComps); 12255 } 12256 }; 12257 12258 return AlternateCS; 12259 })(); 12260 12261 var PatternCS = (function PatternCSClosure() { 12262 function PatternCS(baseCS) { 12263 this.name = 'Pattern'; 12264 this.base = baseCS; 12265 } 12266 PatternCS.prototype = {}; 12267 12268 return PatternCS; 12269 })(); 12270 12271 var IndexedCS = (function IndexedCSClosure() { 12272 function IndexedCS(base, highVal, lookup) { 12273 this.name = 'Indexed'; 12274 this.numComps = 1; 12275 this.defaultColor = [0]; 12276 this.base = base; 12277 this.highVal = highVal; 12278 12279 var baseNumComps = base.numComps; 12280 var length = baseNumComps * highVal; 12281 var lookupArray = new Uint8Array(length); 12282 12283 if (isStream(lookup)) { 12284 var bytes = lookup.getBytes(length); 12285 lookupArray.set(bytes); 12286 } else if (isString(lookup)) { 12287 for (var i = 0; i < length; ++i) 12288 lookupArray[i] = lookup.charCodeAt(i); 12289 } else { 12290 error('Unrecognized lookup table: ' + lookup); 12291 } 12292 this.lookup = lookupArray; 12293 } 12294 12295 IndexedCS.prototype = { 12296 getRgb: function IndexedCS_getRgb(color) { 12297 var numComps = this.base.numComps; 12298 var start = color[0] * numComps; 12299 var c = []; 12300 12301 for (var i = start, ii = start + numComps; i < ii; ++i) 12302 c.push(this.lookup[i]); 12303 12304 return this.base.getRgb(c); 12305 }, 12306 getRgbBuffer: function IndexedCS_getRgbBuffer(input) { 12307 var base = this.base; 12308 var numComps = base.numComps; 12309 var lookup = this.lookup; 12310 var length = input.length; 12311 var baseBuf = new Uint8Array(length * numComps); 12312 var baseBufPos = 0; 12313 12314 for (var i = 0; i < length; ++i) { 12315 var lookupPos = input[i] * numComps; 12316 for (var j = 0; j < numComps; ++j) { 12317 baseBuf[baseBufPos++] = lookup[lookupPos + j]; 12318 } 12319 } 12320 12321 return base.getRgbBuffer(baseBuf, 8); 12322 }, 12323 isDefaultDecode: function IndexedCS_isDefaultDecode(decodeMap) { 12324 // indexed color maps shouldn't be changed 12325 return true; 12326 } 12327 }; 12328 return IndexedCS; 12329 })(); 12330 12331 var DeviceGrayCS = (function DeviceGrayCSClosure() { 12332 function DeviceGrayCS() { 12333 this.name = 'DeviceGray'; 12334 this.numComps = 1; 12335 this.defaultColor = [0]; 12336 } 12337 12338 DeviceGrayCS.prototype = { 12339 getRgb: function DeviceGrayCS_getRgb(color) { 12340 var c = color[0]; 12341 return [c, c, c]; 12342 }, 12343 getRgbBuffer: function DeviceGrayCS_getRgbBuffer(input, bits) { 12344 var scale = 255 / ((1 << bits) - 1); 12345 var length = input.length; 12346 var rgbBuf = new Uint8Array(length * 3); 12347 for (var i = 0, j = 0; i < length; ++i) { 12348 var c = (scale * input[i]) | 0; 12349 rgbBuf[j++] = c; 12350 rgbBuf[j++] = c; 12351 rgbBuf[j++] = c; 12352 } 12353 return rgbBuf; 12354 }, 12355 isDefaultDecode: function DeviceGrayCS_isDefaultDecode(decodeMap) { 12356 return ColorSpace.isDefaultDecode(decodeMap, this.numComps); 12357 } 12358 }; 12359 return DeviceGrayCS; 12360 })(); 12361 12362 var DeviceRgbCS = (function DeviceRgbCSClosure() { 12363 function DeviceRgbCS() { 12364 this.name = 'DeviceRGB'; 12365 this.numComps = 3; 12366 this.defaultColor = [0, 0, 0]; 12367 } 12368 DeviceRgbCS.prototype = { 12369 getRgb: function DeviceRgbCS_getRgb(color) { 12370 return color; 12371 }, 12372 getRgbBuffer: function DeviceRgbCS_getRgbBuffer(input, bits) { 12373 if (bits == 8) 12374 return input; 12375 var scale = 255 / ((1 << bits) - 1); 12376 var i, length = input.length; 12377 var rgbBuf = new Uint8Array(length); 12378 for (i = 0; i < length; ++i) 12379 rgbBuf[i] = (scale * input[i]) | 0; 12380 return rgbBuf; 12381 }, 12382 isDefaultDecode: function DeviceRgbCS_isDefaultDecode(decodeMap) { 12383 return ColorSpace.isDefaultDecode(decodeMap, this.numComps); 12384 } 12385 }; 12386 return DeviceRgbCS; 12387 })(); 12388 12389 var DeviceCmykCS = (function DeviceCmykCSClosure() { 12390 function DeviceCmykCS() { 12391 this.name = 'DeviceCMYK'; 12392 this.numComps = 4; 12393 this.defaultColor = [0, 0, 0, 1]; 12394 } 12395 DeviceCmykCS.prototype = { 12396 getRgb: function DeviceCmykCS_getRgb(color) { 12397 var c = color[0], m = color[1], y = color[2], k = color[3]; 12398 12399 // CMYK -> CMY: http://www.easyrgb.com/index.php?X=MATH&H=14#text14 12400 c = (c * (1 - k) + k); 12401 m = (m * (1 - k) + k); 12402 y = (y * (1 - k) + k); 12403 12404 // CMY -> RGB: http://www.easyrgb.com/index.php?X=MATH&H=12#text12 12405 var r = (1 - c); 12406 var g = (1 - m); 12407 var b = (1 - y); 12408 12409 return [r, g, b]; 12410 }, 12411 getRgbBuffer: function DeviceCmykCS_getRgbBuffer(colorBuf, bits) { 12412 var scale = 1 / ((1 << bits) - 1); 12413 var length = colorBuf.length / 4; 12414 var rgbBuf = new Uint8Array(length * 3); 12415 var rgbBufPos = 0; 12416 var colorBufPos = 0; 12417 12418 for (var i = 0; i < length; i++) { 12419 var cmyk = []; 12420 for (var j = 0; j < 4; ++j) 12421 cmyk.push(scale * colorBuf[colorBufPos++]); 12422 12423 var rgb = this.getRgb(cmyk); 12424 for (var j = 0; j < 3; ++j) 12425 rgbBuf[rgbBufPos++] = Math.round(rgb[j] * 255); 12426 } 12427 12428 return rgbBuf; 12429 }, 12430 isDefaultDecode: function DeviceCmykCS_isDefaultDecode(decodeMap) { 12431 return ColorSpace.isDefaultDecode(decodeMap, this.numComps); 12432 } 12433 }; 12434 12435 return DeviceCmykCS; 12436 })(); 12437 12438 // 12439 // LabCS: Based on "PDF Reference, Sixth Ed", p.250 12440 // 12441 var LabCS = (function LabCSClosure() { 12442 function LabCS(whitePoint, blackPoint, range) { 12443 this.name = 'Lab'; 12444 this.numComps = 3; 12445 this.defaultColor = [0, 0, 0]; 12446 12447 if (!whitePoint) 12448 error('WhitePoint missing - required for color space Lab'); 12449 blackPoint = blackPoint || [0, 0, 0]; 12450 range = range || [-100, 100, -100, 100]; 12451 12452 // Translate args to spec variables 12453 this.XW = whitePoint[0]; 12454 this.YW = whitePoint[1]; 12455 this.ZW = whitePoint[2]; 12456 this.amin = range[0]; 12457 this.amax = range[1]; 12458 this.bmin = range[2]; 12459 this.bmax = range[3]; 12460 12461 // These are here just for completeness - the spec doesn't offer any 12462 // formulas that use BlackPoint in Lab 12463 this.XB = blackPoint[0]; 12464 this.YB = blackPoint[1]; 12465 this.ZB = blackPoint[2]; 12466 12467 // Validate vars as per spec 12468 if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) 12469 error('Invalid WhitePoint components, no fallback available'); 12470 12471 if (this.XB < 0 || this.YB < 0 || this.ZB < 0) { 12472 warn('Invalid BlackPoint, falling back to default'); 12473 this.XB = this.YB = this.ZB = 0; 12474 } 12475 12476 if (this.amin > this.amax || this.bmin > this.bmax) { 12477 warn('Invalid Range, falling back to defaults'); 12478 this.amin = -100; 12479 this.amax = 100; 12480 this.bmin = -100; 12481 this.bmax = 100; 12482 } 12483 }; 12484 12485 // Function g(x) from spec 12486 function g(x) { 12487 if (x >= 6 / 29) 12488 return x * x * x; 12489 else 12490 return (108 / 841) * (x - 4 / 29); 12491 } 12492 12493 LabCS.prototype = { 12494 getRgb: function LabCS_getRgb(color) { 12495 // Ls,as,bs <---> L*,a*,b* in the spec 12496 var Ls = color[0], as = color[1], bs = color[2]; 12497 12498 // Adjust limits of 'as' and 'bs' 12499 as = as > this.amax ? this.amax : as; 12500 as = as < this.amin ? this.amin : as; 12501 bs = bs > this.bmax ? this.bmax : bs; 12502 bs = bs < this.bmin ? this.bmin : bs; 12503 12504 // Computes intermediate variables X,Y,Z as per spec 12505 var M = (Ls + 16) / 116; 12506 var L = M + (as / 500); 12507 var N = M - (bs / 200); 12508 var X = this.XW * g(L); 12509 var Y = this.YW * g(M); 12510 var Z = this.ZW * g(N); 12511 12512 // XYZ to RGB 3x3 matrix, from: 12513 // http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC18 12514 var XYZtoRGB = [3.240479, -1.537150, -0.498535, 12515 -0.969256, 1.875992, 0.041556, 12516 0.055648, -0.204043, 1.057311]; 12517 12518 return Util.apply3dTransform(XYZtoRGB, [X, Y, Z]); 12519 }, 12520 getRgbBuffer: function LabCS_getRgbBuffer(input, bits) { 12521 if (bits == 8) 12522 return input; 12523 var scale = 255 / ((1 << bits) - 1); 12524 var i, length = input.length / 3; 12525 var rgbBuf = new Uint8Array(length); 12526 12527 var j = 0; 12528 for (i = 0; i < length; ++i) { 12529 // Convert L*, a*, s* into RGB 12530 var rgb = this.getRgb([input[i], input[i + 1], input[i + 2]]); 12531 rgbBuf[j++] = rgb[0]; 12532 rgbBuf[j++] = rgb[1]; 12533 rgbBuf[j++] = rgb[2]; 12534 } 12535 12536 return rgbBuf; 12537 }, 12538 isDefaultDecode: function LabCS_isDefaultDecode(decodeMap) { 12539 // From Table 90 in Adobe's: 12540 // "Document management - Portable document format", 1st ed, 2008 12541 if (decodeMap[0] === 0 && decodeMap[1] === 100 && 12542 decodeMap[2] === this.amin && decodeMap[3] === this.amax && 12543 decodeMap[4] === this.bmin && decodeMap[5] === this.bmax) 12544 return true; 12545 else 12546 return false; 12547 } 12548 }; 12549 return LabCS; 12550 })(); 12551 12552 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 12553 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ 12554 12555 'use strict'; 12556 12557 var ARCFourCipher = (function ARCFourCipherClosure() { 12558 function ARCFourCipher(key) { 12559 this.a = 0; 12560 this.b = 0; 12561 var s = new Uint8Array(256); 12562 var i, j = 0, tmp, keyLength = key.length; 12563 for (i = 0; i < 256; ++i) 12564 s[i] = i; 12565 for (i = 0; i < 256; ++i) { 12566 tmp = s[i]; 12567 j = (j + tmp + key[i % keyLength]) & 0xFF; 12568 s[i] = s[j]; 12569 s[j] = tmp; 12570 } 12571 this.s = s; 12572 } 12573 12574 ARCFourCipher.prototype = { 12575 encryptBlock: function ARCFourCipher_encryptBlock(data) { 12576 var i, n = data.length, tmp, tmp2; 12577 var a = this.a, b = this.b, s = this.s; 12578 var output = new Uint8Array(n); 12579 for (i = 0; i < n; ++i) { 12580 a = (a + 1) & 0xFF; 12581 tmp = s[a]; 12582 b = (b + tmp) & 0xFF; 12583 tmp2 = s[b]; 12584 s[a] = tmp2; 12585 s[b] = tmp; 12586 output[i] = data[i] ^ s[(tmp + tmp2) & 0xFF]; 12587 } 12588 this.a = a; 12589 this.b = b; 12590 return output; 12591 } 12592 }; 12593 ARCFourCipher.prototype.decryptBlock = ARCFourCipher.prototype.encryptBlock; 12594 12595 return ARCFourCipher; 12596 })(); 12597 12598 var calculateMD5 = (function calculateMD5Closure() { 12599 var r = new Uint8Array([ 12600 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 12601 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 12602 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 12603 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]); 12604 12605 var k = new Int32Array([ 12606 -680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426, 12607 -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162, 12608 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632, 12609 643717713, -373897302, -701558691, 38016083, -660478335, -405537848, 12610 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784, 12611 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556, 12612 -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222, 12613 -722521979, 76029189, -640364487, -421815835, 530742520, -995338651, 12614 -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606, 12615 -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649, 12616 -145523070, -1120210379, 718787259, -343485551]); 12617 12618 function hash(data, offset, length) { 12619 var h0 = 1732584193, h1 = -271733879, h2 = -1732584194, h3 = 271733878; 12620 // pre-processing 12621 var paddedLength = (length + 72) & ~63; // data + 9 extra bytes 12622 var padded = new Uint8Array(paddedLength); 12623 var i, j, n; 12624 for (i = 0; i < length; ++i) 12625 padded[i] = data[offset++]; 12626 padded[i++] = 0x80; 12627 n = paddedLength - 8; 12628 while (i < n) 12629 padded[i++] = 0; 12630 padded[i++] = (length << 3) & 0xFF; 12631 padded[i++] = (length >> 5) & 0xFF; 12632 padded[i++] = (length >> 13) & 0xFF; 12633 padded[i++] = (length >> 21) & 0xFF; 12634 padded[i++] = (length >>> 29) & 0xFF; 12635 padded[i++] = 0; 12636 padded[i++] = 0; 12637 padded[i++] = 0; 12638 // chunking 12639 // TODO ArrayBuffer ? 12640 var w = new Int32Array(16); 12641 for (i = 0; i < paddedLength;) { 12642 for (j = 0; j < 16; ++j, i += 4) { 12643 w[j] = (padded[i] | (padded[i + 1] << 8) | 12644 (padded[i + 2] << 16) | (padded[i + 3] << 24)); 12645 } 12646 var a = h0, b = h1, c = h2, d = h3, f, g; 12647 for (j = 0; j < 64; ++j) { 12648 if (j < 16) { 12649 f = (b & c) | ((~b) & d); 12650 g = j; 12651 } else if (j < 32) { 12652 f = (d & b) | ((~d) & c); 12653 g = (5 * j + 1) & 15; 12654 } else if (j < 48) { 12655 f = b ^ c ^ d; 12656 g = (3 * j + 5) & 15; 12657 } else { 12658 f = c ^ (b | (~d)); 12659 g = (7 * j) & 15; 12660 } 12661 var tmp = d, rotateArg = (a + f + k[j] + w[g]) | 0, rotate = r[j]; 12662 d = c; 12663 c = b; 12664 b = (b + ((rotateArg << rotate) | (rotateArg >>> (32 - rotate)))) | 0; 12665 a = tmp; 12666 } 12667 h0 = (h0 + a) | 0; 12668 h1 = (h1 + b) | 0; 12669 h2 = (h2 + c) | 0; 12670 h3 = (h3 + d) | 0; 12671 } 12672 return new Uint8Array([ 12673 h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >>> 24) & 0xFF, 12674 h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >>> 24) & 0xFF, 12675 h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >>> 24) & 0xFF, 12676 h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >>> 24) & 0xFF 12677 ]); 12678 } 12679 return hash; 12680 })(); 12681 12682 var NullCipher = (function NullCipherClosure() { 12683 function NullCipher() { 12684 } 12685 12686 NullCipher.prototype = { 12687 decryptBlock: function NullCipher_decryptBlock(data) { 12688 return data; 12689 } 12690 }; 12691 12692 return NullCipher; 12693 })(); 12694 12695 var AES128Cipher = (function AES128CipherClosure() { 12696 var rcon = new Uint8Array([ 12697 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 12698 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 12699 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 12700 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 12701 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 12702 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 12703 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 12704 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 12705 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 12706 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 12707 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 12708 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 12709 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 12710 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 12711 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 12712 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 12713 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 12714 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 12715 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 12716 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 12717 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 12718 0x74, 0xe8, 0xcb, 0x8d]); 12719 12720 var s = new Uint8Array([ 12721 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 12722 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 12723 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 12724 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 12725 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 12726 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 12727 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 12728 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 12729 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 12730 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 12731 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 12732 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 12733 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 12734 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 12735 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 12736 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 12737 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 12738 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 12739 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 12740 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 12741 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 12742 0xb0, 0x54, 0xbb, 0x16]); 12743 12744 var inv_s = new Uint8Array([ 12745 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 12746 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 12747 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 12748 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 12749 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 12750 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 12751 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 12752 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 12753 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 12754 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 12755 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 12756 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 12757 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 12758 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 12759 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 12760 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 12761 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 12762 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 12763 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 12764 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 12765 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 12766 0x55, 0x21, 0x0c, 0x7d]); 12767 12768 var mix = new Uint32Array([ 12769 0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 12770 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 12771 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 12772 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 12773 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 12774 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 12775 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 12776 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 12777 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 12778 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 12779 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 12780 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 12781 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 12782 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 12783 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 12784 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 12785 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 12786 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 12787 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 12788 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 12789 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 12790 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 12791 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 12792 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 12793 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 12794 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 12795 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 12796 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 12797 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 12798 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 12799 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 12800 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 12801 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 12802 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 12803 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 12804 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 12805 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 12806 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 12807 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 12808 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 12809 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 12810 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 12811 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]); 12812 12813 function expandKey128(cipherKey) { 12814 var b = 176, result = new Uint8Array(b); 12815 result.set(cipherKey); 12816 for (var j = 16, i = 1; j < b; ++i) { 12817 // RotWord 12818 var t1 = result[j - 3], t2 = result[j - 2], 12819 t3 = result[j - 1], t4 = result[j - 4]; 12820 // SubWord 12821 t1 = s[t1]; t2 = s[t2]; t3 = s[t3]; t4 = s[t4]; 12822 // Rcon 12823 t1 = t1 ^ rcon[i]; 12824 for (var n = 0; n < 4; ++n) { 12825 result[j] = (t1 ^= result[j - 16]); j++; 12826 result[j] = (t2 ^= result[j - 16]); j++; 12827 result[j] = (t3 ^= result[j - 16]); j++; 12828 result[j] = (t4 ^= result[j - 16]); j++; 12829 } 12830 } 12831 return result; 12832 } 12833 12834 function decrypt128(input, key) { 12835 var state = new Uint8Array(16); 12836 state.set(input); 12837 var i, j, k; 12838 var t, u, v; 12839 // AddRoundKey 12840 for (j = 0, k = 160; j < 16; ++j, ++k) 12841 state[j] ^= key[k]; 12842 for (i = 9; i >= 1; --i) { 12843 // InvShiftRows 12844 t = state[13]; state[13] = state[9]; state[9] = state[5]; 12845 state[5] = state[1]; state[1] = t; 12846 t = state[14]; u = state[10]; state[14] = state[6]; 12847 state[10] = state[2]; state[6] = t; state[2] = u; 12848 t = state[15]; u = state[11]; v = state[7]; state[15] = state[3]; 12849 state[11] = t; state[7] = u; state[3] = v; 12850 // InvSubBytes 12851 for (j = 0; j < 16; ++j) 12852 state[j] = inv_s[state[j]]; 12853 // AddRoundKey 12854 for (j = 0, k = i * 16; j < 16; ++j, ++k) 12855 state[j] ^= key[k]; 12856 // InvMixColumns 12857 for (j = 0; j < 16; j += 4) { 12858 var s0 = mix[state[j]], s1 = mix[state[j + 1]], 12859 s2 = mix[state[j + 2]], s3 = mix[state[j + 3]]; 12860 t = (s0 ^ (s1 >>> 8) ^ (s1 << 24) ^ (s2 >>> 16) ^ (s2 << 16) ^ 12861 (s3 >>> 24) ^ (s3 << 8)); 12862 state[j] = (t >>> 24) & 0xFF; 12863 state[j + 1] = (t >> 16) & 0xFF; 12864 state[j + 2] = (t >> 8) & 0xFF; 12865 state[j + 3] = t & 0xFF; 12866 } 12867 } 12868 // InvShiftRows 12869 t = state[13]; state[13] = state[9]; state[9] = state[5]; 12870 state[5] = state[1]; state[1] = t; 12871 t = state[14]; u = state[10]; state[14] = state[6]; 12872 state[10] = state[2]; state[6] = t; state[2] = u; 12873 t = state[15]; u = state[11]; v = state[7]; state[15] = state[3]; 12874 state[11] = t; state[7] = u; state[3] = v; 12875 for (j = 0; j < 16; ++j) { 12876 // InvSubBytes 12877 state[j] = inv_s[state[j]]; 12878 // AddRoundKey 12879 state[j] ^= key[j]; 12880 } 12881 return state; 12882 } 12883 12884 function AES128Cipher(key) { 12885 this.key = expandKey128(key); 12886 this.buffer = new Uint8Array(16); 12887 this.bufferPosition = 0; 12888 } 12889 12890 function decryptBlock2(data) { 12891 var i, j, ii, sourceLength = data.length, 12892 buffer = this.buffer, bufferLength = this.bufferPosition, 12893 result = [], iv = this.iv; 12894 for (i = 0; i < sourceLength; ++i) { 12895 buffer[bufferLength] = data[i]; 12896 ++bufferLength; 12897 if (bufferLength < 16) 12898 continue; 12899 // buffer is full, decrypting 12900 var plain = decrypt128(buffer, this.key); 12901 // xor-ing the IV vector to get plain text 12902 for (j = 0; j < 16; ++j) 12903 plain[j] ^= iv[j]; 12904 iv = buffer; 12905 result.push(plain); 12906 buffer = new Uint8Array(16); 12907 bufferLength = 0; 12908 } 12909 // saving incomplete buffer 12910 this.buffer = buffer; 12911 this.bufferLength = bufferLength; 12912 this.iv = iv; 12913 if (result.length == 0) 12914 return new Uint8Array([]); 12915 if (result.length == 1) 12916 return result[0]; 12917 // combining plain text blocks into one 12918 var output = new Uint8Array(16 * result.length); 12919 for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) 12920 output.set(result[i], j); 12921 return output; 12922 } 12923 12924 AES128Cipher.prototype = { 12925 decryptBlock: function AES128Cipher_decryptBlock(data) { 12926 var i, sourceLength = data.length; 12927 var buffer = this.buffer, bufferLength = this.bufferPosition; 12928 // waiting for IV values -- they are at the start of the stream 12929 for (i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) 12930 buffer[bufferLength] = data[i]; 12931 if (bufferLength < 16) { 12932 // need more data 12933 this.bufferLength = bufferLength; 12934 return new Uint8Array([]); 12935 } 12936 this.iv = buffer; 12937 this.buffer = new Uint8Array(16); 12938 this.bufferLength = 0; 12939 // starting decryption 12940 this.decryptBlock = decryptBlock2; 12941 return this.decryptBlock(data.subarray(16)); 12942 } 12943 }; 12944 12945 return AES128Cipher; 12946 })(); 12947 12948 var CipherTransform = (function CipherTransformClosure() { 12949 function CipherTransform(stringCipherConstructor, streamCipherConstructor) { 12950 this.stringCipherConstructor = stringCipherConstructor; 12951 this.streamCipherConstructor = streamCipherConstructor; 12952 } 12953 CipherTransform.prototype = { 12954 createStream: function CipherTransform_createStream(stream) { 12955 var cipher = new this.streamCipherConstructor(); 12956 return new DecryptStream(stream, 12957 function cipherTransformDecryptStream(data) { 12958 return cipher.decryptBlock(data); 12959 } 12960 ); 12961 }, 12962 decryptString: function CipherTransform_decryptString(s) { 12963 var cipher = new this.stringCipherConstructor(); 12964 var data = stringToBytes(s); 12965 data = cipher.decryptBlock(data); 12966 return bytesToString(data); 12967 } 12968 }; 12969 return CipherTransform; 12970 })(); 12971 12972 var CipherTransformFactory = (function CipherTransformFactoryClosure() { 12973 function prepareKeyData(fileId, password, ownerPassword, userPassword, 12974 flags, revision, keyLength, encryptMetadata) { 12975 var defaultPasswordBytes = new Uint8Array([ 12976 0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41, 12977 0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08, 12978 0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80, 12979 0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A]); 12980 var hashData = new Uint8Array(100), i = 0, j, n; 12981 if (password) { 12982 n = Math.min(32, password.length); 12983 for (; i < n; ++i) 12984 hashData[i] = password[i]; 12985 } 12986 j = 0; 12987 while (i < 32) { 12988 hashData[i++] = defaultPasswordBytes[j++]; 12989 } 12990 // as now the padded password in the hashData[0..i] 12991 for (j = 0, n = ownerPassword.length; j < n; ++j) 12992 hashData[i++] = ownerPassword[j]; 12993 hashData[i++] = flags & 0xFF; 12994 hashData[i++] = (flags >> 8) & 0xFF; 12995 hashData[i++] = (flags >> 16) & 0xFF; 12996 hashData[i++] = (flags >>> 24) & 0xFF; 12997 for (j = 0, n = fileId.length; j < n; ++j) 12998 hashData[i++] = fileId[j]; 12999 if (revision >= 4 && !encryptMetadata) { 13000 hashData[i++] = 0xFF; 13001 hashData[i++] = 0xFF; 13002 hashData[i++] = 0xFF; 13003 hashData[i++] = 0xFF; 13004 } 13005 var hash = calculateMD5(hashData, 0, i); 13006 var keyLengthInBytes = keyLength >> 3; 13007 if (revision >= 3) { 13008 for (j = 0; j < 50; ++j) { 13009 hash = calculateMD5(hash, 0, keyLengthInBytes); 13010 } 13011 } 13012 var encryptionKey = hash.subarray(0, keyLengthInBytes); 13013 var cipher, checkData; 13014 13015 if (revision >= 3) { 13016 // padded password in hashData, we can use this array for user 13017 // password check 13018 i = 32; 13019 for (j = 0, n = fileId.length; j < n; ++j) 13020 hashData[i++] = fileId[j]; 13021 cipher = new ARCFourCipher(encryptionKey); 13022 var checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i)); 13023 n = encryptionKey.length; 13024 var derivedKey = new Uint8Array(n), k; 13025 for (j = 1; j <= 19; ++j) { 13026 for (k = 0; k < n; ++k) 13027 derivedKey[k] = encryptionKey[k] ^ j; 13028 cipher = new ARCFourCipher(derivedKey); 13029 checkData = cipher.encryptBlock(checkData); 13030 } 13031 } else { 13032 cipher = new ARCFourCipher(encryptionKey); 13033 checkData = cipher.encryptBlock(hashData.subarray(0, 32)); 13034 } 13035 for (j = 0, n = checkData.length; j < n; ++j) { 13036 if (userPassword[j] != checkData[j]) 13037 error('incorrect password'); 13038 } 13039 return encryptionKey; 13040 } 13041 13042 var identityName = new Name('Identity'); 13043 13044 function CipherTransformFactory(dict, fileId, password) { 13045 var filter = dict.get('Filter'); 13046 if (!isName(filter) || filter.name != 'Standard') 13047 error('unknown encryption method'); 13048 this.dict = dict; 13049 var algorithm = dict.get('V'); 13050 if (!isInt(algorithm) || 13051 (algorithm != 1 && algorithm != 2 && algorithm != 4)) 13052 error('unsupported encryption algorithm'); 13053 this.algorithm = algorithm; 13054 var keyLength = dict.get('Length') || 40; 13055 if (!isInt(keyLength) || 13056 keyLength < 40 || (keyLength % 8) != 0) 13057 error('invalid key length'); 13058 // prepare keys 13059 var ownerPassword = stringToBytes(dict.get('O')); 13060 var userPassword = stringToBytes(dict.get('U')); 13061 var flags = dict.get('P'); 13062 var revision = dict.get('R'); 13063 var encryptMetadata = 13064 dict.get('EncryptMetadata') !== false; // makes true as default value 13065 var fileIdBytes = stringToBytes(fileId); 13066 var passwordBytes; 13067 if (password) 13068 passwordBytes = stringToBytes(password); 13069 13070 this.encryptionKey = prepareKeyData(fileIdBytes, passwordBytes, 13071 ownerPassword, userPassword, 13072 flags, revision, 13073 keyLength, encryptMetadata); 13074 if (algorithm == 4) { 13075 this.cf = dict.get('CF'); 13076 this.stmf = dict.get('StmF') || identityName; 13077 this.strf = dict.get('StrF') || identityName; 13078 this.eff = dict.get('EFF') || this.strf; 13079 } 13080 } 13081 13082 function buildObjectKey(num, gen, encryptionKey, isAes) { 13083 var key = new Uint8Array(encryptionKey.length + 9), i, n; 13084 for (i = 0, n = encryptionKey.length; i < n; ++i) 13085 key[i] = encryptionKey[i]; 13086 key[i++] = num & 0xFF; 13087 key[i++] = (num >> 8) & 0xFF; 13088 key[i++] = (num >> 16) & 0xFF; 13089 key[i++] = gen & 0xFF; 13090 key[i++] = (gen >> 8) & 0xFF; 13091 if (isAes) { 13092 key[i++] = 0x73; 13093 key[i++] = 0x41; 13094 key[i++] = 0x6C; 13095 key[i++] = 0x54; 13096 } 13097 var hash = calculateMD5(key, 0, i); 13098 return hash.subarray(0, Math.min(encryptionKey.length + 5, 16)); 13099 } 13100 13101 function buildCipherConstructor(cf, name, num, gen, key) { 13102 var cryptFilter = cf.get(name.name); 13103 var cfm; 13104 if (cryptFilter != null) 13105 cfm = cryptFilter.get('CFM'); 13106 if (!cfm || cfm.name == 'None') { 13107 return function cipherTransformFactoryBuildCipherConstructorNone() { 13108 return new NullCipher(); 13109 }; 13110 } 13111 if ('V2' == cfm.name) { 13112 return function cipherTransformFactoryBuildCipherConstructorV2() { 13113 return new ARCFourCipher( 13114 buildObjectKey(num, gen, key, false)); 13115 }; 13116 } 13117 if ('AESV2' == cfm.name) { 13118 return function cipherTransformFactoryBuildCipherConstructorAESV2() { 13119 return new AES128Cipher( 13120 buildObjectKey(num, gen, key, true)); 13121 }; 13122 } 13123 error('Unknown crypto method'); 13124 } 13125 13126 CipherTransformFactory.prototype = { 13127 createCipherTransform: 13128 function CipherTransformFactory_createCipherTransform(num, gen) { 13129 if (this.algorithm == 4) { 13130 return new CipherTransform( 13131 buildCipherConstructor(this.cf, this.stmf, 13132 num, gen, this.encryptionKey), 13133 buildCipherConstructor(this.cf, this.strf, 13134 num, gen, this.encryptionKey)); 13135 } 13136 // algorithms 1 and 2 13137 var key = buildObjectKey(num, gen, this.encryptionKey, false); 13138 var cipherConstructor = function buildCipherCipherConstructor() { 13139 return new ARCFourCipher(key); 13140 }; 13141 return new CipherTransform(cipherConstructor, cipherConstructor); 13142 } 13143 }; 13144 13145 return CipherTransformFactory; 13146 })(); 13147 13148 13149 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 13150 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ 13151 13152 'use strict'; 13153 13154 var PartialEvaluator = (function PartialEvaluatorClosure() { 13155 function PartialEvaluator(xref, handler, uniquePrefix) { 13156 this.state = new EvalState(); 13157 this.stateStack = []; 13158 13159 this.xref = xref; 13160 this.handler = handler; 13161 this.uniquePrefix = uniquePrefix; 13162 this.objIdCounter = 0; 13163 } 13164 13165 var OP_MAP = { 13166 // Graphics state 13167 w: 'setLineWidth', 13168 J: 'setLineCap', 13169 j: 'setLineJoin', 13170 M: 'setMiterLimit', 13171 d: 'setDash', 13172 ri: 'setRenderingIntent', 13173 i: 'setFlatness', 13174 gs: 'setGState', 13175 q: 'save', 13176 Q: 'restore', 13177 cm: 'transform', 13178 13179 // Path 13180 m: 'moveTo', 13181 l: 'lineTo', 13182 c: 'curveTo', 13183 v: 'curveTo2', 13184 y: 'curveTo3', 13185 h: 'closePath', 13186 re: 'rectangle', 13187 S: 'stroke', 13188 s: 'closeStroke', 13189 f: 'fill', 13190 F: 'fill', 13191 'f*': 'eoFill', 13192 B: 'fillStroke', 13193 'B*': 'eoFillStroke', 13194 b: 'closeFillStroke', 13195 'b*': 'closeEOFillStroke', 13196 n: 'endPath', 13197 13198 // Clipping 13199 W: 'clip', 13200 'W*': 'eoClip', 13201 13202 // Text 13203 BT: 'beginText', 13204 ET: 'endText', 13205 Tc: 'setCharSpacing', 13206 Tw: 'setWordSpacing', 13207 Tz: 'setHScale', 13208 TL: 'setLeading', 13209 Tf: 'setFont', 13210 Tr: 'setTextRenderingMode', 13211 Ts: 'setTextRise', 13212 Td: 'moveText', 13213 TD: 'setLeadingMoveText', 13214 Tm: 'setTextMatrix', 13215 'T*': 'nextLine', 13216 Tj: 'showText', 13217 TJ: 'showSpacedText', 13218 "'": 'nextLineShowText', 13219 '"': 'nextLineSetSpacingShowText', 13220 13221 // Type3 fonts 13222 d0: 'setCharWidth', 13223 d1: 'setCharWidthAndBounds', 13224 13225 // Color 13226 CS: 'setStrokeColorSpace', 13227 cs: 'setFillColorSpace', 13228 SC: 'setStrokeColor', 13229 SCN: 'setStrokeColorN', 13230 sc: 'setFillColor', 13231 scn: 'setFillColorN', 13232 G: 'setStrokeGray', 13233 g: 'setFillGray', 13234 RG: 'setStrokeRGBColor', 13235 rg: 'setFillRGBColor', 13236 K: 'setStrokeCMYKColor', 13237 k: 'setFillCMYKColor', 13238 13239 // Shading 13240 sh: 'shadingFill', 13241 13242 // Images 13243 BI: 'beginInlineImage', 13244 ID: 'beginImageData', 13245 EI: 'endInlineImage', 13246 13247 // XObjects 13248 Do: 'paintXObject', 13249 13250 // Marked content 13251 MP: 'markPoint', 13252 DP: 'markPointProps', 13253 BMC: 'beginMarkedContent', 13254 BDC: 'beginMarkedContentProps', 13255 EMC: 'endMarkedContent', 13256 13257 // Compatibility 13258 BX: 'beginCompat', 13259 EX: 'endCompat' 13260 }; 13261 13262 function splitCombinedOperations(operations) { 13263 // Two operations can be combined together, trying to find which two 13264 // operations were concatenated. 13265 for (var i = operations.length - 1; i > 0; i--) { 13266 var op1 = operations.substring(0, i), op2 = operations.substring(i); 13267 if (op1 in OP_MAP && op2 in OP_MAP) 13268 return [op1, op2]; // operations found 13269 } 13270 return null; 13271 } 13272 13273 PartialEvaluator.prototype = { 13274 getOperatorList: function PartialEvaluator_getOperatorList(stream, 13275 resources, 13276 dependency, 13277 queue) { 13278 13279 var self = this; 13280 var xref = this.xref; 13281 var handler = this.handler; 13282 var uniquePrefix = this.uniquePrefix || ''; 13283 13284 function insertDependency(depList) { 13285 fnArray.push('dependency'); 13286 argsArray.push(depList); 13287 for (var i = 0, ii = depList.length; i < ii; i++) { 13288 var dep = depList[i]; 13289 if (dependency.indexOf(dep) == -1) { 13290 dependency.push(depList[i]); 13291 } 13292 } 13293 } 13294 13295 function handleSetFont(fontName, font) { 13296 var loadedName = null; 13297 13298 var fontRes = resources.get('Font'); 13299 13300 assert(fontRes, 'fontRes not available'); 13301 13302 font = xref.fetchIfRef(font) || fontRes.get(fontName); 13303 assertWellFormed(isDict(font)); 13304 ++self.objIdCounter; 13305 if (!font.translated) { 13306 font.translated = self.translateFont(font, xref, resources, 13307 dependency); 13308 if (font.translated) { 13309 // keep track of each font we translated so the caller can 13310 // load them asynchronously before calling display on a page 13311 loadedName = 'font_' + uniquePrefix + self.objIdCounter; 13312 font.translated.properties.loadedName = loadedName; 13313 font.loadedName = loadedName; 13314 13315 var translated = font.translated; 13316 // Convert the file to an ArrayBuffer which will be turned back into 13317 // a Stream in the main thread. 13318 if (translated.file) 13319 translated.file = translated.file.getBytes(); 13320 if (translated.properties.file) { 13321 translated.properties.file = 13322 translated.properties.file.getBytes(); 13323 } 13324 13325 handler.send('obj', [ 13326 loadedName, 13327 'Font', 13328 translated.name, 13329 translated.file, 13330 translated.properties 13331 ]); 13332 } 13333 } 13334 loadedName = loadedName || font.loadedName; 13335 13336 // Ensure the font is ready before the font is set 13337 // and later on used for drawing. 13338 // OPTIMIZE: This should get insert to the operatorList only once per 13339 // page. 13340 insertDependency([loadedName]); 13341 return loadedName; 13342 } 13343 13344 function buildPaintImageXObject(image, inline) { 13345 var dict = image.dict; 13346 var w = dict.get('Width', 'W'); 13347 var h = dict.get('Height', 'H'); 13348 13349 var imageMask = dict.get('ImageMask', 'IM') || false; 13350 if (imageMask) { 13351 // This depends on a tmpCanvas beeing filled with the 13352 // current fillStyle, such that processing the pixel 13353 // data can't be done here. Instead of creating a 13354 // complete PDFImage, only read the information needed 13355 // for later. 13356 13357 var width = dict.get('Width', 'W'); 13358 var height = dict.get('Height', 'H'); 13359 var bitStrideLength = (width + 7) >> 3; 13360 var imgArray = image.getBytes(bitStrideLength * height); 13361 var decode = dict.get('Decode', 'D'); 13362 var inverseDecode = !!decode && decode[0] > 0; 13363 13364 fn = 'paintImageMaskXObject'; 13365 args = [imgArray, inverseDecode, width, height]; 13366 return; 13367 } 13368 13369 // If there is no imageMask, create the PDFImage and a lot 13370 // of image processing can be done here. 13371 var objId = 'img_' + uniquePrefix + (++self.objIdCounter); 13372 insertDependency([objId]); 13373 args = [objId, w, h]; 13374 13375 var softMask = dict.get('SMask', 'IM') || false; 13376 if (!softMask && image instanceof JpegStream && 13377 image.isNativelySupported(xref, resources)) { 13378 // These JPEGs don't need any more processing so we can just send it. 13379 fn = 'paintJpegXObject'; 13380 handler.send('obj', [objId, 'JpegStream', image.getIR()]); 13381 return; 13382 } 13383 13384 fn = 'paintImageXObject'; 13385 13386 PDFImage.buildImage(function(imageObj) { 13387 var drawWidth = imageObj.drawWidth; 13388 var drawHeight = imageObj.drawHeight; 13389 var imgData = { 13390 width: drawWidth, 13391 height: drawHeight, 13392 data: new Uint8Array(drawWidth * drawHeight * 4) 13393 }; 13394 var pixels = imgData.data; 13395 imageObj.fillRgbaBuffer(pixels, drawWidth, drawHeight); 13396 handler.send('obj', [objId, 'Image', imgData]); 13397 }, handler, xref, resources, image, inline); 13398 } 13399 13400 if (!queue) 13401 queue = {}; 13402 13403 if (!queue.argsArray) { 13404 queue.argsArray = []; 13405 } 13406 if (!queue.fnArray) { 13407 queue.fnArray = []; 13408 } 13409 13410 var fnArray = queue.fnArray, argsArray = queue.argsArray; 13411 var dependencyArray = dependency || []; 13412 13413 resources = resources || new Dict(); 13414 var xobjs = resources.get('XObject') || new Dict(); 13415 var patterns = resources.get('Pattern') || new Dict(); 13416 var parser = new Parser(new Lexer(stream), false, xref); 13417 var res = resources; 13418 var hasNextObj = false, nextObj; 13419 var args = [], obj; 13420 var TILING_PATTERN = 1, SHADING_PATTERN = 2; 13421 13422 while (true) { 13423 if (hasNextObj) { 13424 obj = nextObj; 13425 hasNextObj = false; 13426 } else { 13427 obj = parser.getObj(); 13428 if (isEOF(obj)) 13429 break; 13430 } 13431 13432 if (isCmd(obj)) { 13433 var cmd = obj.cmd; 13434 var fn = OP_MAP[cmd]; 13435 if (!fn) { 13436 // invalid content command, trying to recover 13437 var cmds = splitCombinedOperations(cmd); 13438 if (cmds) { 13439 cmd = cmds[0]; 13440 fn = OP_MAP[cmd]; 13441 // feeding other command on the next interation 13442 hasNextObj = true; 13443 nextObj = Cmd.get(cmds[1]); 13444 } 13445 } 13446 assertWellFormed(fn, 'Unknown command "' + cmd + '"'); 13447 // TODO figure out how to type-check vararg functions 13448 13449 if ((cmd == 'SCN' || cmd == 'scn') && !args[args.length - 1].code) { 13450 // compile tiling patterns 13451 var patternName = args[args.length - 1]; 13452 // SCN/scn applies patterns along with normal colors 13453 if (isName(patternName)) { 13454 var pattern = patterns.get(patternName.name); 13455 if (pattern) { 13456 var dict = isStream(pattern) ? pattern.dict : pattern; 13457 var typeNum = dict.get('PatternType'); 13458 13459 if (typeNum == TILING_PATTERN) { 13460 // Create an IR of the pattern code. 13461 var depIdx = dependencyArray.length; 13462 var operatorList = this.getOperatorList(pattern, 13463 dict.get('Resources') || resources, dependencyArray); 13464 13465 // Add the dependencies that are required to execute the 13466 // operatorList. 13467 insertDependency(dependencyArray.slice(depIdx)); 13468 13469 args = TilingPattern.getIR(operatorList, dict, args); 13470 } 13471 else if (typeNum == SHADING_PATTERN) { 13472 var shading = dict.get('Shading'); 13473 var matrix = dict.get('Matrix'); 13474 var pattern = Pattern.parseShading(shading, matrix, xref, 13475 res); 13476 args = pattern.getIR(); 13477 } else { 13478 error('Unkown PatternType ' + typeNum); 13479 } 13480 } 13481 } 13482 } else if (cmd == 'Do' && !args[0].code) { 13483 // eagerly compile XForm objects 13484 var name = args[0].name; 13485 var xobj = xobjs.get(name); 13486 if (xobj) { 13487 assertWellFormed(isStream(xobj), 'XObject should be a stream'); 13488 13489 var type = xobj.dict.get('Subtype'); 13490 assertWellFormed( 13491 isName(type), 13492 'XObject should have a Name subtype' 13493 ); 13494 13495 if ('Form' == type.name) { 13496 var matrix = xobj.dict.get('Matrix'); 13497 var bbox = xobj.dict.get('BBox'); 13498 13499 fnArray.push('paintFormXObjectBegin'); 13500 argsArray.push([matrix, bbox]); 13501 13502 // This adds the operatorList of the xObj to the current queue. 13503 var depIdx = dependencyArray.length; 13504 13505 // Pass in the current `queue` object. That means the `fnArray` 13506 // and the `argsArray` in this scope is reused and new commands 13507 // are added to them. 13508 this.getOperatorList(xobj, 13509 xobj.dict.get('Resources') || resources, 13510 dependencyArray, queue); 13511 13512 // Add the dependencies that are required to execute the 13513 // operatorList. 13514 insertDependency(dependencyArray.slice(depIdx)); 13515 13516 fn = 'paintFormXObjectEnd'; 13517 args = []; 13518 } else if ('Image' == type.name) { 13519 buildPaintImageXObject(xobj, false); 13520 } else { 13521 error('Unhandled XObject subtype ' + type.name); 13522 } 13523 } 13524 } else if (cmd == 'Tf') { // eagerly collect all fonts 13525 args[0] = handleSetFont(args[0].name); 13526 } else if (cmd == 'EI') { 13527 buildPaintImageXObject(args[0], true); 13528 } 13529 13530 switch (fn) { 13531 // Parse the ColorSpace data to a raw format. 13532 case 'setFillColorSpace': 13533 case 'setStrokeColorSpace': 13534 args = [ColorSpace.parseToIR(args[0], xref, resources)]; 13535 break; 13536 case 'shadingFill': 13537 var shadingRes = res.get('Shading'); 13538 if (!shadingRes) 13539 error('No shading resource found'); 13540 13541 var shading = shadingRes.get(args[0].name); 13542 if (!shading) 13543 error('No shading object found'); 13544 13545 var shadingFill = Pattern.parseShading(shading, null, xref, res); 13546 var patternIR = shadingFill.getIR(); 13547 args = [patternIR]; 13548 fn = 'shadingFill'; 13549 break; 13550 case 'setGState': 13551 var dictName = args[0]; 13552 var extGState = resources.get('ExtGState'); 13553 13554 if (!isDict(extGState) || !extGState.has(dictName.name)) 13555 break; 13556 13557 var gsState = extGState.get(dictName.name); 13558 13559 // This array holds the converted/processed state data. 13560 var gsStateObj = []; 13561 13562 gsState.forEach( 13563 function canvasGraphicsSetGStateForEach(key, value) { 13564 switch (key) { 13565 case 'Type': 13566 break; 13567 case 'LW': 13568 case 'LC': 13569 case 'LJ': 13570 case 'ML': 13571 case 'D': 13572 case 'RI': 13573 case 'FL': 13574 case 'CA': 13575 case 'ca': 13576 gsStateObj.push([key, value]); 13577 break; 13578 case 'Font': 13579 gsStateObj.push([ 13580 'Font', 13581 handleSetFont(null, value[0]), 13582 value[1] 13583 ]); 13584 break; 13585 case 'OP': 13586 case 'op': 13587 case 'OPM': 13588 case 'BG': 13589 case 'BG2': 13590 case 'UCR': 13591 case 'UCR2': 13592 case 'TR': 13593 case 'TR2': 13594 case 'HT': 13595 case 'SM': 13596 case 'SA': 13597 case 'BM': 13598 case 'SMask': 13599 case 'AIS': 13600 case 'TK': 13601 TODO('graphic state operator ' + key); 13602 break; 13603 default: 13604 warn('Unknown graphic state operator ' + key); 13605 break; 13606 } 13607 } 13608 ); 13609 args = [gsStateObj]; 13610 break; 13611 } // switch 13612 13613 fnArray.push(fn); 13614 argsArray.push(args); 13615 args = []; 13616 } else if (obj != null) { 13617 assertWellFormed(args.length <= 33, 'Too many arguments'); 13618 args.push(obj instanceof Dict ? obj.getAll() : obj); 13619 } 13620 } 13621 13622 return queue; 13623 }, 13624 13625 extractDataStructures: function 13626 partialEvaluatorExtractDataStructures(dict, baseDict, 13627 xref, properties) { 13628 // 9.10.2 13629 var toUnicode = dict.get('ToUnicode') || 13630 baseDict.get('ToUnicode'); 13631 if (toUnicode) 13632 properties.toUnicode = this.readToUnicode(toUnicode, xref, properties); 13633 13634 if (properties.composite) { 13635 // CIDSystemInfo helps to match CID to glyphs 13636 var cidSystemInfo = dict.get('CIDSystemInfo'); 13637 if (isDict(cidSystemInfo)) { 13638 properties.cidSystemInfo = { 13639 registry: cidSystemInfo.get('Registry'), 13640 ordering: cidSystemInfo.get('Ordering'), 13641 supplement: cidSystemInfo.get('Supplement') 13642 }; 13643 } 13644 13645 var cidToGidMap = dict.get('CIDToGIDMap'); 13646 if (isStream(cidToGidMap)) 13647 properties.cidToGidMap = this.readCidToGidMap(cidToGidMap); 13648 } 13649 13650 var flags = properties.flags; 13651 var differences = []; 13652 var baseEncoding = !!(flags & FontFlags.Symbolic) ? 13653 Encodings.symbolsEncoding : Encodings.StandardEncoding; 13654 var hasEncoding = dict.has('Encoding'); 13655 if (hasEncoding) { 13656 var encoding = dict.get('Encoding'); 13657 if (isDict(encoding)) { 13658 var baseName = encoding.get('BaseEncoding'); 13659 if (baseName) 13660 baseEncoding = Encodings[baseName.name]; 13661 else 13662 hasEncoding = false; // base encoding was not provided 13663 13664 // Load the differences between the base and original 13665 if (encoding.has('Differences')) { 13666 var diffEncoding = encoding.get('Differences'); 13667 var index = 0; 13668 for (var j = 0, jj = diffEncoding.length; j < jj; j++) { 13669 var data = diffEncoding[j]; 13670 if (isNum(data)) 13671 index = data; 13672 else 13673 differences[index++] = data.name; 13674 } 13675 } 13676 } else if (isName(encoding)) { 13677 baseEncoding = Encodings[encoding.name]; 13678 } else { 13679 error('Encoding is not a Name nor a Dict'); 13680 } 13681 } 13682 13683 properties.differences = differences; 13684 properties.baseEncoding = baseEncoding; 13685 properties.hasEncoding = hasEncoding; 13686 }, 13687 13688 readToUnicode: function PartialEvaluator_readToUnicode(toUnicode, xref, 13689 properties) { 13690 var cmapObj = toUnicode; 13691 var charToUnicode = []; 13692 if (isName(cmapObj)) { 13693 var isIdentityMap = cmapObj.name.substr(0, 9) == 'Identity-'; 13694 if (!isIdentityMap) 13695 error('ToUnicode file cmap translation not implemented'); 13696 } else if (isStream(cmapObj)) { 13697 var tokens = []; 13698 var token = ''; 13699 var beginArrayToken = {}; 13700 13701 var cmap = cmapObj.getBytes(cmapObj.length); 13702 for (var i = 0, ii = cmap.length; i < ii; i++) { 13703 var octet = cmap[i]; 13704 if (octet == 0x20 || octet == 0x0D || octet == 0x0A || 13705 octet == 0x3C || octet == 0x5B || octet == 0x5D) { 13706 switch (token) { 13707 case 'usecmap': 13708 error('usecmap is not implemented'); 13709 break; 13710 13711 case 'beginbfchar': 13712 case 'beginbfrange': 13713 case 'begincidchar': 13714 case 'begincidrange': 13715 token = ''; 13716 tokens = []; 13717 break; 13718 13719 case 'endcidrange': 13720 case 'endbfrange': 13721 for (var j = 0, jj = tokens.length; j < jj; j += 3) { 13722 var startRange = tokens[j]; 13723 var endRange = tokens[j + 1]; 13724 var code = tokens[j + 2]; 13725 if (code == 0xFFFF) { 13726 // CMap is broken, assuming code == startRange 13727 code = startRange; 13728 } 13729 if (isArray(code)) { 13730 var codeindex = 0; 13731 while (startRange <= endRange) { 13732 charToUnicode[startRange] = code[codeindex++]; 13733 ++startRange; 13734 } 13735 } else { 13736 while (startRange <= endRange) { 13737 charToUnicode[startRange] = code++; 13738 ++startRange; 13739 } 13740 } 13741 } 13742 break; 13743 13744 case 'endcidchar': 13745 case 'endbfchar': 13746 for (var j = 0, jj = tokens.length; j < jj; j += 2) { 13747 var index = tokens[j]; 13748 var code = tokens[j + 1]; 13749 charToUnicode[index] = code; 13750 } 13751 break; 13752 13753 case '': 13754 break; 13755 13756 default: 13757 if (token[0] >= '0' && token[0] <= '9') 13758 token = parseInt(token, 10); // a number 13759 tokens.push(token); 13760 token = ''; 13761 } 13762 switch (octet) { 13763 case 0x5B: 13764 // begin list parsing 13765 tokens.push(beginArrayToken); 13766 break; 13767 case 0x5D: 13768 // collect array items 13769 var items = [], item; 13770 while (tokens.length && 13771 (item = tokens.pop()) != beginArrayToken) 13772 items.unshift(item); 13773 tokens.push(items); 13774 break; 13775 } 13776 } else if (octet == 0x3E) { 13777 if (token.length) { 13778 // XXX guessing chars size by checking number size in the CMap 13779 if (token.length <= 2 && properties.composite) 13780 properties.wideChars = false; 13781 13782 if (token.length <= 4) { 13783 // parsing hex number 13784 tokens.push(parseInt(token, 16)); 13785 token = ''; 13786 } else { 13787 // parsing hex UTF-16BE numbers 13788 var str = []; 13789 for (var k = 0, kk = token.length; k < kk; k += 4) { 13790 var b = parseInt(token.substr(k, 4), 16); 13791 if (b <= 0x10) { 13792 k += 4; 13793 b = (b << 16) | parseInt(token.substr(k, 4), 16); 13794 b -= 0x10000; 13795 str.push(0xD800 | (b >> 10)); 13796 str.push(0xDC00 | (b & 0x3FF)); 13797 break; 13798 } 13799 str.push(b); 13800 } 13801 tokens.push(String.fromCharCode.apply(String, str)); 13802 token = ''; 13803 } 13804 } 13805 } else { 13806 token += String.fromCharCode(octet); 13807 } 13808 } 13809 } 13810 return charToUnicode; 13811 }, 13812 readCidToGidMap: function PartialEvaluator_readCidToGidMap(cidToGidStream) { 13813 // Extract the encoding from the CIDToGIDMap 13814 var glyphsData = cidToGidStream.getBytes(); 13815 13816 // Set encoding 0 to later verify the font has an encoding 13817 var result = []; 13818 for (var j = 0, jj = glyphsData.length; j < jj; j++) { 13819 var glyphID = (glyphsData[j++] << 8) | glyphsData[j]; 13820 if (glyphID == 0) 13821 continue; 13822 13823 var code = j >> 1; 13824 result[code] = glyphID; 13825 } 13826 return result; 13827 }, 13828 13829 extractWidths: function PartialEvaluator_extractWidths(dict, 13830 xref, 13831 descriptor, 13832 properties) { 13833 var glyphsWidths = []; 13834 var defaultWidth = 0; 13835 if (properties.composite) { 13836 defaultWidth = dict.get('DW') || 1000; 13837 13838 var widths = dict.get('W'); 13839 if (widths) { 13840 var start = 0, end = 0; 13841 for (var i = 0, ii = widths.length; i < ii; i++) { 13842 var code = widths[i]; 13843 if (isArray(code)) { 13844 for (var j = 0, jj = code.length; j < jj; j++) 13845 glyphsWidths[start++] = code[j]; 13846 start = 0; 13847 } else if (start) { 13848 var width = widths[++i]; 13849 for (var j = start; j <= code; j++) 13850 glyphsWidths[j] = width; 13851 start = 0; 13852 } else { 13853 start = code; 13854 } 13855 } 13856 } 13857 } else { 13858 var firstChar = properties.firstChar; 13859 var widths = dict.get('Widths'); 13860 if (widths) { 13861 var j = firstChar; 13862 for (var i = 0, ii = widths.length; i < ii; i++) 13863 glyphsWidths[j++] = widths[i]; 13864 defaultWidth = parseFloat(descriptor.get('MissingWidth')) || 0; 13865 } else { 13866 // Trying get the BaseFont metrics (see comment above). 13867 var baseFontName = dict.get('BaseFont'); 13868 if (isName(baseFontName)) { 13869 var metrics = this.getBaseFontMetrics(baseFontName.name); 13870 13871 glyphsWidths = metrics.widths; 13872 defaultWidth = metrics.defaultWidth; 13873 } 13874 } 13875 } 13876 13877 properties.defaultWidth = defaultWidth; 13878 properties.widths = glyphsWidths; 13879 }, 13880 13881 getBaseFontMetrics: function PartialEvaluator_getBaseFontMetrics(name) { 13882 var defaultWidth = 0, widths = []; 13883 var glyphWidths = Metrics[stdFontMap[name] || name]; 13884 if (isNum(glyphWidths)) { 13885 defaultWidth = glyphWidths; 13886 } else { 13887 widths = glyphWidths; 13888 } 13889 13890 return { 13891 defaultWidth: defaultWidth, 13892 widths: widths 13893 }; 13894 }, 13895 13896 translateFont: function PartialEvaluator_translateFont(dict, 13897 xref, 13898 resources, 13899 dependency) { 13900 var baseDict = dict; 13901 var type = dict.get('Subtype'); 13902 assertWellFormed(isName(type), 'invalid font Subtype'); 13903 13904 var composite = false; 13905 if (type.name == 'Type0') { 13906 // If font is a composite 13907 // - get the descendant font 13908 // - set the type according to the descendant font 13909 // - get the FontDescriptor from the descendant font 13910 var df = dict.get('DescendantFonts'); 13911 if (!df) 13912 return null; 13913 13914 dict = isArray(df) ? xref.fetchIfRef(df[0]) : df; 13915 13916 type = dict.get('Subtype'); 13917 assertWellFormed(isName(type), 'invalid font Subtype'); 13918 composite = true; 13919 } 13920 var maxCharIndex = composite ? 0xFFFF : 0xFF; 13921 13922 var descriptor = dict.get('FontDescriptor'); 13923 if (!descriptor) { 13924 if (type.name == 'Type3') { 13925 // FontDescriptor is only required for Type3 fonts when the document 13926 // is a tagged pdf. Create a barbebones one to get by. 13927 descriptor = new Dict(); 13928 descriptor.set('FontName', new Name(type.name)); 13929 } else { 13930 // Before PDF 1.5 if the font was one of the base 14 fonts, having a 13931 // FontDescriptor was not required. 13932 // This case is here for compatibility. 13933 var baseFontName = dict.get('BaseFont'); 13934 if (!isName(baseFontName)) 13935 return null; 13936 13937 // Using base font name as a font name. 13938 baseFontName = baseFontName.name.replace(/[,_]/g, '-'); 13939 var metrics = this.getBaseFontMetrics(baseFontName); 13940 13941 // Simulating descriptor flags attribute 13942 var fontNameWoStyle = baseFontName.split('-')[0]; 13943 var flags = (serifFonts[fontNameWoStyle] || 13944 (fontNameWoStyle.search(/serif/gi) != -1) ? FontFlags.Serif : 0) | 13945 (symbolsFonts[fontNameWoStyle] ? FontFlags.Symbolic : 13946 FontFlags.Nonsymbolic); 13947 13948 var properties = { 13949 type: type.name, 13950 widths: metrics.widths, 13951 defaultWidth: metrics.defaultWidth, 13952 flags: flags, 13953 firstChar: 0, 13954 lastChar: maxCharIndex 13955 }; 13956 this.extractDataStructures(dict, dict, xref, properties); 13957 13958 return { 13959 name: baseFontName, 13960 dict: baseDict, 13961 properties: properties 13962 }; 13963 } 13964 } 13965 13966 // According to the spec if 'FontDescriptor' is declared, 'FirstChar', 13967 // 'LastChar' and 'Widths' should exist too, but some PDF encoders seem 13968 // to ignore this rule when a variant of a standart font is used. 13969 // TODO Fill the width array depending on which of the base font this is 13970 // a variant. 13971 var firstChar = dict.get('FirstChar') || 0; 13972 var lastChar = dict.get('LastChar') || maxCharIndex; 13973 var fontName = descriptor.get('FontName'); 13974 // Some bad pdf's have a string as the font name. 13975 if (isString(fontName)) 13976 fontName = new Name(fontName); 13977 assertWellFormed(isName(fontName), 'invalid font name'); 13978 13979 var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3'); 13980 if (fontFile) { 13981 if (fontFile.dict) { 13982 var subtype = fontFile.dict.get('Subtype'); 13983 if (subtype) 13984 subtype = subtype.name; 13985 13986 var length1 = fontFile.dict.get('Length1'); 13987 13988 var length2 = fontFile.dict.get('Length2'); 13989 } 13990 } 13991 13992 var properties = { 13993 type: type.name, 13994 subtype: subtype, 13995 file: fontFile, 13996 length1: length1, 13997 length2: length2, 13998 composite: composite, 13999 wideChars: composite, 14000 fixedPitch: false, 14001 fontMatrix: dict.get('FontMatrix') || IDENTITY_MATRIX, 14002 firstChar: firstChar || 0, 14003 lastChar: lastChar || maxCharIndex, 14004 bbox: descriptor.get('FontBBox'), 14005 ascent: descriptor.get('Ascent'), 14006 descent: descriptor.get('Descent'), 14007 xHeight: descriptor.get('XHeight'), 14008 capHeight: descriptor.get('CapHeight'), 14009 flags: descriptor.get('Flags'), 14010 italicAngle: descriptor.get('ItalicAngle'), 14011 coded: false 14012 }; 14013 this.extractWidths(dict, xref, descriptor, properties); 14014 this.extractDataStructures(dict, baseDict, xref, properties); 14015 14016 if (type.name === 'Type3') { 14017 properties.coded = true; 14018 var charProcs = dict.get('CharProcs').getAll(); 14019 var fontResources = dict.get('Resources') || resources; 14020 properties.charProcOperatorList = {}; 14021 for (var key in charProcs) { 14022 var glyphStream = charProcs[key]; 14023 properties.charProcOperatorList[key] = 14024 this.getOperatorList(glyphStream, fontResources, dependency); 14025 } 14026 } 14027 14028 return { 14029 name: fontName.name, 14030 dict: baseDict, 14031 file: fontFile, 14032 properties: properties 14033 }; 14034 } 14035 }; 14036 14037 return PartialEvaluator; 14038 })(); 14039 14040 var EvalState = (function EvalStateClosure() { 14041 function EvalState() { 14042 // Are soft masks and alpha values shapes or opacities? 14043 this.alphaIsShape = false; 14044 this.fontSize = 0; 14045 this.textMatrix = IDENTITY_MATRIX; 14046 this.leading = 0; 14047 // Start of text line (in text coordinates) 14048 this.lineX = 0; 14049 this.lineY = 0; 14050 // Character and word spacing 14051 this.charSpacing = 0; 14052 this.wordSpacing = 0; 14053 this.textHScale = 1; 14054 // Color spaces 14055 this.fillColorSpace = null; 14056 this.strokeColorSpace = null; 14057 } 14058 EvalState.prototype = { 14059 }; 14060 return EvalState; 14061 })(); 14062 14063 14064 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 14065 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ 14066 14067 'use strict'; 14068 14069 /** 14070 * Maximum time to wait for a font to be loaded by font-face rules. 14071 */ 14072 var kMaxWaitForFontFace = 1000; 14073 14074 // Unicode Private Use Area 14075 var kCmapGlyphOffset = 0xE000; 14076 var kSizeOfGlyphArea = 0x1900; 14077 var kSymbolicFontGlyphOffset = 0xF000; 14078 14079 // PDF Glyph Space Units are one Thousandth of a TextSpace Unit 14080 // except for Type 3 fonts 14081 var kPDFGlyphSpaceUnits = 1000; 14082 14083 // Until hinting is fully supported this constant can be used 14084 var kHintingEnabled = false; 14085 14086 var FontFlags = { 14087 FixedPitch: 1, 14088 Serif: 2, 14089 Symbolic: 4, 14090 Script: 8, 14091 Nonsymbolic: 32, 14092 Italic: 64, 14093 AllCap: 65536, 14094 SmallCap: 131072, 14095 ForceBold: 262144 14096 }; 14097 14098 var Encodings = { 14099 ExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 14100 '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 14101 'space', 'exclamsmall', 'Hungarumlautsmall', '', 'dollaroldstyle', 14102 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior', 14103 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 14104 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 14105 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 14106 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 14107 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior', 14108 'questionsmall', '', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior', 14109 'esuperior', '', '', 'isuperior', '', '', 'lsuperior', 'msuperior', 14110 'nsuperior', 'osuperior', '', '', 'rsuperior', 'ssuperior', 'tsuperior', 14111 '', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 14112 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 14113 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 14114 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 14115 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 14116 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 14117 'onefitted', 'rupiah', 'Tildesmall', '', '', '', '', '', '', '', '', '', 14118 '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 14119 '', '', '', '', '', '', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', 14120 '', '', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 14121 'Caronsmall', '', 'Dotaccentsmall', '', '', 'Macronsmall', '', '', 14122 'figuredash', 'hypheninferior', '', '', 'Ogoneksmall', 'Ringsmall', 14123 'Cedillasmall', '', '', '', 'onequarter', 'onehalf', 'threequarters', 14124 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths', 14125 'seveneighths', 'onethird', 'twothirds', '', '', 'zerosuperior', 14126 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 14127 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior', 14128 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior', 14129 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior', 14130 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior', 14131 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall', 14132 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 14133 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall', 14134 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall', 14135 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall', 14136 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall', 14137 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall', 14138 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall', 14139 'Ydieresissmall'], 14140 MacExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', 14141 '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 14142 'space', 'exclamsmall', 'Hungarumlautsmall', 'centoldstyle', 14143 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 14144 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 14145 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle', 14146 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 14147 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 14148 'nineoldstyle', 'colon', 'semicolon', '', 'threequartersemdash', '', 14149 'questionsmall', '', '', '', '', 'Ethsmall', '', '', 'onequarter', 14150 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths', 14151 'seveneighths', 'onethird', 'twothirds', '', '', '', '', '', '', 'ff', 14152 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior', 14153 'Circumflexsmall', 'hypheninferior', 'Gravesmall', 'Asmall', 'Bsmall', 14154 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 14155 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 14156 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 14157 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 14158 'Tildesmall', '', '', 'asuperior', 'centsuperior', '', '', '', '', 14159 'Aacutesmall', 'Agravesmall', 'Acircumflexsmall', 'Adieresissmall', 14160 'Atildesmall', 'Aringsmall', 'Ccedillasmall', 'Eacutesmall', 'Egravesmall', 14161 'Ecircumflexsmall', 'Edieresissmall', 'Iacutesmall', 'Igravesmall', 14162 'Icircumflexsmall', 'Idieresissmall', 'Ntildesmall', 'Oacutesmall', 14163 'Ogravesmall', 'Ocircumflexsmall', 'Odieresissmall', 'Otildesmall', 14164 'Uacutesmall', 'Ugravesmall', 'Ucircumflexsmall', 'Udieresissmall', '', 14165 'eightsuperior', 'fourinferior', 'threeinferior', 'sixinferior', 14166 'eightinferior', 'seveninferior', 'Scaronsmall', '', 'centinferior', 14167 'twoinferior', '', 'Dieresissmall', '', 'Caronsmall', 'osuperior', 14168 'fiveinferior', '', 'commainferior', 'periodinferior', 'Yacutesmall', '', 14169 'dollarinferior', '', 'Thornsmall', '', 'nineinferior', 'zeroinferior', 14170 'Zcaronsmall', 'AEsmall', 'Oslashsmall', 'questiondownsmall', 14171 'oneinferior', 'Lslashsmall', '', '', '', '', '', '', 'Cedillasmall', '', 14172 '', '', '', '', 'OEsmall', 'figuredash', 'hyphensuperior', '', '', '', '', 14173 'exclamdownsmall', '', 'Ydieresissmall', '', 'onesuperior', 'twosuperior', 14174 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 14175 'sevensuperior', 'ninesuperior', 'zerosuperior', '', 'esuperior', 14176 'rsuperior', 'tsuperior', '', '', 'isuperior', 'ssuperior', 'dsuperior', 14177 '', '', '', '', '', 'lsuperior', 'Ogoneksmall', 'Brevesmall', 14178 'Macronsmall', 'bsuperior', 'nsuperior', 'msuperior', 'commasuperior', 14179 'periodsuperior', 'Dotaccentsmall', 'Ringsmall'], 14180 MacRomanEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 14181 '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 14182 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 14183 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 14184 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 14185 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 14186 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 14187 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 14188 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 14189 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 14190 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 14191 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '', 14192 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis', 14193 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde', 14194 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis', 14195 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 14196 'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 14197 'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling', 14198 'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright', 14199 'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 14200 'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff', 14201 'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine', 14202 'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot', 14203 'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft', 14204 'guillemotright', 'ellipsis', '', 'Agrave', 'Atilde', 'Otilde', 'OE', 14205 'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 14206 'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 14207 'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 14208 'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand', 14209 'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 14210 'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 14211 'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 14212 'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 14213 'ogonek', 'caron'], 14214 StandardEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 14215 '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 14216 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 14217 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', 14218 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 14219 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 14220 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 14221 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 14222 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 14223 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 14224 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 14225 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 14226 '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 14227 '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdown', 14228 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 14229 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 14230 'guilsinglright', 'fi', 'fl', '', 'endash', 'dagger', 'daggerdbl', 14231 'periodcentered', '', 'paragraph', 'bullet', 'quotesinglbase', 14232 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis', 14233 'perthousand', '', 'questiondown', '', 'grave', 'acute', 'circumflex', 14234 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', '', 'ring', 'cedilla', 14235 '', 'hungarumlaut', 'ogonek', 'caron', 'emdash', '', '', '', '', '', '', 14236 '', '', '', '', '', '', '', '', '', '', 'AE', '', 'ordfeminine', '', '', 14237 '', '', 'Lslash', 'Oslash', 'OE', 'ordmasculine', '', '', '', '', '', 'ae', 14238 '', '', '', 'dotlessi', '', '', 'lslash', 'oslash', 'oe', 'germandbls'], 14239 WinAnsiEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 14240 '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 14241 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 14242 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 14243 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 14244 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 14245 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 14246 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 14247 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 14248 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 14249 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 14250 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 14251 'bullet', 'Euro', 'bullet', 'quotesinglbase', 'florin', 'quotedblbase', 14252 'ellipsis', 'dagger', 'daggerdbl', 'circumflex', 'perthousand', 'Scaron', 14253 'guilsinglleft', 'OE', 'bullet', 'Zcaron', 'bullet', 'bullet', 'quoteleft', 14254 'quoteright', 'quotedblleft', 'quotedblright', 'bullet', 'endash', 14255 'emdash', 'tilde', 'trademark', 'scaron', 'guilsinglright', 'oe', 'bullet', 14256 'zcaron', 'Ydieresis', '', 'exclamdown', 'cent', 'sterling', 14257 'currency', 'yen', 'brokenbar', 'section', 'dieresis', 'copyright', 14258 'ordfeminine', 'guillemotleft', 'logicalnot', 'hyphen', 'registered', 14259 'macron', 'degree', 'plusminus', 'twosuperior', 'threesuperior', 'acute', 14260 'mu', 'paragraph', 'periodcentered', 'cedilla', 'onesuperior', 14261 'ordmasculine', 'guillemotright', 'onequarter', 'onehalf', 'threequarters', 14262 'questiondown', 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', 'Adieresis', 14263 'Aring', 'AE', 'Ccedilla', 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis', 14264 'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Eth', 'Ntilde', 'Ograve', 14265 'Oacute', 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', 'Oslash', 14266 'Ugrave', 'Uacute', 'Ucircumflex', 'Udieresis', 'Yacute', 'Thorn', 14267 'germandbls', 'agrave', 'aacute', 'acircumflex', 'atilde', 'adieresis', 14268 'aring', 'ae', 'ccedilla', 'egrave', 'eacute', 'ecircumflex', 'edieresis', 14269 'igrave', 'iacute', 'icircumflex', 'idieresis', 'eth', 'ntilde', 'ograve', 14270 'oacute', 'ocircumflex', 'otilde', 'odieresis', 'divide', 'oslash', 14271 'ugrave', 'uacute', 'ucircumflex', 'udieresis', 'yacute', 'thorn', 14272 'ydieresis'], 14273 symbolsEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 14274 '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 14275 'space', 'exclam', 'universal', 'numbersign', 'existential', 'percent', 14276 'ampersand', 'suchthat', 'parenleft', 'parenright', 'asteriskmath', 'plus', 14277 'comma', 'minus', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 14278 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 14279 'equal', 'greater', 'question', 'congruent', 'Alpha', 'Beta', 'Chi', 14280 'Delta', 'Epsilon', 'Phi', 'Gamma', 'Eta', 'Iota', 'theta1', 'Kappa', 14281 'Lambda', 'Mu', 'Nu', 'Omicron', 'Pi', 'Theta', 'Rho', 'Sigma', 'Tau', 14282 'Upsilon', 'sigma1', 'Omega', 'Xi', 'Psi', 'Zeta', 'bracketleft', 14283 'therefore', 'bracketright', 'perpendicular', 'underscore', 'radicalex', 14284 'alpha', 'beta', 'chi', 'delta', 'epsilon', 'phi', 'gamma', 'eta', 'iota', 14285 'phi1', 'kappa', 'lambda', 'mu', 'nu', 'omicron', 'pi', 'theta', 'rho', 14286 'sigma', 'tau', 'upsilon', 'omega1', 'omega', 'xi', 'psi', 'zeta', 14287 'braceleft', 'bar', 'braceright', 'similar', '', '', '', '', '', '', '', 14288 '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 14289 '', '', '', '', '', '', '', 'Euro', 'Upsilon1', 'minute', 'lessequal', 14290 'fraction', 'infinity', 'florin', 'club', 'diamond', 'heart', 'spade', 14291 'arrowboth', 'arrowleft', 'arrowup', 'arrowright', 'arrowdown', 'degree', 14292 'plusminus', 'second', 'greaterequal', 'multiply', 'proportional', 14293 'partialdiff', 'bullet', 'divide', 'notequal', 'equivalence', 14294 'approxequal', 'ellipsis', 'arrowvertex', 'arrowhorizex', 'carriagereturn', 14295 'aleph', 'Ifraktur', 'Rfraktur', 'weierstrass', 'circlemultiply', 14296 'circleplus', 'emptyset', 'intersection', 'union', 'propersuperset', 14297 'reflexsuperset', 'notsubset', 'propersubset', 'reflexsubset', 'element', 14298 'notelement', 'angle', 'gradient', 'registerserif', 'copyrightserif', 14299 'trademarkserif', 'product', 'radical', 'dotmath', 'logicalnot', 14300 'logicaland', 'logicalor', 'arrowdblboth', 'arrowdblleft', 'arrowdblup', 14301 'arrowdblright', 'arrowdbldown', 'lozenge', 'angleleft', 'registersans', 14302 'copyrightsans', 'trademarksans', 'summation', 'parenlefttp', 14303 'parenleftex', 'parenleftbt', 'bracketlefttp', 'bracketleftex', 14304 'bracketleftbt', 'bracelefttp', 'braceleftmid', 'braceleftbt', 'braceex', 14305 '', 'angleright', 'integral', 'integraltp', 'integralex', 'integralbt', 14306 'parenrighttp', 'parenrightex', 'parenrightbt', 'bracketrighttp', 14307 'bracketrightex', 'bracketrightbt', 'bracerighttp', 'bracerightmid', 14308 'bracerightbt'], 14309 zapfDingbatsEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', 14310 '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 14311 'space', 'a1', 'a2', 'a202', 'a3', 'a4', 'a5', 'a119', 'a118', 'a117', 14312 'a11', 'a12', 'a13', 'a14', 'a15', 'a16', 'a105', 'a17', 'a18', 'a19', 14313 'a20', 'a21', 'a22', 'a23', 'a24', 'a25', 'a26', 'a27', 'a28', 'a6', 'a7', 14314 'a8', 'a9', 'a10', 'a29', 'a30', 'a31', 'a32', 'a33', 'a34', 'a35', 'a36', 14315 'a37', 'a38', 'a39', 'a40', 'a41', 'a42', 'a43', 'a44', 'a45', 'a46', 14316 'a47', 'a48', 'a49', 'a50', 'a51', 'a52', 'a53', 'a54', 'a55', 'a56', 14317 'a57', 'a58', 'a59', 'a60', 'a61', 'a62', 'a63', 'a64', 'a65', 'a66', 14318 'a67', 'a68', 'a69', 'a70', 'a71', 'a72', 'a73', 'a74', 'a203', 'a75', 14319 'a204', 'a76', 'a77', 'a78', 'a79', 'a81', 'a82', 'a83', 'a84', 'a97', 14320 'a98', 'a99', 'a100', '', '', '', '', '', '', '', '', '', '', '', '', '', 14321 '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 14322 '', '', 'a101', 'a102', 'a103', 'a104', 'a106', 'a107', 'a108', 'a112', 14323 'a111', 'a110', 'a109', 'a120', 'a121', 'a122', 'a123', 'a124', 'a125', 14324 'a126', 'a127', 'a128', 'a129', 'a130', 'a131', 'a132', 'a133', 'a134', 14325 'a135', 'a136', 'a137', 'a138', 'a139', 'a140', 'a141', 'a142', 'a143', 14326 'a144', 'a145', 'a146', 'a147', 'a148', 'a149', 'a150', 'a151', 'a152', 14327 'a153', 'a154', 'a155', 'a156', 'a157', 'a158', 'a159', 'a160', 'a161', 14328 'a163', 'a164', 'a196', 'a165', 'a192', 'a166', 'a167', 'a168', 'a169', 14329 'a170', 'a171', 'a172', 'a173', 'a162', 'a174', 'a175', 'a176', 'a177', 14330 'a178', 'a179', 'a193', 'a180', 'a199', 'a181', 'a200', 'a182', '', 'a201', 14331 'a183', 'a184', 'a197', 'a185', 'a194', 'a198', 'a186', 'a195', 'a187', 14332 'a188', 'a189', 'a190', 'a191'] 14333 }; 14334 14335 /** 14336 * Hold a map of decoded fonts and of the standard fourteen Type1 14337 * fonts and their acronyms. 14338 */ 14339 var stdFontMap = { 14340 'ArialNarrow': 'Helvetica', 14341 'ArialNarrow-Bold': 'Helvetica-Bold', 14342 'ArialNarrow-BoldItalic': 'Helvetica-BoldOblique', 14343 'ArialNarrow-Italic': 'Helvetica-Oblique', 14344 'ArialBlack': 'Helvetica', 14345 'ArialBlack-Bold': 'Helvetica-Bold', 14346 'ArialBlack-BoldItalic': 'Helvetica-BoldOblique', 14347 'ArialBlack-Italic': 'Helvetica-Oblique', 14348 'Arial': 'Helvetica', 14349 'Arial-Bold': 'Helvetica-Bold', 14350 'Arial-BoldItalic': 'Helvetica-BoldOblique', 14351 'Arial-Italic': 'Helvetica-Oblique', 14352 'Arial-BoldItalicMT': 'Helvetica-BoldOblique', 14353 'Arial-BoldMT': 'Helvetica-Bold', 14354 'Arial-ItalicMT': 'Helvetica-Oblique', 14355 'ArialMT': 'Helvetica', 14356 'Courier-Bold': 'Courier-Bold', 14357 'Courier-BoldItalic': 'Courier-BoldOblique', 14358 'Courier-Italic': 'Courier-Oblique', 14359 'CourierNew': 'Courier', 14360 'CourierNew-Bold': 'Courier-Bold', 14361 'CourierNew-BoldItalic': 'Courier-BoldOblique', 14362 'CourierNew-Italic': 'Courier-Oblique', 14363 'CourierNewPS-BoldItalicMT': 'Courier-BoldOblique', 14364 'CourierNewPS-BoldMT': 'Courier-Bold', 14365 'CourierNewPS-ItalicMT': 'Courier-Oblique', 14366 'CourierNewPSMT': 'Courier', 14367 'Helvetica-Bold': 'Helvetica-Bold', 14368 'Helvetica-BoldItalic': 'Helvetica-BoldOblique', 14369 'Helvetica-Italic': 'Helvetica-Oblique', 14370 'Symbol-Bold': 'Symbol', 14371 'Symbol-BoldItalic': 'Symbol', 14372 'Symbol-Italic': 'Symbol', 14373 'TimesNewRoman': 'Times-Roman', 14374 'TimesNewRoman-Bold': 'Times-Bold', 14375 'TimesNewRoman-BoldItalic': 'Times-BoldItalic', 14376 'TimesNewRoman-Italic': 'Times-Italic', 14377 'TimesNewRomanPS': 'Times-Roman', 14378 'TimesNewRomanPS-Bold': 'Times-Bold', 14379 'TimesNewRomanPS-BoldItalic': 'Times-BoldItalic', 14380 'TimesNewRomanPS-BoldItalicMT': 'Times-BoldItalic', 14381 'TimesNewRomanPS-BoldMT': 'Times-Bold', 14382 'TimesNewRomanPS-Italic': 'Times-Italic', 14383 'TimesNewRomanPS-ItalicMT': 'Times-Italic', 14384 'TimesNewRomanPSMT': 'Times-Roman', 14385 'TimesNewRomanPSMT-Bold': 'Times-Bold', 14386 'TimesNewRomanPSMT-BoldItalic': 'Times-BoldItalic', 14387 'TimesNewRomanPSMT-Italic': 'Times-Italic' 14388 }; 14389 14390 /** 14391 * Holds the map of the non-standard fonts that might be included as a standard 14392 * fonts without glyph data. 14393 */ 14394 var nonStdFontMap = { 14395 'ComicSansMS': 'Comic Sans MS', 14396 'ComicSansMS-Bold': 'Comic Sans MS-Bold', 14397 'ComicSansMS-BoldItalic': 'Comic Sans MS-BoldItalic', 14398 'ComicSansMS-Italic': 'Comic Sans MS-Italic', 14399 'LucidaConsole': 'Courier', 14400 'LucidaConsole-Bold': 'Courier-Bold', 14401 'LucidaConsole-BoldItalic': 'Courier-BoldOblique', 14402 'LucidaConsole-Italic': 'Courier-Oblique' 14403 }; 14404 14405 var serifFonts = { 14406 'Adobe Jenson': true, 'Adobe Text': true, 'Albertus': true, 14407 'Aldus': true, 'Alexandria': true, 'Algerian': true, 14408 'American Typewriter': true, 'Antiqua': true, 'Apex': true, 14409 'Arno': true, 'Aster': true, 'Aurora': true, 14410 'Baskerville': true, 'Bell': true, 'Bembo': true, 14411 'Bembo Schoolbook': true, 'Benguiat': true, 'Berkeley Old Style': true, 14412 'Bernhard Modern': true, 'Berthold City': true, 'Bodoni': true, 14413 'Bauer Bodoni': true, 'Book Antiqua': true, 'Bookman': true, 14414 'Bordeaux Roman': true, 'Californian FB': true, 'Calisto': true, 14415 'Calvert': true, 'Capitals': true, 'Cambria': true, 14416 'Cartier': true, 'Caslon': true, 'Catull': true, 14417 'Centaur': true, 'Century Old Style': true, 'Century Schoolbook': true, 14418 'Chaparral': true, 'Charis SIL': true, 'Cheltenham': true, 14419 'Cholla Slab': true, 'Clarendon': true, 'Clearface': true, 14420 'Cochin': true, 'Colonna': true, 'Computer Modern': true, 14421 'Concrete Roman': true, 'Constantia': true, 'Cooper Black': true, 14422 'Corona': true, 'Ecotype': true, 'Egyptienne': true, 14423 'Elephant': true, 'Excelsior': true, 'Fairfield': true, 14424 'FF Scala': true, 'Folkard': true, 'Footlight': true, 14425 'FreeSerif': true, 'Friz Quadrata': true, 'Garamond': true, 14426 'Gentium': true, 'Georgia': true, 'Gloucester': true, 14427 'Goudy Old Style': true, 'Goudy Schoolbook': true, 'Goudy Pro Font': true, 14428 'Granjon': true, 'Guardian Egyptian': true, 'Heather': true, 14429 'Hercules': true, 'High Tower Text': true, 'Hiroshige': true, 14430 'Hoefler Text': true, 'Humana Serif': true, 'Imprint': true, 14431 'Ionic No. 5': true, 'Janson': true, 'Joanna': true, 14432 'Korinna': true, 'Lexicon': true, 'Liberation Serif': true, 14433 'Linux Libertine': true, 'Literaturnaya': true, 'Lucida': true, 14434 'Lucida Bright': true, 'Melior': true, 'Memphis': true, 14435 'Miller': true, 'Minion': true, 'Modern': true, 14436 'Mona Lisa': true, 'Mrs Eaves': true, 'MS Serif': true, 14437 'Museo Slab': true, 'New York': true, 'Nimbus Roman': true, 14438 'NPS Rawlinson Roadway': true, 'Palatino': true, 'Perpetua': true, 14439 'Plantin': true, 'Plantin Schoolbook': true, 'Playbill': true, 14440 'Poor Richard': true, 'Rawlinson Roadway': true, 'Renault': true, 14441 'Requiem': true, 'Rockwell': true, 'Roman': true, 14442 'Rotis Serif': true, 'Sabon': true, 'Scala': true, 14443 'Seagull': true, 'Sistina': true, 'Souvenir': true, 14444 'STIX': true, 'Stone Informal': true, 'Stone Serif': true, 14445 'Sylfaen': true, 'Times': true, 'Trajan': true, 14446 'Trinit': true, 'Trump Mediaeval': true, 'Utopia': true, 14447 'Vale Type': true, 'Bitstream Vera': true, 'Vera Serif': true, 14448 'Versailles': true, 'Wanted': true, 'Weiss': true, 14449 'Wide Latin': true, 'Windsor': true, 'XITS': true 14450 }; 14451 14452 var symbolsFonts = { 14453 'Dingbats': true, 'Symbol': true, 'ZapfDingbats': true 14454 }; 14455 14456 // Some characters, e.g. copyrightserif, mapped to the private use area and 14457 // might not be displayed using standard fonts. Mapping/hacking well-known chars 14458 // to the similar equivalents in the normal characters range. 14459 function mapPrivateUseChars(code) { 14460 switch (code) { 14461 case 0xF8E9: // copyrightsans 14462 case 0xF6D9: // copyrightserif 14463 return 0x00A9; // copyright 14464 default: 14465 return code; 14466 } 14467 } 14468 14469 var FontLoader = { 14470 listeningForFontLoad: false, 14471 14472 bind: function fontLoaderBind(fonts, callback) { 14473 function checkFontsLoaded() { 14474 for (var i = 0, ii = fonts.length; i < ii; i++) { 14475 var fontObj = fonts[i]; 14476 if (fontObj.loading) { 14477 return false; 14478 } 14479 } 14480 14481 PdfJS_window.document.documentElement.removeEventListener( 14482 'pdfjsFontLoad', checkFontsLoaded, false); 14483 14484 callback(); 14485 return true; 14486 } 14487 14488 var rules = [], names = [], fontsToLoad = []; 14489 var fontCreateTimer = 0; 14490 14491 for (var i = 0, ii = fonts.length; i < ii; i++) { 14492 var font = fonts[i]; 14493 14494 // Add the font to the DOM only once or skip if the font 14495 // is already loaded. 14496 if (font.attached || font.loading == false) { 14497 continue; 14498 } 14499 font.attached = true; 14500 14501 fontsToLoad.push(font); 14502 14503 var str = ''; 14504 var data = font.data; 14505 if (data) { 14506 var length = data.length; 14507 for (var j = 0; j < length; j++) 14508 str += String.fromCharCode(data[j]); 14509 14510 var rule = font.bindDOM(str); 14511 if (rule) { 14512 rules.push(rule); 14513 names.push(font.loadedName); 14514 } 14515 } 14516 } 14517 14518 this.listeningForFontLoad = false; 14519 if (!isWorker && rules.length) { 14520 FontLoader.prepareFontLoadEvent(rules, names, fontsToLoad); 14521 } 14522 14523 if (!checkFontsLoaded()) { 14524 PdfJS_window.document.documentElement.addEventListener( 14525 'pdfjsFontLoad', checkFontsLoaded, false); 14526 } 14527 }, 14528 // Set things up so that at least one pdfjsFontLoad event is 14529 // dispatched when all the @font-face |rules| for |names| have been 14530 // loaded in a subdocument. It's expected that the load of |rules| 14531 // has already started in this (outer) document, so that they should 14532 // be ordered before the load in the subdocument. 14533 prepareFontLoadEvent: function fontLoaderPrepareFontLoadEvent(rules, names, 14534 fonts) { 14535 /** Hack begin */ 14536 // There's no event when a font has finished downloading so the 14537 // following code is a dirty hack to 'guess' when a font is 14538 // ready. This code will be obsoleted by Mozilla bug 471915. 14539 // 14540 // The only reliable way to know if a font is loaded in Gecko 14541 // (at the moment) is document.onload in a document with 14542 // a @font-face rule defined in a "static" stylesheet. We use a 14543 // subdocument in an <iframe>, set up properly, to know when 14544 // our @font-face rule was loaded. However, the subdocument and 14545 // outer document can't share CSS rules, so the inner document 14546 // is only part of the puzzle. The second piece is an invisible 14547 // div created in order to force loading of the @font-face in 14548 // the *outer* document. (The font still needs to be loaded for 14549 // its metrics, for reflow). We create the div first for the 14550 // outer document, then create the iframe. Unless something 14551 // goes really wonkily, we expect the @font-face for the outer 14552 // document to be processed before the inner. That's still 14553 // fragile, but seems to work in practice. 14554 // 14555 // The postMessage() hackery was added to work around chrome bug 14556 // 82402. 14557 14558 // Validate the names parameter -- the values can used to construct HTML. 14559 if (!/^\w+$/.test(names.join(''))) { 14560 error('Invalid font name(s): ' + names.join()); 14561 14562 // Normally the error-function throws. But if a malicious code 14563 // intercepts the function call then the return is needed. 14564 return; 14565 } 14566 14567 var div = PdfJS_window.document.createElement('div'); 14568 div.setAttribute('style', 14569 'visibility: hidden;' + 14570 'width: 10px; height: 10px;' + 14571 'position: absolute; top: 0px; left: 0px;'); 14572 var html = ''; 14573 for (var i = 0, ii = names.length; i < ii; ++i) { 14574 html += '<span style="font-family:' + names[i] + '">Hi</span>'; 14575 } 14576 div.innerHTML = html; 14577 PdfJS_window.document.body.appendChild(div); 14578 14579 if (!this.listeningForFontLoad) { 14580 PdfJS_window.window.addEventListener( 14581 'message', 14582 function fontLoaderMessage(e) { 14583 var fontNames = JSON.parse(e.data); 14584 for (var i = 0, ii = fonts.length; i < ii; ++i) { 14585 var font = fonts[i]; 14586 font.loading = false; 14587 } 14588 var evt = PdfJS_window.document.createEvent('Events'); 14589 evt.initEvent('pdfjsFontLoad', true, false); 14590 PdfJS_window.document.documentElement.dispatchEvent(evt); 14591 }, 14592 false); 14593 this.listeningForFontLoad = true; 14594 } 14595 14596 // XXX we should have a time-out here too, and maybe fire 14597 // pdfjsFontLoadFailed? 14598 var src = '<!DOCTYPE HTML><html><head>'; 14599 src += '<style type="text/css">'; 14600 for (var i = 0, ii = rules.length; i < ii; ++i) { 14601 src += rules[i]; 14602 } 14603 src += '</style>'; 14604 src += '<script type="application/javascript">'; 14605 var fontNamesArray = ''; 14606 for (var i = 0, ii = names.length; i < ii; ++i) { 14607 fontNamesArray += '"' + names[i] + '", '; 14608 } 14609 src += ' var fontNames=[' + fontNamesArray + '];\n'; 14610 src += ' PdfJS_window.window.onload = function fontLoaderOnload() {\n'; 14611 src += ' parent.postMessage(JSON.stringify(fontNames), "*");\n'; 14612 src += ' }'; 14613 // Hack so the end script tag isn't counted if this is inline JS. 14614 src += '</scr' + 'ipt></head><body>'; 14615 for (var i = 0, ii = names.length; i < ii; ++i) { 14616 src += '<p style="font-family:\'' + names[i] + '\'">Hi</p>'; 14617 } 14618 src += '</body></html>'; 14619 var frame = PdfJS_window.document.createElement('iframe'); 14620 frame.src = 'data:text/html,' + src; 14621 frame.setAttribute('style', 14622 'visibility: hidden;' + 14623 'width: 10px; height: 10px;' + 14624 'position: absolute; top: 0px; left: 0px;'); 14625 PdfJS_window.document.body.appendChild(frame); 14626 /** Hack end */ 14627 } 14628 }; 14629 14630 var UnicodeRanges = [ 14631 { 'begin': 0x0000, 'end': 0x007F }, // Basic Latin 14632 { 'begin': 0x0080, 'end': 0x00FF }, // Latin-1 Supplement 14633 { 'begin': 0x0100, 'end': 0x017F }, // Latin Extended-A 14634 { 'begin': 0x0180, 'end': 0x024F }, // Latin Extended-B 14635 { 'begin': 0x0250, 'end': 0x02AF }, // IPA Extensions 14636 { 'begin': 0x02B0, 'end': 0x02FF }, // Spacing Modifier Letters 14637 { 'begin': 0x0300, 'end': 0x036F }, // Combining Diacritical Marks 14638 { 'begin': 0x0370, 'end': 0x03FF }, // Greek and Coptic 14639 { 'begin': 0x2C80, 'end': 0x2CFF }, // Coptic 14640 { 'begin': 0x0400, 'end': 0x04FF }, // Cyrillic 14641 { 'begin': 0x0530, 'end': 0x058F }, // Armenian 14642 { 'begin': 0x0590, 'end': 0x05FF }, // Hebrew 14643 { 'begin': 0xA500, 'end': 0xA63F }, // Vai 14644 { 'begin': 0x0600, 'end': 0x06FF }, // Arabic 14645 { 'begin': 0x07C0, 'end': 0x07FF }, // NKo 14646 { 'begin': 0x0900, 'end': 0x097F }, // Devanagari 14647 { 'begin': 0x0980, 'end': 0x09FF }, // Bengali 14648 { 'begin': 0x0A00, 'end': 0x0A7F }, // Gurmukhi 14649 { 'begin': 0x0A80, 'end': 0x0AFF }, // Gujarati 14650 { 'begin': 0x0B00, 'end': 0x0B7F }, // Oriya 14651 { 'begin': 0x0B80, 'end': 0x0BFF }, // Tamil 14652 { 'begin': 0x0C00, 'end': 0x0C7F }, // Telugu 14653 { 'begin': 0x0C80, 'end': 0x0CFF }, // Kannada 14654 { 'begin': 0x0D00, 'end': 0x0D7F }, // Malayalam 14655 { 'begin': 0x0E00, 'end': 0x0E7F }, // Thai 14656 { 'begin': 0x0E80, 'end': 0x0EFF }, // Lao 14657 { 'begin': 0x10A0, 'end': 0x10FF }, // Georgian 14658 { 'begin': 0x1B00, 'end': 0x1B7F }, // Balinese 14659 { 'begin': 0x1100, 'end': 0x11FF }, // Hangul Jamo 14660 { 'begin': 0x1E00, 'end': 0x1EFF }, // Latin Extended Additional 14661 { 'begin': 0x1F00, 'end': 0x1FFF }, // Greek Extended 14662 { 'begin': 0x2000, 'end': 0x206F }, // General Punctuation 14663 { 'begin': 0x2070, 'end': 0x209F }, // Superscripts And Subscripts 14664 { 'begin': 0x20A0, 'end': 0x20CF }, // Currency Symbol 14665 { 'begin': 0x20D0, 'end': 0x20FF }, // Combining Diacritical Marks For Symbols 14666 { 'begin': 0x2100, 'end': 0x214F }, // Letterlike Symbols 14667 { 'begin': 0x2150, 'end': 0x218F }, // Number Forms 14668 { 'begin': 0x2190, 'end': 0x21FF }, // Arrows 14669 { 'begin': 0x2200, 'end': 0x22FF }, // Mathematical Operators 14670 { 'begin': 0x2300, 'end': 0x23FF }, // Miscellaneous Technical 14671 { 'begin': 0x2400, 'end': 0x243F }, // Control Pictures 14672 { 'begin': 0x2440, 'end': 0x245F }, // Optical Character Recognition 14673 { 'begin': 0x2460, 'end': 0x24FF }, // Enclosed Alphanumerics 14674 { 'begin': 0x2500, 'end': 0x257F }, // Box Drawing 14675 { 'begin': 0x2580, 'end': 0x259F }, // Block Elements 14676 { 'begin': 0x25A0, 'end': 0x25FF }, // Geometric Shapes 14677 { 'begin': 0x2600, 'end': 0x26FF }, // Miscellaneous Symbols 14678 { 'begin': 0x2700, 'end': 0x27BF }, // Dingbats 14679 { 'begin': 0x3000, 'end': 0x303F }, // CJK Symbols And Punctuation 14680 { 'begin': 0x3040, 'end': 0x309F }, // Hiragana 14681 { 'begin': 0x30A0, 'end': 0x30FF }, // Katakana 14682 { 'begin': 0x3100, 'end': 0x312F }, // Bopomofo 14683 { 'begin': 0x3130, 'end': 0x318F }, // Hangul Compatibility Jamo 14684 { 'begin': 0xA840, 'end': 0xA87F }, // Phags-pa 14685 { 'begin': 0x3200, 'end': 0x32FF }, // Enclosed CJK Letters And Months 14686 { 'begin': 0x3300, 'end': 0x33FF }, // CJK Compatibility 14687 { 'begin': 0xAC00, 'end': 0xD7AF }, // Hangul Syllables 14688 { 'begin': 0xD800, 'end': 0xDFFF }, // Non-Plane 0 * 14689 { 'begin': 0x10900, 'end': 0x1091F }, // Phoenicia 14690 { 'begin': 0x4E00, 'end': 0x9FFF }, // CJK Unified Ideographs 14691 { 'begin': 0xE000, 'end': 0xF8FF }, // Private Use Area (plane 0) 14692 { 'begin': 0x31C0, 'end': 0x31EF }, // CJK Strokes 14693 { 'begin': 0xFB00, 'end': 0xFB4F }, // Alphabetic Presentation Forms 14694 { 'begin': 0xFB50, 'end': 0xFDFF }, // Arabic Presentation Forms-A 14695 { 'begin': 0xFE20, 'end': 0xFE2F }, // Combining Half Marks 14696 { 'begin': 0xFE10, 'end': 0xFE1F }, // Vertical Forms 14697 { 'begin': 0xFE50, 'end': 0xFE6F }, // Small Form Variants 14698 { 'begin': 0xFE70, 'end': 0xFEFF }, // Arabic Presentation Forms-B 14699 { 'begin': 0xFF00, 'end': 0xFFEF }, // Halfwidth And Fullwidth Forms 14700 { 'begin': 0xFFF0, 'end': 0xFFFF }, // Specials 14701 { 'begin': 0x0F00, 'end': 0x0FFF }, // Tibetan 14702 { 'begin': 0x0700, 'end': 0x074F }, // Syriac 14703 { 'begin': 0x0780, 'end': 0x07BF }, // Thaana 14704 { 'begin': 0x0D80, 'end': 0x0DFF }, // Sinhala 14705 { 'begin': 0x1000, 'end': 0x109F }, // Myanmar 14706 { 'begin': 0x1200, 'end': 0x137F }, // Ethiopic 14707 { 'begin': 0x13A0, 'end': 0x13FF }, // Cherokee 14708 { 'begin': 0x1400, 'end': 0x167F }, // Unified Canadian Aboriginal Syllabics 14709 { 'begin': 0x1680, 'end': 0x169F }, // Ogham 14710 { 'begin': 0x16A0, 'end': 0x16FF }, // Runic 14711 { 'begin': 0x1780, 'end': 0x17FF }, // Khmer 14712 { 'begin': 0x1800, 'end': 0x18AF }, // Mongolian 14713 { 'begin': 0x2800, 'end': 0x28FF }, // Braille Patterns 14714 { 'begin': 0xA000, 'end': 0xA48F }, // Yi Syllables 14715 { 'begin': 0x1700, 'end': 0x171F }, // Tagalog 14716 { 'begin': 0x10300, 'end': 0x1032F }, // Old Italic 14717 { 'begin': 0x10330, 'end': 0x1034F }, // Gothic 14718 { 'begin': 0x10400, 'end': 0x1044F }, // Deseret 14719 { 'begin': 0x1D000, 'end': 0x1D0FF }, // Byzantine Musical Symbols 14720 { 'begin': 0x1D400, 'end': 0x1D7FF }, // Mathematical Alphanumeric Symbols 14721 { 'begin': 0xFF000, 'end': 0xFFFFD }, // Private Use (plane 15) 14722 { 'begin': 0xFE00, 'end': 0xFE0F }, // Variation Selectors 14723 { 'begin': 0xE0000, 'end': 0xE007F }, // Tags 14724 { 'begin': 0x1900, 'end': 0x194F }, // Limbu 14725 { 'begin': 0x1950, 'end': 0x197F }, // Tai Le 14726 { 'begin': 0x1980, 'end': 0x19DF }, // New Tai Lue 14727 { 'begin': 0x1A00, 'end': 0x1A1F }, // Buginese 14728 { 'begin': 0x2C00, 'end': 0x2C5F }, // Glagolitic 14729 { 'begin': 0x2D30, 'end': 0x2D7F }, // Tifinagh 14730 { 'begin': 0x4DC0, 'end': 0x4DFF }, // Yijing Hexagram Symbols 14731 { 'begin': 0xA800, 'end': 0xA82F }, // Syloti Nagri 14732 { 'begin': 0x10000, 'end': 0x1007F }, // Linear B Syllabary 14733 { 'begin': 0x10140, 'end': 0x1018F }, // Ancient Greek Numbers 14734 { 'begin': 0x10380, 'end': 0x1039F }, // Ugaritic 14735 { 'begin': 0x103A0, 'end': 0x103DF }, // Old Persian 14736 { 'begin': 0x10450, 'end': 0x1047F }, // Shavian 14737 { 'begin': 0x10480, 'end': 0x104AF }, // Osmanya 14738 { 'begin': 0x10800, 'end': 0x1083F }, // Cypriot Syllabary 14739 { 'begin': 0x10A00, 'end': 0x10A5F }, // Kharoshthi 14740 { 'begin': 0x1D300, 'end': 0x1D35F }, // Tai Xuan Jing Symbols 14741 { 'begin': 0x12000, 'end': 0x123FF }, // Cuneiform 14742 { 'begin': 0x1D360, 'end': 0x1D37F }, // Counting Rod Numerals 14743 { 'begin': 0x1B80, 'end': 0x1BBF }, // Sundanese 14744 { 'begin': 0x1C00, 'end': 0x1C4F }, // Lepcha 14745 { 'begin': 0x1C50, 'end': 0x1C7F }, // Ol Chiki 14746 { 'begin': 0xA880, 'end': 0xA8DF }, // Saurashtra 14747 { 'begin': 0xA900, 'end': 0xA92F }, // Kayah Li 14748 { 'begin': 0xA930, 'end': 0xA95F }, // Rejang 14749 { 'begin': 0xAA00, 'end': 0xAA5F }, // Cham 14750 { 'begin': 0x10190, 'end': 0x101CF }, // Ancient Symbols 14751 { 'begin': 0x101D0, 'end': 0x101FF }, // Phaistos Disc 14752 { 'begin': 0x102A0, 'end': 0x102DF }, // Carian 14753 { 'begin': 0x1F030, 'end': 0x1F09F } // Domino Tiles 14754 ]; 14755 14756 var MacStandardGlyphOrdering = [ 14757 '.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl', 14758 'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft', 14759 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 14760 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 14761 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at', 14762 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 14763 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 14764 'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b', 14765 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 14766 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 14767 'asciitilde', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 14768 'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 14769 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis', 14770 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve', 14771 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex', 14772 'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet', 14773 'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute', 14774 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal', 14775 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi', 14776 'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash', 14777 'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin', 14778 'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis', 14779 'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash', 14780 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright', 14781 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency', 14782 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered', 14783 'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex', 14784 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 14785 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute', 14786 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron', 14787 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 14788 'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar', 14789 'Eth', 'eth', 'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply', 14790 'onesuperior', 'twosuperior', 'threesuperior', 'onehalf', 'onequarter', 14791 'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla', 14792 'scedilla', 'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat']; 14793 14794 function getUnicodeRangeFor(value) { 14795 for (var i = 0, ii = UnicodeRanges.length; i < ii; i++) { 14796 var range = UnicodeRanges[i]; 14797 if (value >= range.begin && value < range.end) 14798 return i; 14799 } 14800 return -1; 14801 } 14802 14803 function isRTLRangeFor(value) { 14804 var range = UnicodeRanges[13]; 14805 if (value >= range.begin && value < range.end) 14806 return true; 14807 range = UnicodeRanges[11]; 14808 if (value >= range.begin && value < range.end) 14809 return true; 14810 return false; 14811 } 14812 14813 function isSpecialUnicode(unicode) { 14814 return (unicode <= 0x1F || (unicode >= 127 && unicode < kSizeOfGlyphArea)) || 14815 (unicode >= kCmapGlyphOffset && 14816 unicode < kCmapGlyphOffset + kSizeOfGlyphArea); 14817 } 14818 14819 /** 14820 * 'Font' is the class the outside world should use, it encapsulate all the font 14821 * decoding logics whatever type it is (assuming the font type is supported). 14822 * 14823 * For example to read a Type1 font and to attach it to the document: 14824 * var type1Font = new Font("MyFontName", binaryFile, propertiesObject); 14825 * type1Font.bind(); 14826 */ 14827 var Font = (function FontClosure() { 14828 function Font(name, file, properties) { 14829 this.name = name; 14830 this.coded = properties.coded; 14831 this.charProcOperatorList = properties.charProcOperatorList; 14832 this.sizes = []; 14833 14834 var names = name.split('+'); 14835 names = names.length > 1 ? names[1] : names[0]; 14836 names = names.split(/[-,_]/g)[0]; 14837 this.isSerifFont = !!(properties.flags & FontFlags.Serif); 14838 this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic); 14839 14840 var type = properties.type; 14841 this.type = type; 14842 14843 // If the font is to be ignored, register it like an already loaded font 14844 // to avoid the cost of waiting for it be be loaded by the platform. 14845 if (properties.ignore) { 14846 this.loadedName = this.isSerifFont ? 'serif' : 'sans-serif'; 14847 this.loading = false; 14848 return; 14849 } 14850 14851 this.differences = properties.differences; 14852 this.widths = properties.widths; 14853 this.defaultWidth = properties.defaultWidth; 14854 this.composite = properties.composite; 14855 this.wideChars = properties.wideChars; 14856 this.hasEncoding = properties.hasEncoding; 14857 14858 this.fontMatrix = properties.fontMatrix; 14859 this.widthMultiplier = 1.0; 14860 if (properties.type == 'Type3') { 14861 this.encoding = properties.baseEncoding; 14862 return; 14863 } 14864 14865 // Trying to fix encoding using glyph CIDSystemInfo. 14866 this.loadCidToUnicode(properties); 14867 14868 if (properties.toUnicode) 14869 this.toUnicode = properties.toUnicode; 14870 else 14871 this.rebuildToUnicode(properties); 14872 14873 this.toFontChar = this.buildToFontChar(this.toUnicode); 14874 14875 if (!file) { 14876 // The file data is not specified. Trying to fix the font name 14877 // to be used with the canvas.font. 14878 var fontName = name.replace(/[,_]/g, '-'); 14879 fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName; 14880 14881 this.bold = (fontName.search(/bold/gi) != -1); 14882 this.italic = (fontName.search(/oblique/gi) != -1) || 14883 (fontName.search(/italic/gi) != -1); 14884 14885 // Use 'name' instead of 'fontName' here because the original 14886 // name ArialBlack for example will be replaced by Helvetica. 14887 this.black = (name.search(/Black/g) != -1); 14888 14889 this.encoding = properties.baseEncoding; 14890 this.noUnicodeAdaptation = true; 14891 this.loadedName = fontName.split('-')[0]; 14892 this.loading = false; 14893 return; 14894 } 14895 14896 var data; 14897 switch (type) { 14898 case 'Type1': 14899 case 'CIDFontType0': 14900 this.mimetype = 'font/opentype'; 14901 14902 var subtype = properties.subtype; 14903 var cff = (subtype == 'Type1C' || subtype == 'CIDFontType0C') ? 14904 new CFFFont(file, properties) : new Type1Font(name, file, properties); 14905 14906 // Wrap the CFF data inside an OTF font file 14907 data = this.convert(name, cff, properties); 14908 break; 14909 14910 case 'TrueType': 14911 case 'CIDFontType2': 14912 this.mimetype = 'font/opentype'; 14913 14914 // Repair the TrueType file. It is can be damaged in the point of 14915 // view of the sanitizer 14916 data = this.checkAndRepair(name, file, properties); 14917 break; 14918 14919 default: 14920 warn('Font ' + properties.type + ' is not supported'); 14921 break; 14922 } 14923 14924 this.data = data; 14925 this.fontMatrix = properties.fontMatrix; 14926 this.widthMultiplier = !properties.fontMatrix ? 1.0 : 14927 1.0 / properties.fontMatrix[0]; 14928 this.encoding = properties.baseEncoding; 14929 this.loadedName = properties.loadedName; 14930 this.loading = true; 14931 }; 14932 14933 var numFonts = 0; 14934 function getUniqueName() { 14935 return 'pdfFont' + numFonts++; 14936 } 14937 14938 function stringToArray(str) { 14939 var array = []; 14940 for (var i = 0, ii = str.length; i < ii; ++i) 14941 array[i] = str.charCodeAt(i); 14942 14943 return array; 14944 }; 14945 14946 function arrayToString(arr) { 14947 var str = ''; 14948 for (var i = 0, ii = arr.length; i < ii; ++i) 14949 str += String.fromCharCode(arr[i]); 14950 14951 return str; 14952 }; 14953 14954 function int16(bytes) { 14955 return (bytes[0] << 8) + (bytes[1] & 0xff); 14956 }; 14957 14958 function int32(bytes) { 14959 return (bytes[0] << 24) + (bytes[1] << 16) + 14960 (bytes[2] << 8) + (bytes[3] & 0xff); 14961 }; 14962 14963 function getMaxPower2(number) { 14964 var maxPower = 0; 14965 var value = number; 14966 while (value >= 2) { 14967 value /= 2; 14968 maxPower++; 14969 } 14970 14971 value = 2; 14972 for (var i = 1; i < maxPower; i++) 14973 value *= 2; 14974 return value; 14975 }; 14976 14977 function string16(value) { 14978 return String.fromCharCode((value >> 8) & 0xff) + 14979 String.fromCharCode(value & 0xff); 14980 }; 14981 14982 function safeString16(value) { 14983 // clamp value to the 16-bit int range 14984 value = value > 0x7FFF ? 0x7FFF : value < -0x8000 ? -0x8000 : value; 14985 return String.fromCharCode((value >> 8) & 0xff) + 14986 String.fromCharCode(value & 0xff); 14987 }; 14988 14989 function string32(value) { 14990 return String.fromCharCode((value >> 24) & 0xff) + 14991 String.fromCharCode((value >> 16) & 0xff) + 14992 String.fromCharCode((value >> 8) & 0xff) + 14993 String.fromCharCode(value & 0xff); 14994 }; 14995 14996 function createOpenTypeHeader(sfnt, file, numTables) { 14997 // Windows hates the Mac TrueType sfnt version number 14998 if (sfnt == 'true') 14999 sfnt = string32(0x00010000); 15000 15001 // sfnt version (4 bytes) 15002 var header = sfnt; 15003 15004 // numTables (2 bytes) 15005 header += string16(numTables); 15006 15007 // searchRange (2 bytes) 15008 var tablesMaxPower2 = getMaxPower2(numTables); 15009 var searchRange = tablesMaxPower2 * 16; 15010 header += string16(searchRange); 15011 15012 // entrySelector (2 bytes) 15013 header += string16(Math.log(tablesMaxPower2) / Math.log(2)); 15014 15015 // rangeShift (2 bytes) 15016 header += string16(numTables * 16 - searchRange); 15017 15018 file.file += header; 15019 file.virtualOffset += header.length; 15020 }; 15021 15022 function createTableEntry(file, tag, data) { 15023 // offset 15024 var offset = file.virtualOffset; 15025 15026 // length 15027 var length = data.length; 15028 15029 // Per spec tables must be 4-bytes align so add padding as needed 15030 while (data.length & 3) 15031 data.push(0x00); 15032 15033 while (file.virtualOffset & 3) 15034 file.virtualOffset++; 15035 15036 // checksum 15037 var checksum = 0, n = data.length; 15038 for (var i = 0; i < n; i += 4) 15039 checksum = (checksum + int32([data[i], data[i + 1], data[i + 2], 15040 data[i + 3]])) | 0; 15041 15042 var tableEntry = (tag + string32(checksum) + 15043 string32(offset) + string32(length)); 15044 file.file += tableEntry; 15045 file.virtualOffset += data.length; 15046 }; 15047 15048 function getRanges(glyphs) { 15049 // Array.sort() sorts by characters, not numerically, so convert to an 15050 // array of characters. 15051 var codes = []; 15052 var length = glyphs.length; 15053 for (var n = 0; n < length; ++n) 15054 codes.push({ unicode: glyphs[n].unicode, code: n }); 15055 codes.sort(function fontGetRangesSort(a, b) { 15056 return a.unicode - b.unicode; 15057 }); 15058 15059 // Split the sorted codes into ranges. 15060 var ranges = []; 15061 for (var n = 0; n < length; ) { 15062 var start = codes[n].unicode; 15063 var codeIndices = [codes[n].code]; 15064 ++n; 15065 var end = start; 15066 while (n < length && end + 1 == codes[n].unicode) { 15067 codeIndices.push(codes[n].code); 15068 ++end; 15069 ++n; 15070 } 15071 ranges.push([start, end, codeIndices]); 15072 } 15073 15074 return ranges; 15075 }; 15076 15077 function createCMapTable(glyphs, deltas) { 15078 var ranges = getRanges(glyphs); 15079 15080 var numTables = 1; 15081 var cmap = '\x00\x00' + // version 15082 string16(numTables) + // numTables 15083 '\x00\x03' + // platformID 15084 '\x00\x01' + // encodingID 15085 string32(4 + numTables * 8); // start of the table record 15086 15087 var segCount = ranges.length + 1; 15088 var segCount2 = segCount * 2; 15089 var searchRange = getMaxPower2(segCount) * 2; 15090 var searchEntry = Math.log(segCount) / Math.log(2); 15091 var rangeShift = 2 * segCount - searchRange; 15092 15093 // Fill up the 4 parallel arrays describing the segments. 15094 var startCount = ''; 15095 var endCount = ''; 15096 var idDeltas = ''; 15097 var idRangeOffsets = ''; 15098 var glyphsIds = ''; 15099 var bias = 0; 15100 15101 if (deltas) { 15102 for (var i = 0; i < segCount - 1; i++) { 15103 var range = ranges[i]; 15104 var start = range[0]; 15105 var end = range[1]; 15106 var offset = (segCount - i) * 2 + bias * 2; 15107 bias += (end - start + 1); 15108 15109 startCount += string16(start); 15110 endCount += string16(end); 15111 idDeltas += string16(0); 15112 idRangeOffsets += string16(offset); 15113 15114 var codes = range[2]; 15115 for (var j = 0, jj = codes.length; j < jj; ++j) 15116 glyphsIds += string16(deltas[codes[j]]); 15117 } 15118 } else { 15119 for (var i = 0; i < segCount - 1; i++) { 15120 var range = ranges[i]; 15121 var start = range[0]; 15122 var end = range[1]; 15123 var startCode = range[2][0]; 15124 15125 startCount += string16(start); 15126 endCount += string16(end); 15127 idDeltas += string16((startCode - start + 1) & 0xFFFF); 15128 idRangeOffsets += string16(0); 15129 } 15130 } 15131 15132 endCount += '\xFF\xFF'; 15133 startCount += '\xFF\xFF'; 15134 idDeltas += '\x00\x01'; 15135 idRangeOffsets += '\x00\x00'; 15136 15137 var format314 = '\x00\x00' + // language 15138 string16(segCount2) + 15139 string16(searchRange) + 15140 string16(searchEntry) + 15141 string16(rangeShift) + 15142 endCount + '\x00\x00' + startCount + 15143 idDeltas + idRangeOffsets + glyphsIds; 15144 15145 return stringToArray(cmap + 15146 '\x00\x04' + // format 15147 string16(format314.length + 4) + // length 15148 format314); 15149 }; 15150 15151 function createOS2Table(properties, charstrings, override) { 15152 override = override || { 15153 unitsPerEm: 0, 15154 yMax: 0, 15155 yMin: 0, 15156 ascent: 0, 15157 descent: 0 15158 }; 15159 15160 var ulUnicodeRange1 = 0; 15161 var ulUnicodeRange2 = 0; 15162 var ulUnicodeRange3 = 0; 15163 var ulUnicodeRange4 = 0; 15164 15165 var firstCharIndex = null; 15166 var lastCharIndex = 0; 15167 15168 if (charstrings) { 15169 for (var i = 0; i < charstrings.length; ++i) { 15170 var code = charstrings[i].unicode; 15171 if (firstCharIndex > code || !firstCharIndex) 15172 firstCharIndex = code; 15173 if (lastCharIndex < code) 15174 lastCharIndex = code; 15175 15176 var position = getUnicodeRangeFor(code); 15177 if (position < 32) { 15178 ulUnicodeRange1 |= 1 << position; 15179 } else if (position < 64) { 15180 ulUnicodeRange2 |= 1 << position - 32; 15181 } else if (position < 96) { 15182 ulUnicodeRange3 |= 1 << position - 64; 15183 } else if (position < 123) { 15184 ulUnicodeRange4 |= 1 << position - 96; 15185 } else { 15186 error('Unicode ranges Bits > 123 are reserved for internal usage'); 15187 } 15188 } 15189 } else { 15190 // TODO 15191 firstCharIndex = 0; 15192 lastCharIndex = 255; 15193 } 15194 15195 var unitsPerEm = override.unitsPerEm || kPDFGlyphSpaceUnits; 15196 var typoAscent = override.ascent || properties.ascent; 15197 var typoDescent = override.descent || properties.descent; 15198 var winAscent = override.yMax || typoAscent; 15199 var winDescent = -override.yMin || -typoDescent; 15200 15201 // if there is a units per em value but no other override 15202 // then scale the calculated ascent 15203 if (unitsPerEm != kPDFGlyphSpaceUnits && 15204 'undefined' == typeof(override.ascent)) { 15205 // if the font units differ to the PDF glyph space units 15206 // then scale up the values 15207 typoAscent = Math.round(typoAscent * unitsPerEm / kPDFGlyphSpaceUnits); 15208 typoDescent = Math.round(typoDescent * unitsPerEm / kPDFGlyphSpaceUnits); 15209 winAscent = typoAscent; 15210 winDescent = -typoDescent; 15211 } 15212 15213 return '\x00\x03' + // version 15214 '\x02\x24' + // xAvgCharWidth 15215 '\x01\xF4' + // usWeightClass 15216 '\x00\x05' + // usWidthClass 15217 '\x00\x00' + // fstype (0 to let the font loads via font-face on IE) 15218 '\x02\x8A' + // ySubscriptXSize 15219 '\x02\xBB' + // ySubscriptYSize 15220 '\x00\x00' + // ySubscriptXOffset 15221 '\x00\x8C' + // ySubscriptYOffset 15222 '\x02\x8A' + // ySuperScriptXSize 15223 '\x02\xBB' + // ySuperScriptYSize 15224 '\x00\x00' + // ySuperScriptXOffset 15225 '\x01\xDF' + // ySuperScriptYOffset 15226 '\x00\x31' + // yStrikeOutSize 15227 '\x01\x02' + // yStrikeOutPosition 15228 '\x00\x00' + // sFamilyClass 15229 '\x00\x00\x06' + 15230 String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) + 15231 '\x00\x00\x00\x00\x00\x00' + // Panose 15232 string32(ulUnicodeRange1) + // ulUnicodeRange1 (Bits 0-31) 15233 string32(ulUnicodeRange2) + // ulUnicodeRange2 (Bits 32-63) 15234 string32(ulUnicodeRange3) + // ulUnicodeRange3 (Bits 64-95) 15235 string32(ulUnicodeRange4) + // ulUnicodeRange4 (Bits 96-127) 15236 '\x2A\x32\x31\x2A' + // achVendID 15237 string16(properties.italicAngle ? 1 : 0) + // fsSelection 15238 string16(firstCharIndex || 15239 properties.firstChar) + // usFirstCharIndex 15240 string16(lastCharIndex || properties.lastChar) + // usLastCharIndex 15241 string16(typoAscent) + // sTypoAscender 15242 string16(typoDescent) + // sTypoDescender 15243 '\x00\x64' + // sTypoLineGap (7%-10% of the unitsPerEM value) 15244 string16(winAscent) + // usWinAscent 15245 string16(winDescent) + // usWinDescent 15246 '\x00\x00\x00\x00' + // ulCodePageRange1 (Bits 0-31) 15247 '\x00\x00\x00\x00' + // ulCodePageRange2 (Bits 32-63) 15248 string16(properties.xHeight) + // sxHeight 15249 string16(properties.capHeight) + // sCapHeight 15250 string16(0) + // usDefaultChar 15251 string16(firstCharIndex || properties.firstChar) + // usBreakChar 15252 '\x00\x03'; // usMaxContext 15253 }; 15254 15255 function createPostTable(properties) { 15256 var angle = Math.floor(properties.italicAngle * (Math.pow(2, 16))); 15257 return '\x00\x03\x00\x00' + // Version number 15258 string32(angle) + // italicAngle 15259 '\x00\x00' + // underlinePosition 15260 '\x00\x00' + // underlineThickness 15261 string32(properties.fixedPitch) + // isFixedPitch 15262 '\x00\x00\x00\x00' + // minMemType42 15263 '\x00\x00\x00\x00' + // maxMemType42 15264 '\x00\x00\x00\x00' + // minMemType1 15265 '\x00\x00\x00\x00'; // maxMemType1 15266 }; 15267 15268 function createNameTable(name) { 15269 var strings = [ 15270 'Original licence', // 0.Copyright 15271 name, // 1.Font family 15272 'Unknown', // 2.Font subfamily (font weight) 15273 'uniqueID', // 3.Unique ID 15274 name, // 4.Full font name 15275 'Version 0.11', // 5.Version 15276 '', // 6.Postscript name 15277 'Unknown', // 7.Trademark 15278 'Unknown', // 8.Manufacturer 15279 'Unknown' // 9.Designer 15280 ]; 15281 15282 // Mac want 1-byte per character strings while Windows want 15283 // 2-bytes per character, so duplicate the names table 15284 var stringsUnicode = []; 15285 for (var i = 0, ii = strings.length; i < ii; i++) { 15286 var str = strings[i]; 15287 15288 var strUnicode = ''; 15289 for (var j = 0, jj = str.length; j < jj; j++) 15290 strUnicode += string16(str.charCodeAt(j)); 15291 stringsUnicode.push(strUnicode); 15292 } 15293 15294 var names = [strings, stringsUnicode]; 15295 var platforms = ['\x00\x01', '\x00\x03']; 15296 var encodings = ['\x00\x00', '\x00\x01']; 15297 var languages = ['\x00\x00', '\x04\x09']; 15298 15299 var namesRecordCount = strings.length * platforms.length; 15300 var nameTable = 15301 '\x00\x00' + // format 15302 string16(namesRecordCount) + // Number of names Record 15303 string16(namesRecordCount * 12 + 6); // Storage 15304 15305 // Build the name records field 15306 var strOffset = 0; 15307 for (var i = 0, ii = platforms.length; i < ii; i++) { 15308 var strs = names[i]; 15309 for (var j = 0, jj = strs.length; j < jj; j++) { 15310 var str = strs[j]; 15311 var nameRecord = 15312 platforms[i] + // platform ID 15313 encodings[i] + // encoding ID 15314 languages[i] + // language ID 15315 string16(j) + // name ID 15316 string16(str.length) + 15317 string16(strOffset); 15318 nameTable += nameRecord; 15319 strOffset += str.length; 15320 } 15321 } 15322 15323 nameTable += strings.join('') + stringsUnicode.join(''); 15324 return nameTable; 15325 } 15326 15327 Font.prototype = { 15328 name: null, 15329 font: null, 15330 mimetype: null, 15331 encoding: null, 15332 15333 checkAndRepair: function Font_checkAndRepair(name, font, properties) { 15334 function readTableEntry(file) { 15335 var tag = file.getBytes(4); 15336 tag = String.fromCharCode(tag[0]) + 15337 String.fromCharCode(tag[1]) + 15338 String.fromCharCode(tag[2]) + 15339 String.fromCharCode(tag[3]); 15340 15341 var checksum = int32(file.getBytes(4)); 15342 var offset = int32(file.getBytes(4)); 15343 var length = int32(file.getBytes(4)); 15344 15345 // Read the table associated data 15346 var previousPosition = file.pos; 15347 file.pos = file.start ? file.start : 0; 15348 file.skip(offset); 15349 var data = file.getBytes(length); 15350 file.pos = previousPosition; 15351 15352 if (tag == 'head') { 15353 // clearing checksum adjustment 15354 data[8] = data[9] = data[10] = data[11] = 0; 15355 data[17] |= 0x20; //Set font optimized for cleartype flag 15356 } 15357 15358 return { 15359 tag: tag, 15360 checksum: checksum, 15361 length: length, 15362 offset: offset, 15363 data: data 15364 }; 15365 }; 15366 15367 function readOpenTypeHeader(ttf) { 15368 return { 15369 version: arrayToString(ttf.getBytes(4)), 15370 numTables: int16(ttf.getBytes(2)), 15371 searchRange: int16(ttf.getBytes(2)), 15372 entrySelector: int16(ttf.getBytes(2)), 15373 rangeShift: int16(ttf.getBytes(2)) 15374 }; 15375 }; 15376 15377 function createGlyphNameMap(glyphs, ids, properties) { 15378 var glyphNames = properties.glyphNames; 15379 if (!glyphNames) { 15380 properties.glyphNameMap = {}; 15381 return; 15382 } 15383 var glyphsLength = glyphs.length; 15384 var glyphNameMap = {}; 15385 var encoding = []; 15386 for (var i = 0; i < glyphsLength; ++i) { 15387 var glyphName = glyphNames[ids[i]]; 15388 if (!glyphName) 15389 continue; 15390 var unicode = glyphs[i].unicode; 15391 glyphNameMap[glyphName] = unicode; 15392 var code = glyphs[i].code; 15393 encoding[code] = glyphName; 15394 } 15395 properties.glyphNameMap = glyphNameMap; 15396 if (!properties.hasEncoding) 15397 properties.baseEncoding = encoding; 15398 } 15399 15400 function readCMapTable(cmap, font) { 15401 var start = (font.start ? font.start : 0) + cmap.offset; 15402 font.pos = start; 15403 15404 var version = int16(font.getBytes(2)); 15405 var numRecords = int16(font.getBytes(2)); 15406 15407 var records = []; 15408 for (var i = 0; i < numRecords; i++) { 15409 records.push({ 15410 platformID: int16(font.getBytes(2)), 15411 encodingID: int16(font.getBytes(2)), 15412 offset: int32(font.getBytes(4)) 15413 }); 15414 } 15415 15416 // Check that table are sorted by platformID then encodingID, 15417 records.sort(function fontReadCMapTableSort(a, b) { 15418 return ((a.platformID << 16) + a.encodingID) - 15419 ((b.platformID << 16) + b.encodingID); 15420 }); 15421 15422 var tables = [records[0]]; 15423 for (var i = 1; i < numRecords; i++) { 15424 // The sanitizer will drop the font if 2 tables have the same 15425 // platformID and the same encodingID, this will be correct for 15426 // most cases but if the font has been made for Mac it could 15427 // exist a few platformID: 1, encodingID: 0 but with a different 15428 // language field and that's correct. But the sanitizer does not 15429 // seem to support this case. 15430 var current = records[i]; 15431 var previous = records[i - 1]; 15432 if (((current.platformID << 16) + current.encodingID) <= 15433 ((previous.platformID << 16) + previous.encodingID)) 15434 continue; 15435 tables.push(current); 15436 } 15437 15438 var missing = numRecords - tables.length; 15439 if (missing) { 15440 numRecords = tables.length; 15441 var data = string16(version) + string16(numRecords); 15442 15443 for (var i = 0; i < numRecords; i++) { 15444 var table = tables[i]; 15445 data += string16(table.platformID) + 15446 string16(table.encodingID) + 15447 string32(table.offset); 15448 } 15449 15450 for (var i = 0, ii = data.length; i < ii; i++) 15451 cmap.data[i] = data.charCodeAt(i); 15452 } 15453 15454 for (var i = 0; i < numRecords; i++) { 15455 var table = tables[i]; 15456 font.pos = start + table.offset; 15457 15458 var format = int16(font.getBytes(2)); 15459 var length = int16(font.getBytes(2)); 15460 var language = int16(font.getBytes(2)); 15461 15462 if (format == 0) { 15463 // Characters below 0x20 are controls characters that are hardcoded 15464 // into the platform so if some characters in the font are assigned 15465 // under this limit they will not be displayed so let's rewrite the 15466 // CMap. 15467 var glyphs = []; 15468 var ids = []; 15469 for (var j = 0; j < 256; j++) { 15470 var index = font.getByte(); 15471 if (index) { 15472 glyphs.push({ unicode: j, code: j }); 15473 ids.push(index); 15474 } 15475 } 15476 return { 15477 glyphs: glyphs, 15478 ids: ids, 15479 hasShortCmap: true 15480 }; 15481 } else if (format == 4) { 15482 // re-creating the table in format 4 since the encoding 15483 // might be changed 15484 var segCount = (int16(font.getBytes(2)) >> 1); 15485 font.getBytes(6); // skipping range fields 15486 var segIndex, segments = []; 15487 for (segIndex = 0; segIndex < segCount; segIndex++) { 15488 segments.push({ end: int16(font.getBytes(2)) }); 15489 } 15490 font.getBytes(2); 15491 for (segIndex = 0; segIndex < segCount; segIndex++) { 15492 segments[segIndex].start = int16(font.getBytes(2)); 15493 } 15494 15495 for (segIndex = 0; segIndex < segCount; segIndex++) { 15496 segments[segIndex].delta = int16(font.getBytes(2)); 15497 } 15498 15499 var offsetsCount = 0; 15500 for (segIndex = 0; segIndex < segCount; segIndex++) { 15501 var segment = segments[segIndex]; 15502 var rangeOffset = int16(font.getBytes(2)); 15503 if (!rangeOffset) { 15504 segment.offsetIndex = -1; 15505 continue; 15506 } 15507 15508 var offsetIndex = (rangeOffset >> 1) - (segCount - segIndex); 15509 segment.offsetIndex = offsetIndex; 15510 offsetsCount = Math.max(offsetsCount, offsetIndex + 15511 segment.end - segment.start + 1); 15512 } 15513 15514 var offsets = []; 15515 for (var j = 0; j < offsetsCount; j++) 15516 offsets.push(int16(font.getBytes(2))); 15517 15518 var glyphs = [], ids = []; 15519 15520 for (segIndex = 0; segIndex < segCount; segIndex++) { 15521 var segment = segments[segIndex]; 15522 var start = segment.start, end = segment.end; 15523 var delta = segment.delta, offsetIndex = segment.offsetIndex; 15524 15525 for (var j = start; j <= end; j++) { 15526 if (j == 0xFFFF) 15527 continue; 15528 15529 var glyphCode = offsetIndex < 0 ? j : 15530 offsets[offsetIndex + j - start]; 15531 glyphCode = (glyphCode + delta) & 0xFFFF; 15532 if (glyphCode == 0) 15533 continue; 15534 15535 glyphs.push({ unicode: j, code: j }); 15536 ids.push(glyphCode); 15537 } 15538 } 15539 15540 return { 15541 glyphs: glyphs, 15542 ids: ids 15543 }; 15544 } else if (format == 6) { 15545 // Format 6 is a 2-bytes dense mapping, which means the font data 15546 // lives glue together even if they are pretty far in the unicode 15547 // table. (This looks weird, so I can have missed something), this 15548 // works on Linux but seems to fails on Mac so let's rewrite the 15549 // cmap table to a 3-1-4 style 15550 var firstCode = int16(font.getBytes(2)); 15551 var entryCount = int16(font.getBytes(2)); 15552 15553 var glyphs = []; 15554 var ids = []; 15555 for (var j = 0; j < entryCount; j++) { 15556 var glyphCode = int16(font.getBytes(2)); 15557 var code = firstCode + j; 15558 15559 glyphs.push({ unicode: code, code: code }); 15560 ids.push(glyphCode); 15561 } 15562 15563 return { 15564 glyphs: glyphs, 15565 ids: ids 15566 }; 15567 } 15568 } 15569 error('Unsupported cmap table format'); 15570 }; 15571 15572 function sanitizeMetrics(font, header, metrics, numGlyphs) { 15573 if (!header && !metrics) 15574 return; 15575 15576 // The vhea/vmtx tables are not required, so it happens that 15577 // some fonts embed a vmtx table without a vhea table. In this 15578 // situation the sanitizer assume numOfLongVerMetrics = 1. As 15579 // a result it tries to read numGlyphs - 1 SHORT from the vmtx 15580 // table, and if it is not possible, the font is rejected. 15581 // So remove the vmtx table if there is no vhea table. 15582 if (!header && metrics) { 15583 metrics.data = null; 15584 return; 15585 } 15586 15587 font.pos = (font.start ? font.start : 0) + header.offset; 15588 font.pos += header.length - 2; 15589 var numOfMetrics = int16(font.getBytes(2)); 15590 15591 var numOfSidebearings = numGlyphs - numOfMetrics; 15592 var numMissing = numOfSidebearings - 15593 ((hmtx.length - numOfMetrics * 4) >> 1); 15594 if (numMissing > 0) { 15595 font.pos = (font.start ? font.start : 0) + metrics.offset; 15596 var entries = ''; 15597 for (var i = 0, ii = hmtx.length; i < ii; i++) 15598 entries += String.fromCharCode(font.getByte()); 15599 for (var i = 0; i < numMissing; i++) 15600 entries += '\x00\x00'; 15601 metrics.data = stringToArray(entries); 15602 } 15603 }; 15604 15605 function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart) { 15606 if (sourceEnd - sourceStart <= 12) { 15607 // glyph with data less than 12 is invalid one 15608 return 0; 15609 } 15610 var glyf = source.subarray(sourceStart, sourceEnd); 15611 var contoursCount = (glyf[0] << 8) | glyf[1]; 15612 if (contoursCount & 0x8000) { 15613 // complex glyph, writing as is 15614 dest.set(glyf, destStart); 15615 return glyf.length; 15616 } 15617 15618 var j = 10, flagsCount = 0; 15619 for (var i = 0; i < contoursCount; i++) { 15620 var endPoint = (glyf[j] << 8) | glyf[j + 1]; 15621 flagsCount = endPoint + 1; 15622 j += 2; 15623 } 15624 // skipping instructions 15625 var instructionsLength = (glyf[j] << 8) | glyf[j + 1]; 15626 j += 2 + instructionsLength; 15627 // validating flags 15628 var coordinatesLength = 0; 15629 for (var i = 0; i < flagsCount; i++) { 15630 var flag = glyf[j++]; 15631 if (flag & 0xC0) { 15632 // reserved flags must be zero, rejecting 15633 return 0; 15634 } 15635 var xyLength = ((flag & 2) ? 1 : (flag & 16) ? 0 : 2) + 15636 ((flag & 4) ? 1 : (flag & 32) ? 0 : 2); 15637 coordinatesLength += xyLength; 15638 if (flag & 8) { 15639 var repeat = glyf[j++]; 15640 i += repeat; 15641 coordinatesLength += repeat * xyLength; 15642 } 15643 } 15644 var glyphDataLength = j + coordinatesLength; 15645 if (glyphDataLength > glyf.length) { 15646 // not enough data for coordinates 15647 return 0; 15648 } 15649 if (glyf.length - glyphDataLength > 3) { 15650 // truncating and aligning to 4 bytes the long glyph data 15651 glyphDataLength = (glyphDataLength + 3) & ~3; 15652 dest.set(glyf.subarray(0, glyphDataLength), destStart); 15653 return glyphDataLength; 15654 } 15655 // glyph data is fine 15656 dest.set(glyf, destStart); 15657 return glyf.length; 15658 } 15659 15660 function sanitizeGlyphLocations(loca, glyf, numGlyphs, 15661 isGlyphLocationsLong) { 15662 var itemSize, itemDecode, itemEncode; 15663 if (isGlyphLocationsLong) { 15664 itemSize = 4; 15665 itemDecode = function fontItemDecodeLong(data, offset) { 15666 return (data[offset] << 24) | (data[offset + 1] << 16) | 15667 (data[offset + 2] << 8) | data[offset + 3]; 15668 }; 15669 itemEncode = function fontItemEncodeLong(data, offset, value) { 15670 data[offset] = (value >>> 24) & 0xFF; 15671 data[offset + 1] = (value >> 16) & 0xFF; 15672 data[offset + 2] = (value >> 8) & 0xFF; 15673 data[offset + 3] = value & 0xFF; 15674 }; 15675 } else { 15676 itemSize = 2; 15677 itemDecode = function fontItemDecode(data, offset) { 15678 return (data[offset] << 9) | (data[offset + 1] << 1); 15679 }; 15680 itemEncode = function fontItemEncode(data, offset, value) { 15681 data[offset] = (value >> 9) & 0xFF; 15682 data[offset + 1] = (value >> 1) & 0xFF; 15683 }; 15684 } 15685 var locaData = loca.data; 15686 // removing the invalid glyphs 15687 var oldGlyfData = glyf.data; 15688 var oldGlyfDataLength = oldGlyfData.length; 15689 var newGlyfData = new Uint8Array(oldGlyfDataLength); 15690 var startOffset = itemDecode(locaData, 0); 15691 var writeOffset = 0; 15692 itemEncode(locaData, 0, writeOffset); 15693 for (var i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) { 15694 var endOffset = itemDecode(locaData, j); 15695 if (endOffset > oldGlyfDataLength) { 15696 // glyph end offset points outside glyf data, rejecting the glyph 15697 itemEncode(locaData, j, writeOffset); 15698 startOffset = endOffset; 15699 continue; 15700 } 15701 15702 var newLength = sanitizeGlyph(oldGlyfData, startOffset, endOffset, 15703 newGlyfData, writeOffset); 15704 writeOffset += newLength; 15705 itemEncode(locaData, j, writeOffset); 15706 startOffset = endOffset; 15707 } 15708 15709 if (writeOffset == 0) { 15710 // glyf table cannot be empty -- redoing the glyf and loca tables 15711 // to have single glyph with one point 15712 var simpleGlyph = new Uint8Array( 15713 [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]); 15714 for (var i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) 15715 itemEncode(locaData, j, simpleGlyph.length); 15716 glyf.data = simpleGlyph; 15717 return; 15718 } 15719 15720 glyf.data = newGlyfData.subarray(0, writeOffset); 15721 } 15722 15723 function findEmptyGlyphs(locaTable, isGlyphLocationsLong, emptyGlyphIds) { 15724 var itemSize, itemDecode; 15725 if (isGlyphLocationsLong) { 15726 itemSize = 4; 15727 itemDecode = function fontItemDecodeLong(data, offset) { 15728 return (data[offset] << 24) | (data[offset + 1] << 16) | 15729 (data[offset + 2] << 8) | data[offset + 3]; 15730 }; 15731 } else { 15732 itemSize = 2; 15733 itemDecode = function fontItemDecode(data, offset) { 15734 return (data[offset] << 9) | (data[offset + 1] << 1); 15735 }; 15736 } 15737 var data = locaTable.data, length = data.length; 15738 var lastOffset = itemDecode(data, 0); 15739 for (var i = itemSize, j = 0; i < length; i += itemSize, j++) { 15740 var offset = itemDecode(data, i); 15741 if (offset == lastOffset) 15742 emptyGlyphIds[j] = true; 15743 lastOffset = offset; 15744 } 15745 } 15746 15747 function readGlyphNameMap(post, properties) { 15748 var start = (font.start ? font.start : 0) + post.offset; 15749 font.pos = start; 15750 15751 var length = post.length, end = start + length; 15752 var version = int32(font.getBytes(4)); 15753 // skip rest to the tables 15754 font.getBytes(28); 15755 15756 var glyphNames; 15757 switch (version) { 15758 case 0x00010000: 15759 glyphNames = MacStandardGlyphOrdering; 15760 break; 15761 case 0x00020000: 15762 var numGlyphs = int16(font.getBytes(2)); 15763 var glyphNameIndexes = []; 15764 for (var i = 0; i < numGlyphs; ++i) 15765 glyphNameIndexes.push(int16(font.getBytes(2))); 15766 var customNames = []; 15767 while (font.pos < end) { 15768 var stringLength = font.getByte(); 15769 var string = ''; 15770 for (var i = 0; i < stringLength; ++i) 15771 string += font.getChar(); 15772 customNames.push(string); 15773 } 15774 glyphNames = []; 15775 for (var i = 0; i < numGlyphs; ++i) { 15776 var j = glyphNameIndexes[i]; 15777 if (j < 258) { 15778 glyphNames.push(MacStandardGlyphOrdering[j]); 15779 continue; 15780 } 15781 glyphNames.push(customNames[j - 258]); 15782 } 15783 break; 15784 case 0x00030000: 15785 break; 15786 default: 15787 warn('Unknown/unsupported post table version ' + version); 15788 break; 15789 } 15790 properties.glyphNames = glyphNames; 15791 } 15792 15793 function isOS2Valid(os2Table) { 15794 var data = os2Table.data; 15795 // usWinAscent == 0 makes font unreadable by windows 15796 var usWinAscent = (data[74] << 8) | data[75]; 15797 if (usWinAscent == 0) 15798 return false; 15799 15800 return true; 15801 } 15802 15803 // Check that required tables are present 15804 var requiredTables = ['OS/2', 'cmap', 'head', 'hhea', 15805 'hmtx', 'maxp', 'name', 'post']; 15806 15807 var header = readOpenTypeHeader(font); 15808 var numTables = header.numTables; 15809 15810 var cmap, post, maxp, hhea, hmtx, vhea, vmtx, head, loca, glyf, os2; 15811 var tables = []; 15812 for (var i = 0; i < numTables; i++) { 15813 var table = readTableEntry(font); 15814 var index = requiredTables.indexOf(table.tag); 15815 if (index != -1) { 15816 if (table.tag == 'cmap') 15817 cmap = table; 15818 else if (table.tag == 'post') 15819 post = table; 15820 else if (table.tag == 'maxp') 15821 maxp = table; 15822 else if (table.tag == 'hhea') 15823 hhea = table; 15824 else if (table.tag == 'hmtx') 15825 hmtx = table; 15826 else if (table.tag == 'head') 15827 head = table; 15828 else if (table.tag == 'OS/2') 15829 os2 = table; 15830 15831 requiredTables.splice(index, 1); 15832 } else { 15833 if (table.tag == 'vmtx') 15834 vmtx = table; 15835 else if (table.tag == 'vhea') 15836 vhea = table; 15837 else if (table.tag == 'loca') 15838 loca = table; 15839 else if (table.tag == 'glyf') 15840 glyf = table; 15841 } 15842 tables.push(table); 15843 } 15844 15845 var numTables = tables.length + requiredTables.length; 15846 15847 // header and new offsets. Table entry information is appended to the 15848 // end of file. The virtualOffset represents where to put the actual 15849 // data of a particular table; 15850 var ttf = { 15851 file: '', 15852 virtualOffset: numTables * (4 * 4) 15853 }; 15854 15855 // The new numbers of tables will be the last one plus the num 15856 // of missing tables 15857 createOpenTypeHeader(header.version, ttf, numTables); 15858 15859 // Invalid OS/2 can break the font for the Windows 15860 if (os2 && !isOS2Valid(os2)) { 15861 tables.splice(tables.indexOf(os2), 1); 15862 os2 = null; 15863 } 15864 15865 // Ensure the [h/v]mtx tables contains the advance width and 15866 // sidebearings information for numGlyphs in the maxp table 15867 font.pos = (font.start || 0) + maxp.offset; 15868 var version = int16(font.getBytes(4)); 15869 var numGlyphs = int16(font.getBytes(2)); 15870 15871 sanitizeMetrics(font, hhea, hmtx, numGlyphs); 15872 sanitizeMetrics(font, vhea, vmtx, numGlyphs); 15873 15874 var isGlyphLocationsLong = int16([head.data[50], head.data[51]]); 15875 if (head && loca && glyf) { 15876 sanitizeGlyphLocations(loca, glyf, numGlyphs, isGlyphLocationsLong); 15877 } 15878 15879 var emptyGlyphIds = []; 15880 if (glyf) 15881 findEmptyGlyphs(loca, isGlyphLocationsLong, emptyGlyphIds); 15882 15883 // Sanitizer reduces the glyph advanceWidth to the maxAdvanceWidth 15884 // Sometimes it's 0. That needs to be fixed 15885 if (hhea.data[10] == 0 && hhea.data[11] == 0) { 15886 hhea.data[10] = 0xFF; 15887 hhea.data[11] = 0xFF; 15888 } 15889 15890 // The 'post' table has glyphs names. 15891 if (post) { 15892 readGlyphNameMap(post, properties); 15893 } 15894 15895 var glyphs, ids; 15896 if (properties.type == 'CIDFontType2') { 15897 // Replace the old CMAP table with a shiny new one 15898 // Type2 composite fonts map characters directly to glyphs so the cmap 15899 // table must be replaced. 15900 // canvas fillText will reencode some characters even if the font has a 15901 // glyph at that position - e.g. newline is converted to a space and 15902 // U+00AD (soft hyphen) is not drawn. 15903 // So, offset all the glyphs by 0xFF to avoid these cases and use 15904 // the encoding to map incoming characters to the new glyph positions 15905 if (!cmap) { 15906 cmap = { 15907 tag: 'cmap', 15908 data: null 15909 }; 15910 tables.push(cmap); 15911 } 15912 15913 var cidToGidMap = properties.cidToGidMap || []; 15914 var gidToCidMap = [0]; 15915 if (cidToGidMap.length > 0) { 15916 for (var j = cidToGidMap.length - 1; j >= 0; j--) { 15917 var gid = cidToGidMap[j]; 15918 if (gid) 15919 gidToCidMap[gid] = j; 15920 } 15921 // filling the gaps using CID above the CIDs currently used in font 15922 var nextCid = cidToGidMap.length; 15923 for (var i = 1; i < numGlyphs; i++) { 15924 if (!gidToCidMap[i]) 15925 gidToCidMap[i] = nextCid++; 15926 } 15927 } 15928 15929 glyphs = []; 15930 ids = []; 15931 15932 var usedUnicodes = []; 15933 var unassignedUnicodeItems = []; 15934 for (var i = 1; i < numGlyphs; i++) { 15935 var cid = gidToCidMap[i] || i; 15936 var unicode = this.toFontChar[cid]; 15937 if (!unicode || typeof unicode !== 'number' || 15938 isSpecialUnicode(unicode) || unicode in usedUnicodes) { 15939 unassignedUnicodeItems.push(i); 15940 continue; 15941 } 15942 usedUnicodes[unicode] = true; 15943 glyphs.push({ unicode: unicode, code: cid }); 15944 ids.push(i); 15945 } 15946 // trying to fit as many unassigned symbols as we can 15947 // in the range allocated for the user defined symbols 15948 var unusedUnicode = kCmapGlyphOffset; 15949 for (var j = 0, jj = unassignedUnicodeItems.length; j < jj; j++) { 15950 var i = unassignedUnicodeItems[j]; 15951 var cid = gidToCidMap[i] || i; 15952 while (unusedUnicode in usedUnicodes) 15953 unusedUnicode++; 15954 if (unusedUnicode >= kCmapGlyphOffset + kSizeOfGlyphArea) 15955 break; 15956 var unicode = unusedUnicode++; 15957 this.toFontChar[cid] = unicode; 15958 usedUnicodes[unicode] = true; 15959 glyphs.push({ unicode: unicode, code: cid }); 15960 ids.push(i); 15961 } 15962 } else { 15963 var cmapTable = readCMapTable(cmap, font); 15964 15965 glyphs = cmapTable.glyphs; 15966 ids = cmapTable.ids; 15967 15968 var hasShortCmap = !!cmapTable.hasShortCmap; 15969 var toFontChar = this.toFontChar; 15970 15971 if (hasShortCmap && ids.length == numGlyphs) { 15972 // Fixes the short cmap tables -- some generators use incorrect 15973 // glyph id. 15974 for (var i = 0, ii = ids.length; i < ii; i++) 15975 ids[i] = i; 15976 } 15977 15978 var unusedUnicode = kCmapGlyphOffset; 15979 var glyphNames = properties.glyphNames || []; 15980 var encoding = properties.baseEncoding; 15981 var differences = properties.differences; 15982 if (toFontChar && toFontChar.length > 0) { 15983 // checking if cmap is just identity map 15984 var isIdentity = true; 15985 for (var i = 0, ii = glyphs.length; i < ii; i++) { 15986 if (glyphs[i].unicode != i + 1) { 15987 isIdentity = false; 15988 break; 15989 } 15990 } 15991 // if it is, replacing with meaningful toUnicode values 15992 if (isIdentity && !this.isSymbolicFont) { 15993 var usedUnicodes = [], unassignedUnicodeItems = []; 15994 for (var i = 0, ii = glyphs.length; i < ii; i++) { 15995 var unicode = toFontChar[i + 1]; 15996 if (!unicode || typeof unicode !== 'number' || 15997 unicode in usedUnicodes) { 15998 unassignedUnicodeItems.push(i); 15999 continue; 16000 } 16001 glyphs[i].unicode = unicode; 16002 usedUnicodes[unicode] = true; 16003 } 16004 for (var j = 0, jj = unassignedUnicodeItems.length; j < jj; j++) { 16005 var i = unassignedUnicodeItems[j]; 16006 while (unusedUnicode in usedUnicodes) 16007 unusedUnicode++; 16008 var cid = i + 1; 16009 // override only if unicode mapping is not specified 16010 if (!(cid in toFontChar)) 16011 toFontChar[cid] = unusedUnicode; 16012 glyphs[i].unicode = unusedUnicode++; 16013 } 16014 this.useToFontChar = true; 16015 } 16016 } 16017 16018 // remove glyph references outside range of avaialable glyphs or empty 16019 var glyphsRemoved = 0; 16020 for (var i = ids.length - 1; i >= 0; i--) { 16021 if (ids[i] < numGlyphs && 16022 (!emptyGlyphIds[ids[i]] || this.isSymbolicFont)) 16023 continue; 16024 ids.splice(i, 1); 16025 glyphs.splice(i, 1); 16026 glyphsRemoved++; 16027 } 16028 16029 // checking if it's a "true" symbolic font 16030 if (this.isSymbolicFont) { 16031 var minUnicode = 0xFFFF, maxUnicode = 0; 16032 for (var i = 0, ii = glyphs.length; i < ii; i++) { 16033 var unicode = glyphs[i].unicode; 16034 minUnicode = Math.min(minUnicode, unicode); 16035 maxUnicode = Math.max(maxUnicode, unicode); 16036 } 16037 // high byte must be the same for min and max unicodes 16038 if ((maxUnicode & 0xFF00) != (minUnicode & 0xFF00)) 16039 this.isSymbolicFont = false; 16040 } 16041 16042 // heuristics: if removed more than 2 glyphs encoding WinAnsiEncoding 16043 // does not set properly 16044 if (glyphsRemoved > 2) { 16045 warn('Switching TrueType encoding to MacRomanEncoding for ' + 16046 this.name + ' font'); 16047 encoding = Encodings.MacRomanEncoding; 16048 } 16049 16050 if (hasShortCmap && this.hasEncoding && !this.isSymbolicFont) { 16051 // Re-encode short map encoding to unicode -- that simplifies the 16052 // resolution of MacRoman encoded glyphs logic for TrueType fonts: 16053 // copying all characters to private use area, all mapping all known 16054 // glyphs to the unicodes. The glyphs and ids arrays will grow. 16055 var usedUnicodes = []; 16056 for (var i = 0, ii = glyphs.length; i < ii; i++) { 16057 var code = glyphs[i].unicode; 16058 var gid = ids[i]; 16059 glyphs[i].unicode += kCmapGlyphOffset; 16060 toFontChar[code] = glyphs[i].unicode; 16061 16062 var glyphName = glyphNames[gid] || encoding[code]; 16063 if (glyphName in GlyphsUnicode) { 16064 var unicode = GlyphsUnicode[glyphName]; 16065 if (unicode in usedUnicodes) 16066 continue; 16067 16068 usedUnicodes[unicode] = true; 16069 glyphs.push({ 16070 unicode: unicode, 16071 code: glyphs[i].code 16072 }); 16073 ids.push(gid); 16074 toFontChar[code] = unicode; 16075 } 16076 } 16077 this.useToFontChar = true; 16078 } else if (!this.isSymbolicFont && (this.hasEncoding || 16079 properties.glyphNames || differences.length > 0)) { 16080 // Re-encode cmap encoding to unicode, based on the 'post' table data 16081 // diffrence array or base encoding 16082 var reverseMap = []; 16083 for (var i = 0, ii = glyphs.length; i < ii; i++) 16084 reverseMap[glyphs[i].unicode] = i; 16085 16086 var newGlyphUnicodes = []; 16087 for (var i = 0, ii = glyphs.length; i < ii; i++) { 16088 var code = glyphs[i].unicode; 16089 var changeCode = false; 16090 var gid = ids[i]; 16091 16092 var glyphName = glyphNames[gid]; 16093 if (!glyphName) { 16094 glyphName = differences[code] || encoding[code]; 16095 changeCode = true; 16096 } 16097 if (glyphName in GlyphsUnicode) { 16098 var unicode = GlyphsUnicode[glyphName]; 16099 if (!unicode || reverseMap[unicode] === i) 16100 continue; // unknown glyph name or in its own place 16101 16102 newGlyphUnicodes[i] = unicode; 16103 if (changeCode) 16104 toFontChar[code] = unicode; 16105 delete reverseMap[code]; 16106 } 16107 } 16108 for (var index in newGlyphUnicodes) { 16109 var unicode = newGlyphUnicodes[index]; 16110 if (reverseMap[unicode]) { 16111 // avoiding assigning to the same unicode 16112 glyphs[index].unicode = unusedUnicode++; 16113 continue; 16114 } 16115 glyphs[index].unicode = unicode; 16116 reverseMap[unicode] = index; 16117 } 16118 this.useToFontChar = true; 16119 } 16120 16121 // Moving all symbolic font glyphs into 0xF000 - 0xF0FF range. 16122 if (this.isSymbolicFont) { 16123 for (var i = 0, ii = glyphs.length; i < ii; i++) { 16124 var code = glyphs[i].unicode & 0xFF; 16125 var fontCharCode = kSymbolicFontGlyphOffset | code; 16126 glyphs[i].unicode = toFontChar[code] = fontCharCode; 16127 } 16128 this.useToFontChar = true; 16129 } 16130 16131 createGlyphNameMap(glyphs, ids, properties); 16132 this.glyphNameMap = properties.glyphNameMap; 16133 } 16134 16135 // Converting glyphs and ids into font's cmap table 16136 cmap.data = createCMapTable(glyphs, ids); 16137 var unicodeIsEnabled = []; 16138 for (var i = 0, ii = glyphs.length; i < ii; i++) { 16139 unicodeIsEnabled[glyphs[i].unicode] = true; 16140 } 16141 this.unicodeIsEnabled = unicodeIsEnabled; 16142 16143 if (!os2) { 16144 // extract some more font properties from the OpenType head and 16145 // hhea tables; yMin and descent value are always negative 16146 var override = { 16147 unitsPerEm: int16([head.data[18], head.data[19]]), 16148 yMax: int16([head.data[42], head.data[43]]), 16149 yMin: int16([head.data[38], head.data[39]]) - 0x10000, 16150 ascent: int16([hhea.data[4], hhea.data[5]]), 16151 descent: int16([hhea.data[6], hhea.data[7]]) - 0x10000 16152 }; 16153 16154 tables.push({ 16155 tag: 'OS/2', 16156 data: stringToArray(createOS2Table(properties, glyphs, override)) 16157 }); 16158 } 16159 16160 // Rewrite the 'post' table if needed 16161 if (requiredTables.indexOf('post') != -1) { 16162 tables.push({ 16163 tag: 'post', 16164 data: stringToArray(createPostTable(properties)) 16165 }); 16166 } 16167 16168 // Rewrite the 'name' table if needed 16169 if (requiredTables.indexOf('name') != -1) { 16170 tables.push({ 16171 tag: 'name', 16172 data: stringToArray(createNameTable(this.name)) 16173 }); 16174 } 16175 16176 // Tables needs to be written by ascendant alphabetic order 16177 tables.sort(function tables_sort(a, b) { 16178 return (a.tag > b.tag) - (a.tag < b.tag); 16179 }); 16180 16181 // rewrite the tables but tweak offsets 16182 for (var i = 0, ii = tables.length; i < ii; i++) { 16183 var table = tables[i]; 16184 var data = []; 16185 16186 var tableData = table.data; 16187 for (var j = 0, jj = tableData.length; j < jj; j++) 16188 data.push(tableData[j]); 16189 createTableEntry(ttf, table.tag, data); 16190 } 16191 16192 // Add the table datas 16193 for (var i = 0, ii = tables.length; i < ii; i++) { 16194 var table = tables[i]; 16195 var tableData = table.data; 16196 ttf.file += arrayToString(tableData); 16197 16198 // 4-byte aligned data 16199 while (ttf.file.length & 3) 16200 ttf.file += String.fromCharCode(0); 16201 } 16202 16203 return stringToArray(ttf.file); 16204 }, 16205 16206 convert: function Font_convert(fontName, font, properties) { 16207 function isFixedPitch(glyphs) { 16208 for (var i = 0, ii = glyphs.length - 1; i < ii; i++) { 16209 if (glyphs[i] != glyphs[i + 1]) 16210 return false; 16211 } 16212 return true; 16213 } 16214 16215 // The offsets object holds at the same time a representation of where 16216 // to write the table entry information about a table and another offset 16217 // representing the offset where to draw the actual data of a particular 16218 // table 16219 var kRequiredTablesCount = 9; 16220 16221 var otf = { 16222 file: '', 16223 virtualOffset: 9 * (4 * 4) 16224 }; 16225 16226 createOpenTypeHeader('\x4F\x54\x54\x4F', otf, 9); 16227 16228 var charstrings = font.charstrings; 16229 properties.fixedPitch = isFixedPitch(charstrings); 16230 16231 var glyphNameMap = {}; 16232 for (var i = 0; i < charstrings.length; ++i) { 16233 var charstring = charstrings[i]; 16234 glyphNameMap[charstring.glyph] = charstring.unicode; 16235 } 16236 this.glyphNameMap = glyphNameMap; 16237 16238 if (!properties.hasEncoding && (properties.subtype == 'Type1C' || 16239 properties.subtype == 'CIDFontType0C')) { 16240 var encoding = []; 16241 for (var i = 0; i < charstrings.length; ++i) { 16242 var charstring = charstrings[i]; 16243 encoding[charstring.code] = charstring.glyph; 16244 } 16245 properties.baseEncoding = encoding; 16246 } 16247 if (properties.subtype == 'CIDFontType0C') { 16248 var toFontChar = []; 16249 for (var i = 0; i < charstrings.length; ++i) { 16250 var charstring = charstrings[i]; 16251 toFontChar[charstring.code] = charstring.unicode; 16252 } 16253 this.toFontChar = toFontChar; 16254 } 16255 16256 var fields = { 16257 // PostScript Font Program 16258 'CFF ': font.data, 16259 16260 // OS/2 and Windows Specific metrics 16261 'OS/2': stringToArray(createOS2Table(properties, charstrings)), 16262 16263 // Character to glyphs mapping 16264 'cmap': createCMapTable(charstrings.slice(), 16265 ('glyphIds' in font) ? font.glyphIds : null), 16266 16267 // Font header 16268 'head': (function fontFieldsHead() { 16269 return stringToArray( 16270 '\x00\x01\x00\x00' + // Version number 16271 '\x00\x00\x10\x00' + // fontRevision 16272 '\x00\x00\x00\x00' + // checksumAdjustement 16273 '\x5F\x0F\x3C\xF5' + // magicNumber 16274 '\x00\x00' + // Flags 16275 '\x03\xE8' + // unitsPerEM (defaulting to 1000) 16276 '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // creation date 16277 '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // modifification date 16278 '\x00\x00' + // xMin 16279 safeString16(properties.descent) + // yMin 16280 '\x0F\xFF' + // xMax 16281 safeString16(properties.ascent) + // yMax 16282 string16(properties.italicAngle ? 2 : 0) + // macStyle 16283 '\x00\x11' + // lowestRecPPEM 16284 '\x00\x00' + // fontDirectionHint 16285 '\x00\x00' + // indexToLocFormat 16286 '\x00\x00'); // glyphDataFormat 16287 })(), 16288 16289 // Horizontal header 16290 'hhea': (function fontFieldsHhea() { 16291 return stringToArray( 16292 '\x00\x01\x00\x00' + // Version number 16293 safeString16(properties.ascent) + // Typographic Ascent 16294 safeString16(properties.descent) + // Typographic Descent 16295 '\x00\x00' + // Line Gap 16296 '\xFF\xFF' + // advanceWidthMax 16297 '\x00\x00' + // minLeftSidebearing 16298 '\x00\x00' + // minRightSidebearing 16299 '\x00\x00' + // xMaxExtent 16300 safeString16(properties.capHeight) + // caretSlopeRise 16301 safeString16(Math.tan(properties.italicAngle) * 16302 properties.xHeight) + // caretSlopeRun 16303 '\x00\x00' + // caretOffset 16304 '\x00\x00' + // -reserved- 16305 '\x00\x00' + // -reserved- 16306 '\x00\x00' + // -reserved- 16307 '\x00\x00' + // -reserved- 16308 '\x00\x00' + // metricDataFormat 16309 string16(charstrings.length + 1)); // Number of HMetrics 16310 })(), 16311 16312 // Horizontal metrics 16313 'hmtx': (function fontFieldsHmtx() { 16314 var hmtx = '\x00\x00\x00\x00'; // Fake .notdef 16315 for (var i = 0, ii = charstrings.length; i < ii; i++) { 16316 var charstring = charstrings[i]; 16317 var width = 'width' in charstring ? charstring.width : 0; 16318 hmtx += string16(width) + string16(0); 16319 } 16320 return stringToArray(hmtx); 16321 })(), 16322 16323 // Maximum profile 16324 'maxp': (function fontFieldsMaxp() { 16325 return stringToArray( 16326 '\x00\x00\x50\x00' + // Version number 16327 string16(charstrings.length + 1)); // Num of glyphs 16328 })(), 16329 16330 // Naming tables 16331 'name': stringToArray(createNameTable(fontName)), 16332 16333 // PostScript informations 16334 'post': stringToArray(createPostTable(properties)) 16335 }; 16336 16337 for (var field in fields) 16338 createTableEntry(otf, field, fields[field]); 16339 16340 for (var field in fields) { 16341 var table = fields[field]; 16342 otf.file += arrayToString(table); 16343 } 16344 16345 return stringToArray(otf.file); 16346 }, 16347 16348 buildToFontChar: function Font_buildToFontChar(toUnicode) { 16349 var result = []; 16350 var unusedUnicode = kCmapGlyphOffset; 16351 for (var i = 0, ii = toUnicode.length; i < ii; i++) { 16352 var unicode = toUnicode[i]; 16353 var fontCharCode = typeof unicode === 'object' ? unusedUnicode++ : 16354 unicode; 16355 if (typeof unicode !== 'undefined') 16356 result[i] = fontCharCode; 16357 } 16358 return result; 16359 }, 16360 16361 rebuildToUnicode: function Font_rebuildToUnicode(properties) { 16362 var firstChar = properties.firstChar, lastChar = properties.lastChar; 16363 var map = []; 16364 if (properties.composite) { 16365 var isIdentityMap = this.cidToUnicode.length == 0; 16366 for (var i = firstChar, ii = lastChar; i <= ii; i++) { 16367 // TODO missing map the character according font's CMap 16368 var cid = i; 16369 map[i] = isIdentityMap ? cid : this.cidToUnicode[cid]; 16370 } 16371 } else { 16372 for (var i = firstChar, ii = lastChar; i <= ii; i++) { 16373 var glyph = properties.differences[i]; 16374 if (!glyph) 16375 glyph = properties.baseEncoding[i]; 16376 if (!!glyph && (glyph in GlyphsUnicode)) 16377 map[i] = GlyphsUnicode[glyph]; 16378 } 16379 } 16380 this.toUnicode = map; 16381 }, 16382 16383 loadCidToUnicode: function Font_loadCidToUnicode(properties) { 16384 if (!properties.cidSystemInfo) 16385 return; 16386 16387 var cidToUnicodeMap = [], unicodeToCIDMap = []; 16388 this.cidToUnicode = cidToUnicodeMap; 16389 this.unicodeToCID = unicodeToCIDMap; 16390 16391 var cidSystemInfo = properties.cidSystemInfo; 16392 var cidToUnicode; 16393 if (cidSystemInfo) { 16394 cidToUnicode = CIDToUnicodeMaps[ 16395 cidSystemInfo.registry + '-' + cidSystemInfo.ordering]; 16396 } 16397 16398 if (!cidToUnicode) 16399 return; // identity encoding 16400 16401 var cid = 1, i, j, k, ii; 16402 for (i = 0, ii = cidToUnicode.length; i < ii; ++i) { 16403 var unicode = cidToUnicode[i]; 16404 if (isArray(unicode)) { 16405 var length = unicode.length; 16406 for (j = 0; j < length; j++) { 16407 cidToUnicodeMap[cid] = unicode[j]; 16408 unicodeToCIDMap[unicode[j]] = cid; 16409 } 16410 cid++; 16411 } else if (typeof unicode === 'object') { 16412 var fillLength = unicode.f; 16413 if (fillLength) { 16414 k = unicode.c; 16415 for (j = 0; j < fillLength; ++j) { 16416 cidToUnicodeMap[cid] = k; 16417 unicodeToCIDMap[k] = cid; 16418 cid++; 16419 k++; 16420 } 16421 } else 16422 cid += unicode.s; 16423 } else if (unicode) { 16424 cidToUnicodeMap[cid] = unicode; 16425 unicodeToCIDMap[unicode] = cid; 16426 cid++; 16427 } else 16428 cid++; 16429 } 16430 }, 16431 16432 bindDOM: function Font_bindDOM(data) { 16433 var fontName = this.loadedName; 16434 16435 // Add the font-face rule to the document 16436 var url = ('url(data:' + this.mimetype + ';base64,' + 16437 PdfJS_window.window.btoa(data) + ');'); 16438 var rule = "@font-face { font-family:'" + fontName + "';src:" + url + '}'; 16439 16440 var styleElement = PdfJS_window.document.createElement('style'); 16441 PdfJS_window.document.documentElement.getElementsByTagName('head')[0].appendChild( 16442 styleElement); 16443 16444 var styleSheet = styleElement.sheet; 16445 styleSheet.insertRule(rule, styleSheet.cssRules.length); 16446 16447 if (PDFJS.pdfBug && FontInspector.enabled) 16448 FontInspector.fontAdded(this, url); 16449 16450 return rule; 16451 }, 16452 16453 get spaceWidth() { 16454 // trying to estimate space character width 16455 var possibleSpaceReplacements = ['space', 'minus', 'one', 'i']; 16456 var width; 16457 for (var i = 0, ii = possibleSpaceReplacements.length; i < ii; i++) { 16458 var glyphName = possibleSpaceReplacements[i]; 16459 // if possible, getting width by glyph name 16460 if (glyphName in this.widths) { 16461 width = this.widths[glyphName]; 16462 break; 16463 } 16464 var glyphUnicode = GlyphsUnicode[glyphName]; 16465 // finding the charcode via unicodeToCID map 16466 var charcode = 0; 16467 if (this.composite) 16468 charcode = this.unicodeToCID[glyphUnicode]; 16469 // ... via toUnicode map 16470 if (!charcode && 'toUnicode' in this) 16471 charcode = this.toUnicode.indexOf(glyphUnicode); 16472 // setting it to unicode if negative or undefined 16473 if (!(charcode > 0)) 16474 charcode = glyphUnicode; 16475 // trying to get width via charcode 16476 width = this.widths[charcode]; 16477 if (width) 16478 break; // the non-zero width found 16479 } 16480 width = (width || this.defaultWidth) * this.widthMultiplier; 16481 return shadow(this, 'spaceWidth', width); 16482 }, 16483 16484 charToGlyph: function Font_charToGlyph(charcode) { 16485 var fontCharCode, width, operatorList, disabled; 16486 16487 var width = this.widths[charcode]; 16488 16489 switch (this.type) { 16490 case 'CIDFontType0': 16491 if (this.noUnicodeAdaptation) { 16492 width = this.widths[this.unicodeToCID[charcode] || charcode]; 16493 fontCharCode = mapPrivateUseChars(charcode); 16494 break; 16495 } 16496 fontCharCode = this.toFontChar[charcode] || charcode; 16497 break; 16498 case 'CIDFontType2': 16499 if (this.noUnicodeAdaptation) { 16500 width = this.widths[this.unicodeToCID[charcode] || charcode]; 16501 fontCharCode = mapPrivateUseChars(charcode); 16502 break; 16503 } 16504 fontCharCode = this.toFontChar[charcode] || charcode; 16505 break; 16506 case 'Type1': 16507 var glyphName = this.differences[charcode] || this.encoding[charcode]; 16508 if (!isNum(width)) 16509 width = this.widths[glyphName]; 16510 if (this.noUnicodeAdaptation) { 16511 fontCharCode = mapPrivateUseChars(GlyphsUnicode[glyphName] || 16512 charcode); 16513 break; 16514 } 16515 fontCharCode = this.glyphNameMap[glyphName] || 16516 GlyphsUnicode[glyphName] || charcode; 16517 break; 16518 case 'Type3': 16519 var glyphName = this.differences[charcode] || this.encoding[charcode]; 16520 operatorList = this.charProcOperatorList[glyphName]; 16521 fontCharCode = charcode; 16522 break; 16523 case 'TrueType': 16524 if (this.useToFontChar) { 16525 fontCharCode = this.toFontChar[charcode] || charcode; 16526 break; 16527 } 16528 var glyphName = this.differences[charcode] || this.encoding[charcode]; 16529 if (!glyphName) 16530 glyphName = Encodings.StandardEncoding[charcode]; 16531 if (!isNum(width)) 16532 width = this.widths[glyphName]; 16533 if (this.noUnicodeAdaptation) { 16534 fontCharCode = GlyphsUnicode[glyphName] || charcode; 16535 break; 16536 } 16537 if (!this.hasEncoding || this.isSymbolicFont) { 16538 fontCharCode = this.useToFontChar ? this.toFontChar[charcode] : 16539 charcode; 16540 break; 16541 } 16542 16543 // MacRoman encoding address by re-encoding the cmap table 16544 fontCharCode = glyphName in this.glyphNameMap ? 16545 this.glyphNameMap[glyphName] : GlyphsUnicode[glyphName]; 16546 break; 16547 default: 16548 warn('Unsupported font type: ' + this.type); 16549 break; 16550 } 16551 16552 var unicodeChars = !('toUnicode' in this) ? charcode : 16553 this.toUnicode[charcode] || charcode; 16554 if (typeof unicodeChars === 'number') 16555 unicodeChars = String.fromCharCode(unicodeChars); 16556 16557 width = (isNum(width) ? width : this.defaultWidth) * this.widthMultiplier; 16558 disabled = this.unicodeIsEnabled ? 16559 !this.unicodeIsEnabled[fontCharCode] : false; 16560 16561 return { 16562 fontChar: String.fromCharCode(fontCharCode), 16563 unicode: unicodeChars, 16564 width: width, 16565 disabled: disabled, 16566 operatorList: operatorList 16567 }; 16568 }, 16569 16570 charsToGlyphs: function Font_charsToGlyphs(chars) { 16571 var charsCache = this.charsCache; 16572 var glyphs; 16573 16574 // if we translated this string before, just grab it from the cache 16575 if (charsCache) { 16576 glyphs = charsCache[chars]; 16577 if (glyphs) 16578 return glyphs; 16579 } 16580 16581 // lazily create the translation cache 16582 if (!charsCache) 16583 charsCache = this.charsCache = Object.create(null); 16584 16585 glyphs = []; 16586 16587 if (this.wideChars) { 16588 // composite fonts have multi-byte strings convert the string from 16589 // single-byte to multi-byte 16590 // XXX assuming CIDFonts are two-byte - later need to extract the 16591 // correct byte encoding according to the PDF spec 16592 var length = chars.length - 1; // looping over two bytes at a time so 16593 // loop should never end on the last byte 16594 for (var i = 0; i < length; i++) { 16595 var charcode = int16([chars.charCodeAt(i++), chars.charCodeAt(i)]); 16596 var glyph = this.charToGlyph(charcode); 16597 glyphs.push(glyph); 16598 // placing null after each word break charcode (ASCII SPACE) 16599 if (charcode == 0x20) 16600 glyphs.push(null); 16601 } 16602 } 16603 else { 16604 for (var i = 0, ii = chars.length; i < ii; ++i) { 16605 var charcode = chars.charCodeAt(i); 16606 var glyph = this.charToGlyph(charcode); 16607 glyphs.push(glyph); 16608 if (charcode == 0x20) 16609 glyphs.push(null); 16610 } 16611 } 16612 16613 // Enter the translated string into the cache 16614 return (charsCache[chars] = glyphs); 16615 } 16616 }; 16617 16618 return Font; 16619 })(); 16620 16621 /* 16622 * Type1Parser encapsulate the needed code for parsing a Type1 font 16623 * program. Some of its logic depends on the Type2 charstrings 16624 * structure. 16625 */ 16626 var Type1Parser = function type1Parser() { 16627 /* 16628 * Decrypt a Sequence of Ciphertext Bytes to Produce the Original Sequence 16629 * of Plaintext Bytes. The function took a key as a parameter which can be 16630 * for decrypting the eexec block of for decoding charStrings. 16631 */ 16632 var kEexecEncryptionKey = 55665; 16633 var kCharStringsEncryptionKey = 4330; 16634 16635 function decrypt(stream, key, discardNumber) { 16636 var r = key, c1 = 52845, c2 = 22719; 16637 var decryptedString = []; 16638 16639 var value = ''; 16640 var count = stream.length; 16641 for (var i = 0; i < count; i++) { 16642 value = stream[i]; 16643 decryptedString[i] = value ^ (r >> 8); 16644 r = ((value + r) * c1 + c2) & ((1 << 16) - 1); 16645 } 16646 return decryptedString.slice(discardNumber); 16647 } 16648 16649 /* 16650 * CharStrings are encoded following the the CharString Encoding sequence 16651 * describe in Chapter 6 of the "Adobe Type1 Font Format" specification. 16652 * The value in a byte indicates a command, a number, or subsequent bytes 16653 * that are to be interpreted in a special way. 16654 * 16655 * CharString Number Encoding: 16656 * A CharString byte containing the values from 32 through 255 inclusive 16657 * indicate an integer. These values are decoded in four ranges. 16658 * 16659 * 1. A CharString byte containing a value, v, between 32 and 246 inclusive, 16660 * indicate the integer v - 139. Thus, the integer values from -107 through 16661 * 107 inclusive may be encoded in single byte. 16662 * 16663 * 2. A CharString byte containing a value, v, between 247 and 250 inclusive, 16664 * indicates an integer involving the next byte, w, according to the formula: 16665 * [(v - 247) x 256] + w + 108 16666 * 16667 * 3. A CharString byte containing a value, v, between 251 and 254 inclusive, 16668 * indicates an integer involving the next byte, w, according to the formula: 16669 * -[(v - 251) * 256] - w - 108 16670 * 16671 * 4. A CharString containing the value 255 indicates that the next 4 bytes 16672 * are a two complement signed integer. The first of these bytes contains the 16673 * highest order bits, the second byte contains the next higher order bits 16674 * and the fourth byte contain the lowest order bits. 16675 * 16676 * 16677 * CharString Command Encoding: 16678 * CharStrings commands are encoded in 1 or 2 bytes. 16679 * 16680 * Single byte commands are encoded in 1 byte that contains a value between 16681 * 0 and 31 inclusive. 16682 * If a command byte contains the value 12, then the value in the next byte 16683 * indicates a command. This "escape" mechanism allows many extra commands 16684 * to be encoded and this encoding technique helps to minimize the length of 16685 * the charStrings. 16686 */ 16687 var charStringDictionary = { 16688 '1': 'hstem', 16689 '3': 'vstem', 16690 '4': 'vmoveto', 16691 '5': 'rlineto', 16692 '6': 'hlineto', 16693 '7': 'vlineto', 16694 '8': 'rrcurveto', 16695 16696 // closepath is a Type1 command that do not take argument and is useless 16697 // in Type2 and it can simply be ignored. 16698 '9': null, // closepath 16699 16700 '10': 'callsubr', 16701 16702 // return is normally used inside sub-routines to tells to the execution 16703 // flow that it can be back to normal. 16704 // During the translation process Type1 charstrings will be flattened and 16705 // sub-routines will be embedded directly into the charstring directly, so 16706 // this can be ignored safely. 16707 '11': 'return', 16708 16709 '12': { 16710 // dotsection is a Type1 command to specify some hinting feature for dots 16711 // that do not take a parameter and it can safely be ignored for Type2. 16712 '0': null, // dotsection 16713 16714 // [vh]stem3 are Type1 only and Type2 supports [vh]stem with multiple 16715 // parameters, so instead of returning [vh]stem3 take a shortcut and 16716 // return [vhstem] instead. 16717 '1': 'vstem', 16718 '2': 'hstem', 16719 16720 // Type1 only command with command not (yet) built-in ,throw an error 16721 '6': -1, // seac 16722 '7': -1, // sbw 16723 16724 '11': 'sub', 16725 '12': 'div', 16726 16727 // callothersubr is a mechanism to make calls on the postscript 16728 // interpreter, this is not supported by Type2 charstring but hopefully 16729 // most of the default commands can be ignored safely. 16730 '16': 'callothersubr', 16731 16732 '17': 'pop', 16733 16734 // setcurrentpoint sets the current point to x, y without performing a 16735 // moveto (this is a one shot positionning command). This is used only 16736 // with the return of an OtherSubrs call. 16737 // TODO Implement the OtherSubrs charstring embedding and replace this 16738 // call by a no-op, like 2 'pop' commands for example. 16739 '33': null // setcurrentpoint 16740 }, 16741 '13': 'hsbw', 16742 '14': 'endchar', 16743 '21': 'rmoveto', 16744 '22': 'hmoveto', 16745 '30': 'vhcurveto', 16746 '31': 'hvcurveto' 16747 }; 16748 16749 var kEscapeCommand = 12; 16750 16751 function decodeCharString(array) { 16752 var charstring = []; 16753 var lsb = 0; 16754 var width = 0; 16755 var flexState = 0; 16756 16757 var value = ''; 16758 var count = array.length; 16759 for (var i = 0; i < count; i++) { 16760 value = array[i]; 16761 16762 if (value < 32) { 16763 var command = null; 16764 if (value == kEscapeCommand) { 16765 var escape = array[++i]; 16766 16767 // TODO Clean this code 16768 if (escape == 16) { 16769 var index = charstring.pop(); 16770 var argc = charstring.pop(); 16771 for (var j = 0; j < argc; j++) 16772 charstring.push('drop'); 16773 16774 // If the flex mechanism is not used in a font program, Adobe 16775 // states that entries 0, 1 and 2 can simply be replaced by 16776 // {}, which means that we can simply ignore them. 16777 if (index < 3) { 16778 continue; 16779 } 16780 16781 // This is the same things about hint replacement, if it is not used 16782 // entry 3 can be replaced by {3} 16783 // TODO support hint replacment 16784 if (index == 3) { 16785 charstring.push(3); 16786 i++; 16787 continue; 16788 } 16789 } else if (escape == 17 || escape == 33) { 16790 // pop or setcurrentpoint commands can be ignored 16791 // since we are not doing callothersubr 16792 continue; 16793 } else if (!kHintingEnabled && (escape == 1 || escape == 2)) { 16794 charstring.push('drop', 'drop', 'drop', 'drop', 'drop', 'drop'); 16795 continue; 16796 } 16797 16798 command = charStringDictionary['12'][escape]; 16799 } else { 16800 // TODO Clean this code 16801 if (value == 13) { // hsbw 16802 if (charstring.length == 2) { 16803 lsb = charstring[0]; 16804 width = charstring[1]; 16805 charstring.splice(0, 1); 16806 } else if (charstring.length == 4 && charstring[3] == 'div') { 16807 lsb = charstring[0]; 16808 width = charstring[1] / charstring[2]; 16809 charstring.splice(0, 1); 16810 } else if (charstring.length == 4 && charstring[2] == 'div') { 16811 lsb = charstring[0] / charstring[1]; 16812 width = charstring[3]; 16813 charstring.splice(0, 3); 16814 } else { 16815 error('Unsupported hsbw format: ' + charstring); 16816 } 16817 16818 charstring.push(lsb, 'hmoveto'); 16819 continue; 16820 } else if (value == 10) { // callsubr 16821 if (charstring[charstring.length - 1] < 3) { // subr #0..2 16822 var subrNumber = charstring.pop(); 16823 switch (subrNumber) { 16824 case 1: 16825 flexState = 1; // prepare for flex coordinates 16826 break; 16827 case 2: 16828 flexState = 2; // flex in progress 16829 break; 16830 case 0: 16831 // type2 flex command does not need final coords 16832 charstring.push('exch', 'drop', 'exch', 'drop'); 16833 charstring.push('flex'); 16834 flexState = 0; 16835 break; 16836 } 16837 continue; 16838 } 16839 } else if (value == 21 && flexState > 0) { 16840 if (flexState > 1) 16841 continue; // ignoring rmoveto 16842 value = 5; // first segment replacing with rlineto 16843 } else if (!kHintingEnabled && (value == 1 || value == 3)) { 16844 charstring.push('drop', 'drop'); 16845 continue; 16846 } 16847 command = charStringDictionary[value]; 16848 } 16849 16850 // Some charstring commands are meaningless in Type2 and will return 16851 // a null, let's just ignored them 16852 if (!command && i < count) { 16853 continue; 16854 } else if (!command) { 16855 break; 16856 } else if (command == -1) { 16857 warn('Support for Type1 command ' + value + 16858 ' (' + escape + ') is not implemented in charstring: ' + 16859 charstring); 16860 if (value == 12) { 16861 // we know how to ignore only some the Type1 commands 16862 switch (escape) { 16863 case 7: 16864 charstring.push('drop', 'drop', 'drop', 'drop'); 16865 continue; 16866 case 8: 16867 charstring.push('drop'); 16868 continue; 16869 } 16870 } 16871 } 16872 16873 value = command; 16874 } else if (value <= 246) { 16875 value = value - 139; 16876 } else if (value <= 250) { 16877 value = ((value - 247) * 256) + array[++i] + 108; 16878 } else if (value <= 254) { 16879 value = -((value - 251) * 256) - array[++i] - 108; 16880 } else { 16881 value = (array[++i] & 0xff) << 24 | (array[++i] & 0xff) << 16 | 16882 (array[++i] & 0xff) << 8 | (array[++i] & 0xff) << 0; 16883 } 16884 16885 charstring.push(value); 16886 } 16887 16888 return { charstring: charstring, width: width, lsb: lsb }; 16889 } 16890 16891 /* 16892 * Returns an object containing a Subrs array and a CharStrings 16893 * array extracted from and eexec encrypted block of data 16894 */ 16895 function readNumberArray(str, index) { 16896 var start = index; 16897 while (str[index++] != '[') 16898 start++; 16899 start++; 16900 16901 var count = 0; 16902 while (str[index++] != ']') 16903 count++; 16904 16905 str = str.substr(start, count); 16906 16907 str = str.trim(); 16908 // Remove adjacent spaces 16909 str = str.replace(/\s+/g, ' '); 16910 16911 var array = str.split(' '); 16912 for (var i = 0, ii = array.length; i < ii; i++) 16913 array[i] = parseFloat(array[i] || 0); 16914 return array; 16915 } 16916 16917 function readNumber(str, index) { 16918 while (str[index] == ' ') 16919 index++; 16920 16921 var start = index; 16922 16923 var count = 0; 16924 while (str[index++] != ' ') 16925 count++; 16926 16927 return parseFloat(str.substr(start, count) || 0); 16928 } 16929 16930 function isSeparator(c) { 16931 return c == ' ' || c == '\n' || c == '\x0d'; 16932 } 16933 16934 this.extractFontProgram = function Type1Parser_extractFontProgram(stream) { 16935 var eexec = decrypt(stream, kEexecEncryptionKey, 4); 16936 var eexecStr = ''; 16937 for (var i = 0, ii = eexec.length; i < ii; i++) 16938 eexecStr += String.fromCharCode(eexec[i]); 16939 16940 var glyphsSection = false, subrsSection = false; 16941 var program = { 16942 subrs: [], 16943 charstrings: [], 16944 properties: { 16945 'privateData': { 16946 'lenIV': 4 16947 } 16948 } 16949 }; 16950 16951 var glyph = ''; 16952 var token = ''; 16953 var length = 0; 16954 16955 var c = ''; 16956 var count = eexecStr.length; 16957 for (var i = 0; i < count; i++) { 16958 var getToken = function getToken() { 16959 while (i < count && isSeparator(eexecStr[i])) 16960 ++i; 16961 16962 var token = ''; 16963 while (i < count && !isSeparator(eexecStr[i])) 16964 token += eexecStr[i++]; 16965 16966 return token; 16967 }; 16968 var c = eexecStr[i]; 16969 16970 if ((glyphsSection || subrsSection) && 16971 (token == 'RD' || token == '-|')) { 16972 i++; 16973 var data = eexec.slice(i, i + length); 16974 var lenIV = program.properties.privateData['lenIV']; 16975 var encoded = decrypt(data, kCharStringsEncryptionKey, lenIV); 16976 var str = decodeCharString(encoded); 16977 16978 if (glyphsSection) { 16979 program.charstrings.push({ 16980 glyph: glyph, 16981 data: str.charstring, 16982 lsb: str.lsb, 16983 width: str.width 16984 }); 16985 } else { 16986 program.subrs.push(str.charstring); 16987 } 16988 i += length; 16989 token = ''; 16990 } else if (isSeparator(c)) { 16991 length = parseInt(token, 10); 16992 token = ''; 16993 } else { 16994 token += c; 16995 if (!glyphsSection) { 16996 switch (token) { 16997 case '/CharString': 16998 glyphsSection = true; 16999 break; 17000 case '/Subrs': 17001 ++i; 17002 var num = parseInt(getToken(), 10); 17003 getToken(); // read in 'array' 17004 for (var j = 0; j < num; ++j) { 17005 var t = getToken(); // read in 'dup' 17006 if (t == 'ND' || t == '|-' || t == 'noaccess') 17007 break; 17008 var index = parseInt(getToken(), 10); 17009 if (index > j) 17010 j = index; 17011 var length = parseInt(getToken(), 10); 17012 getToken(); // read in 'RD' 17013 var data = eexec.slice(i + 1, i + 1 + length); 17014 var lenIV = program.properties.privateData['lenIV']; 17015 var encoded = decrypt(data, kCharStringsEncryptionKey, lenIV); 17016 var str = decodeCharString(encoded); 17017 i = i + 1 + length; 17018 t = getToken(); // read in 'NP' 17019 if (t == 'noaccess') 17020 getToken(); // read in 'put' 17021 program.subrs[index] = str.charstring; 17022 } 17023 break; 17024 case '/BlueValues': 17025 case '/OtherBlues': 17026 case '/FamilyBlues': 17027 case '/FamilyOtherBlues': 17028 case '/StemSnapH': 17029 case '/StemSnapV': 17030 program.properties.privateData[token.substring(1)] = 17031 readNumberArray(eexecStr, i + 1); 17032 break; 17033 case '/StdHW': 17034 case '/StdVW': 17035 program.properties.privateData[token.substring(1)] = 17036 readNumberArray(eexecStr, i + 2)[0]; 17037 break; 17038 case '/BlueShift': 17039 case '/lenIV': 17040 case '/BlueFuzz': 17041 case '/BlueScale': 17042 case '/LanguageGroup': 17043 case '/ExpansionFactor': 17044 program.properties.privateData[token.substring(1)] = 17045 readNumber(eexecStr, i + 1); 17046 break; 17047 } 17048 } else if (c == '/') { 17049 token = glyph = ''; 17050 while ((c = eexecStr[++i]) != ' ') 17051 glyph += c; 17052 } 17053 } 17054 } 17055 17056 return program; 17057 }; 17058 17059 this.extractFontHeader = function Type1Parser_extractFontHeader(stream, 17060 properties) { 17061 var headerString = ''; 17062 for (var i = 0, ii = stream.length; i < ii; i++) 17063 headerString += String.fromCharCode(stream[i]); 17064 17065 var token = ''; 17066 var count = headerString.length; 17067 for (var i = 0; i < count; i++) { 17068 var getToken = function getToken() { 17069 var character = headerString[i]; 17070 while (i < count && (isSeparator(character) || character == '/')) 17071 character = headerString[++i]; 17072 17073 var token = ''; 17074 while (i < count && !(isSeparator(character) || character == '/')) { 17075 token += character; 17076 character = headerString[++i]; 17077 } 17078 17079 return token; 17080 }; 17081 17082 var c = headerString[i]; 17083 if (isSeparator(c)) { 17084 switch (token) { 17085 case '/FontMatrix': 17086 var matrix = readNumberArray(headerString, i + 1); 17087 17088 // The FontMatrix is in unitPerEm, so make it pixels 17089 for (var j = 0, jj = matrix.length; j < jj; j++) 17090 matrix[j] *= 1000; 17091 17092 // Make the angle into the right direction 17093 matrix[2] *= -1; 17094 17095 properties.fontMatrix = matrix; 17096 break; 17097 case '/Encoding': 17098 var encodingArg = getToken(); 17099 var encoding; 17100 if (!/^\d+$/.test(encodingArg)) { 17101 // encoding name is specified 17102 encoding = Encodings[encodingArg]; 17103 } else { 17104 encoding = []; 17105 var size = parseInt(encodingArg, 10); 17106 getToken(); // read in 'array' 17107 17108 for (var j = 0; j < size; j++) { 17109 var token = getToken(); 17110 if (token == 'dup') { 17111 var index = parseInt(getToken(), 10); 17112 var glyph = getToken(); 17113 encoding[index] = glyph; 17114 getToken(); // read the in 'put' 17115 } 17116 } 17117 } 17118 if (!properties.hasEncoding && encoding) { 17119 properties.baseEncoding = encoding; 17120 break; 17121 } 17122 break; 17123 } 17124 token = ''; 17125 } else { 17126 token += c; 17127 } 17128 } 17129 }; 17130 }; 17131 17132 /** 17133 * The CFF class takes a Type1 file and wrap it into a 17134 * 'Compact Font Format' which itself embed Type2 charstrings. 17135 */ 17136 var CFFStandardStrings = [ 17137 '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent', 17138 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus', 17139 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', 17140 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', 17141 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 17142 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 17143 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 17144 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 17145 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 17146 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent', 17147 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency', 17148 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft', 17149 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl', 17150 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase', 17151 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown', 17152 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent', 17153 'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash', 17154 'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 17155 'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior', 17156 'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 17157 'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 17158 'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 17159 'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 17160 'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 17161 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 17162 'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 17163 'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 17164 'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 17165 'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 17166 'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 17167 'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 17168 'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron', 'exclamsmall', 17169 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 17170 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', '266 ff', 17171 'onedotenleader', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 17172 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 17173 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'commasuperior', 17174 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior', 17175 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 17176 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior', 17177 'tsuperior', 'ff', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior', 17178 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall', 17179 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 17180 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall', 17181 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 17182 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah', 17183 'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall', 17184 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall', 17185 'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior', 17186 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'questiondownsmall', 'oneeighth', 17187 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', 17188 'zerosuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 17189 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior', 17190 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior', 17191 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior', 17192 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior', 17193 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall', 17194 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall', 17195 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall', 17196 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall', 17197 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 17198 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 17199 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 17200 'Thornsmall', 'Ydieresissmall', '001.000', '001.001', '001.002', '001.003', 17201 'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold' 17202 ]; 17203 17204 var type1Parser = new Type1Parser(); 17205 17206 // Type1Font is also a CIDFontType0. 17207 var Type1Font = function Type1Font(name, file, properties) { 17208 // Get the data block containing glyphs and subrs informations 17209 var headerBlock = file.getBytes(properties.length1); 17210 type1Parser.extractFontHeader(headerBlock, properties); 17211 17212 // Decrypt the data blocks and retrieve it's content 17213 var eexecBlock = file.getBytes(properties.length2); 17214 var data = type1Parser.extractFontProgram(eexecBlock); 17215 for (var info in data.properties) 17216 properties[info] = data.properties[info]; 17217 17218 var charstrings = this.getOrderedCharStrings(data.charstrings, properties); 17219 var type2Charstrings = this.getType2Charstrings(charstrings); 17220 var subrs = this.getType2Subrs(data.subrs); 17221 17222 this.charstrings = charstrings; 17223 this.data = this.wrap(name, type2Charstrings, this.charstrings, 17224 subrs, properties); 17225 }; 17226 17227 Type1Font.prototype = { 17228 createCFFIndexHeader: function Type1Font_createCFFIndexHeader(objects, 17229 isByte) { 17230 // First 2 bytes contains the number of objects contained into this index 17231 var count = objects.length; 17232 17233 // If there is no object, just create an array saying that with another 17234 // offset byte. 17235 if (count == 0) 17236 return '\x00\x00\x00'; 17237 17238 var data = String.fromCharCode((count >> 8) & 0xFF, count & 0xff); 17239 17240 // Next byte contains the offset size use to reference object in the file 17241 // Actually we're using 0x04 to be sure to be able to store everything 17242 // without thinking of it while coding. 17243 data += '\x04'; 17244 17245 // Add another offset after this one because we need a new offset 17246 var relativeOffset = 1; 17247 for (var i = 0; i < count + 1; i++) { 17248 data += String.fromCharCode((relativeOffset >>> 24) & 0xFF, 17249 (relativeOffset >> 16) & 0xFF, 17250 (relativeOffset >> 8) & 0xFF, 17251 relativeOffset & 0xFF); 17252 17253 if (objects[i]) 17254 relativeOffset += objects[i].length; 17255 } 17256 17257 for (var i = 0; i < count; i++) { 17258 for (var j = 0, jj = objects[i].length; j < jj; j++) 17259 data += isByte ? String.fromCharCode(objects[i][j] & 0xFF) : 17260 objects[i][j]; 17261 } 17262 return data; 17263 }, 17264 17265 encodeNumber: function Type1Font_encodeNumber(value) { 17266 // some of the fonts has ouf-of-range values 17267 // they are just arithmetic overflows 17268 // make sanitizer happy 17269 value |= 0; 17270 if (value >= -32768 && value <= 32767) { 17271 return '\x1c' + 17272 String.fromCharCode((value >> 8) & 0xFF) + 17273 String.fromCharCode(value & 0xFF); 17274 } else { 17275 return '\x1d' + 17276 String.fromCharCode((value >> 24) & 0xFF) + 17277 String.fromCharCode((value >> 16) & 0xFF) + 17278 String.fromCharCode((value >> 8) & 0xFF) + 17279 String.fromCharCode(value & 0xFF); 17280 } 17281 }, 17282 17283 getOrderedCharStrings: function Type1Font_getOrderedCharStrings(glyphs, 17284 properties) { 17285 var charstrings = []; 17286 var i, length, glyphName; 17287 var unusedUnicode = kCmapGlyphOffset; 17288 for (i = 0, length = glyphs.length; i < length; i++) { 17289 var item = glyphs[i]; 17290 var glyphName = item.glyph; 17291 var unicode = glyphName in GlyphsUnicode ? 17292 GlyphsUnicode[glyphName] : unusedUnicode++; 17293 charstrings.push({ 17294 glyph: glyphName, 17295 unicode: unicode, 17296 gid: i, 17297 charstring: item.data, 17298 width: item.width, 17299 lsb: item.lsb 17300 }); 17301 } 17302 17303 charstrings.sort(function charstrings_sort(a, b) { 17304 return a.unicode - b.unicode; 17305 }); 17306 return charstrings; 17307 }, 17308 17309 getType2Charstrings: function Type1Font_getType2Charstrings( 17310 type1Charstrings) { 17311 var type2Charstrings = []; 17312 var count = type1Charstrings.length; 17313 for (var i = 0; i < count; i++) { 17314 var charstring = type1Charstrings[i].charstring; 17315 type2Charstrings.push(this.flattenCharstring(charstring.slice(), 17316 this.commandsMap)); 17317 } 17318 return type2Charstrings; 17319 }, 17320 17321 getType2Subrs: function Type1Font_getType2Subrs(type1Subrs) { 17322 var bias = 0; 17323 var count = type1Subrs.length; 17324 if (count < 1240) 17325 bias = 107; 17326 else if (count < 33900) 17327 bias = 1131; 17328 else 17329 bias = 32768; 17330 17331 // Add a bunch of empty subrs to deal with the Type2 bias 17332 var type2Subrs = []; 17333 for (var i = 0; i < bias; i++) 17334 type2Subrs.push([0x0B]); 17335 17336 for (var i = 0; i < count; i++) { 17337 var subr = type1Subrs[i]; 17338 if (!subr) 17339 subr = [0x0B]; 17340 17341 type2Subrs.push(this.flattenCharstring(subr, this.commandsMap)); 17342 } 17343 17344 return type2Subrs; 17345 }, 17346 17347 /* 17348 * Flatten the commands by interpreting the postscript code and replacing 17349 * every 'callsubr', 'callothersubr' by the real commands. 17350 */ 17351 commandsMap: { 17352 'hstem': 1, 17353 'vstem': 3, 17354 'vmoveto': 4, 17355 'rlineto': 5, 17356 'hlineto': 6, 17357 'vlineto': 7, 17358 'rrcurveto': 8, 17359 'callsubr': 10, 17360 'return': 11, 17361 'sub': [12, 11], 17362 'div': [12, 12], 17363 'exch': [12, 28], 17364 'flex': [12, 35], 17365 'drop' : [12, 18], 17366 'endchar': 14, 17367 'rmoveto': 21, 17368 'hmoveto': 22, 17369 'vhcurveto': 30, 17370 'hvcurveto': 31 17371 }, 17372 17373 flattenCharstring: function Type1Font_flattenCharstring(charstring, map) { 17374 // charstring changes size - can't cache .length in loop 17375 for (var i = 0; i < charstring.length; i++) { 17376 var command = charstring[i]; 17377 if (command.charAt) { 17378 var cmd = map[command]; 17379 assert(cmd, 'Unknow command: ' + command); 17380 17381 if (isArray(cmd)) 17382 charstring.splice(i++, 1, cmd[0], cmd[1]); 17383 else 17384 charstring[i] = cmd; 17385 } else { 17386 // Type1 charstring use a division for number above 32000 17387 if (command > 32000) { 17388 var divisor = charstring[i + 1]; 17389 command /= divisor; 17390 charstring.splice(i, 3, 28, command >> 8, command & 0xff); 17391 } else { 17392 charstring.splice(i, 1, 28, command >> 8, command & 0xff); 17393 } 17394 i += 2; 17395 } 17396 } 17397 return charstring; 17398 }, 17399 17400 wrap: function Type1Font_wrap(name, glyphs, charstrings, subrs, properties) { 17401 var fields = { 17402 // major version, minor version, header size, offset size 17403 'header': '\x01\x00\x04\x04', 17404 17405 'names': this.createCFFIndexHeader([name]), 17406 17407 'topDict': (function topDict(self) { 17408 return function cffWrapTopDict() { 17409 var header = '\x00\x01\x01\x01'; 17410 var dict = 17411 '\xf8\x1b\x00' + // version 17412 '\xf8\x1c\x01' + // Notice 17413 '\xf8\x1d\x02' + // FullName 17414 '\xf8\x1e\x03' + // FamilyName 17415 '\xf8\x1f\x04' + // Weight 17416 '\x1c\x00\x00\x10'; // Encoding 17417 17418 var boundingBox = properties.bbox; 17419 for (var i = 0, ii = boundingBox.length; i < ii; i++) 17420 dict += self.encodeNumber(boundingBox[i]); 17421 dict += '\x05'; // FontBBox; 17422 17423 var offset = fields.header.length + 17424 fields.names.length + 17425 (header.length + 1) + 17426 (dict.length + (4 + 4)) + 17427 fields.strings.length + 17428 fields.globalSubrs.length; 17429 17430 // If the offset if over 32767, encodeNumber is going to return 17431 // 5 bytes to encode the position instead of 3. 17432 if ((offset + fields.charstrings.length) > 32767) { 17433 offset += 9; 17434 } else { 17435 offset += 7; 17436 } 17437 17438 dict += self.encodeNumber(offset) + '\x0f'; // Charset 17439 17440 offset = offset + (glyphs.length * 2) + 1; 17441 dict += self.encodeNumber(offset) + '\x11'; // Charstrings 17442 17443 offset = offset + fields.charstrings.length; 17444 dict += self.encodeNumber(fields.privateData.length); 17445 dict += self.encodeNumber(offset) + '\x12'; // Private 17446 17447 return header + String.fromCharCode(dict.length + 1) + dict; 17448 }; 17449 })(this), 17450 17451 'strings': (function strings(self) { 17452 var strings = [ 17453 'Version 0.11', // Version 17454 'See original notice', // Notice 17455 name, // FullName 17456 name, // FamilyName 17457 'Medium' // Weight 17458 ]; 17459 return self.createCFFIndexHeader(strings); 17460 })(this), 17461 17462 'globalSubrs': this.createCFFIndexHeader([]), 17463 17464 'charset': (function charset(self) { 17465 var charsetString = '\x00'; // Encoding 17466 17467 var count = glyphs.length; 17468 for (var i = 0; i < count; i++) { 17469 var index = CFFStandardStrings.indexOf(charstrings[i].glyph); 17470 // Some characters like asterikmath && circlecopyrt are 17471 // missing from the original strings, for the moment let's 17472 // map them to .notdef and see later if it cause any 17473 // problems 17474 if (index == -1) 17475 index = 0; 17476 17477 charsetString += String.fromCharCode(index >> 8, index & 0xff); 17478 } 17479 return charsetString; 17480 })(this), 17481 17482 'charstrings': this.createCFFIndexHeader([[0x8B, 0x0E]].concat(glyphs), 17483 true), 17484 17485 'privateData': (function cffWrapPrivate(self) { 17486 var data = 17487 '\x8b\x14' + // defaultWidth 17488 '\x8b\x15'; // nominalWidth 17489 var fieldMap = { 17490 BlueValues: '\x06', 17491 OtherBlues: '\x07', 17492 FamilyBlues: '\x08', 17493 FamilyOtherBlues: '\x09', 17494 StemSnapH: '\x0c\x0c', 17495 StemSnapV: '\x0c\x0d', 17496 BlueShift: '\x0c\x0a', 17497 BlueFuzz: '\x0c\x0b', 17498 BlueScale: '\x0c\x09', 17499 LanguageGroup: '\x0c\x11', 17500 ExpansionFactor: '\x0c\x18' 17501 }; 17502 for (var field in fieldMap) { 17503 if (!properties.privateData.hasOwnProperty(field)) 17504 continue; 17505 var value = properties.privateData[field]; 17506 17507 if (isArray(value)) { 17508 data += self.encodeNumber(value[0]); 17509 for (var i = 1, ii = value.length; i < ii; i++) 17510 data += self.encodeNumber(value[i] - value[i - 1]); 17511 } else { 17512 data += self.encodeNumber(value); 17513 } 17514 data += fieldMap[field]; 17515 } 17516 17517 data += self.encodeNumber(data.length + 4) + '\x13'; // Subrs offset 17518 17519 return data; 17520 })(this), 17521 17522 'localSubrs': this.createCFFIndexHeader(subrs, true) 17523 }; 17524 fields.topDict = fields.topDict(); 17525 17526 17527 var cff = []; 17528 for (var index in fields) { 17529 var field = fields[index]; 17530 for (var i = 0, ii = field.length; i < ii; i++) 17531 cff.push(field.charCodeAt(i)); 17532 } 17533 17534 return cff; 17535 } 17536 }; 17537 17538 var CFFFont = (function CFFFontClosure() { 17539 function CFFFont(file, properties) { 17540 this.properties = properties; 17541 17542 var parser = new CFFParser(file, properties); 17543 var cff = parser.parse(); 17544 var compiler = new CFFCompiler(cff); 17545 this.readExtra(cff); 17546 try { 17547 this.data = compiler.compile(); 17548 } catch (e) { 17549 warn('Failed to compile font ' + properties.loadedName); 17550 // There may have just been an issue with the compiler, set the data 17551 // anyway and hope the font loaded. 17552 this.data = file; 17553 } 17554 } 17555 17556 CFFFont.prototype = { 17557 readExtra: function CFFFont_readExtra(cff) { 17558 // charstrings contains info about glyphs (one element per glyph 17559 // containing mappings for {unicode, width}) 17560 var charset = cff.charset.charset; 17561 var encoding = cff.encoding ? cff.encoding.encoding : null; 17562 var charstrings = this.getCharStrings(charset, encoding); 17563 17564 // create the mapping between charstring and glyph id 17565 var glyphIds = []; 17566 for (var i = 0, ii = charstrings.length; i < ii; i++) 17567 glyphIds.push(charstrings[i].gid); 17568 17569 this.charstrings = charstrings; 17570 this.glyphIds = glyphIds; 17571 }, 17572 getCharStrings: function CFFFont_getCharStrings(charsets, encoding) { 17573 var charstrings = []; 17574 var unicodeUsed = []; 17575 var unassignedUnicodeItems = []; 17576 var inverseEncoding = []; 17577 // CID fonts don't have an encoding. 17578 if (encoding !== null) 17579 for (var charcode in encoding) 17580 inverseEncoding[encoding[charcode]] = charcode | 0; 17581 else 17582 inverseEncoding = charsets; 17583 for (var i = 0, ii = charsets.length; i < ii; i++) { 17584 var glyph = charsets[i]; 17585 if (glyph == '.notdef') 17586 continue; 17587 17588 var code = inverseEncoding[i]; 17589 if (!code || isSpecialUnicode(code)) { 17590 unassignedUnicodeItems.push(i); 17591 continue; 17592 } 17593 charstrings.push({ 17594 unicode: code, 17595 code: code, 17596 gid: i, 17597 glyph: glyph 17598 }); 17599 unicodeUsed[code] = true; 17600 } 17601 17602 var nextUnusedUnicode = kCmapGlyphOffset; 17603 for (var j = 0, jj = unassignedUnicodeItems.length; j < jj; ++j) { 17604 var i = unassignedUnicodeItems[j]; 17605 // giving unicode value anyway 17606 while (nextUnusedUnicode in unicodeUsed) 17607 nextUnusedUnicode++; 17608 var unicode = nextUnusedUnicode++; 17609 charstrings.push({ 17610 unicode: unicode, 17611 code: inverseEncoding[i] || 0, 17612 gid: i, 17613 glyph: charsets[i] 17614 }); 17615 } 17616 17617 // sort the array by the unicode value (again) 17618 charstrings.sort(function getCharStringsSort(a, b) { 17619 return a.unicode - b.unicode; 17620 }); 17621 return charstrings; 17622 } 17623 }; 17624 17625 return CFFFont; 17626 })(); 17627 17628 var CFFParser = (function CFFParserClosure() { 17629 function CFFParser(file, properties) { 17630 this.bytes = file.getBytes(); 17631 this.properties = properties; 17632 } 17633 CFFParser.prototype = { 17634 parse: function CFFParser_parse() { 17635 var properties = this.properties; 17636 var cff = new CFF(); 17637 this.cff = cff; 17638 17639 // The first five sections must be in order, all the others are reached 17640 // via offsets contained in one of the below. 17641 var header = this.parseHeader(); 17642 var nameIndex = this.parseIndex(header.endPos); 17643 var topDictIndex = this.parseIndex(nameIndex.endPos); 17644 var stringIndex = this.parseIndex(topDictIndex.endPos); 17645 var globalSubrIndex = this.parseIndex(stringIndex.endPos); 17646 17647 var topDictParsed = this.parseDict(topDictIndex.obj.get(0)); 17648 var topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings); 17649 17650 cff.header = header.obj; 17651 cff.names = this.parseNameIndex(nameIndex.obj); 17652 cff.strings = this.parseStringIndex(stringIndex.obj); 17653 cff.topDict = topDict; 17654 cff.globalSubrIndex = globalSubrIndex.obj; 17655 17656 this.parsePrivateDict(cff.topDict); 17657 17658 cff.isCIDFont = topDict.hasName('ROS'); 17659 17660 var charStringOffset = topDict.getByName('CharStrings'); 17661 cff.charStrings = this.parseCharStrings(charStringOffset); 17662 17663 var charset, encoding; 17664 if (cff.isCIDFont) { 17665 var fdArrayIndex = this.parseIndex(topDict.getByName('FDArray')).obj; 17666 for (var i = 0, ii = fdArrayIndex.count; i < ii; ++i) { 17667 var dictRaw = fdArrayIndex.get(i); 17668 var fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw), 17669 cff.strings); 17670 this.parsePrivateDict(fontDict); 17671 cff.fdArray.push(fontDict); 17672 } 17673 // cid fonts don't have an encoding 17674 encoding = null; 17675 charset = this.parseCharsets(topDict.getByName('charset'), 17676 cff.charStrings.count, cff.strings, true); 17677 cff.fdSelect = this.parseFDSelect(topDict.getByName('FDSelect'), 17678 cff.charStrings.count); 17679 } else { 17680 charset = this.parseCharsets(topDict.getByName('charset'), 17681 cff.charStrings.count, cff.strings, false); 17682 encoding = this.parseEncoding(topDict.getByName('Encoding'), 17683 properties, 17684 cff.strings, charset.charset); 17685 } 17686 cff.charset = charset; 17687 cff.encoding = encoding; 17688 17689 return cff; 17690 }, 17691 parseHeader: function CFFParser_parseHeader() { 17692 var bytes = this.bytes; 17693 var offset = 0; 17694 17695 while (bytes[offset] != 1) 17696 ++offset; 17697 17698 if (offset != 0) { 17699 warn('cff data is shifted'); 17700 bytes = bytes.subarray(offset); 17701 this.bytes = bytes; 17702 } 17703 var major = bytes[0]; 17704 var minor = bytes[1]; 17705 var hdrSize = bytes[2]; 17706 var offSize = bytes[3]; 17707 var header = new CFFHeader(major, minor, hdrSize, offSize); 17708 return {obj: header, endPos: hdrSize}; 17709 }, 17710 parseDict: function CFFParser_parseDict(dict) { 17711 var pos = 0; 17712 17713 function parseOperand() { 17714 var value = dict[pos++]; 17715 if (value === 30) { 17716 return parseFloatOperand(pos); 17717 } else if (value === 28) { 17718 value = dict[pos++]; 17719 value = (value << 8) | dict[pos++]; 17720 return value; 17721 } else if (value === 29) { 17722 value = dict[pos++]; 17723 value = (value << 8) | dict[pos++]; 17724 value = (value << 8) | dict[pos++]; 17725 value = (value << 8) | dict[pos++]; 17726 return value; 17727 } else if (value >= 32 && value <= 246) { 17728 return value - 139; 17729 } else if (value >= 247 && value <= 250) { 17730 return ((value - 247) * 256) + dict[pos++] + 108; 17731 } else if (value >= 251 && value <= 254) { 17732 return -((value - 251) * 256) - dict[pos++] - 108; 17733 } else { 17734 error('255 is not a valid DICT command'); 17735 } 17736 return -1; 17737 } 17738 17739 function parseFloatOperand() { 17740 var str = ''; 17741 var eof = 15; 17742 var lookup = ['0', '1', '2', '3', '4', '5', '6', '7', '8', 17743 '9', '.', 'E', 'E-', null, '-']; 17744 var length = dict.length; 17745 while (pos < length) { 17746 var b = dict[pos++]; 17747 var b1 = b >> 4; 17748 var b2 = b & 15; 17749 17750 if (b1 == eof) 17751 break; 17752 str += lookup[b1]; 17753 17754 if (b2 == eof) 17755 break; 17756 str += lookup[b2]; 17757 } 17758 return parseFloat(str); 17759 } 17760 17761 var operands = []; 17762 var entries = []; 17763 17764 var pos = 0; 17765 var end = dict.length; 17766 while (pos < end) { 17767 var b = dict[pos]; 17768 if (b <= 21) { 17769 if (b === 12) 17770 b = (b << 8) | dict[++pos]; 17771 entries.push([b, operands]); 17772 operands = []; 17773 ++pos; 17774 } else { 17775 operands.push(parseOperand()); 17776 } 17777 } 17778 return entries; 17779 }, 17780 parseIndex: function CFFParser_parseIndex(pos) { 17781 var cffIndex = new CFFIndex(); 17782 var bytes = this.bytes; 17783 var count = (bytes[pos++] << 8) | bytes[pos++]; 17784 var offsets = []; 17785 var start = pos; 17786 var end = pos; 17787 17788 if (count != 0) { 17789 var offsetSize = bytes[pos++]; 17790 // add 1 for offset to determine size of last object 17791 var startPos = pos + ((count + 1) * offsetSize) - 1; 17792 17793 for (var i = 0, ii = count + 1; i < ii; ++i) { 17794 var offset = 0; 17795 for (var j = 0; j < offsetSize; ++j) { 17796 offset <<= 8; 17797 offset += bytes[pos++]; 17798 } 17799 offsets.push(startPos + offset); 17800 } 17801 end = offsets[count]; 17802 } 17803 for (var i = 0, ii = offsets.length - 1; i < ii; ++i) { 17804 var offsetStart = offsets[i]; 17805 var offsetEnd = offsets[i + 1]; 17806 cffIndex.add(bytes.subarray(offsetStart, offsetEnd)); 17807 } 17808 return {obj: cffIndex, endPos: end}; 17809 }, 17810 parseNameIndex: function CFFParser_parseNameIndex(index) { 17811 var names = []; 17812 for (var i = 0, ii = index.count; i < ii; ++i) { 17813 var name = index.get(i); 17814 // OTS doesn't allow names to be over 127 characters. 17815 var length = Math.min(name.length, 127); 17816 var data = []; 17817 // OTS also only permits certain characters in the name. 17818 for (var j = 0; j < length; ++j) { 17819 var c = name[j]; 17820 if (j === 0 && c === 0) { 17821 data[j] = c; 17822 continue; 17823 } 17824 if ((c < 33 || c > 126) || c === 91 /* [ */ || c === 93 /* ] */ || 17825 c === 40 /* ( */ || c === 41 /* ) */ || c === 123 /* { */ || 17826 c === 125 /* } */ || c === 60 /* < */ || c === 62 /* > */ || 17827 c === 47 /* / */ || c === 37 /* % */) { 17828 data[j] = 95; 17829 continue; 17830 } 17831 data[j] = c; 17832 } 17833 names.push(String.fromCharCode.apply(null, data)); 17834 } 17835 return names; 17836 }, 17837 parseStringIndex: function CFFParser_parseStringIndex(index) { 17838 var strings = new CFFStrings(); 17839 for (var i = 0, ii = index.count; i < ii; ++i) { 17840 var data = index.get(i); 17841 strings.add(String.fromCharCode.apply(null, data)); 17842 } 17843 return strings; 17844 }, 17845 createDict: function CFFParser_createDict(type, dict, strings) { 17846 var cffDict = new type(strings); 17847 var types = cffDict.types; 17848 17849 for (var i = 0, ii = dict.length; i < ii; ++i) { 17850 var pair = dict[i]; 17851 var key = pair[0]; 17852 var value = pair[1]; 17853 cffDict.setByKey(key, value); 17854 } 17855 return cffDict; 17856 }, 17857 parseCharStrings: function CFFParser_parseCharStrings(charStringOffset) { 17858 var charStrings = this.parseIndex(charStringOffset).obj; 17859 // The CFF specification state that the 'dotsection' command 17860 // (12, 0) is deprecated and treated as a no-op, but all Type2 17861 // charstrings processors should support them. Unfortunately 17862 // the font sanitizer don't. As a workaround the sequence (12, 0) 17863 // is replaced by a useless (0, hmoveto). 17864 var count = charStrings.count; 17865 for (var i = 0; i < count; i++) { 17866 var charstring = charStrings.get(i); 17867 17868 var data = charstring; 17869 var length = data.length; 17870 for (var j = 0; j <= length; j) { 17871 var value = data[j++]; 17872 if (value == 12 && data[j++] == 0) { 17873 data[j - 2] = 139; 17874 data[j - 1] = 22; 17875 } else if (value === 28) { 17876 j += 2; 17877 } else if (value >= 247 && value <= 254) { 17878 j++; 17879 } else if (value == 255) { 17880 j += 4; 17881 } 17882 } 17883 } 17884 return charStrings; 17885 }, 17886 parsePrivateDict: function CFFParser_parsePrivateDict(parentDict) { 17887 // no private dict, do nothing 17888 if (!parentDict.hasName('Private')) 17889 return; 17890 var privateOffset = parentDict.getByName('Private'); 17891 // make sure the params are formatted correctly 17892 if (!isArray(privateOffset) || privateOffset.length !== 2) { 17893 parentDict.removeByName('Private'); 17894 return; 17895 } 17896 var size = privateOffset[0]; 17897 var offset = privateOffset[1]; 17898 // remove empty dicts or ones that refer to invalid location 17899 if (size === 0 || offset >= this.bytes.length) { 17900 parentDict.removeByName('Private'); 17901 return; 17902 } 17903 17904 var privateDictEnd = offset + size; 17905 var dictData = this.bytes.subarray(offset, privateDictEnd); 17906 var dict = this.parseDict(dictData); 17907 var privateDict = this.createDict(CFFPrivateDict, dict, 17908 parentDict.strings); 17909 parentDict.privateDict = privateDict; 17910 17911 // Parse the Subrs index also since it's relative to the private dict. 17912 if (!privateDict.getByName('Subrs')) 17913 return; 17914 var subrsOffset = privateDict.getByName('Subrs'); 17915 var relativeOffset = offset + subrsOffset; 17916 // Validate the offset. 17917 if (subrsOffset === 0 || relativeOffset >= this.bytes.length) { 17918 privateDict.removeByName('Subrs'); 17919 return; 17920 } 17921 var subrsIndex = this.parseIndex(relativeOffset); 17922 privateDict.subrsIndex = subrsIndex.obj; 17923 }, 17924 parseCharsets: function CFFParser_parseCharsets(pos, length, strings, cid) { 17925 if (pos == 0) { 17926 return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE, 17927 ISOAdobeCharset); 17928 } else if (pos == 1) { 17929 return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT, 17930 ExpertCharset); 17931 } else if (pos == 2) { 17932 return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET, 17933 ExpertSubsetCharset); 17934 } 17935 17936 var bytes = this.bytes; 17937 var start = pos; 17938 var format = bytes[pos++]; 17939 var charset = ['.notdef']; 17940 17941 // subtract 1 for the .notdef glyph 17942 length -= 1; 17943 17944 switch (format) { 17945 case 0: 17946 for (var i = 0; i < length; i++) { 17947 var id = (bytes[pos++] << 8) | bytes[pos++]; 17948 charset.push(cid ? id : strings.get(id)); 17949 } 17950 break; 17951 case 1: 17952 while (charset.length <= length) { 17953 var id = (bytes[pos++] << 8) | bytes[pos++]; 17954 var count = bytes[pos++]; 17955 for (var i = 0; i <= count; i++) 17956 charset.push(cid ? id++ : strings.get(id++)); 17957 } 17958 break; 17959 case 2: 17960 while (charset.length <= length) { 17961 var id = (bytes[pos++] << 8) | bytes[pos++]; 17962 var count = (bytes[pos++] << 8) | bytes[pos++]; 17963 for (var i = 0; i <= count; i++) 17964 charset.push(cid ? id++ : strings.get(id++)); 17965 } 17966 break; 17967 default: 17968 error('Unknown charset format'); 17969 } 17970 // Raw won't be needed if we actually compile the charset. 17971 var end = pos; 17972 var raw = bytes.subarray(start, end); 17973 17974 return new CFFCharset(false, format, charset, raw); 17975 }, 17976 parseEncoding: function CFFParser_parseEncoding(pos, 17977 properties, 17978 strings, 17979 charset) { 17980 var encoding = {}; 17981 var bytes = this.bytes; 17982 var predefined = false; 17983 var hasSupplement = false; 17984 var format; 17985 var raw = null; 17986 17987 function readSupplement() { 17988 var supplementsCount = bytes[pos++]; 17989 for (var i = 0; i < supplementsCount; i++) { 17990 var code = bytes[pos++]; 17991 var sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff); 17992 encoding[code] = properties.differences.indexOf(strings.get(sid)); 17993 } 17994 } 17995 17996 if (pos == 0 || pos == 1) { 17997 predefined = true; 17998 format = pos; 17999 var gid = 1; 18000 var baseEncoding = pos ? Encodings.ExpertEncoding : 18001 Encodings.StandardEncoding; 18002 for (var i = 0, ii = charset.length; i < ii; i++) { 18003 var index = baseEncoding.indexOf(charset[i]); 18004 if (index != -1) 18005 encoding[index] = gid++; 18006 } 18007 } else { 18008 var dataStart = pos; 18009 var format = bytes[pos++]; 18010 switch (format & 0x7f) { 18011 case 0: 18012 var glyphsCount = bytes[pos++]; 18013 for (var i = 1; i <= glyphsCount; i++) 18014 encoding[bytes[pos++]] = i; 18015 break; 18016 18017 case 1: 18018 var rangesCount = bytes[pos++]; 18019 var gid = 1; 18020 for (var i = 0; i < rangesCount; i++) { 18021 var start = bytes[pos++]; 18022 var left = bytes[pos++]; 18023 for (var j = start; j <= start + left; j++) 18024 encoding[j] = gid++; 18025 } 18026 break; 18027 18028 default: 18029 error('Unknow encoding format: ' + format + ' in CFF'); 18030 break; 18031 } 18032 var dataEnd = pos; 18033 if (format & 0x80) { 18034 // The font sanitizer does not support CFF encoding with a 18035 // supplement, since the encoding is not really used to map 18036 // between gid to glyph, let's overwrite what is declared in 18037 // the top dictionary to let the sanitizer think the font use 18038 // StandardEncoding, that's a lie but that's ok. 18039 bytes[dataStart] &= 0x7f; 18040 readSupplement(); 18041 hasSupplement = true; 18042 } 18043 raw = bytes.subarray(dataStart, dataEnd); 18044 } 18045 format = format & 0x7f; 18046 return new CFFEncoding(predefined, format, encoding, raw); 18047 }, 18048 parseFDSelect: function CFFParser_parseFDSelect(pos, length) { 18049 var start = pos; 18050 var bytes = this.bytes; 18051 var format = bytes[pos++]; 18052 var fdSelect = []; 18053 switch (format) { 18054 case 0: 18055 for (var i = 0; i < length; ++i) { 18056 var id = bytes[pos++]; 18057 fdSelect.push(id); 18058 } 18059 break; 18060 case 3: 18061 var rangesCount = (bytes[pos++] << 8) | bytes[pos++]; 18062 for (var i = 0; i < rangesCount; ++i) { 18063 var first = (bytes[pos++] << 8) | bytes[pos++]; 18064 var fdIndex = bytes[pos++]; 18065 var next = (bytes[pos] << 8) | bytes[pos + 1]; 18066 for (var j = first; j < next; ++j) 18067 fdSelect.push(fdIndex); 18068 } 18069 // Advance past the sentinel(next). 18070 pos += 2; 18071 break; 18072 default: 18073 error('Unknown fdselect format ' + format); 18074 break; 18075 } 18076 var end = pos; 18077 return new CFFFDSelect(fdSelect, bytes.subarray(start, end)); 18078 } 18079 }; 18080 return CFFParser; 18081 })(); 18082 18083 // Compact Font Format 18084 var CFF = (function CFFClosure() { 18085 function CFF() { 18086 this.header = null; 18087 this.names = []; 18088 this.topDict = null; 18089 this.strings = new CFFStrings(); 18090 this.globalSubrIndex = null; 18091 18092 // The following could really be per font, but since we only have one font 18093 // store them here. 18094 this.encoding = null; 18095 this.charset = null; 18096 this.charStrings = null; 18097 this.fdArray = []; 18098 this.fdSelect = null; 18099 18100 this.isCIDFont = false; 18101 } 18102 return CFF; 18103 })(); 18104 18105 var CFFHeader = (function CFFHeaderClosure() { 18106 function CFFHeader(major, minor, hdrSize, offSize) { 18107 this.major = major; 18108 this.minor = minor; 18109 this.hdrSize = hdrSize; 18110 this.offSize = offSize; 18111 } 18112 return CFFHeader; 18113 })(); 18114 18115 var CFFStrings = (function CFFStringsClosure() { 18116 function CFFStrings() { 18117 this.strings = []; 18118 } 18119 CFFStrings.prototype = { 18120 get: function CFFStrings_get(index) { 18121 if (index >= 0 && index <= 390) 18122 return CFFStandardStrings[index]; 18123 if (index - 391 <= this.strings.length) 18124 return this.strings[index - 391]; 18125 return CFFStandardStrings[0]; 18126 }, 18127 add: function CFFStrings_add(value) { 18128 this.strings.push(value); 18129 }, 18130 get count() { 18131 return this.strings.length; 18132 } 18133 }; 18134 return CFFStrings; 18135 })(); 18136 18137 var CFFIndex = (function CFFIndexClosure() { 18138 function CFFIndex() { 18139 this.objects = []; 18140 this.length = 0; 18141 } 18142 CFFIndex.prototype = { 18143 add: function CFFIndex_add(data) { 18144 this.length += data.length; 18145 this.objects.push(data); 18146 }, 18147 get: function CFFIndex_get(index) { 18148 return this.objects[index]; 18149 }, 18150 get count() { 18151 return this.objects.length; 18152 } 18153 }; 18154 return CFFIndex; 18155 })(); 18156 18157 var CFFDict = (function CFFDictClosure() { 18158 function CFFDict(tables, strings) { 18159 this.keyToNameMap = tables.keyToNameMap; 18160 this.nameToKeyMap = tables.nameToKeyMap; 18161 this.defaults = tables.defaults; 18162 this.types = tables.types; 18163 this.opcodes = tables.opcodes; 18164 this.order = tables.order; 18165 this.strings = strings; 18166 this.values = {}; 18167 } 18168 CFFDict.prototype = { 18169 // value should always be an array 18170 setByKey: function CFFDict_setByKey(key, value) { 18171 if (!(key in this.keyToNameMap)) 18172 return false; 18173 // ignore empty values 18174 if (value.length === 0) 18175 return true; 18176 var type = this.types[key]; 18177 // remove the array wrapping these types of values 18178 if (type === 'num' || type === 'sid' || type === 'offset') 18179 value = value[0]; 18180 this.values[key] = value; 18181 return true; 18182 }, 18183 hasName: function CFFDict_hasName(name) { 18184 return this.nameToKeyMap[name] in this.values; 18185 }, 18186 getByName: function CFFDict_getByName(name) { 18187 if (!(name in this.nameToKeyMap)) 18188 error('Invalid dictionary name "' + name + '"'); 18189 var key = this.nameToKeyMap[name]; 18190 if (!(key in this.values)) 18191 return this.defaults[key]; 18192 return this.values[key]; 18193 }, 18194 removeByName: function CFFDict_removeByName(name) { 18195 delete this.values[this.nameToKeyMap[name]]; 18196 } 18197 }; 18198 CFFDict.createTables = function CFFDict_createTables(layout) { 18199 var tables = { 18200 keyToNameMap: {}, 18201 nameToKeyMap: {}, 18202 defaults: {}, 18203 types: {}, 18204 opcodes: {}, 18205 order: [] 18206 }; 18207 for (var i = 0, ii = layout.length; i < ii; ++i) { 18208 var entry = layout[i]; 18209 var key = isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0]; 18210 tables.keyToNameMap[key] = entry[1]; 18211 tables.nameToKeyMap[entry[1]] = key; 18212 tables.types[key] = entry[2]; 18213 tables.defaults[key] = entry[3]; 18214 tables.opcodes[key] = isArray(entry[0]) ? entry[0] : [entry[0]]; 18215 tables.order.push(key); 18216 } 18217 return tables; 18218 }; 18219 return CFFDict; 18220 })(); 18221 18222 var CFFTopDict = (function CFFTopDictClosure() { 18223 var layout = [ 18224 [[12, 30], 'ROS', ['sid', 'sid', 'num'], null], 18225 [[12, 20], 'SyntheticBase', 'num', null], 18226 [0, 'version', 'sid', null], 18227 [1, 'Notice', 'sid', null], 18228 [[12, 0], 'Copyright', 'sid', null], 18229 [2, 'FullName', 'sid', null], 18230 [3, 'FamilyName', 'sid', null], 18231 [4, 'Weight', 'sid', null], 18232 [[12, 1], 'isFixedPitch', 'num', 0], 18233 [[12, 2], 'ItalicAngle', 'num', 0], 18234 [[12, 3], 'UnderlinePosition', 'num', -100], 18235 [[12, 4], 'UnderlineThickness', 'num', 50], 18236 [[12, 5], 'PaintType', 'num', 0], 18237 [[12, 6], 'CharstringType', 'num', 2], 18238 [[12, 7], 'FontMatrix', ['num', 'num', 'num', 'num', 'num', 'num'], 18239 [.001, 0, 0, .001, 0, 0]], 18240 [13, 'UniqueID', 'num', null], 18241 [5, 'FontBBox', ['num', 'num', 'num', 'num'], [0, 0, 0, 0]], 18242 [[12, 8], 'StrokeWidth', 'num', 0], 18243 [14, 'XUID', 'array', null], 18244 [15, 'charset', 'offset', 0], 18245 [16, 'Encoding', 'offset', 0], 18246 [17, 'CharStrings', 'offset', 0], 18247 [18, 'Private', ['offset', 'offset'], null], 18248 [[12, 21], 'PostScript', 'sid', null], 18249 [[12, 22], 'BaseFontName', 'sid', null], 18250 [[12, 23], 'BaseFontBlend', 'delta', null], 18251 [[12, 31], 'CIDFontVersion', 'num', 0], 18252 [[12, 32], 'CIDFontRevision', 'num', 0], 18253 [[12, 33], 'CIDFontType', 'num', 0], 18254 [[12, 34], 'CIDCount', 'num', 8720], 18255 [[12, 35], 'UIDBase', 'num', null], 18256 [[12, 36], 'FDArray', 'offset', null], 18257 [[12, 37], 'FDSelect', 'offset', null], 18258 [[12, 38], 'FontName', 'sid', null]]; 18259 var tables = null; 18260 function CFFTopDict(strings) { 18261 if (tables === null) 18262 tables = CFFDict.createTables(layout); 18263 CFFDict.call(this, tables, strings); 18264 this.privateDict = null; 18265 } 18266 CFFTopDict.prototype = Object.create(CFFDict.prototype); 18267 return CFFTopDict; 18268 })(); 18269 18270 var CFFPrivateDict = (function CFFPrivateDictClosure() { 18271 var layout = [ 18272 [6, 'BlueValues', 'delta', null], 18273 [7, 'OtherBlues', 'delta', null], 18274 [8, 'FamilyBlues', 'delta', null], 18275 [9, 'FamilyOtherBlues', 'delta', null], 18276 [[12, 9], 'BlueScale', 'num', 0.039625], 18277 [[12, 10], 'BlueShift', 'num', 7], 18278 [[12, 11], 'BlueFuzz', 'num', 1], 18279 [10, 'StdHW', 'num', null], 18280 [11, 'StdVW', 'num', null], 18281 [[12, 12], 'StemSnapH', 'delta', null], 18282 [[12, 13], 'StemSnapV', 'delta', null], 18283 [[12, 14], 'ForceBold', 'num', 0], 18284 [[12, 17], 'LanguageGroup', 'num', 0], 18285 [[12, 18], 'ExpansionFactor', 'num', 0.06], 18286 [[12, 19], 'initialRandomSeed', 'num', 0], 18287 [19, 'Subrs', 'offset', null], 18288 [20, 'defaultWidthX', 'num', 0], 18289 [21, 'nominalWidthX', 'num', 0] 18290 ]; 18291 var tables = null; 18292 function CFFPrivateDict(strings) { 18293 if (tables === null) 18294 tables = CFFDict.createTables(layout); 18295 CFFDict.call(this, tables, strings); 18296 this.subrsIndex = null; 18297 } 18298 CFFPrivateDict.prototype = Object.create(CFFDict.prototype); 18299 return CFFPrivateDict; 18300 })(); 18301 18302 var CFFCharsetPredefinedTypes = { 18303 ISO_ADOBE: 0, 18304 EXPERT: 1, 18305 EXPERT_SUBSET: 2 18306 }; 18307 var CFFCharsetEmbeddedTypes = { 18308 FORMAT0: 0, 18309 FORMAT1: 1, 18310 FORMAT2: 2 18311 }; 18312 var CFFCharset = (function CFFCharsetClosure() { 18313 function CFFCharset(predefined, format, charset, raw) { 18314 this.predefined = predefined; 18315 this.format = format; 18316 this.charset = charset; 18317 this.raw = raw; 18318 } 18319 return CFFCharset; 18320 })(); 18321 18322 var CFFEncodingPredefinedTypes = { 18323 STANDARD: 0, 18324 EXPERT: 1 18325 }; 18326 var CFFCharsetEmbeddedTypes = { 18327 FORMAT0: 0, 18328 FORMAT1: 1 18329 }; 18330 var CFFEncoding = (function CFFEncodingClosure() { 18331 function CFFEncoding(predefined, format, encoding, raw) { 18332 this.predefined = predefined; 18333 this.format = format; 18334 this.encoding = encoding; 18335 this.raw = raw; 18336 } 18337 return CFFEncoding; 18338 })(); 18339 18340 var CFFFDSelect = (function CFFFDSelectClosure() { 18341 function CFFFDSelect(fdSelect, raw) { 18342 this.fdSelect = fdSelect; 18343 this.raw = raw; 18344 } 18345 return CFFFDSelect; 18346 })(); 18347 18348 // Helper class to keep track of where an offset is within the data and helps 18349 // filling in that offset once it's known. 18350 var CFFOffsetTracker = (function CFFOffsetTrackerClosure() { 18351 function CFFOffsetTracker() { 18352 this.offsets = {}; 18353 } 18354 CFFOffsetTracker.prototype = { 18355 isTracking: function CFFOffsetTracker_isTracking(key) { 18356 return key in this.offsets; 18357 }, 18358 track: function CFFOffsetTracker_track(key, location) { 18359 if (key in this.offsets) 18360 error('Already tracking location of ' + key); 18361 this.offsets[key] = location; 18362 }, 18363 offset: function CFFOffsetTracker_offset(value) { 18364 for (var key in this.offsets) { 18365 this.offsets[key] += value; 18366 } 18367 }, 18368 setEntryLocation: function CFFOffsetTracker_setEntryLocation(key, 18369 values, 18370 output) { 18371 if (!(key in this.offsets)) 18372 error('Not tracking location of ' + key); 18373 var data = output.data; 18374 var dataOffset = this.offsets[key]; 18375 var size = 5; 18376 for (var i = 0, ii = values.length; i < ii; ++i) { 18377 var offset0 = i * size + dataOffset; 18378 var offset1 = offset0 + 1; 18379 var offset2 = offset0 + 2; 18380 var offset3 = offset0 + 3; 18381 var offset4 = offset0 + 4; 18382 // It's easy to screw up offsets so perform this sanity check. 18383 if (data[offset0] !== 0x1d || data[offset1] !== 0 || 18384 data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) 18385 error('writing to an offset that is not empty'); 18386 var value = values[i]; 18387 data[offset0] = 0x1d; 18388 data[offset1] = (value >> 24) & 0xFF; 18389 data[offset2] = (value >> 16) & 0xFF; 18390 data[offset3] = (value >> 8) & 0xFF; 18391 data[offset4] = value & 0xFF; 18392 } 18393 } 18394 }; 18395 return CFFOffsetTracker; 18396 })(); 18397 18398 // Takes a CFF and converts it to the binary representation. 18399 var CFFCompiler = (function CFFCompilerClosure() { 18400 function stringToArray(str) { 18401 var array = []; 18402 for (var i = 0, ii = str.length; i < ii; ++i) 18403 array[i] = str.charCodeAt(i); 18404 18405 return array; 18406 }; 18407 function CFFCompiler(cff) { 18408 this.cff = cff; 18409 } 18410 CFFCompiler.prototype = { 18411 compile: function CFFCompiler_compile() { 18412 var cff = this.cff; 18413 var output = { 18414 data: [], 18415 length: 0, 18416 add: function CFFCompiler_add(data) { 18417 this.data = this.data.concat(data); 18418 this.length = this.data.length; 18419 } 18420 }; 18421 18422 // Compile the five entries that must be in order. 18423 var header = this.compileHeader(cff.header); 18424 output.add(header); 18425 18426 var nameIndex = this.compileNameIndex(cff.names); 18427 output.add(nameIndex); 18428 18429 var compiled = this.compileTopDicts([cff.topDict], output.length); 18430 output.add(compiled.output); 18431 var topDictTracker = compiled.trackers[0]; 18432 18433 var stringIndex = this.compileStringIndex(cff.strings.strings); 18434 output.add(stringIndex); 18435 18436 var globalSubrIndex = this.compileIndex(cff.globalSubrIndex); 18437 output.add(globalSubrIndex); 18438 18439 // Now start on the other entries that have no specfic order. 18440 if (cff.encoding && cff.topDict.hasName('Encoding')) { 18441 if (cff.encoding.predefined) { 18442 topDictTracker.setEntryLocation('Encoding', [cff.encoding.format], 18443 output); 18444 } else { 18445 var encoding = this.compileEncoding(cff.encoding); 18446 topDictTracker.setEntryLocation('Encoding', [output.length], output); 18447 output.add(encoding); 18448 } 18449 } 18450 18451 if (cff.charset && cff.topDict.hasName('charset')) { 18452 if (cff.charset.predefined) { 18453 topDictTracker.setEntryLocation('charset', [cff.charset.format], 18454 output); 18455 } else { 18456 var charset = this.compileCharset(cff.charset); 18457 topDictTracker.setEntryLocation('charset', [output.length], output); 18458 output.add(charset); 18459 } 18460 } 18461 18462 var charStrings = this.compileCharStrings(cff.charStrings); 18463 topDictTracker.setEntryLocation('CharStrings', [output.length], output); 18464 output.add(charStrings); 18465 18466 if (cff.isCIDFont) { 18467 // For some reason FDSelect must be in front of FDArray on windows. OSX 18468 // and linux don't seem to care. 18469 topDictTracker.setEntryLocation('FDSelect', [output.length], output); 18470 var fdSelect = this.compileFDSelect(cff.fdSelect.raw); 18471 output.add(fdSelect); 18472 18473 var compiled = this.compileTopDicts(cff.fdArray, output.length); 18474 topDictTracker.setEntryLocation('FDArray', [output.length], output); 18475 output.add(compiled.output); 18476 var fontDictTrackers = compiled.trackers; 18477 18478 this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output); 18479 } 18480 18481 this.compilePrivateDicts([cff.topDict], [topDictTracker], output); 18482 18483 return output.data; 18484 }, 18485 encodeNumber: function CFFCompiler_encodeNumber(value) { 18486 if (parseFloat(value) == parseInt(value) && !isNaN(value)) // isInt 18487 return this.encodeInteger(value); 18488 else 18489 return this.encodeFloat(value); 18490 }, 18491 encodeFloat: function CFFCompiler_encodeFloat(value) { 18492 value = value.toString(); 18493 // Strip off the any leading zeros. 18494 if (value.substr(0, 2) === '0.') 18495 value = value.substr(1); 18496 else if (value.substr(0, 3) === '-0.') 18497 value = '-' + value.substr(2); 18498 var nibbles = []; 18499 for (var i = 0, ii = value.length; i < ii; ++i) { 18500 var a = value.charAt(i), b = value.charAt(i + 1); 18501 var nibble; 18502 if (a === 'e' && b === '-') { 18503 nibble = 0xc; 18504 ++i; 18505 } else if (a === '.') { 18506 nibble = 0xa; 18507 } else if (a === 'E') { 18508 nibble = 0xb; 18509 } else if (a === '-') { 18510 nibble = 0xe; 18511 } else { 18512 nibble = a; 18513 } 18514 nibbles.push(nibble); 18515 } 18516 nibbles.push(0xf); 18517 if (nibbles.length % 2) 18518 nibbles.push(0xf); 18519 var out = [30]; 18520 for (var i = 0, ii = nibbles.length; i < ii; i += 2) 18521 out.push(nibbles[i] << 4 | nibbles[i + 1]); 18522 return out; 18523 }, 18524 encodeInteger: function CFFCompiler_encodeInteger(value) { 18525 var code; 18526 if (value >= -107 && value <= 107) { 18527 code = [value + 139]; 18528 } else if (value >= 108 && value <= 1131) { 18529 value = [value - 108]; 18530 code = [(value >> 8) + 247, value & 0xFF]; 18531 } else if (value >= -1131 && value <= -108) { 18532 value = -value - 108; 18533 code = [(value >> 8) + 251, value & 0xFF]; 18534 } else if (value >= -32768 && value <= 32767) { 18535 code = [0x1c, (value >> 8) & 0xFF, value & 0xFF]; 18536 } else { 18537 code = [0x1d, 18538 (value >> 24) & 0xFF, 18539 (value >> 16) & 0xFF, 18540 (value >> 8) & 0xFF, 18541 value & 0xFF]; 18542 } 18543 return code; 18544 }, 18545 compileHeader: function CFFCompiler_compileHeader(header) { 18546 return [ 18547 header.major, 18548 header.minor, 18549 header.hdrSize, 18550 header.offSize 18551 ]; 18552 }, 18553 compileNameIndex: function CFFCompiler_compileNameIndex(names) { 18554 var nameIndex = new CFFIndex(); 18555 for (var i = 0, ii = names.length; i < ii; ++i) 18556 nameIndex.add(stringToArray(names[i])); 18557 return this.compileIndex(nameIndex); 18558 }, 18559 compileTopDicts: function CFFCompiler_compileTopDicts(dicts, length) { 18560 var fontDictTrackers = []; 18561 var fdArrayIndex = new CFFIndex(); 18562 for (var i = 0, ii = dicts.length; i < ii; ++i) { 18563 var fontDict = dicts[i]; 18564 var fontDictTracker = new CFFOffsetTracker(); 18565 var fontDictData = this.compileDict(fontDict, fontDictTracker); 18566 fontDictTrackers.push(fontDictTracker); 18567 fdArrayIndex.add(fontDictData); 18568 fontDictTracker.offset(length); 18569 } 18570 fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers); 18571 return { 18572 trackers: fontDictTrackers, 18573 output: fdArrayIndex 18574 }; 18575 }, 18576 compilePrivateDicts: function CFFCompiler_compilePrivateDicts(dicts, 18577 trackers, 18578 output) { 18579 for (var i = 0, ii = dicts.length; i < ii; ++i) { 18580 var fontDict = dicts[i]; 18581 if (!fontDict.privateDict || !fontDict.hasName('Private')) 18582 continue; 18583 var privateDict = fontDict.privateDict; 18584 var privateDictTracker = new CFFOffsetTracker(); 18585 var privateDictData = this.compileDict(privateDict, privateDictTracker); 18586 18587 privateDictTracker.offset(output.length); 18588 trackers[i].setEntryLocation('Private', 18589 [privateDictData.length, output.length], 18590 output); 18591 output.add(privateDictData); 18592 18593 if (privateDict.subrsIndex && privateDict.hasName('Subrs')) { 18594 var subrs = this.compileIndex(privateDict.subrsIndex); 18595 privateDictTracker.setEntryLocation('Subrs', [privateDictData.length], 18596 output); 18597 output.add(subrs); 18598 } 18599 } 18600 }, 18601 compileDict: function CFFCompiler_compileDict(dict, offsetTracker) { 18602 var out = []; 18603 // The dictionary keys must be in a certain order. 18604 var order = dict.order; 18605 for (var i = 0; i < order.length; ++i) { 18606 var key = order[i]; 18607 if (!(key in dict.values)) 18608 continue; 18609 var values = dict.values[key]; 18610 var types = dict.types[key]; 18611 if (!isArray(types)) types = [types]; 18612 if (!isArray(values)) values = [values]; 18613 18614 // Remove any empty dict values. 18615 if (values.length === 0) 18616 continue; 18617 18618 for (var j = 0, jj = types.length; j < jj; ++j) { 18619 var type = types[j]; 18620 var value = values[j]; 18621 switch (type) { 18622 case 'num': 18623 case 'sid': 18624 out = out.concat(this.encodeNumber(value)); 18625 break; 18626 case 'offset': 18627 // For offsets we just insert a 32bit integer so we don't have to 18628 // deal with figuring out the length of the offset when it gets 18629 // replaced later on by the compiler. 18630 var name = dict.keyToNameMap[key]; 18631 // Some offsets have the offset and the length, so just record the 18632 // position of the first one. 18633 if (!offsetTracker.isTracking(name)) 18634 offsetTracker.track(name, out.length); 18635 out = out.concat([0x1d, 0, 0, 0, 0]); 18636 break; 18637 case 'array': 18638 case 'delta': 18639 out = out.concat(this.encodeNumber(value)); 18640 for (var k = 1, kk = values.length; k < kk; ++k) 18641 out = out.concat(this.encodeNumber(values[k])); 18642 break; 18643 default: 18644 error('Unknown data type of ' + type); 18645 break; 18646 } 18647 } 18648 out = out.concat(dict.opcodes[key]); 18649 } 18650 return out; 18651 }, 18652 compileStringIndex: function CFFCompiler_compileStringIndex(strings) { 18653 var stringIndex = new CFFIndex(); 18654 for (var i = 0, ii = strings.length; i < ii; ++i) 18655 stringIndex.add(stringToArray(strings[i])); 18656 return this.compileIndex(stringIndex); 18657 }, 18658 compileGlobalSubrIndex: function CFFCompiler_compileGlobalSubrIndex() { 18659 var globalSubrIndex = this.cff.globalSubrIndex; 18660 this.out.writeByteArray(this.compileIndex(globalSubrIndex)); 18661 }, 18662 compileCharStrings: function CFFCompiler_compileCharStrings(charStrings) { 18663 return this.compileIndex(charStrings); 18664 }, 18665 compileCharset: function CFFCompiler_compileCharset(charset) { 18666 return this.compileTypedArray(charset.raw); 18667 }, 18668 compileEncoding: function CFFCompiler_compileEncoding(encoding) { 18669 return this.compileTypedArray(encoding.raw); 18670 }, 18671 compileFDSelect: function CFFCompiler_compileFDSelect(fdSelect) { 18672 return this.compileTypedArray(fdSelect); 18673 }, 18674 compileTypedArray: function CFFCompiler_compileTypedArray(data) { 18675 var out = []; 18676 for (var i = 0, ii = data.length; i < ii; ++i) 18677 out[i] = data[i]; 18678 return out; 18679 }, 18680 compileIndex: function CFFCompiler_compileIndex(index, trackers) { 18681 trackers = trackers || []; 18682 var objects = index.objects; 18683 // First 2 bytes contains the number of objects contained into this index 18684 var count = objects.length; 18685 18686 // If there is no object, just create an index. This technically 18687 // should just be [0, 0] but OTS has an issue with that. 18688 if (count == 0) 18689 return [0, 0, 0]; 18690 18691 var data = [(count >> 8) & 0xFF, count & 0xff]; 18692 18693 var lastOffset = 1; 18694 for (var i = 0; i < count; ++i) 18695 lastOffset += objects[i].length; 18696 18697 var offsetSize; 18698 if (lastOffset < 0x100) 18699 offsetSize = 1; 18700 else if (lastOffset < 0x10000) 18701 offsetSize = 2; 18702 else if (lastOffset < 0x1000000) 18703 offsetSize = 3; 18704 else 18705 offsetSize = 4; 18706 18707 // Next byte contains the offset size use to reference object in the file 18708 data.push(offsetSize); 18709 18710 // Add another offset after this one because we need a new offset 18711 var relativeOffset = 1; 18712 for (var i = 0; i < count + 1; i++) { 18713 if (offsetSize === 1) { 18714 data.push(relativeOffset & 0xFF); 18715 } else if (offsetSize === 2) { 18716 data.push((relativeOffset >> 8) & 0xFF, 18717 relativeOffset & 0xFF); 18718 } else if (offsetSize === 3) { 18719 data.push((relativeOffset >> 16) & 0xFF, 18720 (relativeOffset >> 8) & 0xFF, 18721 relativeOffset & 0xFF); 18722 } else { 18723 data.push((relativeOffset >>> 24) & 0xFF, 18724 (relativeOffset >> 16) & 0xFF, 18725 (relativeOffset >> 8) & 0xFF, 18726 relativeOffset & 0xFF); 18727 } 18728 18729 if (objects[i]) 18730 relativeOffset += objects[i].length; 18731 } 18732 var offset = data.length; 18733 18734 for (var i = 0; i < count; i++) { 18735 // Notify the tracker where the object will be offset in the data. 18736 if (trackers[i]) 18737 trackers[i].offset(data.length); 18738 for (var j = 0, jj = objects[i].length; j < jj; j++) 18739 data.push(objects[i][j]); 18740 } 18741 return data; 18742 } 18743 }; 18744 return CFFCompiler; 18745 })(); 18746 18747 18748 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 18749 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ 18750 18751 'use strict'; 18752 18753 var GlyphsUnicode = { 18754 A: 0x0041, 18755 AE: 0x00C6, 18756 AEacute: 0x01FC, 18757 AEmacron: 0x01E2, 18758 AEsmall: 0xF7E6, 18759 Aacute: 0x00C1, 18760 Aacutesmall: 0xF7E1, 18761 Abreve: 0x0102, 18762 Abreveacute: 0x1EAE, 18763 Abrevecyrillic: 0x04D0, 18764 Abrevedotbelow: 0x1EB6, 18765 Abrevegrave: 0x1EB0, 18766 Abrevehookabove: 0x1EB2, 18767 Abrevetilde: 0x1EB4, 18768 Acaron: 0x01CD, 18769 Acircle: 0x24B6, 18770 Acircumflex: 0x00C2, 18771 Acircumflexacute: 0x1EA4, 18772 Acircumflexdotbelow: 0x1EAC, 18773 Acircumflexgrave: 0x1EA6, 18774 Acircumflexhookabove: 0x1EA8, 18775 Acircumflexsmall: 0xF7E2, 18776 Acircumflextilde: 0x1EAA, 18777 Acute: 0xF6C9, 18778 Acutesmall: 0xF7B4, 18779 Acyrillic: 0x0410, 18780 Adblgrave: 0x0200, 18781 Adieresis: 0x00C4, 18782 Adieresiscyrillic: 0x04D2, 18783 Adieresismacron: 0x01DE, 18784 Adieresissmall: 0xF7E4, 18785 Adotbelow: 0x1EA0, 18786 Adotmacron: 0x01E0, 18787 Agrave: 0x00C0, 18788 Agravesmall: 0xF7E0, 18789 Ahookabove: 0x1EA2, 18790 Aiecyrillic: 0x04D4, 18791 Ainvertedbreve: 0x0202, 18792 Alpha: 0x0391, 18793 Alphatonos: 0x0386, 18794 Amacron: 0x0100, 18795 Amonospace: 0xFF21, 18796 Aogonek: 0x0104, 18797 Aring: 0x00C5, 18798 Aringacute: 0x01FA, 18799 Aringbelow: 0x1E00, 18800 Aringsmall: 0xF7E5, 18801 Asmall: 0xF761, 18802 Atilde: 0x00C3, 18803 Atildesmall: 0xF7E3, 18804 Aybarmenian: 0x0531, 18805 B: 0x0042, 18806 Bcircle: 0x24B7, 18807 Bdotaccent: 0x1E02, 18808 Bdotbelow: 0x1E04, 18809 Becyrillic: 0x0411, 18810 Benarmenian: 0x0532, 18811 Beta: 0x0392, 18812 Bhook: 0x0181, 18813 Blinebelow: 0x1E06, 18814 Bmonospace: 0xFF22, 18815 Brevesmall: 0xF6F4, 18816 Bsmall: 0xF762, 18817 Btopbar: 0x0182, 18818 C: 0x0043, 18819 Caarmenian: 0x053E, 18820 Cacute: 0x0106, 18821 Caron: 0xF6CA, 18822 Caronsmall: 0xF6F5, 18823 Ccaron: 0x010C, 18824 Ccedilla: 0x00C7, 18825 Ccedillaacute: 0x1E08, 18826 Ccedillasmall: 0xF7E7, 18827 Ccircle: 0x24B8, 18828 Ccircumflex: 0x0108, 18829 Cdot: 0x010A, 18830 Cdotaccent: 0x010A, 18831 Cedillasmall: 0xF7B8, 18832 Chaarmenian: 0x0549, 18833 Cheabkhasiancyrillic: 0x04BC, 18834 Checyrillic: 0x0427, 18835 Chedescenderabkhasiancyrillic: 0x04BE, 18836 Chedescendercyrillic: 0x04B6, 18837 Chedieresiscyrillic: 0x04F4, 18838 Cheharmenian: 0x0543, 18839 Chekhakassiancyrillic: 0x04CB, 18840 Cheverticalstrokecyrillic: 0x04B8, 18841 Chi: 0x03A7, 18842 Chook: 0x0187, 18843 Circumflexsmall: 0xF6F6, 18844 Cmonospace: 0xFF23, 18845 Coarmenian: 0x0551, 18846 Csmall: 0xF763, 18847 D: 0x0044, 18848 DZ: 0x01F1, 18849 DZcaron: 0x01C4, 18850 Daarmenian: 0x0534, 18851 Dafrican: 0x0189, 18852 Dcaron: 0x010E, 18853 Dcedilla: 0x1E10, 18854 Dcircle: 0x24B9, 18855 Dcircumflexbelow: 0x1E12, 18856 Dcroat: 0x0110, 18857 Ddotaccent: 0x1E0A, 18858 Ddotbelow: 0x1E0C, 18859 Decyrillic: 0x0414, 18860 Deicoptic: 0x03EE, 18861 Delta: 0x2206, 18862 Deltagreek: 0x0394, 18863 Dhook: 0x018A, 18864 Dieresis: 0xF6CB, 18865 DieresisAcute: 0xF6CC, 18866 DieresisGrave: 0xF6CD, 18867 Dieresissmall: 0xF7A8, 18868 Digammagreek: 0x03DC, 18869 Djecyrillic: 0x0402, 18870 Dlinebelow: 0x1E0E, 18871 Dmonospace: 0xFF24, 18872 Dotaccentsmall: 0xF6F7, 18873 Dslash: 0x0110, 18874 Dsmall: 0xF764, 18875 Dtopbar: 0x018B, 18876 Dz: 0x01F2, 18877 Dzcaron: 0x01C5, 18878 Dzeabkhasiancyrillic: 0x04E0, 18879 Dzecyrillic: 0x0405, 18880 Dzhecyrillic: 0x040F, 18881 E: 0x0045, 18882 Eacute: 0x00C9, 18883 Eacutesmall: 0xF7E9, 18884 Ebreve: 0x0114, 18885 Ecaron: 0x011A, 18886 Ecedillabreve: 0x1E1C, 18887 Echarmenian: 0x0535, 18888 Ecircle: 0x24BA, 18889 Ecircumflex: 0x00CA, 18890 Ecircumflexacute: 0x1EBE, 18891 Ecircumflexbelow: 0x1E18, 18892 Ecircumflexdotbelow: 0x1EC6, 18893 Ecircumflexgrave: 0x1EC0, 18894 Ecircumflexhookabove: 0x1EC2, 18895 Ecircumflexsmall: 0xF7EA, 18896 Ecircumflextilde: 0x1EC4, 18897 Ecyrillic: 0x0404, 18898 Edblgrave: 0x0204, 18899 Edieresis: 0x00CB, 18900 Edieresissmall: 0xF7EB, 18901 Edot: 0x0116, 18902 Edotaccent: 0x0116, 18903 Edotbelow: 0x1EB8, 18904 Efcyrillic: 0x0424, 18905 Egrave: 0x00C8, 18906 Egravesmall: 0xF7E8, 18907 Eharmenian: 0x0537, 18908 Ehookabove: 0x1EBA, 18909 Eightroman: 0x2167, 18910 Einvertedbreve: 0x0206, 18911 Eiotifiedcyrillic: 0x0464, 18912 Elcyrillic: 0x041B, 18913 Elevenroman: 0x216A, 18914 Emacron: 0x0112, 18915 Emacronacute: 0x1E16, 18916 Emacrongrave: 0x1E14, 18917 Emcyrillic: 0x041C, 18918 Emonospace: 0xFF25, 18919 Encyrillic: 0x041D, 18920 Endescendercyrillic: 0x04A2, 18921 Eng: 0x014A, 18922 Enghecyrillic: 0x04A4, 18923 Enhookcyrillic: 0x04C7, 18924 Eogonek: 0x0118, 18925 Eopen: 0x0190, 18926 Epsilon: 0x0395, 18927 Epsilontonos: 0x0388, 18928 Ercyrillic: 0x0420, 18929 Ereversed: 0x018E, 18930 Ereversedcyrillic: 0x042D, 18931 Escyrillic: 0x0421, 18932 Esdescendercyrillic: 0x04AA, 18933 Esh: 0x01A9, 18934 Esmall: 0xF765, 18935 Eta: 0x0397, 18936 Etarmenian: 0x0538, 18937 Etatonos: 0x0389, 18938 Eth: 0x00D0, 18939 Ethsmall: 0xF7F0, 18940 Etilde: 0x1EBC, 18941 Etildebelow: 0x1E1A, 18942 Euro: 0x20AC, 18943 Ezh: 0x01B7, 18944 Ezhcaron: 0x01EE, 18945 Ezhreversed: 0x01B8, 18946 F: 0x0046, 18947 Fcircle: 0x24BB, 18948 Fdotaccent: 0x1E1E, 18949 Feharmenian: 0x0556, 18950 Feicoptic: 0x03E4, 18951 Fhook: 0x0191, 18952 Fitacyrillic: 0x0472, 18953 Fiveroman: 0x2164, 18954 Fmonospace: 0xFF26, 18955 Fourroman: 0x2163, 18956 Fsmall: 0xF766, 18957 G: 0x0047, 18958 GBsquare: 0x3387, 18959 Gacute: 0x01F4, 18960 Gamma: 0x0393, 18961 Gammaafrican: 0x0194, 18962 Gangiacoptic: 0x03EA, 18963 Gbreve: 0x011E, 18964 Gcaron: 0x01E6, 18965 Gcedilla: 0x0122, 18966 Gcircle: 0x24BC, 18967 Gcircumflex: 0x011C, 18968 Gcommaaccent: 0x0122, 18969 Gdot: 0x0120, 18970 Gdotaccent: 0x0120, 18971 Gecyrillic: 0x0413, 18972 Ghadarmenian: 0x0542, 18973 Ghemiddlehookcyrillic: 0x0494, 18974 Ghestrokecyrillic: 0x0492, 18975 Gheupturncyrillic: 0x0490, 18976 Ghook: 0x0193, 18977 Gimarmenian: 0x0533, 18978 Gjecyrillic: 0x0403, 18979 Gmacron: 0x1E20, 18980 Gmonospace: 0xFF27, 18981 Grave: 0xF6CE, 18982 Gravesmall: 0xF760, 18983 Gsmall: 0xF767, 18984 Gsmallhook: 0x029B, 18985 Gstroke: 0x01E4, 18986 H: 0x0048, 18987 H18533: 0x25CF, 18988 H18543: 0x25AA, 18989 H18551: 0x25AB, 18990 H22073: 0x25A1, 18991 HPsquare: 0x33CB, 18992 Haabkhasiancyrillic: 0x04A8, 18993 Hadescendercyrillic: 0x04B2, 18994 Hardsigncyrillic: 0x042A, 18995 Hbar: 0x0126, 18996 Hbrevebelow: 0x1E2A, 18997 Hcedilla: 0x1E28, 18998 Hcircle: 0x24BD, 18999 Hcircumflex: 0x0124, 19000 Hdieresis: 0x1E26, 19001 Hdotaccent: 0x1E22, 19002 Hdotbelow: 0x1E24, 19003 Hmonospace: 0xFF28, 19004 Hoarmenian: 0x0540, 19005 Horicoptic: 0x03E8, 19006 Hsmall: 0xF768, 19007 Hungarumlaut: 0xF6CF, 19008 Hungarumlautsmall: 0xF6F8, 19009 Hzsquare: 0x3390, 19010 I: 0x0049, 19011 IAcyrillic: 0x042F, 19012 IJ: 0x0132, 19013 IUcyrillic: 0x042E, 19014 Iacute: 0x00CD, 19015 Iacutesmall: 0xF7ED, 19016 Ibreve: 0x012C, 19017 Icaron: 0x01CF, 19018 Icircle: 0x24BE, 19019 Icircumflex: 0x00CE, 19020 Icircumflexsmall: 0xF7EE, 19021 Icyrillic: 0x0406, 19022 Idblgrave: 0x0208, 19023 Idieresis: 0x00CF, 19024 Idieresisacute: 0x1E2E, 19025 Idieresiscyrillic: 0x04E4, 19026 Idieresissmall: 0xF7EF, 19027 Idot: 0x0130, 19028 Idotaccent: 0x0130, 19029 Idotbelow: 0x1ECA, 19030 Iebrevecyrillic: 0x04D6, 19031 Iecyrillic: 0x0415, 19032 Ifraktur: 0x2111, 19033 Igrave: 0x00CC, 19034 Igravesmall: 0xF7EC, 19035 Ihookabove: 0x1EC8, 19036 Iicyrillic: 0x0418, 19037 Iinvertedbreve: 0x020A, 19038 Iishortcyrillic: 0x0419, 19039 Imacron: 0x012A, 19040 Imacroncyrillic: 0x04E2, 19041 Imonospace: 0xFF29, 19042 Iniarmenian: 0x053B, 19043 Iocyrillic: 0x0401, 19044 Iogonek: 0x012E, 19045 Iota: 0x0399, 19046 Iotaafrican: 0x0196, 19047 Iotadieresis: 0x03AA, 19048 Iotatonos: 0x038A, 19049 Ismall: 0xF769, 19050 Istroke: 0x0197, 19051 Itilde: 0x0128, 19052 Itildebelow: 0x1E2C, 19053 Izhitsacyrillic: 0x0474, 19054 Izhitsadblgravecyrillic: 0x0476, 19055 J: 0x004A, 19056 Jaarmenian: 0x0541, 19057 Jcircle: 0x24BF, 19058 Jcircumflex: 0x0134, 19059 Jecyrillic: 0x0408, 19060 Jheharmenian: 0x054B, 19061 Jmonospace: 0xFF2A, 19062 Jsmall: 0xF76A, 19063 K: 0x004B, 19064 KBsquare: 0x3385, 19065 KKsquare: 0x33CD, 19066 Kabashkircyrillic: 0x04A0, 19067 Kacute: 0x1E30, 19068 Kacyrillic: 0x041A, 19069 Kadescendercyrillic: 0x049A, 19070 Kahookcyrillic: 0x04C3, 19071 Kappa: 0x039A, 19072 Kastrokecyrillic: 0x049E, 19073 Kaverticalstrokecyrillic: 0x049C, 19074 Kcaron: 0x01E8, 19075 Kcedilla: 0x0136, 19076 Kcircle: 0x24C0, 19077 Kcommaaccent: 0x0136, 19078 Kdotbelow: 0x1E32, 19079 Keharmenian: 0x0554, 19080 Kenarmenian: 0x053F, 19081 Khacyrillic: 0x0425, 19082 Kheicoptic: 0x03E6, 19083 Khook: 0x0198, 19084 Kjecyrillic: 0x040C, 19085 Klinebelow: 0x1E34, 19086 Kmonospace: 0xFF2B, 19087 Koppacyrillic: 0x0480, 19088 Koppagreek: 0x03DE, 19089 Ksicyrillic: 0x046E, 19090 Ksmall: 0xF76B, 19091 L: 0x004C, 19092 LJ: 0x01C7, 19093 LL: 0xF6BF, 19094 Lacute: 0x0139, 19095 Lambda: 0x039B, 19096 Lcaron: 0x013D, 19097 Lcedilla: 0x013B, 19098 Lcircle: 0x24C1, 19099 Lcircumflexbelow: 0x1E3C, 19100 Lcommaaccent: 0x013B, 19101 Ldot: 0x013F, 19102 Ldotaccent: 0x013F, 19103 Ldotbelow: 0x1E36, 19104 Ldotbelowmacron: 0x1E38, 19105 Liwnarmenian: 0x053C, 19106 Lj: 0x01C8, 19107 Ljecyrillic: 0x0409, 19108 Llinebelow: 0x1E3A, 19109 Lmonospace: 0xFF2C, 19110 Lslash: 0x0141, 19111 Lslashsmall: 0xF6F9, 19112 Lsmall: 0xF76C, 19113 M: 0x004D, 19114 MBsquare: 0x3386, 19115 Macron: 0xF6D0, 19116 Macronsmall: 0xF7AF, 19117 Macute: 0x1E3E, 19118 Mcircle: 0x24C2, 19119 Mdotaccent: 0x1E40, 19120 Mdotbelow: 0x1E42, 19121 Menarmenian: 0x0544, 19122 Mmonospace: 0xFF2D, 19123 Msmall: 0xF76D, 19124 Mturned: 0x019C, 19125 Mu: 0x039C, 19126 N: 0x004E, 19127 NJ: 0x01CA, 19128 Nacute: 0x0143, 19129 Ncaron: 0x0147, 19130 Ncedilla: 0x0145, 19131 Ncircle: 0x24C3, 19132 Ncircumflexbelow: 0x1E4A, 19133 Ncommaaccent: 0x0145, 19134 Ndotaccent: 0x1E44, 19135 Ndotbelow: 0x1E46, 19136 Nhookleft: 0x019D, 19137 Nineroman: 0x2168, 19138 Nj: 0x01CB, 19139 Njecyrillic: 0x040A, 19140 Nlinebelow: 0x1E48, 19141 Nmonospace: 0xFF2E, 19142 Nowarmenian: 0x0546, 19143 Nsmall: 0xF76E, 19144 Ntilde: 0x00D1, 19145 Ntildesmall: 0xF7F1, 19146 Nu: 0x039D, 19147 O: 0x004F, 19148 OE: 0x0152, 19149 OEsmall: 0xF6FA, 19150 Oacute: 0x00D3, 19151 Oacutesmall: 0xF7F3, 19152 Obarredcyrillic: 0x04E8, 19153 Obarreddieresiscyrillic: 0x04EA, 19154 Obreve: 0x014E, 19155 Ocaron: 0x01D1, 19156 Ocenteredtilde: 0x019F, 19157 Ocircle: 0x24C4, 19158 Ocircumflex: 0x00D4, 19159 Ocircumflexacute: 0x1ED0, 19160 Ocircumflexdotbelow: 0x1ED8, 19161 Ocircumflexgrave: 0x1ED2, 19162 Ocircumflexhookabove: 0x1ED4, 19163 Ocircumflexsmall: 0xF7F4, 19164 Ocircumflextilde: 0x1ED6, 19165 Ocyrillic: 0x041E, 19166 Odblacute: 0x0150, 19167 Odblgrave: 0x020C, 19168 Odieresis: 0x00D6, 19169 Odieresiscyrillic: 0x04E6, 19170 Odieresissmall: 0xF7F6, 19171 Odotbelow: 0x1ECC, 19172 Ogoneksmall: 0xF6FB, 19173 Ograve: 0x00D2, 19174 Ogravesmall: 0xF7F2, 19175 Oharmenian: 0x0555, 19176 Ohm: 0x2126, 19177 Ohookabove: 0x1ECE, 19178 Ohorn: 0x01A0, 19179 Ohornacute: 0x1EDA, 19180 Ohorndotbelow: 0x1EE2, 19181 Ohorngrave: 0x1EDC, 19182 Ohornhookabove: 0x1EDE, 19183 Ohorntilde: 0x1EE0, 19184 Ohungarumlaut: 0x0150, 19185 Oi: 0x01A2, 19186 Oinvertedbreve: 0x020E, 19187 Omacron: 0x014C, 19188 Omacronacute: 0x1E52, 19189 Omacrongrave: 0x1E50, 19190 Omega: 0x2126, 19191 Omegacyrillic: 0x0460, 19192 Omegagreek: 0x03A9, 19193 Omegaroundcyrillic: 0x047A, 19194 Omegatitlocyrillic: 0x047C, 19195 Omegatonos: 0x038F, 19196 Omicron: 0x039F, 19197 Omicrontonos: 0x038C, 19198 Omonospace: 0xFF2F, 19199 Oneroman: 0x2160, 19200 Oogonek: 0x01EA, 19201 Oogonekmacron: 0x01EC, 19202 Oopen: 0x0186, 19203 Oslash: 0x00D8, 19204 Oslashacute: 0x01FE, 19205 Oslashsmall: 0xF7F8, 19206 Osmall: 0xF76F, 19207 Ostrokeacute: 0x01FE, 19208 Otcyrillic: 0x047E, 19209 Otilde: 0x00D5, 19210 Otildeacute: 0x1E4C, 19211 Otildedieresis: 0x1E4E, 19212 Otildesmall: 0xF7F5, 19213 P: 0x0050, 19214 Pacute: 0x1E54, 19215 Pcircle: 0x24C5, 19216 Pdotaccent: 0x1E56, 19217 Pecyrillic: 0x041F, 19218 Peharmenian: 0x054A, 19219 Pemiddlehookcyrillic: 0x04A6, 19220 Phi: 0x03A6, 19221 Phook: 0x01A4, 19222 Pi: 0x03A0, 19223 Piwrarmenian: 0x0553, 19224 Pmonospace: 0xFF30, 19225 Psi: 0x03A8, 19226 Psicyrillic: 0x0470, 19227 Psmall: 0xF770, 19228 Q: 0x0051, 19229 Qcircle: 0x24C6, 19230 Qmonospace: 0xFF31, 19231 Qsmall: 0xF771, 19232 R: 0x0052, 19233 Raarmenian: 0x054C, 19234 Racute: 0x0154, 19235 Rcaron: 0x0158, 19236 Rcedilla: 0x0156, 19237 Rcircle: 0x24C7, 19238 Rcommaaccent: 0x0156, 19239 Rdblgrave: 0x0210, 19240 Rdotaccent: 0x1E58, 19241 Rdotbelow: 0x1E5A, 19242 Rdotbelowmacron: 0x1E5C, 19243 Reharmenian: 0x0550, 19244 Rfraktur: 0x211C, 19245 Rho: 0x03A1, 19246 Ringsmall: 0xF6FC, 19247 Rinvertedbreve: 0x0212, 19248 Rlinebelow: 0x1E5E, 19249 Rmonospace: 0xFF32, 19250 Rsmall: 0xF772, 19251 Rsmallinverted: 0x0281, 19252 Rsmallinvertedsuperior: 0x02B6, 19253 S: 0x0053, 19254 SF010000: 0x250C, 19255 SF020000: 0x2514, 19256 SF030000: 0x2510, 19257 SF040000: 0x2518, 19258 SF050000: 0x253C, 19259 SF060000: 0x252C, 19260 SF070000: 0x2534, 19261 SF080000: 0x251C, 19262 SF090000: 0x2524, 19263 SF100000: 0x2500, 19264 SF110000: 0x2502, 19265 SF190000: 0x2561, 19266 SF200000: 0x2562, 19267 SF210000: 0x2556, 19268 SF220000: 0x2555, 19269 SF230000: 0x2563, 19270 SF240000: 0x2551, 19271 SF250000: 0x2557, 19272 SF260000: 0x255D, 19273 SF270000: 0x255C, 19274 SF280000: 0x255B, 19275 SF360000: 0x255E, 19276 SF370000: 0x255F, 19277 SF380000: 0x255A, 19278 SF390000: 0x2554, 19279 SF400000: 0x2569, 19280 SF410000: 0x2566, 19281 SF420000: 0x2560, 19282 SF430000: 0x2550, 19283 SF440000: 0x256C, 19284 SF450000: 0x2567, 19285 SF460000: 0x2568, 19286 SF470000: 0x2564, 19287 SF480000: 0x2565, 19288 SF490000: 0x2559, 19289 SF500000: 0x2558, 19290 SF510000: 0x2552, 19291 SF520000: 0x2553, 19292 SF530000: 0x256B, 19293 SF540000: 0x256A, 19294 Sacute: 0x015A, 19295 Sacutedotaccent: 0x1E64, 19296 Sampigreek: 0x03E0, 19297 Scaron: 0x0160, 19298 Scarondotaccent: 0x1E66, 19299 Scaronsmall: 0xF6FD, 19300 Scedilla: 0x015E, 19301 Schwa: 0x018F, 19302 Schwacyrillic: 0x04D8, 19303 Schwadieresiscyrillic: 0x04DA, 19304 Scircle: 0x24C8, 19305 Scircumflex: 0x015C, 19306 Scommaaccent: 0x0218, 19307 Sdotaccent: 0x1E60, 19308 Sdotbelow: 0x1E62, 19309 Sdotbelowdotaccent: 0x1E68, 19310 Seharmenian: 0x054D, 19311 Sevenroman: 0x2166, 19312 Shaarmenian: 0x0547, 19313 Shacyrillic: 0x0428, 19314 Shchacyrillic: 0x0429, 19315 Sheicoptic: 0x03E2, 19316 Shhacyrillic: 0x04BA, 19317 Shimacoptic: 0x03EC, 19318 Sigma: 0x03A3, 19319 Sixroman: 0x2165, 19320 Smonospace: 0xFF33, 19321 Softsigncyrillic: 0x042C, 19322 Ssmall: 0xF773, 19323 Stigmagreek: 0x03DA, 19324 T: 0x0054, 19325 Tau: 0x03A4, 19326 Tbar: 0x0166, 19327 Tcaron: 0x0164, 19328 Tcedilla: 0x0162, 19329 Tcircle: 0x24C9, 19330 Tcircumflexbelow: 0x1E70, 19331 Tcommaaccent: 0x0162, 19332 Tdotaccent: 0x1E6A, 19333 Tdotbelow: 0x1E6C, 19334 Tecyrillic: 0x0422, 19335 Tedescendercyrillic: 0x04AC, 19336 Tenroman: 0x2169, 19337 Tetsecyrillic: 0x04B4, 19338 Theta: 0x0398, 19339 Thook: 0x01AC, 19340 Thorn: 0x00DE, 19341 Thornsmall: 0xF7FE, 19342 Threeroman: 0x2162, 19343 Tildesmall: 0xF6FE, 19344 Tiwnarmenian: 0x054F, 19345 Tlinebelow: 0x1E6E, 19346 Tmonospace: 0xFF34, 19347 Toarmenian: 0x0539, 19348 Tonefive: 0x01BC, 19349 Tonesix: 0x0184, 19350 Tonetwo: 0x01A7, 19351 Tretroflexhook: 0x01AE, 19352 Tsecyrillic: 0x0426, 19353 Tshecyrillic: 0x040B, 19354 Tsmall: 0xF774, 19355 Twelveroman: 0x216B, 19356 Tworoman: 0x2161, 19357 U: 0x0055, 19358 Uacute: 0x00DA, 19359 Uacutesmall: 0xF7FA, 19360 Ubreve: 0x016C, 19361 Ucaron: 0x01D3, 19362 Ucircle: 0x24CA, 19363 Ucircumflex: 0x00DB, 19364 Ucircumflexbelow: 0x1E76, 19365 Ucircumflexsmall: 0xF7FB, 19366 Ucyrillic: 0x0423, 19367 Udblacute: 0x0170, 19368 Udblgrave: 0x0214, 19369 Udieresis: 0x00DC, 19370 Udieresisacute: 0x01D7, 19371 Udieresisbelow: 0x1E72, 19372 Udieresiscaron: 0x01D9, 19373 Udieresiscyrillic: 0x04F0, 19374 Udieresisgrave: 0x01DB, 19375 Udieresismacron: 0x01D5, 19376 Udieresissmall: 0xF7FC, 19377 Udotbelow: 0x1EE4, 19378 Ugrave: 0x00D9, 19379 Ugravesmall: 0xF7F9, 19380 Uhookabove: 0x1EE6, 19381 Uhorn: 0x01AF, 19382 Uhornacute: 0x1EE8, 19383 Uhorndotbelow: 0x1EF0, 19384 Uhorngrave: 0x1EEA, 19385 Uhornhookabove: 0x1EEC, 19386 Uhorntilde: 0x1EEE, 19387 Uhungarumlaut: 0x0170, 19388 Uhungarumlautcyrillic: 0x04F2, 19389 Uinvertedbreve: 0x0216, 19390 Ukcyrillic: 0x0478, 19391 Umacron: 0x016A, 19392 Umacroncyrillic: 0x04EE, 19393 Umacrondieresis: 0x1E7A, 19394 Umonospace: 0xFF35, 19395 Uogonek: 0x0172, 19396 Upsilon: 0x03A5, 19397 Upsilon1: 0x03D2, 19398 Upsilonacutehooksymbolgreek: 0x03D3, 19399 Upsilonafrican: 0x01B1, 19400 Upsilondieresis: 0x03AB, 19401 Upsilondieresishooksymbolgreek: 0x03D4, 19402 Upsilonhooksymbol: 0x03D2, 19403 Upsilontonos: 0x038E, 19404 Uring: 0x016E, 19405 Ushortcyrillic: 0x040E, 19406 Usmall: 0xF775, 19407 Ustraightcyrillic: 0x04AE, 19408 Ustraightstrokecyrillic: 0x04B0, 19409 Utilde: 0x0168, 19410 Utildeacute: 0x1E78, 19411 Utildebelow: 0x1E74, 19412 V: 0x0056, 19413 Vcircle: 0x24CB, 19414 Vdotbelow: 0x1E7E, 19415 Vecyrillic: 0x0412, 19416 Vewarmenian: 0x054E, 19417 Vhook: 0x01B2, 19418 Vmonospace: 0xFF36, 19419 Voarmenian: 0x0548, 19420 Vsmall: 0xF776, 19421 Vtilde: 0x1E7C, 19422 W: 0x0057, 19423 Wacute: 0x1E82, 19424 Wcircle: 0x24CC, 19425 Wcircumflex: 0x0174, 19426 Wdieresis: 0x1E84, 19427 Wdotaccent: 0x1E86, 19428 Wdotbelow: 0x1E88, 19429 Wgrave: 0x1E80, 19430 Wmonospace: 0xFF37, 19431 Wsmall: 0xF777, 19432 X: 0x0058, 19433 Xcircle: 0x24CD, 19434 Xdieresis: 0x1E8C, 19435 Xdotaccent: 0x1E8A, 19436 Xeharmenian: 0x053D, 19437 Xi: 0x039E, 19438 Xmonospace: 0xFF38, 19439 Xsmall: 0xF778, 19440 Y: 0x0059, 19441 Yacute: 0x00DD, 19442 Yacutesmall: 0xF7FD, 19443 Yatcyrillic: 0x0462, 19444 Ycircle: 0x24CE, 19445 Ycircumflex: 0x0176, 19446 Ydieresis: 0x0178, 19447 Ydieresissmall: 0xF7FF, 19448 Ydotaccent: 0x1E8E, 19449 Ydotbelow: 0x1EF4, 19450 Yericyrillic: 0x042B, 19451 Yerudieresiscyrillic: 0x04F8, 19452 Ygrave: 0x1EF2, 19453 Yhook: 0x01B3, 19454 Yhookabove: 0x1EF6, 19455 Yiarmenian: 0x0545, 19456 Yicyrillic: 0x0407, 19457 Yiwnarmenian: 0x0552, 19458 Ymonospace: 0xFF39, 19459 Ysmall: 0xF779, 19460 Ytilde: 0x1EF8, 19461 Yusbigcyrillic: 0x046A, 19462 Yusbigiotifiedcyrillic: 0x046C, 19463 Yuslittlecyrillic: 0x0466, 19464 Yuslittleiotifiedcyrillic: 0x0468, 19465 Z: 0x005A, 19466 Zaarmenian: 0x0536, 19467 Zacute: 0x0179, 19468 Zcaron: 0x017D, 19469 Zcaronsmall: 0xF6FF, 19470 Zcircle: 0x24CF, 19471 Zcircumflex: 0x1E90, 19472 Zdot: 0x017B, 19473 Zdotaccent: 0x017B, 19474 Zdotbelow: 0x1E92, 19475 Zecyrillic: 0x0417, 19476 Zedescendercyrillic: 0x0498, 19477 Zedieresiscyrillic: 0x04DE, 19478 Zeta: 0x0396, 19479 Zhearmenian: 0x053A, 19480 Zhebrevecyrillic: 0x04C1, 19481 Zhecyrillic: 0x0416, 19482 Zhedescendercyrillic: 0x0496, 19483 Zhedieresiscyrillic: 0x04DC, 19484 Zlinebelow: 0x1E94, 19485 Zmonospace: 0xFF3A, 19486 Zsmall: 0xF77A, 19487 Zstroke: 0x01B5, 19488 a: 0x0061, 19489 aabengali: 0x0986, 19490 aacute: 0x00E1, 19491 aadeva: 0x0906, 19492 aagujarati: 0x0A86, 19493 aagurmukhi: 0x0A06, 19494 aamatragurmukhi: 0x0A3E, 19495 aarusquare: 0x3303, 19496 aavowelsignbengali: 0x09BE, 19497 aavowelsigndeva: 0x093E, 19498 aavowelsigngujarati: 0x0ABE, 19499 abbreviationmarkarmenian: 0x055F, 19500 abbreviationsigndeva: 0x0970, 19501 abengali: 0x0985, 19502 abopomofo: 0x311A, 19503 abreve: 0x0103, 19504 abreveacute: 0x1EAF, 19505 abrevecyrillic: 0x04D1, 19506 abrevedotbelow: 0x1EB7, 19507 abrevegrave: 0x1EB1, 19508 abrevehookabove: 0x1EB3, 19509 abrevetilde: 0x1EB5, 19510 acaron: 0x01CE, 19511 acircle: 0x24D0, 19512 acircumflex: 0x00E2, 19513 acircumflexacute: 0x1EA5, 19514 acircumflexdotbelow: 0x1EAD, 19515 acircumflexgrave: 0x1EA7, 19516 acircumflexhookabove: 0x1EA9, 19517 acircumflextilde: 0x1EAB, 19518 acute: 0x00B4, 19519 acutebelowcmb: 0x0317, 19520 acutecmb: 0x0301, 19521 acutecomb: 0x0301, 19522 acutedeva: 0x0954, 19523 acutelowmod: 0x02CF, 19524 acutetonecmb: 0x0341, 19525 acyrillic: 0x0430, 19526 adblgrave: 0x0201, 19527 addakgurmukhi: 0x0A71, 19528 adeva: 0x0905, 19529 adieresis: 0x00E4, 19530 adieresiscyrillic: 0x04D3, 19531 adieresismacron: 0x01DF, 19532 adotbelow: 0x1EA1, 19533 adotmacron: 0x01E1, 19534 ae: 0x00E6, 19535 aeacute: 0x01FD, 19536 aekorean: 0x3150, 19537 aemacron: 0x01E3, 19538 afii00208: 0x2015, 19539 afii08941: 0x20A4, 19540 afii10017: 0x0410, 19541 afii10018: 0x0411, 19542 afii10019: 0x0412, 19543 afii10020: 0x0413, 19544 afii10021: 0x0414, 19545 afii10022: 0x0415, 19546 afii10023: 0x0401, 19547 afii10024: 0x0416, 19548 afii10025: 0x0417, 19549 afii10026: 0x0418, 19550 afii10027: 0x0419, 19551 afii10028: 0x041A, 19552 afii10029: 0x041B, 19553 afii10030: 0x041C, 19554 afii10031: 0x041D, 19555 afii10032: 0x041E, 19556 afii10033: 0x041F, 19557 afii10034: 0x0420, 19558 afii10035: 0x0421, 19559 afii10036: 0x0422, 19560 afii10037: 0x0423, 19561 afii10038: 0x0424, 19562 afii10039: 0x0425, 19563 afii10040: 0x0426, 19564 afii10041: 0x0427, 19565 afii10042: 0x0428, 19566 afii10043: 0x0429, 19567 afii10044: 0x042A, 19568 afii10045: 0x042B, 19569 afii10046: 0x042C, 19570 afii10047: 0x042D, 19571 afii10048: 0x042E, 19572 afii10049: 0x042F, 19573 afii10050: 0x0490, 19574 afii10051: 0x0402, 19575 afii10052: 0x0403, 19576 afii10053: 0x0404, 19577 afii10054: 0x0405, 19578 afii10055: 0x0406, 19579 afii10056: 0x0407, 19580 afii10057: 0x0408, 19581 afii10058: 0x0409, 19582 afii10059: 0x040A, 19583 afii10060: 0x040B, 19584 afii10061: 0x040C, 19585 afii10062: 0x040E, 19586 afii10063: 0xF6C4, 19587 afii10064: 0xF6C5, 19588 afii10065: 0x0430, 19589 afii10066: 0x0431, 19590 afii10067: 0x0432, 19591 afii10068: 0x0433, 19592 afii10069: 0x0434, 19593 afii10070: 0x0435, 19594 afii10071: 0x0451, 19595 afii10072: 0x0436, 19596 afii10073: 0x0437, 19597 afii10074: 0x0438, 19598 afii10075: 0x0439, 19599 afii10076: 0x043A, 19600 afii10077: 0x043B, 19601 afii10078: 0x043C, 19602 afii10079: 0x043D, 19603 afii10080: 0x043E, 19604 afii10081: 0x043F, 19605 afii10082: 0x0440, 19606 afii10083: 0x0441, 19607 afii10084: 0x0442, 19608 afii10085: 0x0443, 19609 afii10086: 0x0444, 19610 afii10087: 0x0445, 19611 afii10088: 0x0446, 19612 afii10089: 0x0447, 19613 afii10090: 0x0448, 19614 afii10091: 0x0449, 19615 afii10092: 0x044A, 19616 afii10093: 0x044B, 19617 afii10094: 0x044C, 19618 afii10095: 0x044D, 19619 afii10096: 0x044E, 19620 afii10097: 0x044F, 19621 afii10098: 0x0491, 19622 afii10099: 0x0452, 19623 afii10100: 0x0453, 19624 afii10101: 0x0454, 19625 afii10102: 0x0455, 19626 afii10103: 0x0456, 19627 afii10104: 0x0457, 19628 afii10105: 0x0458, 19629 afii10106: 0x0459, 19630 afii10107: 0x045A, 19631 afii10108: 0x045B, 19632 afii10109: 0x045C, 19633 afii10110: 0x045E, 19634 afii10145: 0x040F, 19635 afii10146: 0x0462, 19636 afii10147: 0x0472, 19637 afii10148: 0x0474, 19638 afii10192: 0xF6C6, 19639 afii10193: 0x045F, 19640 afii10194: 0x0463, 19641 afii10195: 0x0473, 19642 afii10196: 0x0475, 19643 afii10831: 0xF6C7, 19644 afii10832: 0xF6C8, 19645 afii10846: 0x04D9, 19646 afii299: 0x200E, 19647 afii300: 0x200F, 19648 afii301: 0x200D, 19649 afii57381: 0x066A, 19650 afii57388: 0x060C, 19651 afii57392: 0x0660, 19652 afii57393: 0x0661, 19653 afii57394: 0x0662, 19654 afii57395: 0x0663, 19655 afii57396: 0x0664, 19656 afii57397: 0x0665, 19657 afii57398: 0x0666, 19658 afii57399: 0x0667, 19659 afii57400: 0x0668, 19660 afii57401: 0x0669, 19661 afii57403: 0x061B, 19662 afii57407: 0x061F, 19663 afii57409: 0x0621, 19664 afii57410: 0x0622, 19665 afii57411: 0x0623, 19666 afii57412: 0x0624, 19667 afii57413: 0x0625, 19668 afii57414: 0x0626, 19669 afii57415: 0x0627, 19670 afii57416: 0x0628, 19671 afii57417: 0x0629, 19672 afii57418: 0x062A, 19673 afii57419: 0x062B, 19674 afii57420: 0x062C, 19675 afii57421: 0x062D, 19676 afii57422: 0x062E, 19677 afii57423: 0x062F, 19678 afii57424: 0x0630, 19679 afii57425: 0x0631, 19680 afii57426: 0x0632, 19681 afii57427: 0x0633, 19682 afii57428: 0x0634, 19683 afii57429: 0x0635, 19684 afii57430: 0x0636, 19685 afii57431: 0x0637, 19686 afii57432: 0x0638, 19687 afii57433: 0x0639, 19688 afii57434: 0x063A, 19689 afii57440: 0x0640, 19690 afii57441: 0x0641, 19691 afii57442: 0x0642, 19692 afii57443: 0x0643, 19693 afii57444: 0x0644, 19694 afii57445: 0x0645, 19695 afii57446: 0x0646, 19696 afii57448: 0x0648, 19697 afii57449: 0x0649, 19698 afii57450: 0x064A, 19699 afii57451: 0x064B, 19700 afii57452: 0x064C, 19701 afii57453: 0x064D, 19702 afii57454: 0x064E, 19703 afii57455: 0x064F, 19704 afii57456: 0x0650, 19705 afii57457: 0x0651, 19706 afii57458: 0x0652, 19707 afii57470: 0x0647, 19708 afii57505: 0x06A4, 19709 afii57506: 0x067E, 19710 afii57507: 0x0686, 19711 afii57508: 0x0698, 19712 afii57509: 0x06AF, 19713 afii57511: 0x0679, 19714 afii57512: 0x0688, 19715 afii57513: 0x0691, 19716 afii57514: 0x06BA, 19717 afii57519: 0x06D2, 19718 afii57534: 0x06D5, 19719 afii57636: 0x20AA, 19720 afii57645: 0x05BE, 19721 afii57658: 0x05C3, 19722 afii57664: 0x05D0, 19723 afii57665: 0x05D1, 19724 afii57666: 0x05D2, 19725 afii57667: 0x05D3, 19726 afii57668: 0x05D4, 19727 afii57669: 0x05D5, 19728 afii57670: 0x05D6, 19729 afii57671: 0x05D7, 19730 afii57672: 0x05D8, 19731 afii57673: 0x05D9, 19732 afii57674: 0x05DA, 19733 afii57675: 0x05DB, 19734 afii57676: 0x05DC, 19735 afii57677: 0x05DD, 19736 afii57678: 0x05DE, 19737 afii57679: 0x05DF, 19738 afii57680: 0x05E0, 19739 afii57681: 0x05E1, 19740 afii57682: 0x05E2, 19741 afii57683: 0x05E3, 19742 afii57684: 0x05E4, 19743 afii57685: 0x05E5, 19744 afii57686: 0x05E6, 19745 afii57687: 0x05E7, 19746 afii57688: 0x05E8, 19747 afii57689: 0x05E9, 19748 afii57690: 0x05EA, 19749 afii57694: 0xFB2A, 19750 afii57695: 0xFB2B, 19751 afii57700: 0xFB4B, 19752 afii57705: 0xFB1F, 19753 afii57716: 0x05F0, 19754 afii57717: 0x05F1, 19755 afii57718: 0x05F2, 19756 afii57723: 0xFB35, 19757 afii57793: 0x05B4, 19758 afii57794: 0x05B5, 19759 afii57795: 0x05B6, 19760 afii57796: 0x05BB, 19761 afii57797: 0x05B8, 19762 afii57798: 0x05B7, 19763 afii57799: 0x05B0, 19764 afii57800: 0x05B2, 19765 afii57801: 0x05B1, 19766 afii57802: 0x05B3, 19767 afii57803: 0x05C2, 19768 afii57804: 0x05C1, 19769 afii57806: 0x05B9, 19770 afii57807: 0x05BC, 19771 afii57839: 0x05BD, 19772 afii57841: 0x05BF, 19773 afii57842: 0x05C0, 19774 afii57929: 0x02BC, 19775 afii61248: 0x2105, 19776 afii61289: 0x2113, 19777 afii61352: 0x2116, 19778 afii61573: 0x202C, 19779 afii61574: 0x202D, 19780 afii61575: 0x202E, 19781 afii61664: 0x200C, 19782 afii63167: 0x066D, 19783 afii64937: 0x02BD, 19784 agrave: 0x00E0, 19785 agujarati: 0x0A85, 19786 agurmukhi: 0x0A05, 19787 ahiragana: 0x3042, 19788 ahookabove: 0x1EA3, 19789 aibengali: 0x0990, 19790 aibopomofo: 0x311E, 19791 aideva: 0x0910, 19792 aiecyrillic: 0x04D5, 19793 aigujarati: 0x0A90, 19794 aigurmukhi: 0x0A10, 19795 aimatragurmukhi: 0x0A48, 19796 ainarabic: 0x0639, 19797 ainfinalarabic: 0xFECA, 19798 aininitialarabic: 0xFECB, 19799 ainmedialarabic: 0xFECC, 19800 ainvertedbreve: 0x0203, 19801 aivowelsignbengali: 0x09C8, 19802 aivowelsigndeva: 0x0948, 19803 aivowelsigngujarati: 0x0AC8, 19804 akatakana: 0x30A2, 19805 akatakanahalfwidth: 0xFF71, 19806 akorean: 0x314F, 19807 alef: 0x05D0, 19808 alefarabic: 0x0627, 19809 alefdageshhebrew: 0xFB30, 19810 aleffinalarabic: 0xFE8E, 19811 alefhamzaabovearabic: 0x0623, 19812 alefhamzaabovefinalarabic: 0xFE84, 19813 alefhamzabelowarabic: 0x0625, 19814 alefhamzabelowfinalarabic: 0xFE88, 19815 alefhebrew: 0x05D0, 19816 aleflamedhebrew: 0xFB4F, 19817 alefmaddaabovearabic: 0x0622, 19818 alefmaddaabovefinalarabic: 0xFE82, 19819 alefmaksuraarabic: 0x0649, 19820 alefmaksurafinalarabic: 0xFEF0, 19821 alefmaksurainitialarabic: 0xFEF3, 19822 alefmaksuramedialarabic: 0xFEF4, 19823 alefpatahhebrew: 0xFB2E, 19824 alefqamatshebrew: 0xFB2F, 19825 aleph: 0x2135, 19826 allequal: 0x224C, 19827 alpha: 0x03B1, 19828 alphatonos: 0x03AC, 19829 amacron: 0x0101, 19830 amonospace: 0xFF41, 19831 ampersand: 0x0026, 19832 ampersandmonospace: 0xFF06, 19833 ampersandsmall: 0xF726, 19834 amsquare: 0x33C2, 19835 anbopomofo: 0x3122, 19836 angbopomofo: 0x3124, 19837 angbracketleft: 0x3008, // This glyph is missing from Adobe's original list. 19838 angbracketright: 0x3009, // This glyph is missing from Adobe's original list. 19839 angkhankhuthai: 0x0E5A, 19840 angle: 0x2220, 19841 anglebracketleft: 0x3008, 19842 anglebracketleftvertical: 0xFE3F, 19843 anglebracketright: 0x3009, 19844 anglebracketrightvertical: 0xFE40, 19845 angleleft: 0x2329, 19846 angleright: 0x232A, 19847 angstrom: 0x212B, 19848 anoteleia: 0x0387, 19849 anudattadeva: 0x0952, 19850 anusvarabengali: 0x0982, 19851 anusvaradeva: 0x0902, 19852 anusvaragujarati: 0x0A82, 19853 aogonek: 0x0105, 19854 apaatosquare: 0x3300, 19855 aparen: 0x249C, 19856 apostrophearmenian: 0x055A, 19857 apostrophemod: 0x02BC, 19858 apple: 0xF8FF, 19859 approaches: 0x2250, 19860 approxequal: 0x2248, 19861 approxequalorimage: 0x2252, 19862 approximatelyequal: 0x2245, 19863 araeaekorean: 0x318E, 19864 araeakorean: 0x318D, 19865 arc: 0x2312, 19866 arighthalfring: 0x1E9A, 19867 aring: 0x00E5, 19868 aringacute: 0x01FB, 19869 aringbelow: 0x1E01, 19870 arrowboth: 0x2194, 19871 arrowdashdown: 0x21E3, 19872 arrowdashleft: 0x21E0, 19873 arrowdashright: 0x21E2, 19874 arrowdashup: 0x21E1, 19875 arrowdblboth: 0x21D4, 19876 arrowdbldown: 0x21D3, 19877 arrowdblleft: 0x21D0, 19878 arrowdblright: 0x21D2, 19879 arrowdblup: 0x21D1, 19880 arrowdown: 0x2193, 19881 arrowdownleft: 0x2199, 19882 arrowdownright: 0x2198, 19883 arrowdownwhite: 0x21E9, 19884 arrowheaddownmod: 0x02C5, 19885 arrowheadleftmod: 0x02C2, 19886 arrowheadrightmod: 0x02C3, 19887 arrowheadupmod: 0x02C4, 19888 arrowhorizex: 0xF8E7, 19889 arrowleft: 0x2190, 19890 arrowleftdbl: 0x21D0, 19891 arrowleftdblstroke: 0x21CD, 19892 arrowleftoverright: 0x21C6, 19893 arrowleftwhite: 0x21E6, 19894 arrowright: 0x2192, 19895 arrowrightdblstroke: 0x21CF, 19896 arrowrightheavy: 0x279E, 19897 arrowrightoverleft: 0x21C4, 19898 arrowrightwhite: 0x21E8, 19899 arrowtableft: 0x21E4, 19900 arrowtabright: 0x21E5, 19901 arrowup: 0x2191, 19902 arrowupdn: 0x2195, 19903 arrowupdnbse: 0x21A8, 19904 arrowupdownbase: 0x21A8, 19905 arrowupleft: 0x2196, 19906 arrowupleftofdown: 0x21C5, 19907 arrowupright: 0x2197, 19908 arrowupwhite: 0x21E7, 19909 arrowvertex: 0xF8E6, 19910 asciicircum: 0x005E, 19911 asciicircummonospace: 0xFF3E, 19912 asciitilde: 0x007E, 19913 asciitildemonospace: 0xFF5E, 19914 ascript: 0x0251, 19915 ascriptturned: 0x0252, 19916 asmallhiragana: 0x3041, 19917 asmallkatakana: 0x30A1, 19918 asmallkatakanahalfwidth: 0xFF67, 19919 asterisk: 0x002A, 19920 asteriskaltonearabic: 0x066D, 19921 asteriskarabic: 0x066D, 19922 asteriskmath: 0x2217, 19923 asteriskmonospace: 0xFF0A, 19924 asterisksmall: 0xFE61, 19925 asterism: 0x2042, 19926 asuperior: 0xF6E9, 19927 asymptoticallyequal: 0x2243, 19928 at: 0x0040, 19929 atilde: 0x00E3, 19930 atmonospace: 0xFF20, 19931 atsmall: 0xFE6B, 19932 aturned: 0x0250, 19933 aubengali: 0x0994, 19934 aubopomofo: 0x3120, 19935 audeva: 0x0914, 19936 augujarati: 0x0A94, 19937 augurmukhi: 0x0A14, 19938 aulengthmarkbengali: 0x09D7, 19939 aumatragurmukhi: 0x0A4C, 19940 auvowelsignbengali: 0x09CC, 19941 auvowelsigndeva: 0x094C, 19942 auvowelsigngujarati: 0x0ACC, 19943 avagrahadeva: 0x093D, 19944 aybarmenian: 0x0561, 19945 ayin: 0x05E2, 19946 ayinaltonehebrew: 0xFB20, 19947 ayinhebrew: 0x05E2, 19948 b: 0x0062, 19949 babengali: 0x09AC, 19950 backslash: 0x005C, 19951 backslashmonospace: 0xFF3C, 19952 badeva: 0x092C, 19953 bagujarati: 0x0AAC, 19954 bagurmukhi: 0x0A2C, 19955 bahiragana: 0x3070, 19956 bahtthai: 0x0E3F, 19957 bakatakana: 0x30D0, 19958 bar: 0x007C, 19959 barmonospace: 0xFF5C, 19960 bbopomofo: 0x3105, 19961 bcircle: 0x24D1, 19962 bdotaccent: 0x1E03, 19963 bdotbelow: 0x1E05, 19964 beamedsixteenthnotes: 0x266C, 19965 because: 0x2235, 19966 becyrillic: 0x0431, 19967 beharabic: 0x0628, 19968 behfinalarabic: 0xFE90, 19969 behinitialarabic: 0xFE91, 19970 behiragana: 0x3079, 19971 behmedialarabic: 0xFE92, 19972 behmeeminitialarabic: 0xFC9F, 19973 behmeemisolatedarabic: 0xFC08, 19974 behnoonfinalarabic: 0xFC6D, 19975 bekatakana: 0x30D9, 19976 benarmenian: 0x0562, 19977 bet: 0x05D1, 19978 beta: 0x03B2, 19979 betasymbolgreek: 0x03D0, 19980 betdagesh: 0xFB31, 19981 betdageshhebrew: 0xFB31, 19982 bethebrew: 0x05D1, 19983 betrafehebrew: 0xFB4C, 19984 bhabengali: 0x09AD, 19985 bhadeva: 0x092D, 19986 bhagujarati: 0x0AAD, 19987 bhagurmukhi: 0x0A2D, 19988 bhook: 0x0253, 19989 bihiragana: 0x3073, 19990 bikatakana: 0x30D3, 19991 bilabialclick: 0x0298, 19992 bindigurmukhi: 0x0A02, 19993 birusquare: 0x3331, 19994 blackcircle: 0x25CF, 19995 blackdiamond: 0x25C6, 19996 blackdownpointingtriangle: 0x25BC, 19997 blackleftpointingpointer: 0x25C4, 19998 blackleftpointingtriangle: 0x25C0, 19999 blacklenticularbracketleft: 0x3010, 20000 blacklenticularbracketleftvertical: 0xFE3B, 20001 blacklenticularbracketright: 0x3011, 20002 blacklenticularbracketrightvertical: 0xFE3C, 20003 blacklowerlefttriangle: 0x25E3, 20004 blacklowerrighttriangle: 0x25E2, 20005 blackrectangle: 0x25AC, 20006 blackrightpointingpointer: 0x25BA, 20007 blackrightpointingtriangle: 0x25B6, 20008 blacksmallsquare: 0x25AA, 20009 blacksmilingface: 0x263B, 20010 blacksquare: 0x25A0, 20011 blackstar: 0x2605, 20012 blackupperlefttriangle: 0x25E4, 20013 blackupperrighttriangle: 0x25E5, 20014 blackuppointingsmalltriangle: 0x25B4, 20015 blackuppointingtriangle: 0x25B2, 20016 blank: 0x2423, 20017 blinebelow: 0x1E07, 20018 block: 0x2588, 20019 bmonospace: 0xFF42, 20020 bobaimaithai: 0x0E1A, 20021 bohiragana: 0x307C, 20022 bokatakana: 0x30DC, 20023 bparen: 0x249D, 20024 bqsquare: 0x33C3, 20025 braceex: 0xF8F4, 20026 braceleft: 0x007B, 20027 braceleftbt: 0xF8F3, 20028 braceleftmid: 0xF8F2, 20029 braceleftmonospace: 0xFF5B, 20030 braceleftsmall: 0xFE5B, 20031 bracelefttp: 0xF8F1, 20032 braceleftvertical: 0xFE37, 20033 braceright: 0x007D, 20034 bracerightbt: 0xF8FE, 20035 bracerightmid: 0xF8FD, 20036 bracerightmonospace: 0xFF5D, 20037 bracerightsmall: 0xFE5C, 20038 bracerighttp: 0xF8FC, 20039 bracerightvertical: 0xFE38, 20040 bracketleft: 0x005B, 20041 bracketleftbt: 0xF8F0, 20042 bracketleftex: 0xF8EF, 20043 bracketleftmonospace: 0xFF3B, 20044 bracketlefttp: 0xF8EE, 20045 bracketright: 0x005D, 20046 bracketrightbt: 0xF8FB, 20047 bracketrightex: 0xF8FA, 20048 bracketrightmonospace: 0xFF3D, 20049 bracketrighttp: 0xF8F9, 20050 breve: 0x02D8, 20051 brevebelowcmb: 0x032E, 20052 brevecmb: 0x0306, 20053 breveinvertedbelowcmb: 0x032F, 20054 breveinvertedcmb: 0x0311, 20055 breveinverteddoublecmb: 0x0361, 20056 bridgebelowcmb: 0x032A, 20057 bridgeinvertedbelowcmb: 0x033A, 20058 brokenbar: 0x00A6, 20059 bstroke: 0x0180, 20060 bsuperior: 0xF6EA, 20061 btopbar: 0x0183, 20062 buhiragana: 0x3076, 20063 bukatakana: 0x30D6, 20064 bullet: 0x2022, 20065 bulletinverse: 0x25D8, 20066 bulletoperator: 0x2219, 20067 bullseye: 0x25CE, 20068 c: 0x0063, 20069 caarmenian: 0x056E, 20070 cabengali: 0x099A, 20071 cacute: 0x0107, 20072 cadeva: 0x091A, 20073 cagujarati: 0x0A9A, 20074 cagurmukhi: 0x0A1A, 20075 calsquare: 0x3388, 20076 candrabindubengali: 0x0981, 20077 candrabinducmb: 0x0310, 20078 candrabindudeva: 0x0901, 20079 candrabindugujarati: 0x0A81, 20080 capslock: 0x21EA, 20081 careof: 0x2105, 20082 caron: 0x02C7, 20083 caronbelowcmb: 0x032C, 20084 caroncmb: 0x030C, 20085 carriagereturn: 0x21B5, 20086 cbopomofo: 0x3118, 20087 ccaron: 0x010D, 20088 ccedilla: 0x00E7, 20089 ccedillaacute: 0x1E09, 20090 ccircle: 0x24D2, 20091 ccircumflex: 0x0109, 20092 ccurl: 0x0255, 20093 cdot: 0x010B, 20094 cdotaccent: 0x010B, 20095 cdsquare: 0x33C5, 20096 cedilla: 0x00B8, 20097 cedillacmb: 0x0327, 20098 cent: 0x00A2, 20099 centigrade: 0x2103, 20100 centinferior: 0xF6DF, 20101 centmonospace: 0xFFE0, 20102 centoldstyle: 0xF7A2, 20103 centsuperior: 0xF6E0, 20104 chaarmenian: 0x0579, 20105 chabengali: 0x099B, 20106 chadeva: 0x091B, 20107 chagujarati: 0x0A9B, 20108 chagurmukhi: 0x0A1B, 20109 chbopomofo: 0x3114, 20110 cheabkhasiancyrillic: 0x04BD, 20111 checkmark: 0x2713, 20112 checyrillic: 0x0447, 20113 chedescenderabkhasiancyrillic: 0x04BF, 20114 chedescendercyrillic: 0x04B7, 20115 chedieresiscyrillic: 0x04F5, 20116 cheharmenian: 0x0573, 20117 chekhakassiancyrillic: 0x04CC, 20118 cheverticalstrokecyrillic: 0x04B9, 20119 chi: 0x03C7, 20120 chieuchacirclekorean: 0x3277, 20121 chieuchaparenkorean: 0x3217, 20122 chieuchcirclekorean: 0x3269, 20123 chieuchkorean: 0x314A, 20124 chieuchparenkorean: 0x3209, 20125 chochangthai: 0x0E0A, 20126 chochanthai: 0x0E08, 20127 chochingthai: 0x0E09, 20128 chochoethai: 0x0E0C, 20129 chook: 0x0188, 20130 cieucacirclekorean: 0x3276, 20131 cieucaparenkorean: 0x3216, 20132 cieuccirclekorean: 0x3268, 20133 cieuckorean: 0x3148, 20134 cieucparenkorean: 0x3208, 20135 cieucuparenkorean: 0x321C, 20136 circle: 0x25CB, 20137 circlecopyrt: 0x00A9, // This glyph is missing from Adobe's original list. 20138 circlemultiply: 0x2297, 20139 circleot: 0x2299, 20140 circleplus: 0x2295, 20141 circlepostalmark: 0x3036, 20142 circlewithlefthalfblack: 0x25D0, 20143 circlewithrighthalfblack: 0x25D1, 20144 circumflex: 0x02C6, 20145 circumflexbelowcmb: 0x032D, 20146 circumflexcmb: 0x0302, 20147 clear: 0x2327, 20148 clickalveolar: 0x01C2, 20149 clickdental: 0x01C0, 20150 clicklateral: 0x01C1, 20151 clickretroflex: 0x01C3, 20152 club: 0x2663, 20153 clubsuitblack: 0x2663, 20154 clubsuitwhite: 0x2667, 20155 cmcubedsquare: 0x33A4, 20156 cmonospace: 0xFF43, 20157 cmsquaredsquare: 0x33A0, 20158 coarmenian: 0x0581, 20159 colon: 0x003A, 20160 colonmonetary: 0x20A1, 20161 colonmonospace: 0xFF1A, 20162 colonsign: 0x20A1, 20163 colonsmall: 0xFE55, 20164 colontriangularhalfmod: 0x02D1, 20165 colontriangularmod: 0x02D0, 20166 comma: 0x002C, 20167 commaabovecmb: 0x0313, 20168 commaaboverightcmb: 0x0315, 20169 commaaccent: 0xF6C3, 20170 commaarabic: 0x060C, 20171 commaarmenian: 0x055D, 20172 commainferior: 0xF6E1, 20173 commamonospace: 0xFF0C, 20174 commareversedabovecmb: 0x0314, 20175 commareversedmod: 0x02BD, 20176 commasmall: 0xFE50, 20177 commasuperior: 0xF6E2, 20178 commaturnedabovecmb: 0x0312, 20179 commaturnedmod: 0x02BB, 20180 compass: 0x263C, 20181 congruent: 0x2245, 20182 contourintegral: 0x222E, 20183 control: 0x2303, 20184 controlACK: 0x0006, 20185 controlBEL: 0x0007, 20186 controlBS: 0x0008, 20187 controlCAN: 0x0018, 20188 controlCR: 0x000D, 20189 controlDC1: 0x0011, 20190 controlDC2: 0x0012, 20191 controlDC3: 0x0013, 20192 controlDC4: 0x0014, 20193 controlDEL: 0x007F, 20194 controlDLE: 0x0010, 20195 controlEM: 0x0019, 20196 controlENQ: 0x0005, 20197 controlEOT: 0x0004, 20198 controlESC: 0x001B, 20199 controlETB: 0x0017, 20200 controlETX: 0x0003, 20201 controlFF: 0x000C, 20202 controlFS: 0x001C, 20203 controlGS: 0x001D, 20204 controlHT: 0x0009, 20205 controlLF: 0x000A, 20206 controlNAK: 0x0015, 20207 controlRS: 0x001E, 20208 controlSI: 0x000F, 20209 controlSO: 0x000E, 20210 controlSOT: 0x0002, 20211 controlSTX: 0x0001, 20212 controlSUB: 0x001A, 20213 controlSYN: 0x0016, 20214 controlUS: 0x001F, 20215 controlVT: 0x000B, 20216 copyright: 0x00A9, 20217 copyrightsans: 0xF8E9, 20218 copyrightserif: 0xF6D9, 20219 cornerbracketleft: 0x300C, 20220 cornerbracketlefthalfwidth: 0xFF62, 20221 cornerbracketleftvertical: 0xFE41, 20222 cornerbracketright: 0x300D, 20223 cornerbracketrighthalfwidth: 0xFF63, 20224 cornerbracketrightvertical: 0xFE42, 20225 corporationsquare: 0x337F, 20226 cosquare: 0x33C7, 20227 coverkgsquare: 0x33C6, 20228 cparen: 0x249E, 20229 cruzeiro: 0x20A2, 20230 cstretched: 0x0297, 20231 curlyand: 0x22CF, 20232 curlyor: 0x22CE, 20233 currency: 0x00A4, 20234 cyrBreve: 0xF6D1, 20235 cyrFlex: 0xF6D2, 20236 cyrbreve: 0xF6D4, 20237 cyrflex: 0xF6D5, 20238 d: 0x0064, 20239 daarmenian: 0x0564, 20240 dabengali: 0x09A6, 20241 dadarabic: 0x0636, 20242 dadeva: 0x0926, 20243 dadfinalarabic: 0xFEBE, 20244 dadinitialarabic: 0xFEBF, 20245 dadmedialarabic: 0xFEC0, 20246 dagesh: 0x05BC, 20247 dageshhebrew: 0x05BC, 20248 dagger: 0x2020, 20249 daggerdbl: 0x2021, 20250 dagujarati: 0x0AA6, 20251 dagurmukhi: 0x0A26, 20252 dahiragana: 0x3060, 20253 dakatakana: 0x30C0, 20254 dalarabic: 0x062F, 20255 dalet: 0x05D3, 20256 daletdagesh: 0xFB33, 20257 daletdageshhebrew: 0xFB33, 20258 dalethebrew: 0x05D3, 20259 dalfinalarabic: 0xFEAA, 20260 dammaarabic: 0x064F, 20261 dammalowarabic: 0x064F, 20262 dammatanaltonearabic: 0x064C, 20263 dammatanarabic: 0x064C, 20264 danda: 0x0964, 20265 dargahebrew: 0x05A7, 20266 dargalefthebrew: 0x05A7, 20267 dasiapneumatacyrilliccmb: 0x0485, 20268 dblGrave: 0xF6D3, 20269 dblanglebracketleft: 0x300A, 20270 dblanglebracketleftvertical: 0xFE3D, 20271 dblanglebracketright: 0x300B, 20272 dblanglebracketrightvertical: 0xFE3E, 20273 dblarchinvertedbelowcmb: 0x032B, 20274 dblarrowleft: 0x21D4, 20275 dblarrowright: 0x21D2, 20276 dbldanda: 0x0965, 20277 dblgrave: 0xF6D6, 20278 dblgravecmb: 0x030F, 20279 dblintegral: 0x222C, 20280 dbllowline: 0x2017, 20281 dbllowlinecmb: 0x0333, 20282 dbloverlinecmb: 0x033F, 20283 dblprimemod: 0x02BA, 20284 dblverticalbar: 0x2016, 20285 dblverticallineabovecmb: 0x030E, 20286 dbopomofo: 0x3109, 20287 dbsquare: 0x33C8, 20288 dcaron: 0x010F, 20289 dcedilla: 0x1E11, 20290 dcircle: 0x24D3, 20291 dcircumflexbelow: 0x1E13, 20292 dcroat: 0x0111, 20293 ddabengali: 0x09A1, 20294 ddadeva: 0x0921, 20295 ddagujarati: 0x0AA1, 20296 ddagurmukhi: 0x0A21, 20297 ddalarabic: 0x0688, 20298 ddalfinalarabic: 0xFB89, 20299 dddhadeva: 0x095C, 20300 ddhabengali: 0x09A2, 20301 ddhadeva: 0x0922, 20302 ddhagujarati: 0x0AA2, 20303 ddhagurmukhi: 0x0A22, 20304 ddotaccent: 0x1E0B, 20305 ddotbelow: 0x1E0D, 20306 decimalseparatorarabic: 0x066B, 20307 decimalseparatorpersian: 0x066B, 20308 decyrillic: 0x0434, 20309 degree: 0x00B0, 20310 dehihebrew: 0x05AD, 20311 dehiragana: 0x3067, 20312 deicoptic: 0x03EF, 20313 dekatakana: 0x30C7, 20314 deleteleft: 0x232B, 20315 deleteright: 0x2326, 20316 delta: 0x03B4, 20317 deltaturned: 0x018D, 20318 denominatorminusonenumeratorbengali: 0x09F8, 20319 dezh: 0x02A4, 20320 dhabengali: 0x09A7, 20321 dhadeva: 0x0927, 20322 dhagujarati: 0x0AA7, 20323 dhagurmukhi: 0x0A27, 20324 dhook: 0x0257, 20325 dialytikatonos: 0x0385, 20326 dialytikatonoscmb: 0x0344, 20327 diamond: 0x2666, 20328 diamondsuitwhite: 0x2662, 20329 dieresis: 0x00A8, 20330 dieresisacute: 0xF6D7, 20331 dieresisbelowcmb: 0x0324, 20332 dieresiscmb: 0x0308, 20333 dieresisgrave: 0xF6D8, 20334 dieresistonos: 0x0385, 20335 dihiragana: 0x3062, 20336 dikatakana: 0x30C2, 20337 dittomark: 0x3003, 20338 divide: 0x00F7, 20339 divides: 0x2223, 20340 divisionslash: 0x2215, 20341 djecyrillic: 0x0452, 20342 dkshade: 0x2593, 20343 dlinebelow: 0x1E0F, 20344 dlsquare: 0x3397, 20345 dmacron: 0x0111, 20346 dmonospace: 0xFF44, 20347 dnblock: 0x2584, 20348 dochadathai: 0x0E0E, 20349 dodekthai: 0x0E14, 20350 dohiragana: 0x3069, 20351 dokatakana: 0x30C9, 20352 dollar: 0x0024, 20353 dollarinferior: 0xF6E3, 20354 dollarmonospace: 0xFF04, 20355 dollaroldstyle: 0xF724, 20356 dollarsmall: 0xFE69, 20357 dollarsuperior: 0xF6E4, 20358 dong: 0x20AB, 20359 dorusquare: 0x3326, 20360 dotaccent: 0x02D9, 20361 dotaccentcmb: 0x0307, 20362 dotbelowcmb: 0x0323, 20363 dotbelowcomb: 0x0323, 20364 dotkatakana: 0x30FB, 20365 dotlessi: 0x0131, 20366 dotlessj: 0xF6BE, 20367 dotlessjstrokehook: 0x0284, 20368 dotmath: 0x22C5, 20369 dottedcircle: 0x25CC, 20370 doubleyodpatah: 0xFB1F, 20371 doubleyodpatahhebrew: 0xFB1F, 20372 downtackbelowcmb: 0x031E, 20373 downtackmod: 0x02D5, 20374 dparen: 0x249F, 20375 dsuperior: 0xF6EB, 20376 dtail: 0x0256, 20377 dtopbar: 0x018C, 20378 duhiragana: 0x3065, 20379 dukatakana: 0x30C5, 20380 dz: 0x01F3, 20381 dzaltone: 0x02A3, 20382 dzcaron: 0x01C6, 20383 dzcurl: 0x02A5, 20384 dzeabkhasiancyrillic: 0x04E1, 20385 dzecyrillic: 0x0455, 20386 dzhecyrillic: 0x045F, 20387 e: 0x0065, 20388 eacute: 0x00E9, 20389 earth: 0x2641, 20390 ebengali: 0x098F, 20391 ebopomofo: 0x311C, 20392 ebreve: 0x0115, 20393 ecandradeva: 0x090D, 20394 ecandragujarati: 0x0A8D, 20395 ecandravowelsigndeva: 0x0945, 20396 ecandravowelsigngujarati: 0x0AC5, 20397 ecaron: 0x011B, 20398 ecedillabreve: 0x1E1D, 20399 echarmenian: 0x0565, 20400 echyiwnarmenian: 0x0587, 20401 ecircle: 0x24D4, 20402 ecircumflex: 0x00EA, 20403 ecircumflexacute: 0x1EBF, 20404 ecircumflexbelow: 0x1E19, 20405 ecircumflexdotbelow: 0x1EC7, 20406 ecircumflexgrave: 0x1EC1, 20407 ecircumflexhookabove: 0x1EC3, 20408 ecircumflextilde: 0x1EC5, 20409 ecyrillic: 0x0454, 20410 edblgrave: 0x0205, 20411 edeva: 0x090F, 20412 edieresis: 0x00EB, 20413 edot: 0x0117, 20414 edotaccent: 0x0117, 20415 edotbelow: 0x1EB9, 20416 eegurmukhi: 0x0A0F, 20417 eematragurmukhi: 0x0A47, 20418 efcyrillic: 0x0444, 20419 egrave: 0x00E8, 20420 egujarati: 0x0A8F, 20421 eharmenian: 0x0567, 20422 ehbopomofo: 0x311D, 20423 ehiragana: 0x3048, 20424 ehookabove: 0x1EBB, 20425 eibopomofo: 0x311F, 20426 eight: 0x0038, 20427 eightarabic: 0x0668, 20428 eightbengali: 0x09EE, 20429 eightcircle: 0x2467, 20430 eightcircleinversesansserif: 0x2791, 20431 eightdeva: 0x096E, 20432 eighteencircle: 0x2471, 20433 eighteenparen: 0x2485, 20434 eighteenperiod: 0x2499, 20435 eightgujarati: 0x0AEE, 20436 eightgurmukhi: 0x0A6E, 20437 eighthackarabic: 0x0668, 20438 eighthangzhou: 0x3028, 20439 eighthnotebeamed: 0x266B, 20440 eightideographicparen: 0x3227, 20441 eightinferior: 0x2088, 20442 eightmonospace: 0xFF18, 20443 eightoldstyle: 0xF738, 20444 eightparen: 0x247B, 20445 eightperiod: 0x248F, 20446 eightpersian: 0x06F8, 20447 eightroman: 0x2177, 20448 eightsuperior: 0x2078, 20449 eightthai: 0x0E58, 20450 einvertedbreve: 0x0207, 20451 eiotifiedcyrillic: 0x0465, 20452 ekatakana: 0x30A8, 20453 ekatakanahalfwidth: 0xFF74, 20454 ekonkargurmukhi: 0x0A74, 20455 ekorean: 0x3154, 20456 elcyrillic: 0x043B, 20457 element: 0x2208, 20458 elevencircle: 0x246A, 20459 elevenparen: 0x247E, 20460 elevenperiod: 0x2492, 20461 elevenroman: 0x217A, 20462 ellipsis: 0x2026, 20463 ellipsisvertical: 0x22EE, 20464 emacron: 0x0113, 20465 emacronacute: 0x1E17, 20466 emacrongrave: 0x1E15, 20467 emcyrillic: 0x043C, 20468 emdash: 0x2014, 20469 emdashvertical: 0xFE31, 20470 emonospace: 0xFF45, 20471 emphasismarkarmenian: 0x055B, 20472 emptyset: 0x2205, 20473 enbopomofo: 0x3123, 20474 encyrillic: 0x043D, 20475 endash: 0x2013, 20476 endashvertical: 0xFE32, 20477 endescendercyrillic: 0x04A3, 20478 eng: 0x014B, 20479 engbopomofo: 0x3125, 20480 enghecyrillic: 0x04A5, 20481 enhookcyrillic: 0x04C8, 20482 enspace: 0x2002, 20483 eogonek: 0x0119, 20484 eokorean: 0x3153, 20485 eopen: 0x025B, 20486 eopenclosed: 0x029A, 20487 eopenreversed: 0x025C, 20488 eopenreversedclosed: 0x025E, 20489 eopenreversedhook: 0x025D, 20490 eparen: 0x24A0, 20491 epsilon: 0x03B5, 20492 epsilontonos: 0x03AD, 20493 equal: 0x003D, 20494 equalmonospace: 0xFF1D, 20495 equalsmall: 0xFE66, 20496 equalsuperior: 0x207C, 20497 equivalence: 0x2261, 20498 erbopomofo: 0x3126, 20499 ercyrillic: 0x0440, 20500 ereversed: 0x0258, 20501 ereversedcyrillic: 0x044D, 20502 escyrillic: 0x0441, 20503 esdescendercyrillic: 0x04AB, 20504 esh: 0x0283, 20505 eshcurl: 0x0286, 20506 eshortdeva: 0x090E, 20507 eshortvowelsigndeva: 0x0946, 20508 eshreversedloop: 0x01AA, 20509 eshsquatreversed: 0x0285, 20510 esmallhiragana: 0x3047, 20511 esmallkatakana: 0x30A7, 20512 esmallkatakanahalfwidth: 0xFF6A, 20513 estimated: 0x212E, 20514 esuperior: 0xF6EC, 20515 eta: 0x03B7, 20516 etarmenian: 0x0568, 20517 etatonos: 0x03AE, 20518 eth: 0x00F0, 20519 etilde: 0x1EBD, 20520 etildebelow: 0x1E1B, 20521 etnahtafoukhhebrew: 0x0591, 20522 etnahtafoukhlefthebrew: 0x0591, 20523 etnahtahebrew: 0x0591, 20524 etnahtalefthebrew: 0x0591, 20525 eturned: 0x01DD, 20526 eukorean: 0x3161, 20527 euro: 0x20AC, 20528 evowelsignbengali: 0x09C7, 20529 evowelsigndeva: 0x0947, 20530 evowelsigngujarati: 0x0AC7, 20531 exclam: 0x0021, 20532 exclamarmenian: 0x055C, 20533 exclamdbl: 0x203C, 20534 exclamdown: 0x00A1, 20535 exclamdownsmall: 0xF7A1, 20536 exclammonospace: 0xFF01, 20537 exclamsmall: 0xF721, 20538 existential: 0x2203, 20539 ezh: 0x0292, 20540 ezhcaron: 0x01EF, 20541 ezhcurl: 0x0293, 20542 ezhreversed: 0x01B9, 20543 ezhtail: 0x01BA, 20544 f: 0x0066, 20545 fadeva: 0x095E, 20546 fagurmukhi: 0x0A5E, 20547 fahrenheit: 0x2109, 20548 fathaarabic: 0x064E, 20549 fathalowarabic: 0x064E, 20550 fathatanarabic: 0x064B, 20551 fbopomofo: 0x3108, 20552 fcircle: 0x24D5, 20553 fdotaccent: 0x1E1F, 20554 feharabic: 0x0641, 20555 feharmenian: 0x0586, 20556 fehfinalarabic: 0xFED2, 20557 fehinitialarabic: 0xFED3, 20558 fehmedialarabic: 0xFED4, 20559 feicoptic: 0x03E5, 20560 female: 0x2640, 20561 ff: 0xFB00, 20562 ffi: 0xFB03, 20563 ffl: 0xFB04, 20564 fi: 0xFB01, 20565 fifteencircle: 0x246E, 20566 fifteenparen: 0x2482, 20567 fifteenperiod: 0x2496, 20568 figuredash: 0x2012, 20569 filledbox: 0x25A0, 20570 filledrect: 0x25AC, 20571 finalkaf: 0x05DA, 20572 finalkafdagesh: 0xFB3A, 20573 finalkafdageshhebrew: 0xFB3A, 20574 finalkafhebrew: 0x05DA, 20575 finalmem: 0x05DD, 20576 finalmemhebrew: 0x05DD, 20577 finalnun: 0x05DF, 20578 finalnunhebrew: 0x05DF, 20579 finalpe: 0x05E3, 20580 finalpehebrew: 0x05E3, 20581 finaltsadi: 0x05E5, 20582 finaltsadihebrew: 0x05E5, 20583 firsttonechinese: 0x02C9, 20584 fisheye: 0x25C9, 20585 fitacyrillic: 0x0473, 20586 five: 0x0035, 20587 fivearabic: 0x0665, 20588 fivebengali: 0x09EB, 20589 fivecircle: 0x2464, 20590 fivecircleinversesansserif: 0x278E, 20591 fivedeva: 0x096B, 20592 fiveeighths: 0x215D, 20593 fivegujarati: 0x0AEB, 20594 fivegurmukhi: 0x0A6B, 20595 fivehackarabic: 0x0665, 20596 fivehangzhou: 0x3025, 20597 fiveideographicparen: 0x3224, 20598 fiveinferior: 0x2085, 20599 fivemonospace: 0xFF15, 20600 fiveoldstyle: 0xF735, 20601 fiveparen: 0x2478, 20602 fiveperiod: 0x248C, 20603 fivepersian: 0x06F5, 20604 fiveroman: 0x2174, 20605 fivesuperior: 0x2075, 20606 fivethai: 0x0E55, 20607 fl: 0xFB02, 20608 florin: 0x0192, 20609 fmonospace: 0xFF46, 20610 fmsquare: 0x3399, 20611 fofanthai: 0x0E1F, 20612 fofathai: 0x0E1D, 20613 fongmanthai: 0x0E4F, 20614 forall: 0x2200, 20615 four: 0x0034, 20616 fourarabic: 0x0664, 20617 fourbengali: 0x09EA, 20618 fourcircle: 0x2463, 20619 fourcircleinversesansserif: 0x278D, 20620 fourdeva: 0x096A, 20621 fourgujarati: 0x0AEA, 20622 fourgurmukhi: 0x0A6A, 20623 fourhackarabic: 0x0664, 20624 fourhangzhou: 0x3024, 20625 fourideographicparen: 0x3223, 20626 fourinferior: 0x2084, 20627 fourmonospace: 0xFF14, 20628 fournumeratorbengali: 0x09F7, 20629 fouroldstyle: 0xF734, 20630 fourparen: 0x2477, 20631 fourperiod: 0x248B, 20632 fourpersian: 0x06F4, 20633 fourroman: 0x2173, 20634 foursuperior: 0x2074, 20635 fourteencircle: 0x246D, 20636 fourteenparen: 0x2481, 20637 fourteenperiod: 0x2495, 20638 fourthai: 0x0E54, 20639 fourthtonechinese: 0x02CB, 20640 fparen: 0x24A1, 20641 fraction: 0x2044, 20642 franc: 0x20A3, 20643 g: 0x0067, 20644 gabengali: 0x0997, 20645 gacute: 0x01F5, 20646 gadeva: 0x0917, 20647 gafarabic: 0x06AF, 20648 gaffinalarabic: 0xFB93, 20649 gafinitialarabic: 0xFB94, 20650 gafmedialarabic: 0xFB95, 20651 gagujarati: 0x0A97, 20652 gagurmukhi: 0x0A17, 20653 gahiragana: 0x304C, 20654 gakatakana: 0x30AC, 20655 gamma: 0x03B3, 20656 gammalatinsmall: 0x0263, 20657 gammasuperior: 0x02E0, 20658 gangiacoptic: 0x03EB, 20659 gbopomofo: 0x310D, 20660 gbreve: 0x011F, 20661 gcaron: 0x01E7, 20662 gcedilla: 0x0123, 20663 gcircle: 0x24D6, 20664 gcircumflex: 0x011D, 20665 gcommaaccent: 0x0123, 20666 gdot: 0x0121, 20667 gdotaccent: 0x0121, 20668 gecyrillic: 0x0433, 20669 gehiragana: 0x3052, 20670 gekatakana: 0x30B2, 20671 geometricallyequal: 0x2251, 20672 gereshaccenthebrew: 0x059C, 20673 gereshhebrew: 0x05F3, 20674 gereshmuqdamhebrew: 0x059D, 20675 germandbls: 0x00DF, 20676 gershayimaccenthebrew: 0x059E, 20677 gershayimhebrew: 0x05F4, 20678 getamark: 0x3013, 20679 ghabengali: 0x0998, 20680 ghadarmenian: 0x0572, 20681 ghadeva: 0x0918, 20682 ghagujarati: 0x0A98, 20683 ghagurmukhi: 0x0A18, 20684 ghainarabic: 0x063A, 20685 ghainfinalarabic: 0xFECE, 20686 ghaininitialarabic: 0xFECF, 20687 ghainmedialarabic: 0xFED0, 20688 ghemiddlehookcyrillic: 0x0495, 20689 ghestrokecyrillic: 0x0493, 20690 gheupturncyrillic: 0x0491, 20691 ghhadeva: 0x095A, 20692 ghhagurmukhi: 0x0A5A, 20693 ghook: 0x0260, 20694 ghzsquare: 0x3393, 20695 gihiragana: 0x304E, 20696 gikatakana: 0x30AE, 20697 gimarmenian: 0x0563, 20698 gimel: 0x05D2, 20699 gimeldagesh: 0xFB32, 20700 gimeldageshhebrew: 0xFB32, 20701 gimelhebrew: 0x05D2, 20702 gjecyrillic: 0x0453, 20703 glottalinvertedstroke: 0x01BE, 20704 glottalstop: 0x0294, 20705 glottalstopinverted: 0x0296, 20706 glottalstopmod: 0x02C0, 20707 glottalstopreversed: 0x0295, 20708 glottalstopreversedmod: 0x02C1, 20709 glottalstopreversedsuperior: 0x02E4, 20710 glottalstopstroke: 0x02A1, 20711 glottalstopstrokereversed: 0x02A2, 20712 gmacron: 0x1E21, 20713 gmonospace: 0xFF47, 20714 gohiragana: 0x3054, 20715 gokatakana: 0x30B4, 20716 gparen: 0x24A2, 20717 gpasquare: 0x33AC, 20718 gradient: 0x2207, 20719 grave: 0x0060, 20720 gravebelowcmb: 0x0316, 20721 gravecmb: 0x0300, 20722 gravecomb: 0x0300, 20723 gravedeva: 0x0953, 20724 gravelowmod: 0x02CE, 20725 gravemonospace: 0xFF40, 20726 gravetonecmb: 0x0340, 20727 greater: 0x003E, 20728 greaterequal: 0x2265, 20729 greaterequalorless: 0x22DB, 20730 greatermonospace: 0xFF1E, 20731 greaterorequivalent: 0x2273, 20732 greaterorless: 0x2277, 20733 greateroverequal: 0x2267, 20734 greatersmall: 0xFE65, 20735 gscript: 0x0261, 20736 gstroke: 0x01E5, 20737 guhiragana: 0x3050, 20738 guillemotleft: 0x00AB, 20739 guillemotright: 0x00BB, 20740 guilsinglleft: 0x2039, 20741 guilsinglright: 0x203A, 20742 gukatakana: 0x30B0, 20743 guramusquare: 0x3318, 20744 gysquare: 0x33C9, 20745 h: 0x0068, 20746 haabkhasiancyrillic: 0x04A9, 20747 haaltonearabic: 0x06C1, 20748 habengali: 0x09B9, 20749 hadescendercyrillic: 0x04B3, 20750 hadeva: 0x0939, 20751 hagujarati: 0x0AB9, 20752 hagurmukhi: 0x0A39, 20753 haharabic: 0x062D, 20754 hahfinalarabic: 0xFEA2, 20755 hahinitialarabic: 0xFEA3, 20756 hahiragana: 0x306F, 20757 hahmedialarabic: 0xFEA4, 20758 haitusquare: 0x332A, 20759 hakatakana: 0x30CF, 20760 hakatakanahalfwidth: 0xFF8A, 20761 halantgurmukhi: 0x0A4D, 20762 hamzaarabic: 0x0621, 20763 hamzalowarabic: 0x0621, 20764 hangulfiller: 0x3164, 20765 hardsigncyrillic: 0x044A, 20766 harpoonleftbarbup: 0x21BC, 20767 harpoonrightbarbup: 0x21C0, 20768 hasquare: 0x33CA, 20769 hatafpatah: 0x05B2, 20770 hatafpatah16: 0x05B2, 20771 hatafpatah23: 0x05B2, 20772 hatafpatah2f: 0x05B2, 20773 hatafpatahhebrew: 0x05B2, 20774 hatafpatahnarrowhebrew: 0x05B2, 20775 hatafpatahquarterhebrew: 0x05B2, 20776 hatafpatahwidehebrew: 0x05B2, 20777 hatafqamats: 0x05B3, 20778 hatafqamats1b: 0x05B3, 20779 hatafqamats28: 0x05B3, 20780 hatafqamats34: 0x05B3, 20781 hatafqamatshebrew: 0x05B3, 20782 hatafqamatsnarrowhebrew: 0x05B3, 20783 hatafqamatsquarterhebrew: 0x05B3, 20784 hatafqamatswidehebrew: 0x05B3, 20785 hatafsegol: 0x05B1, 20786 hatafsegol17: 0x05B1, 20787 hatafsegol24: 0x05B1, 20788 hatafsegol30: 0x05B1, 20789 hatafsegolhebrew: 0x05B1, 20790 hatafsegolnarrowhebrew: 0x05B1, 20791 hatafsegolquarterhebrew: 0x05B1, 20792 hatafsegolwidehebrew: 0x05B1, 20793 hbar: 0x0127, 20794 hbopomofo: 0x310F, 20795 hbrevebelow: 0x1E2B, 20796 hcedilla: 0x1E29, 20797 hcircle: 0x24D7, 20798 hcircumflex: 0x0125, 20799 hdieresis: 0x1E27, 20800 hdotaccent: 0x1E23, 20801 hdotbelow: 0x1E25, 20802 he: 0x05D4, 20803 heart: 0x2665, 20804 heartsuitblack: 0x2665, 20805 heartsuitwhite: 0x2661, 20806 hedagesh: 0xFB34, 20807 hedageshhebrew: 0xFB34, 20808 hehaltonearabic: 0x06C1, 20809 heharabic: 0x0647, 20810 hehebrew: 0x05D4, 20811 hehfinalaltonearabic: 0xFBA7, 20812 hehfinalalttwoarabic: 0xFEEA, 20813 hehfinalarabic: 0xFEEA, 20814 hehhamzaabovefinalarabic: 0xFBA5, 20815 hehhamzaaboveisolatedarabic: 0xFBA4, 20816 hehinitialaltonearabic: 0xFBA8, 20817 hehinitialarabic: 0xFEEB, 20818 hehiragana: 0x3078, 20819 hehmedialaltonearabic: 0xFBA9, 20820 hehmedialarabic: 0xFEEC, 20821 heiseierasquare: 0x337B, 20822 hekatakana: 0x30D8, 20823 hekatakanahalfwidth: 0xFF8D, 20824 hekutaarusquare: 0x3336, 20825 henghook: 0x0267, 20826 herutusquare: 0x3339, 20827 het: 0x05D7, 20828 hethebrew: 0x05D7, 20829 hhook: 0x0266, 20830 hhooksuperior: 0x02B1, 20831 hieuhacirclekorean: 0x327B, 20832 hieuhaparenkorean: 0x321B, 20833 hieuhcirclekorean: 0x326D, 20834 hieuhkorean: 0x314E, 20835 hieuhparenkorean: 0x320D, 20836 hihiragana: 0x3072, 20837 hikatakana: 0x30D2, 20838 hikatakanahalfwidth: 0xFF8B, 20839 hiriq: 0x05B4, 20840 hiriq14: 0x05B4, 20841 hiriq21: 0x05B4, 20842 hiriq2d: 0x05B4, 20843 hiriqhebrew: 0x05B4, 20844 hiriqnarrowhebrew: 0x05B4, 20845 hiriqquarterhebrew: 0x05B4, 20846 hiriqwidehebrew: 0x05B4, 20847 hlinebelow: 0x1E96, 20848 hmonospace: 0xFF48, 20849 hoarmenian: 0x0570, 20850 hohipthai: 0x0E2B, 20851 hohiragana: 0x307B, 20852 hokatakana: 0x30DB, 20853 hokatakanahalfwidth: 0xFF8E, 20854 holam: 0x05B9, 20855 holam19: 0x05B9, 20856 holam26: 0x05B9, 20857 holam32: 0x05B9, 20858 holamhebrew: 0x05B9, 20859 holamnarrowhebrew: 0x05B9, 20860 holamquarterhebrew: 0x05B9, 20861 holamwidehebrew: 0x05B9, 20862 honokhukthai: 0x0E2E, 20863 hookabovecomb: 0x0309, 20864 hookcmb: 0x0309, 20865 hookpalatalizedbelowcmb: 0x0321, 20866 hookretroflexbelowcmb: 0x0322, 20867 hoonsquare: 0x3342, 20868 horicoptic: 0x03E9, 20869 horizontalbar: 0x2015, 20870 horncmb: 0x031B, 20871 hotsprings: 0x2668, 20872 house: 0x2302, 20873 hparen: 0x24A3, 20874 hsuperior: 0x02B0, 20875 hturned: 0x0265, 20876 huhiragana: 0x3075, 20877 huiitosquare: 0x3333, 20878 hukatakana: 0x30D5, 20879 hukatakanahalfwidth: 0xFF8C, 20880 hungarumlaut: 0x02DD, 20881 hungarumlautcmb: 0x030B, 20882 hv: 0x0195, 20883 hyphen: 0x002D, 20884 hypheninferior: 0xF6E5, 20885 hyphenmonospace: 0xFF0D, 20886 hyphensmall: 0xFE63, 20887 hyphensuperior: 0xF6E6, 20888 hyphentwo: 0x2010, 20889 i: 0x0069, 20890 iacute: 0x00ED, 20891 iacyrillic: 0x044F, 20892 ibengali: 0x0987, 20893 ibopomofo: 0x3127, 20894 ibreve: 0x012D, 20895 icaron: 0x01D0, 20896 icircle: 0x24D8, 20897 icircumflex: 0x00EE, 20898 icyrillic: 0x0456, 20899 idblgrave: 0x0209, 20900 ideographearthcircle: 0x328F, 20901 ideographfirecircle: 0x328B, 20902 ideographicallianceparen: 0x323F, 20903 ideographiccallparen: 0x323A, 20904 ideographiccentrecircle: 0x32A5, 20905 ideographicclose: 0x3006, 20906 ideographiccomma: 0x3001, 20907 ideographiccommaleft: 0xFF64, 20908 ideographiccongratulationparen: 0x3237, 20909 ideographiccorrectcircle: 0x32A3, 20910 ideographicearthparen: 0x322F, 20911 ideographicenterpriseparen: 0x323D, 20912 ideographicexcellentcircle: 0x329D, 20913 ideographicfestivalparen: 0x3240, 20914 ideographicfinancialcircle: 0x3296, 20915 ideographicfinancialparen: 0x3236, 20916 ideographicfireparen: 0x322B, 20917 ideographichaveparen: 0x3232, 20918 ideographichighcircle: 0x32A4, 20919 ideographiciterationmark: 0x3005, 20920 ideographiclaborcircle: 0x3298, 20921 ideographiclaborparen: 0x3238, 20922 ideographicleftcircle: 0x32A7, 20923 ideographiclowcircle: 0x32A6, 20924 ideographicmedicinecircle: 0x32A9, 20925 ideographicmetalparen: 0x322E, 20926 ideographicmoonparen: 0x322A, 20927 ideographicnameparen: 0x3234, 20928 ideographicperiod: 0x3002, 20929 ideographicprintcircle: 0x329E, 20930 ideographicreachparen: 0x3243, 20931 ideographicrepresentparen: 0x3239, 20932 ideographicresourceparen: 0x323E, 20933 ideographicrightcircle: 0x32A8, 20934 ideographicsecretcircle: 0x3299, 20935 ideographicselfparen: 0x3242, 20936 ideographicsocietyparen: 0x3233, 20937 ideographicspace: 0x3000, 20938 ideographicspecialparen: 0x3235, 20939 ideographicstockparen: 0x3231, 20940 ideographicstudyparen: 0x323B, 20941 ideographicsunparen: 0x3230, 20942 ideographicsuperviseparen: 0x323C, 20943 ideographicwaterparen: 0x322C, 20944 ideographicwoodparen: 0x322D, 20945 ideographiczero: 0x3007, 20946 ideographmetalcircle: 0x328E, 20947 ideographmooncircle: 0x328A, 20948 ideographnamecircle: 0x3294, 20949 ideographsuncircle: 0x3290, 20950 ideographwatercircle: 0x328C, 20951 ideographwoodcircle: 0x328D, 20952 ideva: 0x0907, 20953 idieresis: 0x00EF, 20954 idieresisacute: 0x1E2F, 20955 idieresiscyrillic: 0x04E5, 20956 idotbelow: 0x1ECB, 20957 iebrevecyrillic: 0x04D7, 20958 iecyrillic: 0x0435, 20959 ieungacirclekorean: 0x3275, 20960 ieungaparenkorean: 0x3215, 20961 ieungcirclekorean: 0x3267, 20962 ieungkorean: 0x3147, 20963 ieungparenkorean: 0x3207, 20964 igrave: 0x00EC, 20965 igujarati: 0x0A87, 20966 igurmukhi: 0x0A07, 20967 ihiragana: 0x3044, 20968 ihookabove: 0x1EC9, 20969 iibengali: 0x0988, 20970 iicyrillic: 0x0438, 20971 iideva: 0x0908, 20972 iigujarati: 0x0A88, 20973 iigurmukhi: 0x0A08, 20974 iimatragurmukhi: 0x0A40, 20975 iinvertedbreve: 0x020B, 20976 iishortcyrillic: 0x0439, 20977 iivowelsignbengali: 0x09C0, 20978 iivowelsigndeva: 0x0940, 20979 iivowelsigngujarati: 0x0AC0, 20980 ij: 0x0133, 20981 ikatakana: 0x30A4, 20982 ikatakanahalfwidth: 0xFF72, 20983 ikorean: 0x3163, 20984 ilde: 0x02DC, 20985 iluyhebrew: 0x05AC, 20986 imacron: 0x012B, 20987 imacroncyrillic: 0x04E3, 20988 imageorapproximatelyequal: 0x2253, 20989 imatragurmukhi: 0x0A3F, 20990 imonospace: 0xFF49, 20991 increment: 0x2206, 20992 infinity: 0x221E, 20993 iniarmenian: 0x056B, 20994 integral: 0x222B, 20995 integralbottom: 0x2321, 20996 integralbt: 0x2321, 20997 integralex: 0xF8F5, 20998 integraltop: 0x2320, 20999 integraltp: 0x2320, 21000 intersection: 0x2229, 21001 intisquare: 0x3305, 21002 invbullet: 0x25D8, 21003 invcircle: 0x25D9, 21004 invsmileface: 0x263B, 21005 iocyrillic: 0x0451, 21006 iogonek: 0x012F, 21007 iota: 0x03B9, 21008 iotadieresis: 0x03CA, 21009 iotadieresistonos: 0x0390, 21010 iotalatin: 0x0269, 21011 iotatonos: 0x03AF, 21012 iparen: 0x24A4, 21013 irigurmukhi: 0x0A72, 21014 ismallhiragana: 0x3043, 21015 ismallkatakana: 0x30A3, 21016 ismallkatakanahalfwidth: 0xFF68, 21017 issharbengali: 0x09FA, 21018 istroke: 0x0268, 21019 isuperior: 0xF6ED, 21020 iterationhiragana: 0x309D, 21021 iterationkatakana: 0x30FD, 21022 itilde: 0x0129, 21023 itildebelow: 0x1E2D, 21024 iubopomofo: 0x3129, 21025 iucyrillic: 0x044E, 21026 ivowelsignbengali: 0x09BF, 21027 ivowelsigndeva: 0x093F, 21028 ivowelsigngujarati: 0x0ABF, 21029 izhitsacyrillic: 0x0475, 21030 izhitsadblgravecyrillic: 0x0477, 21031 j: 0x006A, 21032 jaarmenian: 0x0571, 21033 jabengali: 0x099C, 21034 jadeva: 0x091C, 21035 jagujarati: 0x0A9C, 21036 jagurmukhi: 0x0A1C, 21037 jbopomofo: 0x3110, 21038 jcaron: 0x01F0, 21039 jcircle: 0x24D9, 21040 jcircumflex: 0x0135, 21041 jcrossedtail: 0x029D, 21042 jdotlessstroke: 0x025F, 21043 jecyrillic: 0x0458, 21044 jeemarabic: 0x062C, 21045 jeemfinalarabic: 0xFE9E, 21046 jeeminitialarabic: 0xFE9F, 21047 jeemmedialarabic: 0xFEA0, 21048 jeharabic: 0x0698, 21049 jehfinalarabic: 0xFB8B, 21050 jhabengali: 0x099D, 21051 jhadeva: 0x091D, 21052 jhagujarati: 0x0A9D, 21053 jhagurmukhi: 0x0A1D, 21054 jheharmenian: 0x057B, 21055 jis: 0x3004, 21056 jmonospace: 0xFF4A, 21057 jparen: 0x24A5, 21058 jsuperior: 0x02B2, 21059 k: 0x006B, 21060 kabashkircyrillic: 0x04A1, 21061 kabengali: 0x0995, 21062 kacute: 0x1E31, 21063 kacyrillic: 0x043A, 21064 kadescendercyrillic: 0x049B, 21065 kadeva: 0x0915, 21066 kaf: 0x05DB, 21067 kafarabic: 0x0643, 21068 kafdagesh: 0xFB3B, 21069 kafdageshhebrew: 0xFB3B, 21070 kaffinalarabic: 0xFEDA, 21071 kafhebrew: 0x05DB, 21072 kafinitialarabic: 0xFEDB, 21073 kafmedialarabic: 0xFEDC, 21074 kafrafehebrew: 0xFB4D, 21075 kagujarati: 0x0A95, 21076 kagurmukhi: 0x0A15, 21077 kahiragana: 0x304B, 21078 kahookcyrillic: 0x04C4, 21079 kakatakana: 0x30AB, 21080 kakatakanahalfwidth: 0xFF76, 21081 kappa: 0x03BA, 21082 kappasymbolgreek: 0x03F0, 21083 kapyeounmieumkorean: 0x3171, 21084 kapyeounphieuphkorean: 0x3184, 21085 kapyeounpieupkorean: 0x3178, 21086 kapyeounssangpieupkorean: 0x3179, 21087 karoriisquare: 0x330D, 21088 kashidaautoarabic: 0x0640, 21089 kashidaautonosidebearingarabic: 0x0640, 21090 kasmallkatakana: 0x30F5, 21091 kasquare: 0x3384, 21092 kasraarabic: 0x0650, 21093 kasratanarabic: 0x064D, 21094 kastrokecyrillic: 0x049F, 21095 katahiraprolongmarkhalfwidth: 0xFF70, 21096 kaverticalstrokecyrillic: 0x049D, 21097 kbopomofo: 0x310E, 21098 kcalsquare: 0x3389, 21099 kcaron: 0x01E9, 21100 kcedilla: 0x0137, 21101 kcircle: 0x24DA, 21102 kcommaaccent: 0x0137, 21103 kdotbelow: 0x1E33, 21104 keharmenian: 0x0584, 21105 kehiragana: 0x3051, 21106 kekatakana: 0x30B1, 21107 kekatakanahalfwidth: 0xFF79, 21108 kenarmenian: 0x056F, 21109 kesmallkatakana: 0x30F6, 21110 kgreenlandic: 0x0138, 21111 khabengali: 0x0996, 21112 khacyrillic: 0x0445, 21113 khadeva: 0x0916, 21114 khagujarati: 0x0A96, 21115 khagurmukhi: 0x0A16, 21116 khaharabic: 0x062E, 21117 khahfinalarabic: 0xFEA6, 21118 khahinitialarabic: 0xFEA7, 21119 khahmedialarabic: 0xFEA8, 21120 kheicoptic: 0x03E7, 21121 khhadeva: 0x0959, 21122 khhagurmukhi: 0x0A59, 21123 khieukhacirclekorean: 0x3278, 21124 khieukhaparenkorean: 0x3218, 21125 khieukhcirclekorean: 0x326A, 21126 khieukhkorean: 0x314B, 21127 khieukhparenkorean: 0x320A, 21128 khokhaithai: 0x0E02, 21129 khokhonthai: 0x0E05, 21130 khokhuatthai: 0x0E03, 21131 khokhwaithai: 0x0E04, 21132 khomutthai: 0x0E5B, 21133 khook: 0x0199, 21134 khorakhangthai: 0x0E06, 21135 khzsquare: 0x3391, 21136 kihiragana: 0x304D, 21137 kikatakana: 0x30AD, 21138 kikatakanahalfwidth: 0xFF77, 21139 kiroguramusquare: 0x3315, 21140 kiromeetorusquare: 0x3316, 21141 kirosquare: 0x3314, 21142 kiyeokacirclekorean: 0x326E, 21143 kiyeokaparenkorean: 0x320E, 21144 kiyeokcirclekorean: 0x3260, 21145 kiyeokkorean: 0x3131, 21146 kiyeokparenkorean: 0x3200, 21147 kiyeoksioskorean: 0x3133, 21148 kjecyrillic: 0x045C, 21149 klinebelow: 0x1E35, 21150 klsquare: 0x3398, 21151 kmcubedsquare: 0x33A6, 21152 kmonospace: 0xFF4B, 21153 kmsquaredsquare: 0x33A2, 21154 kohiragana: 0x3053, 21155 kohmsquare: 0x33C0, 21156 kokaithai: 0x0E01, 21157 kokatakana: 0x30B3, 21158 kokatakanahalfwidth: 0xFF7A, 21159 kooposquare: 0x331E, 21160 koppacyrillic: 0x0481, 21161 koreanstandardsymbol: 0x327F, 21162 koroniscmb: 0x0343, 21163 kparen: 0x24A6, 21164 kpasquare: 0x33AA, 21165 ksicyrillic: 0x046F, 21166 ktsquare: 0x33CF, 21167 kturned: 0x029E, 21168 kuhiragana: 0x304F, 21169 kukatakana: 0x30AF, 21170 kukatakanahalfwidth: 0xFF78, 21171 kvsquare: 0x33B8, 21172 kwsquare: 0x33BE, 21173 l: 0x006C, 21174 labengali: 0x09B2, 21175 lacute: 0x013A, 21176 ladeva: 0x0932, 21177 lagujarati: 0x0AB2, 21178 lagurmukhi: 0x0A32, 21179 lakkhangyaothai: 0x0E45, 21180 lamaleffinalarabic: 0xFEFC, 21181 lamalefhamzaabovefinalarabic: 0xFEF8, 21182 lamalefhamzaaboveisolatedarabic: 0xFEF7, 21183 lamalefhamzabelowfinalarabic: 0xFEFA, 21184 lamalefhamzabelowisolatedarabic: 0xFEF9, 21185 lamalefisolatedarabic: 0xFEFB, 21186 lamalefmaddaabovefinalarabic: 0xFEF6, 21187 lamalefmaddaaboveisolatedarabic: 0xFEF5, 21188 lamarabic: 0x0644, 21189 lambda: 0x03BB, 21190 lambdastroke: 0x019B, 21191 lamed: 0x05DC, 21192 lameddagesh: 0xFB3C, 21193 lameddageshhebrew: 0xFB3C, 21194 lamedhebrew: 0x05DC, 21195 lamfinalarabic: 0xFEDE, 21196 lamhahinitialarabic: 0xFCCA, 21197 laminitialarabic: 0xFEDF, 21198 lamjeeminitialarabic: 0xFCC9, 21199 lamkhahinitialarabic: 0xFCCB, 21200 lamlamhehisolatedarabic: 0xFDF2, 21201 lammedialarabic: 0xFEE0, 21202 lammeemhahinitialarabic: 0xFD88, 21203 lammeeminitialarabic: 0xFCCC, 21204 largecircle: 0x25EF, 21205 lbar: 0x019A, 21206 lbelt: 0x026C, 21207 lbopomofo: 0x310C, 21208 lcaron: 0x013E, 21209 lcedilla: 0x013C, 21210 lcircle: 0x24DB, 21211 lcircumflexbelow: 0x1E3D, 21212 lcommaaccent: 0x013C, 21213 ldot: 0x0140, 21214 ldotaccent: 0x0140, 21215 ldotbelow: 0x1E37, 21216 ldotbelowmacron: 0x1E39, 21217 leftangleabovecmb: 0x031A, 21218 lefttackbelowcmb: 0x0318, 21219 less: 0x003C, 21220 lessequal: 0x2264, 21221 lessequalorgreater: 0x22DA, 21222 lessmonospace: 0xFF1C, 21223 lessorequivalent: 0x2272, 21224 lessorgreater: 0x2276, 21225 lessoverequal: 0x2266, 21226 lesssmall: 0xFE64, 21227 lezh: 0x026E, 21228 lfblock: 0x258C, 21229 lhookretroflex: 0x026D, 21230 lira: 0x20A4, 21231 liwnarmenian: 0x056C, 21232 lj: 0x01C9, 21233 ljecyrillic: 0x0459, 21234 ll: 0xF6C0, 21235 lladeva: 0x0933, 21236 llagujarati: 0x0AB3, 21237 llinebelow: 0x1E3B, 21238 llladeva: 0x0934, 21239 llvocalicbengali: 0x09E1, 21240 llvocalicdeva: 0x0961, 21241 llvocalicvowelsignbengali: 0x09E3, 21242 llvocalicvowelsigndeva: 0x0963, 21243 lmiddletilde: 0x026B, 21244 lmonospace: 0xFF4C, 21245 lmsquare: 0x33D0, 21246 lochulathai: 0x0E2C, 21247 logicaland: 0x2227, 21248 logicalnot: 0x00AC, 21249 logicalnotreversed: 0x2310, 21250 logicalor: 0x2228, 21251 lolingthai: 0x0E25, 21252 longs: 0x017F, 21253 lowlinecenterline: 0xFE4E, 21254 lowlinecmb: 0x0332, 21255 lowlinedashed: 0xFE4D, 21256 lozenge: 0x25CA, 21257 lparen: 0x24A7, 21258 lslash: 0x0142, 21259 lsquare: 0x2113, 21260 lsuperior: 0xF6EE, 21261 ltshade: 0x2591, 21262 luthai: 0x0E26, 21263 lvocalicbengali: 0x098C, 21264 lvocalicdeva: 0x090C, 21265 lvocalicvowelsignbengali: 0x09E2, 21266 lvocalicvowelsigndeva: 0x0962, 21267 lxsquare: 0x33D3, 21268 m: 0x006D, 21269 mabengali: 0x09AE, 21270 macron: 0x00AF, 21271 macronbelowcmb: 0x0331, 21272 macroncmb: 0x0304, 21273 macronlowmod: 0x02CD, 21274 macronmonospace: 0xFFE3, 21275 macute: 0x1E3F, 21276 madeva: 0x092E, 21277 magujarati: 0x0AAE, 21278 magurmukhi: 0x0A2E, 21279 mahapakhhebrew: 0x05A4, 21280 mahapakhlefthebrew: 0x05A4, 21281 mahiragana: 0x307E, 21282 maichattawalowleftthai: 0xF895, 21283 maichattawalowrightthai: 0xF894, 21284 maichattawathai: 0x0E4B, 21285 maichattawaupperleftthai: 0xF893, 21286 maieklowleftthai: 0xF88C, 21287 maieklowrightthai: 0xF88B, 21288 maiekthai: 0x0E48, 21289 maiekupperleftthai: 0xF88A, 21290 maihanakatleftthai: 0xF884, 21291 maihanakatthai: 0x0E31, 21292 maitaikhuleftthai: 0xF889, 21293 maitaikhuthai: 0x0E47, 21294 maitholowleftthai: 0xF88F, 21295 maitholowrightthai: 0xF88E, 21296 maithothai: 0x0E49, 21297 maithoupperleftthai: 0xF88D, 21298 maitrilowleftthai: 0xF892, 21299 maitrilowrightthai: 0xF891, 21300 maitrithai: 0x0E4A, 21301 maitriupperleftthai: 0xF890, 21302 maiyamokthai: 0x0E46, 21303 makatakana: 0x30DE, 21304 makatakanahalfwidth: 0xFF8F, 21305 male: 0x2642, 21306 mansyonsquare: 0x3347, 21307 maqafhebrew: 0x05BE, 21308 mars: 0x2642, 21309 masoracirclehebrew: 0x05AF, 21310 masquare: 0x3383, 21311 mbopomofo: 0x3107, 21312 mbsquare: 0x33D4, 21313 mcircle: 0x24DC, 21314 mcubedsquare: 0x33A5, 21315 mdotaccent: 0x1E41, 21316 mdotbelow: 0x1E43, 21317 meemarabic: 0x0645, 21318 meemfinalarabic: 0xFEE2, 21319 meeminitialarabic: 0xFEE3, 21320 meemmedialarabic: 0xFEE4, 21321 meemmeeminitialarabic: 0xFCD1, 21322 meemmeemisolatedarabic: 0xFC48, 21323 meetorusquare: 0x334D, 21324 mehiragana: 0x3081, 21325 meizierasquare: 0x337E, 21326 mekatakana: 0x30E1, 21327 mekatakanahalfwidth: 0xFF92, 21328 mem: 0x05DE, 21329 memdagesh: 0xFB3E, 21330 memdageshhebrew: 0xFB3E, 21331 memhebrew: 0x05DE, 21332 menarmenian: 0x0574, 21333 merkhahebrew: 0x05A5, 21334 merkhakefulahebrew: 0x05A6, 21335 merkhakefulalefthebrew: 0x05A6, 21336 merkhalefthebrew: 0x05A5, 21337 mhook: 0x0271, 21338 mhzsquare: 0x3392, 21339 middledotkatakanahalfwidth: 0xFF65, 21340 middot: 0x00B7, 21341 mieumacirclekorean: 0x3272, 21342 mieumaparenkorean: 0x3212, 21343 mieumcirclekorean: 0x3264, 21344 mieumkorean: 0x3141, 21345 mieumpansioskorean: 0x3170, 21346 mieumparenkorean: 0x3204, 21347 mieumpieupkorean: 0x316E, 21348 mieumsioskorean: 0x316F, 21349 mihiragana: 0x307F, 21350 mikatakana: 0x30DF, 21351 mikatakanahalfwidth: 0xFF90, 21352 minus: 0x2212, 21353 minusbelowcmb: 0x0320, 21354 minuscircle: 0x2296, 21355 minusmod: 0x02D7, 21356 minusplus: 0x2213, 21357 minute: 0x2032, 21358 miribaarusquare: 0x334A, 21359 mirisquare: 0x3349, 21360 mlonglegturned: 0x0270, 21361 mlsquare: 0x3396, 21362 mmcubedsquare: 0x33A3, 21363 mmonospace: 0xFF4D, 21364 mmsquaredsquare: 0x339F, 21365 mohiragana: 0x3082, 21366 mohmsquare: 0x33C1, 21367 mokatakana: 0x30E2, 21368 mokatakanahalfwidth: 0xFF93, 21369 molsquare: 0x33D6, 21370 momathai: 0x0E21, 21371 moverssquare: 0x33A7, 21372 moverssquaredsquare: 0x33A8, 21373 mparen: 0x24A8, 21374 mpasquare: 0x33AB, 21375 mssquare: 0x33B3, 21376 msuperior: 0xF6EF, 21377 mturned: 0x026F, 21378 mu: 0x00B5, 21379 mu1: 0x00B5, 21380 muasquare: 0x3382, 21381 muchgreater: 0x226B, 21382 muchless: 0x226A, 21383 mufsquare: 0x338C, 21384 mugreek: 0x03BC, 21385 mugsquare: 0x338D, 21386 muhiragana: 0x3080, 21387 mukatakana: 0x30E0, 21388 mukatakanahalfwidth: 0xFF91, 21389 mulsquare: 0x3395, 21390 multiply: 0x00D7, 21391 mumsquare: 0x339B, 21392 munahhebrew: 0x05A3, 21393 munahlefthebrew: 0x05A3, 21394 musicalnote: 0x266A, 21395 musicalnotedbl: 0x266B, 21396 musicflatsign: 0x266D, 21397 musicsharpsign: 0x266F, 21398 mussquare: 0x33B2, 21399 muvsquare: 0x33B6, 21400 muwsquare: 0x33BC, 21401 mvmegasquare: 0x33B9, 21402 mvsquare: 0x33B7, 21403 mwmegasquare: 0x33BF, 21404 mwsquare: 0x33BD, 21405 n: 0x006E, 21406 nabengali: 0x09A8, 21407 nabla: 0x2207, 21408 nacute: 0x0144, 21409 nadeva: 0x0928, 21410 nagujarati: 0x0AA8, 21411 nagurmukhi: 0x0A28, 21412 nahiragana: 0x306A, 21413 nakatakana: 0x30CA, 21414 nakatakanahalfwidth: 0xFF85, 21415 napostrophe: 0x0149, 21416 nasquare: 0x3381, 21417 nbopomofo: 0x310B, 21418 nbspace: 0x00A0, 21419 ncaron: 0x0148, 21420 ncedilla: 0x0146, 21421 ncircle: 0x24DD, 21422 ncircumflexbelow: 0x1E4B, 21423 ncommaaccent: 0x0146, 21424 ndotaccent: 0x1E45, 21425 ndotbelow: 0x1E47, 21426 nehiragana: 0x306D, 21427 nekatakana: 0x30CD, 21428 nekatakanahalfwidth: 0xFF88, 21429 newsheqelsign: 0x20AA, 21430 nfsquare: 0x338B, 21431 ngabengali: 0x0999, 21432 ngadeva: 0x0919, 21433 ngagujarati: 0x0A99, 21434 ngagurmukhi: 0x0A19, 21435 ngonguthai: 0x0E07, 21436 nhiragana: 0x3093, 21437 nhookleft: 0x0272, 21438 nhookretroflex: 0x0273, 21439 nieunacirclekorean: 0x326F, 21440 nieunaparenkorean: 0x320F, 21441 nieuncieuckorean: 0x3135, 21442 nieuncirclekorean: 0x3261, 21443 nieunhieuhkorean: 0x3136, 21444 nieunkorean: 0x3134, 21445 nieunpansioskorean: 0x3168, 21446 nieunparenkorean: 0x3201, 21447 nieunsioskorean: 0x3167, 21448 nieuntikeutkorean: 0x3166, 21449 nihiragana: 0x306B, 21450 nikatakana: 0x30CB, 21451 nikatakanahalfwidth: 0xFF86, 21452 nikhahitleftthai: 0xF899, 21453 nikhahitthai: 0x0E4D, 21454 nine: 0x0039, 21455 ninearabic: 0x0669, 21456 ninebengali: 0x09EF, 21457 ninecircle: 0x2468, 21458 ninecircleinversesansserif: 0x2792, 21459 ninedeva: 0x096F, 21460 ninegujarati: 0x0AEF, 21461 ninegurmukhi: 0x0A6F, 21462 ninehackarabic: 0x0669, 21463 ninehangzhou: 0x3029, 21464 nineideographicparen: 0x3228, 21465 nineinferior: 0x2089, 21466 ninemonospace: 0xFF19, 21467 nineoldstyle: 0xF739, 21468 nineparen: 0x247C, 21469 nineperiod: 0x2490, 21470 ninepersian: 0x06F9, 21471 nineroman: 0x2178, 21472 ninesuperior: 0x2079, 21473 nineteencircle: 0x2472, 21474 nineteenparen: 0x2486, 21475 nineteenperiod: 0x249A, 21476 ninethai: 0x0E59, 21477 nj: 0x01CC, 21478 njecyrillic: 0x045A, 21479 nkatakana: 0x30F3, 21480 nkatakanahalfwidth: 0xFF9D, 21481 nlegrightlong: 0x019E, 21482 nlinebelow: 0x1E49, 21483 nmonospace: 0xFF4E, 21484 nmsquare: 0x339A, 21485 nnabengali: 0x09A3, 21486 nnadeva: 0x0923, 21487 nnagujarati: 0x0AA3, 21488 nnagurmukhi: 0x0A23, 21489 nnnadeva: 0x0929, 21490 nohiragana: 0x306E, 21491 nokatakana: 0x30CE, 21492 nokatakanahalfwidth: 0xFF89, 21493 nonbreakingspace: 0x00A0, 21494 nonenthai: 0x0E13, 21495 nonuthai: 0x0E19, 21496 noonarabic: 0x0646, 21497 noonfinalarabic: 0xFEE6, 21498 noonghunnaarabic: 0x06BA, 21499 noonghunnafinalarabic: 0xFB9F, 21500 nooninitialarabic: 0xFEE7, 21501 noonjeeminitialarabic: 0xFCD2, 21502 noonjeemisolatedarabic: 0xFC4B, 21503 noonmedialarabic: 0xFEE8, 21504 noonmeeminitialarabic: 0xFCD5, 21505 noonmeemisolatedarabic: 0xFC4E, 21506 noonnoonfinalarabic: 0xFC8D, 21507 notcontains: 0x220C, 21508 notelement: 0x2209, 21509 notelementof: 0x2209, 21510 notequal: 0x2260, 21511 notgreater: 0x226F, 21512 notgreaternorequal: 0x2271, 21513 notgreaternorless: 0x2279, 21514 notidentical: 0x2262, 21515 notless: 0x226E, 21516 notlessnorequal: 0x2270, 21517 notparallel: 0x2226, 21518 notprecedes: 0x2280, 21519 notsubset: 0x2284, 21520 notsucceeds: 0x2281, 21521 notsuperset: 0x2285, 21522 nowarmenian: 0x0576, 21523 nparen: 0x24A9, 21524 nssquare: 0x33B1, 21525 nsuperior: 0x207F, 21526 ntilde: 0x00F1, 21527 nu: 0x03BD, 21528 nuhiragana: 0x306C, 21529 nukatakana: 0x30CC, 21530 nukatakanahalfwidth: 0xFF87, 21531 nuktabengali: 0x09BC, 21532 nuktadeva: 0x093C, 21533 nuktagujarati: 0x0ABC, 21534 nuktagurmukhi: 0x0A3C, 21535 numbersign: 0x0023, 21536 numbersignmonospace: 0xFF03, 21537 numbersignsmall: 0xFE5F, 21538 numeralsigngreek: 0x0374, 21539 numeralsignlowergreek: 0x0375, 21540 numero: 0x2116, 21541 nun: 0x05E0, 21542 nundagesh: 0xFB40, 21543 nundageshhebrew: 0xFB40, 21544 nunhebrew: 0x05E0, 21545 nvsquare: 0x33B5, 21546 nwsquare: 0x33BB, 21547 nyabengali: 0x099E, 21548 nyadeva: 0x091E, 21549 nyagujarati: 0x0A9E, 21550 nyagurmukhi: 0x0A1E, 21551 o: 0x006F, 21552 oacute: 0x00F3, 21553 oangthai: 0x0E2D, 21554 obarred: 0x0275, 21555 obarredcyrillic: 0x04E9, 21556 obarreddieresiscyrillic: 0x04EB, 21557 obengali: 0x0993, 21558 obopomofo: 0x311B, 21559 obreve: 0x014F, 21560 ocandradeva: 0x0911, 21561 ocandragujarati: 0x0A91, 21562 ocandravowelsigndeva: 0x0949, 21563 ocandravowelsigngujarati: 0x0AC9, 21564 ocaron: 0x01D2, 21565 ocircle: 0x24DE, 21566 ocircumflex: 0x00F4, 21567 ocircumflexacute: 0x1ED1, 21568 ocircumflexdotbelow: 0x1ED9, 21569 ocircumflexgrave: 0x1ED3, 21570 ocircumflexhookabove: 0x1ED5, 21571 ocircumflextilde: 0x1ED7, 21572 ocyrillic: 0x043E, 21573 odblacute: 0x0151, 21574 odblgrave: 0x020D, 21575 odeva: 0x0913, 21576 odieresis: 0x00F6, 21577 odieresiscyrillic: 0x04E7, 21578 odotbelow: 0x1ECD, 21579 oe: 0x0153, 21580 oekorean: 0x315A, 21581 ogonek: 0x02DB, 21582 ogonekcmb: 0x0328, 21583 ograve: 0x00F2, 21584 ogujarati: 0x0A93, 21585 oharmenian: 0x0585, 21586 ohiragana: 0x304A, 21587 ohookabove: 0x1ECF, 21588 ohorn: 0x01A1, 21589 ohornacute: 0x1EDB, 21590 ohorndotbelow: 0x1EE3, 21591 ohorngrave: 0x1EDD, 21592 ohornhookabove: 0x1EDF, 21593 ohorntilde: 0x1EE1, 21594 ohungarumlaut: 0x0151, 21595 oi: 0x01A3, 21596 oinvertedbreve: 0x020F, 21597 okatakana: 0x30AA, 21598 okatakanahalfwidth: 0xFF75, 21599 okorean: 0x3157, 21600 olehebrew: 0x05AB, 21601 omacron: 0x014D, 21602 omacronacute: 0x1E53, 21603 omacrongrave: 0x1E51, 21604 omdeva: 0x0950, 21605 omega: 0x03C9, 21606 omega1: 0x03D6, 21607 omegacyrillic: 0x0461, 21608 omegalatinclosed: 0x0277, 21609 omegaroundcyrillic: 0x047B, 21610 omegatitlocyrillic: 0x047D, 21611 omegatonos: 0x03CE, 21612 omgujarati: 0x0AD0, 21613 omicron: 0x03BF, 21614 omicrontonos: 0x03CC, 21615 omonospace: 0xFF4F, 21616 one: 0x0031, 21617 onearabic: 0x0661, 21618 onebengali: 0x09E7, 21619 onecircle: 0x2460, 21620 onecircleinversesansserif: 0x278A, 21621 onedeva: 0x0967, 21622 onedotenleader: 0x2024, 21623 oneeighth: 0x215B, 21624 onefitted: 0xF6DC, 21625 onegujarati: 0x0AE7, 21626 onegurmukhi: 0x0A67, 21627 onehackarabic: 0x0661, 21628 onehalf: 0x00BD, 21629 onehangzhou: 0x3021, 21630 oneideographicparen: 0x3220, 21631 oneinferior: 0x2081, 21632 onemonospace: 0xFF11, 21633 onenumeratorbengali: 0x09F4, 21634 oneoldstyle: 0xF731, 21635 oneparen: 0x2474, 21636 oneperiod: 0x2488, 21637 onepersian: 0x06F1, 21638 onequarter: 0x00BC, 21639 oneroman: 0x2170, 21640 onesuperior: 0x00B9, 21641 onethai: 0x0E51, 21642 onethird: 0x2153, 21643 oogonek: 0x01EB, 21644 oogonekmacron: 0x01ED, 21645 oogurmukhi: 0x0A13, 21646 oomatragurmukhi: 0x0A4B, 21647 oopen: 0x0254, 21648 oparen: 0x24AA, 21649 openbullet: 0x25E6, 21650 option: 0x2325, 21651 ordfeminine: 0x00AA, 21652 ordmasculine: 0x00BA, 21653 orthogonal: 0x221F, 21654 oshortdeva: 0x0912, 21655 oshortvowelsigndeva: 0x094A, 21656 oslash: 0x00F8, 21657 oslashacute: 0x01FF, 21658 osmallhiragana: 0x3049, 21659 osmallkatakana: 0x30A9, 21660 osmallkatakanahalfwidth: 0xFF6B, 21661 ostrokeacute: 0x01FF, 21662 osuperior: 0xF6F0, 21663 otcyrillic: 0x047F, 21664 otilde: 0x00F5, 21665 otildeacute: 0x1E4D, 21666 otildedieresis: 0x1E4F, 21667 oubopomofo: 0x3121, 21668 overline: 0x203E, 21669 overlinecenterline: 0xFE4A, 21670 overlinecmb: 0x0305, 21671 overlinedashed: 0xFE49, 21672 overlinedblwavy: 0xFE4C, 21673 overlinewavy: 0xFE4B, 21674 overscore: 0x00AF, 21675 ovowelsignbengali: 0x09CB, 21676 ovowelsigndeva: 0x094B, 21677 ovowelsigngujarati: 0x0ACB, 21678 p: 0x0070, 21679 paampssquare: 0x3380, 21680 paasentosquare: 0x332B, 21681 pabengali: 0x09AA, 21682 pacute: 0x1E55, 21683 padeva: 0x092A, 21684 pagedown: 0x21DF, 21685 pageup: 0x21DE, 21686 pagujarati: 0x0AAA, 21687 pagurmukhi: 0x0A2A, 21688 pahiragana: 0x3071, 21689 paiyannoithai: 0x0E2F, 21690 pakatakana: 0x30D1, 21691 palatalizationcyrilliccmb: 0x0484, 21692 palochkacyrillic: 0x04C0, 21693 pansioskorean: 0x317F, 21694 paragraph: 0x00B6, 21695 parallel: 0x2225, 21696 parenleft: 0x0028, 21697 parenleftaltonearabic: 0xFD3E, 21698 parenleftbt: 0xF8ED, 21699 parenleftex: 0xF8EC, 21700 parenleftinferior: 0x208D, 21701 parenleftmonospace: 0xFF08, 21702 parenleftsmall: 0xFE59, 21703 parenleftsuperior: 0x207D, 21704 parenlefttp: 0xF8EB, 21705 parenleftvertical: 0xFE35, 21706 parenright: 0x0029, 21707 parenrightaltonearabic: 0xFD3F, 21708 parenrightbt: 0xF8F8, 21709 parenrightex: 0xF8F7, 21710 parenrightinferior: 0x208E, 21711 parenrightmonospace: 0xFF09, 21712 parenrightsmall: 0xFE5A, 21713 parenrightsuperior: 0x207E, 21714 parenrighttp: 0xF8F6, 21715 parenrightvertical: 0xFE36, 21716 partialdiff: 0x2202, 21717 paseqhebrew: 0x05C0, 21718 pashtahebrew: 0x0599, 21719 pasquare: 0x33A9, 21720 patah: 0x05B7, 21721 patah11: 0x05B7, 21722 patah1d: 0x05B7, 21723 patah2a: 0x05B7, 21724 patahhebrew: 0x05B7, 21725 patahnarrowhebrew: 0x05B7, 21726 patahquarterhebrew: 0x05B7, 21727 patahwidehebrew: 0x05B7, 21728 pazerhebrew: 0x05A1, 21729 pbopomofo: 0x3106, 21730 pcircle: 0x24DF, 21731 pdotaccent: 0x1E57, 21732 pe: 0x05E4, 21733 pecyrillic: 0x043F, 21734 pedagesh: 0xFB44, 21735 pedageshhebrew: 0xFB44, 21736 peezisquare: 0x333B, 21737 pefinaldageshhebrew: 0xFB43, 21738 peharabic: 0x067E, 21739 peharmenian: 0x057A, 21740 pehebrew: 0x05E4, 21741 pehfinalarabic: 0xFB57, 21742 pehinitialarabic: 0xFB58, 21743 pehiragana: 0x307A, 21744 pehmedialarabic: 0xFB59, 21745 pekatakana: 0x30DA, 21746 pemiddlehookcyrillic: 0x04A7, 21747 perafehebrew: 0xFB4E, 21748 percent: 0x0025, 21749 percentarabic: 0x066A, 21750 percentmonospace: 0xFF05, 21751 percentsmall: 0xFE6A, 21752 period: 0x002E, 21753 periodarmenian: 0x0589, 21754 periodcentered: 0x00B7, 21755 periodhalfwidth: 0xFF61, 21756 periodinferior: 0xF6E7, 21757 periodmonospace: 0xFF0E, 21758 periodsmall: 0xFE52, 21759 periodsuperior: 0xF6E8, 21760 perispomenigreekcmb: 0x0342, 21761 perpendicular: 0x22A5, 21762 perthousand: 0x2030, 21763 peseta: 0x20A7, 21764 pfsquare: 0x338A, 21765 phabengali: 0x09AB, 21766 phadeva: 0x092B, 21767 phagujarati: 0x0AAB, 21768 phagurmukhi: 0x0A2B, 21769 phi: 0x03C6, 21770 phi1: 0x03D5, 21771 phieuphacirclekorean: 0x327A, 21772 phieuphaparenkorean: 0x321A, 21773 phieuphcirclekorean: 0x326C, 21774 phieuphkorean: 0x314D, 21775 phieuphparenkorean: 0x320C, 21776 philatin: 0x0278, 21777 phinthuthai: 0x0E3A, 21778 phisymbolgreek: 0x03D5, 21779 phook: 0x01A5, 21780 phophanthai: 0x0E1E, 21781 phophungthai: 0x0E1C, 21782 phosamphaothai: 0x0E20, 21783 pi: 0x03C0, 21784 pieupacirclekorean: 0x3273, 21785 pieupaparenkorean: 0x3213, 21786 pieupcieuckorean: 0x3176, 21787 pieupcirclekorean: 0x3265, 21788 pieupkiyeokkorean: 0x3172, 21789 pieupkorean: 0x3142, 21790 pieupparenkorean: 0x3205, 21791 pieupsioskiyeokkorean: 0x3174, 21792 pieupsioskorean: 0x3144, 21793 pieupsiostikeutkorean: 0x3175, 21794 pieupthieuthkorean: 0x3177, 21795 pieuptikeutkorean: 0x3173, 21796 pihiragana: 0x3074, 21797 pikatakana: 0x30D4, 21798 pisymbolgreek: 0x03D6, 21799 piwrarmenian: 0x0583, 21800 plus: 0x002B, 21801 plusbelowcmb: 0x031F, 21802 pluscircle: 0x2295, 21803 plusminus: 0x00B1, 21804 plusmod: 0x02D6, 21805 plusmonospace: 0xFF0B, 21806 plussmall: 0xFE62, 21807 plussuperior: 0x207A, 21808 pmonospace: 0xFF50, 21809 pmsquare: 0x33D8, 21810 pohiragana: 0x307D, 21811 pointingindexdownwhite: 0x261F, 21812 pointingindexleftwhite: 0x261C, 21813 pointingindexrightwhite: 0x261E, 21814 pointingindexupwhite: 0x261D, 21815 pokatakana: 0x30DD, 21816 poplathai: 0x0E1B, 21817 postalmark: 0x3012, 21818 postalmarkface: 0x3020, 21819 pparen: 0x24AB, 21820 precedes: 0x227A, 21821 prescription: 0x211E, 21822 primemod: 0x02B9, 21823 primereversed: 0x2035, 21824 product: 0x220F, 21825 projective: 0x2305, 21826 prolongedkana: 0x30FC, 21827 propellor: 0x2318, 21828 propersubset: 0x2282, 21829 propersuperset: 0x2283, 21830 proportion: 0x2237, 21831 proportional: 0x221D, 21832 psi: 0x03C8, 21833 psicyrillic: 0x0471, 21834 psilipneumatacyrilliccmb: 0x0486, 21835 pssquare: 0x33B0, 21836 puhiragana: 0x3077, 21837 pukatakana: 0x30D7, 21838 pvsquare: 0x33B4, 21839 pwsquare: 0x33BA, 21840 q: 0x0071, 21841 qadeva: 0x0958, 21842 qadmahebrew: 0x05A8, 21843 qafarabic: 0x0642, 21844 qaffinalarabic: 0xFED6, 21845 qafinitialarabic: 0xFED7, 21846 qafmedialarabic: 0xFED8, 21847 qamats: 0x05B8, 21848 qamats10: 0x05B8, 21849 qamats1a: 0x05B8, 21850 qamats1c: 0x05B8, 21851 qamats27: 0x05B8, 21852 qamats29: 0x05B8, 21853 qamats33: 0x05B8, 21854 qamatsde: 0x05B8, 21855 qamatshebrew: 0x05B8, 21856 qamatsnarrowhebrew: 0x05B8, 21857 qamatsqatanhebrew: 0x05B8, 21858 qamatsqatannarrowhebrew: 0x05B8, 21859 qamatsqatanquarterhebrew: 0x05B8, 21860 qamatsqatanwidehebrew: 0x05B8, 21861 qamatsquarterhebrew: 0x05B8, 21862 qamatswidehebrew: 0x05B8, 21863 qarneyparahebrew: 0x059F, 21864 qbopomofo: 0x3111, 21865 qcircle: 0x24E0, 21866 qhook: 0x02A0, 21867 qmonospace: 0xFF51, 21868 qof: 0x05E7, 21869 qofdagesh: 0xFB47, 21870 qofdageshhebrew: 0xFB47, 21871 qofhebrew: 0x05E7, 21872 qparen: 0x24AC, 21873 quarternote: 0x2669, 21874 qubuts: 0x05BB, 21875 qubuts18: 0x05BB, 21876 qubuts25: 0x05BB, 21877 qubuts31: 0x05BB, 21878 qubutshebrew: 0x05BB, 21879 qubutsnarrowhebrew: 0x05BB, 21880 qubutsquarterhebrew: 0x05BB, 21881 qubutswidehebrew: 0x05BB, 21882 question: 0x003F, 21883 questionarabic: 0x061F, 21884 questionarmenian: 0x055E, 21885 questiondown: 0x00BF, 21886 questiondownsmall: 0xF7BF, 21887 questiongreek: 0x037E, 21888 questionmonospace: 0xFF1F, 21889 questionsmall: 0xF73F, 21890 quotedbl: 0x0022, 21891 quotedblbase: 0x201E, 21892 quotedblleft: 0x201C, 21893 quotedblmonospace: 0xFF02, 21894 quotedblprime: 0x301E, 21895 quotedblprimereversed: 0x301D, 21896 quotedblright: 0x201D, 21897 quoteleft: 0x2018, 21898 quoteleftreversed: 0x201B, 21899 quotereversed: 0x201B, 21900 quoteright: 0x2019, 21901 quoterightn: 0x0149, 21902 quotesinglbase: 0x201A, 21903 quotesingle: 0x0027, 21904 quotesinglemonospace: 0xFF07, 21905 r: 0x0072, 21906 raarmenian: 0x057C, 21907 rabengali: 0x09B0, 21908 racute: 0x0155, 21909 radeva: 0x0930, 21910 radical: 0x221A, 21911 radicalex: 0xF8E5, 21912 radoverssquare: 0x33AE, 21913 radoverssquaredsquare: 0x33AF, 21914 radsquare: 0x33AD, 21915 rafe: 0x05BF, 21916 rafehebrew: 0x05BF, 21917 ragujarati: 0x0AB0, 21918 ragurmukhi: 0x0A30, 21919 rahiragana: 0x3089, 21920 rakatakana: 0x30E9, 21921 rakatakanahalfwidth: 0xFF97, 21922 ralowerdiagonalbengali: 0x09F1, 21923 ramiddlediagonalbengali: 0x09F0, 21924 ramshorn: 0x0264, 21925 ratio: 0x2236, 21926 rbopomofo: 0x3116, 21927 rcaron: 0x0159, 21928 rcedilla: 0x0157, 21929 rcircle: 0x24E1, 21930 rcommaaccent: 0x0157, 21931 rdblgrave: 0x0211, 21932 rdotaccent: 0x1E59, 21933 rdotbelow: 0x1E5B, 21934 rdotbelowmacron: 0x1E5D, 21935 referencemark: 0x203B, 21936 reflexsubset: 0x2286, 21937 reflexsuperset: 0x2287, 21938 registered: 0x00AE, 21939 registersans: 0xF8E8, 21940 registerserif: 0xF6DA, 21941 reharabic: 0x0631, 21942 reharmenian: 0x0580, 21943 rehfinalarabic: 0xFEAE, 21944 rehiragana: 0x308C, 21945 rekatakana: 0x30EC, 21946 rekatakanahalfwidth: 0xFF9A, 21947 resh: 0x05E8, 21948 reshdageshhebrew: 0xFB48, 21949 reshhebrew: 0x05E8, 21950 reversedtilde: 0x223D, 21951 reviahebrew: 0x0597, 21952 reviamugrashhebrew: 0x0597, 21953 revlogicalnot: 0x2310, 21954 rfishhook: 0x027E, 21955 rfishhookreversed: 0x027F, 21956 rhabengali: 0x09DD, 21957 rhadeva: 0x095D, 21958 rho: 0x03C1, 21959 rhook: 0x027D, 21960 rhookturned: 0x027B, 21961 rhookturnedsuperior: 0x02B5, 21962 rhosymbolgreek: 0x03F1, 21963 rhotichookmod: 0x02DE, 21964 rieulacirclekorean: 0x3271, 21965 rieulaparenkorean: 0x3211, 21966 rieulcirclekorean: 0x3263, 21967 rieulhieuhkorean: 0x3140, 21968 rieulkiyeokkorean: 0x313A, 21969 rieulkiyeoksioskorean: 0x3169, 21970 rieulkorean: 0x3139, 21971 rieulmieumkorean: 0x313B, 21972 rieulpansioskorean: 0x316C, 21973 rieulparenkorean: 0x3203, 21974 rieulphieuphkorean: 0x313F, 21975 rieulpieupkorean: 0x313C, 21976 rieulpieupsioskorean: 0x316B, 21977 rieulsioskorean: 0x313D, 21978 rieulthieuthkorean: 0x313E, 21979 rieultikeutkorean: 0x316A, 21980 rieulyeorinhieuhkorean: 0x316D, 21981 rightangle: 0x221F, 21982 righttackbelowcmb: 0x0319, 21983 righttriangle: 0x22BF, 21984 rihiragana: 0x308A, 21985 rikatakana: 0x30EA, 21986 rikatakanahalfwidth: 0xFF98, 21987 ring: 0x02DA, 21988 ringbelowcmb: 0x0325, 21989 ringcmb: 0x030A, 21990 ringhalfleft: 0x02BF, 21991 ringhalfleftarmenian: 0x0559, 21992 ringhalfleftbelowcmb: 0x031C, 21993 ringhalfleftcentered: 0x02D3, 21994 ringhalfright: 0x02BE, 21995 ringhalfrightbelowcmb: 0x0339, 21996 ringhalfrightcentered: 0x02D2, 21997 rinvertedbreve: 0x0213, 21998 rittorusquare: 0x3351, 21999 rlinebelow: 0x1E5F, 22000 rlongleg: 0x027C, 22001 rlonglegturned: 0x027A, 22002 rmonospace: 0xFF52, 22003 rohiragana: 0x308D, 22004 rokatakana: 0x30ED, 22005 rokatakanahalfwidth: 0xFF9B, 22006 roruathai: 0x0E23, 22007 rparen: 0x24AD, 22008 rrabengali: 0x09DC, 22009 rradeva: 0x0931, 22010 rragurmukhi: 0x0A5C, 22011 rreharabic: 0x0691, 22012 rrehfinalarabic: 0xFB8D, 22013 rrvocalicbengali: 0x09E0, 22014 rrvocalicdeva: 0x0960, 22015 rrvocalicgujarati: 0x0AE0, 22016 rrvocalicvowelsignbengali: 0x09C4, 22017 rrvocalicvowelsigndeva: 0x0944, 22018 rrvocalicvowelsigngujarati: 0x0AC4, 22019 rsuperior: 0xF6F1, 22020 rtblock: 0x2590, 22021 rturned: 0x0279, 22022 rturnedsuperior: 0x02B4, 22023 ruhiragana: 0x308B, 22024 rukatakana: 0x30EB, 22025 rukatakanahalfwidth: 0xFF99, 22026 rupeemarkbengali: 0x09F2, 22027 rupeesignbengali: 0x09F3, 22028 rupiah: 0xF6DD, 22029 ruthai: 0x0E24, 22030 rvocalicbengali: 0x098B, 22031 rvocalicdeva: 0x090B, 22032 rvocalicgujarati: 0x0A8B, 22033 rvocalicvowelsignbengali: 0x09C3, 22034 rvocalicvowelsigndeva: 0x0943, 22035 rvocalicvowelsigngujarati: 0x0AC3, 22036 s: 0x0073, 22037 sabengali: 0x09B8, 22038 sacute: 0x015B, 22039 sacutedotaccent: 0x1E65, 22040 sadarabic: 0x0635, 22041 sadeva: 0x0938, 22042 sadfinalarabic: 0xFEBA, 22043 sadinitialarabic: 0xFEBB, 22044 sadmedialarabic: 0xFEBC, 22045 sagujarati: 0x0AB8, 22046 sagurmukhi: 0x0A38, 22047 sahiragana: 0x3055, 22048 sakatakana: 0x30B5, 22049 sakatakanahalfwidth: 0xFF7B, 22050 sallallahoualayhewasallamarabic: 0xFDFA, 22051 samekh: 0x05E1, 22052 samekhdagesh: 0xFB41, 22053 samekhdageshhebrew: 0xFB41, 22054 samekhhebrew: 0x05E1, 22055 saraaathai: 0x0E32, 22056 saraaethai: 0x0E41, 22057 saraaimaimalaithai: 0x0E44, 22058 saraaimaimuanthai: 0x0E43, 22059 saraamthai: 0x0E33, 22060 saraathai: 0x0E30, 22061 saraethai: 0x0E40, 22062 saraiileftthai: 0xF886, 22063 saraiithai: 0x0E35, 22064 saraileftthai: 0xF885, 22065 saraithai: 0x0E34, 22066 saraothai: 0x0E42, 22067 saraueeleftthai: 0xF888, 22068 saraueethai: 0x0E37, 22069 saraueleftthai: 0xF887, 22070 sarauethai: 0x0E36, 22071 sarauthai: 0x0E38, 22072 sarauuthai: 0x0E39, 22073 sbopomofo: 0x3119, 22074 scaron: 0x0161, 22075 scarondotaccent: 0x1E67, 22076 scedilla: 0x015F, 22077 schwa: 0x0259, 22078 schwacyrillic: 0x04D9, 22079 schwadieresiscyrillic: 0x04DB, 22080 schwahook: 0x025A, 22081 scircle: 0x24E2, 22082 scircumflex: 0x015D, 22083 scommaaccent: 0x0219, 22084 sdotaccent: 0x1E61, 22085 sdotbelow: 0x1E63, 22086 sdotbelowdotaccent: 0x1E69, 22087 seagullbelowcmb: 0x033C, 22088 second: 0x2033, 22089 secondtonechinese: 0x02CA, 22090 section: 0x00A7, 22091 seenarabic: 0x0633, 22092 seenfinalarabic: 0xFEB2, 22093 seeninitialarabic: 0xFEB3, 22094 seenmedialarabic: 0xFEB4, 22095 segol: 0x05B6, 22096 segol13: 0x05B6, 22097 segol1f: 0x05B6, 22098 segol2c: 0x05B6, 22099 segolhebrew: 0x05B6, 22100 segolnarrowhebrew: 0x05B6, 22101 segolquarterhebrew: 0x05B6, 22102 segoltahebrew: 0x0592, 22103 segolwidehebrew: 0x05B6, 22104 seharmenian: 0x057D, 22105 sehiragana: 0x305B, 22106 sekatakana: 0x30BB, 22107 sekatakanahalfwidth: 0xFF7E, 22108 semicolon: 0x003B, 22109 semicolonarabic: 0x061B, 22110 semicolonmonospace: 0xFF1B, 22111 semicolonsmall: 0xFE54, 22112 semivoicedmarkkana: 0x309C, 22113 semivoicedmarkkanahalfwidth: 0xFF9F, 22114 sentisquare: 0x3322, 22115 sentosquare: 0x3323, 22116 seven: 0x0037, 22117 sevenarabic: 0x0667, 22118 sevenbengali: 0x09ED, 22119 sevencircle: 0x2466, 22120 sevencircleinversesansserif: 0x2790, 22121 sevendeva: 0x096D, 22122 seveneighths: 0x215E, 22123 sevengujarati: 0x0AED, 22124 sevengurmukhi: 0x0A6D, 22125 sevenhackarabic: 0x0667, 22126 sevenhangzhou: 0x3027, 22127 sevenideographicparen: 0x3226, 22128 seveninferior: 0x2087, 22129 sevenmonospace: 0xFF17, 22130 sevenoldstyle: 0xF737, 22131 sevenparen: 0x247A, 22132 sevenperiod: 0x248E, 22133 sevenpersian: 0x06F7, 22134 sevenroman: 0x2176, 22135 sevensuperior: 0x2077, 22136 seventeencircle: 0x2470, 22137 seventeenparen: 0x2484, 22138 seventeenperiod: 0x2498, 22139 seventhai: 0x0E57, 22140 sfthyphen: 0x00AD, 22141 shaarmenian: 0x0577, 22142 shabengali: 0x09B6, 22143 shacyrillic: 0x0448, 22144 shaddaarabic: 0x0651, 22145 shaddadammaarabic: 0xFC61, 22146 shaddadammatanarabic: 0xFC5E, 22147 shaddafathaarabic: 0xFC60, 22148 shaddakasraarabic: 0xFC62, 22149 shaddakasratanarabic: 0xFC5F, 22150 shade: 0x2592, 22151 shadedark: 0x2593, 22152 shadelight: 0x2591, 22153 shademedium: 0x2592, 22154 shadeva: 0x0936, 22155 shagujarati: 0x0AB6, 22156 shagurmukhi: 0x0A36, 22157 shalshelethebrew: 0x0593, 22158 shbopomofo: 0x3115, 22159 shchacyrillic: 0x0449, 22160 sheenarabic: 0x0634, 22161 sheenfinalarabic: 0xFEB6, 22162 sheeninitialarabic: 0xFEB7, 22163 sheenmedialarabic: 0xFEB8, 22164 sheicoptic: 0x03E3, 22165 sheqel: 0x20AA, 22166 sheqelhebrew: 0x20AA, 22167 sheva: 0x05B0, 22168 sheva115: 0x05B0, 22169 sheva15: 0x05B0, 22170 sheva22: 0x05B0, 22171 sheva2e: 0x05B0, 22172 shevahebrew: 0x05B0, 22173 shevanarrowhebrew: 0x05B0, 22174 shevaquarterhebrew: 0x05B0, 22175 shevawidehebrew: 0x05B0, 22176 shhacyrillic: 0x04BB, 22177 shimacoptic: 0x03ED, 22178 shin: 0x05E9, 22179 shindagesh: 0xFB49, 22180 shindageshhebrew: 0xFB49, 22181 shindageshshindot: 0xFB2C, 22182 shindageshshindothebrew: 0xFB2C, 22183 shindageshsindot: 0xFB2D, 22184 shindageshsindothebrew: 0xFB2D, 22185 shindothebrew: 0x05C1, 22186 shinhebrew: 0x05E9, 22187 shinshindot: 0xFB2A, 22188 shinshindothebrew: 0xFB2A, 22189 shinsindot: 0xFB2B, 22190 shinsindothebrew: 0xFB2B, 22191 shook: 0x0282, 22192 sigma: 0x03C3, 22193 sigma1: 0x03C2, 22194 sigmafinal: 0x03C2, 22195 sigmalunatesymbolgreek: 0x03F2, 22196 sihiragana: 0x3057, 22197 sikatakana: 0x30B7, 22198 sikatakanahalfwidth: 0xFF7C, 22199 siluqhebrew: 0x05BD, 22200 siluqlefthebrew: 0x05BD, 22201 similar: 0x223C, 22202 sindothebrew: 0x05C2, 22203 siosacirclekorean: 0x3274, 22204 siosaparenkorean: 0x3214, 22205 sioscieuckorean: 0x317E, 22206 sioscirclekorean: 0x3266, 22207 sioskiyeokkorean: 0x317A, 22208 sioskorean: 0x3145, 22209 siosnieunkorean: 0x317B, 22210 siosparenkorean: 0x3206, 22211 siospieupkorean: 0x317D, 22212 siostikeutkorean: 0x317C, 22213 six: 0x0036, 22214 sixarabic: 0x0666, 22215 sixbengali: 0x09EC, 22216 sixcircle: 0x2465, 22217 sixcircleinversesansserif: 0x278F, 22218 sixdeva: 0x096C, 22219 sixgujarati: 0x0AEC, 22220 sixgurmukhi: 0x0A6C, 22221 sixhackarabic: 0x0666, 22222 sixhangzhou: 0x3026, 22223 sixideographicparen: 0x3225, 22224 sixinferior: 0x2086, 22225 sixmonospace: 0xFF16, 22226 sixoldstyle: 0xF736, 22227 sixparen: 0x2479, 22228 sixperiod: 0x248D, 22229 sixpersian: 0x06F6, 22230 sixroman: 0x2175, 22231 sixsuperior: 0x2076, 22232 sixteencircle: 0x246F, 22233 sixteencurrencydenominatorbengali: 0x09F9, 22234 sixteenparen: 0x2483, 22235 sixteenperiod: 0x2497, 22236 sixthai: 0x0E56, 22237 slash: 0x002F, 22238 slashmonospace: 0xFF0F, 22239 slong: 0x017F, 22240 slongdotaccent: 0x1E9B, 22241 smileface: 0x263A, 22242 smonospace: 0xFF53, 22243 sofpasuqhebrew: 0x05C3, 22244 softhyphen: 0x00AD, 22245 softsigncyrillic: 0x044C, 22246 sohiragana: 0x305D, 22247 sokatakana: 0x30BD, 22248 sokatakanahalfwidth: 0xFF7F, 22249 soliduslongoverlaycmb: 0x0338, 22250 solidusshortoverlaycmb: 0x0337, 22251 sorusithai: 0x0E29, 22252 sosalathai: 0x0E28, 22253 sosothai: 0x0E0B, 22254 sosuathai: 0x0E2A, 22255 space: 0x0020, 22256 spacehackarabic: 0x0020, 22257 spade: 0x2660, 22258 spadesuitblack: 0x2660, 22259 spadesuitwhite: 0x2664, 22260 sparen: 0x24AE, 22261 squarebelowcmb: 0x033B, 22262 squarecc: 0x33C4, 22263 squarecm: 0x339D, 22264 squarediagonalcrosshatchfill: 0x25A9, 22265 squarehorizontalfill: 0x25A4, 22266 squarekg: 0x338F, 22267 squarekm: 0x339E, 22268 squarekmcapital: 0x33CE, 22269 squareln: 0x33D1, 22270 squarelog: 0x33D2, 22271 squaremg: 0x338E, 22272 squaremil: 0x33D5, 22273 squaremm: 0x339C, 22274 squaremsquared: 0x33A1, 22275 squareorthogonalcrosshatchfill: 0x25A6, 22276 squareupperlefttolowerrightfill: 0x25A7, 22277 squareupperrighttolowerleftfill: 0x25A8, 22278 squareverticalfill: 0x25A5, 22279 squarewhitewithsmallblack: 0x25A3, 22280 srsquare: 0x33DB, 22281 ssabengali: 0x09B7, 22282 ssadeva: 0x0937, 22283 ssagujarati: 0x0AB7, 22284 ssangcieuckorean: 0x3149, 22285 ssanghieuhkorean: 0x3185, 22286 ssangieungkorean: 0x3180, 22287 ssangkiyeokkorean: 0x3132, 22288 ssangnieunkorean: 0x3165, 22289 ssangpieupkorean: 0x3143, 22290 ssangsioskorean: 0x3146, 22291 ssangtikeutkorean: 0x3138, 22292 ssuperior: 0xF6F2, 22293 sterling: 0x00A3, 22294 sterlingmonospace: 0xFFE1, 22295 strokelongoverlaycmb: 0x0336, 22296 strokeshortoverlaycmb: 0x0335, 22297 subset: 0x2282, 22298 subsetnotequal: 0x228A, 22299 subsetorequal: 0x2286, 22300 succeeds: 0x227B, 22301 suchthat: 0x220B, 22302 suhiragana: 0x3059, 22303 sukatakana: 0x30B9, 22304 sukatakanahalfwidth: 0xFF7D, 22305 sukunarabic: 0x0652, 22306 summation: 0x2211, 22307 sun: 0x263C, 22308 superset: 0x2283, 22309 supersetnotequal: 0x228B, 22310 supersetorequal: 0x2287, 22311 svsquare: 0x33DC, 22312 syouwaerasquare: 0x337C, 22313 t: 0x0074, 22314 tabengali: 0x09A4, 22315 tackdown: 0x22A4, 22316 tackleft: 0x22A3, 22317 tadeva: 0x0924, 22318 tagujarati: 0x0AA4, 22319 tagurmukhi: 0x0A24, 22320 taharabic: 0x0637, 22321 tahfinalarabic: 0xFEC2, 22322 tahinitialarabic: 0xFEC3, 22323 tahiragana: 0x305F, 22324 tahmedialarabic: 0xFEC4, 22325 taisyouerasquare: 0x337D, 22326 takatakana: 0x30BF, 22327 takatakanahalfwidth: 0xFF80, 22328 tatweelarabic: 0x0640, 22329 tau: 0x03C4, 22330 tav: 0x05EA, 22331 tavdages: 0xFB4A, 22332 tavdagesh: 0xFB4A, 22333 tavdageshhebrew: 0xFB4A, 22334 tavhebrew: 0x05EA, 22335 tbar: 0x0167, 22336 tbopomofo: 0x310A, 22337 tcaron: 0x0165, 22338 tccurl: 0x02A8, 22339 tcedilla: 0x0163, 22340 tcheharabic: 0x0686, 22341 tchehfinalarabic: 0xFB7B, 22342 tchehinitialarabic: 0xFB7C, 22343 tchehmedialarabic: 0xFB7D, 22344 tcircle: 0x24E3, 22345 tcircumflexbelow: 0x1E71, 22346 tcommaaccent: 0x0163, 22347 tdieresis: 0x1E97, 22348 tdotaccent: 0x1E6B, 22349 tdotbelow: 0x1E6D, 22350 tecyrillic: 0x0442, 22351 tedescendercyrillic: 0x04AD, 22352 teharabic: 0x062A, 22353 tehfinalarabic: 0xFE96, 22354 tehhahinitialarabic: 0xFCA2, 22355 tehhahisolatedarabic: 0xFC0C, 22356 tehinitialarabic: 0xFE97, 22357 tehiragana: 0x3066, 22358 tehjeeminitialarabic: 0xFCA1, 22359 tehjeemisolatedarabic: 0xFC0B, 22360 tehmarbutaarabic: 0x0629, 22361 tehmarbutafinalarabic: 0xFE94, 22362 tehmedialarabic: 0xFE98, 22363 tehmeeminitialarabic: 0xFCA4, 22364 tehmeemisolatedarabic: 0xFC0E, 22365 tehnoonfinalarabic: 0xFC73, 22366 tekatakana: 0x30C6, 22367 tekatakanahalfwidth: 0xFF83, 22368 telephone: 0x2121, 22369 telephoneblack: 0x260E, 22370 telishagedolahebrew: 0x05A0, 22371 telishaqetanahebrew: 0x05A9, 22372 tencircle: 0x2469, 22373 tenideographicparen: 0x3229, 22374 tenparen: 0x247D, 22375 tenperiod: 0x2491, 22376 tenroman: 0x2179, 22377 tesh: 0x02A7, 22378 tet: 0x05D8, 22379 tetdagesh: 0xFB38, 22380 tetdageshhebrew: 0xFB38, 22381 tethebrew: 0x05D8, 22382 tetsecyrillic: 0x04B5, 22383 tevirhebrew: 0x059B, 22384 tevirlefthebrew: 0x059B, 22385 thabengali: 0x09A5, 22386 thadeva: 0x0925, 22387 thagujarati: 0x0AA5, 22388 thagurmukhi: 0x0A25, 22389 thalarabic: 0x0630, 22390 thalfinalarabic: 0xFEAC, 22391 thanthakhatlowleftthai: 0xF898, 22392 thanthakhatlowrightthai: 0xF897, 22393 thanthakhatthai: 0x0E4C, 22394 thanthakhatupperleftthai: 0xF896, 22395 theharabic: 0x062B, 22396 thehfinalarabic: 0xFE9A, 22397 thehinitialarabic: 0xFE9B, 22398 thehmedialarabic: 0xFE9C, 22399 thereexists: 0x2203, 22400 therefore: 0x2234, 22401 theta: 0x03B8, 22402 theta1: 0x03D1, 22403 thetasymbolgreek: 0x03D1, 22404 thieuthacirclekorean: 0x3279, 22405 thieuthaparenkorean: 0x3219, 22406 thieuthcirclekorean: 0x326B, 22407 thieuthkorean: 0x314C, 22408 thieuthparenkorean: 0x320B, 22409 thirteencircle: 0x246C, 22410 thirteenparen: 0x2480, 22411 thirteenperiod: 0x2494, 22412 thonangmonthothai: 0x0E11, 22413 thook: 0x01AD, 22414 thophuthaothai: 0x0E12, 22415 thorn: 0x00FE, 22416 thothahanthai: 0x0E17, 22417 thothanthai: 0x0E10, 22418 thothongthai: 0x0E18, 22419 thothungthai: 0x0E16, 22420 thousandcyrillic: 0x0482, 22421 thousandsseparatorarabic: 0x066C, 22422 thousandsseparatorpersian: 0x066C, 22423 three: 0x0033, 22424 threearabic: 0x0663, 22425 threebengali: 0x09E9, 22426 threecircle: 0x2462, 22427 threecircleinversesansserif: 0x278C, 22428 threedeva: 0x0969, 22429 threeeighths: 0x215C, 22430 threegujarati: 0x0AE9, 22431 threegurmukhi: 0x0A69, 22432 threehackarabic: 0x0663, 22433 threehangzhou: 0x3023, 22434 threeideographicparen: 0x3222, 22435 threeinferior: 0x2083, 22436 threemonospace: 0xFF13, 22437 threenumeratorbengali: 0x09F6, 22438 threeoldstyle: 0xF733, 22439 threeparen: 0x2476, 22440 threeperiod: 0x248A, 22441 threepersian: 0x06F3, 22442 threequarters: 0x00BE, 22443 threequartersemdash: 0xF6DE, 22444 threeroman: 0x2172, 22445 threesuperior: 0x00B3, 22446 threethai: 0x0E53, 22447 thzsquare: 0x3394, 22448 tihiragana: 0x3061, 22449 tikatakana: 0x30C1, 22450 tikatakanahalfwidth: 0xFF81, 22451 tikeutacirclekorean: 0x3270, 22452 tikeutaparenkorean: 0x3210, 22453 tikeutcirclekorean: 0x3262, 22454 tikeutkorean: 0x3137, 22455 tikeutparenkorean: 0x3202, 22456 tilde: 0x02DC, 22457 tildebelowcmb: 0x0330, 22458 tildecmb: 0x0303, 22459 tildecomb: 0x0303, 22460 tildedoublecmb: 0x0360, 22461 tildeoperator: 0x223C, 22462 tildeoverlaycmb: 0x0334, 22463 tildeverticalcmb: 0x033E, 22464 timescircle: 0x2297, 22465 tipehahebrew: 0x0596, 22466 tipehalefthebrew: 0x0596, 22467 tippigurmukhi: 0x0A70, 22468 titlocyrilliccmb: 0x0483, 22469 tiwnarmenian: 0x057F, 22470 tlinebelow: 0x1E6F, 22471 tmonospace: 0xFF54, 22472 toarmenian: 0x0569, 22473 tohiragana: 0x3068, 22474 tokatakana: 0x30C8, 22475 tokatakanahalfwidth: 0xFF84, 22476 tonebarextrahighmod: 0x02E5, 22477 tonebarextralowmod: 0x02E9, 22478 tonebarhighmod: 0x02E6, 22479 tonebarlowmod: 0x02E8, 22480 tonebarmidmod: 0x02E7, 22481 tonefive: 0x01BD, 22482 tonesix: 0x0185, 22483 tonetwo: 0x01A8, 22484 tonos: 0x0384, 22485 tonsquare: 0x3327, 22486 topatakthai: 0x0E0F, 22487 tortoiseshellbracketleft: 0x3014, 22488 tortoiseshellbracketleftsmall: 0xFE5D, 22489 tortoiseshellbracketleftvertical: 0xFE39, 22490 tortoiseshellbracketright: 0x3015, 22491 tortoiseshellbracketrightsmall: 0xFE5E, 22492 tortoiseshellbracketrightvertical: 0xFE3A, 22493 totaothai: 0x0E15, 22494 tpalatalhook: 0x01AB, 22495 tparen: 0x24AF, 22496 trademark: 0x2122, 22497 trademarksans: 0xF8EA, 22498 trademarkserif: 0xF6DB, 22499 tretroflexhook: 0x0288, 22500 triagdn: 0x25BC, 22501 triaglf: 0x25C4, 22502 triagrt: 0x25BA, 22503 triagup: 0x25B2, 22504 ts: 0x02A6, 22505 tsadi: 0x05E6, 22506 tsadidagesh: 0xFB46, 22507 tsadidageshhebrew: 0xFB46, 22508 tsadihebrew: 0x05E6, 22509 tsecyrillic: 0x0446, 22510 tsere: 0x05B5, 22511 tsere12: 0x05B5, 22512 tsere1e: 0x05B5, 22513 tsere2b: 0x05B5, 22514 tserehebrew: 0x05B5, 22515 tserenarrowhebrew: 0x05B5, 22516 tserequarterhebrew: 0x05B5, 22517 tserewidehebrew: 0x05B5, 22518 tshecyrillic: 0x045B, 22519 tsuperior: 0xF6F3, 22520 ttabengali: 0x099F, 22521 ttadeva: 0x091F, 22522 ttagujarati: 0x0A9F, 22523 ttagurmukhi: 0x0A1F, 22524 tteharabic: 0x0679, 22525 ttehfinalarabic: 0xFB67, 22526 ttehinitialarabic: 0xFB68, 22527 ttehmedialarabic: 0xFB69, 22528 tthabengali: 0x09A0, 22529 tthadeva: 0x0920, 22530 tthagujarati: 0x0AA0, 22531 tthagurmukhi: 0x0A20, 22532 tturned: 0x0287, 22533 tuhiragana: 0x3064, 22534 tukatakana: 0x30C4, 22535 tukatakanahalfwidth: 0xFF82, 22536 tusmallhiragana: 0x3063, 22537 tusmallkatakana: 0x30C3, 22538 tusmallkatakanahalfwidth: 0xFF6F, 22539 twelvecircle: 0x246B, 22540 twelveparen: 0x247F, 22541 twelveperiod: 0x2493, 22542 twelveroman: 0x217B, 22543 twentycircle: 0x2473, 22544 twentyhangzhou: 0x5344, 22545 twentyparen: 0x2487, 22546 twentyperiod: 0x249B, 22547 two: 0x0032, 22548 twoarabic: 0x0662, 22549 twobengali: 0x09E8, 22550 twocircle: 0x2461, 22551 twocircleinversesansserif: 0x278B, 22552 twodeva: 0x0968, 22553 twodotenleader: 0x2025, 22554 twodotleader: 0x2025, 22555 twodotleadervertical: 0xFE30, 22556 twogujarati: 0x0AE8, 22557 twogurmukhi: 0x0A68, 22558 twohackarabic: 0x0662, 22559 twohangzhou: 0x3022, 22560 twoideographicparen: 0x3221, 22561 twoinferior: 0x2082, 22562 twomonospace: 0xFF12, 22563 twonumeratorbengali: 0x09F5, 22564 twooldstyle: 0xF732, 22565 twoparen: 0x2475, 22566 twoperiod: 0x2489, 22567 twopersian: 0x06F2, 22568 tworoman: 0x2171, 22569 twostroke: 0x01BB, 22570 twosuperior: 0x00B2, 22571 twothai: 0x0E52, 22572 twothirds: 0x2154, 22573 u: 0x0075, 22574 uacute: 0x00FA, 22575 ubar: 0x0289, 22576 ubengali: 0x0989, 22577 ubopomofo: 0x3128, 22578 ubreve: 0x016D, 22579 ucaron: 0x01D4, 22580 ucircle: 0x24E4, 22581 ucircumflex: 0x00FB, 22582 ucircumflexbelow: 0x1E77, 22583 ucyrillic: 0x0443, 22584 udattadeva: 0x0951, 22585 udblacute: 0x0171, 22586 udblgrave: 0x0215, 22587 udeva: 0x0909, 22588 udieresis: 0x00FC, 22589 udieresisacute: 0x01D8, 22590 udieresisbelow: 0x1E73, 22591 udieresiscaron: 0x01DA, 22592 udieresiscyrillic: 0x04F1, 22593 udieresisgrave: 0x01DC, 22594 udieresismacron: 0x01D6, 22595 udotbelow: 0x1EE5, 22596 ugrave: 0x00F9, 22597 ugujarati: 0x0A89, 22598 ugurmukhi: 0x0A09, 22599 uhiragana: 0x3046, 22600 uhookabove: 0x1EE7, 22601 uhorn: 0x01B0, 22602 uhornacute: 0x1EE9, 22603 uhorndotbelow: 0x1EF1, 22604 uhorngrave: 0x1EEB, 22605 uhornhookabove: 0x1EED, 22606 uhorntilde: 0x1EEF, 22607 uhungarumlaut: 0x0171, 22608 uhungarumlautcyrillic: 0x04F3, 22609 uinvertedbreve: 0x0217, 22610 ukatakana: 0x30A6, 22611 ukatakanahalfwidth: 0xFF73, 22612 ukcyrillic: 0x0479, 22613 ukorean: 0x315C, 22614 umacron: 0x016B, 22615 umacroncyrillic: 0x04EF, 22616 umacrondieresis: 0x1E7B, 22617 umatragurmukhi: 0x0A41, 22618 umonospace: 0xFF55, 22619 underscore: 0x005F, 22620 underscoredbl: 0x2017, 22621 underscoremonospace: 0xFF3F, 22622 underscorevertical: 0xFE33, 22623 underscorewavy: 0xFE4F, 22624 union: 0x222A, 22625 universal: 0x2200, 22626 uogonek: 0x0173, 22627 uparen: 0x24B0, 22628 upblock: 0x2580, 22629 upperdothebrew: 0x05C4, 22630 upsilon: 0x03C5, 22631 upsilondieresis: 0x03CB, 22632 upsilondieresistonos: 0x03B0, 22633 upsilonlatin: 0x028A, 22634 upsilontonos: 0x03CD, 22635 uptackbelowcmb: 0x031D, 22636 uptackmod: 0x02D4, 22637 uragurmukhi: 0x0A73, 22638 uring: 0x016F, 22639 ushortcyrillic: 0x045E, 22640 usmallhiragana: 0x3045, 22641 usmallkatakana: 0x30A5, 22642 usmallkatakanahalfwidth: 0xFF69, 22643 ustraightcyrillic: 0x04AF, 22644 ustraightstrokecyrillic: 0x04B1, 22645 utilde: 0x0169, 22646 utildeacute: 0x1E79, 22647 utildebelow: 0x1E75, 22648 uubengali: 0x098A, 22649 uudeva: 0x090A, 22650 uugujarati: 0x0A8A, 22651 uugurmukhi: 0x0A0A, 22652 uumatragurmukhi: 0x0A42, 22653 uuvowelsignbengali: 0x09C2, 22654 uuvowelsigndeva: 0x0942, 22655 uuvowelsigngujarati: 0x0AC2, 22656 uvowelsignbengali: 0x09C1, 22657 uvowelsigndeva: 0x0941, 22658 uvowelsigngujarati: 0x0AC1, 22659 v: 0x0076, 22660 vadeva: 0x0935, 22661 vagujarati: 0x0AB5, 22662 vagurmukhi: 0x0A35, 22663 vakatakana: 0x30F7, 22664 vav: 0x05D5, 22665 vavdagesh: 0xFB35, 22666 vavdagesh65: 0xFB35, 22667 vavdageshhebrew: 0xFB35, 22668 vavhebrew: 0x05D5, 22669 vavholam: 0xFB4B, 22670 vavholamhebrew: 0xFB4B, 22671 vavvavhebrew: 0x05F0, 22672 vavyodhebrew: 0x05F1, 22673 vcircle: 0x24E5, 22674 vdotbelow: 0x1E7F, 22675 vecyrillic: 0x0432, 22676 veharabic: 0x06A4, 22677 vehfinalarabic: 0xFB6B, 22678 vehinitialarabic: 0xFB6C, 22679 vehmedialarabic: 0xFB6D, 22680 vekatakana: 0x30F9, 22681 venus: 0x2640, 22682 verticalbar: 0x007C, 22683 verticallineabovecmb: 0x030D, 22684 verticallinebelowcmb: 0x0329, 22685 verticallinelowmod: 0x02CC, 22686 verticallinemod: 0x02C8, 22687 vewarmenian: 0x057E, 22688 vhook: 0x028B, 22689 vikatakana: 0x30F8, 22690 viramabengali: 0x09CD, 22691 viramadeva: 0x094D, 22692 viramagujarati: 0x0ACD, 22693 visargabengali: 0x0983, 22694 visargadeva: 0x0903, 22695 visargagujarati: 0x0A83, 22696 vmonospace: 0xFF56, 22697 voarmenian: 0x0578, 22698 voicediterationhiragana: 0x309E, 22699 voicediterationkatakana: 0x30FE, 22700 voicedmarkkana: 0x309B, 22701 voicedmarkkanahalfwidth: 0xFF9E, 22702 vokatakana: 0x30FA, 22703 vparen: 0x24B1, 22704 vtilde: 0x1E7D, 22705 vturned: 0x028C, 22706 vuhiragana: 0x3094, 22707 vukatakana: 0x30F4, 22708 w: 0x0077, 22709 wacute: 0x1E83, 22710 waekorean: 0x3159, 22711 wahiragana: 0x308F, 22712 wakatakana: 0x30EF, 22713 wakatakanahalfwidth: 0xFF9C, 22714 wakorean: 0x3158, 22715 wasmallhiragana: 0x308E, 22716 wasmallkatakana: 0x30EE, 22717 wattosquare: 0x3357, 22718 wavedash: 0x301C, 22719 wavyunderscorevertical: 0xFE34, 22720 wawarabic: 0x0648, 22721 wawfinalarabic: 0xFEEE, 22722 wawhamzaabovearabic: 0x0624, 22723 wawhamzaabovefinalarabic: 0xFE86, 22724 wbsquare: 0x33DD, 22725 wcircle: 0x24E6, 22726 wcircumflex: 0x0175, 22727 wdieresis: 0x1E85, 22728 wdotaccent: 0x1E87, 22729 wdotbelow: 0x1E89, 22730 wehiragana: 0x3091, 22731 weierstrass: 0x2118, 22732 wekatakana: 0x30F1, 22733 wekorean: 0x315E, 22734 weokorean: 0x315D, 22735 wgrave: 0x1E81, 22736 whitebullet: 0x25E6, 22737 whitecircle: 0x25CB, 22738 whitecircleinverse: 0x25D9, 22739 whitecornerbracketleft: 0x300E, 22740 whitecornerbracketleftvertical: 0xFE43, 22741 whitecornerbracketright: 0x300F, 22742 whitecornerbracketrightvertical: 0xFE44, 22743 whitediamond: 0x25C7, 22744 whitediamondcontainingblacksmalldiamond: 0x25C8, 22745 whitedownpointingsmalltriangle: 0x25BF, 22746 whitedownpointingtriangle: 0x25BD, 22747 whiteleftpointingsmalltriangle: 0x25C3, 22748 whiteleftpointingtriangle: 0x25C1, 22749 whitelenticularbracketleft: 0x3016, 22750 whitelenticularbracketright: 0x3017, 22751 whiterightpointingsmalltriangle: 0x25B9, 22752 whiterightpointingtriangle: 0x25B7, 22753 whitesmallsquare: 0x25AB, 22754 whitesmilingface: 0x263A, 22755 whitesquare: 0x25A1, 22756 whitestar: 0x2606, 22757 whitetelephone: 0x260F, 22758 whitetortoiseshellbracketleft: 0x3018, 22759 whitetortoiseshellbracketright: 0x3019, 22760 whiteuppointingsmalltriangle: 0x25B5, 22761 whiteuppointingtriangle: 0x25B3, 22762 wihiragana: 0x3090, 22763 wikatakana: 0x30F0, 22764 wikorean: 0x315F, 22765 wmonospace: 0xFF57, 22766 wohiragana: 0x3092, 22767 wokatakana: 0x30F2, 22768 wokatakanahalfwidth: 0xFF66, 22769 won: 0x20A9, 22770 wonmonospace: 0xFFE6, 22771 wowaenthai: 0x0E27, 22772 wparen: 0x24B2, 22773 wring: 0x1E98, 22774 wsuperior: 0x02B7, 22775 wturned: 0x028D, 22776 wynn: 0x01BF, 22777 x: 0x0078, 22778 xabovecmb: 0x033D, 22779 xbopomofo: 0x3112, 22780 xcircle: 0x24E7, 22781 xdieresis: 0x1E8D, 22782 xdotaccent: 0x1E8B, 22783 xeharmenian: 0x056D, 22784 xi: 0x03BE, 22785 xmonospace: 0xFF58, 22786 xparen: 0x24B3, 22787 xsuperior: 0x02E3, 22788 y: 0x0079, 22789 yaadosquare: 0x334E, 22790 yabengali: 0x09AF, 22791 yacute: 0x00FD, 22792 yadeva: 0x092F, 22793 yaekorean: 0x3152, 22794 yagujarati: 0x0AAF, 22795 yagurmukhi: 0x0A2F, 22796 yahiragana: 0x3084, 22797 yakatakana: 0x30E4, 22798 yakatakanahalfwidth: 0xFF94, 22799 yakorean: 0x3151, 22800 yamakkanthai: 0x0E4E, 22801 yasmallhiragana: 0x3083, 22802 yasmallkatakana: 0x30E3, 22803 yasmallkatakanahalfwidth: 0xFF6C, 22804 yatcyrillic: 0x0463, 22805 ycircle: 0x24E8, 22806 ycircumflex: 0x0177, 22807 ydieresis: 0x00FF, 22808 ydotaccent: 0x1E8F, 22809 ydotbelow: 0x1EF5, 22810 yeharabic: 0x064A, 22811 yehbarreearabic: 0x06D2, 22812 yehbarreefinalarabic: 0xFBAF, 22813 yehfinalarabic: 0xFEF2, 22814 yehhamzaabovearabic: 0x0626, 22815 yehhamzaabovefinalarabic: 0xFE8A, 22816 yehhamzaaboveinitialarabic: 0xFE8B, 22817 yehhamzaabovemedialarabic: 0xFE8C, 22818 yehinitialarabic: 0xFEF3, 22819 yehmedialarabic: 0xFEF4, 22820 yehmeeminitialarabic: 0xFCDD, 22821 yehmeemisolatedarabic: 0xFC58, 22822 yehnoonfinalarabic: 0xFC94, 22823 yehthreedotsbelowarabic: 0x06D1, 22824 yekorean: 0x3156, 22825 yen: 0x00A5, 22826 yenmonospace: 0xFFE5, 22827 yeokorean: 0x3155, 22828 yeorinhieuhkorean: 0x3186, 22829 yerahbenyomohebrew: 0x05AA, 22830 yerahbenyomolefthebrew: 0x05AA, 22831 yericyrillic: 0x044B, 22832 yerudieresiscyrillic: 0x04F9, 22833 yesieungkorean: 0x3181, 22834 yesieungpansioskorean: 0x3183, 22835 yesieungsioskorean: 0x3182, 22836 yetivhebrew: 0x059A, 22837 ygrave: 0x1EF3, 22838 yhook: 0x01B4, 22839 yhookabove: 0x1EF7, 22840 yiarmenian: 0x0575, 22841 yicyrillic: 0x0457, 22842 yikorean: 0x3162, 22843 yinyang: 0x262F, 22844 yiwnarmenian: 0x0582, 22845 ymonospace: 0xFF59, 22846 yod: 0x05D9, 22847 yoddagesh: 0xFB39, 22848 yoddageshhebrew: 0xFB39, 22849 yodhebrew: 0x05D9, 22850 yodyodhebrew: 0x05F2, 22851 yodyodpatahhebrew: 0xFB1F, 22852 yohiragana: 0x3088, 22853 yoikorean: 0x3189, 22854 yokatakana: 0x30E8, 22855 yokatakanahalfwidth: 0xFF96, 22856 yokorean: 0x315B, 22857 yosmallhiragana: 0x3087, 22858 yosmallkatakana: 0x30E7, 22859 yosmallkatakanahalfwidth: 0xFF6E, 22860 yotgreek: 0x03F3, 22861 yoyaekorean: 0x3188, 22862 yoyakorean: 0x3187, 22863 yoyakthai: 0x0E22, 22864 yoyingthai: 0x0E0D, 22865 yparen: 0x24B4, 22866 ypogegrammeni: 0x037A, 22867 ypogegrammenigreekcmb: 0x0345, 22868 yr: 0x01A6, 22869 yring: 0x1E99, 22870 ysuperior: 0x02B8, 22871 ytilde: 0x1EF9, 22872 yturned: 0x028E, 22873 yuhiragana: 0x3086, 22874 yuikorean: 0x318C, 22875 yukatakana: 0x30E6, 22876 yukatakanahalfwidth: 0xFF95, 22877 yukorean: 0x3160, 22878 yusbigcyrillic: 0x046B, 22879 yusbigiotifiedcyrillic: 0x046D, 22880 yuslittlecyrillic: 0x0467, 22881 yuslittleiotifiedcyrillic: 0x0469, 22882 yusmallhiragana: 0x3085, 22883 yusmallkatakana: 0x30E5, 22884 yusmallkatakanahalfwidth: 0xFF6D, 22885 yuyekorean: 0x318B, 22886 yuyeokorean: 0x318A, 22887 yyabengali: 0x09DF, 22888 yyadeva: 0x095F, 22889 z: 0x007A, 22890 zaarmenian: 0x0566, 22891 zacute: 0x017A, 22892 zadeva: 0x095B, 22893 zagurmukhi: 0x0A5B, 22894 zaharabic: 0x0638, 22895 zahfinalarabic: 0xFEC6, 22896 zahinitialarabic: 0xFEC7, 22897 zahiragana: 0x3056, 22898 zahmedialarabic: 0xFEC8, 22899 zainarabic: 0x0632, 22900 zainfinalarabic: 0xFEB0, 22901 zakatakana: 0x30B6, 22902 zaqefgadolhebrew: 0x0595, 22903 zaqefqatanhebrew: 0x0594, 22904 zarqahebrew: 0x0598, 22905 zayin: 0x05D6, 22906 zayindagesh: 0xFB36, 22907 zayindageshhebrew: 0xFB36, 22908 zayinhebrew: 0x05D6, 22909 zbopomofo: 0x3117, 22910 zcaron: 0x017E, 22911 zcircle: 0x24E9, 22912 zcircumflex: 0x1E91, 22913 zcurl: 0x0291, 22914 zdot: 0x017C, 22915 zdotaccent: 0x017C, 22916 zdotbelow: 0x1E93, 22917 zecyrillic: 0x0437, 22918 zedescendercyrillic: 0x0499, 22919 zedieresiscyrillic: 0x04DF, 22920 zehiragana: 0x305C, 22921 zekatakana: 0x30BC, 22922 zero: 0x0030, 22923 zeroarabic: 0x0660, 22924 zerobengali: 0x09E6, 22925 zerodeva: 0x0966, 22926 zerogujarati: 0x0AE6, 22927 zerogurmukhi: 0x0A66, 22928 zerohackarabic: 0x0660, 22929 zeroinferior: 0x2080, 22930 zeromonospace: 0xFF10, 22931 zerooldstyle: 0xF730, 22932 zeropersian: 0x06F0, 22933 zerosuperior: 0x2070, 22934 zerothai: 0x0E50, 22935 zerowidthjoiner: 0xFEFF, 22936 zerowidthnonjoiner: 0x200C, 22937 zerowidthspace: 0x200B, 22938 zeta: 0x03B6, 22939 zhbopomofo: 0x3113, 22940 zhearmenian: 0x056A, 22941 zhebrevecyrillic: 0x04C2, 22942 zhecyrillic: 0x0436, 22943 zhedescendercyrillic: 0x0497, 22944 zhedieresiscyrillic: 0x04DD, 22945 zihiragana: 0x3058, 22946 zikatakana: 0x30B8, 22947 zinorhebrew: 0x05AE, 22948 zlinebelow: 0x1E95, 22949 zmonospace: 0xFF5A, 22950 zohiragana: 0x305E, 22951 zokatakana: 0x30BE, 22952 zparen: 0x24B5, 22953 zretroflexhook: 0x0290, 22954 zstroke: 0x01B6, 22955 zuhiragana: 0x305A, 22956 zukatakana: 0x30BA, 22957 '.notdef': 0x0000 22958 }; 22959 22960 22961 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 22962 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ 22963 22964 'use strict'; 22965 22966 var PDFImage = (function PDFImageClosure() { 22967 /** 22968 * Decode the image in the main thread if it supported. Resovles the promise 22969 * when the image data is ready. 22970 */ 22971 function handleImageData(handler, xref, res, image, promise) { 22972 if (image instanceof JpegStream && image.isNativelyDecodable(xref, res)) { 22973 // For natively supported jpegs send them to the main thread for decoding. 22974 var dict = image.dict; 22975 var colorSpace = dict.get('ColorSpace', 'CS'); 22976 colorSpace = ColorSpace.parse(colorSpace, xref, res); 22977 var numComps = colorSpace.numComps; 22978 handler.send('JpegDecode', [image.getIR(), numComps], function(message) { 22979 var data = message.data; 22980 var stream = new Stream(data, 0, data.length, image.dict); 22981 promise.resolve(stream); 22982 }); 22983 } else { 22984 promise.resolve(image); 22985 } 22986 } 22987 /** 22988 * Decode and clamp a value. The formula is different from the spec because we 22989 * don't decode to float range [0,1], we decode it in the [0,max] range. 22990 */ 22991 function decodeAndClamp(value, addend, coefficient, max) { 22992 value = addend + value * coefficient; 22993 // Clamp the value to the range 22994 return value < 0 ? 0 : value > max ? max : value; 22995 } 22996 function PDFImage(xref, res, image, inline, smask) { 22997 this.image = image; 22998 if (image.getParams) { 22999 // JPX/JPEG2000 streams directly contain bits per component 23000 // and color space mode information. 23001 TODO('get params from actual stream'); 23002 // var bits = ... 23003 // var colorspace = ... 23004 } 23005 // TODO cache rendered images? 23006 23007 var dict = image.dict; 23008 this.width = dict.get('Width', 'W'); 23009 this.height = dict.get('Height', 'H'); 23010 23011 if (this.width < 1 || this.height < 1) 23012 error('Invalid image width: ' + this.width + ' or height: ' + 23013 this.height); 23014 23015 this.interpolate = dict.get('Interpolate', 'I') || false; 23016 this.imageMask = dict.get('ImageMask', 'IM') || false; 23017 23018 var bitsPerComponent = image.bitsPerComponent; 23019 if (!bitsPerComponent) { 23020 bitsPerComponent = dict.get('BitsPerComponent', 'BPC'); 23021 if (!bitsPerComponent) { 23022 if (this.imageMask) 23023 bitsPerComponent = 1; 23024 else 23025 error('Bits per component missing in image: ' + this.imageMask); 23026 } 23027 } 23028 this.bpc = bitsPerComponent; 23029 23030 if (!this.imageMask) { 23031 var colorSpace = dict.get('ColorSpace', 'CS'); 23032 if (!colorSpace) { 23033 TODO('JPX images (which don"t require color spaces'); 23034 colorSpace = new Name('DeviceRGB'); 23035 } 23036 this.colorSpace = ColorSpace.parse(colorSpace, xref, res); 23037 this.numComps = this.colorSpace.numComps; 23038 } 23039 23040 this.decode = dict.get('Decode', 'D'); 23041 this.needsDecode = false; 23042 if (this.decode && this.colorSpace && 23043 !this.colorSpace.isDefaultDecode(this.decode)) { 23044 this.needsDecode = true; 23045 // Do some preprocessing to avoid more math. 23046 var max = (1 << bitsPerComponent) - 1; 23047 this.decodeCoefficients = []; 23048 this.decodeAddends = []; 23049 for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) { 23050 var dmin = this.decode[i]; 23051 var dmax = this.decode[i + 1]; 23052 this.decodeCoefficients[j] = dmax - dmin; 23053 this.decodeAddends[j] = max * dmin; 23054 } 23055 } 23056 23057 var mask = dict.get('Mask'); 23058 23059 if (mask) { 23060 TODO('masked images'); 23061 } else if (smask) { 23062 this.smask = new PDFImage(xref, res, smask, false); 23063 } 23064 } 23065 /** 23066 * Handles processing of image data and calls the callback with an argument 23067 * of a PDFImage when the image is ready to be used. 23068 */ 23069 PDFImage.buildImage = function PDFImage_buildImage(callback, handler, xref, 23070 res, image, inline) { 23071 var imageDataPromise = new Promise(); 23072 var smaskPromise = new Promise(); 23073 // The image data and smask data may not be ready yet, wait till both are 23074 // resolved. 23075 Promise.all([imageDataPromise, smaskPromise]).then(function(results) { 23076 var imageData = results[0], smaskData = results[1]; 23077 var image = new PDFImage(xref, res, imageData, inline, smaskData); 23078 callback(image); 23079 }); 23080 23081 handleImageData(handler, xref, res, image, imageDataPromise); 23082 23083 var smask = image.dict.get('SMask'); 23084 if (smask) 23085 handleImageData(handler, xref, res, smask, smaskPromise); 23086 else 23087 smaskPromise.resolve(null); 23088 }; 23089 23090 /** 23091 * Resize an image using the nearest neighbor algorithm. Currently only 23092 * supports one and three component images. 23093 * @param {TypedArray} pixels The original image with one component. 23094 * @param {Number} bpc Number of bits per component. 23095 * @param {Number} components Number of color components, 1 or 3 is supported. 23096 * @param {Number} w1 Original width. 23097 * @param {Number} h1 Original height. 23098 * @param {Number} w2 New width. 23099 * @param {Number} h2 New height. 23100 * @return {TypedArray} Resized image data. 23101 */ 23102 PDFImage.resize = function PDFImage_resize(pixels, bpc, components, 23103 w1, h1, w2, h2) { 23104 var length = w2 * h2 * components; 23105 var temp = bpc <= 8 ? new Uint8Array(length) : 23106 bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length); 23107 var xRatio = w1 / w2; 23108 var yRatio = h1 / h2; 23109 var px, py, newIndex, oldIndex; 23110 for (var i = 0; i < h2; i++) { 23111 for (var j = 0; j < w2; j++) { 23112 px = Math.floor(j * xRatio); 23113 py = Math.floor(i * yRatio); 23114 newIndex = (i * w2) + j; 23115 oldIndex = ((py * w1) + px); 23116 if (components === 1) { 23117 temp[newIndex] = pixels[oldIndex]; 23118 } else if (components === 3) { 23119 newIndex *= 3; 23120 oldIndex *= 3; 23121 temp[newIndex] = pixels[oldIndex]; 23122 temp[newIndex + 1] = pixels[oldIndex + 1]; 23123 temp[newIndex + 2] = pixels[oldIndex + 2]; 23124 } 23125 } 23126 } 23127 return temp; 23128 }; 23129 23130 PDFImage.prototype = { 23131 get drawWidth() { 23132 if (!this.smask) 23133 return this.width; 23134 return Math.max(this.width, this.smask.width); 23135 }, 23136 get drawHeight() { 23137 if (!this.smask) 23138 return this.height; 23139 return Math.max(this.height, this.smask.height); 23140 }, 23141 getComponents: function PDFImage_getComponents(buffer) { 23142 var bpc = this.bpc; 23143 var needsDecode = this.needsDecode; 23144 var decodeMap = this.decode; 23145 23146 // This image doesn't require any extra work. 23147 if (bpc == 8 && !needsDecode) 23148 return buffer; 23149 23150 var bufferLength = buffer.length; 23151 var width = this.width; 23152 var height = this.height; 23153 var numComps = this.numComps; 23154 23155 var length = width * height * numComps; 23156 var bufferPos = 0; 23157 var output = bpc <= 8 ? new Uint8Array(length) : 23158 bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length); 23159 var rowComps = width * numComps; 23160 var decodeAddends, decodeCoefficients; 23161 if (needsDecode) { 23162 decodeAddends = this.decodeAddends; 23163 decodeCoefficients = this.decodeCoefficients; 23164 } 23165 var max = (1 << bpc) - 1; 23166 23167 if (bpc == 8) { 23168 // Optimization for reading 8 bpc images that have a decode. 23169 for (var i = 0, ii = length; i < ii; ++i) { 23170 var compIndex = i % numComps; 23171 var value = buffer[i]; 23172 value = decodeAndClamp(value, decodeAddends[compIndex], 23173 decodeCoefficients[compIndex], max); 23174 output[i] = value; 23175 } 23176 } else if (bpc == 1) { 23177 // Optimization for reading 1 bpc images. 23178 var valueZero = 0, valueOne = 1; 23179 if (decodeMap) { 23180 valueZero = decodeMap[0] ? 1 : 0; 23181 valueOne = decodeMap[1] ? 1 : 0; 23182 } 23183 var mask = 0; 23184 var buf = 0; 23185 23186 for (var i = 0, ii = length; i < ii; ++i) { 23187 if (i % rowComps == 0) { 23188 mask = 0; 23189 buf = 0; 23190 } else { 23191 mask >>= 1; 23192 } 23193 23194 if (mask <= 0) { 23195 buf = buffer[bufferPos++]; 23196 mask = 128; 23197 } 23198 23199 output[i] = !(buf & mask) ? valueZero : valueOne; 23200 } 23201 } else { 23202 // The general case that handles all other bpc values. 23203 var bits = 0, buf = 0; 23204 for (var i = 0, ii = length; i < ii; ++i) { 23205 if (i % rowComps == 0) { 23206 buf = 0; 23207 bits = 0; 23208 } 23209 23210 while (bits < bpc) { 23211 buf = (buf << 8) | buffer[bufferPos++]; 23212 bits += 8; 23213 } 23214 23215 var remainingBits = bits - bpc; 23216 var value = buf >> remainingBits; 23217 if (needsDecode) { 23218 var compIndex = i % numComps; 23219 value = decodeAndClamp(value, decodeAddends[compIndex], 23220 decodeCoefficients[compIndex], max); 23221 } 23222 output[i] = value; 23223 buf = buf & ((1 << remainingBits) - 1); 23224 bits = remainingBits; 23225 } 23226 } 23227 return output; 23228 }, 23229 getOpacity: function PDFImage_getOpacity(width, height) { 23230 var smask = this.smask; 23231 var originalWidth = this.width; 23232 var originalHeight = this.height; 23233 var buf; 23234 23235 if (smask) { 23236 var sw = smask.width; 23237 var sh = smask.height; 23238 buf = new Uint8Array(sw * sh); 23239 smask.fillGrayBuffer(buf); 23240 if (sw != width || sh != height) 23241 buf = PDFImage.resize(buf, smask.bps, 1, sw, sh, width, height); 23242 } else { 23243 buf = new Uint8Array(width * height); 23244 for (var i = 0, ii = width * height; i < ii; ++i) 23245 buf[i] = 255; 23246 } 23247 return buf; 23248 }, 23249 applyStencilMask: function PDFImage_applyStencilMask(buffer, 23250 inverseDecode) { 23251 var width = this.width, height = this.height; 23252 var bitStrideLength = (width + 7) >> 3; 23253 var imgArray = this.getImageBytes(bitStrideLength * height); 23254 var imgArrayPos = 0; 23255 var i, j, mask, buf; 23256 // removing making non-masked pixels transparent 23257 var bufferPos = 3; // alpha component offset 23258 for (i = 0; i < height; i++) { 23259 mask = 0; 23260 for (j = 0; j < width; j++) { 23261 if (!mask) { 23262 buf = imgArray[imgArrayPos++]; 23263 mask = 128; 23264 } 23265 if (!(buf & mask) == inverseDecode) { 23266 buffer[bufferPos] = 0; 23267 } 23268 bufferPos += 4; 23269 mask >>= 1; 23270 } 23271 } 23272 }, 23273 fillRgbaBuffer: function PDFImage_fillRgbaBuffer(buffer, width, height) { 23274 var numComps = this.numComps; 23275 var originalWidth = this.width; 23276 var originalHeight = this.height; 23277 var bpc = this.bpc; 23278 23279 // rows start at byte boundary; 23280 var rowBytes = (originalWidth * numComps * bpc + 7) >> 3; 23281 var imgArray = this.getImageBytes(originalHeight * rowBytes); 23282 23283 var comps = this.colorSpace.getRgbBuffer( 23284 this.getComponents(imgArray), bpc); 23285 if (originalWidth != width || originalHeight != height) 23286 comps = PDFImage.resize(comps, this.bpc, 3, originalWidth, 23287 originalHeight, width, height); 23288 var compsPos = 0; 23289 var opacity = this.getOpacity(width, height); 23290 var opacityPos = 0; 23291 var length = width * height * 4; 23292 23293 for (var i = 0; i < length; i += 4) { 23294 buffer[i] = comps[compsPos++]; 23295 buffer[i + 1] = comps[compsPos++]; 23296 buffer[i + 2] = comps[compsPos++]; 23297 buffer[i + 3] = opacity[opacityPos++]; 23298 } 23299 }, 23300 fillGrayBuffer: function PDFImage_fillGrayBuffer(buffer) { 23301 var numComps = this.numComps; 23302 if (numComps != 1) 23303 error('Reading gray scale from a color image: ' + numComps); 23304 23305 var width = this.width; 23306 var height = this.height; 23307 var bpc = this.bpc; 23308 23309 // rows start at byte boundary; 23310 var rowBytes = (width * numComps * bpc + 7) >> 3; 23311 var imgArray = this.getImageBytes(height * rowBytes); 23312 23313 var comps = this.getComponents(imgArray); 23314 var length = width * height; 23315 // we aren't using a colorspace so we need to scale the value 23316 var scale = 255 / ((1 << bpc) - 1); 23317 for (var i = 0; i < length; ++i) 23318 buffer[i] = (scale * comps[i]) | 0; 23319 }, 23320 getImageBytes: function PDFImage_getImageBytes(length) { 23321 this.image.reset(); 23322 return this.image.getBytes(length); 23323 } 23324 }; 23325 return PDFImage; 23326 })(); 23327 23328 function loadJpegStream(id, imageData, objs) { 23329 var img = new Image(); 23330 img.onload = (function loadJpegStream_onloadClosure() { 23331 objs.resolve(id, img); 23332 }); 23333 img.src = 'data:image/jpeg;base64,' + PdfJS_window.window.btoa(imageData); 23334 } 23335 23336 23337 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 23338 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ 23339 23340 'use strict'; 23341 23342 // The Metrics object contains glyph widths (in glyph space units). 23343 // As per PDF spec, for most fonts (Type 3 being an exception) a glyph 23344 // space unit corresponds to 1/1000th of text space unit. 23345 var Metrics = { 23346 'Courier': 600, 23347 'Courier-Bold': 600, 23348 'Courier-BoldOblique': 600, 23349 'Courier-Oblique': 600, 23350 'Helvetica' : { 23351 'space': 278, 23352 'exclam': 278, 23353 'quotedbl': 355, 23354 'numbersign': 556, 23355 'dollar': 556, 23356 'percent': 889, 23357 'ampersand': 667, 23358 'quoteright': 222, 23359 'parenleft': 333, 23360 'parenright': 333, 23361 'asterisk': 389, 23362 'plus': 584, 23363 'comma': 278, 23364 'hyphen': 333, 23365 'period': 278, 23366 'slash': 278, 23367 'zero': 556, 23368 'one': 556, 23369 'two': 556, 23370 'three': 556, 23371 'four': 556, 23372 'five': 556, 23373 'six': 556, 23374 'seven': 556, 23375 'eight': 556, 23376 'nine': 556, 23377 'colon': 278, 23378 'semicolon': 278, 23379 'less': 584, 23380 'equal': 584, 23381 'greater': 584, 23382 'question': 556, 23383 'at': 1015, 23384 'A': 667, 23385 'B': 667, 23386 'C': 722, 23387 'D': 722, 23388 'E': 667, 23389 'F': 611, 23390 'G': 778, 23391 'H': 722, 23392 'I': 278, 23393 'J': 500, 23394 'K': 667, 23395 'L': 556, 23396 'M': 833, 23397 'N': 722, 23398 'O': 778, 23399 'P': 667, 23400 'Q': 778, 23401 'R': 722, 23402 'S': 667, 23403 'T': 611, 23404 'U': 722, 23405 'V': 667, 23406 'W': 944, 23407 'X': 667, 23408 'Y': 667, 23409 'Z': 611, 23410 'bracketleft': 278, 23411 'backslash': 278, 23412 'bracketright': 278, 23413 'asciicircum': 469, 23414 'underscore': 556, 23415 'quoteleft': 222, 23416 'a': 556, 23417 'b': 556, 23418 'c': 500, 23419 'd': 556, 23420 'e': 556, 23421 'f': 278, 23422 'g': 556, 23423 'h': 556, 23424 'i': 222, 23425 'j': 222, 23426 'k': 500, 23427 'l': 222, 23428 'm': 833, 23429 'n': 556, 23430 'o': 556, 23431 'p': 556, 23432 'q': 556, 23433 'r': 333, 23434 's': 500, 23435 't': 278, 23436 'u': 556, 23437 'v': 500, 23438 'w': 722, 23439 'x': 500, 23440 'y': 500, 23441 'z': 500, 23442 'braceleft': 334, 23443 'bar': 260, 23444 'braceright': 334, 23445 'asciitilde': 584, 23446 'exclamdown': 333, 23447 'cent': 556, 23448 'sterling': 556, 23449 'fraction': 167, 23450 'yen': 556, 23451 'florin': 556, 23452 'section': 556, 23453 'currency': 556, 23454 'quotesingle': 191, 23455 'quotedblleft': 333, 23456 'guillemotleft': 556, 23457 'guilsinglleft': 333, 23458 'guilsinglright': 333, 23459 'fi': 500, 23460 'fl': 500, 23461 'endash': 556, 23462 'dagger': 556, 23463 'daggerdbl': 556, 23464 'periodcentered': 278, 23465 'paragraph': 537, 23466 'bullet': 350, 23467 'quotesinglbase': 222, 23468 'quotedblbase': 333, 23469 'quotedblright': 333, 23470 'guillemotright': 556, 23471 'ellipsis': 1000, 23472 'perthousand': 1000, 23473 'questiondown': 611, 23474 'grave': 333, 23475 'acute': 333, 23476 'circumflex': 333, 23477 'tilde': 333, 23478 'macron': 333, 23479 'breve': 333, 23480 'dotaccent': 333, 23481 'dieresis': 333, 23482 'ring': 333, 23483 'cedilla': 333, 23484 'hungarumlaut': 333, 23485 'ogonek': 333, 23486 'caron': 333, 23487 'emdash': 1000, 23488 'AE': 1000, 23489 'ordfeminine': 370, 23490 'Lslash': 556, 23491 'Oslash': 778, 23492 'OE': 1000, 23493 'ordmasculine': 365, 23494 'ae': 889, 23495 'dotlessi': 278, 23496 'lslash': 222, 23497 'oslash': 611, 23498 'oe': 944, 23499 'germandbls': 611, 23500 'Idieresis': 278, 23501 'eacute': 556, 23502 'abreve': 556, 23503 'uhungarumlaut': 556, 23504 'ecaron': 556, 23505 'Ydieresis': 667, 23506 'divide': 584, 23507 'Yacute': 667, 23508 'Acircumflex': 667, 23509 'aacute': 556, 23510 'Ucircumflex': 722, 23511 'yacute': 500, 23512 'scommaaccent': 500, 23513 'ecircumflex': 556, 23514 'Uring': 722, 23515 'Udieresis': 722, 23516 'aogonek': 556, 23517 'Uacute': 722, 23518 'uogonek': 556, 23519 'Edieresis': 667, 23520 'Dcroat': 722, 23521 'commaaccent': 250, 23522 'copyright': 737, 23523 'Emacron': 667, 23524 'ccaron': 500, 23525 'aring': 556, 23526 'Ncommaaccent': 722, 23527 'lacute': 222, 23528 'agrave': 556, 23529 'Tcommaaccent': 611, 23530 'Cacute': 722, 23531 'atilde': 556, 23532 'Edotaccent': 667, 23533 'scaron': 500, 23534 'scedilla': 500, 23535 'iacute': 278, 23536 'lozenge': 471, 23537 'Rcaron': 722, 23538 'Gcommaaccent': 778, 23539 'ucircumflex': 556, 23540 'acircumflex': 556, 23541 'Amacron': 667, 23542 'rcaron': 333, 23543 'ccedilla': 500, 23544 'Zdotaccent': 611, 23545 'Thorn': 667, 23546 'Omacron': 778, 23547 'Racute': 722, 23548 'Sacute': 667, 23549 'dcaron': 643, 23550 'Umacron': 722, 23551 'uring': 556, 23552 'threesuperior': 333, 23553 'Ograve': 778, 23554 'Agrave': 667, 23555 'Abreve': 667, 23556 'multiply': 584, 23557 'uacute': 556, 23558 'Tcaron': 611, 23559 'partialdiff': 476, 23560 'ydieresis': 500, 23561 'Nacute': 722, 23562 'icircumflex': 278, 23563 'Ecircumflex': 667, 23564 'adieresis': 556, 23565 'edieresis': 556, 23566 'cacute': 500, 23567 'nacute': 556, 23568 'umacron': 556, 23569 'Ncaron': 722, 23570 'Iacute': 278, 23571 'plusminus': 584, 23572 'brokenbar': 260, 23573 'registered': 737, 23574 'Gbreve': 778, 23575 'Idotaccent': 278, 23576 'summation': 600, 23577 'Egrave': 667, 23578 'racute': 333, 23579 'omacron': 556, 23580 'Zacute': 611, 23581 'Zcaron': 611, 23582 'greaterequal': 549, 23583 'Eth': 722, 23584 'Ccedilla': 722, 23585 'lcommaaccent': 222, 23586 'tcaron': 317, 23587 'eogonek': 556, 23588 'Uogonek': 722, 23589 'Aacute': 667, 23590 'Adieresis': 667, 23591 'egrave': 556, 23592 'zacute': 500, 23593 'iogonek': 222, 23594 'Oacute': 778, 23595 'oacute': 556, 23596 'amacron': 556, 23597 'sacute': 500, 23598 'idieresis': 278, 23599 'Ocircumflex': 778, 23600 'Ugrave': 722, 23601 'Delta': 612, 23602 'thorn': 556, 23603 'twosuperior': 333, 23604 'Odieresis': 778, 23605 'mu': 556, 23606 'igrave': 278, 23607 'ohungarumlaut': 556, 23608 'Eogonek': 667, 23609 'dcroat': 556, 23610 'threequarters': 834, 23611 'Scedilla': 667, 23612 'lcaron': 299, 23613 'Kcommaaccent': 667, 23614 'Lacute': 556, 23615 'trademark': 1000, 23616 'edotaccent': 556, 23617 'Igrave': 278, 23618 'Imacron': 278, 23619 'Lcaron': 556, 23620 'onehalf': 834, 23621 'lessequal': 549, 23622 'ocircumflex': 556, 23623 'ntilde': 556, 23624 'Uhungarumlaut': 722, 23625 'Eacute': 667, 23626 'emacron': 556, 23627 'gbreve': 556, 23628 'onequarter': 834, 23629 'Scaron': 667, 23630 'Scommaaccent': 667, 23631 'Ohungarumlaut': 778, 23632 'degree': 400, 23633 'ograve': 556, 23634 'Ccaron': 722, 23635 'ugrave': 556, 23636 'radical': 453, 23637 'Dcaron': 722, 23638 'rcommaaccent': 333, 23639 'Ntilde': 722, 23640 'otilde': 556, 23641 'Rcommaaccent': 722, 23642 'Lcommaaccent': 556, 23643 'Atilde': 667, 23644 'Aogonek': 667, 23645 'Aring': 667, 23646 'Otilde': 778, 23647 'zdotaccent': 500, 23648 'Ecaron': 667, 23649 'Iogonek': 278, 23650 'kcommaaccent': 500, 23651 'minus': 584, 23652 'Icircumflex': 278, 23653 'ncaron': 556, 23654 'tcommaaccent': 278, 23655 'logicalnot': 584, 23656 'odieresis': 556, 23657 'udieresis': 556, 23658 'notequal': 549, 23659 'gcommaaccent': 556, 23660 'eth': 556, 23661 'zcaron': 500, 23662 'ncommaaccent': 556, 23663 'onesuperior': 333, 23664 'imacron': 278, 23665 'Euro': 556 23666 }, 23667 'Helvetica-Bold': { 23668 'space': 278, 23669 'exclam': 333, 23670 'quotedbl': 474, 23671 'numbersign': 556, 23672 'dollar': 556, 23673 'percent': 889, 23674 'ampersand': 722, 23675 'quoteright': 278, 23676 'parenleft': 333, 23677 'parenright': 333, 23678 'asterisk': 389, 23679 'plus': 584, 23680 'comma': 278, 23681 'hyphen': 333, 23682 'period': 278, 23683 'slash': 278, 23684 'zero': 556, 23685 'one': 556, 23686 'two': 556, 23687 'three': 556, 23688 'four': 556, 23689 'five': 556, 23690 'six': 556, 23691 'seven': 556, 23692 'eight': 556, 23693 'nine': 556, 23694 'colon': 333, 23695 'semicolon': 333, 23696 'less': 584, 23697 'equal': 584, 23698 'greater': 584, 23699 'question': 611, 23700 'at': 975, 23701 'A': 722, 23702 'B': 722, 23703 'C': 722, 23704 'D': 722, 23705 'E': 667, 23706 'F': 611, 23707 'G': 778, 23708 'H': 722, 23709 'I': 278, 23710 'J': 556, 23711 'K': 722, 23712 'L': 611, 23713 'M': 833, 23714 'N': 722, 23715 'O': 778, 23716 'P': 667, 23717 'Q': 778, 23718 'R': 722, 23719 'S': 667, 23720 'T': 611, 23721 'U': 722, 23722 'V': 667, 23723 'W': 944, 23724 'X': 667, 23725 'Y': 667, 23726 'Z': 611, 23727 'bracketleft': 333, 23728 'backslash': 278, 23729 'bracketright': 333, 23730 'asciicircum': 584, 23731 'underscore': 556, 23732 'quoteleft': 278, 23733 'a': 556, 23734 'b': 611, 23735 'c': 556, 23736 'd': 611, 23737 'e': 556, 23738 'f': 333, 23739 'g': 611, 23740 'h': 611, 23741 'i': 278, 23742 'j': 278, 23743 'k': 556, 23744 'l': 278, 23745 'm': 889, 23746 'n': 611, 23747 'o': 611, 23748 'p': 611, 23749 'q': 611, 23750 'r': 389, 23751 's': 556, 23752 't': 333, 23753 'u': 611, 23754 'v': 556, 23755 'w': 778, 23756 'x': 556, 23757 'y': 556, 23758 'z': 500, 23759 'braceleft': 389, 23760 'bar': 280, 23761 'braceright': 389, 23762 'asciitilde': 584, 23763 'exclamdown': 333, 23764 'cent': 556, 23765 'sterling': 556, 23766 'fraction': 167, 23767 'yen': 556, 23768 'florin': 556, 23769 'section': 556, 23770 'currency': 556, 23771 'quotesingle': 238, 23772 'quotedblleft': 500, 23773 'guillemotleft': 556, 23774 'guilsinglleft': 333, 23775 'guilsinglright': 333, 23776 'fi': 611, 23777 'fl': 611, 23778 'endash': 556, 23779 'dagger': 556, 23780 'daggerdbl': 556, 23781 'periodcentered': 278, 23782 'paragraph': 556, 23783 'bullet': 350, 23784 'quotesinglbase': 278, 23785 'quotedblbase': 500, 23786 'quotedblright': 500, 23787 'guillemotright': 556, 23788 'ellipsis': 1000, 23789 'perthousand': 1000, 23790 'questiondown': 611, 23791 'grave': 333, 23792 'acute': 333, 23793 'circumflex': 333, 23794 'tilde': 333, 23795 'macron': 333, 23796 'breve': 333, 23797 'dotaccent': 333, 23798 'dieresis': 333, 23799 'ring': 333, 23800 'cedilla': 333, 23801 'hungarumlaut': 333, 23802 'ogonek': 333, 23803 'caron': 333, 23804 'emdash': 1000, 23805 'AE': 1000, 23806 'ordfeminine': 370, 23807 'Lslash': 611, 23808 'Oslash': 778, 23809 'OE': 1000, 23810 'ordmasculine': 365, 23811 'ae': 889, 23812 'dotlessi': 278, 23813 'lslash': 278, 23814 'oslash': 611, 23815 'oe': 944, 23816 'germandbls': 611, 23817 'Idieresis': 278, 23818 'eacute': 556, 23819 'abreve': 556, 23820 'uhungarumlaut': 611, 23821 'ecaron': 556, 23822 'Ydieresis': 667, 23823 'divide': 584, 23824 'Yacute': 667, 23825 'Acircumflex': 722, 23826 'aacute': 556, 23827 'Ucircumflex': 722, 23828 'yacute': 556, 23829 'scommaaccent': 556, 23830 'ecircumflex': 556, 23831 'Uring': 722, 23832 'Udieresis': 722, 23833 'aogonek': 556, 23834 'Uacute': 722, 23835 'uogonek': 611, 23836 'Edieresis': 667, 23837 'Dcroat': 722, 23838 'commaaccent': 250, 23839 'copyright': 737, 23840 'Emacron': 667, 23841 'ccaron': 556, 23842 'aring': 556, 23843 'Ncommaaccent': 722, 23844 'lacute': 278, 23845 'agrave': 556, 23846 'Tcommaaccent': 611, 23847 'Cacute': 722, 23848 'atilde': 556, 23849 'Edotaccent': 667, 23850 'scaron': 556, 23851 'scedilla': 556, 23852 'iacute': 278, 23853 'lozenge': 494, 23854 'Rcaron': 722, 23855 'Gcommaaccent': 778, 23856 'ucircumflex': 611, 23857 'acircumflex': 556, 23858 'Amacron': 722, 23859 'rcaron': 389, 23860 'ccedilla': 556, 23861 'Zdotaccent': 611, 23862 'Thorn': 667, 23863 'Omacron': 778, 23864 'Racute': 722, 23865 'Sacute': 667, 23866 'dcaron': 743, 23867 'Umacron': 722, 23868 'uring': 611, 23869 'threesuperior': 333, 23870 'Ograve': 778, 23871 'Agrave': 722, 23872 'Abreve': 722, 23873 'multiply': 584, 23874 'uacute': 611, 23875 'Tcaron': 611, 23876 'partialdiff': 494, 23877 'ydieresis': 556, 23878 'Nacute': 722, 23879 'icircumflex': 278, 23880 'Ecircumflex': 667, 23881 'adieresis': 556, 23882 'edieresis': 556, 23883 'cacute': 556, 23884 'nacute': 611, 23885 'umacron': 611, 23886 'Ncaron': 722, 23887 'Iacute': 278, 23888 'plusminus': 584, 23889 'brokenbar': 280, 23890 'registered': 737, 23891 'Gbreve': 778, 23892 'Idotaccent': 278, 23893 'summation': 600, 23894 'Egrave': 667, 23895 'racute': 389, 23896 'omacron': 611, 23897 'Zacute': 611, 23898 'Zcaron': 611, 23899 'greaterequal': 549, 23900 'Eth': 722, 23901 'Ccedilla': 722, 23902 'lcommaaccent': 278, 23903 'tcaron': 389, 23904 'eogonek': 556, 23905 'Uogonek': 722, 23906 'Aacute': 722, 23907 'Adieresis': 722, 23908 'egrave': 556, 23909 'zacute': 500, 23910 'iogonek': 278, 23911 'Oacute': 778, 23912 'oacute': 611, 23913 'amacron': 556, 23914 'sacute': 556, 23915 'idieresis': 278, 23916 'Ocircumflex': 778, 23917 'Ugrave': 722, 23918 'Delta': 612, 23919 'thorn': 611, 23920 'twosuperior': 333, 23921 'Odieresis': 778, 23922 'mu': 611, 23923 'igrave': 278, 23924 'ohungarumlaut': 611, 23925 'Eogonek': 667, 23926 'dcroat': 611, 23927 'threequarters': 834, 23928 'Scedilla': 667, 23929 'lcaron': 400, 23930 'Kcommaaccent': 722, 23931 'Lacute': 611, 23932 'trademark': 1000, 23933 'edotaccent': 556, 23934 'Igrave': 278, 23935 'Imacron': 278, 23936 'Lcaron': 611, 23937 'onehalf': 834, 23938 'lessequal': 549, 23939 'ocircumflex': 611, 23940 'ntilde': 611, 23941 'Uhungarumlaut': 722, 23942 'Eacute': 667, 23943 'emacron': 556, 23944 'gbreve': 611, 23945 'onequarter': 834, 23946 'Scaron': 667, 23947 'Scommaaccent': 667, 23948 'Ohungarumlaut': 778, 23949 'degree': 400, 23950 'ograve': 611, 23951 'Ccaron': 722, 23952 'ugrave': 611, 23953 'radical': 549, 23954 'Dcaron': 722, 23955 'rcommaaccent': 389, 23956 'Ntilde': 722, 23957 'otilde': 611, 23958 'Rcommaaccent': 722, 23959 'Lcommaaccent': 611, 23960 'Atilde': 722, 23961 'Aogonek': 722, 23962 'Aring': 722, 23963 'Otilde': 778, 23964 'zdotaccent': 500, 23965 'Ecaron': 667, 23966 'Iogonek': 278, 23967 'kcommaaccent': 556, 23968 'minus': 584, 23969 'Icircumflex': 278, 23970 'ncaron': 611, 23971 'tcommaaccent': 333, 23972 'logicalnot': 584, 23973 'odieresis': 611, 23974 'udieresis': 611, 23975 'notequal': 549, 23976 'gcommaaccent': 611, 23977 'eth': 611, 23978 'zcaron': 500, 23979 'ncommaaccent': 611, 23980 'onesuperior': 333, 23981 'imacron': 278, 23982 'Euro': 556 23983 }, 23984 'Helvetica-BoldOblique': { 23985 'space': 278, 23986 'exclam': 333, 23987 'quotedbl': 474, 23988 'numbersign': 556, 23989 'dollar': 556, 23990 'percent': 889, 23991 'ampersand': 722, 23992 'quoteright': 278, 23993 'parenleft': 333, 23994 'parenright': 333, 23995 'asterisk': 389, 23996 'plus': 584, 23997 'comma': 278, 23998 'hyphen': 333, 23999 'period': 278, 24000 'slash': 278, 24001 'zero': 556, 24002 'one': 556, 24003 'two': 556, 24004 'three': 556, 24005 'four': 556, 24006 'five': 556, 24007 'six': 556, 24008 'seven': 556, 24009 'eight': 556, 24010 'nine': 556, 24011 'colon': 333, 24012 'semicolon': 333, 24013 'less': 584, 24014 'equal': 584, 24015 'greater': 584, 24016 'question': 611, 24017 'at': 975, 24018 'A': 722, 24019 'B': 722, 24020 'C': 722, 24021 'D': 722, 24022 'E': 667, 24023 'F': 611, 24024 'G': 778, 24025 'H': 722, 24026 'I': 278, 24027 'J': 556, 24028 'K': 722, 24029 'L': 611, 24030 'M': 833, 24031 'N': 722, 24032 'O': 778, 24033 'P': 667, 24034 'Q': 778, 24035 'R': 722, 24036 'S': 667, 24037 'T': 611, 24038 'U': 722, 24039 'V': 667, 24040 'W': 944, 24041 'X': 667, 24042 'Y': 667, 24043 'Z': 611, 24044 'bracketleft': 333, 24045 'backslash': 278, 24046 'bracketright': 333, 24047 'asciicircum': 584, 24048 'underscore': 556, 24049 'quoteleft': 278, 24050 'a': 556, 24051 'b': 611, 24052 'c': 556, 24053 'd': 611, 24054 'e': 556, 24055 'f': 333, 24056 'g': 611, 24057 'h': 611, 24058 'i': 278, 24059 'j': 278, 24060 'k': 556, 24061 'l': 278, 24062 'm': 889, 24063 'n': 611, 24064 'o': 611, 24065 'p': 611, 24066 'q': 611, 24067 'r': 389, 24068 's': 556, 24069 't': 333, 24070 'u': 611, 24071 'v': 556, 24072 'w': 778, 24073 'x': 556, 24074 'y': 556, 24075 'z': 500, 24076 'braceleft': 389, 24077 'bar': 280, 24078 'braceright': 389, 24079 'asciitilde': 584, 24080 'exclamdown': 333, 24081 'cent': 556, 24082 'sterling': 556, 24083 'fraction': 167, 24084 'yen': 556, 24085 'florin': 556, 24086 'section': 556, 24087 'currency': 556, 24088 'quotesingle': 238, 24089 'quotedblleft': 500, 24090 'guillemotleft': 556, 24091 'guilsinglleft': 333, 24092 'guilsinglright': 333, 24093 'fi': 611, 24094 'fl': 611, 24095 'endash': 556, 24096 'dagger': 556, 24097 'daggerdbl': 556, 24098 'periodcentered': 278, 24099 'paragraph': 556, 24100 'bullet': 350, 24101 'quotesinglbase': 278, 24102 'quotedblbase': 500, 24103 'quotedblright': 500, 24104 'guillemotright': 556, 24105 'ellipsis': 1000, 24106 'perthousand': 1000, 24107 'questiondown': 611, 24108 'grave': 333, 24109 'acute': 333, 24110 'circumflex': 333, 24111 'tilde': 333, 24112 'macron': 333, 24113 'breve': 333, 24114 'dotaccent': 333, 24115 'dieresis': 333, 24116 'ring': 333, 24117 'cedilla': 333, 24118 'hungarumlaut': 333, 24119 'ogonek': 333, 24120 'caron': 333, 24121 'emdash': 1000, 24122 'AE': 1000, 24123 'ordfeminine': 370, 24124 'Lslash': 611, 24125 'Oslash': 778, 24126 'OE': 1000, 24127 'ordmasculine': 365, 24128 'ae': 889, 24129 'dotlessi': 278, 24130 'lslash': 278, 24131 'oslash': 611, 24132 'oe': 944, 24133 'germandbls': 611, 24134 'Idieresis': 278, 24135 'eacute': 556, 24136 'abreve': 556, 24137 'uhungarumlaut': 611, 24138 'ecaron': 556, 24139 'Ydieresis': 667, 24140 'divide': 584, 24141 'Yacute': 667, 24142 'Acircumflex': 722, 24143 'aacute': 556, 24144 'Ucircumflex': 722, 24145 'yacute': 556, 24146 'scommaaccent': 556, 24147 'ecircumflex': 556, 24148 'Uring': 722, 24149 'Udieresis': 722, 24150 'aogonek': 556, 24151 'Uacute': 722, 24152 'uogonek': 611, 24153 'Edieresis': 667, 24154 'Dcroat': 722, 24155 'commaaccent': 250, 24156 'copyright': 737, 24157 'Emacron': 667, 24158 'ccaron': 556, 24159 'aring': 556, 24160 'Ncommaaccent': 722, 24161 'lacute': 278, 24162 'agrave': 556, 24163 'Tcommaaccent': 611, 24164 'Cacute': 722, 24165 'atilde': 556, 24166 'Edotaccent': 667, 24167 'scaron': 556, 24168 'scedilla': 556, 24169 'iacute': 278, 24170 'lozenge': 494, 24171 'Rcaron': 722, 24172 'Gcommaaccent': 778, 24173 'ucircumflex': 611, 24174 'acircumflex': 556, 24175 'Amacron': 722, 24176 'rcaron': 389, 24177 'ccedilla': 556, 24178 'Zdotaccent': 611, 24179 'Thorn': 667, 24180 'Omacron': 778, 24181 'Racute': 722, 24182 'Sacute': 667, 24183 'dcaron': 743, 24184 'Umacron': 722, 24185 'uring': 611, 24186 'threesuperior': 333, 24187 'Ograve': 778, 24188 'Agrave': 722, 24189 'Abreve': 722, 24190 'multiply': 584, 24191 'uacute': 611, 24192 'Tcaron': 611, 24193 'partialdiff': 494, 24194 'ydieresis': 556, 24195 'Nacute': 722, 24196 'icircumflex': 278, 24197 'Ecircumflex': 667, 24198 'adieresis': 556, 24199 'edieresis': 556, 24200 'cacute': 556, 24201 'nacute': 611, 24202 'umacron': 611, 24203 'Ncaron': 722, 24204 'Iacute': 278, 24205 'plusminus': 584, 24206 'brokenbar': 280, 24207 'registered': 737, 24208 'Gbreve': 778, 24209 'Idotaccent': 278, 24210 'summation': 600, 24211 'Egrave': 667, 24212 'racute': 389, 24213 'omacron': 611, 24214 'Zacute': 611, 24215 'Zcaron': 611, 24216 'greaterequal': 549, 24217 'Eth': 722, 24218 'Ccedilla': 722, 24219 'lcommaaccent': 278, 24220 'tcaron': 389, 24221 'eogonek': 556, 24222 'Uogonek': 722, 24223 'Aacute': 722, 24224 'Adieresis': 722, 24225 'egrave': 556, 24226 'zacute': 500, 24227 'iogonek': 278, 24228 'Oacute': 778, 24229 'oacute': 611, 24230 'amacron': 556, 24231 'sacute': 556, 24232 'idieresis': 278, 24233 'Ocircumflex': 778, 24234 'Ugrave': 722, 24235 'Delta': 612, 24236 'thorn': 611, 24237 'twosuperior': 333, 24238 'Odieresis': 778, 24239 'mu': 611, 24240 'igrave': 278, 24241 'ohungarumlaut': 611, 24242 'Eogonek': 667, 24243 'dcroat': 611, 24244 'threequarters': 834, 24245 'Scedilla': 667, 24246 'lcaron': 400, 24247 'Kcommaaccent': 722, 24248 'Lacute': 611, 24249 'trademark': 1000, 24250 'edotaccent': 556, 24251 'Igrave': 278, 24252 'Imacron': 278, 24253 'Lcaron': 611, 24254 'onehalf': 834, 24255 'lessequal': 549, 24256 'ocircumflex': 611, 24257 'ntilde': 611, 24258 'Uhungarumlaut': 722, 24259 'Eacute': 667, 24260 'emacron': 556, 24261 'gbreve': 611, 24262 'onequarter': 834, 24263 'Scaron': 667, 24264 'Scommaaccent': 667, 24265 'Ohungarumlaut': 778, 24266 'degree': 400, 24267 'ograve': 611, 24268 'Ccaron': 722, 24269 'ugrave': 611, 24270 'radical': 549, 24271 'Dcaron': 722, 24272 'rcommaaccent': 389, 24273 'Ntilde': 722, 24274 'otilde': 611, 24275 'Rcommaaccent': 722, 24276 'Lcommaaccent': 611, 24277 'Atilde': 722, 24278 'Aogonek': 722, 24279 'Aring': 722, 24280 'Otilde': 778, 24281 'zdotaccent': 500, 24282 'Ecaron': 667, 24283 'Iogonek': 278, 24284 'kcommaaccent': 556, 24285 'minus': 584, 24286 'Icircumflex': 278, 24287 'ncaron': 611, 24288 'tcommaaccent': 333, 24289 'logicalnot': 584, 24290 'odieresis': 611, 24291 'udieresis': 611, 24292 'notequal': 549, 24293 'gcommaaccent': 611, 24294 'eth': 611, 24295 'zcaron': 500, 24296 'ncommaaccent': 611, 24297 'onesuperior': 333, 24298 'imacron': 278, 24299 'Euro': 556 24300 }, 24301 'Helvetica-Oblique' : { 24302 'space': 278, 24303 'exclam': 278, 24304 'quotedbl': 355, 24305 'numbersign': 556, 24306 'dollar': 556, 24307 'percent': 889, 24308 'ampersand': 667, 24309 'quoteright': 222, 24310 'parenleft': 333, 24311 'parenright': 333, 24312 'asterisk': 389, 24313 'plus': 584, 24314 'comma': 278, 24315 'hyphen': 333, 24316 'period': 278, 24317 'slash': 278, 24318 'zero': 556, 24319 'one': 556, 24320 'two': 556, 24321 'three': 556, 24322 'four': 556, 24323 'five': 556, 24324 'six': 556, 24325 'seven': 556, 24326 'eight': 556, 24327 'nine': 556, 24328 'colon': 278, 24329 'semicolon': 278, 24330 'less': 584, 24331 'equal': 584, 24332 'greater': 584, 24333 'question': 556, 24334 'at': 1015, 24335 'A': 667, 24336 'B': 667, 24337 'C': 722, 24338 'D': 722, 24339 'E': 667, 24340 'F': 611, 24341 'G': 778, 24342 'H': 722, 24343 'I': 278, 24344 'J': 500, 24345 'K': 667, 24346 'L': 556, 24347 'M': 833, 24348 'N': 722, 24349 'O': 778, 24350 'P': 667, 24351 'Q': 778, 24352 'R': 722, 24353 'S': 667, 24354 'T': 611, 24355 'U': 722, 24356 'V': 667, 24357 'W': 944, 24358 'X': 667, 24359 'Y': 667, 24360 'Z': 611, 24361 'bracketleft': 278, 24362 'backslash': 278, 24363 'bracketright': 278, 24364 'asciicircum': 469, 24365 'underscore': 556, 24366 'quoteleft': 222, 24367 'a': 556, 24368 'b': 556, 24369 'c': 500, 24370 'd': 556, 24371 'e': 556, 24372 'f': 278, 24373 'g': 556, 24374 'h': 556, 24375 'i': 222, 24376 'j': 222, 24377 'k': 500, 24378 'l': 222, 24379 'm': 833, 24380 'n': 556, 24381 'o': 556, 24382 'p': 556, 24383 'q': 556, 24384 'r': 333, 24385 's': 500, 24386 't': 278, 24387 'u': 556, 24388 'v': 500, 24389 'w': 722, 24390 'x': 500, 24391 'y': 500, 24392 'z': 500, 24393 'braceleft': 334, 24394 'bar': 260, 24395 'braceright': 334, 24396 'asciitilde': 584, 24397 'exclamdown': 333, 24398 'cent': 556, 24399 'sterling': 556, 24400 'fraction': 167, 24401 'yen': 556, 24402 'florin': 556, 24403 'section': 556, 24404 'currency': 556, 24405 'quotesingle': 191, 24406 'quotedblleft': 333, 24407 'guillemotleft': 556, 24408 'guilsinglleft': 333, 24409 'guilsinglright': 333, 24410 'fi': 500, 24411 'fl': 500, 24412 'endash': 556, 24413 'dagger': 556, 24414 'daggerdbl': 556, 24415 'periodcentered': 278, 24416 'paragraph': 537, 24417 'bullet': 350, 24418 'quotesinglbase': 222, 24419 'quotedblbase': 333, 24420 'quotedblright': 333, 24421 'guillemotright': 556, 24422 'ellipsis': 1000, 24423 'perthousand': 1000, 24424 'questiondown': 611, 24425 'grave': 333, 24426 'acute': 333, 24427 'circumflex': 333, 24428 'tilde': 333, 24429 'macron': 333, 24430 'breve': 333, 24431 'dotaccent': 333, 24432 'dieresis': 333, 24433 'ring': 333, 24434 'cedilla': 333, 24435 'hungarumlaut': 333, 24436 'ogonek': 333, 24437 'caron': 333, 24438 'emdash': 1000, 24439 'AE': 1000, 24440 'ordfeminine': 370, 24441 'Lslash': 556, 24442 'Oslash': 778, 24443 'OE': 1000, 24444 'ordmasculine': 365, 24445 'ae': 889, 24446 'dotlessi': 278, 24447 'lslash': 222, 24448 'oslash': 611, 24449 'oe': 944, 24450 'germandbls': 611, 24451 'Idieresis': 278, 24452 'eacute': 556, 24453 'abreve': 556, 24454 'uhungarumlaut': 556, 24455 'ecaron': 556, 24456 'Ydieresis': 667, 24457 'divide': 584, 24458 'Yacute': 667, 24459 'Acircumflex': 667, 24460 'aacute': 556, 24461 'Ucircumflex': 722, 24462 'yacute': 500, 24463 'scommaaccent': 500, 24464 'ecircumflex': 556, 24465 'Uring': 722, 24466 'Udieresis': 722, 24467 'aogonek': 556, 24468 'Uacute': 722, 24469 'uogonek': 556, 24470 'Edieresis': 667, 24471 'Dcroat': 722, 24472 'commaaccent': 250, 24473 'copyright': 737, 24474 'Emacron': 667, 24475 'ccaron': 500, 24476 'aring': 556, 24477 'Ncommaaccent': 722, 24478 'lacute': 222, 24479 'agrave': 556, 24480 'Tcommaaccent': 611, 24481 'Cacute': 722, 24482 'atilde': 556, 24483 'Edotaccent': 667, 24484 'scaron': 500, 24485 'scedilla': 500, 24486 'iacute': 278, 24487 'lozenge': 471, 24488 'Rcaron': 722, 24489 'Gcommaaccent': 778, 24490 'ucircumflex': 556, 24491 'acircumflex': 556, 24492 'Amacron': 667, 24493 'rcaron': 333, 24494 'ccedilla': 500, 24495 'Zdotaccent': 611, 24496 'Thorn': 667, 24497 'Omacron': 778, 24498 'Racute': 722, 24499 'Sacute': 667, 24500 'dcaron': 643, 24501 'Umacron': 722, 24502 'uring': 556, 24503 'threesuperior': 333, 24504 'Ograve': 778, 24505 'Agrave': 667, 24506 'Abreve': 667, 24507 'multiply': 584, 24508 'uacute': 556, 24509 'Tcaron': 611, 24510 'partialdiff': 476, 24511 'ydieresis': 500, 24512 'Nacute': 722, 24513 'icircumflex': 278, 24514 'Ecircumflex': 667, 24515 'adieresis': 556, 24516 'edieresis': 556, 24517 'cacute': 500, 24518 'nacute': 556, 24519 'umacron': 556, 24520 'Ncaron': 722, 24521 'Iacute': 278, 24522 'plusminus': 584, 24523 'brokenbar': 260, 24524 'registered': 737, 24525 'Gbreve': 778, 24526 'Idotaccent': 278, 24527 'summation': 600, 24528 'Egrave': 667, 24529 'racute': 333, 24530 'omacron': 556, 24531 'Zacute': 611, 24532 'Zcaron': 611, 24533 'greaterequal': 549, 24534 'Eth': 722, 24535 'Ccedilla': 722, 24536 'lcommaaccent': 222, 24537 'tcaron': 317, 24538 'eogonek': 556, 24539 'Uogonek': 722, 24540 'Aacute': 667, 24541 'Adieresis': 667, 24542 'egrave': 556, 24543 'zacute': 500, 24544 'iogonek': 222, 24545 'Oacute': 778, 24546 'oacute': 556, 24547 'amacron': 556, 24548 'sacute': 500, 24549 'idieresis': 278, 24550 'Ocircumflex': 778, 24551 'Ugrave': 722, 24552 'Delta': 612, 24553 'thorn': 556, 24554 'twosuperior': 333, 24555 'Odieresis': 778, 24556 'mu': 556, 24557 'igrave': 278, 24558 'ohungarumlaut': 556, 24559 'Eogonek': 667, 24560 'dcroat': 556, 24561 'threequarters': 834, 24562 'Scedilla': 667, 24563 'lcaron': 299, 24564 'Kcommaaccent': 667, 24565 'Lacute': 556, 24566 'trademark': 1000, 24567 'edotaccent': 556, 24568 'Igrave': 278, 24569 'Imacron': 278, 24570 'Lcaron': 556, 24571 'onehalf': 834, 24572 'lessequal': 549, 24573 'ocircumflex': 556, 24574 'ntilde': 556, 24575 'Uhungarumlaut': 722, 24576 'Eacute': 667, 24577 'emacron': 556, 24578 'gbreve': 556, 24579 'onequarter': 834, 24580 'Scaron': 667, 24581 'Scommaaccent': 667, 24582 'Ohungarumlaut': 778, 24583 'degree': 400, 24584 'ograve': 556, 24585 'Ccaron': 722, 24586 'ugrave': 556, 24587 'radical': 453, 24588 'Dcaron': 722, 24589 'rcommaaccent': 333, 24590 'Ntilde': 722, 24591 'otilde': 556, 24592 'Rcommaaccent': 722, 24593 'Lcommaaccent': 556, 24594 'Atilde': 667, 24595 'Aogonek': 667, 24596 'Aring': 667, 24597 'Otilde': 778, 24598 'zdotaccent': 500, 24599 'Ecaron': 667, 24600 'Iogonek': 278, 24601 'kcommaaccent': 500, 24602 'minus': 584, 24603 'Icircumflex': 278, 24604 'ncaron': 556, 24605 'tcommaaccent': 278, 24606 'logicalnot': 584, 24607 'odieresis': 556, 24608 'udieresis': 556, 24609 'notequal': 549, 24610 'gcommaaccent': 556, 24611 'eth': 556, 24612 'zcaron': 500, 24613 'ncommaaccent': 556, 24614 'onesuperior': 333, 24615 'imacron': 278, 24616 'Euro': 556 24617 }, 24618 'Symbol': { 24619 'space': 250, 24620 'exclam': 333, 24621 'universal': 713, 24622 'numbersign': 500, 24623 'existential': 549, 24624 'percent': 833, 24625 'ampersand': 778, 24626 'suchthat': 439, 24627 'parenleft': 333, 24628 'parenright': 333, 24629 'asteriskmath': 500, 24630 'plus': 549, 24631 'comma': 250, 24632 'minus': 549, 24633 'period': 250, 24634 'slash': 278, 24635 'zero': 500, 24636 'one': 500, 24637 'two': 500, 24638 'three': 500, 24639 'four': 500, 24640 'five': 500, 24641 'six': 500, 24642 'seven': 500, 24643 'eight': 500, 24644 'nine': 500, 24645 'colon': 278, 24646 'semicolon': 278, 24647 'less': 549, 24648 'equal': 549, 24649 'greater': 549, 24650 'question': 444, 24651 'congruent': 549, 24652 'Alpha': 722, 24653 'Beta': 667, 24654 'Chi': 722, 24655 'Delta': 612, 24656 'Epsilon': 611, 24657 'Phi': 763, 24658 'Gamma': 603, 24659 'Eta': 722, 24660 'Iota': 333, 24661 'theta1': 631, 24662 'Kappa': 722, 24663 'Lambda': 686, 24664 'Mu': 889, 24665 'Nu': 722, 24666 'Omicron': 722, 24667 'Pi': 768, 24668 'Theta': 741, 24669 'Rho': 556, 24670 'Sigma': 592, 24671 'Tau': 611, 24672 'Upsilon': 690, 24673 'sigma1': 439, 24674 'Omega': 768, 24675 'Xi': 645, 24676 'Psi': 795, 24677 'Zeta': 611, 24678 'bracketleft': 333, 24679 'therefore': 863, 24680 'bracketright': 333, 24681 'perpendicular': 658, 24682 'underscore': 500, 24683 'radicalex': 500, 24684 'alpha': 631, 24685 'beta': 549, 24686 'chi': 549, 24687 'delta': 494, 24688 'epsilon': 439, 24689 'phi': 521, 24690 'gamma': 411, 24691 'eta': 603, 24692 'iota': 329, 24693 'phi1': 603, 24694 'kappa': 549, 24695 'lambda': 549, 24696 'mu': 576, 24697 'nu': 521, 24698 'omicron': 549, 24699 'pi': 549, 24700 'theta': 521, 24701 'rho': 549, 24702 'sigma': 603, 24703 'tau': 439, 24704 'upsilon': 576, 24705 'omega1': 713, 24706 'omega': 686, 24707 'xi': 493, 24708 'psi': 686, 24709 'zeta': 494, 24710 'braceleft': 480, 24711 'bar': 200, 24712 'braceright': 480, 24713 'similar': 549, 24714 'Euro': 750, 24715 'Upsilon1': 620, 24716 'minute': 247, 24717 'lessequal': 549, 24718 'fraction': 167, 24719 'infinity': 713, 24720 'florin': 500, 24721 'club': 753, 24722 'diamond': 753, 24723 'heart': 753, 24724 'spade': 753, 24725 'arrowboth': 1042, 24726 'arrowleft': 987, 24727 'arrowup': 603, 24728 'arrowright': 987, 24729 'arrowdown': 603, 24730 'degree': 400, 24731 'plusminus': 549, 24732 'second': 411, 24733 'greaterequal': 549, 24734 'multiply': 549, 24735 'proportional': 713, 24736 'partialdiff': 494, 24737 'bullet': 460, 24738 'divide': 549, 24739 'notequal': 549, 24740 'equivalence': 549, 24741 'approxequal': 549, 24742 'ellipsis': 1000, 24743 'arrowvertex': 603, 24744 'arrowhorizex': 1000, 24745 'carriagereturn': 658, 24746 'aleph': 823, 24747 'Ifraktur': 686, 24748 'Rfraktur': 795, 24749 'weierstrass': 987, 24750 'circlemultiply': 768, 24751 'circleplus': 768, 24752 'emptyset': 823, 24753 'intersection': 768, 24754 'union': 768, 24755 'propersuperset': 713, 24756 'reflexsuperset': 713, 24757 'notsubset': 713, 24758 'propersubset': 713, 24759 'reflexsubset': 713, 24760 'element': 713, 24761 'notelement': 713, 24762 'angle': 768, 24763 'gradient': 713, 24764 'registerserif': 790, 24765 'copyrightserif': 790, 24766 'trademarkserif': 890, 24767 'product': 823, 24768 'radical': 549, 24769 'dotmath': 250, 24770 'logicalnot': 713, 24771 'logicaland': 603, 24772 'logicalor': 603, 24773 'arrowdblboth': 1042, 24774 'arrowdblleft': 987, 24775 'arrowdblup': 603, 24776 'arrowdblright': 987, 24777 'arrowdbldown': 603, 24778 'lozenge': 494, 24779 'angleleft': 329, 24780 'registersans': 790, 24781 'copyrightsans': 790, 24782 'trademarksans': 786, 24783 'summation': 713, 24784 'parenlefttp': 384, 24785 'parenleftex': 384, 24786 'parenleftbt': 384, 24787 'bracketlefttp': 384, 24788 'bracketleftex': 384, 24789 'bracketleftbt': 384, 24790 'bracelefttp': 494, 24791 'braceleftmid': 494, 24792 'braceleftbt': 494, 24793 'braceex': 494, 24794 'angleright': 329, 24795 'integral': 274, 24796 'integraltp': 686, 24797 'integralex': 686, 24798 'integralbt': 686, 24799 'parenrighttp': 384, 24800 'parenrightex': 384, 24801 'parenrightbt': 384, 24802 'bracketrighttp': 384, 24803 'bracketrightex': 384, 24804 'bracketrightbt': 384, 24805 'bracerighttp': 494, 24806 'bracerightmid': 494, 24807 'bracerightbt': 494, 24808 'apple': 790 24809 }, 24810 'Times-Roman': { 24811 'space': 250, 24812 'exclam': 333, 24813 'quotedbl': 408, 24814 'numbersign': 500, 24815 'dollar': 500, 24816 'percent': 833, 24817 'ampersand': 778, 24818 'quoteright': 333, 24819 'parenleft': 333, 24820 'parenright': 333, 24821 'asterisk': 500, 24822 'plus': 564, 24823 'comma': 250, 24824 'hyphen': 333, 24825 'period': 250, 24826 'slash': 278, 24827 'zero': 500, 24828 'one': 500, 24829 'two': 500, 24830 'three': 500, 24831 'four': 500, 24832 'five': 500, 24833 'six': 500, 24834 'seven': 500, 24835 'eight': 500, 24836 'nine': 500, 24837 'colon': 278, 24838 'semicolon': 278, 24839 'less': 564, 24840 'equal': 564, 24841 'greater': 564, 24842 'question': 444, 24843 'at': 921, 24844 'A': 722, 24845 'B': 667, 24846 'C': 667, 24847 'D': 722, 24848 'E': 611, 24849 'F': 556, 24850 'G': 722, 24851 'H': 722, 24852 'I': 333, 24853 'J': 389, 24854 'K': 722, 24855 'L': 611, 24856 'M': 889, 24857 'N': 722, 24858 'O': 722, 24859 'P': 556, 24860 'Q': 722, 24861 'R': 667, 24862 'S': 556, 24863 'T': 611, 24864 'U': 722, 24865 'V': 722, 24866 'W': 944, 24867 'X': 722, 24868 'Y': 722, 24869 'Z': 611, 24870 'bracketleft': 333, 24871 'backslash': 278, 24872 'bracketright': 333, 24873 'asciicircum': 469, 24874 'underscore': 500, 24875 'quoteleft': 333, 24876 'a': 444, 24877 'b': 500, 24878 'c': 444, 24879 'd': 500, 24880 'e': 444, 24881 'f': 333, 24882 'g': 500, 24883 'h': 500, 24884 'i': 278, 24885 'j': 278, 24886 'k': 500, 24887 'l': 278, 24888 'm': 778, 24889 'n': 500, 24890 'o': 500, 24891 'p': 500, 24892 'q': 500, 24893 'r': 333, 24894 's': 389, 24895 't': 278, 24896 'u': 500, 24897 'v': 500, 24898 'w': 722, 24899 'x': 500, 24900 'y': 500, 24901 'z': 444, 24902 'braceleft': 480, 24903 'bar': 200, 24904 'braceright': 480, 24905 'asciitilde': 541, 24906 'exclamdown': 333, 24907 'cent': 500, 24908 'sterling': 500, 24909 'fraction': 167, 24910 'yen': 500, 24911 'florin': 500, 24912 'section': 500, 24913 'currency': 500, 24914 'quotesingle': 180, 24915 'quotedblleft': 444, 24916 'guillemotleft': 500, 24917 'guilsinglleft': 333, 24918 'guilsinglright': 333, 24919 'fi': 556, 24920 'fl': 556, 24921 'endash': 500, 24922 'dagger': 500, 24923 'daggerdbl': 500, 24924 'periodcentered': 250, 24925 'paragraph': 453, 24926 'bullet': 350, 24927 'quotesinglbase': 333, 24928 'quotedblbase': 444, 24929 'quotedblright': 444, 24930 'guillemotright': 500, 24931 'ellipsis': 1000, 24932 'perthousand': 1000, 24933 'questiondown': 444, 24934 'grave': 333, 24935 'acute': 333, 24936 'circumflex': 333, 24937 'tilde': 333, 24938 'macron': 333, 24939 'breve': 333, 24940 'dotaccent': 333, 24941 'dieresis': 333, 24942 'ring': 333, 24943 'cedilla': 333, 24944 'hungarumlaut': 333, 24945 'ogonek': 333, 24946 'caron': 333, 24947 'emdash': 1000, 24948 'AE': 889, 24949 'ordfeminine': 276, 24950 'Lslash': 611, 24951 'Oslash': 722, 24952 'OE': 889, 24953 'ordmasculine': 310, 24954 'ae': 667, 24955 'dotlessi': 278, 24956 'lslash': 278, 24957 'oslash': 500, 24958 'oe': 722, 24959 'germandbls': 500, 24960 'Idieresis': 333, 24961 'eacute': 444, 24962 'abreve': 444, 24963 'uhungarumlaut': 500, 24964 'ecaron': 444, 24965 'Ydieresis': 722, 24966 'divide': 564, 24967 'Yacute': 722, 24968 'Acircumflex': 722, 24969 'aacute': 444, 24970 'Ucircumflex': 722, 24971 'yacute': 500, 24972 'scommaaccent': 389, 24973 'ecircumflex': 444, 24974 'Uring': 722, 24975 'Udieresis': 722, 24976 'aogonek': 444, 24977 'Uacute': 722, 24978 'uogonek': 500, 24979 'Edieresis': 611, 24980 'Dcroat': 722, 24981 'commaaccent': 250, 24982 'copyright': 760, 24983 'Emacron': 611, 24984 'ccaron': 444, 24985 'aring': 444, 24986 'Ncommaaccent': 722, 24987 'lacute': 278, 24988 'agrave': 444, 24989 'Tcommaaccent': 611, 24990 'Cacute': 667, 24991 'atilde': 444, 24992 'Edotaccent': 611, 24993 'scaron': 389, 24994 'scedilla': 389, 24995 'iacute': 278, 24996 'lozenge': 471, 24997 'Rcaron': 667, 24998 'Gcommaaccent': 722, 24999 'ucircumflex': 500, 25000 'acircumflex': 444, 25001 'Amacron': 722, 25002 'rcaron': 333, 25003 'ccedilla': 444, 25004 'Zdotaccent': 611, 25005 'Thorn': 556, 25006 'Omacron': 722, 25007 'Racute': 667, 25008 'Sacute': 556, 25009 'dcaron': 588, 25010 'Umacron': 722, 25011 'uring': 500, 25012 'threesuperior': 300, 25013 'Ograve': 722, 25014 'Agrave': 722, 25015 'Abreve': 722, 25016 'multiply': 564, 25017 'uacute': 500, 25018 'Tcaron': 611, 25019 'partialdiff': 476, 25020 'ydieresis': 500, 25021 'Nacute': 722, 25022 'icircumflex': 278, 25023 'Ecircumflex': 611, 25024 'adieresis': 444, 25025 'edieresis': 444, 25026 'cacute': 444, 25027 'nacute': 500, 25028 'umacron': 500, 25029 'Ncaron': 722, 25030 'Iacute': 333, 25031 'plusminus': 564, 25032 'brokenbar': 200, 25033 'registered': 760, 25034 'Gbreve': 722, 25035 'Idotaccent': 333, 25036 'summation': 600, 25037 'Egrave': 611, 25038 'racute': 333, 25039 'omacron': 500, 25040 'Zacute': 611, 25041 'Zcaron': 611, 25042 'greaterequal': 549, 25043 'Eth': 722, 25044 'Ccedilla': 667, 25045 'lcommaaccent': 278, 25046 'tcaron': 326, 25047 'eogonek': 444, 25048 'Uogonek': 722, 25049 'Aacute': 722, 25050 'Adieresis': 722, 25051 'egrave': 444, 25052 'zacute': 444, 25053 'iogonek': 278, 25054 'Oacute': 722, 25055 'oacute': 500, 25056 'amacron': 444, 25057 'sacute': 389, 25058 'idieresis': 278, 25059 'Ocircumflex': 722, 25060 'Ugrave': 722, 25061 'Delta': 612, 25062 'thorn': 500, 25063 'twosuperior': 300, 25064 'Odieresis': 722, 25065 'mu': 500, 25066 'igrave': 278, 25067 'ohungarumlaut': 500, 25068 'Eogonek': 611, 25069 'dcroat': 500, 25070 'threequarters': 750, 25071 'Scedilla': 556, 25072 'lcaron': 344, 25073 'Kcommaaccent': 722, 25074 'Lacute': 611, 25075 'trademark': 980, 25076 'edotaccent': 444, 25077 'Igrave': 333, 25078 'Imacron': 333, 25079 'Lcaron': 611, 25080 'onehalf': 750, 25081 'lessequal': 549, 25082 'ocircumflex': 500, 25083 'ntilde': 500, 25084 'Uhungarumlaut': 722, 25085 'Eacute': 611, 25086 'emacron': 444, 25087 'gbreve': 500, 25088 'onequarter': 750, 25089 'Scaron': 556, 25090 'Scommaaccent': 556, 25091 'Ohungarumlaut': 722, 25092 'degree': 400, 25093 'ograve': 500, 25094 'Ccaron': 667, 25095 'ugrave': 500, 25096 'radical': 453, 25097 'Dcaron': 722, 25098 'rcommaaccent': 333, 25099 'Ntilde': 722, 25100 'otilde': 500, 25101 'Rcommaaccent': 667, 25102 'Lcommaaccent': 611, 25103 'Atilde': 722, 25104 'Aogonek': 722, 25105 'Aring': 722, 25106 'Otilde': 722, 25107 'zdotaccent': 444, 25108 'Ecaron': 611, 25109 'Iogonek': 333, 25110 'kcommaaccent': 500, 25111 'minus': 564, 25112 'Icircumflex': 333, 25113 'ncaron': 500, 25114 'tcommaaccent': 278, 25115 'logicalnot': 564, 25116 'odieresis': 500, 25117 'udieresis': 500, 25118 'notequal': 549, 25119 'gcommaaccent': 500, 25120 'eth': 500, 25121 'zcaron': 444, 25122 'ncommaaccent': 500, 25123 'onesuperior': 300, 25124 'imacron': 278, 25125 'Euro': 500 25126 }, 25127 'Times-Bold': { 25128 'space': 250, 25129 'exclam': 333, 25130 'quotedbl': 555, 25131 'numbersign': 500, 25132 'dollar': 500, 25133 'percent': 1000, 25134 'ampersand': 833, 25135 'quoteright': 333, 25136 'parenleft': 333, 25137 'parenright': 333, 25138 'asterisk': 500, 25139 'plus': 570, 25140 'comma': 250, 25141 'hyphen': 333, 25142 'period': 250, 25143 'slash': 278, 25144 'zero': 500, 25145 'one': 500, 25146 'two': 500, 25147 'three': 500, 25148 'four': 500, 25149 'five': 500, 25150 'six': 500, 25151 'seven': 500, 25152 'eight': 500, 25153 'nine': 500, 25154 'colon': 333, 25155 'semicolon': 333, 25156 'less': 570, 25157 'equal': 570, 25158 'greater': 570, 25159 'question': 500, 25160 'at': 930, 25161 'A': 722, 25162 'B': 667, 25163 'C': 722, 25164 'D': 722, 25165 'E': 667, 25166 'F': 611, 25167 'G': 778, 25168 'H': 778, 25169 'I': 389, 25170 'J': 500, 25171 'K': 778, 25172 'L': 667, 25173 'M': 944, 25174 'N': 722, 25175 'O': 778, 25176 'P': 611, 25177 'Q': 778, 25178 'R': 722, 25179 'S': 556, 25180 'T': 667, 25181 'U': 722, 25182 'V': 722, 25183 'W': 1000, 25184 'X': 722, 25185 'Y': 722, 25186 'Z': 667, 25187 'bracketleft': 333, 25188 'backslash': 278, 25189 'bracketright': 333, 25190 'asciicircum': 581, 25191 'underscore': 500, 25192 'quoteleft': 333, 25193 'a': 500, 25194 'b': 556, 25195 'c': 444, 25196 'd': 556, 25197 'e': 444, 25198 'f': 333, 25199 'g': 500, 25200 'h': 556, 25201 'i': 278, 25202 'j': 333, 25203 'k': 556, 25204 'l': 278, 25205 'm': 833, 25206 'n': 556, 25207 'o': 500, 25208 'p': 556, 25209 'q': 556, 25210 'r': 444, 25211 's': 389, 25212 't': 333, 25213 'u': 556, 25214 'v': 500, 25215 'w': 722, 25216 'x': 500, 25217 'y': 500, 25218 'z': 444, 25219 'braceleft': 394, 25220 'bar': 220, 25221 'braceright': 394, 25222 'asciitilde': 520, 25223 'exclamdown': 333, 25224 'cent': 500, 25225 'sterling': 500, 25226 'fraction': 167, 25227 'yen': 500, 25228 'florin': 500, 25229 'section': 500, 25230 'currency': 500, 25231 'quotesingle': 278, 25232 'quotedblleft': 500, 25233 'guillemotleft': 500, 25234 'guilsinglleft': 333, 25235 'guilsinglright': 333, 25236 'fi': 556, 25237 'fl': 556, 25238 'endash': 500, 25239 'dagger': 500, 25240 'daggerdbl': 500, 25241 'periodcentered': 250, 25242 'paragraph': 540, 25243 'bullet': 350, 25244 'quotesinglbase': 333, 25245 'quotedblbase': 500, 25246 'quotedblright': 500, 25247 'guillemotright': 500, 25248 'ellipsis': 1000, 25249 'perthousand': 1000, 25250 'questiondown': 500, 25251 'grave': 333, 25252 'acute': 333, 25253 'circumflex': 333, 25254 'tilde': 333, 25255 'macron': 333, 25256 'breve': 333, 25257 'dotaccent': 333, 25258 'dieresis': 333, 25259 'ring': 333, 25260 'cedilla': 333, 25261 'hungarumlaut': 333, 25262 'ogonek': 333, 25263 'caron': 333, 25264 'emdash': 1000, 25265 'AE': 1000, 25266 'ordfeminine': 300, 25267 'Lslash': 667, 25268 'Oslash': 778, 25269 'OE': 1000, 25270 'ordmasculine': 330, 25271 'ae': 722, 25272 'dotlessi': 278, 25273 'lslash': 278, 25274 'oslash': 500, 25275 'oe': 722, 25276 'germandbls': 556, 25277 'Idieresis': 389, 25278 'eacute': 444, 25279 'abreve': 500, 25280 'uhungarumlaut': 556, 25281 'ecaron': 444, 25282 'Ydieresis': 722, 25283 'divide': 570, 25284 'Yacute': 722, 25285 'Acircumflex': 722, 25286 'aacute': 500, 25287 'Ucircumflex': 722, 25288 'yacute': 500, 25289 'scommaaccent': 389, 25290 'ecircumflex': 444, 25291 'Uring': 722, 25292 'Udieresis': 722, 25293 'aogonek': 500, 25294 'Uacute': 722, 25295 'uogonek': 556, 25296 'Edieresis': 667, 25297 'Dcroat': 722, 25298 'commaaccent': 250, 25299 'copyright': 747, 25300 'Emacron': 667, 25301 'ccaron': 444, 25302 'aring': 500, 25303 'Ncommaaccent': 722, 25304 'lacute': 278, 25305 'agrave': 500, 25306 'Tcommaaccent': 667, 25307 'Cacute': 722, 25308 'atilde': 500, 25309 'Edotaccent': 667, 25310 'scaron': 389, 25311 'scedilla': 389, 25312 'iacute': 278, 25313 'lozenge': 494, 25314 'Rcaron': 722, 25315 'Gcommaaccent': 778, 25316 'ucircumflex': 556, 25317 'acircumflex': 500, 25318 'Amacron': 722, 25319 'rcaron': 444, 25320 'ccedilla': 444, 25321 'Zdotaccent': 667, 25322 'Thorn': 611, 25323 'Omacron': 778, 25324 'Racute': 722, 25325 'Sacute': 556, 25326 'dcaron': 672, 25327 'Umacron': 722, 25328 'uring': 556, 25329 'threesuperior': 300, 25330 'Ograve': 778, 25331 'Agrave': 722, 25332 'Abreve': 722, 25333 'multiply': 570, 25334 'uacute': 556, 25335 'Tcaron': 667, 25336 'partialdiff': 494, 25337 'ydieresis': 500, 25338 'Nacute': 722, 25339 'icircumflex': 278, 25340 'Ecircumflex': 667, 25341 'adieresis': 500, 25342 'edieresis': 444, 25343 'cacute': 444, 25344 'nacute': 556, 25345 'umacron': 556, 25346 'Ncaron': 722, 25347 'Iacute': 389, 25348 'plusminus': 570, 25349 'brokenbar': 220, 25350 'registered': 747, 25351 'Gbreve': 778, 25352 'Idotaccent': 389, 25353 'summation': 600, 25354 'Egrave': 667, 25355 'racute': 444, 25356 'omacron': 500, 25357 'Zacute': 667, 25358 'Zcaron': 667, 25359 'greaterequal': 549, 25360 'Eth': 722, 25361 'Ccedilla': 722, 25362 'lcommaaccent': 278, 25363 'tcaron': 416, 25364 'eogonek': 444, 25365 'Uogonek': 722, 25366 'Aacute': 722, 25367 'Adieresis': 722, 25368 'egrave': 444, 25369 'zacute': 444, 25370 'iogonek': 278, 25371 'Oacute': 778, 25372 'oacute': 500, 25373 'amacron': 500, 25374 'sacute': 389, 25375 'idieresis': 278, 25376 'Ocircumflex': 778, 25377 'Ugrave': 722, 25378 'Delta': 612, 25379 'thorn': 556, 25380 'twosuperior': 300, 25381 'Odieresis': 778, 25382 'mu': 556, 25383 'igrave': 278, 25384 'ohungarumlaut': 500, 25385 'Eogonek': 667, 25386 'dcroat': 556, 25387 'threequarters': 750, 25388 'Scedilla': 556, 25389 'lcaron': 394, 25390 'Kcommaaccent': 778, 25391 'Lacute': 667, 25392 'trademark': 1000, 25393 'edotaccent': 444, 25394 'Igrave': 389, 25395 'Imacron': 389, 25396 'Lcaron': 667, 25397 'onehalf': 750, 25398 'lessequal': 549, 25399 'ocircumflex': 500, 25400 'ntilde': 556, 25401 'Uhungarumlaut': 722, 25402 'Eacute': 667, 25403 'emacron': 444, 25404 'gbreve': 500, 25405 'onequarter': 750, 25406 'Scaron': 556, 25407 'Scommaaccent': 556, 25408 'Ohungarumlaut': 778, 25409 'degree': 400, 25410 'ograve': 500, 25411 'Ccaron': 722, 25412 'ugrave': 556, 25413 'radical': 549, 25414 'Dcaron': 722, 25415 'rcommaaccent': 444, 25416 'Ntilde': 722, 25417 'otilde': 500, 25418 'Rcommaaccent': 722, 25419 'Lcommaaccent': 667, 25420 'Atilde': 722, 25421 'Aogonek': 722, 25422 'Aring': 722, 25423 'Otilde': 778, 25424 'zdotaccent': 444, 25425 'Ecaron': 667, 25426 'Iogonek': 389, 25427 'kcommaaccent': 556, 25428 'minus': 570, 25429 'Icircumflex': 389, 25430 'ncaron': 556, 25431 'tcommaaccent': 333, 25432 'logicalnot': 570, 25433 'odieresis': 500, 25434 'udieresis': 556, 25435 'notequal': 549, 25436 'gcommaaccent': 500, 25437 'eth': 500, 25438 'zcaron': 444, 25439 'ncommaaccent': 556, 25440 'onesuperior': 300, 25441 'imacron': 278, 25442 'Euro': 500 25443 }, 25444 'Times-BoldItalic': { 25445 'space': 250, 25446 'exclam': 389, 25447 'quotedbl': 555, 25448 'numbersign': 500, 25449 'dollar': 500, 25450 'percent': 833, 25451 'ampersand': 778, 25452 'quoteright': 333, 25453 'parenleft': 333, 25454 'parenright': 333, 25455 'asterisk': 500, 25456 'plus': 570, 25457 'comma': 250, 25458 'hyphen': 333, 25459 'period': 250, 25460 'slash': 278, 25461 'zero': 500, 25462 'one': 500, 25463 'two': 500, 25464 'three': 500, 25465 'four': 500, 25466 'five': 500, 25467 'six': 500, 25468 'seven': 500, 25469 'eight': 500, 25470 'nine': 500, 25471 'colon': 333, 25472 'semicolon': 333, 25473 'less': 570, 25474 'equal': 570, 25475 'greater': 570, 25476 'question': 500, 25477 'at': 832, 25478 'A': 667, 25479 'B': 667, 25480 'C': 667, 25481 'D': 722, 25482 'E': 667, 25483 'F': 667, 25484 'G': 722, 25485 'H': 778, 25486 'I': 389, 25487 'J': 500, 25488 'K': 667, 25489 'L': 611, 25490 'M': 889, 25491 'N': 722, 25492 'O': 722, 25493 'P': 611, 25494 'Q': 722, 25495 'R': 667, 25496 'S': 556, 25497 'T': 611, 25498 'U': 722, 25499 'V': 667, 25500 'W': 889, 25501 'X': 667, 25502 'Y': 611, 25503 'Z': 611, 25504 'bracketleft': 333, 25505 'backslash': 278, 25506 'bracketright': 333, 25507 'asciicircum': 570, 25508 'underscore': 500, 25509 'quoteleft': 333, 25510 'a': 500, 25511 'b': 500, 25512 'c': 444, 25513 'd': 500, 25514 'e': 444, 25515 'f': 333, 25516 'g': 500, 25517 'h': 556, 25518 'i': 278, 25519 'j': 278, 25520 'k': 500, 25521 'l': 278, 25522 'm': 778, 25523 'n': 556, 25524 'o': 500, 25525 'p': 500, 25526 'q': 500, 25527 'r': 389, 25528 's': 389, 25529 't': 278, 25530 'u': 556, 25531 'v': 444, 25532 'w': 667, 25533 'x': 500, 25534 'y': 444, 25535 'z': 389, 25536 'braceleft': 348, 25537 'bar': 220, 25538 'braceright': 348, 25539 'asciitilde': 570, 25540 'exclamdown': 389, 25541 'cent': 500, 25542 'sterling': 500, 25543 'fraction': 167, 25544 'yen': 500, 25545 'florin': 500, 25546 'section': 500, 25547 'currency': 500, 25548 'quotesingle': 278, 25549 'quotedblleft': 500, 25550 'guillemotleft': 500, 25551 'guilsinglleft': 333, 25552 'guilsinglright': 333, 25553 'fi': 556, 25554 'fl': 556, 25555 'endash': 500, 25556 'dagger': 500, 25557 'daggerdbl': 500, 25558 'periodcentered': 250, 25559 'paragraph': 500, 25560 'bullet': 350, 25561 'quotesinglbase': 333, 25562 'quotedblbase': 500, 25563 'quotedblright': 500, 25564 'guillemotright': 500, 25565 'ellipsis': 1000, 25566 'perthousand': 1000, 25567 'questiondown': 500, 25568 'grave': 333, 25569 'acute': 333, 25570 'circumflex': 333, 25571 'tilde': 333, 25572 'macron': 333, 25573 'breve': 333, 25574 'dotaccent': 333, 25575 'dieresis': 333, 25576 'ring': 333, 25577 'cedilla': 333, 25578 'hungarumlaut': 333, 25579 'ogonek': 333, 25580 'caron': 333, 25581 'emdash': 1000, 25582 'AE': 944, 25583 'ordfeminine': 266, 25584 'Lslash': 611, 25585 'Oslash': 722, 25586 'OE': 944, 25587 'ordmasculine': 300, 25588 'ae': 722, 25589 'dotlessi': 278, 25590 'lslash': 278, 25591 'oslash': 500, 25592 'oe': 722, 25593 'germandbls': 500, 25594 'Idieresis': 389, 25595 'eacute': 444, 25596 'abreve': 500, 25597 'uhungarumlaut': 556, 25598 'ecaron': 444, 25599 'Ydieresis': 611, 25600 'divide': 570, 25601 'Yacute': 611, 25602 'Acircumflex': 667, 25603 'aacute': 500, 25604 'Ucircumflex': 722, 25605 'yacute': 444, 25606 'scommaaccent': 389, 25607 'ecircumflex': 444, 25608 'Uring': 722, 25609 'Udieresis': 722, 25610 'aogonek': 500, 25611 'Uacute': 722, 25612 'uogonek': 556, 25613 'Edieresis': 667, 25614 'Dcroat': 722, 25615 'commaaccent': 250, 25616 'copyright': 747, 25617 'Emacron': 667, 25618 'ccaron': 444, 25619 'aring': 500, 25620 'Ncommaaccent': 722, 25621 'lacute': 278, 25622 'agrave': 500, 25623 'Tcommaaccent': 611, 25624 'Cacute': 667, 25625 'atilde': 500, 25626 'Edotaccent': 667, 25627 'scaron': 389, 25628 'scedilla': 389, 25629 'iacute': 278, 25630 'lozenge': 494, 25631 'Rcaron': 667, 25632 'Gcommaaccent': 722, 25633 'ucircumflex': 556, 25634 'acircumflex': 500, 25635 'Amacron': 667, 25636 'rcaron': 389, 25637 'ccedilla': 444, 25638 'Zdotaccent': 611, 25639 'Thorn': 611, 25640 'Omacron': 722, 25641 'Racute': 667, 25642 'Sacute': 556, 25643 'dcaron': 608, 25644 'Umacron': 722, 25645 'uring': 556, 25646 'threesuperior': 300, 25647 'Ograve': 722, 25648 'Agrave': 667, 25649 'Abreve': 667, 25650 'multiply': 570, 25651 'uacute': 556, 25652 'Tcaron': 611, 25653 'partialdiff': 494, 25654 'ydieresis': 444, 25655 'Nacute': 722, 25656 'icircumflex': 278, 25657 'Ecircumflex': 667, 25658 'adieresis': 500, 25659 'edieresis': 444, 25660 'cacute': 444, 25661 'nacute': 556, 25662 'umacron': 556, 25663 'Ncaron': 722, 25664 'Iacute': 389, 25665 'plusminus': 570, 25666 'brokenbar': 220, 25667 'registered': 747, 25668 'Gbreve': 722, 25669 'Idotaccent': 389, 25670 'summation': 600, 25671 'Egrave': 667, 25672 'racute': 389, 25673 'omacron': 500, 25674 'Zacute': 611, 25675 'Zcaron': 611, 25676 'greaterequal': 549, 25677 'Eth': 722, 25678 'Ccedilla': 667, 25679 'lcommaaccent': 278, 25680 'tcaron': 366, 25681 'eogonek': 444, 25682 'Uogonek': 722, 25683 'Aacute': 667, 25684 'Adieresis': 667, 25685 'egrave': 444, 25686 'zacute': 389, 25687 'iogonek': 278, 25688 'Oacute': 722, 25689 'oacute': 500, 25690 'amacron': 500, 25691 'sacute': 389, 25692 'idieresis': 278, 25693 'Ocircumflex': 722, 25694 'Ugrave': 722, 25695 'Delta': 612, 25696 'thorn': 500, 25697 'twosuperior': 300, 25698 'Odieresis': 722, 25699 'mu': 576, 25700 'igrave': 278, 25701 'ohungarumlaut': 500, 25702 'Eogonek': 667, 25703 'dcroat': 500, 25704 'threequarters': 750, 25705 'Scedilla': 556, 25706 'lcaron': 382, 25707 'Kcommaaccent': 667, 25708 'Lacute': 611, 25709 'trademark': 1000, 25710 'edotaccent': 444, 25711 'Igrave': 389, 25712 'Imacron': 389, 25713 'Lcaron': 611, 25714 'onehalf': 750, 25715 'lessequal': 549, 25716 'ocircumflex': 500, 25717 'ntilde': 556, 25718 'Uhungarumlaut': 722, 25719 'Eacute': 667, 25720 'emacron': 444, 25721 'gbreve': 500, 25722 'onequarter': 750, 25723 'Scaron': 556, 25724 'Scommaaccent': 556, 25725 'Ohungarumlaut': 722, 25726 'degree': 400, 25727 'ograve': 500, 25728 'Ccaron': 667, 25729 'ugrave': 556, 25730 'radical': 549, 25731 'Dcaron': 722, 25732 'rcommaaccent': 389, 25733 'Ntilde': 722, 25734 'otilde': 500, 25735 'Rcommaaccent': 667, 25736 'Lcommaaccent': 611, 25737 'Atilde': 667, 25738 'Aogonek': 667, 25739 'Aring': 667, 25740 'Otilde': 722, 25741 'zdotaccent': 389, 25742 'Ecaron': 667, 25743 'Iogonek': 389, 25744 'kcommaaccent': 500, 25745 'minus': 606, 25746 'Icircumflex': 389, 25747 'ncaron': 556, 25748 'tcommaaccent': 278, 25749 'logicalnot': 606, 25750 'odieresis': 500, 25751 'udieresis': 556, 25752 'notequal': 549, 25753 'gcommaaccent': 500, 25754 'eth': 500, 25755 'zcaron': 389, 25756 'ncommaaccent': 556, 25757 'onesuperior': 300, 25758 'imacron': 278, 25759 'Euro': 500 25760 }, 25761 'Times-Italic': { 25762 'space': 250, 25763 'exclam': 333, 25764 'quotedbl': 420, 25765 'numbersign': 500, 25766 'dollar': 500, 25767 'percent': 833, 25768 'ampersand': 778, 25769 'quoteright': 333, 25770 'parenleft': 333, 25771 'parenright': 333, 25772 'asterisk': 500, 25773 'plus': 675, 25774 'comma': 250, 25775 'hyphen': 333, 25776 'period': 250, 25777 'slash': 278, 25778 'zero': 500, 25779 'one': 500, 25780 'two': 500, 25781 'three': 500, 25782 'four': 500, 25783 'five': 500, 25784 'six': 500, 25785 'seven': 500, 25786 'eight': 500, 25787 'nine': 500, 25788 'colon': 333, 25789 'semicolon': 333, 25790 'less': 675, 25791 'equal': 675, 25792 'greater': 675, 25793 'question': 500, 25794 'at': 920, 25795 'A': 611, 25796 'B': 611, 25797 'C': 667, 25798 'D': 722, 25799 'E': 611, 25800 'F': 611, 25801 'G': 722, 25802 'H': 722, 25803 'I': 333, 25804 'J': 444, 25805 'K': 667, 25806 'L': 556, 25807 'M': 833, 25808 'N': 667, 25809 'O': 722, 25810 'P': 611, 25811 'Q': 722, 25812 'R': 611, 25813 'S': 500, 25814 'T': 556, 25815 'U': 722, 25816 'V': 611, 25817 'W': 833, 25818 'X': 611, 25819 'Y': 556, 25820 'Z': 556, 25821 'bracketleft': 389, 25822 'backslash': 278, 25823 'bracketright': 389, 25824 'asciicircum': 422, 25825 'underscore': 500, 25826 'quoteleft': 333, 25827 'a': 500, 25828 'b': 500, 25829 'c': 444, 25830 'd': 500, 25831 'e': 444, 25832 'f': 278, 25833 'g': 500, 25834 'h': 500, 25835 'i': 278, 25836 'j': 278, 25837 'k': 444, 25838 'l': 278, 25839 'm': 722, 25840 'n': 500, 25841 'o': 500, 25842 'p': 500, 25843 'q': 500, 25844 'r': 389, 25845 's': 389, 25846 't': 278, 25847 'u': 500, 25848 'v': 444, 25849 'w': 667, 25850 'x': 444, 25851 'y': 444, 25852 'z': 389, 25853 'braceleft': 400, 25854 'bar': 275, 25855 'braceright': 400, 25856 'asciitilde': 541, 25857 'exclamdown': 389, 25858 'cent': 500, 25859 'sterling': 500, 25860 'fraction': 167, 25861 'yen': 500, 25862 'florin': 500, 25863 'section': 500, 25864 'currency': 500, 25865 'quotesingle': 214, 25866 'quotedblleft': 556, 25867 'guillemotleft': 500, 25868 'guilsinglleft': 333, 25869 'guilsinglright': 333, 25870 'fi': 500, 25871 'fl': 500, 25872 'endash': 500, 25873 'dagger': 500, 25874 'daggerdbl': 500, 25875 'periodcentered': 250, 25876 'paragraph': 523, 25877 'bullet': 350, 25878 'quotesinglbase': 333, 25879 'quotedblbase': 556, 25880 'quotedblright': 556, 25881 'guillemotright': 500, 25882 'ellipsis': 889, 25883 'perthousand': 1000, 25884 'questiondown': 500, 25885 'grave': 333, 25886 'acute': 333, 25887 'circumflex': 333, 25888 'tilde': 333, 25889 'macron': 333, 25890 'breve': 333, 25891 'dotaccent': 333, 25892 'dieresis': 333, 25893 'ring': 333, 25894 'cedilla': 333, 25895 'hungarumlaut': 333, 25896 'ogonek': 333, 25897 'caron': 333, 25898 'emdash': 889, 25899 'AE': 889, 25900 'ordfeminine': 276, 25901 'Lslash': 556, 25902 'Oslash': 722, 25903 'OE': 944, 25904 'ordmasculine': 310, 25905 'ae': 667, 25906 'dotlessi': 278, 25907 'lslash': 278, 25908 'oslash': 500, 25909 'oe': 667, 25910 'germandbls': 500, 25911 'Idieresis': 333, 25912 'eacute': 444, 25913 'abreve': 500, 25914 'uhungarumlaut': 500, 25915 'ecaron': 444, 25916 'Ydieresis': 556, 25917 'divide': 675, 25918 'Yacute': 556, 25919 'Acircumflex': 611, 25920 'aacute': 500, 25921 'Ucircumflex': 722, 25922 'yacute': 444, 25923 'scommaaccent': 389, 25924 'ecircumflex': 444, 25925 'Uring': 722, 25926 'Udieresis': 722, 25927 'aogonek': 500, 25928 'Uacute': 722, 25929 'uogonek': 500, 25930 'Edieresis': 611, 25931 'Dcroat': 722, 25932 'commaaccent': 250, 25933 'copyright': 760, 25934 'Emacron': 611, 25935 'ccaron': 444, 25936 'aring': 500, 25937 'Ncommaaccent': 667, 25938 'lacute': 278, 25939 'agrave': 500, 25940 'Tcommaaccent': 556, 25941 'Cacute': 667, 25942 'atilde': 500, 25943 'Edotaccent': 611, 25944 'scaron': 389, 25945 'scedilla': 389, 25946 'iacute': 278, 25947 'lozenge': 471, 25948 'Rcaron': 611, 25949 'Gcommaaccent': 722, 25950 'ucircumflex': 500, 25951 'acircumflex': 500, 25952 'Amacron': 611, 25953 'rcaron': 389, 25954 'ccedilla': 444, 25955 'Zdotaccent': 556, 25956 'Thorn': 611, 25957 'Omacron': 722, 25958 'Racute': 611, 25959 'Sacute': 500, 25960 'dcaron': 544, 25961 'Umacron': 722, 25962 'uring': 500, 25963 'threesuperior': 300, 25964 'Ograve': 722, 25965 'Agrave': 611, 25966 'Abreve': 611, 25967 'multiply': 675, 25968 'uacute': 500, 25969 'Tcaron': 556, 25970 'partialdiff': 476, 25971 'ydieresis': 444, 25972 'Nacute': 667, 25973 'icircumflex': 278, 25974 'Ecircumflex': 611, 25975 'adieresis': 500, 25976 'edieresis': 444, 25977 'cacute': 444, 25978 'nacute': 500, 25979 'umacron': 500, 25980 'Ncaron': 667, 25981 'Iacute': 333, 25982 'plusminus': 675, 25983 'brokenbar': 275, 25984 'registered': 760, 25985 'Gbreve': 722, 25986 'Idotaccent': 333, 25987 'summation': 600, 25988 'Egrave': 611, 25989 'racute': 389, 25990 'omacron': 500, 25991 'Zacute': 556, 25992 'Zcaron': 556, 25993 'greaterequal': 549, 25994 'Eth': 722, 25995 'Ccedilla': 667, 25996 'lcommaaccent': 278, 25997 'tcaron': 300, 25998 'eogonek': 444, 25999 'Uogonek': 722, 26000 'Aacute': 611, 26001 'Adieresis': 611, 26002 'egrave': 444, 26003 'zacute': 389, 26004 'iogonek': 278, 26005 'Oacute': 722, 26006 'oacute': 500, 26007 'amacron': 500, 26008 'sacute': 389, 26009 'idieresis': 278, 26010 'Ocircumflex': 722, 26011 'Ugrave': 722, 26012 'Delta': 612, 26013 'thorn': 500, 26014 'twosuperior': 300, 26015 'Odieresis': 722, 26016 'mu': 500, 26017 'igrave': 278, 26018 'ohungarumlaut': 500, 26019 'Eogonek': 611, 26020 'dcroat': 500, 26021 'threequarters': 750, 26022 'Scedilla': 500, 26023 'lcaron': 300, 26024 'Kcommaaccent': 667, 26025 'Lacute': 556, 26026 'trademark': 980, 26027 'edotaccent': 444, 26028 'Igrave': 333, 26029 'Imacron': 333, 26030 'Lcaron': 611, 26031 'onehalf': 750, 26032 'lessequal': 549, 26033 'ocircumflex': 500, 26034 'ntilde': 500, 26035 'Uhungarumlaut': 722, 26036 'Eacute': 611, 26037 'emacron': 444, 26038 'gbreve': 500, 26039 'onequarter': 750, 26040 'Scaron': 500, 26041 'Scommaaccent': 500, 26042 'Ohungarumlaut': 722, 26043 'degree': 400, 26044 'ograve': 500, 26045 'Ccaron': 667, 26046 'ugrave': 500, 26047 'radical': 453, 26048 'Dcaron': 722, 26049 'rcommaaccent': 389, 26050 'Ntilde': 667, 26051 'otilde': 500, 26052 'Rcommaaccent': 611, 26053 'Lcommaaccent': 556, 26054 'Atilde': 611, 26055 'Aogonek': 611, 26056 'Aring': 611, 26057 'Otilde': 722, 26058 'zdotaccent': 389, 26059 'Ecaron': 611, 26060 'Iogonek': 333, 26061 'kcommaaccent': 444, 26062 'minus': 675, 26063 'Icircumflex': 333, 26064 'ncaron': 500, 26065 'tcommaaccent': 278, 26066 'logicalnot': 675, 26067 'odieresis': 500, 26068 'udieresis': 500, 26069 'notequal': 549, 26070 'gcommaaccent': 500, 26071 'eth': 500, 26072 'zcaron': 389, 26073 'ncommaaccent': 500, 26074 'onesuperior': 300, 26075 'imacron': 278, 26076 'Euro': 500 26077 }, 26078 'ZapfDingbats': { 26079 'space': 278, 26080 'a1': 974, 26081 'a2': 961, 26082 'a202': 974, 26083 'a3': 980, 26084 'a4': 719, 26085 'a5': 789, 26086 'a119': 790, 26087 'a118': 791, 26088 'a117': 690, 26089 'a11': 960, 26090 'a12': 939, 26091 'a13': 549, 26092 'a14': 855, 26093 'a15': 911, 26094 'a16': 933, 26095 'a105': 911, 26096 'a17': 945, 26097 'a18': 974, 26098 'a19': 755, 26099 'a20': 846, 26100 'a21': 762, 26101 'a22': 761, 26102 'a23': 571, 26103 'a24': 677, 26104 'a25': 763, 26105 'a26': 760, 26106 'a27': 759, 26107 'a28': 754, 26108 'a6': 494, 26109 'a7': 552, 26110 'a8': 537, 26111 'a9': 577, 26112 'a10': 692, 26113 'a29': 786, 26114 'a30': 788, 26115 'a31': 788, 26116 'a32': 790, 26117 'a33': 793, 26118 'a34': 794, 26119 'a35': 816, 26120 'a36': 823, 26121 'a37': 789, 26122 'a38': 841, 26123 'a39': 823, 26124 'a40': 833, 26125 'a41': 816, 26126 'a42': 831, 26127 'a43': 923, 26128 'a44': 744, 26129 'a45': 723, 26130 'a46': 749, 26131 'a47': 790, 26132 'a48': 792, 26133 'a49': 695, 26134 'a50': 776, 26135 'a51': 768, 26136 'a52': 792, 26137 'a53': 759, 26138 'a54': 707, 26139 'a55': 708, 26140 'a56': 682, 26141 'a57': 701, 26142 'a58': 826, 26143 'a59': 815, 26144 'a60': 789, 26145 'a61': 789, 26146 'a62': 707, 26147 'a63': 687, 26148 'a64': 696, 26149 'a65': 689, 26150 'a66': 786, 26151 'a67': 787, 26152 'a68': 713, 26153 'a69': 791, 26154 'a70': 785, 26155 'a71': 791, 26156 'a72': 873, 26157 'a73': 761, 26158 'a74': 762, 26159 'a203': 762, 26160 'a75': 759, 26161 'a204': 759, 26162 'a76': 892, 26163 'a77': 892, 26164 'a78': 788, 26165 'a79': 784, 26166 'a81': 438, 26167 'a82': 138, 26168 'a83': 277, 26169 'a84': 415, 26170 'a97': 392, 26171 'a98': 392, 26172 'a99': 668, 26173 'a100': 668, 26174 'a89': 390, 26175 'a90': 390, 26176 'a93': 317, 26177 'a94': 317, 26178 'a91': 276, 26179 'a92': 276, 26180 'a205': 509, 26181 'a85': 509, 26182 'a206': 410, 26183 'a86': 410, 26184 'a87': 234, 26185 'a88': 234, 26186 'a95': 334, 26187 'a96': 334, 26188 'a101': 732, 26189 'a102': 544, 26190 'a103': 544, 26191 'a104': 910, 26192 'a106': 667, 26193 'a107': 760, 26194 'a108': 760, 26195 'a112': 776, 26196 'a111': 595, 26197 'a110': 694, 26198 'a109': 626, 26199 'a120': 788, 26200 'a121': 788, 26201 'a122': 788, 26202 'a123': 788, 26203 'a124': 788, 26204 'a125': 788, 26205 'a126': 788, 26206 'a127': 788, 26207 'a128': 788, 26208 'a129': 788, 26209 'a130': 788, 26210 'a131': 788, 26211 'a132': 788, 26212 'a133': 788, 26213 'a134': 788, 26214 'a135': 788, 26215 'a136': 788, 26216 'a137': 788, 26217 'a138': 788, 26218 'a139': 788, 26219 'a140': 788, 26220 'a141': 788, 26221 'a142': 788, 26222 'a143': 788, 26223 'a144': 788, 26224 'a145': 788, 26225 'a146': 788, 26226 'a147': 788, 26227 'a148': 788, 26228 'a149': 788, 26229 'a150': 788, 26230 'a151': 788, 26231 'a152': 788, 26232 'a153': 788, 26233 'a154': 788, 26234 'a155': 788, 26235 'a156': 788, 26236 'a157': 788, 26237 'a158': 788, 26238 'a159': 788, 26239 'a160': 894, 26240 'a161': 838, 26241 'a163': 1016, 26242 'a164': 458, 26243 'a196': 748, 26244 'a165': 924, 26245 'a192': 748, 26246 'a166': 918, 26247 'a167': 927, 26248 'a168': 928, 26249 'a169': 928, 26250 'a170': 834, 26251 'a171': 873, 26252 'a172': 828, 26253 'a173': 924, 26254 'a162': 924, 26255 'a174': 917, 26256 'a175': 930, 26257 'a176': 931, 26258 'a177': 463, 26259 'a178': 883, 26260 'a179': 836, 26261 'a193': 836, 26262 'a180': 867, 26263 'a199': 867, 26264 'a181': 696, 26265 'a200': 696, 26266 'a182': 874, 26267 'a201': 874, 26268 'a183': 760, 26269 'a184': 946, 26270 'a197': 771, 26271 'a185': 865, 26272 'a194': 771, 26273 'a198': 888, 26274 'a186': 967, 26275 'a195': 888, 26276 'a187': 831, 26277 'a188': 873, 26278 'a189': 927, 26279 'a190': 970, 26280 'a191': 918 26281 } 26282 }; 26283 26284 26285 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 26286 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ 26287 26288 'use strict'; 26289 26290 var EOF = {}; 26291 26292 function isEOF(v) { 26293 return v == EOF; 26294 } 26295 26296 var Parser = (function ParserClosure() { 26297 function Parser(lexer, allowStreams, xref) { 26298 this.lexer = lexer; 26299 this.allowStreams = allowStreams; 26300 this.xref = xref; 26301 this.inlineImg = 0; 26302 this.refill(); 26303 } 26304 26305 Parser.prototype = { 26306 refill: function Parser_refill() { 26307 this.buf1 = this.lexer.getObj(); 26308 this.buf2 = this.lexer.getObj(); 26309 }, 26310 shift: function Parser_shift() { 26311 if (isCmd(this.buf2, 'ID')) { 26312 this.buf1 = this.buf2; 26313 this.buf2 = null; 26314 // skip byte after ID 26315 this.lexer.skip(); 26316 } else { 26317 this.buf1 = this.buf2; 26318 this.buf2 = this.lexer.getObj(); 26319 } 26320 }, 26321 getObj: function Parser_getObj(cipherTransform) { 26322 if (isCmd(this.buf1, 'BI')) { // inline image 26323 this.shift(); 26324 return this.makeInlineImage(cipherTransform); 26325 } 26326 if (isCmd(this.buf1, '[')) { // array 26327 this.shift(); 26328 var array = []; 26329 while (!isCmd(this.buf1, ']') && !isEOF(this.buf1)) 26330 array.push(this.getObj()); 26331 if (isEOF(this.buf1)) 26332 error('End of file inside array'); 26333 this.shift(); 26334 return array; 26335 } 26336 if (isCmd(this.buf1, '<<')) { // dictionary or stream 26337 this.shift(); 26338 var dict = new Dict(this.xref); 26339 while (!isCmd(this.buf1, '>>') && !isEOF(this.buf1)) { 26340 if (!isName(this.buf1)) 26341 error('Dictionary key must be a name object'); 26342 26343 var key = this.buf1.name; 26344 this.shift(); 26345 if (isEOF(this.buf1)) 26346 break; 26347 dict.set(key, this.getObj(cipherTransform)); 26348 } 26349 if (isEOF(this.buf1)) 26350 error('End of file inside dictionary'); 26351 26352 // stream objects are not allowed inside content streams or 26353 // object streams 26354 if (isCmd(this.buf2, 'stream')) { 26355 return this.allowStreams ? 26356 this.makeStream(dict, cipherTransform) : dict; 26357 } 26358 this.shift(); 26359 return dict; 26360 } 26361 if (isInt(this.buf1)) { // indirect reference or integer 26362 var num = this.buf1; 26363 this.shift(); 26364 if (isInt(this.buf1) && isCmd(this.buf2, 'R')) { 26365 var ref = new Ref(num, this.buf1); 26366 this.shift(); 26367 this.shift(); 26368 return ref; 26369 } 26370 return num; 26371 } 26372 if (isString(this.buf1)) { // string 26373 var str = this.buf1; 26374 this.shift(); 26375 if (cipherTransform) 26376 str = cipherTransform.decryptString(str); 26377 return str; 26378 } 26379 26380 // simple object 26381 var obj = this.buf1; 26382 this.shift(); 26383 return obj; 26384 }, 26385 makeInlineImage: function Parser_makeInlineImage(cipherTransform) { 26386 var lexer = this.lexer; 26387 var stream = lexer.stream; 26388 26389 // parse dictionary 26390 var dict = new Dict(); 26391 while (!isCmd(this.buf1, 'ID') && !isEOF(this.buf1)) { 26392 if (!isName(this.buf1)) 26393 error('Dictionary key must be a name object'); 26394 26395 var key = this.buf1.name; 26396 this.shift(); 26397 if (isEOF(this.buf1)) 26398 break; 26399 dict.set(key, this.getObj(cipherTransform)); 26400 } 26401 26402 // parse image stream 26403 var startPos = stream.pos; 26404 26405 // searching for the /EI\s/ 26406 var state = 0, ch; 26407 while (state != 4 && (ch = stream.getByte()) != null) { 26408 switch (ch) { 26409 case 0x20: 26410 case 0x0D: 26411 case 0x0A: 26412 state = state === 3 ? 4 : 0; 26413 break; 26414 case 0x45: 26415 state = 2; 26416 break; 26417 case 0x49: 26418 state = state === 2 ? 3 : 0; 26419 break; 26420 default: 26421 state = 0; 26422 break; 26423 } 26424 } 26425 26426 // TODO improve the small images performance to remove the limit 26427 var inlineImgLimit = 500; 26428 if (++this.inlineImg >= inlineImgLimit) { 26429 if (this.inlineImg === inlineImgLimit) 26430 warn('Too many inline images'); 26431 this.shift(); 26432 return null; 26433 } 26434 26435 var length = (stream.pos - 4) - startPos; 26436 var imageStream = stream.makeSubStream(startPos, length, dict); 26437 if (cipherTransform) 26438 imageStream = cipherTransform.createStream(imageStream); 26439 imageStream = this.filter(imageStream, dict, length); 26440 imageStream.parameters = dict; 26441 26442 this.buf2 = Cmd.get('EI'); 26443 this.shift(); 26444 26445 return imageStream; 26446 }, 26447 fetchIfRef: function Parser_fetchIfRef(obj) { 26448 // not relying on the xref.fetchIfRef -- xref might not be set 26449 return isRef(obj) ? this.xref.fetch(obj) : obj; 26450 }, 26451 makeStream: function Parser_makeStream(dict, cipherTransform) { 26452 var lexer = this.lexer; 26453 var stream = lexer.stream; 26454 26455 // get stream start position 26456 lexer.skipToNextLine(); 26457 var pos = stream.pos; 26458 26459 // get length 26460 var length = this.fetchIfRef(dict.get('Length')); 26461 if (!isInt(length)) 26462 error('Bad ' + length + ' attribute in stream'); 26463 26464 // skip over the stream data 26465 stream.pos = pos + length; 26466 this.shift(); // '>>' 26467 this.shift(); // 'stream' 26468 if (!isCmd(this.buf1, 'endstream')) 26469 error('Missing endstream'); 26470 this.shift(); 26471 26472 stream = stream.makeSubStream(pos, length, dict); 26473 if (cipherTransform) 26474 stream = cipherTransform.createStream(stream); 26475 stream = this.filter(stream, dict, length); 26476 stream.parameters = dict; 26477 return stream; 26478 }, 26479 filter: function Parser_filter(stream, dict, length) { 26480 var filter = this.fetchIfRef(dict.get('Filter', 'F')); 26481 var params = this.fetchIfRef(dict.get('DecodeParms', 'DP')); 26482 if (isName(filter)) 26483 return this.makeFilter(stream, filter.name, length, params); 26484 if (isArray(filter)) { 26485 var filterArray = filter; 26486 var paramsArray = params; 26487 for (var i = 0, ii = filterArray.length; i < ii; ++i) { 26488 filter = filterArray[i]; 26489 if (!isName(filter)) 26490 error('Bad filter name: ' + filter); 26491 26492 params = null; 26493 if (isArray(paramsArray) && (i in paramsArray)) 26494 params = paramsArray[i]; 26495 stream = this.makeFilter(stream, filter.name, length, params); 26496 // after the first stream the length variable is invalid 26497 length = null; 26498 } 26499 } 26500 return stream; 26501 }, 26502 makeFilter: function Parser_makeFilter(stream, name, length, params) { 26503 if (name == 'FlateDecode' || name == 'Fl') { 26504 if (params) { 26505 return new PredictorStream(new FlateStream(stream), params); 26506 } 26507 return new FlateStream(stream); 26508 } 26509 if (name == 'LZWDecode' || name == 'LZW') { 26510 var earlyChange = 1; 26511 if (params) { 26512 if (params.has('EarlyChange')) 26513 earlyChange = params.get('EarlyChange'); 26514 return new PredictorStream( 26515 new LZWStream(stream, earlyChange), params); 26516 } 26517 return new LZWStream(stream, earlyChange); 26518 } 26519 if (name == 'DCTDecode' || name == 'DCT') { 26520 var bytes = stream.getBytes(length); 26521 return new JpegStream(bytes, stream.dict, this.xref); 26522 } 26523 if (name == 'JPXDecode' || name == 'JPX') { 26524 var bytes = stream.getBytes(length); 26525 return new JpxStream(bytes, stream.dict); 26526 } 26527 if (name == 'ASCII85Decode' || name == 'A85') { 26528 return new Ascii85Stream(stream); 26529 } 26530 if (name == 'ASCIIHexDecode' || name == 'AHx') { 26531 return new AsciiHexStream(stream); 26532 } 26533 if (name == 'CCITTFaxDecode' || name == 'CCF') { 26534 return new CCITTFaxStream(stream, params); 26535 } 26536 if (name == 'RunLengthDecode' || name == 'RL') { 26537 return new RunLengthStream(stream); 26538 } 26539 if (name == 'JBIG2Decode') { 26540 error('JBIG2 image format is not currently supprted.'); 26541 } 26542 warn('filter "' + name + '" not supported yet'); 26543 return stream; 26544 } 26545 }; 26546 26547 return Parser; 26548 })(); 26549 26550 var Lexer = (function LexerClosure() { 26551 function Lexer(stream) { 26552 this.stream = stream; 26553 } 26554 26555 Lexer.isSpace = function Lexer_isSpace(ch) { 26556 return ch == ' ' || ch == '\t' || ch == '\x0d' || ch == '\x0a'; 26557 }; 26558 26559 // A '1' in this array means the character is white space. A '1' or 26560 // '2' means the character ends a name or command. 26561 var specialChars = [ 26562 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x 26563 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x 26564 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x 26565 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x 26566 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x 26567 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x 26568 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x 26569 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x 26570 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x 26571 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x 26572 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax 26573 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx 26574 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx 26575 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx 26576 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex 26577 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // fx 26578 ]; 26579 26580 function toHexDigit(ch) { 26581 if (ch >= '0' && ch <= '9') 26582 return ch.charCodeAt(0) - 48; 26583 ch = ch.toUpperCase(); 26584 if (ch >= 'A' && ch <= 'F') 26585 return ch.charCodeAt(0) - 55; 26586 return -1; 26587 } 26588 26589 Lexer.prototype = { 26590 getNumber: function Lexer_getNumber(ch) { 26591 var floating = false; 26592 var str = ch; 26593 var stream = this.stream; 26594 for (;;) { 26595 ch = stream.lookChar(); 26596 if (ch == '.' && !floating) { 26597 str += ch; 26598 floating = true; 26599 } else if (ch == '-') { 26600 // ignore minus signs in the middle of numbers to match 26601 // Adobe's behavior 26602 warn('Badly formated number'); 26603 } else if (ch >= '0' && ch <= '9') { 26604 str += ch; 26605 } else if (ch == 'e' || ch == 'E') { 26606 floating = true; 26607 } else { 26608 // the last character doesn't belong to us 26609 break; 26610 } 26611 stream.skip(); 26612 } 26613 var value = parseFloat(str); 26614 if (isNaN(value)) 26615 error('Invalid floating point number: ' + value); 26616 return value; 26617 }, 26618 getString: function Lexer_getString() { 26619 var numParen = 1; 26620 var done = false; 26621 var str = ''; 26622 var stream = this.stream; 26623 var ch; 26624 do { 26625 ch = stream.getChar(); 26626 switch (ch) { 26627 case undefined: 26628 warn('Unterminated string'); 26629 done = true; 26630 break; 26631 case '(': 26632 ++numParen; 26633 str += ch; 26634 break; 26635 case ')': 26636 if (--numParen == 0) { 26637 done = true; 26638 } else { 26639 str += ch; 26640 } 26641 break; 26642 case '\\': 26643 ch = stream.getChar(); 26644 switch (ch) { 26645 case undefined: 26646 warn('Unterminated string'); 26647 done = true; 26648 break; 26649 case 'n': 26650 str += '\n'; 26651 break; 26652 case 'r': 26653 str += '\r'; 26654 break; 26655 case 't': 26656 str += '\t'; 26657 break; 26658 case 'b': 26659 str += '\b'; 26660 break; 26661 case 'f': 26662 str += '\f'; 26663 break; 26664 case '\\': 26665 case '(': 26666 case ')': 26667 str += ch; 26668 break; 26669 case '0': case '1': case '2': case '3': 26670 case '4': case '5': case '6': case '7': 26671 var x = ch - '0'; 26672 ch = stream.lookChar(); 26673 if (ch >= '0' && ch <= '7') { 26674 stream.skip(); 26675 x = (x << 3) + (ch - '0'); 26676 ch = stream.lookChar(); 26677 if (ch >= '0' && ch <= '7') { 26678 stream.skip(); 26679 x = (x << 3) + (ch - '0'); 26680 } 26681 } 26682 26683 str += String.fromCharCode(x); 26684 break; 26685 case '\r': 26686 ch = stream.lookChar(); 26687 if (ch == '\n') 26688 stream.skip(); 26689 break; 26690 case '\n': 26691 break; 26692 default: 26693 str += ch; 26694 } 26695 break; 26696 default: 26697 str += ch; 26698 } 26699 } while (!done); 26700 return str; 26701 }, 26702 getName: function Lexer_getName(ch) { 26703 var str = ''; 26704 var stream = this.stream; 26705 while (!!(ch = stream.lookChar()) && !specialChars[ch.charCodeAt(0)]) { 26706 stream.skip(); 26707 if (ch == '#') { 26708 ch = stream.lookChar(); 26709 var x = toHexDigit(ch); 26710 if (x != -1) { 26711 stream.skip(); 26712 var x2 = toHexDigit(stream.getChar()); 26713 if (x2 == -1) 26714 error('Illegal digit in hex char in name: ' + x2); 26715 str += String.fromCharCode((x << 4) | x2); 26716 } else { 26717 str += '#'; 26718 str += ch; 26719 } 26720 } else { 26721 str += ch; 26722 } 26723 } 26724 if (str.length > 128) 26725 error('Warning: name token is longer than allowed by the spec: ' + 26726 str.length); 26727 return new Name(str); 26728 }, 26729 getHexString: function Lexer_getHexString(ch) { 26730 var str = ''; 26731 var stream = this.stream; 26732 for (;;) { 26733 ch = stream.getChar(); 26734 if (ch == '>') { 26735 break; 26736 } 26737 if (!ch) { 26738 warn('Unterminated hex string'); 26739 break; 26740 } 26741 if (specialChars[ch.charCodeAt(0)] != 1) { 26742 var x, x2; 26743 if ((x = toHexDigit(ch)) == -1) 26744 error('Illegal character in hex string: ' + ch); 26745 26746 ch = stream.getChar(); 26747 while (specialChars[ch.charCodeAt(0)] == 1) 26748 ch = stream.getChar(); 26749 26750 if ((x2 = toHexDigit(ch)) == -1) 26751 error('Illegal character in hex string: ' + ch); 26752 26753 str += String.fromCharCode((x << 4) | x2); 26754 } 26755 } 26756 return str; 26757 }, 26758 getObj: function Lexer_getObj() { 26759 // skip whitespace and comments 26760 var comment = false; 26761 var stream = this.stream; 26762 var ch; 26763 while (true) { 26764 if (!(ch = stream.getChar())) 26765 return EOF; 26766 if (comment) { 26767 if (ch == '\r' || ch == '\n') 26768 comment = false; 26769 } else if (ch == '%') { 26770 comment = true; 26771 } else if (specialChars[ch.charCodeAt(0)] != 1) { 26772 break; 26773 } 26774 } 26775 26776 // start reading token 26777 switch (ch) { 26778 case '0': case '1': case '2': case '3': case '4': 26779 case '5': case '6': case '7': case '8': case '9': 26780 case '+': case '-': case '.': 26781 return this.getNumber(ch); 26782 case '(': 26783 return this.getString(); 26784 case '/': 26785 return this.getName(ch); 26786 // array punctuation 26787 case '[': 26788 case ']': 26789 return Cmd.get(ch); 26790 // hex string or dict punctuation 26791 case '<': 26792 ch = stream.lookChar(); 26793 if (ch == '<') { 26794 // dict punctuation 26795 stream.skip(); 26796 return Cmd.get('<<'); 26797 } 26798 return this.getHexString(ch); 26799 // dict punctuation 26800 case '>': 26801 ch = stream.lookChar(); 26802 if (ch == '>') { 26803 stream.skip(); 26804 return Cmd.get('>>'); 26805 } 26806 case '{': 26807 case '}': 26808 return Cmd.get(ch); 26809 // fall through 26810 case ')': 26811 error('Illegal character: ' + ch); 26812 } 26813 26814 // command 26815 var str = ch; 26816 while (!!(ch = stream.lookChar()) && !specialChars[ch.charCodeAt(0)]) { 26817 stream.skip(); 26818 if (str.length == 128) 26819 error('Command token too long: ' + str.length); 26820 26821 str += ch; 26822 } 26823 if (str == 'true') 26824 return true; 26825 if (str == 'false') 26826 return false; 26827 if (str == 'null') 26828 return null; 26829 return Cmd.get(str); 26830 }, 26831 skipToNextLine: function Lexer_skipToNextLine() { 26832 var stream = this.stream; 26833 while (true) { 26834 var ch = stream.getChar(); 26835 if (!ch || ch == '\n') 26836 return; 26837 if (ch == '\r') { 26838 if ((ch = stream.lookChar()) == '\n') 26839 stream.skip(); 26840 return; 26841 } 26842 } 26843 }, 26844 skip: function Lexer_skip() { 26845 this.stream.skip(); 26846 } 26847 }; 26848 26849 return Lexer; 26850 })(); 26851 26852 var Linearization = (function LinearizationClosure() { 26853 function Linearization(stream) { 26854 this.parser = new Parser(new Lexer(stream), false, null); 26855 var obj1 = this.parser.getObj(); 26856 var obj2 = this.parser.getObj(); 26857 var obj3 = this.parser.getObj(); 26858 this.linDict = this.parser.getObj(); 26859 if (isInt(obj1) && isInt(obj2) && isCmd(obj3, 'obj') && 26860 isDict(this.linDict)) { 26861 var obj = this.linDict.get('Linearized'); 26862 if (!(isNum(obj) && obj > 0)) 26863 this.linDict = null; 26864 } 26865 } 26866 26867 Linearization.prototype = { 26868 getInt: function Linearization_getInt(name) { 26869 var linDict = this.linDict; 26870 var obj; 26871 if (isDict(linDict) && 26872 isInt(obj = linDict.get(name)) && 26873 obj > 0) { 26874 return obj; 26875 } 26876 error('"' + name + '" field in linearization table is invalid'); 26877 }, 26878 getHint: function Linearization_getHint(index) { 26879 var linDict = this.linDict; 26880 var obj1, obj2; 26881 if (isDict(linDict) && 26882 isArray(obj1 = linDict.get('H')) && 26883 obj1.length >= 2 && 26884 isInt(obj2 = obj1[index]) && 26885 obj2 > 0) { 26886 return obj2; 26887 } 26888 error('Hints table in linearization table is invalid: ' + index); 26889 }, 26890 get length() { 26891 if (!isDict(this.linDict)) 26892 return 0; 26893 return this.getInt('L'); 26894 }, 26895 get hintsOffset() { 26896 return this.getHint(0); 26897 }, 26898 get hintsLength() { 26899 return this.getHint(1); 26900 }, 26901 get hintsOffset2() { 26902 return this.getHint(2); 26903 }, 26904 get hintsLenth2() { 26905 return this.getHint(3); 26906 }, 26907 get objectNumberFirst() { 26908 return this.getInt('O'); 26909 }, 26910 get endFirst() { 26911 return this.getInt('E'); 26912 }, 26913 get numPages() { 26914 return this.getInt('N'); 26915 }, 26916 get mainXRefEntriesOffset() { 26917 return this.getInt('T'); 26918 }, 26919 get pageFirst() { 26920 return this.getInt('P'); 26921 } 26922 }; 26923 26924 return Linearization; 26925 })(); 26926 26927 26928 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 26929 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ 26930 26931 'use strict'; 26932 26933 var PatternType = { 26934 AXIAL: 2, 26935 RADIAL: 3 26936 }; 26937 26938 var Pattern = (function PatternClosure() { 26939 // Constructor should define this.getPattern 26940 function Pattern() { 26941 error('should not call Pattern constructor'); 26942 } 26943 26944 Pattern.prototype = { 26945 // Input: current Canvas context 26946 // Output: the appropriate fillStyle or strokeStyle 26947 getPattern: function Pattern_getPattern(ctx) { 26948 error('Should not call Pattern.getStyle: ' + ctx); 26949 } 26950 }; 26951 26952 Pattern.shadingFromIR = function Pattern_shadingFromIR(raw) { 26953 return Shadings[raw[0]].fromIR(raw); 26954 }; 26955 26956 Pattern.parseShading = function Pattern_parseShading(shading, matrix, xref, 26957 res) { 26958 26959 var dict = isStream(shading) ? shading.dict : shading; 26960 var type = dict.get('ShadingType'); 26961 26962 switch (type) { 26963 case PatternType.AXIAL: 26964 case PatternType.RADIAL: 26965 // Both radial and axial shadings are handled by RadialAxial shading. 26966 return new Shadings.RadialAxial(dict, matrix, xref, res); 26967 default: 26968 return new Shadings.Dummy(); 26969 } 26970 }; 26971 return Pattern; 26972 })(); 26973 26974 var Shadings = {}; 26975 26976 // Radial and axial shading have very similar implementations 26977 // If needed, the implementations can be broken into two classes 26978 Shadings.RadialAxial = (function RadialAxialClosure() { 26979 function RadialAxial(dict, matrix, xref, res, ctx) { 26980 this.matrix = matrix; 26981 this.coordsArr = dict.get('Coords'); 26982 this.shadingType = dict.get('ShadingType'); 26983 this.type = 'Pattern'; 26984 26985 this.ctx = ctx; 26986 var cs = dict.get('ColorSpace', 'CS'); 26987 cs = ColorSpace.parse(cs, xref, res); 26988 this.cs = cs; 26989 26990 var t0 = 0.0, t1 = 1.0; 26991 if (dict.has('Domain')) { 26992 var domainArr = dict.get('Domain'); 26993 t0 = domainArr[0]; 26994 t1 = domainArr[1]; 26995 } 26996 26997 var extendStart = false, extendEnd = false; 26998 if (dict.has('Extend')) { 26999 var extendArr = dict.get('Extend'); 27000 extendStart = extendArr[0]; 27001 extendEnd = extendArr[1]; 27002 TODO('Support extend'); 27003 } 27004 27005 this.extendStart = extendStart; 27006 this.extendEnd = extendEnd; 27007 27008 var fnObj = dict.get('Function'); 27009 if (isArray(fnObj)) 27010 error('No support for array of functions'); 27011 if (!isPDFFunction(fnObj)) 27012 error('Invalid function'); 27013 var fn = PDFFunction.parse(xref, fnObj); 27014 27015 // 10 samples seems good enough for now, but probably won't work 27016 // if there are sharp color changes. Ideally, we would implement 27017 // the spec faithfully and add lossless optimizations. 27018 var step = (t1 - t0) / 10; 27019 var diff = t1 - t0; 27020 27021 var colorStops = []; 27022 for (var i = t0; i <= t1; i += step) { 27023 var rgbColor = cs.getRgb(fn([i])); 27024 var cssColor = Util.makeCssRgb(rgbColor[0], rgbColor[1], rgbColor[2]); 27025 colorStops.push([(i - t0) / diff, cssColor]); 27026 } 27027 27028 this.colorStops = colorStops; 27029 } 27030 27031 RadialAxial.fromIR = function RadialAxial_fromIR(raw) { 27032 var type = raw[1]; 27033 var colorStops = raw[2]; 27034 var p0 = raw[3]; 27035 var p1 = raw[4]; 27036 var r0 = raw[5]; 27037 var r1 = raw[6]; 27038 return { 27039 type: 'Pattern', 27040 getPattern: function RadialAxial_getPattern(ctx) { 27041 var curMatrix = ctx.mozCurrentTransform; 27042 if (curMatrix) { 27043 var userMatrix = ctx.mozCurrentTransformInverse; 27044 27045 p0 = Util.applyTransform(p0, curMatrix); 27046 p0 = Util.applyTransform(p0, userMatrix); 27047 27048 p1 = Util.applyTransform(p1, curMatrix); 27049 p1 = Util.applyTransform(p1, userMatrix); 27050 } 27051 27052 var grad; 27053 if (type == PatternType.AXIAL) 27054 grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]); 27055 else if (type == PatternType.RADIAL) 27056 grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1); 27057 27058 for (var i = 0, ii = colorStops.length; i < ii; ++i) { 27059 var c = colorStops[i]; 27060 grad.addColorStop(c[0], c[1]); 27061 } 27062 return grad; 27063 } 27064 }; 27065 }; 27066 27067 RadialAxial.prototype = { 27068 getIR: function RadialAxial_getIR() { 27069 var coordsArr = this.coordsArr; 27070 var type = this.shadingType; 27071 if (type == PatternType.AXIAL) { 27072 var p0 = [coordsArr[0], coordsArr[1]]; 27073 var p1 = [coordsArr[2], coordsArr[3]]; 27074 var r0 = null; 27075 var r1 = null; 27076 } else if (type == PatternType.RADIAL) { 27077 var p0 = [coordsArr[0], coordsArr[1]]; 27078 var p1 = [coordsArr[3], coordsArr[4]]; 27079 var r0 = coordsArr[2]; 27080 var r1 = coordsArr[5]; 27081 } else { 27082 error('getPattern type unknown: ' + type); 27083 } 27084 27085 var matrix = this.matrix; 27086 if (matrix) { 27087 p0 = Util.applyTransform(p0, matrix); 27088 p1 = Util.applyTransform(p1, matrix); 27089 } 27090 27091 return ['RadialAxial', type, this.colorStops, p0, p1, r0, r1]; 27092 } 27093 }; 27094 27095 return RadialAxial; 27096 })(); 27097 27098 Shadings.Dummy = (function DummyClosure() { 27099 function Dummy() { 27100 this.type = 'Pattern'; 27101 } 27102 27103 Dummy.fromIR = function Dummy_fromIR() { 27104 return 'hotpink'; 27105 }; 27106 27107 Dummy.prototype = { 27108 getIR: function Dummy_getIR() { 27109 return ['Dummy']; 27110 } 27111 }; 27112 return Dummy; 27113 })(); 27114 27115 var TilingPattern = (function TilingPatternClosure() { 27116 var PaintType = { 27117 COLORED: 1, 27118 UNCOLORED: 2 27119 }; 27120 var MAX_PATTERN_SIZE = 512; 27121 27122 function TilingPattern(IR, color, ctx, objs) { 27123 var operatorList = IR[2]; 27124 this.matrix = IR[3]; 27125 var bbox = IR[4]; 27126 var xstep = IR[5]; 27127 var ystep = IR[6]; 27128 var paintType = IR[7]; 27129 27130 TODO('TilingType'); 27131 27132 this.curMatrix = ctx.mozCurrentTransform; 27133 this.invMatrix = ctx.mozCurrentTransformInverse; 27134 this.ctx = ctx; 27135 this.type = 'Pattern'; 27136 27137 var x0 = bbox[0], y0 = bbox[1], x1 = bbox[2], y1 = bbox[3]; 27138 27139 var topLeft = [x0, y0]; 27140 // we want the canvas to be as large as the step size 27141 var botRight = [x0 + xstep, y0 + ystep]; 27142 27143 var width = botRight[0] - topLeft[0]; 27144 var height = botRight[1] - topLeft[1]; 27145 27146 // TODO: hack to avoid OOM, we would ideally compute the tiling 27147 // pattern to be only as large as the acual size in device space 27148 // This could be computed with .mozCurrentTransform, but still 27149 // needs to be implemented 27150 while (Math.abs(width) > MAX_PATTERN_SIZE || 27151 Math.abs(height) > MAX_PATTERN_SIZE) { 27152 width = height = MAX_PATTERN_SIZE; 27153 } 27154 27155 var tmpCanvas = createScratchCanvas(width, height); 27156 27157 // set the new canvas element context as the graphics context 27158 var tmpCtx = tmpCanvas.getContext('2d'); 27159 var graphics = new CanvasGraphics(tmpCtx, objs); 27160 27161 switch (paintType) { 27162 case PaintType.COLORED: 27163 tmpCtx.fillStyle = ctx.fillStyle; 27164 tmpCtx.strokeStyle = ctx.strokeStyle; 27165 break; 27166 case PaintType.UNCOLORED: 27167 var cssColor = Util.makeCssRgb(this, color[0], color[1], color[2]); 27168 tmpCtx.fillStyle = cssColor; 27169 tmpCtx.strokeStyle = cssColor; 27170 break; 27171 default: 27172 error('Unsupported paint type: ' + paintType); 27173 } 27174 27175 var scale = [width / xstep, height / ystep]; 27176 this.scale = scale; 27177 27178 // transform coordinates to pattern space 27179 var tmpTranslate = [1, 0, 0, 1, -topLeft[0], -topLeft[1]]; 27180 var tmpScale = [scale[0], 0, 0, scale[1], 0, 0]; 27181 graphics.transform.apply(graphics, tmpScale); 27182 graphics.transform.apply(graphics, tmpTranslate); 27183 27184 if (bbox && isArray(bbox) && 4 == bbox.length) { 27185 var bboxWidth = x1 - x0; 27186 var bboxHeight = y1 - y0; 27187 graphics.rectangle(x0, y0, bboxWidth, bboxHeight); 27188 graphics.clip(); 27189 graphics.endPath(); 27190 } 27191 27192 graphics.executeOperatorList(operatorList); 27193 27194 this.canvas = tmpCanvas; 27195 } 27196 27197 TilingPattern.getIR = function TilingPattern_getIR(operatorList, dict, args) { 27198 var matrix = dict.get('Matrix'); 27199 var bbox = dict.get('BBox'); 27200 var xstep = dict.get('XStep'); 27201 var ystep = dict.get('YStep'); 27202 var paintType = dict.get('PaintType'); 27203 27204 return [ 27205 'TilingPattern', args, operatorList, matrix, bbox, xstep, ystep, paintType 27206 ]; 27207 }; 27208 27209 TilingPattern.prototype = { 27210 getPattern: function TilingPattern_getPattern() { 27211 var matrix = this.matrix; 27212 var curMatrix = this.curMatrix; 27213 var ctx = this.ctx; 27214 27215 if (curMatrix) 27216 ctx.setTransform.apply(ctx, curMatrix); 27217 27218 if (matrix) 27219 ctx.transform.apply(ctx, matrix); 27220 27221 var scale = this.scale; 27222 ctx.scale(1 / scale[0], 1 / scale[1]); 27223 27224 return ctx.createPattern(this.canvas, 'repeat'); 27225 } 27226 }; 27227 27228 return TilingPattern; 27229 })(); 27230 27231 27232 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 27233 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ 27234 27235 'use strict'; 27236 27237 var Stream = (function StreamClosure() { 27238 function Stream(arrayBuffer, start, length, dict) { 27239 this.bytes = new Uint8Array(arrayBuffer); 27240 this.start = start || 0; 27241 this.pos = this.start; 27242 this.end = (start + length) || this.bytes.length; 27243 this.dict = dict; 27244 } 27245 27246 // required methods for a stream. if a particular stream does not 27247 // implement these, an error should be thrown 27248 Stream.prototype = { 27249 get length() { 27250 return this.end - this.start; 27251 }, 27252 getByte: function Stream_getByte() { 27253 if (this.pos >= this.end) 27254 return null; 27255 return this.bytes[this.pos++]; 27256 }, 27257 // returns subarray of original buffer 27258 // should only be read 27259 getBytes: function Stream_getBytes(length) { 27260 var bytes = this.bytes; 27261 var pos = this.pos; 27262 var strEnd = this.end; 27263 27264 if (!length) 27265 return bytes.subarray(pos, strEnd); 27266 27267 var end = pos + length; 27268 if (end > strEnd) 27269 end = strEnd; 27270 27271 this.pos = end; 27272 return bytes.subarray(pos, end); 27273 }, 27274 lookChar: function Stream_lookChar() { 27275 if (this.pos >= this.end) 27276 return null; 27277 return String.fromCharCode(this.bytes[this.pos]); 27278 }, 27279 getChar: function Stream_getChar() { 27280 if (this.pos >= this.end) 27281 return null; 27282 return String.fromCharCode(this.bytes[this.pos++]); 27283 }, 27284 skip: function Stream_skip(n) { 27285 if (!n) 27286 n = 1; 27287 this.pos += n; 27288 }, 27289 reset: function Stream_reset() { 27290 this.pos = this.start; 27291 }, 27292 moveStart: function Stream_moveStart() { 27293 this.start = this.pos; 27294 }, 27295 makeSubStream: function Stream_makeSubStream(start, length, dict) { 27296 return new Stream(this.bytes.buffer, start, length, dict); 27297 }, 27298 isStream: true 27299 }; 27300 27301 return Stream; 27302 })(); 27303 27304 var StringStream = (function StringStreamClosure() { 27305 function StringStream(str) { 27306 var length = str.length; 27307 var bytes = new Uint8Array(length); 27308 for (var n = 0; n < length; ++n) 27309 bytes[n] = str.charCodeAt(n); 27310 Stream.call(this, bytes); 27311 } 27312 27313 StringStream.prototype = Stream.prototype; 27314 27315 return StringStream; 27316 })(); 27317 27318 // super class for the decoding streams 27319 var DecodeStream = (function DecodeStreamClosure() { 27320 function DecodeStream() { 27321 this.pos = 0; 27322 this.bufferLength = 0; 27323 this.eof = false; 27324 this.buffer = null; 27325 } 27326 27327 DecodeStream.prototype = { 27328 ensureBuffer: function DecodeStream_ensureBuffer(requested) { 27329 var buffer = this.buffer; 27330 var current = buffer ? buffer.byteLength : 0; 27331 if (requested < current) 27332 return buffer; 27333 var size = 512; 27334 while (size < requested) 27335 size <<= 1; 27336 var buffer2 = new Uint8Array(size); 27337 for (var i = 0; i < current; ++i) 27338 buffer2[i] = buffer[i]; 27339 return (this.buffer = buffer2); 27340 }, 27341 getByte: function DecodeStream_getByte() { 27342 var pos = this.pos; 27343 while (this.bufferLength <= pos) { 27344 if (this.eof) 27345 return null; 27346 this.readBlock(); 27347 } 27348 return this.buffer[this.pos++]; 27349 }, 27350 getBytes: function DecodeStream_getBytes(length) { 27351 var end, pos = this.pos; 27352 27353 if (length) { 27354 this.ensureBuffer(pos + length); 27355 end = pos + length; 27356 27357 while (!this.eof && this.bufferLength < end) 27358 this.readBlock(); 27359 27360 var bufEnd = this.bufferLength; 27361 if (end > bufEnd) 27362 end = bufEnd; 27363 } else { 27364 while (!this.eof) 27365 this.readBlock(); 27366 27367 end = this.bufferLength; 27368 27369 // checking if bufferLength is still 0 then 27370 // the buffer has to be initialized 27371 if (!end) 27372 this.buffer = new Uint8Array(0); 27373 } 27374 27375 this.pos = end; 27376 return this.buffer.subarray(pos, end); 27377 }, 27378 lookChar: function DecodeStream_lookChar() { 27379 var pos = this.pos; 27380 while (this.bufferLength <= pos) { 27381 if (this.eof) 27382 return null; 27383 this.readBlock(); 27384 } 27385 return String.fromCharCode(this.buffer[this.pos]); 27386 }, 27387 getChar: function DecodeStream_getChar() { 27388 var pos = this.pos; 27389 while (this.bufferLength <= pos) { 27390 if (this.eof) 27391 return null; 27392 this.readBlock(); 27393 } 27394 return String.fromCharCode(this.buffer[this.pos++]); 27395 }, 27396 makeSubStream: function DecodeStream_makeSubStream(start, length, dict) { 27397 var end = start + length; 27398 while (this.bufferLength <= end && !this.eof) 27399 this.readBlock(); 27400 return new Stream(this.buffer, start, length, dict); 27401 }, 27402 skip: function DecodeStream_skip(n) { 27403 if (!n) 27404 n = 1; 27405 this.pos += n; 27406 }, 27407 reset: function DecodeStream_reset() { 27408 this.pos = 0; 27409 } 27410 }; 27411 27412 return DecodeStream; 27413 })(); 27414 27415 var FakeStream = (function FakeStreamClosure() { 27416 function FakeStream(stream) { 27417 this.dict = stream.dict; 27418 DecodeStream.call(this); 27419 } 27420 27421 FakeStream.prototype = Object.create(DecodeStream.prototype); 27422 FakeStream.prototype.readBlock = function FakeStream_readBlock() { 27423 var bufferLength = this.bufferLength; 27424 bufferLength += 1024; 27425 var buffer = this.ensureBuffer(bufferLength); 27426 this.bufferLength = bufferLength; 27427 }; 27428 27429 FakeStream.prototype.getBytes = function FakeStream_getBytes(length) { 27430 var end, pos = this.pos; 27431 27432 if (length) { 27433 this.ensureBuffer(pos + length); 27434 end = pos + length; 27435 27436 while (!this.eof && this.bufferLength < end) 27437 this.readBlock(); 27438 27439 var bufEnd = this.bufferLength; 27440 if (end > bufEnd) 27441 end = bufEnd; 27442 } else { 27443 this.eof = true; 27444 end = this.bufferLength; 27445 } 27446 27447 this.pos = end; 27448 return this.buffer.subarray(pos, end); 27449 }; 27450 27451 return FakeStream; 27452 })(); 27453 27454 var StreamsSequenceStream = (function StreamsSequenceStreamClosure() { 27455 function StreamsSequenceStream(streams) { 27456 this.streams = streams; 27457 DecodeStream.call(this); 27458 } 27459 27460 StreamsSequenceStream.prototype = Object.create(DecodeStream.prototype); 27461 27462 StreamsSequenceStream.prototype.readBlock = 27463 function streamSequenceStreamReadBlock() { 27464 27465 var streams = this.streams; 27466 if (streams.length == 0) { 27467 this.eof = true; 27468 return; 27469 } 27470 var stream = streams.shift(); 27471 var chunk = stream.getBytes(); 27472 var bufferLength = this.bufferLength; 27473 var newLength = bufferLength + chunk.length; 27474 var buffer = this.ensureBuffer(newLength); 27475 buffer.set(chunk, bufferLength); 27476 this.bufferLength = newLength; 27477 }; 27478 27479 return StreamsSequenceStream; 27480 })(); 27481 27482 var FlateStream = (function FlateStreamClosure() { 27483 var codeLenCodeMap = new Uint32Array([ 27484 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 27485 ]); 27486 27487 var lengthDecode = new Uint32Array([ 27488 0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a, 27489 0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f, 27490 0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073, 27491 0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102 27492 ]); 27493 27494 var distDecode = new Uint32Array([ 27495 0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d, 27496 0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1, 27497 0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01, 27498 0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001 27499 ]); 27500 27501 var fixedLitCodeTab = [new Uint32Array([ 27502 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0, 27503 0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0, 27504 0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0, 27505 0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0, 27506 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8, 27507 0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8, 27508 0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8, 27509 0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8, 27510 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4, 27511 0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4, 27512 0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4, 27513 0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4, 27514 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc, 27515 0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec, 27516 0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc, 27517 0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc, 27518 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2, 27519 0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2, 27520 0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2, 27521 0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2, 27522 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca, 27523 0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea, 27524 0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da, 27525 0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa, 27526 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6, 27527 0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6, 27528 0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6, 27529 0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6, 27530 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce, 27531 0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee, 27532 0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de, 27533 0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe, 27534 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1, 27535 0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1, 27536 0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1, 27537 0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1, 27538 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9, 27539 0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9, 27540 0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9, 27541 0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9, 27542 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5, 27543 0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5, 27544 0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5, 27545 0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5, 27546 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd, 27547 0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed, 27548 0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd, 27549 0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd, 27550 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3, 27551 0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3, 27552 0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3, 27553 0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3, 27554 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb, 27555 0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb, 27556 0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db, 27557 0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb, 27558 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7, 27559 0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7, 27560 0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7, 27561 0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7, 27562 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf, 27563 0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef, 27564 0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df, 27565 0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff 27566 ]), 9]; 27567 27568 var fixedDistCodeTab = [new Uint32Array([ 27569 0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c, 27570 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000, 27571 0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d, 27572 0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000 27573 ]), 5]; 27574 27575 function FlateStream(stream) { 27576 var bytes = stream.getBytes(); 27577 var bytesPos = 0; 27578 27579 this.dict = stream.dict; 27580 var cmf = bytes[bytesPos++]; 27581 var flg = bytes[bytesPos++]; 27582 if (cmf == -1 || flg == -1) 27583 error('Invalid header in flate stream: ' + cmf + ', ' + flg); 27584 if ((cmf & 0x0f) != 0x08) 27585 error('Unknown compression method in flate stream: ' + cmf + ', ' + flg); 27586 if ((((cmf << 8) + flg) % 31) != 0) 27587 error('Bad FCHECK in flate stream: ' + cmf + ', ' + flg); 27588 if (flg & 0x20) 27589 error('FDICT bit set in flate stream: ' + cmf + ', ' + flg); 27590 27591 this.bytes = bytes; 27592 this.bytesPos = bytesPos; 27593 27594 this.codeSize = 0; 27595 this.codeBuf = 0; 27596 27597 DecodeStream.call(this); 27598 } 27599 27600 FlateStream.prototype = Object.create(DecodeStream.prototype); 27601 27602 FlateStream.prototype.getBits = function FlateStream_getBits(bits) { 27603 var codeSize = this.codeSize; 27604 var codeBuf = this.codeBuf; 27605 var bytes = this.bytes; 27606 var bytesPos = this.bytesPos; 27607 27608 var b; 27609 while (codeSize < bits) { 27610 if (typeof (b = bytes[bytesPos++]) == 'undefined') 27611 error('Bad encoding in flate stream'); 27612 codeBuf |= b << codeSize; 27613 codeSize += 8; 27614 } 27615 b = codeBuf & ((1 << bits) - 1); 27616 this.codeBuf = codeBuf >> bits; 27617 this.codeSize = codeSize -= bits; 27618 this.bytesPos = bytesPos; 27619 return b; 27620 }; 27621 27622 FlateStream.prototype.getCode = function FlateStream_getCode(table) { 27623 var codes = table[0]; 27624 var maxLen = table[1]; 27625 var codeSize = this.codeSize; 27626 var codeBuf = this.codeBuf; 27627 var bytes = this.bytes; 27628 var bytesPos = this.bytesPos; 27629 27630 while (codeSize < maxLen) { 27631 var b; 27632 if (typeof (b = bytes[bytesPos++]) == 'undefined') 27633 error('Bad encoding in flate stream'); 27634 codeBuf |= (b << codeSize); 27635 codeSize += 8; 27636 } 27637 var code = codes[codeBuf & ((1 << maxLen) - 1)]; 27638 var codeLen = code >> 16; 27639 var codeVal = code & 0xffff; 27640 if (codeSize == 0 || codeSize < codeLen || codeLen == 0) 27641 error('Bad encoding in flate stream'); 27642 this.codeBuf = (codeBuf >> codeLen); 27643 this.codeSize = (codeSize - codeLen); 27644 this.bytesPos = bytesPos; 27645 return codeVal; 27646 }; 27647 27648 FlateStream.prototype.generateHuffmanTable = 27649 function flateStreamGenerateHuffmanTable(lengths) { 27650 var n = lengths.length; 27651 27652 // find max code length 27653 var maxLen = 0; 27654 for (var i = 0; i < n; ++i) { 27655 if (lengths[i] > maxLen) 27656 maxLen = lengths[i]; 27657 } 27658 27659 // build the table 27660 var size = 1 << maxLen; 27661 var codes = new Uint32Array(size); 27662 for (var len = 1, code = 0, skip = 2; 27663 len <= maxLen; 27664 ++len, code <<= 1, skip <<= 1) { 27665 for (var val = 0; val < n; ++val) { 27666 if (lengths[val] == len) { 27667 // bit-reverse the code 27668 var code2 = 0; 27669 var t = code; 27670 for (var i = 0; i < len; ++i) { 27671 code2 = (code2 << 1) | (t & 1); 27672 t >>= 1; 27673 } 27674 27675 // fill the table entries 27676 for (var i = code2; i < size; i += skip) 27677 codes[i] = (len << 16) | val; 27678 27679 ++code; 27680 } 27681 } 27682 } 27683 27684 return [codes, maxLen]; 27685 }; 27686 27687 FlateStream.prototype.readBlock = function FlateStream_readBlock() { 27688 // read block header 27689 var hdr = this.getBits(3); 27690 if (hdr & 1) 27691 this.eof = true; 27692 hdr >>= 1; 27693 27694 if (hdr == 0) { // uncompressed block 27695 var bytes = this.bytes; 27696 var bytesPos = this.bytesPos; 27697 var b; 27698 27699 if (typeof (b = bytes[bytesPos++]) == 'undefined') 27700 error('Bad block header in flate stream'); 27701 var blockLen = b; 27702 if (typeof (b = bytes[bytesPos++]) == 'undefined') 27703 error('Bad block header in flate stream'); 27704 blockLen |= (b << 8); 27705 if (typeof (b = bytes[bytesPos++]) == 'undefined') 27706 error('Bad block header in flate stream'); 27707 var check = b; 27708 if (typeof (b = bytes[bytesPos++]) == 'undefined') 27709 error('Bad block header in flate stream'); 27710 check |= (b << 8); 27711 if (check != (~blockLen & 0xffff)) 27712 error('Bad uncompressed block length in flate stream'); 27713 27714 this.codeBuf = 0; 27715 this.codeSize = 0; 27716 27717 var bufferLength = this.bufferLength; 27718 var buffer = this.ensureBuffer(bufferLength + blockLen); 27719 var end = bufferLength + blockLen; 27720 this.bufferLength = end; 27721 for (var n = bufferLength; n < end; ++n) { 27722 if (typeof (b = bytes[bytesPos++]) == 'undefined') { 27723 this.eof = true; 27724 break; 27725 } 27726 buffer[n] = b; 27727 } 27728 this.bytesPos = bytesPos; 27729 return; 27730 } 27731 27732 var litCodeTable; 27733 var distCodeTable; 27734 if (hdr == 1) { // compressed block, fixed codes 27735 litCodeTable = fixedLitCodeTab; 27736 distCodeTable = fixedDistCodeTab; 27737 } else if (hdr == 2) { // compressed block, dynamic codes 27738 var numLitCodes = this.getBits(5) + 257; 27739 var numDistCodes = this.getBits(5) + 1; 27740 var numCodeLenCodes = this.getBits(4) + 4; 27741 27742 // build the code lengths code table 27743 var codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length); 27744 27745 for (var i = 0; i < numCodeLenCodes; ++i) 27746 codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3); 27747 var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths); 27748 27749 // build the literal and distance code tables 27750 var len = 0; 27751 var i = 0; 27752 var codes = numLitCodes + numDistCodes; 27753 var codeLengths = new Uint8Array(codes); 27754 while (i < codes) { 27755 var code = this.getCode(codeLenCodeTab); 27756 if (code == 16) { 27757 var bitsLength = 2, bitsOffset = 3, what = len; 27758 } else if (code == 17) { 27759 var bitsLength = 3, bitsOffset = 3, what = (len = 0); 27760 } else if (code == 18) { 27761 var bitsLength = 7, bitsOffset = 11, what = (len = 0); 27762 } else { 27763 codeLengths[i++] = len = code; 27764 continue; 27765 } 27766 27767 var repeatLength = this.getBits(bitsLength) + bitsOffset; 27768 while (repeatLength-- > 0) 27769 codeLengths[i++] = what; 27770 } 27771 27772 litCodeTable = 27773 this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes)); 27774 distCodeTable = 27775 this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes)); 27776 } else { 27777 error('Unknown block type in flate stream'); 27778 } 27779 27780 var buffer = this.buffer; 27781 var limit = buffer ? buffer.length : 0; 27782 var pos = this.bufferLength; 27783 while (true) { 27784 var code1 = this.getCode(litCodeTable); 27785 if (code1 < 256) { 27786 if (pos + 1 >= limit) { 27787 buffer = this.ensureBuffer(pos + 1); 27788 limit = buffer.length; 27789 } 27790 buffer[pos++] = code1; 27791 continue; 27792 } 27793 if (code1 == 256) { 27794 this.bufferLength = pos; 27795 return; 27796 } 27797 code1 -= 257; 27798 code1 = lengthDecode[code1]; 27799 var code2 = code1 >> 16; 27800 if (code2 > 0) 27801 code2 = this.getBits(code2); 27802 var len = (code1 & 0xffff) + code2; 27803 code1 = this.getCode(distCodeTable); 27804 code1 = distDecode[code1]; 27805 code2 = code1 >> 16; 27806 if (code2 > 0) 27807 code2 = this.getBits(code2); 27808 var dist = (code1 & 0xffff) + code2; 27809 if (pos + len >= limit) { 27810 buffer = this.ensureBuffer(pos + len); 27811 limit = buffer.length; 27812 } 27813 for (var k = 0; k < len; ++k, ++pos) 27814 buffer[pos] = buffer[pos - dist]; 27815 } 27816 }; 27817 27818 return FlateStream; 27819 })(); 27820 27821 var PredictorStream = (function PredictorStreamClosure() { 27822 function PredictorStream(stream, params) { 27823 var predictor = this.predictor = params.get('Predictor') || 1; 27824 27825 if (predictor <= 1) 27826 return stream; // no prediction 27827 if (predictor !== 2 && (predictor < 10 || predictor > 15)) 27828 error('Unsupported predictor: ' + predictor); 27829 27830 if (predictor === 2) 27831 this.readBlock = this.readBlockTiff; 27832 else 27833 this.readBlock = this.readBlockPng; 27834 27835 this.stream = stream; 27836 this.dict = stream.dict; 27837 27838 var colors = this.colors = params.get('Colors') || 1; 27839 var bits = this.bits = params.get('BitsPerComponent') || 8; 27840 var columns = this.columns = params.get('Columns') || 1; 27841 27842 this.pixBytes = (colors * bits + 7) >> 3; 27843 this.rowBytes = (columns * colors * bits + 7) >> 3; 27844 27845 DecodeStream.call(this); 27846 return this; 27847 } 27848 27849 PredictorStream.prototype = Object.create(DecodeStream.prototype); 27850 27851 PredictorStream.prototype.readBlockTiff = 27852 function predictorStreamReadBlockTiff() { 27853 var rowBytes = this.rowBytes; 27854 27855 var bufferLength = this.bufferLength; 27856 var buffer = this.ensureBuffer(bufferLength + rowBytes); 27857 27858 var bits = this.bits; 27859 var colors = this.colors; 27860 27861 var rawBytes = this.stream.getBytes(rowBytes); 27862 27863 var inbuf = 0, outbuf = 0; 27864 var inbits = 0, outbits = 0; 27865 var pos = bufferLength; 27866 27867 if (bits === 1) { 27868 for (var i = 0; i < rowBytes; ++i) { 27869 var c = rawBytes[i]; 27870 inbuf = (inbuf << 8) | c; 27871 // bitwise addition is exclusive or 27872 // first shift inbuf and then add 27873 buffer[pos++] = (c ^ (inbuf >> colors)) & 0xFF; 27874 // truncate inbuf (assumes colors < 16) 27875 inbuf &= 0xFFFF; 27876 } 27877 } else if (bits === 8) { 27878 for (var i = 0; i < colors; ++i) 27879 buffer[pos++] = rawBytes[i]; 27880 for (; i < rowBytes; ++i) { 27881 buffer[pos] = buffer[pos - colors] + rawBytes[i]; 27882 pos++; 27883 } 27884 } else { 27885 var compArray = new Uint8Array(colors + 1); 27886 var bitMask = (1 << bits) - 1; 27887 var j = 0, k = bufferLength; 27888 var columns = this.columns; 27889 for (var i = 0; i < columns; ++i) { 27890 for (var kk = 0; kk < colors; ++kk) { 27891 if (inbits < bits) { 27892 inbuf = (inbuf << 8) | (rawBytes[j++] & 0xFF); 27893 inbits += 8; 27894 } 27895 compArray[kk] = (compArray[kk] + 27896 (inbuf >> (inbits - bits))) & bitMask; 27897 inbits -= bits; 27898 outbuf = (outbuf << bits) | compArray[kk]; 27899 outbits += bits; 27900 if (outbits >= 8) { 27901 buffer[k++] = (outbuf >> (outbits - 8)) & 0xFF; 27902 outbits -= 8; 27903 } 27904 } 27905 } 27906 if (outbits > 0) { 27907 buffer[k++] = (outbuf << (8 - outbits)) + 27908 (inbuf & ((1 << (8 - outbits)) - 1)); 27909 } 27910 } 27911 this.bufferLength += rowBytes; 27912 }; 27913 27914 PredictorStream.prototype.readBlockPng = 27915 function predictorStreamReadBlockPng() { 27916 27917 var rowBytes = this.rowBytes; 27918 var pixBytes = this.pixBytes; 27919 27920 var predictor = this.stream.getByte(); 27921 var rawBytes = this.stream.getBytes(rowBytes); 27922 27923 var bufferLength = this.bufferLength; 27924 var buffer = this.ensureBuffer(bufferLength + rowBytes); 27925 27926 var prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength); 27927 if (prevRow.length == 0) 27928 prevRow = new Uint8Array(rowBytes); 27929 27930 var j = bufferLength; 27931 switch (predictor) { 27932 case 0: 27933 for (var i = 0; i < rowBytes; ++i) 27934 buffer[j++] = rawBytes[i]; 27935 break; 27936 case 1: 27937 for (var i = 0; i < pixBytes; ++i) 27938 buffer[j++] = rawBytes[i]; 27939 for (; i < rowBytes; ++i) { 27940 buffer[j] = (buffer[j - pixBytes] + rawBytes[i]) & 0xFF; 27941 j++; 27942 } 27943 break; 27944 case 2: 27945 for (var i = 0; i < rowBytes; ++i) 27946 buffer[j++] = (prevRow[i] + rawBytes[i]) & 0xFF; 27947 break; 27948 case 3: 27949 for (var i = 0; i < pixBytes; ++i) 27950 buffer[j++] = (prevRow[i] >> 1) + rawBytes[i]; 27951 for (; i < rowBytes; ++i) { 27952 buffer[j] = (((prevRow[i] + buffer[j - pixBytes]) >> 1) + 27953 rawBytes[i]) & 0xFF; 27954 j++; 27955 } 27956 break; 27957 case 4: 27958 // we need to save the up left pixels values. the simplest way 27959 // is to create a new buffer 27960 for (var i = 0; i < pixBytes; ++i) { 27961 var up = prevRow[i]; 27962 var c = rawBytes[i]; 27963 buffer[j++] = up + c; 27964 } 27965 for (; i < rowBytes; ++i) { 27966 var up = prevRow[i]; 27967 var upLeft = prevRow[i - pixBytes]; 27968 var left = buffer[j - pixBytes]; 27969 var p = left + up - upLeft; 27970 27971 var pa = p - left; 27972 if (pa < 0) 27973 pa = -pa; 27974 var pb = p - up; 27975 if (pb < 0) 27976 pb = -pb; 27977 var pc = p - upLeft; 27978 if (pc < 0) 27979 pc = -pc; 27980 27981 var c = rawBytes[i]; 27982 if (pa <= pb && pa <= pc) 27983 buffer[j++] = left + c; 27984 else if (pb <= pc) 27985 buffer[j++] = up + c; 27986 else 27987 buffer[j++] = upLeft + c; 27988 } 27989 break; 27990 default: 27991 error('Unsupported predictor: ' + predictor); 27992 } 27993 this.bufferLength += rowBytes; 27994 }; 27995 27996 return PredictorStream; 27997 })(); 27998 27999 /** 28000 * Depending on the type of JPEG a JpegStream is handled in different ways. For 28001 * JPEG's that are supported natively such as DeviceGray and DeviceRGB the image 28002 * data is stored and then loaded by the browser. For unsupported JPEG's we use 28003 * a library to decode these images and the stream behaves like all the other 28004 * DecodeStreams. 28005 */ 28006 var JpegStream = (function JpegStreamClosure() { 28007 function isAdobeImage(bytes) { 28008 var maxBytesScanned = Math.max(bytes.length - 16, 1024); 28009 // Looking for APP14, 'Adobe' 28010 for (var i = 0; i < maxBytesScanned; ++i) { 28011 if (bytes[i] == 0xFF && bytes[i + 1] == 0xEE && 28012 bytes[i + 2] == 0x00 && bytes[i + 3] == 0x0E && 28013 bytes[i + 4] == 0x41 && bytes[i + 5] == 0x64 && 28014 bytes[i + 6] == 0x6F && bytes[i + 7] == 0x62 && 28015 bytes[i + 8] == 0x65 && bytes[i + 9] == 0x00) 28016 return true; 28017 // scanning until frame tag 28018 if (bytes[i] == 0xFF && bytes[i + 1] == 0xC0) 28019 break; 28020 } 28021 return false; 28022 } 28023 28024 function fixAdobeImage(bytes) { 28025 // Inserting 'EMBED' marker after JPEG signature 28026 var embedMarker = new Uint8Array([0xFF, 0xEC, 0, 8, 0x45, 0x4D, 0x42, 0x45, 28027 0x44, 0]); 28028 var newBytes = new Uint8Array(bytes.length + embedMarker.length); 28029 newBytes.set(bytes, embedMarker.length); 28030 // copy JPEG header 28031 newBytes[0] = bytes[0]; 28032 newBytes[1] = bytes[1]; 28033 newBytes.set(embedMarker, 2); 28034 return newBytes; 28035 } 28036 28037 function JpegStream(bytes, dict, xref) { 28038 // TODO: per poppler, some images may have 'junk' before that 28039 // need to be removed 28040 this.dict = dict; 28041 28042 this.isAdobeImage = false; 28043 this.colorTransform = dict.get('ColorTransform') || -1; 28044 28045 if (isAdobeImage(bytes)) { 28046 this.isAdobeImage = true; 28047 bytes = fixAdobeImage(bytes); 28048 } 28049 28050 this.bytes = bytes; 28051 28052 DecodeStream.call(this); 28053 } 28054 28055 JpegStream.prototype = Object.create(DecodeStream.prototype); 28056 28057 JpegStream.prototype.ensureBuffer = function JpegStream_ensureBuffer(req) { 28058 if (this.bufferLength) 28059 return; 28060 try { 28061 var jpegImage = new JpegImage(); 28062 if (this.colorTransform != -1) 28063 jpegImage.colorTransform = this.colorTransform; 28064 jpegImage.parse(this.bytes); 28065 var width = jpegImage.width; 28066 var height = jpegImage.height; 28067 var data = jpegImage.getData(width, height); 28068 this.buffer = data; 28069 this.bufferLength = data.length; 28070 } catch (e) { 28071 error('JPEG error: ' + e); 28072 } 28073 }; 28074 JpegStream.prototype.getIR = function JpegStream_getIR() { 28075 return bytesToString(this.bytes); 28076 }; 28077 JpegStream.prototype.getChar = function JpegStream_getChar() { 28078 error('internal error: getChar is not valid on JpegStream'); 28079 }; 28080 /** 28081 * Checks if the image can be decoded and displayed by the browser without any 28082 * further processing such as color space conversions. 28083 */ 28084 JpegStream.prototype.isNativelySupported = 28085 function JpegStream_isNativelySupported(xref, res) { 28086 var cs = ColorSpace.parse(this.dict.get('ColorSpace'), xref, res); 28087 // when bug 674619 lands, let's check if browser can do 28088 // normal cmyk and then we won't need to decode in JS 28089 if (cs.name === 'DeviceGray' || cs.name === 'DeviceRGB') 28090 return true; 28091 if (cs.name === 'DeviceCMYK' && !this.isAdobeImage && 28092 this.colorTransform < 1) 28093 return true; 28094 return false; 28095 }; 28096 /** 28097 * Checks if the image can be decoded by the browser. 28098 */ 28099 JpegStream.prototype.isNativelyDecodable = 28100 function JpegStream_isNativelyDecodable(xref, res) { 28101 var cs = ColorSpace.parse(this.dict.get('ColorSpace'), xref, res); 28102 var numComps = cs.numComps; 28103 if (numComps == 1 || numComps == 3) 28104 return true; 28105 28106 return false; 28107 }; 28108 28109 return JpegStream; 28110 })(); 28111 28112 /** 28113 * For JPEG 2000's we use a library to decode these images and 28114 * the stream behaves like all the other DecodeStreams. 28115 */ 28116 var JpxStream = (function JpxStreamClosure() { 28117 function JpxStream(bytes, dict) { 28118 this.dict = dict; 28119 this.bytes = bytes; 28120 28121 DecodeStream.call(this); 28122 } 28123 28124 JpxStream.prototype = Object.create(DecodeStream.prototype); 28125 28126 JpxStream.prototype.ensureBuffer = function JpxStream_ensureBuffer(req) { 28127 if (this.bufferLength) 28128 return; 28129 28130 var jpxImage = new JpxImage(); 28131 jpxImage.parse(this.bytes); 28132 28133 var width = jpxImage.width; 28134 var height = jpxImage.height; 28135 var componentsCount = jpxImage.componentsCount; 28136 if (componentsCount != 1 && componentsCount != 3 && componentsCount != 4) 28137 error('JPX with ' + componentsCount + ' components is not supported'); 28138 28139 var data = new Uint8Array(width * height * componentsCount); 28140 28141 for (var k = 0, kk = jpxImage.tiles.length; k < kk; k++) { 28142 var tileCompoments = jpxImage.tiles[k]; 28143 var tileWidth = tileCompoments[0].width; 28144 var tileHeight = tileCompoments[0].height; 28145 var tileLeft = tileCompoments[0].left; 28146 var tileTop = tileCompoments[0].top; 28147 28148 var dataPosition, sourcePosition, data0, data1, data2, data3, rowFeed; 28149 switch (componentsCount) { 28150 case 1: 28151 data0 = tileCompoments[0].items; 28152 28153 dataPosition = width * tileTop + tileLeft; 28154 rowFeed = width - tileWidth; 28155 sourcePosition = 0; 28156 for (var j = 0; j < tileHeight; j++) { 28157 for (var i = 0; i < tileWidth; i++) 28158 data[dataPosition++] = data0[sourcePosition++]; 28159 dataPosition += rowFeed; 28160 } 28161 break; 28162 case 3: 28163 data0 = tileCompoments[0].items; 28164 data1 = tileCompoments[1].items; 28165 data2 = tileCompoments[2].items; 28166 28167 dataPosition = (width * tileTop + tileLeft) * 3; 28168 rowFeed = (width - tileWidth) * 3; 28169 sourcePosition = 0; 28170 for (var j = 0; j < tileHeight; j++) { 28171 for (var i = 0; i < tileWidth; i++) { 28172 data[dataPosition++] = data0[sourcePosition]; 28173 data[dataPosition++] = data1[sourcePosition]; 28174 data[dataPosition++] = data2[sourcePosition]; 28175 sourcePosition++; 28176 } 28177 dataPosition += rowFeed; 28178 } 28179 break; 28180 case 4: 28181 data0 = tileCompoments[0].items; 28182 data1 = tileCompoments[1].items; 28183 data2 = tileCompoments[2].items; 28184 data3 = tileCompoments[3].items; 28185 28186 dataPosition = (width * tileTop + tileLeft) * 4; 28187 rowFeed = (width - tileWidth) * 4; 28188 sourcePosition = 0; 28189 for (var j = 0; j < tileHeight; j++) { 28190 for (var i = 0; i < tileWidth; i++) { 28191 data[dataPosition++] = data0[sourcePosition]; 28192 data[dataPosition++] = data1[sourcePosition]; 28193 data[dataPosition++] = data2[sourcePosition]; 28194 data[dataPosition++] = data3[sourcePosition]; 28195 sourcePosition++; 28196 } 28197 dataPosition += rowFeed; 28198 } 28199 break; 28200 } 28201 } 28202 28203 this.buffer = data; 28204 this.bufferLength = data.length; 28205 }; 28206 JpxStream.prototype.getChar = function JpxStream_getChar() { 28207 error('internal error: getChar is not valid on JpxStream'); 28208 }; 28209 28210 return JpxStream; 28211 })(); 28212 28213 var DecryptStream = (function DecryptStreamClosure() { 28214 function DecryptStream(str, decrypt) { 28215 this.str = str; 28216 this.dict = str.dict; 28217 this.decrypt = decrypt; 28218 28219 DecodeStream.call(this); 28220 } 28221 28222 var chunkSize = 512; 28223 28224 DecryptStream.prototype = Object.create(DecodeStream.prototype); 28225 28226 DecryptStream.prototype.readBlock = function DecryptStream_readBlock() { 28227 var chunk = this.str.getBytes(chunkSize); 28228 if (!chunk || chunk.length == 0) { 28229 this.eof = true; 28230 return; 28231 } 28232 var decrypt = this.decrypt; 28233 chunk = decrypt(chunk); 28234 28235 var bufferLength = this.bufferLength; 28236 var i, n = chunk.length; 28237 var buffer = this.ensureBuffer(bufferLength + n); 28238 for (i = 0; i < n; i++) 28239 buffer[bufferLength++] = chunk[i]; 28240 this.bufferLength = bufferLength; 28241 }; 28242 28243 return DecryptStream; 28244 })(); 28245 28246 var Ascii85Stream = (function Ascii85StreamClosure() { 28247 function Ascii85Stream(str) { 28248 this.str = str; 28249 this.dict = str.dict; 28250 this.input = new Uint8Array(5); 28251 28252 DecodeStream.call(this); 28253 } 28254 28255 Ascii85Stream.prototype = Object.create(DecodeStream.prototype); 28256 28257 Ascii85Stream.prototype.readBlock = function Ascii85Stream_readBlock() { 28258 var tildaCode = '~'.charCodeAt(0); 28259 var zCode = 'z'.charCodeAt(0); 28260 var str = this.str; 28261 28262 var c = str.getByte(); 28263 while (Lexer.isSpace(String.fromCharCode(c))) 28264 c = str.getByte(); 28265 28266 if (!c || c === tildaCode) { 28267 this.eof = true; 28268 return; 28269 } 28270 28271 var bufferLength = this.bufferLength, buffer; 28272 28273 // special code for z 28274 if (c == zCode) { 28275 buffer = this.ensureBuffer(bufferLength + 4); 28276 for (var i = 0; i < 4; ++i) 28277 buffer[bufferLength + i] = 0; 28278 this.bufferLength += 4; 28279 } else { 28280 var input = this.input; 28281 input[0] = c; 28282 for (var i = 1; i < 5; ++i) { 28283 c = str.getByte(); 28284 while (Lexer.isSpace(String.fromCharCode(c))) 28285 c = str.getByte(); 28286 28287 input[i] = c; 28288 28289 if (!c || c == tildaCode) 28290 break; 28291 } 28292 buffer = this.ensureBuffer(bufferLength + i - 1); 28293 this.bufferLength += i - 1; 28294 28295 // partial ending; 28296 if (i < 5) { 28297 for (; i < 5; ++i) 28298 input[i] = 0x21 + 84; 28299 this.eof = true; 28300 } 28301 var t = 0; 28302 for (var i = 0; i < 5; ++i) 28303 t = t * 85 + (input[i] - 0x21); 28304 28305 for (var i = 3; i >= 0; --i) { 28306 buffer[bufferLength + i] = t & 0xFF; 28307 t >>= 8; 28308 } 28309 } 28310 }; 28311 28312 return Ascii85Stream; 28313 })(); 28314 28315 var AsciiHexStream = (function AsciiHexStreamClosure() { 28316 function AsciiHexStream(str) { 28317 this.str = str; 28318 this.dict = str.dict; 28319 28320 DecodeStream.call(this); 28321 } 28322 28323 var hexvalueMap = { 28324 9: -1, // \t 28325 32: -1, // space 28326 48: 0, 28327 49: 1, 28328 50: 2, 28329 51: 3, 28330 52: 4, 28331 53: 5, 28332 54: 6, 28333 55: 7, 28334 56: 8, 28335 57: 9, 28336 65: 10, 28337 66: 11, 28338 67: 12, 28339 68: 13, 28340 69: 14, 28341 70: 15, 28342 97: 10, 28343 98: 11, 28344 99: 12, 28345 100: 13, 28346 101: 14, 28347 102: 15 28348 }; 28349 28350 AsciiHexStream.prototype = Object.create(DecodeStream.prototype); 28351 28352 AsciiHexStream.prototype.readBlock = function AsciiHexStream_readBlock() { 28353 var gtCode = '>'.charCodeAt(0), bytes = this.str.getBytes(), c, n, 28354 decodeLength, buffer, bufferLength, i, length; 28355 28356 decodeLength = (bytes.length + 1) >> 1; 28357 buffer = this.ensureBuffer(this.bufferLength + decodeLength); 28358 bufferLength = this.bufferLength; 28359 28360 for (i = 0, length = bytes.length; i < length; i++) { 28361 c = hexvalueMap[bytes[i]]; 28362 while (c == -1 && (i + 1) < length) { 28363 c = hexvalueMap[bytes[++i]]; 28364 } 28365 28366 if ((i + 1) < length && (bytes[i + 1] !== gtCode)) { 28367 n = hexvalueMap[bytes[++i]]; 28368 buffer[bufferLength++] = c * 16 + n; 28369 } else { 28370 // EOD marker at an odd number, behave as if a 0 followed the last 28371 // digit. 28372 if (bytes[i] !== gtCode) { 28373 buffer[bufferLength++] = c * 16; 28374 } 28375 } 28376 } 28377 28378 this.bufferLength = bufferLength; 28379 this.eof = true; 28380 }; 28381 28382 return AsciiHexStream; 28383 })(); 28384 28385 var RunLengthStream = (function RunLengthStreamClosure() { 28386 function RunLengthStream(str) { 28387 this.str = str; 28388 this.dict = str.dict; 28389 28390 DecodeStream.call(this); 28391 } 28392 28393 RunLengthStream.prototype = Object.create(DecodeStream.prototype); 28394 28395 RunLengthStream.prototype.readBlock = function RunLengthStream_readBlock() { 28396 // The repeatHeader has following format. The first byte defines type of run 28397 // and amount of bytes to repeat/copy: n = 0 through 127 - copy next n bytes 28398 // (in addition to the second byte from the header), n = 129 through 255 - 28399 // duplicate the second byte from the header (257 - n) times, n = 128 - end. 28400 var repeatHeader = this.str.getBytes(2); 28401 if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] == 128) { 28402 this.eof = true; 28403 return; 28404 } 28405 28406 var bufferLength = this.bufferLength; 28407 var n = repeatHeader[0]; 28408 if (n < 128) { 28409 // copy n bytes 28410 var buffer = this.ensureBuffer(bufferLength + n + 1); 28411 buffer[bufferLength++] = repeatHeader[1]; 28412 if (n > 0) { 28413 var source = this.str.getBytes(n); 28414 buffer.set(source, bufferLength); 28415 bufferLength += n; 28416 } 28417 } else { 28418 n = 257 - n; 28419 var b = repeatHeader[1]; 28420 var buffer = this.ensureBuffer(bufferLength + n + 1); 28421 for (var i = 0; i < n; i++) 28422 buffer[bufferLength++] = b; 28423 } 28424 this.bufferLength = bufferLength; 28425 }; 28426 28427 return RunLengthStream; 28428 })(); 28429 28430 var CCITTFaxStream = (function CCITTFaxStreamClosure() { 28431 28432 var ccittEOL = -2; 28433 var twoDimPass = 0; 28434 var twoDimHoriz = 1; 28435 var twoDimVert0 = 2; 28436 var twoDimVertR1 = 3; 28437 var twoDimVertL1 = 4; 28438 var twoDimVertR2 = 5; 28439 var twoDimVertL2 = 6; 28440 var twoDimVertR3 = 7; 28441 var twoDimVertL3 = 8; 28442 28443 var twoDimTable = [ 28444 [-1, -1], [-1, -1], // 000000x 28445 [7, twoDimVertL3], // 0000010 28446 [7, twoDimVertR3], // 0000011 28447 [6, twoDimVertL2], [6, twoDimVertL2], // 000010x 28448 [6, twoDimVertR2], [6, twoDimVertR2], // 000011x 28449 [4, twoDimPass], [4, twoDimPass], // 0001xxx 28450 [4, twoDimPass], [4, twoDimPass], 28451 [4, twoDimPass], [4, twoDimPass], 28452 [4, twoDimPass], [4, twoDimPass], 28453 [3, twoDimHoriz], [3, twoDimHoriz], // 001xxxx 28454 [3, twoDimHoriz], [3, twoDimHoriz], 28455 [3, twoDimHoriz], [3, twoDimHoriz], 28456 [3, twoDimHoriz], [3, twoDimHoriz], 28457 [3, twoDimHoriz], [3, twoDimHoriz], 28458 [3, twoDimHoriz], [3, twoDimHoriz], 28459 [3, twoDimHoriz], [3, twoDimHoriz], 28460 [3, twoDimHoriz], [3, twoDimHoriz], 28461 [3, twoDimVertL1], [3, twoDimVertL1], // 010xxxx 28462 [3, twoDimVertL1], [3, twoDimVertL1], 28463 [3, twoDimVertL1], [3, twoDimVertL1], 28464 [3, twoDimVertL1], [3, twoDimVertL1], 28465 [3, twoDimVertL1], [3, twoDimVertL1], 28466 [3, twoDimVertL1], [3, twoDimVertL1], 28467 [3, twoDimVertL1], [3, twoDimVertL1], 28468 [3, twoDimVertL1], [3, twoDimVertL1], 28469 [3, twoDimVertR1], [3, twoDimVertR1], // 011xxxx 28470 [3, twoDimVertR1], [3, twoDimVertR1], 28471 [3, twoDimVertR1], [3, twoDimVertR1], 28472 [3, twoDimVertR1], [3, twoDimVertR1], 28473 [3, twoDimVertR1], [3, twoDimVertR1], 28474 [3, twoDimVertR1], [3, twoDimVertR1], 28475 [3, twoDimVertR1], [3, twoDimVertR1], 28476 [3, twoDimVertR1], [3, twoDimVertR1], 28477 [1, twoDimVert0], [1, twoDimVert0], // 1xxxxxx 28478 [1, twoDimVert0], [1, twoDimVert0], 28479 [1, twoDimVert0], [1, twoDimVert0], 28480 [1, twoDimVert0], [1, twoDimVert0], 28481 [1, twoDimVert0], [1, twoDimVert0], 28482 [1, twoDimVert0], [1, twoDimVert0], 28483 [1, twoDimVert0], [1, twoDimVert0], 28484 [1, twoDimVert0], [1, twoDimVert0], 28485 [1, twoDimVert0], [1, twoDimVert0], 28486 [1, twoDimVert0], [1, twoDimVert0], 28487 [1, twoDimVert0], [1, twoDimVert0], 28488 [1, twoDimVert0], [1, twoDimVert0], 28489 [1, twoDimVert0], [1, twoDimVert0], 28490 [1, twoDimVert0], [1, twoDimVert0], 28491 [1, twoDimVert0], [1, twoDimVert0], 28492 [1, twoDimVert0], [1, twoDimVert0], 28493 [1, twoDimVert0], [1, twoDimVert0], 28494 [1, twoDimVert0], [1, twoDimVert0], 28495 [1, twoDimVert0], [1, twoDimVert0], 28496 [1, twoDimVert0], [1, twoDimVert0], 28497 [1, twoDimVert0], [1, twoDimVert0], 28498 [1, twoDimVert0], [1, twoDimVert0], 28499 [1, twoDimVert0], [1, twoDimVert0], 28500 [1, twoDimVert0], [1, twoDimVert0], 28501 [1, twoDimVert0], [1, twoDimVert0], 28502 [1, twoDimVert0], [1, twoDimVert0], 28503 [1, twoDimVert0], [1, twoDimVert0], 28504 [1, twoDimVert0], [1, twoDimVert0], 28505 [1, twoDimVert0], [1, twoDimVert0], 28506 [1, twoDimVert0], [1, twoDimVert0], 28507 [1, twoDimVert0], [1, twoDimVert0], 28508 [1, twoDimVert0], [1, twoDimVert0] 28509 ]; 28510 28511 var whiteTable1 = [ 28512 [-1, -1], // 00000 28513 [12, ccittEOL], // 00001 28514 [-1, -1], [-1, -1], // 0001x 28515 [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 001xx 28516 [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 010xx 28517 [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 011xx 28518 [11, 1792], [11, 1792], // 1000x 28519 [12, 1984], // 10010 28520 [12, 2048], // 10011 28521 [12, 2112], // 10100 28522 [12, 2176], // 10101 28523 [12, 2240], // 10110 28524 [12, 2304], // 10111 28525 [11, 1856], [11, 1856], // 1100x 28526 [11, 1920], [11, 1920], // 1101x 28527 [12, 2368], // 11100 28528 [12, 2432], // 11101 28529 [12, 2496], // 11110 28530 [12, 2560] // 11111 28531 ]; 28532 28533 var whiteTable2 = [ 28534 [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000000xx 28535 [8, 29], [8, 29], // 00000010x 28536 [8, 30], [8, 30], // 00000011x 28537 [8, 45], [8, 45], // 00000100x 28538 [8, 46], [8, 46], // 00000101x 28539 [7, 22], [7, 22], [7, 22], [7, 22], // 0000011xx 28540 [7, 23], [7, 23], [7, 23], [7, 23], // 0000100xx 28541 [8, 47], [8, 47], // 00001010x 28542 [8, 48], [8, 48], // 00001011x 28543 [6, 13], [6, 13], [6, 13], [6, 13], // 000011xxx 28544 [6, 13], [6, 13], [6, 13], [6, 13], 28545 [7, 20], [7, 20], [7, 20], [7, 20], // 0001000xx 28546 [8, 33], [8, 33], // 00010010x 28547 [8, 34], [8, 34], // 00010011x 28548 [8, 35], [8, 35], // 00010100x 28549 [8, 36], [8, 36], // 00010101x 28550 [8, 37], [8, 37], // 00010110x 28551 [8, 38], [8, 38], // 00010111x 28552 [7, 19], [7, 19], [7, 19], [7, 19], // 0001100xx 28553 [8, 31], [8, 31], // 00011010x 28554 [8, 32], [8, 32], // 00011011x 28555 [6, 1], [6, 1], [6, 1], [6, 1], // 000111xxx 28556 [6, 1], [6, 1], [6, 1], [6, 1], 28557 [6, 12], [6, 12], [6, 12], [6, 12], // 001000xxx 28558 [6, 12], [6, 12], [6, 12], [6, 12], 28559 [8, 53], [8, 53], // 00100100x 28560 [8, 54], [8, 54], // 00100101x 28561 [7, 26], [7, 26], [7, 26], [7, 26], // 0010011xx 28562 [8, 39], [8, 39], // 00101000x 28563 [8, 40], [8, 40], // 00101001x 28564 [8, 41], [8, 41], // 00101010x 28565 [8, 42], [8, 42], // 00101011x 28566 [8, 43], [8, 43], // 00101100x 28567 [8, 44], [8, 44], // 00101101x 28568 [7, 21], [7, 21], [7, 21], [7, 21], // 0010111xx 28569 [7, 28], [7, 28], [7, 28], [7, 28], // 0011000xx 28570 [8, 61], [8, 61], // 00110010x 28571 [8, 62], [8, 62], // 00110011x 28572 [8, 63], [8, 63], // 00110100x 28573 [8, 0], [8, 0], // 00110101x 28574 [8, 320], [8, 320], // 00110110x 28575 [8, 384], [8, 384], // 00110111x 28576 [5, 10], [5, 10], [5, 10], [5, 10], // 00111xxxx 28577 [5, 10], [5, 10], [5, 10], [5, 10], 28578 [5, 10], [5, 10], [5, 10], [5, 10], 28579 [5, 10], [5, 10], [5, 10], [5, 10], 28580 [5, 11], [5, 11], [5, 11], [5, 11], // 01000xxxx 28581 [5, 11], [5, 11], [5, 11], [5, 11], 28582 [5, 11], [5, 11], [5, 11], [5, 11], 28583 [5, 11], [5, 11], [5, 11], [5, 11], 28584 [7, 27], [7, 27], [7, 27], [7, 27], // 0100100xx 28585 [8, 59], [8, 59], // 01001010x 28586 [8, 60], [8, 60], // 01001011x 28587 [9, 1472], // 010011000 28588 [9, 1536], // 010011001 28589 [9, 1600], // 010011010 28590 [9, 1728], // 010011011 28591 [7, 18], [7, 18], [7, 18], [7, 18], // 0100111xx 28592 [7, 24], [7, 24], [7, 24], [7, 24], // 0101000xx 28593 [8, 49], [8, 49], // 01010010x 28594 [8, 50], [8, 50], // 01010011x 28595 [8, 51], [8, 51], // 01010100x 28596 [8, 52], [8, 52], // 01010101x 28597 [7, 25], [7, 25], [7, 25], [7, 25], // 0101011xx 28598 [8, 55], [8, 55], // 01011000x 28599 [8, 56], [8, 56], // 01011001x 28600 [8, 57], [8, 57], // 01011010x 28601 [8, 58], [8, 58], // 01011011x 28602 [6, 192], [6, 192], [6, 192], [6, 192], // 010111xxx 28603 [6, 192], [6, 192], [6, 192], [6, 192], 28604 [6, 1664], [6, 1664], [6, 1664], [6, 1664], // 011000xxx 28605 [6, 1664], [6, 1664], [6, 1664], [6, 1664], 28606 [8, 448], [8, 448], // 01100100x 28607 [8, 512], [8, 512], // 01100101x 28608 [9, 704], // 011001100 28609 [9, 768], // 011001101 28610 [8, 640], [8, 640], // 01100111x 28611 [8, 576], [8, 576], // 01101000x 28612 [9, 832], // 011010010 28613 [9, 896], // 011010011 28614 [9, 960], // 011010100 28615 [9, 1024], // 011010101 28616 [9, 1088], // 011010110 28617 [9, 1152], // 011010111 28618 [9, 1216], // 011011000 28619 [9, 1280], // 011011001 28620 [9, 1344], // 011011010 28621 [9, 1408], // 011011011 28622 [7, 256], [7, 256], [7, 256], [7, 256], // 0110111xx 28623 [4, 2], [4, 2], [4, 2], [4, 2], // 0111xxxxx 28624 [4, 2], [4, 2], [4, 2], [4, 2], 28625 [4, 2], [4, 2], [4, 2], [4, 2], 28626 [4, 2], [4, 2], [4, 2], [4, 2], 28627 [4, 2], [4, 2], [4, 2], [4, 2], 28628 [4, 2], [4, 2], [4, 2], [4, 2], 28629 [4, 2], [4, 2], [4, 2], [4, 2], 28630 [4, 2], [4, 2], [4, 2], [4, 2], 28631 [4, 3], [4, 3], [4, 3], [4, 3], // 1000xxxxx 28632 [4, 3], [4, 3], [4, 3], [4, 3], 28633 [4, 3], [4, 3], [4, 3], [4, 3], 28634 [4, 3], [4, 3], [4, 3], [4, 3], 28635 [4, 3], [4, 3], [4, 3], [4, 3], 28636 [4, 3], [4, 3], [4, 3], [4, 3], 28637 [4, 3], [4, 3], [4, 3], [4, 3], 28638 [4, 3], [4, 3], [4, 3], [4, 3], 28639 [5, 128], [5, 128], [5, 128], [5, 128], // 10010xxxx 28640 [5, 128], [5, 128], [5, 128], [5, 128], 28641 [5, 128], [5, 128], [5, 128], [5, 128], 28642 [5, 128], [5, 128], [5, 128], [5, 128], 28643 [5, 8], [5, 8], [5, 8], [5, 8], // 10011xxxx 28644 [5, 8], [5, 8], [5, 8], [5, 8], 28645 [5, 8], [5, 8], [5, 8], [5, 8], 28646 [5, 8], [5, 8], [5, 8], [5, 8], 28647 [5, 9], [5, 9], [5, 9], [5, 9], // 10100xxxx 28648 [5, 9], [5, 9], [5, 9], [5, 9], 28649 [5, 9], [5, 9], [5, 9], [5, 9], 28650 [5, 9], [5, 9], [5, 9], [5, 9], 28651 [6, 16], [6, 16], [6, 16], [6, 16], // 101010xxx 28652 [6, 16], [6, 16], [6, 16], [6, 16], 28653 [6, 17], [6, 17], [6, 17], [6, 17], // 101011xxx 28654 [6, 17], [6, 17], [6, 17], [6, 17], 28655 [4, 4], [4, 4], [4, 4], [4, 4], // 1011xxxxx 28656 [4, 4], [4, 4], [4, 4], [4, 4], 28657 [4, 4], [4, 4], [4, 4], [4, 4], 28658 [4, 4], [4, 4], [4, 4], [4, 4], 28659 [4, 4], [4, 4], [4, 4], [4, 4], 28660 [4, 4], [4, 4], [4, 4], [4, 4], 28661 [4, 4], [4, 4], [4, 4], [4, 4], 28662 [4, 4], [4, 4], [4, 4], [4, 4], 28663 [4, 5], [4, 5], [4, 5], [4, 5], // 1100xxxxx 28664 [4, 5], [4, 5], [4, 5], [4, 5], 28665 [4, 5], [4, 5], [4, 5], [4, 5], 28666 [4, 5], [4, 5], [4, 5], [4, 5], 28667 [4, 5], [4, 5], [4, 5], [4, 5], 28668 [4, 5], [4, 5], [4, 5], [4, 5], 28669 [4, 5], [4, 5], [4, 5], [4, 5], 28670 [4, 5], [4, 5], [4, 5], [4, 5], 28671 [6, 14], [6, 14], [6, 14], [6, 14], // 110100xxx 28672 [6, 14], [6, 14], [6, 14], [6, 14], 28673 [6, 15], [6, 15], [6, 15], [6, 15], // 110101xxx 28674 [6, 15], [6, 15], [6, 15], [6, 15], 28675 [5, 64], [5, 64], [5, 64], [5, 64], // 11011xxxx 28676 [5, 64], [5, 64], [5, 64], [5, 64], 28677 [5, 64], [5, 64], [5, 64], [5, 64], 28678 [5, 64], [5, 64], [5, 64], [5, 64], 28679 [4, 6], [4, 6], [4, 6], [4, 6], // 1110xxxxx 28680 [4, 6], [4, 6], [4, 6], [4, 6], 28681 [4, 6], [4, 6], [4, 6], [4, 6], 28682 [4, 6], [4, 6], [4, 6], [4, 6], 28683 [4, 6], [4, 6], [4, 6], [4, 6], 28684 [4, 6], [4, 6], [4, 6], [4, 6], 28685 [4, 6], [4, 6], [4, 6], [4, 6], 28686 [4, 6], [4, 6], [4, 6], [4, 6], 28687 [4, 7], [4, 7], [4, 7], [4, 7], // 1111xxxxx 28688 [4, 7], [4, 7], [4, 7], [4, 7], 28689 [4, 7], [4, 7], [4, 7], [4, 7], 28690 [4, 7], [4, 7], [4, 7], [4, 7], 28691 [4, 7], [4, 7], [4, 7], [4, 7], 28692 [4, 7], [4, 7], [4, 7], [4, 7], 28693 [4, 7], [4, 7], [4, 7], [4, 7], 28694 [4, 7], [4, 7], [4, 7], [4, 7] 28695 ]; 28696 28697 var blackTable1 = [ 28698 [-1, -1], [-1, -1], // 000000000000x 28699 [12, ccittEOL], [12, ccittEOL], // 000000000001x 28700 [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000001xx 28701 [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000010xx 28702 [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000011xx 28703 [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000100xx 28704 [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000101xx 28705 [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000110xx 28706 [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000111xx 28707 [11, 1792], [11, 1792], [11, 1792], [11, 1792], // 00000001000xx 28708 [12, 1984], [12, 1984], // 000000010010x 28709 [12, 2048], [12, 2048], // 000000010011x 28710 [12, 2112], [12, 2112], // 000000010100x 28711 [12, 2176], [12, 2176], // 000000010101x 28712 [12, 2240], [12, 2240], // 000000010110x 28713 [12, 2304], [12, 2304], // 000000010111x 28714 [11, 1856], [11, 1856], [11, 1856], [11, 1856], // 00000001100xx 28715 [11, 1920], [11, 1920], [11, 1920], [11, 1920], // 00000001101xx 28716 [12, 2368], [12, 2368], // 000000011100x 28717 [12, 2432], [12, 2432], // 000000011101x 28718 [12, 2496], [12, 2496], // 000000011110x 28719 [12, 2560], [12, 2560], // 000000011111x 28720 [10, 18], [10, 18], [10, 18], [10, 18], // 0000001000xxx 28721 [10, 18], [10, 18], [10, 18], [10, 18], 28722 [12, 52], [12, 52], // 000000100100x 28723 [13, 640], // 0000001001010 28724 [13, 704], // 0000001001011 28725 [13, 768], // 0000001001100 28726 [13, 832], // 0000001001101 28727 [12, 55], [12, 55], // 000000100111x 28728 [12, 56], [12, 56], // 000000101000x 28729 [13, 1280], // 0000001010010 28730 [13, 1344], // 0000001010011 28731 [13, 1408], // 0000001010100 28732 [13, 1472], // 0000001010101 28733 [12, 59], [12, 59], // 000000101011x 28734 [12, 60], [12, 60], // 000000101100x 28735 [13, 1536], // 0000001011010 28736 [13, 1600], // 0000001011011 28737 [11, 24], [11, 24], [11, 24], [11, 24], // 00000010111xx 28738 [11, 25], [11, 25], [11, 25], [11, 25], // 00000011000xx 28739 [13, 1664], // 0000001100100 28740 [13, 1728], // 0000001100101 28741 [12, 320], [12, 320], // 000000110011x 28742 [12, 384], [12, 384], // 000000110100x 28743 [12, 448], [12, 448], // 000000110101x 28744 [13, 512], // 0000001101100 28745 [13, 576], // 0000001101101 28746 [12, 53], [12, 53], // 000000110111x 28747 [12, 54], [12, 54], // 000000111000x 28748 [13, 896], // 0000001110010 28749 [13, 960], // 0000001110011 28750 [13, 1024], // 0000001110100 28751 [13, 1088], // 0000001110101 28752 [13, 1152], // 0000001110110 28753 [13, 1216], // 0000001110111 28754 [10, 64], [10, 64], [10, 64], [10, 64], // 0000001111xxx 28755 [10, 64], [10, 64], [10, 64], [10, 64] 28756 ]; 28757 28758 var blackTable2 = [ 28759 [8, 13], [8, 13], [8, 13], [8, 13], // 00000100xxxx 28760 [8, 13], [8, 13], [8, 13], [8, 13], 28761 [8, 13], [8, 13], [8, 13], [8, 13], 28762 [8, 13], [8, 13], [8, 13], [8, 13], 28763 [11, 23], [11, 23], // 00000101000x 28764 [12, 50], // 000001010010 28765 [12, 51], // 000001010011 28766 [12, 44], // 000001010100 28767 [12, 45], // 000001010101 28768 [12, 46], // 000001010110 28769 [12, 47], // 000001010111 28770 [12, 57], // 000001011000 28771 [12, 58], // 000001011001 28772 [12, 61], // 000001011010 28773 [12, 256], // 000001011011 28774 [10, 16], [10, 16], [10, 16], [10, 16], // 0000010111xx 28775 [10, 17], [10, 17], [10, 17], [10, 17], // 0000011000xx 28776 [12, 48], // 000001100100 28777 [12, 49], // 000001100101 28778 [12, 62], // 000001100110 28779 [12, 63], // 000001100111 28780 [12, 30], // 000001101000 28781 [12, 31], // 000001101001 28782 [12, 32], // 000001101010 28783 [12, 33], // 000001101011 28784 [12, 40], // 000001101100 28785 [12, 41], // 000001101101 28786 [11, 22], [11, 22], // 00000110111x 28787 [8, 14], [8, 14], [8, 14], [8, 14], // 00000111xxxx 28788 [8, 14], [8, 14], [8, 14], [8, 14], 28789 [8, 14], [8, 14], [8, 14], [8, 14], 28790 [8, 14], [8, 14], [8, 14], [8, 14], 28791 [7, 10], [7, 10], [7, 10], [7, 10], // 0000100xxxxx 28792 [7, 10], [7, 10], [7, 10], [7, 10], 28793 [7, 10], [7, 10], [7, 10], [7, 10], 28794 [7, 10], [7, 10], [7, 10], [7, 10], 28795 [7, 10], [7, 10], [7, 10], [7, 10], 28796 [7, 10], [7, 10], [7, 10], [7, 10], 28797 [7, 10], [7, 10], [7, 10], [7, 10], 28798 [7, 10], [7, 10], [7, 10], [7, 10], 28799 [7, 11], [7, 11], [7, 11], [7, 11], // 0000101xxxxx 28800 [7, 11], [7, 11], [7, 11], [7, 11], 28801 [7, 11], [7, 11], [7, 11], [7, 11], 28802 [7, 11], [7, 11], [7, 11], [7, 11], 28803 [7, 11], [7, 11], [7, 11], [7, 11], 28804 [7, 11], [7, 11], [7, 11], [7, 11], 28805 [7, 11], [7, 11], [7, 11], [7, 11], 28806 [7, 11], [7, 11], [7, 11], [7, 11], 28807 [9, 15], [9, 15], [9, 15], [9, 15], // 000011000xxx 28808 [9, 15], [9, 15], [9, 15], [9, 15], 28809 [12, 128], // 000011001000 28810 [12, 192], // 000011001001 28811 [12, 26], // 000011001010 28812 [12, 27], // 000011001011 28813 [12, 28], // 000011001100 28814 [12, 29], // 000011001101 28815 [11, 19], [11, 19], // 00001100111x 28816 [11, 20], [11, 20], // 00001101000x 28817 [12, 34], // 000011010010 28818 [12, 35], // 000011010011 28819 [12, 36], // 000011010100 28820 [12, 37], // 000011010101 28821 [12, 38], // 000011010110 28822 [12, 39], // 000011010111 28823 [11, 21], [11, 21], // 00001101100x 28824 [12, 42], // 000011011010 28825 [12, 43], // 000011011011 28826 [10, 0], [10, 0], [10, 0], [10, 0], // 0000110111xx 28827 [7, 12], [7, 12], [7, 12], [7, 12], // 0000111xxxxx 28828 [7, 12], [7, 12], [7, 12], [7, 12], 28829 [7, 12], [7, 12], [7, 12], [7, 12], 28830 [7, 12], [7, 12], [7, 12], [7, 12], 28831 [7, 12], [7, 12], [7, 12], [7, 12], 28832 [7, 12], [7, 12], [7, 12], [7, 12], 28833 [7, 12], [7, 12], [7, 12], [7, 12], 28834 [7, 12], [7, 12], [7, 12], [7, 12] 28835 ]; 28836 28837 var blackTable3 = [ 28838 [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000xx 28839 [6, 9], // 000100 28840 [6, 8], // 000101 28841 [5, 7], [5, 7], // 00011x 28842 [4, 6], [4, 6], [4, 6], [4, 6], // 0010xx 28843 [4, 5], [4, 5], [4, 5], [4, 5], // 0011xx 28844 [3, 1], [3, 1], [3, 1], [3, 1], // 010xxx 28845 [3, 1], [3, 1], [3, 1], [3, 1], 28846 [3, 4], [3, 4], [3, 4], [3, 4], // 011xxx 28847 [3, 4], [3, 4], [3, 4], [3, 4], 28848 [2, 3], [2, 3], [2, 3], [2, 3], // 10xxxx 28849 [2, 3], [2, 3], [2, 3], [2, 3], 28850 [2, 3], [2, 3], [2, 3], [2, 3], 28851 [2, 3], [2, 3], [2, 3], [2, 3], 28852 [2, 2], [2, 2], [2, 2], [2, 2], // 11xxxx 28853 [2, 2], [2, 2], [2, 2], [2, 2], 28854 [2, 2], [2, 2], [2, 2], [2, 2], 28855 [2, 2], [2, 2], [2, 2], [2, 2] 28856 ]; 28857 28858 function CCITTFaxStream(str, params) { 28859 this.str = str; 28860 this.dict = str.dict; 28861 28862 params = params || new Dict(); 28863 28864 this.encoding = params.get('K') || 0; 28865 this.eoline = params.get('EndOfLine') || false; 28866 this.byteAlign = params.get('EncodedByteAlign') || false; 28867 this.columns = params.get('Columns') || 1728; 28868 this.rows = params.get('Rows') || 0; 28869 var eoblock = params.get('EndOfBlock'); 28870 if (eoblock == null) 28871 eoblock = true; 28872 this.eoblock = eoblock; 28873 this.black = params.get('BlackIs1') || false; 28874 28875 this.codingLine = new Uint32Array(this.columns + 1); 28876 this.refLine = new Uint32Array(this.columns + 2); 28877 28878 this.codingLine[0] = this.columns; 28879 this.codingPos = 0; 28880 28881 this.row = 0; 28882 this.nextLine2D = this.encoding < 0; 28883 this.inputBits = 0; 28884 this.inputBuf = 0; 28885 this.outputBits = 0; 28886 this.buf = EOF; 28887 28888 var code1; 28889 while ((code1 = this.lookBits(12)) == 0) { 28890 this.eatBits(1); 28891 } 28892 if (code1 == 1) { 28893 this.eatBits(12); 28894 } 28895 if (this.encoding > 0) { 28896 this.nextLine2D = !this.lookBits(1); 28897 this.eatBits(1); 28898 } 28899 28900 DecodeStream.call(this); 28901 } 28902 28903 CCITTFaxStream.prototype = Object.create(DecodeStream.prototype); 28904 28905 CCITTFaxStream.prototype.readBlock = function CCITTFaxStream_readBlock() { 28906 while (!this.eof) { 28907 var c = this.lookChar(); 28908 this.buf = EOF; 28909 this.ensureBuffer(this.bufferLength + 1); 28910 this.buffer[this.bufferLength++] = c; 28911 } 28912 }; 28913 28914 CCITTFaxStream.prototype.addPixels = 28915 function ccittFaxStreamAddPixels(a1, blackPixels) { 28916 var codingLine = this.codingLine; 28917 var codingPos = this.codingPos; 28918 28919 if (a1 > codingLine[codingPos]) { 28920 if (a1 > this.columns) { 28921 warn('row is wrong length'); 28922 this.err = true; 28923 a1 = this.columns; 28924 } 28925 if ((codingPos & 1) ^ blackPixels) { 28926 ++codingPos; 28927 } 28928 28929 codingLine[codingPos] = a1; 28930 } 28931 this.codingPos = codingPos; 28932 }; 28933 28934 CCITTFaxStream.prototype.addPixelsNeg = 28935 function ccittFaxStreamAddPixelsNeg(a1, blackPixels) { 28936 var codingLine = this.codingLine; 28937 var codingPos = this.codingPos; 28938 28939 if (a1 > codingLine[codingPos]) { 28940 if (a1 > this.columns) { 28941 warn('row is wrong length'); 28942 this.err = true; 28943 a1 = this.columns; 28944 } 28945 if ((codingPos & 1) ^ blackPixels) 28946 ++codingPos; 28947 28948 codingLine[codingPos] = a1; 28949 } else if (a1 < codingLine[codingPos]) { 28950 if (a1 < 0) { 28951 warn('invalid code'); 28952 this.err = true; 28953 a1 = 0; 28954 } 28955 while (codingPos > 0 && a1 < codingLine[codingPos - 1]) 28956 --codingPos; 28957 codingLine[codingPos] = a1; 28958 } 28959 28960 this.codingPos = codingPos; 28961 }; 28962 28963 CCITTFaxStream.prototype.lookChar = function CCITTFaxStream_lookChar() { 28964 if (this.buf != EOF) 28965 return this.buf; 28966 28967 var refLine = this.refLine; 28968 var codingLine = this.codingLine; 28969 var columns = this.columns; 28970 28971 var refPos, blackPixels, bits; 28972 28973 if (this.outputBits == 0) { 28974 if (this.eof) 28975 return null; 28976 28977 this.err = false; 28978 28979 var code1, code2, code3; 28980 if (this.nextLine2D) { 28981 for (var i = 0; codingLine[i] < columns; ++i) 28982 refLine[i] = codingLine[i]; 28983 28984 refLine[i++] = columns; 28985 refLine[i] = columns; 28986 codingLine[0] = 0; 28987 this.codingPos = 0; 28988 refPos = 0; 28989 blackPixels = 0; 28990 28991 while (codingLine[this.codingPos] < columns) { 28992 code1 = this.getTwoDimCode(); 28993 switch (code1) { 28994 case twoDimPass: 28995 this.addPixels(refLine[refPos + 1], blackPixels); 28996 if (refLine[refPos + 1] < columns) 28997 refPos += 2; 28998 break; 28999 case twoDimHoriz: 29000 code1 = code2 = 0; 29001 if (blackPixels) { 29002 do { 29003 code1 += (code3 = this.getBlackCode()); 29004 } while (code3 >= 64); 29005 do { 29006 code2 += (code3 = this.getWhiteCode()); 29007 } while (code3 >= 64); 29008 } else { 29009 do { 29010 code1 += (code3 = this.getWhiteCode()); 29011 } while (code3 >= 64); 29012 do { 29013 code2 += (code3 = this.getBlackCode()); 29014 } while (code3 >= 64); 29015 } 29016 this.addPixels(codingLine[this.codingPos] + 29017 code1, blackPixels); 29018 if (codingLine[this.codingPos] < columns) { 29019 this.addPixels(codingLine[this.codingPos] + code2, 29020 blackPixels ^ 1); 29021 } 29022 while (refLine[refPos] <= codingLine[this.codingPos] && 29023 refLine[refPos] < columns) { 29024 refPos += 2; 29025 } 29026 break; 29027 case twoDimVertR3: 29028 this.addPixels(refLine[refPos] + 3, blackPixels); 29029 blackPixels ^= 1; 29030 if (codingLine[this.codingPos] < columns) { 29031 ++refPos; 29032 while (refLine[refPos] <= codingLine[this.codingPos] && 29033 refLine[refPos] < columns) 29034 refPos += 2; 29035 } 29036 break; 29037 case twoDimVertR2: 29038 this.addPixels(refLine[refPos] + 2, blackPixels); 29039 blackPixels ^= 1; 29040 if (codingLine[this.codingPos] < columns) { 29041 ++refPos; 29042 while (refLine[refPos] <= codingLine[this.codingPos] && 29043 refLine[refPos] < columns) { 29044 refPos += 2; 29045 } 29046 } 29047 break; 29048 case twoDimVertR1: 29049 this.addPixels(refLine[refPos] + 1, blackPixels); 29050 blackPixels ^= 1; 29051 if (codingLine[this.codingPos] < columns) { 29052 ++refPos; 29053 while (refLine[refPos] <= codingLine[this.codingPos] && 29054 refLine[refPos] < columns) 29055 refPos += 2; 29056 } 29057 break; 29058 case twoDimVert0: 29059 this.addPixels(refLine[refPos], blackPixels); 29060 blackPixels ^= 1; 29061 if (codingLine[this.codingPos] < columns) { 29062 ++refPos; 29063 while (refLine[refPos] <= codingLine[this.codingPos] && 29064 refLine[refPos] < columns) 29065 refPos += 2; 29066 } 29067 break; 29068 case twoDimVertL3: 29069 this.addPixelsNeg(refLine[refPos] - 3, blackPixels); 29070 blackPixels ^= 1; 29071 if (codingLine[this.codingPos] < columns) { 29072 if (refPos > 0) 29073 --refPos; 29074 else 29075 ++refPos; 29076 while (refLine[refPos] <= codingLine[this.codingPos] && 29077 refLine[refPos] < columns) 29078 refPos += 2; 29079 } 29080 break; 29081 case twoDimVertL2: 29082 this.addPixelsNeg(refLine[refPos] - 2, blackPixels); 29083 blackPixels ^= 1; 29084 if (codingLine[this.codingPos] < columns) { 29085 if (refPos > 0) 29086 --refPos; 29087 else 29088 ++refPos; 29089 while (refLine[refPos] <= codingLine[this.codingPos] && 29090 refLine[refPos] < columns) 29091 refPos += 2; 29092 } 29093 break; 29094 case twoDimVertL1: 29095 this.addPixelsNeg(refLine[refPos] - 1, blackPixels); 29096 blackPixels ^= 1; 29097 if (codingLine[this.codingPos] < columns) { 29098 if (refPos > 0) 29099 --refPos; 29100 else 29101 ++refPos; 29102 29103 while (refLine[refPos] <= codingLine[this.codingPos] && 29104 refLine[refPos] < columns) 29105 refPos += 2; 29106 } 29107 break; 29108 case EOF: 29109 this.addPixels(columns, 0); 29110 this.eof = true; 29111 break; 29112 default: 29113 warn('bad 2d code'); 29114 this.addPixels(columns, 0); 29115 this.err = true; 29116 } 29117 } 29118 } else { 29119 codingLine[0] = 0; 29120 this.codingPos = 0; 29121 blackPixels = 0; 29122 while (codingLine[this.codingPos] < columns) { 29123 code1 = 0; 29124 if (blackPixels) { 29125 do { 29126 code1 += (code3 = this.getBlackCode()); 29127 } while (code3 >= 64); 29128 } else { 29129 do { 29130 code1 += (code3 = this.getWhiteCode()); 29131 } while (code3 >= 64); 29132 } 29133 this.addPixels(codingLine[this.codingPos] + code1, blackPixels); 29134 blackPixels ^= 1; 29135 } 29136 } 29137 29138 if (this.byteAlign) 29139 this.inputBits &= ~7; 29140 29141 var gotEOL = false; 29142 29143 if (!this.eoblock && this.row == this.rows - 1) { 29144 this.eof = true; 29145 } else { 29146 code1 = this.lookBits(12); 29147 while (code1 == 0) { 29148 this.eatBits(1); 29149 code1 = this.lookBits(12); 29150 } 29151 if (code1 == 1) { 29152 this.eatBits(12); 29153 gotEOL = true; 29154 } else if (code1 == EOF) { 29155 this.eof = true; 29156 } 29157 } 29158 29159 if (!this.eof && this.encoding > 0) { 29160 this.nextLine2D = !this.lookBits(1); 29161 this.eatBits(1); 29162 } 29163 29164 if (this.eoblock && gotEOL) { 29165 code1 = this.lookBits(12); 29166 if (code1 == 1) { 29167 this.eatBits(12); 29168 if (this.encoding > 0) { 29169 this.lookBits(1); 29170 this.eatBits(1); 29171 } 29172 if (this.encoding >= 0) { 29173 for (var i = 0; i < 4; ++i) { 29174 code1 = this.lookBits(12); 29175 if (code1 != 1) 29176 warn('bad rtc code: ' + code1); 29177 this.eatBits(12); 29178 if (this.encoding > 0) { 29179 this.lookBits(1); 29180 this.eatBits(1); 29181 } 29182 } 29183 } 29184 this.eof = true; 29185 } 29186 } else if (this.err && this.eoline) { 29187 while (true) { 29188 code1 = this.lookBits(13); 29189 if (code1 == EOF) { 29190 this.eof = true; 29191 return null; 29192 } 29193 if ((code1 >> 1) == 1) { 29194 break; 29195 } 29196 this.eatBits(1); 29197 } 29198 this.eatBits(12); 29199 if (this.encoding > 0) { 29200 this.eatBits(1); 29201 this.nextLine2D = !(code1 & 1); 29202 } 29203 } 29204 29205 if (codingLine[0] > 0) 29206 this.outputBits = codingLine[this.codingPos = 0]; 29207 else 29208 this.outputBits = codingLine[this.codingPos = 1]; 29209 this.row++; 29210 } 29211 29212 if (this.outputBits >= 8) { 29213 this.buf = (this.codingPos & 1) ? 0 : 0xFF; 29214 this.outputBits -= 8; 29215 if (this.outputBits == 0 && codingLine[this.codingPos] < columns) { 29216 this.codingPos++; 29217 this.outputBits = (codingLine[this.codingPos] - 29218 codingLine[this.codingPos - 1]); 29219 } 29220 } else { 29221 var bits = 8; 29222 this.buf = 0; 29223 do { 29224 if (this.outputBits > bits) { 29225 this.buf <<= bits; 29226 if (!(this.codingPos & 1)) { 29227 this.buf |= 0xFF >> (8 - bits); 29228 } 29229 this.outputBits -= bits; 29230 bits = 0; 29231 } else { 29232 this.buf <<= this.outputBits; 29233 if (!(this.codingPos & 1)) { 29234 this.buf |= 0xFF >> (8 - this.outputBits); 29235 } 29236 bits -= this.outputBits; 29237 this.outputBits = 0; 29238 if (codingLine[this.codingPos] < columns) { 29239 this.codingPos++; 29240 this.outputBits = (codingLine[this.codingPos] - 29241 codingLine[this.codingPos - 1]); 29242 } else if (bits > 0) { 29243 this.buf <<= bits; 29244 bits = 0; 29245 } 29246 } 29247 } while (bits); 29248 } 29249 if (this.black) { 29250 this.buf ^= 0xFF; 29251 } 29252 return this.buf; 29253 }; 29254 29255 // This functions returns the code found from the table. 29256 // The start and end parameters set the boundaries for searching the table. 29257 // The limit parameter is optional. Function returns an array with three 29258 // values. The first array element indicates whether a valid code is being 29259 // returned. The second array element is the actual code. The third array 29260 // element indicates whether EOF was reached. 29261 CCITTFaxStream.prototype.findTableCode = 29262 function ccittFaxStreamFindTableCode(start, end, table, limit) { 29263 29264 var limitValue = limit || 0; 29265 for (var i = start; i <= end; ++i) { 29266 var code = this.lookBits(i); 29267 if (code == EOF) 29268 return [true, 1, false]; 29269 if (i < end) 29270 code <<= end - i; 29271 if (!limitValue || code >= limitValue) { 29272 var p = table[code - limitValue]; 29273 if (p[0] == i) { 29274 this.eatBits(i); 29275 return [true, p[1], true]; 29276 } 29277 } 29278 } 29279 return [false, 0, false]; 29280 }; 29281 29282 CCITTFaxStream.prototype.getTwoDimCode = 29283 function ccittFaxStreamGetTwoDimCode() { 29284 29285 var code = 0; 29286 var p; 29287 if (this.eoblock) { 29288 code = this.lookBits(7); 29289 p = twoDimTable[code]; 29290 if (p && p[0] > 0) { 29291 this.eatBits(p[0]); 29292 return p[1]; 29293 } 29294 } else { 29295 var result = this.findTableCode(1, 7, twoDimTable); 29296 if (result[0] && result[2]) 29297 return result[1]; 29298 } 29299 warn('Bad two dim code'); 29300 return EOF; 29301 }; 29302 29303 CCITTFaxStream.prototype.getWhiteCode = 29304 function ccittFaxStreamGetWhiteCode() { 29305 29306 var code = 0; 29307 var p; 29308 var n; 29309 if (this.eoblock) { 29310 code = this.lookBits(12); 29311 if (code == EOF) 29312 return 1; 29313 29314 if ((code >> 5) == 0) 29315 p = whiteTable1[code]; 29316 else 29317 p = whiteTable2[code >> 3]; 29318 29319 if (p[0] > 0) { 29320 this.eatBits(p[0]); 29321 return p[1]; 29322 } 29323 } else { 29324 var result = this.findTableCode(1, 9, whiteTable2); 29325 if (result[0]) 29326 return result[1]; 29327 29328 result = this.findTableCode(11, 12, whiteTable1); 29329 if (result[0]) 29330 return result[1]; 29331 } 29332 warn('bad white code'); 29333 this.eatBits(1); 29334 return 1; 29335 }; 29336 29337 CCITTFaxStream.prototype.getBlackCode = 29338 function ccittFaxStreamGetBlackCode() { 29339 29340 var code, p; 29341 if (this.eoblock) { 29342 code = this.lookBits(13); 29343 if (code == EOF) 29344 return 1; 29345 if ((code >> 7) == 0) 29346 p = blackTable1[code]; 29347 else if ((code >> 9) == 0 && (code >> 7) != 0) 29348 p = blackTable2[(code >> 1) - 64]; 29349 else 29350 p = blackTable3[code >> 7]; 29351 29352 if (p[0] > 0) { 29353 this.eatBits(p[0]); 29354 return p[1]; 29355 } 29356 } else { 29357 var result = this.findTableCode(2, 6, blackTable3); 29358 if (result[0]) 29359 return result[1]; 29360 29361 result = this.findTableCode(7, 12, blackTable2, 64); 29362 if (result[0]) 29363 return result[1]; 29364 29365 result = this.findTableCode(10, 13, blackTable1); 29366 if (result[0]) 29367 return result[1]; 29368 } 29369 warn('bad black code'); 29370 this.eatBits(1); 29371 return 1; 29372 }; 29373 29374 CCITTFaxStream.prototype.lookBits = function CCITTFaxStream_lookBits(n) { 29375 var c; 29376 while (this.inputBits < n) { 29377 if ((c = this.str.getByte()) == null) { 29378 if (this.inputBits == 0) 29379 return EOF; 29380 return ((this.inputBuf << (n - this.inputBits)) & 29381 (0xFFFF >> (16 - n))); 29382 } 29383 this.inputBuf = (this.inputBuf << 8) + c; 29384 this.inputBits += 8; 29385 } 29386 return (this.inputBuf >> (this.inputBits - n)) & (0xFFFF >> (16 - n)); 29387 }; 29388 29389 CCITTFaxStream.prototype.eatBits = function CCITTFaxStream_eatBits(n) { 29390 if ((this.inputBits -= n) < 0) 29391 this.inputBits = 0; 29392 }; 29393 29394 return CCITTFaxStream; 29395 })(); 29396 29397 var LZWStream = (function LZWStreamClosure() { 29398 function LZWStream(str, earlyChange) { 29399 this.str = str; 29400 this.dict = str.dict; 29401 this.cachedData = 0; 29402 this.bitsCached = 0; 29403 29404 var maxLzwDictionarySize = 4096; 29405 var lzwState = { 29406 earlyChange: earlyChange, 29407 codeLength: 9, 29408 nextCode: 258, 29409 dictionaryValues: new Uint8Array(maxLzwDictionarySize), 29410 dictionaryLengths: new Uint16Array(maxLzwDictionarySize), 29411 dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize), 29412 currentSequence: new Uint8Array(maxLzwDictionarySize), 29413 currentSequenceLength: 0 29414 }; 29415 for (var i = 0; i < 256; ++i) { 29416 lzwState.dictionaryValues[i] = i; 29417 lzwState.dictionaryLengths[i] = 1; 29418 } 29419 this.lzwState = lzwState; 29420 29421 DecodeStream.call(this); 29422 } 29423 29424 LZWStream.prototype = Object.create(DecodeStream.prototype); 29425 29426 LZWStream.prototype.readBits = function LZWStream_readBits(n) { 29427 var bitsCached = this.bitsCached; 29428 var cachedData = this.cachedData; 29429 while (bitsCached < n) { 29430 var c = this.str.getByte(); 29431 if (c == null) { 29432 this.eof = true; 29433 return null; 29434 } 29435 cachedData = (cachedData << 8) | c; 29436 bitsCached += 8; 29437 } 29438 this.bitsCached = (bitsCached -= n); 29439 this.cachedData = cachedData; 29440 this.lastCode = null; 29441 return (cachedData >>> bitsCached) & ((1 << n) - 1); 29442 }; 29443 29444 LZWStream.prototype.readBlock = function LZWStream_readBlock() { 29445 var blockSize = 512; 29446 var estimatedDecodedSize = blockSize * 2, decodedSizeDelta = blockSize; 29447 var i, j, q; 29448 29449 var lzwState = this.lzwState; 29450 if (!lzwState) 29451 return; // eof was found 29452 29453 var earlyChange = lzwState.earlyChange; 29454 var nextCode = lzwState.nextCode; 29455 var dictionaryValues = lzwState.dictionaryValues; 29456 var dictionaryLengths = lzwState.dictionaryLengths; 29457 var dictionaryPrevCodes = lzwState.dictionaryPrevCodes; 29458 var codeLength = lzwState.codeLength; 29459 var prevCode = lzwState.prevCode; 29460 var currentSequence = lzwState.currentSequence; 29461 var currentSequenceLength = lzwState.currentSequenceLength; 29462 29463 var decodedLength = 0; 29464 var currentBufferLength = this.bufferLength; 29465 var buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize); 29466 29467 for (i = 0; i < blockSize; i++) { 29468 var code = this.readBits(codeLength); 29469 var hasPrev = currentSequenceLength > 0; 29470 if (code < 256) { 29471 currentSequence[0] = code; 29472 currentSequenceLength = 1; 29473 } else if (code >= 258) { 29474 if (code < nextCode) { 29475 currentSequenceLength = dictionaryLengths[code]; 29476 for (j = currentSequenceLength - 1, q = code; j >= 0; j--) { 29477 currentSequence[j] = dictionaryValues[q]; 29478 q = dictionaryPrevCodes[q]; 29479 } 29480 } else { 29481 currentSequence[currentSequenceLength++] = currentSequence[0]; 29482 } 29483 } else if (code == 256) { 29484 codeLength = 9; 29485 nextCode = 258; 29486 currentSequenceLength = 0; 29487 continue; 29488 } else { 29489 this.eof = true; 29490 delete this.lzwState; 29491 break; 29492 } 29493 29494 if (hasPrev) { 29495 dictionaryPrevCodes[nextCode] = prevCode; 29496 dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1; 29497 dictionaryValues[nextCode] = currentSequence[0]; 29498 nextCode++; 29499 codeLength = (nextCode + earlyChange) & (nextCode + earlyChange - 1) ? 29500 codeLength : Math.min(Math.log(nextCode + earlyChange) / 29501 0.6931471805599453 + 1, 12) | 0; 29502 } 29503 prevCode = code; 29504 29505 decodedLength += currentSequenceLength; 29506 if (estimatedDecodedSize < decodedLength) { 29507 do { 29508 estimatedDecodedSize += decodedSizeDelta; 29509 } while (estimatedDecodedSize < decodedLength); 29510 buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize); 29511 } 29512 for (j = 0; j < currentSequenceLength; j++) 29513 buffer[currentBufferLength++] = currentSequence[j]; 29514 } 29515 lzwState.nextCode = nextCode; 29516 lzwState.codeLength = codeLength; 29517 lzwState.prevCode = prevCode; 29518 lzwState.currentSequenceLength = currentSequenceLength; 29519 29520 this.bufferLength = currentBufferLength; 29521 }; 29522 29523 return LZWStream; 29524 })(); 29525 29526 29527 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 29528 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ 29529 29530 'use strict'; 29531 29532 function MessageHandler(name, comObj) { 29533 this.name = name; 29534 this.comObj = comObj; 29535 this.callbackIndex = 1; 29536 var callbacks = this.callbacks = {}; 29537 var ah = this.actionHandler = {}; 29538 29539 ah['console_log'] = [function ahConsoleLog(data) { 29540 PdfJS_window.console.log.apply(PdfJS_window.console, data); 29541 }]; 29542 ah['console_error'] = [function ahConsoleError(data) { 29543 PdfJS_window.console.error.apply(PdfJS_window.console, data); 29544 }]; 29545 29546 comObj.onmessage = function messageHandlerComObjOnMessage(event) { 29547 var data = event.data; 29548 if (data.isReply) { 29549 var callbackId = data.callbackId; 29550 if (data.callbackId in callbacks) { 29551 var callback = callbacks[callbackId]; 29552 delete callbacks[callbackId]; 29553 callback(data.data); 29554 } else { 29555 error('Cannot resolve callback ' + callbackId); 29556 } 29557 } else if (data.action in ah) { 29558 var action = ah[data.action]; 29559 if (data.callbackId) { 29560 var promise = new Promise(); 29561 promise.then(function(resolvedData) { 29562 comObj.postMessage({ 29563 isReply: true, 29564 callbackId: data.callbackId, 29565 data: resolvedData 29566 }); 29567 }); 29568 action[0].call(action[1], data.data, promise); 29569 } else { 29570 action[0].call(action[1], data.data); 29571 } 29572 } else { 29573 error('Unkown action from worker: ' + data.action); 29574 } 29575 }; 29576 } 29577 29578 MessageHandler.prototype = { 29579 on: function messageHandlerOn(actionName, handler, scope) { 29580 var ah = this.actionHandler; 29581 if (ah[actionName]) { 29582 error('There is already an actionName called "' + actionName + '"'); 29583 } 29584 ah[actionName] = [handler, scope]; 29585 }, 29586 /** 29587 * Sends a message to the comObj to invoke the action with the supplied data. 29588 * @param {String} actionName Action to call. 29589 * @param {JSON} data JSON data to send. 29590 * @param {function} [callback] Optional callback that will handle a reply. 29591 */ 29592 send: function messageHandlerSend(actionName, data, callback) { 29593 var message = { 29594 action: actionName, 29595 data: data 29596 }; 29597 if (callback) { 29598 var callbackId = this.callbackIndex++; 29599 this.callbacks[callbackId] = callback; 29600 message.callbackId = callbackId; 29601 } 29602 this.comObj.postMessage(message); 29603 } 29604 }; 29605 29606 var WorkerMessageHandler = { 29607 setup: function wphSetup(handler) { 29608 var pdfModel = null; 29609 29610 handler.on('test', function wphSetupTest(data) { 29611 handler.send('test', data instanceof Uint8Array); 29612 }); 29613 29614 handler.on('GetDocRequest', function wphSetupDoc(data) { 29615 // Create only the model of the PDFDoc, which is enough for 29616 // processing the content of the pdf. 29617 pdfModel = new PDFDocument(new Stream(data)); 29618 var doc = { 29619 numPages: pdfModel.numPages, 29620 fingerprint: pdfModel.getFingerprint(), 29621 destinations: pdfModel.catalog.destinations, 29622 outline: pdfModel.catalog.documentOutline, 29623 info: pdfModel.getDocumentInfo(), 29624 metadata: pdfModel.catalog.metadata 29625 }; 29626 handler.send('GetDoc', {pdfInfo: doc}); 29627 }); 29628 29629 handler.on('GetPageRequest', function wphSetupGetPage(data) { 29630 var pageNumber = data.pageIndex + 1; 29631 var pdfPage = pdfModel.getPage(pageNumber); 29632 var page = { 29633 pageIndex: data.pageIndex, 29634 rotate: pdfPage.rotate, 29635 ref: pdfPage.ref, 29636 view: pdfPage.view 29637 }; 29638 handler.send('GetPage', {pageInfo: page}); 29639 }); 29640 29641 handler.on('GetAnnotationsRequest', function wphSetupGetAnnotations(data) { 29642 var pdfPage = pdfModel.getPage(data.pageIndex + 1); 29643 handler.send('GetAnnotations', { 29644 pageIndex: data.pageIndex, 29645 annotations: pdfPage.getAnnotations() 29646 }); 29647 }); 29648 29649 handler.on('RenderPageRequest', function wphSetupRenderPage(data) { 29650 var pageNum = data.pageIndex + 1; 29651 29652 29653 // The following code does quite the same as 29654 // Page.prototype.startRendering, but stops at one point and sends the 29655 // result back to the main thread. 29656 var gfx = new CanvasGraphics(null); 29657 29658 var start = Date.now(); 29659 29660 var dependency = []; 29661 var operatorList = null; 29662 try { 29663 var page = pdfModel.getPage(pageNum); 29664 // Pre compile the pdf page and fetch the fonts/images. 29665 operatorList = page.getOperatorList(handler, dependency); 29666 } catch (e) { 29667 var minimumStackMessage = 29668 'worker.js: while trying to getPage() and getOperatorList()'; 29669 29670 // Turn the error into an obj that can be serialized 29671 if (typeof e === 'string') { 29672 e = { 29673 message: e, 29674 stack: minimumStackMessage 29675 }; 29676 } else if (typeof e === 'object') { 29677 e = { 29678 message: e.message || e.toString(), 29679 stack: e.stack || minimumStackMessage 29680 }; 29681 } else { 29682 e = { 29683 message: 'Unknown exception type: ' + (typeof e), 29684 stack: minimumStackMessage 29685 }; 29686 } 29687 29688 handler.send('PageError', { 29689 pageNum: pageNum, 29690 error: e 29691 }); 29692 return; 29693 } 29694 29695 //comment out as it floods the logcat 29696 //PdfJS_window.console.log('page=%d - getOperatorList: time=%dms, len=%d', pageNum, 29697 // Date.now() - start, operatorList.fnArray.length); 29698 29699 // Filter the dependecies for fonts. 29700 var fonts = {}; 29701 for (var i = 0, ii = dependency.length; i < ii; i++) { 29702 var dep = dependency[i]; 29703 if (dep.indexOf('font_') == 0) { 29704 fonts[dep] = true; 29705 } 29706 } 29707 handler.send('RenderPage', { 29708 pageIndex: data.pageIndex, 29709 operatorList: operatorList, 29710 depFonts: Object.keys(fonts) 29711 }); 29712 }, this); 29713 } 29714 }; 29715 29716 var consoleTimer = {}; 29717 29718 var workerConsole = { 29719 log: function log() { 29720 var args = Array.prototype.slice.call(arguments); 29721 postMessage({ 29722 action: 'console_log', 29723 data: args 29724 }); 29725 }, 29726 29727 error: function error() { 29728 var args = Array.prototype.slice.call(arguments); 29729 postMessage({ 29730 action: 'console_error', 29731 data: args 29732 }); 29733 throw 'pdf.js execution error'; 29734 }, 29735 29736 time: function time(name) { 29737 consoleTimer[name] = Date.now(); 29738 }, 29739 29740 timeEnd: function timeEnd(name) { 29741 var time = consoleTimer[name]; 29742 if (time == null) { 29743 error('Unkown timer name ' + name); 29744 } 29745 this.log('Timer:', name, Date.now() - time); 29746 } 29747 }; 29748 29749 // Worker thread? 29750 if (typeof PdfJS_window.window === 'undefined') { 29751 globalScope.console = workerConsole; 29752 29753 var handler = new MessageHandler('worker_processor', this); 29754 WorkerMessageHandler.setup(handler); 29755 } 29756 29757 29758 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- / 29759 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ 29760 29761 // - The JPEG specification can be found in the ITU CCITT Recommendation T.81 29762 // (www.w3.org/Graphics/JPEG/itu-t81.pdf) 29763 // - The JFIF specification can be found in the JPEG File Interchange Format 29764 // (www.w3.org/Graphics/JPEG/jfif3.pdf) 29765 // - The Adobe Application-Specific JPEG markers in the Supporting the DCT Filters 29766 // in PostScript Level 2, Technical Note #5116 29767 // (partners.adobe.com/public/developer/en/ps/sdk/5116.DCT_Filter.pdf) 29768 29769 var JpegImage = (function jpegImage() { 29770 "use strict"; 29771 var dctZigZag = new Int32Array([ 29772 0, 29773 1, 8, 29774 16, 9, 2, 29775 3, 10, 17, 24, 29776 32, 25, 18, 11, 4, 29777 5, 12, 19, 26, 33, 40, 29778 48, 41, 34, 27, 20, 13, 6, 29779 7, 14, 21, 28, 35, 42, 49, 56, 29780 57, 50, 43, 36, 29, 22, 15, 29781 23, 30, 37, 44, 51, 58, 29782 59, 52, 45, 38, 31, 29783 39, 46, 53, 60, 29784 61, 54, 47, 29785 55, 62, 29786 63 29787 ]); 29788 29789 var dctCos1 = 4017 // cos(pi/16) 29790 var dctSin1 = 799 // sin(pi/16) 29791 var dctCos3 = 3406 // cos(3*pi/16) 29792 var dctSin3 = 2276 // sin(3*pi/16) 29793 var dctCos6 = 1567 // cos(6*pi/16) 29794 var dctSin6 = 3784 // sin(6*pi/16) 29795 var dctSqrt2 = 5793 // sqrt(2) 29796 var dctSqrt1d2 = 2896 // sqrt(2) / 2 29797 29798 function constructor() { 29799 } 29800 29801 function buildHuffmanTable(codeLengths, values) { 29802 var k = 0, code = [], i, j, length = 16; 29803 while (length > 0 && !codeLengths[length - 1]) 29804 length--; 29805 code.push({children: [], index: 0}); 29806 var p = code[0], q; 29807 for (i = 0; i < length; i++) { 29808 for (j = 0; j < codeLengths[i]; j++) { 29809 p = code.pop(); 29810 p.children[p.index] = values[k]; 29811 while (p.index > 0) { 29812 p = code.pop(); 29813 } 29814 p.index++; 29815 code.push(p); 29816 while (code.length <= i) { 29817 code.push(q = {children: [], index: 0}); 29818 p.children[p.index] = q.children; 29819 p = q; 29820 } 29821 k++; 29822 } 29823 if (i + 1 < length) { 29824 // p here points to last code 29825 code.push(q = {children: [], index: 0}); 29826 p.children[p.index] = q.children; 29827 p = q; 29828 } 29829 } 29830 return code[0].children; 29831 } 29832 29833 function decodeScan(data, offset, 29834 frame, components, resetInterval, 29835 spectralStart, spectralEnd, 29836 successivePrev, successive) { 29837 var precision = frame.precision; 29838 var samplesPerLine = frame.samplesPerLine; 29839 var scanLines = frame.scanLines; 29840 var mcusPerLine = frame.mcusPerLine; 29841 var progressive = frame.progressive; 29842 var maxH = frame.maxH, maxV = frame.maxV; 29843 29844 var startOffset = offset, bitsData = 0, bitsCount = 0; 29845 function readBit() { 29846 if (bitsCount > 0) { 29847 bitsCount--; 29848 return (bitsData >> bitsCount) & 1; 29849 } 29850 bitsData = data[offset++]; 29851 if (bitsData == 0xFF) { 29852 var nextByte = data[offset++]; 29853 if (nextByte) { 29854 throw "unexpected marker: " + ((bitsData << 8) | nextByte).toString(16); 29855 } 29856 // unstuff 0 29857 } 29858 bitsCount = 7; 29859 return bitsData >>> 7; 29860 } 29861 function decodeHuffman(tree) { 29862 var node = tree, bit; 29863 while ((bit = readBit()) !== null) { 29864 node = node[bit]; 29865 if (typeof node === 'number') 29866 return node; 29867 if (typeof node !== 'object') 29868 throw "invalid huffman sequence"; 29869 } 29870 return null; 29871 } 29872 function receive(length) { 29873 var n = 0; 29874 while (length > 0) { 29875 var bit = readBit(); 29876 if (bit === null) return; 29877 n = (n << 1) | bit; 29878 length--; 29879 } 29880 return n; 29881 } 29882 function receiveAndExtend(length) { 29883 var n = receive(length); 29884 if (n >= 1 << (length - 1)) 29885 return n; 29886 return n + (-1 << length) + 1; 29887 } 29888 function decodeBaseline(component, zz) { 29889 var t = decodeHuffman(component.huffmanTableDC); 29890 var diff = t === 0 ? 0 : receiveAndExtend(t); 29891 zz[0]= (component.pred += diff); 29892 var k = 1; 29893 while (k < 64) { 29894 var rs = decodeHuffman(component.huffmanTableAC); 29895 var s = rs & 15, r = rs >> 4; 29896 if (s === 0) { 29897 if (r < 15) 29898 break; 29899 k += 16; 29900 continue; 29901 } 29902 k += r; 29903 var z = dctZigZag[k]; 29904 zz[z] = receiveAndExtend(s); 29905 k++; 29906 } 29907 } 29908 function decodeDCFirst(component, zz) { 29909 var t = decodeHuffman(component.huffmanTableDC); 29910 var diff = t === 0 ? 0 : (receiveAndExtend(t) << successive); 29911 zz[0] = (component.pred += diff); 29912 } 29913 function decodeDCSuccessive(component, zz) { 29914 zz[0] |= readBit() << successive; 29915 } 29916 var eobrun = 0; 29917 function decodeACFirst(component, zz) { 29918 if (eobrun > 0) { 29919 eobrun--; 29920 return; 29921 } 29922 var k = spectralStart, e = spectralEnd; 29923 while (k <= e) { 29924 var rs = decodeHuffman(component.huffmanTableAC); 29925 var s = rs & 15, r = rs >> 4; 29926 if (s === 0) { 29927 if (r < 15) { 29928 eobrun = receive(r) + (1 << r) - 1; 29929 break; 29930 } 29931 k += 16; 29932 continue; 29933 } 29934 k += r; 29935 var z = dctZigZag[k]; 29936 zz[z] = receiveAndExtend(s) * (1 << successive); 29937 k++; 29938 } 29939 } 29940 var successiveACState = 0, successiveACNextValue; 29941 function decodeACSuccessive(component, zz) { 29942 var k = spectralStart, e = spectralEnd, r = 0; 29943 while (k <= e) { 29944 var z = dctZigZag[k]; 29945 switch (successiveACState) { 29946 case 0: // initial state 29947 var rs = decodeHuffman(component.huffmanTableAC); 29948 var s = rs & 15, r = rs >> 4; 29949 if (s === 0) { 29950 if (r < 15) { 29951 eobrun = receive(r) + (1 << r); 29952 successiveACState = 4; 29953 } else { 29954 r = 16; 29955 successiveACState = 1; 29956 } 29957 } else { 29958 if (s !== 1) 29959 throw "invalid ACn encoding"; 29960 successiveACNextValue = receiveAndExtend(s); 29961 successiveACState = r ? 2 : 3; 29962 } 29963 continue; 29964 case 1: // skipping r zero items 29965 case 2: 29966 if (zz[z]) 29967 zz[z] += (readBit() << successive); 29968 else { 29969 r--; 29970 if (r === 0) 29971 successiveACState = successiveACState == 2 ? 3 : 0; 29972 } 29973 break; 29974 case 3: // set value for a zero item 29975 if (zz[z]) 29976 zz[z] += (readBit() << successive); 29977 else { 29978 zz[z] = successiveACNextValue << successive; 29979 successiveACState = 0; 29980 } 29981 break; 29982 case 4: // eob 29983 if (zz[z]) 29984 zz[z] += (readBit() << successive); 29985 break; 29986 } 29987 k++; 29988 } 29989 if (successiveACState === 4) { 29990 eobrun--; 29991 if (eobrun === 0) 29992 successiveACState = 0; 29993 } 29994 } 29995 function decodeMcu(component, decode, mcu, row, col) { 29996 var mcuRow = (mcu / mcusPerLine) | 0; 29997 var mcuCol = mcu % mcusPerLine; 29998 var blockRow = mcuRow * component.v + row; 29999 var blockCol = mcuCol * component.h + col; 30000 decode(component, component.blocks[blockRow][blockCol]); 30001 } 30002 function decodeBlock(component, decode, mcu) { 30003 var blockRow = (mcu / component.blocksPerLine) | 0; 30004 var blockCol = mcu % component.blocksPerLine; 30005 decode(component, component.blocks[blockRow][blockCol]); 30006 } 30007 30008 var componentsLength = components.length; 30009 var component, i, j, k, n; 30010 var decodeFn; 30011 if (progressive) { 30012 if (spectralStart === 0) 30013 decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive; 30014 else 30015 decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive; 30016 } else { 30017 decodeFn = decodeBaseline; 30018 } 30019 30020 var mcu = 0, marker; 30021 var mcuExpected; 30022 if (componentsLength == 1) { 30023 mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn; 30024 } else { 30025 mcuExpected = mcusPerLine * frame.mcusPerColumn; 30026 } 30027 if (!resetInterval) resetInterval = mcuExpected; 30028 30029 var h, v; 30030 while (mcu < mcuExpected) { 30031 // reset interval stuff 30032 for (i = 0; i < componentsLength; i++) 30033 components[i].pred = 0; 30034 eobrun = 0; 30035 30036 if (componentsLength == 1) { 30037 component = components[0]; 30038 for (n = 0; n < resetInterval; n++) { 30039 decodeBlock(component, decodeFn, mcu); 30040 mcu++; 30041 } 30042 } else { 30043 for (n = 0; n < resetInterval; n++) { 30044 for (i = 0; i < componentsLength; i++) { 30045 component = components[i]; 30046 h = component.h; 30047 v = component.v; 30048 for (j = 0; j < v; j++) { 30049 for (k = 0; k < h; k++) { 30050 decodeMcu(component, decodeFn, mcu, j, k); 30051 } 30052 } 30053 } 30054 mcu++; 30055 } 30056 } 30057 30058 // find marker 30059 bitsCount = 0; 30060 marker = (data[offset] << 8) | data[offset + 1]; 30061 if (marker <= 0xFF00) { 30062 throw "marker was not found"; 30063 } 30064 30065 if (marker >= 0xFFD0 && marker <= 0xFFD7) { // RSTx 30066 offset += 2; 30067 } 30068 else 30069 break; 30070 } 30071 30072 return offset - startOffset; 30073 } 30074 30075 function buildComponentData(frame, component) { 30076 var lines = []; 30077 var blocksPerLine = component.blocksPerLine; 30078 var blocksPerColumn = component.blocksPerColumn; 30079 var samplesPerLine = blocksPerLine << 3; 30080 var R = new Int32Array(64), r = new Uint8Array(64); 30081 30082 // A port of poppler's IDCT method which in turn is taken from: 30083 // Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz, 30084 // "Practical Fast 1-D DCT Algorithms with 11 Multiplications", 30085 // IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989, 30086 // 988-991. 30087 function quantizeAndInverse(zz, dataOut, dataIn) { 30088 var qt = component.quantizationTable; 30089 var v0, v1, v2, v3, v4, v5, v6, v7, t; 30090 var p = dataIn; 30091 var i; 30092 30093 // dequant 30094 for (i = 0; i < 64; i++) 30095 p[i] = zz[i] * qt[i]; 30096 30097 // inverse DCT on rows 30098 for (i = 0; i < 8; ++i) { 30099 var row = 8 * i; 30100 30101 // check for all-zero AC coefficients 30102 if (p[1 + row] == 0 && p[2 + row] == 0 && p[3 + row] == 0 && 30103 p[4 + row] == 0 && p[5 + row] == 0 && p[6 + row] == 0 && 30104 p[7 + row] == 0) { 30105 t = (dctSqrt2 * p[0 + row] + 512) >> 10; 30106 p[0 + row] = t; 30107 p[1 + row] = t; 30108 p[2 + row] = t; 30109 p[3 + row] = t; 30110 p[4 + row] = t; 30111 p[5 + row] = t; 30112 p[6 + row] = t; 30113 p[7 + row] = t; 30114 continue; 30115 } 30116 30117 // stage 4 30118 v0 = (dctSqrt2 * p[0 + row] + 128) >> 8; 30119 v1 = (dctSqrt2 * p[4 + row] + 128) >> 8; 30120 v2 = p[2 + row]; 30121 v3 = p[6 + row]; 30122 v4 = (dctSqrt1d2 * (p[1 + row] - p[7 + row]) + 128) >> 8; 30123 v7 = (dctSqrt1d2 * (p[1 + row] + p[7 + row]) + 128) >> 8; 30124 v5 = p[3 + row] << 4; 30125 v6 = p[5 + row] << 4; 30126 30127 // stage 3 30128 t = (v0 - v1+ 1) >> 1; 30129 v0 = (v0 + v1 + 1) >> 1; 30130 v1 = t; 30131 t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8; 30132 v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8; 30133 v3 = t; 30134 t = (v4 - v6 + 1) >> 1; 30135 v4 = (v4 + v6 + 1) >> 1; 30136 v6 = t; 30137 t = (v7 + v5 + 1) >> 1; 30138 v5 = (v7 - v5 + 1) >> 1; 30139 v7 = t; 30140 30141 // stage 2 30142 t = (v0 - v3 + 1) >> 1; 30143 v0 = (v0 + v3 + 1) >> 1; 30144 v3 = t; 30145 t = (v1 - v2 + 1) >> 1; 30146 v1 = (v1 + v2 + 1) >> 1; 30147 v2 = t; 30148 t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12; 30149 v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12; 30150 v7 = t; 30151 t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12; 30152 v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12; 30153 v6 = t; 30154 30155 // stage 1 30156 p[0 + row] = v0 + v7; 30157 p[7 + row] = v0 - v7; 30158 p[1 + row] = v1 + v6; 30159 p[6 + row] = v1 - v6; 30160 p[2 + row] = v2 + v5; 30161 p[5 + row] = v2 - v5; 30162 p[3 + row] = v3 + v4; 30163 p[4 + row] = v3 - v4; 30164 } 30165 30166 // inverse DCT on columns 30167 for (i = 0; i < 8; ++i) { 30168 var col = i; 30169 30170 // check for all-zero AC coefficients 30171 if (p[1*8 + col] == 0 && p[2*8 + col] == 0 && p[3*8 + col] == 0 && 30172 p[4*8 + col] == 0 && p[5*8 + col] == 0 && p[6*8 + col] == 0 && 30173 p[7*8 + col] == 0) { 30174 t = (dctSqrt2 * dataIn[i+0] + 8192) >> 14; 30175 p[0*8 + col] = t; 30176 p[1*8 + col] = t; 30177 p[2*8 + col] = t; 30178 p[3*8 + col] = t; 30179 p[4*8 + col] = t; 30180 p[5*8 + col] = t; 30181 p[6*8 + col] = t; 30182 p[7*8 + col] = t; 30183 continue; 30184 } 30185 30186 // stage 4 30187 v0 = (dctSqrt2 * p[0*8 + col] + 2048) >> 12; 30188 v1 = (dctSqrt2 * p[4*8 + col] + 2048) >> 12; 30189 v2 = p[2*8 + col]; 30190 v3 = p[6*8 + col]; 30191 v4 = (dctSqrt1d2 * (p[1*8 + col] - p[7*8 + col]) + 2048) >> 12; 30192 v7 = (dctSqrt1d2 * (p[1*8 + col] + p[7*8 + col]) + 2048) >> 12; 30193 v5 = p[3*8 + col]; 30194 v6 = p[5*8 + col]; 30195 30196 // stage 3 30197 t = (v0 - v1 + 1) >> 1; 30198 v0 = (v0 + v1 + 1) >> 1; 30199 v1 = t; 30200 t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12; 30201 v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12; 30202 v3 = t; 30203 t = (v4 - v6 + 1) >> 1; 30204 v4 = (v4 + v6 + 1) >> 1; 30205 v6 = t; 30206 t = (v7 + v5 + 1) >> 1; 30207 v5 = (v7 - v5 + 1) >> 1; 30208 v7 = t; 30209 30210 // stage 2 30211 t = (v0 - v3 + 1) >> 1; 30212 v0 = (v0 + v3 + 1) >> 1; 30213 v3 = t; 30214 t = (v1 - v2 + 1) >> 1; 30215 v1 = (v1 + v2 + 1) >> 1; 30216 v2 = t; 30217 t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12; 30218 v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12; 30219 v7 = t; 30220 t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12; 30221 v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12; 30222 v6 = t; 30223 30224 // stage 1 30225 p[0*8 + col] = v0 + v7; 30226 p[7*8 + col] = v0 - v7; 30227 p[1*8 + col] = v1 + v6; 30228 p[6*8 + col] = v1 - v6; 30229 p[2*8 + col] = v2 + v5; 30230 p[5*8 + col] = v2 - v5; 30231 p[3*8 + col] = v3 + v4; 30232 p[4*8 + col] = v3 - v4; 30233 } 30234 30235 // convert to 8-bit integers 30236 for (i = 0; i < 64; ++i) { 30237 var sample = 128 + ((p[i] + 8) >> 4); 30238 dataOut[i] = sample < 0 ? 0 : sample > 0xFF ? 0xFF : sample; 30239 } 30240 } 30241 30242 var i, j; 30243 for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) { 30244 var scanLine = blockRow << 3; 30245 for (i = 0; i < 8; i++) 30246 lines.push(new Uint8Array(samplesPerLine)); 30247 for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) { 30248 quantizeAndInverse(component.blocks[blockRow][blockCol], r, R); 30249 30250 var offset = 0, sample = blockCol << 3; 30251 for (j = 0; j < 8; j++) { 30252 var line = lines[scanLine + j]; 30253 for (i = 0; i < 8; i++) 30254 line[sample + i] = r[offset++]; 30255 } 30256 } 30257 } 30258 return lines; 30259 } 30260 30261 constructor.prototype = { 30262 load: function load(path) { 30263 var xhr = new PdfJS_window.XMLHttpRequest(); 30264 xhr.open("GET", path, true); 30265 xhr.responseType = "arraybuffer"; 30266 xhr.onload = (function() { 30267 // TODO catch parse error 30268 var data = new Uint8Array(xhr.response || xhr.mozResponseArrayBuffer); 30269 this.parse(data); 30270 if (this.onload) 30271 this.onload(); 30272 }).bind(this); 30273 xhr.send(null); 30274 }, 30275 parse: function parse(data) { 30276 var offset = 0, length = data.length; 30277 function readUint16() { 30278 var value = (data[offset] << 8) | data[offset + 1]; 30279 offset += 2; 30280 return value; 30281 } 30282 function readDataBlock() { 30283 var length = readUint16(); 30284 var array = data.subarray(offset, offset + length - 2); 30285 offset += array.length; 30286 return array; 30287 } 30288 function prepareComponents(frame) { 30289 var maxH = 0, maxV = 0; 30290 var component, componentId; 30291 for (componentId in frame.components) { 30292 if (frame.components.hasOwnProperty(componentId)) { 30293 component = frame.components[componentId]; 30294 if (maxH < component.h) maxH = component.h; 30295 if (maxV < component.v) maxV = component.v; 30296 } 30297 } 30298 var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / maxH); 30299 var mcusPerColumn = Math.ceil(frame.scanLines / 8 / maxV); 30300 for (componentId in frame.components) { 30301 if (frame.components.hasOwnProperty(componentId)) { 30302 component = frame.components[componentId]; 30303 var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) * component.h / maxH); 30304 var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) * component.v / maxV); 30305 var blocksPerLineForMcu = mcusPerLine * component.h; 30306 var blocksPerColumnForMcu = mcusPerColumn * component.v; 30307 var blocks = []; 30308 for (var i = 0; i < blocksPerColumnForMcu; i++) { 30309 var row = []; 30310 for (var j = 0; j < blocksPerLineForMcu; j++) 30311 row.push(new Int32Array(64)); 30312 blocks.push(row); 30313 } 30314 component.blocksPerLine = blocksPerLine; 30315 component.blocksPerColumn = blocksPerColumn; 30316 component.blocks = blocks; 30317 } 30318 } 30319 frame.maxH = maxH; 30320 frame.maxV = maxV; 30321 frame.mcusPerLine = mcusPerLine; 30322 frame.mcusPerColumn = mcusPerColumn; 30323 } 30324 var jfif = null; 30325 var adobe = null; 30326 var pixels = null; 30327 var frame, resetInterval; 30328 var quantizationTables = [], frames = []; 30329 var huffmanTablesAC = [], huffmanTablesDC = []; 30330 var fileMarker = readUint16(); 30331 if (fileMarker != 0xFFD8) { // SOI (Start of Image) 30332 throw "SOI not found"; 30333 } 30334 30335 fileMarker = readUint16(); 30336 while (fileMarker != 0xFFD9) { // EOI (End of image) 30337 var i, j, l; 30338 switch(fileMarker) { 30339 case 0xFFE0: // APP0 (Application Specific) 30340 case 0xFFE1: // APP1 30341 case 0xFFE2: // APP2 30342 case 0xFFE3: // APP3 30343 case 0xFFE4: // APP4 30344 case 0xFFE5: // APP5 30345 case 0xFFE6: // APP6 30346 case 0xFFE7: // APP7 30347 case 0xFFE8: // APP8 30348 case 0xFFE9: // APP9 30349 case 0xFFEA: // APP10 30350 case 0xFFEB: // APP11 30351 case 0xFFEC: // APP12 30352 case 0xFFED: // APP13 30353 case 0xFFEE: // APP14 30354 case 0xFFEF: // APP15 30355 case 0xFFFE: // COM (Comment) 30356 var appData = readDataBlock(); 30357 30358 if (fileMarker === 0xFFE0) { 30359 if (appData[0] === 0x4A && appData[1] === 0x46 && appData[2] === 0x49 && 30360 appData[3] === 0x46 && appData[4] === 0) { // 'JFIF\x00' 30361 jfif = { 30362 version: { major: appData[5], minor: appData[6] }, 30363 densityUnits: appData[7], 30364 xDensity: (appData[8] << 8) | appData[9], 30365 yDensity: (appData[10] << 8) | appData[11], 30366 thumbWidth: appData[12], 30367 thumbHeight: appData[13], 30368 thumbData: appData.subarray(14, 14 + 3 * appData[12] * appData[13]) 30369 }; 30370 } 30371 } 30372 // TODO APP1 - Exif 30373 if (fileMarker === 0xFFEE) { 30374 if (appData[0] === 0x41 && appData[1] === 0x64 && appData[2] === 0x6F && 30375 appData[3] === 0x62 && appData[4] === 0x65 && appData[5] === 0) { // 'Adobe\x00' 30376 adobe = { 30377 version: appData[6], 30378 flags0: (appData[7] << 8) | appData[8], 30379 flags1: (appData[9] << 8) | appData[10], 30380 transformCode: appData[11] 30381 }; 30382 } 30383 } 30384 break; 30385 30386 case 0xFFDB: // DQT (Define Quantization Tables) 30387 var quantizationTableCount = Math.floor((readUint16() - 2) / 65); 30388 for (i = 0; i < quantizationTableCount; i++) { 30389 var quantizationTableSpec = data[offset++]; 30390 var tableData = new Int32Array(64); 30391 if ((quantizationTableSpec >> 4) === 0) { // 8 bit values 30392 for (j = 0; j < 64; j++) { 30393 var z = dctZigZag[j]; 30394 tableData[z] = data[offset++]; 30395 } 30396 } else if ((quantizationTableSpec >> 4) === 1) { //16 bit 30397 for (j = 0; j < 64; j++) { 30398 var z = dctZigZag[j]; 30399 tableData[z] = readUint16(); 30400 } 30401 } else 30402 throw "DQT: invalid table spec"; 30403 quantizationTables[quantizationTableSpec & 15] = tableData; 30404 } 30405 break; 30406 30407 case 0xFFC0: // SOF0 (Start of Frame, Baseline DCT) 30408 case 0xFFC2: // SOF2 (Start of Frame, Progressive DCT) 30409 readUint16(); // skip data length 30410 frame = {}; 30411 frame.progressive = (fileMarker === 0xFFC2); 30412 frame.precision = data[offset++]; 30413 frame.scanLines = readUint16(); 30414 frame.samplesPerLine = readUint16(); 30415 frame.components = {}; 30416 frame.componentsOrder = []; 30417 var componentsCount = data[offset++], componentId; 30418 var maxH = 0, maxV = 0; 30419 for (i = 0; i < componentsCount; i++) { 30420 componentId = data[offset]; 30421 var h = data[offset + 1] >> 4; 30422 var v = data[offset + 1] & 15; 30423 var qId = data[offset + 2]; 30424 frame.componentsOrder.push(componentId); 30425 frame.components[componentId] = { 30426 h: h, 30427 v: v, 30428 quantizationTable: quantizationTables[qId] 30429 }; 30430 offset += 3; 30431 } 30432 prepareComponents(frame); 30433 frames.push(frame); 30434 break; 30435 30436 case 0xFFC4: // DHT (Define Huffman Tables) 30437 var huffmanLength = readUint16(); 30438 for (i = 2; i < huffmanLength;) { 30439 var huffmanTableSpec = data[offset++]; 30440 var codeLengths = new Uint8Array(16); 30441 var codeLengthSum = 0; 30442 for (j = 0; j < 16; j++, offset++) 30443 codeLengthSum += (codeLengths[j] = data[offset]); 30444 var huffmanValues = new Uint8Array(codeLengthSum); 30445 for (j = 0; j < codeLengthSum; j++, offset++) 30446 huffmanValues[j] = data[offset]; 30447 i += 17 + codeLengthSum; 30448 30449 ((huffmanTableSpec >> 4) === 0 ? 30450 huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] = 30451 buildHuffmanTable(codeLengths, huffmanValues); 30452 } 30453 break; 30454 30455 case 0xFFDD: // DRI (Define Restart Interval) 30456 readUint16(); // skip data length 30457 resetInterval = readUint16(); 30458 break; 30459 30460 case 0xFFDA: // SOS (Start of Scan) 30461 var scanLength = readUint16(); 30462 var selectorsCount = data[offset++]; 30463 var components = [], component; 30464 for (i = 0; i < selectorsCount; i++) { 30465 component = frame.components[data[offset++]]; 30466 var tableSpec = data[offset++]; 30467 component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4]; 30468 component.huffmanTableAC = huffmanTablesAC[tableSpec & 15]; 30469 components.push(component); 30470 } 30471 var spectralStart = data[offset++]; 30472 var spectralEnd = data[offset++]; 30473 var successiveApproximation = data[offset++]; 30474 var processed = decodeScan(data, offset, 30475 frame, components, resetInterval, 30476 spectralStart, spectralEnd, 30477 successiveApproximation >> 4, successiveApproximation & 15); 30478 offset += processed; 30479 break; 30480 default: 30481 throw "unknown JPEG marker " + fileMarker.toString(16); 30482 } 30483 fileMarker = readUint16(); 30484 } 30485 if (frames.length != 1) 30486 throw "only single frame JPEGs supported"; 30487 30488 this.width = frame.samplesPerLine; 30489 this.height = frame.scanLines; 30490 this.jfif = jfif; 30491 this.adobe = adobe; 30492 this.components = []; 30493 for (var i = 0; i < frame.componentsOrder.length; i++) { 30494 var component = frame.components[frame.componentsOrder[i]]; 30495 this.components.push({ 30496 lines: buildComponentData(frame, component), 30497 scaleX: component.h / frame.maxH, 30498 scaleY: component.v / frame.maxV 30499 }); 30500 } 30501 }, 30502 getData: function getData(width, height) { 30503 function clampTo8bit(a) { 30504 return a < 0 ? 0 : a > 255 ? 255 : a; 30505 } 30506 var scaleX = this.width / width, scaleY = this.height / height; 30507 30508 var component1, component2, component3, component4; 30509 var component1Line, component2Line, component3Line, component4Line; 30510 var x, y; 30511 var offset = 0; 30512 var Y, Cb, Cr, K, C, M, Ye, R, G, B; 30513 var colorTransform; 30514 var dataLength = width * height * this.components.length; 30515 var data = new Uint8Array(dataLength); 30516 switch (this.components.length) { 30517 case 1: 30518 component1 = this.components[0]; 30519 for (y = 0; y < height; y++) { 30520 component1Line = component1.lines[0 | (y * component1.scaleY * scaleY)]; 30521 for (x = 0; x < width; x++) { 30522 Y = component1Line[0 | (x * component1.scaleX * scaleX)]; 30523 30524 data[offset++] = Y; 30525 } 30526 } 30527 break; 30528 case 3: 30529 // The default transform for three components is true 30530 colorTransform = true; 30531 // The adobe transform marker overrides any previous setting 30532 if (this.adobe && this.adobe.transformCode) 30533 colorTransform = true; 30534 else if (typeof this.colorTransform !== 'undefined') 30535 colorTransform = !!this.colorTransform; 30536 30537 component1 = this.components[0]; 30538 component2 = this.components[1]; 30539 component3 = this.components[2]; 30540 for (y = 0; y < height; y++) { 30541 component1Line = component1.lines[0 | (y * component1.scaleY * scaleY)]; 30542 component2Line = component2.lines[0 | (y * component2.scaleY * scaleY)]; 30543 component3Line = component3.lines[0 | (y * component3.scaleY * scaleY)]; 30544 for (x = 0; x < width; x++) { 30545 if (!colorTransform) { 30546 R = component1Line[0 | (x * component1.scaleX * scaleX)]; 30547 G = component2Line[0 | (x * component2.scaleX * scaleX)]; 30548 B = component3Line[0 | (x * component3.scaleX * scaleX)]; 30549 } else { 30550 Y = component1Line[0 | (x * component1.scaleX * scaleX)]; 30551 Cb = component2Line[0 | (x * component2.scaleX * scaleX)]; 30552 Cr = component3Line[0 | (x * component3.scaleX * scaleX)]; 30553 30554 R = clampTo8bit(Y + 1.402 * (Cr - 128)); 30555 G = clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128)); 30556 B = clampTo8bit(Y + 1.772 * (Cb - 128)); 30557 } 30558 30559 data[offset++] = R; 30560 data[offset++] = G; 30561 data[offset++] = B; 30562 } 30563 } 30564 break; 30565 case 4: 30566 if (!this.adobe) 30567 throw 'Unsupported color mode (4 components)'; 30568 // The default transform for four components is false 30569 colorTransform = false; 30570 // The adobe transform marker overrides any previous setting 30571 if (this.adobe && this.adobe.transformCode) 30572 colorTransform = true; 30573 else if (typeof this.colorTransform !== 'undefined') 30574 colorTransform = !!this.colorTransform; 30575 30576 component1 = this.components[0]; 30577 component2 = this.components[1]; 30578 component3 = this.components[2]; 30579 component4 = this.components[3]; 30580 for (y = 0; y < height; y++) { 30581 component1Line = component1.lines[0 | (y * component1.scaleY * scaleY)]; 30582 component2Line = component2.lines[0 | (y * component2.scaleY * scaleY)]; 30583 component3Line = component3.lines[0 | (y * component3.scaleY * scaleY)]; 30584 component4Line = component4.lines[0 | (y * component4.scaleY * scaleY)]; 30585 for (x = 0; x < width; x++) { 30586 if (!colorTransform) { 30587 C = component1Line[0 | (x * component1.scaleX * scaleX)]; 30588 M = component2Line[0 | (x * component2.scaleX * scaleX)]; 30589 Ye = component3Line[0 | (x * component3.scaleX * scaleX)]; 30590 K = component4Line[0 | (x * component4.scaleX * scaleX)]; 30591 } else { 30592 Y = component1Line[0 | (x * component1.scaleX * scaleX)]; 30593 Cb = component2Line[0 | (x * component2.scaleX * scaleX)]; 30594 Cr = component3Line[0 | (x * component3.scaleX * scaleX)]; 30595 K = component4Line[0 | (x * component4.scaleX * scaleX)]; 30596 30597 C = 255 - clampTo8bit(Y + 1.402 * (Cr - 128)); 30598 M = 255 - clampTo8bit(Y - 0.3441363 * (Cb - 128) - 0.71413636 * (Cr - 128)); 30599 Ye = 255 - clampTo8bit(Y + 1.772 * (Cb - 128)); 30600 } 30601 data[offset++] = C; 30602 data[offset++] = M; 30603 data[offset++] = Ye; 30604 data[offset++] = K; 30605 } 30606 } 30607 break; 30608 default: 30609 throw 'Unsupported color mode'; 30610 } 30611 return data; 30612 }, 30613 copyToImageData: function copyToImageData(imageData) { 30614 var width = imageData.width, height = imageData.height; 30615 var imageDataArray = imageData.data; 30616 var data = this.getData(width, height); 30617 var i = 0, j = 0, x, y; 30618 var Y, K, C, M, R, G, B; 30619 switch (this.components.length) { 30620 case 1: 30621 for (y = 0; y < height; y++) { 30622 for (x = 0; x < width; x++) { 30623 Y = data[i++]; 30624 30625 imageDataArray[j++] = Y; 30626 imageDataArray[j++] = Y; 30627 imageDataArray[j++] = Y; 30628 imageDataArray[j++] = 255; 30629 } 30630 } 30631 break; 30632 case 3: 30633 for (y = 0; y < height; y++) { 30634 for (x = 0; x < width; x++) { 30635 R = data[i++]; 30636 G = data[i++]; 30637 B = data[i++]; 30638 30639 imageDataArray[j++] = R; 30640 imageDataArray[j++] = G; 30641 imageDataArray[j++] = B; 30642 imageDataArray[j++] = 255; 30643 } 30644 } 30645 break; 30646 case 4: 30647 for (y = 0; y < height; y++) { 30648 for (x = 0; x < width; x++) { 30649 C = data[i++]; 30650 M = data[i++]; 30651 Y = data[i++]; 30652 K = data[i++]; 30653 30654 R = 255 - clampTo8bit(C * (1 - K / 255) + K); 30655 G = 255 - clampTo8bit(M * (1 - K / 255) + K); 30656 B = 255 - clampTo8bit(Y * (1 - K / 255) + K); 30657 30658 imageDataArray[j++] = R; 30659 imageDataArray[j++] = G; 30660 imageDataArray[j++] = B; 30661 imageDataArray[j++] = 255; 30662 } 30663 } 30664 break; 30665 default: 30666 throw 'Unsupported color mode'; 30667 } 30668 } 30669 }; 30670 30671 return constructor; 30672 })(); 30673 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 30674 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ 30675 30676 'use strict'; 30677 30678 var JpxImage = (function JpxImageClosure() { 30679 // Table E.1 30680 var SubbandsGainLog2 = { 30681 'LL': 0, 30682 'LH': 1, 30683 'HL': 1, 30684 'HH': 2 30685 }; 30686 function JpxImage() { 30687 this.failOnCorruptedImage = false; 30688 } 30689 JpxImage.prototype = { 30690 load: function JpxImage_load(url) { 30691 var xhr = new PdfJS_window.XMLHttpRequest(); 30692 xhr.open('GET', url, true); 30693 xhr.responseType = 'arraybuffer'; 30694 xhr.onload = (function() { 30695 // TODO catch parse error 30696 var data = new Uint8Array(xhr.response || xhr.mozResponseArrayBuffer); 30697 this.parse(data); 30698 if (this.onload) 30699 this.onload(); 30700 }).bind(this); 30701 xhr.send(null); 30702 }, 30703 parse: function JpxImage_parse(data) { 30704 function ReadUint(data, offset, bytes) { 30705 var n = 0; 30706 for (var i = 0; i < bytes; i++) 30707 n = n * 256 + (data[offset + i] & 0xFF); 30708 return n; 30709 } 30710 var position = 0, length = data.length; 30711 while (position < length) { 30712 var headerSize = 8; 30713 var lbox = ReadUint(data, position, 4); 30714 var tbox = ReadUint(data, position + 4, 4); 30715 position += headerSize; 30716 if (lbox == 1) { 30717 lbox = ReadUint(data, position, 8); 30718 position += 8; 30719 headerSize += 8; 30720 } 30721 if (lbox == 0) 30722 lbox = length - position + headerSize; 30723 if (lbox < headerSize) 30724 error('JPX error: Invalid box field size'); 30725 var dataLength = lbox - headerSize; 30726 var jumpDataLength = true; 30727 switch (tbox) { 30728 case 0x6A501A1A: // 'jP\032\032' 30729 // TODO 30730 break; 30731 case 0x6A703268: // 'jp2h' 30732 jumpDataLength = false; // parsing child boxes 30733 break; 30734 case 0x636F6C72: // 'colr' 30735 // TODO 30736 break; 30737 case 0x6A703263: // 'jp2c' 30738 this.parseCodestream(data, position, position + dataLength); 30739 break; 30740 } 30741 if (jumpDataLength) 30742 position += dataLength; 30743 } 30744 }, 30745 parseCodestream: function JpxImage_parseCodestream(data, start, end) { 30746 var context = {}; 30747 try { 30748 var position = start; 30749 while (position < end) { 30750 var code = readUint16(data, position); 30751 position += 2; 30752 30753 var length = 0, j; 30754 switch (code) { 30755 case 0xFF4F: // Start of codestream (SOC) 30756 context.mainHeader = true; 30757 break; 30758 case 0xFFD9: // End of codestream (EOC) 30759 break; 30760 case 0xFF51: // Image and tile size (SIZ) 30761 length = readUint16(data, position); 30762 var siz = {}; 30763 siz.Xsiz = readUint32(data, position + 4); 30764 siz.Ysiz = readUint32(data, position + 8); 30765 siz.XOsiz = readUint32(data, position + 12); 30766 siz.YOsiz = readUint32(data, position + 16); 30767 siz.XTsiz = readUint32(data, position + 20); 30768 siz.YTsiz = readUint32(data, position + 24); 30769 siz.XTOsiz = readUint32(data, position + 28); 30770 siz.YTOsiz = readUint32(data, position + 32); 30771 var componentsCount = readUint16(data, position + 36); 30772 siz.Csiz = componentsCount; 30773 var components = []; 30774 j = position + 38; 30775 for (var i = 0; i < componentsCount; i++) { 30776 var component = { 30777 precision: (data[j] & 0x7F) + 1, 30778 isSigned: !!(data[j] & 0x80), 30779 XRsiz: data[j + 1], 30780 YRsiz: data[j + 1] 30781 }; 30782 calculateComponentDimensions(component, siz); 30783 components.push(component); 30784 } 30785 context.SIZ = siz; 30786 context.components = components; 30787 calculateTileGrids(context, components); 30788 context.QCC = []; 30789 context.COC = []; 30790 break; 30791 case 0xFF5C: // Quantization default (QCD) 30792 length = readUint16(data, position); 30793 var qcd = {}; 30794 j = position + 2; 30795 var sqcd = data[j++]; 30796 var spqcdSize, scalarExpounded; 30797 switch (sqcd & 0x1F) { 30798 case 0: 30799 spqcdSize = 8; 30800 scalarExpounded = true; 30801 break; 30802 case 1: 30803 spqcdSize = 16; 30804 scalarExpounded = false; 30805 break; 30806 case 2: 30807 spqcdSize = 16; 30808 scalarExpounded = true; 30809 break; 30810 default: 30811 throw 'Invalid SQcd value ' + sqcd; 30812 } 30813 qcd.noQuantization = spqcdSize == 8; 30814 qcd.scalarExpounded = scalarExpounded; 30815 qcd.guardBits = sqcd >> 5; 30816 var spqcds = []; 30817 while (j < length + position) { 30818 var spqcd = {}; 30819 if (spqcdSize == 8) { 30820 spqcd.epsilon = data[j++] >> 3; 30821 spqcd.mu = 0; 30822 } else { 30823 spqcd.epsilon = data[j] >> 3; 30824 spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1]; 30825 j += 2; 30826 } 30827 spqcds.push(spqcd); 30828 } 30829 qcd.SPqcds = spqcds; 30830 if (context.mainHeader) 30831 context.QCD = qcd; 30832 else { 30833 context.currentTile.QCD = qcd; 30834 context.currentTile.QCC = []; 30835 } 30836 break; 30837 case 0xFF5D: // Quantization component (QCC) 30838 length = readUint16(data, position); 30839 var qcc = {}; 30840 j = position + 2; 30841 var cqcc; 30842 if (context.SIZ.Csiz < 257) 30843 cqcc = data[j++]; 30844 else { 30845 cqcc = readUint16(data, j); 30846 j += 2; 30847 } 30848 var sqcd = data[j++]; 30849 var spqcdSize, scalarExpounded; 30850 switch (sqcd & 0x1F) { 30851 case 0: 30852 spqcdSize = 8; 30853 scalarExpounded = true; 30854 break; 30855 case 1: 30856 spqcdSize = 16; 30857 scalarExpounded = false; 30858 break; 30859 case 2: 30860 spqcdSize = 16; 30861 scalarExpounded = true; 30862 break; 30863 default: 30864 throw 'Invalid SQcd value ' + sqcd; 30865 } 30866 qcc.noQuantization = spqcdSize == 8; 30867 qcc.scalarExpounded = scalarExpounded; 30868 qcc.guardBits = sqcd >> 5; 30869 var spqcds = []; 30870 while (j < length + position) { 30871 var spqcd = {}; 30872 if (spqcdSize == 8) { 30873 spqcd.epsilon = data[j++] >> 3; 30874 spqcd.mu = 0; 30875 } else { 30876 spqcd.epsilon = data[j] >> 3; 30877 spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1]; 30878 j += 2; 30879 } 30880 spqcds.push(spqcd); 30881 } 30882 qcc.SPqcds = spqcds; 30883 if (context.mainHeader) 30884 context.QCC[cqcc] = qcc; 30885 else 30886 context.currentTile.QCC[cqcc] = qcc; 30887 break; 30888 case 0xFF52: // Coding style default (COD) 30889 length = readUint16(data, position); 30890 var cod = {}; 30891 j = position + 2; 30892 var scod = data[j++]; 30893 cod.entropyCoderWithCustomPrecincts = !!(scod & 1); 30894 cod.sopMarkerUsed = !!(scod & 2); 30895 cod.ephMarkerUsed = !!(scod & 4); 30896 var codingStyle = {}; 30897 cod.progressionOrder = data[j++]; 30898 cod.layersCount = readUint16(data, j); 30899 j += 2; 30900 cod.multipleComponentTransform = data[j++]; 30901 30902 cod.decompositionLevelsCount = data[j++]; 30903 cod.xcb = (data[j++] & 0xF) + 2; 30904 cod.ycb = (data[j++] & 0xF) + 2; 30905 var blockStyle = data[j++]; 30906 cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1); 30907 cod.resetContextProbabilities = !!(blockStyle & 2); 30908 cod.terminationOnEachCodingPass = !!(blockStyle & 4); 30909 cod.verticalyStripe = !!(blockStyle & 8); 30910 cod.predictableTermination = !!(blockStyle & 16); 30911 cod.segmentationSymbolUsed = !!(blockStyle & 32); 30912 cod.transformation = data[j++]; 30913 if (cod.entropyCoderWithCustomPrecincts) { 30914 var precinctsSizes = {}; 30915 while (j < length + position) { 30916 var precinctsSize = data[j]; 30917 precinctsSizes.push({ 30918 PPx: precinctsSize & 0xF, 30919 PPy: precinctsSize >> 4 30920 }); 30921 } 30922 cod.precinctsSizes = precinctsSizes; 30923 } 30924 30925 if (cod.sopMarkerUsed || cod.ephMarkerUsed || 30926 cod.selectiveArithmeticCodingBypass || 30927 cod.resetContextProbabilities || 30928 cod.terminationOnEachCodingPass || 30929 cod.verticalyStripe || cod.predictableTermination || 30930 cod.segmentationSymbolUsed) 30931 throw 'Unsupported COD options: ' + uneval(cod); 30932 30933 if (context.mainHeader) 30934 context.COD = cod; 30935 else { 30936 context.currentTile.COD = cod; 30937 context.currentTile.COC = []; 30938 } 30939 break; 30940 case 0xFF90: // Start of tile-part (SOT) 30941 length = readUint16(data, position); 30942 var tile = {}; 30943 tile.index = readUint16(data, position + 2); 30944 tile.length = readUint32(data, position + 4); 30945 tile.dataEnd = tile.length + position - 2; 30946 tile.partIndex = data[position + 8]; 30947 tile.partsCount = data[position + 9]; 30948 30949 context.mainHeader = false; 30950 if (tile.partIndex == 0) { 30951 // reset component specific settings 30952 tile.COD = context.COD; 30953 tile.COC = context.COC.slice(0); // clone of the global COC 30954 tile.QCD = context.QCD; 30955 tile.QCC = context.QCC.slice(0); // clone of the global COC 30956 } 30957 context.currentTile = tile; 30958 break; 30959 case 0xFF93: // Start of data (SOD) 30960 var tile = context.currentTile; 30961 if (tile.partIndex == 0) { 30962 initializeTile(context, tile.index); 30963 buildPackets(context); 30964 } 30965 30966 // moving to the end of the data 30967 length = tile.dataEnd - position; 30968 30969 parseTilePackets(context, data, position, length); 30970 break; 30971 case 0xFF64: // Comment (COM) 30972 length = readUint16(data, position); 30973 // skipping content 30974 break; 30975 default: 30976 throw 'Unknown codestream code: ' + code.toString(16); 30977 } 30978 position += length; 30979 } 30980 } catch (e) { 30981 if (this.failOnCorruptedImage) 30982 error('JPX error: ' + e); 30983 else 30984 warn('JPX error: ' + e + '. Trying to recover'); 30985 } 30986 this.tiles = transformComponents(context); 30987 this.width = context.SIZ.Xsiz - context.SIZ.XOsiz; 30988 this.height = context.SIZ.Ysiz - context.SIZ.YOsiz; 30989 this.componentsCount = context.SIZ.Csiz; 30990 } 30991 }; 30992 function readUint32(data, offset) { 30993 return (data[offset] << 24) | (data[offset + 1] << 16) | 30994 (data[offset + 2] << 8) | data[offset + 3]; 30995 } 30996 function readUint16(data, offset) { 30997 return (data[offset] << 8) | data[offset + 1]; 30998 } 30999 function log2(x) { 31000 var n = 1, i = 0; 31001 while (x > n) { 31002 n <<= 1; 31003 i++; 31004 } 31005 return i; 31006 } 31007 function calculateComponentDimensions(component, siz) { 31008 // Section B.2 Component mapping 31009 component.x0 = Math.ceil(siz.XOsiz / component.XRsiz); 31010 component.x1 = Math.ceil(siz.Xsiz / component.XRsiz); 31011 component.y0 = Math.ceil(siz.YOsiz / component.YRsiz); 31012 component.y1 = Math.ceil(siz.Ysiz / component.YRsiz); 31013 component.width = component.x1 - component.x0; 31014 component.height = component.y1 - component.y0; 31015 } 31016 function calculateTileGrids(context, components) { 31017 var siz = context.SIZ; 31018 // Section B.3 Division into tile and tile-components 31019 var tiles = []; 31020 var numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz); 31021 var numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz); 31022 for (var q = 0; q < numYtiles; q++) { 31023 for (var p = 0; p < numXtiles; p++) { 31024 var tile = {}; 31025 tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz); 31026 tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz); 31027 tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz); 31028 tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz); 31029 tile.width = tile.tx1 - tile.tx0; 31030 tile.height = tile.ty1 - tile.ty0; 31031 tile.components = []; 31032 tiles.push(tile); 31033 } 31034 } 31035 context.tiles = tiles; 31036 31037 var componentsCount = siz.Csiz; 31038 for (var i = 0, ii = componentsCount; i < ii; i++) { 31039 var component = components[i]; 31040 var tileComponents = []; 31041 for (var j = 0, jj = tiles.length; j < jj; j++) { 31042 var tileComponent = {}, tile = tiles[j]; 31043 tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz); 31044 tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz); 31045 tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz); 31046 tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz); 31047 tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0; 31048 tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0; 31049 tile.components[i] = tileComponent; 31050 } 31051 } 31052 } 31053 function getBlocksDimensions(context, component, r) { 31054 var codOrCoc = component.codingStyleParameters; 31055 var result = {}; 31056 if (!codOrCoc.entropyCoderWithCustomPrecincts) { 31057 result.PPx = 15; 31058 result.PPy = 15; 31059 } else { 31060 result.PPx = codOrCoc.precinctsSizes[r].PPx; 31061 result.PPy = codOrCoc.precinctsSizes[r].PPy; 31062 } 31063 // calculate codeblock size as described in section B.7 31064 result.xcb_ = r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) : 31065 Math.min(codOrCoc.xcb, result.PPx); 31066 result.ycb_ = r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) : 31067 Math.min(codOrCoc.ycb, result.PPy); 31068 return result; 31069 } 31070 function buildPrecincts(context, resolution, dimensions) { 31071 // Section B.6 Division resolution to precincts 31072 var precinctWidth = 1 << dimensions.PPx; 31073 var precinctHeight = 1 << dimensions.PPy; 31074 var numprecinctswide = resolution.trx1 > resolution.trx0 ? 31075 Math.ceil(resolution.trx1 / precinctWidth) - 31076 Math.floor(resolution.trx0 / precinctWidth) : 0; 31077 var numprecinctshigh = resolution.try1 > resolution.try0 ? 31078 Math.ceil(resolution.try1 / precinctHeight) - 31079 Math.floor(resolution.try0 / precinctHeight) : 0; 31080 var numprecincts = numprecinctswide * numprecinctshigh; 31081 var precinctXOffset = Math.floor(resolution.trx0 / precinctWidth) * 31082 precinctWidth; 31083 var precinctYOffset = Math.floor(resolution.try0 / precinctHeight) * 31084 precinctHeight; 31085 resolution.precinctParameters = { 31086 precinctXOffset: precinctXOffset, 31087 precinctYOffset: precinctYOffset, 31088 precinctWidth: precinctWidth, 31089 precinctHeight: precinctHeight, 31090 numprecinctswide: numprecinctswide, 31091 numprecinctshigh: numprecinctshigh, 31092 numprecincts: numprecincts 31093 }; 31094 } 31095 function buildCodeblocks(context, subband, dimensions) { 31096 // Section B.7 Division sub-band into code-blocks 31097 var xcb_ = dimensions.xcb_; 31098 var ycb_ = dimensions.ycb_; 31099 var codeblockWidth = 1 << xcb_; 31100 var codeblockHeight = 1 << ycb_; 31101 var cbx0 = Math.floor(subband.tbx0 / codeblockWidth); 31102 var cby0 = Math.floor(subband.tby0 / codeblockHeight); 31103 var cbx1 = Math.ceil(subband.tbx1 / codeblockWidth); 31104 var cby1 = Math.ceil(subband.tby1 / codeblockHeight); 31105 var precinctParameters = subband.resolution.precinctParameters; 31106 var codeblocks = []; 31107 var precincts = []; 31108 for (var j = cby0; j < cby1; j++) { 31109 for (var i = cbx0; i < cbx1; i++) { 31110 var codeblock = { 31111 cbx: i, 31112 cby: j, 31113 tbx0: codeblockWidth * i, 31114 tby0: codeblockHeight * j, 31115 tbx1: codeblockWidth * (i + 1), 31116 tby1: codeblockHeight * (j + 1) 31117 }; 31118 // calculate precinct number 31119 var pi = Math.floor((codeblock.tbx0 - 31120 precinctParameters.precinctXOffset) / 31121 precinctParameters.precinctWidth); 31122 var pj = Math.floor((codeblock.tby0 - 31123 precinctParameters.precinctYOffset) / 31124 precinctParameters.precinctHeight); 31125 var precinctNumber = pj + 31126 pi * precinctParameters.numprecinctswide; 31127 codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0); 31128 codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0); 31129 codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1); 31130 codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1); 31131 codeblock.precinctNumber = precinctNumber; 31132 codeblock.subbandType = subband.type; 31133 var coefficientsLength = (codeblock.tbx1_ - codeblock.tbx0_) * 31134 (codeblock.tby1_ - codeblock.tby0_); 31135 codeblock.Lblock = 3; 31136 codeblocks.push(codeblock); 31137 // building precinct for the sub-band 31138 var precinct; 31139 if (precinctNumber in precincts) { 31140 precinct = precincts[precinctNumber]; 31141 precinct.cbxMin = Math.min(precinct.cbxMin, i); 31142 precinct.cbyMin = Math.min(precinct.cbyMin, j); 31143 precinct.cbxMax = Math.max(precinct.cbxMax, i); 31144 precinct.cbyMax = Math.max(precinct.cbyMax, j); 31145 } else { 31146 precincts[precinctNumber] = precinct = { 31147 cbxMin: i, 31148 cbyMin: j, 31149 cbxMax: i, 31150 cbyMax: j 31151 }; 31152 } 31153 codeblock.precinct = precinct; 31154 } 31155 } 31156 subband.codeblockParameters = { 31157 codeblockWidth: xcb_, 31158 codeblockHeight: ycb_, 31159 numcodeblockwide: cbx1 - cbx0 + 1, 31160 numcodeblockhigh: cby1 - cby1 + 1 31161 }; 31162 subband.codeblocks = codeblocks; 31163 for (var i = 0, ii = codeblocks.length; i < ii; i++) { 31164 var codeblock = codeblocks[i]; 31165 var precinctNumber = codeblock.precinctNumber; 31166 } 31167 subband.precincts = precincts; 31168 } 31169 function createPacket(resolution, precinctNumber, layerNumber) { 31170 var precinctCodeblocks = []; 31171 // Section B.10.8 Order of info in packet 31172 var subbands = resolution.subbands; 31173 // sub-bands already ordered in 'LL', 'HL', 'LH', and 'HH' sequence 31174 for (var i = 0, ii = subbands.length; i < ii; i++) { 31175 var subband = subbands[i]; 31176 var codeblocks = subband.codeblocks; 31177 for (var j = 0, jj = codeblocks.length; j < jj; j++) { 31178 var codeblock = codeblocks[j]; 31179 if (codeblock.precinctNumber != precinctNumber) 31180 continue; 31181 precinctCodeblocks.push(codeblock); 31182 } 31183 } 31184 return { 31185 layerNumber: layerNumber, 31186 codeblocks: precinctCodeblocks 31187 }; 31188 } 31189 function LayerResolutionComponentPositionIterator(context) { 31190 var siz = context.SIZ; 31191 var tileIndex = context.currentTile.index; 31192 var tile = context.tiles[tileIndex]; 31193 var layersCount = tile.codingStyleDefaultParameters.layersCount; 31194 var componentsCount = siz.Csiz; 31195 var maxDecompositionLevelsCount = 0; 31196 for (var q = 0; q < componentsCount; q++) { 31197 maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, 31198 tile.components[q].codingStyleParameters.decompositionLevelsCount); 31199 } 31200 31201 var l = 0, r = 0, i = 0, k = 0; 31202 31203 this.nextPacket = function JpxImage_nextPacket() { 31204 // Section B.12.1.1 Layer-resolution-component-position 31205 for (; l < layersCount; l++) { 31206 for (; r <= maxDecompositionLevelsCount; r++) { 31207 for (; i < componentsCount; i++) { 31208 var component = tile.components[i]; 31209 if (r > component.codingStyleParameters.decompositionLevelsCount) 31210 continue; 31211 31212 var resolution = component.resolutions[r]; 31213 var numprecincts = resolution.precinctParameters.numprecincts; 31214 for (; k < numprecincts;) { 31215 var packet = createPacket(resolution, k, l); 31216 k++; 31217 return packet; 31218 } 31219 k = 0; 31220 } 31221 i = 0; 31222 } 31223 r = 0; 31224 } 31225 throw 'Out of packets'; 31226 }; 31227 } 31228 function ResolutionLayerComponentPositionIterator(context) { 31229 var siz = context.SIZ; 31230 var tileIndex = context.currentTile.index; 31231 var tile = context.tiles[tileIndex]; 31232 var layersCount = tile.codingStyleDefaultParameters.layersCount; 31233 var componentsCount = siz.Csiz; 31234 var maxDecompositionLevelsCount = 0; 31235 for (var q = 0; q < componentsCount; q++) { 31236 maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount, 31237 tile.components[q].codingStyleParameters.decompositionLevelsCount); 31238 } 31239 31240 var r = 0, l = 0, i = 0, k = 0; 31241 31242 this.nextPacket = function JpxImage_nextPacket() { 31243 // Section B.12.1.2 Resolution-layer-component-position 31244 for (; r <= maxDecompositionLevelsCount; r++) { 31245 for (; l < layersCount; l++) { 31246 for (; i < componentsCount; i++) { 31247 var component = tile.components[i]; 31248 if (r > component.codingStyleParameters.decompositionLevelsCount) 31249 continue; 31250 31251 var resolution = component.resolutions[r]; 31252 var numprecincts = resolution.precinctParameters.numprecincts; 31253 for (; k < numprecincts;) { 31254 var packet = createPacket(resolution, k, l); 31255 k++; 31256 return packet; 31257 } 31258 k = 0; 31259 } 31260 i = 0; 31261 } 31262 l = 0; 31263 } 31264 throw 'Out of packets'; 31265 }; 31266 } 31267 function buildPackets(context) { 31268 var siz = context.SIZ; 31269 var tileIndex = context.currentTile.index; 31270 var tile = context.tiles[tileIndex]; 31271 var componentsCount = siz.Csiz; 31272 // Creating resolutions and sub-bands for each component 31273 for (var c = 0; c < componentsCount; c++) { 31274 var component = tile.components[c]; 31275 var decompositionLevelsCount = 31276 component.codingStyleParameters.decompositionLevelsCount; 31277 // Section B.5 Resolution levels and sub-bands 31278 var resolutions = []; 31279 var subbands = []; 31280 for (var r = 0; r <= decompositionLevelsCount; r++) { 31281 var blocksDimensions = getBlocksDimensions(context, component, r); 31282 var resolution = {}; 31283 var scale = 1 << (decompositionLevelsCount - r); 31284 resolution.trx0 = Math.ceil(component.tcx0 / scale); 31285 resolution.try0 = Math.ceil(component.tcy0 / scale); 31286 resolution.trx1 = Math.ceil(component.tcx1 / scale); 31287 resolution.try1 = Math.ceil(component.tcy1 / scale); 31288 buildPrecincts(context, resolution, blocksDimensions); 31289 resolutions.push(resolution); 31290 31291 var subband; 31292 if (r == 0) { 31293 // one sub-band (LL) with last decomposition 31294 subband = {}; 31295 subband.type = 'LL'; 31296 subband.tbx0 = Math.ceil(component.tcx0 / scale); 31297 subband.tby0 = Math.ceil(component.tcy0 / scale); 31298 subband.tbx1 = Math.ceil(component.tcx1 / scale); 31299 subband.tby1 = Math.ceil(component.tcy1 / scale); 31300 subband.resolution = resolution; 31301 buildCodeblocks(context, subband, blocksDimensions); 31302 subbands.push(subband); 31303 resolution.subbands = [subband]; 31304 } else { 31305 var bscale = 1 << (decompositionLevelsCount - r + 1); 31306 var resolutionSubbands = []; 31307 // three sub-bands (HL, LH and HH) with rest of decompositions 31308 subband = {}; 31309 subband.type = 'HL'; 31310 subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5); 31311 subband.tby0 = Math.ceil(component.tcy0 / bscale); 31312 subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5); 31313 subband.tby1 = Math.ceil(component.tcy1 / bscale); 31314 subband.resolution = resolution; 31315 buildCodeblocks(context, subband, blocksDimensions); 31316 subbands.push(subband); 31317 resolutionSubbands.push(subband); 31318 31319 subband = {}; 31320 subband.type = 'LH'; 31321 subband.tbx0 = Math.ceil(component.tcx0 / bscale); 31322 subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5); 31323 subband.tbx1 = Math.ceil(component.tcx1 / bscale); 31324 subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5); 31325 subband.resolution = resolution; 31326 buildCodeblocks(context, subband, blocksDimensions); 31327 subbands.push(subband); 31328 resolutionSubbands.push(subband); 31329 31330 subband = {}; 31331 subband.type = 'HH'; 31332 subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5); 31333 subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5); 31334 subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5); 31335 subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5); 31336 subband.resolution = resolution; 31337 buildCodeblocks(context, subband, blocksDimensions); 31338 subbands.push(subband); 31339 resolutionSubbands.push(subband); 31340 31341 resolution.subbands = resolutionSubbands; 31342 } 31343 } 31344 component.resolutions = resolutions; 31345 component.subbands = subbands; 31346 } 31347 // Generate the packets sequence 31348 var progressionOrder = tile.codingStyleDefaultParameters.progressionOrder; 31349 var packetsIterator; 31350 switch (progressionOrder) { 31351 case 0: 31352 tile.packetsIterator = 31353 new LayerResolutionComponentPositionIterator(context); 31354 break; 31355 case 1: 31356 tile.packetsIterator = 31357 new ResolutionLayerComponentPositionIterator(context); 31358 break; 31359 default: 31360 throw 'Unsupported progression order ' + progressionOrder; 31361 } 31362 } 31363 function parseTilePackets(context, data, offset, dataLength) { 31364 var position = 0; 31365 var buffer, bufferSize = 0, skipNextBit = false; 31366 function readBits(count) { 31367 while (bufferSize < count) { 31368 var b = data[offset + position]; 31369 position++; 31370 if (skipNextBit) { 31371 buffer = (buffer << 7) | b; 31372 bufferSize += 7; 31373 skipNextBit = false; 31374 } else { 31375 buffer = (buffer << 8) | b; 31376 bufferSize += 8; 31377 } 31378 if (b == 0xFF) { 31379 skipNextBit = true; 31380 } 31381 } 31382 bufferSize -= count; 31383 return (buffer >>> bufferSize) & ((1 << count) - 1); 31384 } 31385 function alignToByte() { 31386 bufferSize = 0; 31387 if (skipNextBit) { 31388 position++; 31389 skipNextBit = false; 31390 } 31391 } 31392 function readCodingpasses() { 31393 var value = readBits(1); 31394 if (value == 0) 31395 return 1; 31396 value = (value << 1) | readBits(1); 31397 if (value == 0x02) 31398 return 2; 31399 value = (value << 2) | readBits(2); 31400 if (value <= 0x0E) 31401 return (value & 0x03) + 3; 31402 value = (value << 5) | readBits(5); 31403 if (value <= 0x1FE) 31404 return (value & 0x1F) + 6; 31405 value = (value << 7) | readBits(7); 31406 return (value & 0x7F) + 37; 31407 } 31408 var tileIndex = context.currentTile.index; 31409 var tile = context.tiles[tileIndex]; 31410 var packetsIterator = tile.packetsIterator; 31411 while (position < dataLength) { 31412 var packet = packetsIterator.nextPacket(); 31413 if (!readBits(1)) { 31414 alignToByte(); 31415 continue; 31416 } 31417 var layerNumber = packet.layerNumber; 31418 var queue = []; 31419 for (var i = 0, ii = packet.codeblocks.length; i < ii; i++) { 31420 var codeblock = packet.codeblocks[i]; 31421 var precinct = codeblock.precinct; 31422 var codeblockColumn = codeblock.cbx - precinct.cbxMin; 31423 var codeblockRow = codeblock.cby - precinct.cbyMin; 31424 var codeblockIncluded = false; 31425 var firstTimeInclusion = false; 31426 if ('included' in codeblock) { 31427 codeblockIncluded = !!readBits(1); 31428 } else { 31429 // reading inclusion tree 31430 var precinct = codeblock.precinct; 31431 var inclusionTree, zeroBitPlanesTree; 31432 if ('inclusionTree' in precinct) { 31433 inclusionTree = precinct.inclusionTree; 31434 } else { 31435 // building inclusion and zero bit-planes trees 31436 var width = precinct.cbxMax - precinct.cbxMin + 1; 31437 var height = precinct.cbyMax - precinct.cbyMin + 1; 31438 inclusionTree = new InclusionTree(width, height, layerNumber); 31439 zeroBitPlanesTree = new TagTree(width, height); 31440 precinct.inclusionTree = inclusionTree; 31441 precinct.zeroBitPlanesTree = zeroBitPlanesTree; 31442 } 31443 31444 if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) { 31445 while (true) { 31446 if (readBits(1)) { 31447 var valueReady = !inclusionTree.nextLevel(); 31448 if (valueReady) { 31449 codeblock.included = true; 31450 codeblockIncluded = firstTimeInclusion = true; 31451 break; 31452 } 31453 } else { 31454 inclusionTree.incrementValue(layerNumber); 31455 break; 31456 } 31457 } 31458 } 31459 } 31460 if (!codeblockIncluded) 31461 continue; 31462 if (firstTimeInclusion) { 31463 zeroBitPlanesTree = precinct.zeroBitPlanesTree; 31464 zeroBitPlanesTree.reset(codeblockColumn, codeblockRow); 31465 while (true) { 31466 if (readBits(1)) { 31467 var valueReady = !zeroBitPlanesTree.nextLevel(); 31468 if (valueReady) 31469 break; 31470 } else 31471 zeroBitPlanesTree.incrementValue(); 31472 } 31473 codeblock.zeroBitPlanes = zeroBitPlanesTree.value; 31474 } 31475 var codingpasses = readCodingpasses(); 31476 while (readBits(1)) 31477 codeblock.Lblock++; 31478 var codingpassesLog2 = log2(codingpasses); 31479 // rounding down log2 31480 var bits = ((codingpasses < (1 << codingpassesLog2)) ? 31481 codingpassesLog2 - 1 : codingpassesLog2) + codeblock.Lblock; 31482 var codedDataLength = readBits(bits); 31483 queue.push({ 31484 codeblock: codeblock, 31485 codingpasses: codingpasses, 31486 dataLength: codedDataLength 31487 }); 31488 } 31489 alignToByte(); 31490 while (queue.length > 0) { 31491 var packetItem = queue.shift(); 31492 var codeblock = packetItem.codeblock; 31493 if (!('data' in codeblock)) 31494 codeblock.data = []; 31495 codeblock.data.push({ 31496 data: data, 31497 start: offset + position, 31498 end: offset + position + packetItem.dataLength, 31499 codingpasses: packetItem.codingpasses 31500 }); 31501 position += packetItem.dataLength; 31502 } 31503 } 31504 return position; 31505 } 31506 function copyCoefficients(coefficients, x0, y0, width, height, 31507 delta, mb, codeblocks, transformation) { 31508 var r = 0.5; // formula (E-6) 31509 for (var i = 0, ii = codeblocks.length; i < ii; ++i) { 31510 var codeblock = codeblocks[i]; 31511 var blockWidth = codeblock.tbx1_ - codeblock.tbx0_; 31512 var blockHeight = codeblock.tby1_ - codeblock.tby0_; 31513 if (blockWidth == 0 || blockHeight == 0) 31514 continue; 31515 if (!('data' in codeblock)) 31516 continue; 31517 31518 var bitModel, currentCodingpassType; 31519 bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType, 31520 codeblock.zeroBitPlanes); 31521 currentCodingpassType = 2; // first bit plane starts from cleanup 31522 31523 // collect data 31524 var data = codeblock.data, totalLength = 0, codingpasses = 0; 31525 for (var q = 0, qq = data.length; q < qq; q++) { 31526 var dataItem = data[q]; 31527 totalLength += dataItem.end - dataItem.start; 31528 codingpasses += dataItem.codingpasses; 31529 } 31530 var encodedData = new Uint8Array(totalLength), k = 0; 31531 for (var q = 0, qq = data.length; q < qq; q++) { 31532 var dataItem = data[q]; 31533 var chunk = dataItem.data.subarray(dataItem.start, dataItem.end); 31534 encodedData.set(chunk, k); 31535 k += chunk.length; 31536 } 31537 // decoding the item 31538 var decoder = new ArithmeticDecoder(encodedData, 0, totalLength); 31539 bitModel.setDecoder(decoder); 31540 31541 for (var q = 0; q < codingpasses; q++) { 31542 switch (currentCodingpassType) { 31543 case 0: 31544 bitModel.runSignificancePropogationPass(); 31545 break; 31546 case 1: 31547 bitModel.runMagnitudeRefinementPass(); 31548 break; 31549 case 2: 31550 bitModel.runCleanupPass(); 31551 break; 31552 } 31553 currentCodingpassType = (currentCodingpassType + 1) % 3; 31554 } 31555 31556 var offset = (codeblock.tbx0_ - x0) + (codeblock.tby0_ - y0) * width; 31557 var position = 0; 31558 for (var j = 0; j < blockHeight; j++) { 31559 for (var k = 0; k < blockWidth; k++) { 31560 var n = (bitModel.coefficentsSign[position] ? -1 : 1) * 31561 bitModel.coefficentsMagnitude[position]; 31562 var nb = bitModel.bitsDecoded[position], correction; 31563 if (transformation == 0 || mb > nb) { 31564 // use r only if transformation is irreversible or 31565 // not all bitplanes were decoded for reversible transformation 31566 n += n < 0 ? n - r : n > 0 ? n + r : 0; 31567 correction = 1 << (mb - nb); 31568 } else 31569 correction = 1; 31570 coefficients[offset++] = n * correction * delta; 31571 position++; 31572 } 31573 offset += width - blockWidth; 31574 } 31575 } 31576 } 31577 function transformTile(context, tile, c) { 31578 var component = tile.components[c]; 31579 var codingStyleParameters = component.codingStyleParameters; 31580 var quantizationParameters = component.quantizationParameters; 31581 var decompositionLevelsCount = 31582 codingStyleParameters.decompositionLevelsCount; 31583 var spqcds = quantizationParameters.SPqcds; 31584 var scalarExpounded = quantizationParameters.scalarExpounded; 31585 var guardBits = quantizationParameters.guardBits; 31586 var transformation = codingStyleParameters.transformation; 31587 var precision = context.components[c].precision; 31588 31589 var subbandCoefficients = []; 31590 var k = 0, b = 0; 31591 for (var i = 0; i <= decompositionLevelsCount; i++) { 31592 var resolution = component.resolutions[i]; 31593 31594 for (var j = 0, jj = resolution.subbands.length; j < jj; j++) { 31595 var mu, epsilon; 31596 if (!scalarExpounded) { 31597 // formula E-5 31598 mu = spqcds[0].mu; 31599 epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0); 31600 } else { 31601 mu = spqcds[b].mu; 31602 epsilon = spqcds[b].epsilon; 31603 } 31604 31605 var subband = resolution.subbands[j]; 31606 var width = subband.tbx1 - subband.tbx0; 31607 var height = subband.tby1 - subband.tby0; 31608 var gainLog2 = SubbandsGainLog2[subband.type]; 31609 31610 // calulate quantization coefficient (Section E.1.1.1) 31611 var delta = Math.pow(2, (precision + gainLog2) - epsilon) * 31612 (1 + mu / 2048); 31613 var mb = (guardBits + epsilon - 1); 31614 31615 var coefficients = new Float32Array(width * height); 31616 copyCoefficients(coefficients, subband.tbx0, subband.tby0, 31617 width, height, delta, mb, subband.codeblocks, transformation); 31618 31619 subbandCoefficients.push({ 31620 width: width, 31621 height: height, 31622 items: coefficients 31623 }); 31624 31625 b++; 31626 } 31627 } 31628 31629 var transformation = codingStyleParameters.transformation; 31630 var transform = transformation == 0 ? new IrreversibleTransform() : 31631 new ReversibleTransform(); 31632 var result = transform.calculate(subbandCoefficients, 31633 component.tcx0, component.tcy0); 31634 return { 31635 left: component.tcx0, 31636 top: component.tcy0, 31637 width: result.width, 31638 height: result.height, 31639 items: result.items 31640 }; 31641 } 31642 function transformComponents(context) { 31643 var siz = context.SIZ; 31644 var components = context.components; 31645 var componentsCount = siz.Csiz; 31646 var resultImages = []; 31647 for (var i = 0, ii = context.tiles.length; i < ii; i++) { 31648 var tile = context.tiles[i]; 31649 var result = []; 31650 for (var c = 0; c < componentsCount; c++) { 31651 var image = transformTile(context, tile, c); 31652 result.push(image); 31653 } 31654 31655 // Section G.2.2 Inverse multi component transform 31656 if (tile.codingStyleDefaultParameters.multipleComponentTransform) { 31657 var y0items = result[0].items; 31658 var y1items = result[1].items; 31659 var y2items = result[2].items; 31660 for (var j = 0, jj = y0items.length; j < jj; j++) { 31661 var y0 = y0items[j], y1 = y1items[j], y2 = y2items[j]; 31662 var i1 = y0 - ((y2 + y1) >> 2); 31663 y1items[j] = i1; 31664 y0items[j] = y2 + i1; 31665 y2items[j] = y1 + i1; 31666 } 31667 } 31668 31669 // Section G.1 DC level shifting to unsigned component values 31670 for (var c = 0; c < componentsCount; c++) { 31671 var component = components[c]; 31672 if (component.isSigned) 31673 continue; 31674 31675 var offset = 1 << (component.precision - 1); 31676 var tileImage = result[c]; 31677 var items = tileImage.items; 31678 for (var j = 0, jj = items.length; j < jj; j++) 31679 items[j] += offset; 31680 } 31681 31682 // To simplify things: shift and clamp output to 8 bit unsigned 31683 for (var c = 0; c < componentsCount; c++) { 31684 var component = components[c]; 31685 var offset = component.isSigned ? 128 : 0; 31686 var shift = component.precision - 8; 31687 var tileImage = result[c]; 31688 var items = tileImage.items; 31689 var data = new Uint8Array(items.length); 31690 for (var j = 0, jj = items.length; j < jj; j++) { 31691 var value = (items[j] >> shift) + offset; 31692 data[j] = value < 0 ? 0 : value > 255 ? 255 : value; 31693 } 31694 result[c].items = data; 31695 } 31696 31697 resultImages.push(result); 31698 } 31699 return resultImages; 31700 } 31701 function initializeTile(context, tileIndex) { 31702 var siz = context.SIZ; 31703 var componentsCount = siz.Csiz; 31704 var tile = context.tiles[tileIndex]; 31705 var resultTiles = []; 31706 for (var c = 0; c < componentsCount; c++) { 31707 var component = tile.components[c]; 31708 var qcdOrQcc = c in context.currentTile.QCC ? 31709 context.currentTile.QCC[c] : context.currentTile.QCD; 31710 component.quantizationParameters = qcdOrQcc; 31711 var codOrCoc = c in context.currentTile.COC ? 31712 context.currentTile.COC[c] : context.currentTile.COD; 31713 component.codingStyleParameters = codOrCoc; 31714 } 31715 tile.codingStyleDefaultParameters = context.currentTile.COD; 31716 } 31717 31718 // Section B.10.2 Tag trees 31719 var TagTree = (function TagTreeClosure() { 31720 function TagTree(width, height) { 31721 var levelsLength = log2(Math.max(width, height)) + 1; 31722 this.levels = []; 31723 for (var i = 0; i < levelsLength; i++) { 31724 var level = { 31725 width: width, 31726 height: height, 31727 items: [] 31728 }; 31729 this.levels.push(level); 31730 width = Math.ceil(width / 2); 31731 height = Math.ceil(height / 2); 31732 } 31733 } 31734 TagTree.prototype = { 31735 reset: function TagTree_reset(i, j) { 31736 var currentLevel = 0, value = 0; 31737 while (currentLevel < this.levels.length) { 31738 var level = this.levels[currentLevel]; 31739 var index = i + j * level.width; 31740 if (index in level.items) { 31741 value = level.items[index]; 31742 break; 31743 } 31744 level.index = index; 31745 i >>= 1; 31746 j >>= 1; 31747 currentLevel++; 31748 } 31749 currentLevel--; 31750 var level = this.levels[currentLevel]; 31751 level.items[level.index] = value; 31752 this.currentLevel = currentLevel; 31753 delete this.value; 31754 }, 31755 incrementValue: function TagTree_incrementValue() { 31756 var level = this.levels[this.currentLevel]; 31757 level.items[level.index]++; 31758 }, 31759 nextLevel: function TagTree_nextLevel() { 31760 var currentLevel = this.currentLevel; 31761 var level = this.levels[currentLevel]; 31762 var value = level.items[level.index]; 31763 currentLevel--; 31764 if (currentLevel < 0) { 31765 this.value = value; 31766 return false; 31767 } 31768 31769 this.currentLevel = currentLevel; 31770 var level = this.levels[currentLevel]; 31771 level.items[level.index] = value; 31772 return true; 31773 } 31774 }; 31775 return TagTree; 31776 })(); 31777 31778 var InclusionTree = (function InclusionTreeClosure() { 31779 function InclusionTree(width, height, defaultValue) { 31780 var levelsLength = log2(Math.max(width, height)) + 1; 31781 this.levels = []; 31782 for (var i = 0; i < levelsLength; i++) { 31783 var items = new Uint8Array(width * height); 31784 for (var j = 0, jj = items.length; j < jj; j++) 31785 items[j] = defaultValue; 31786 31787 var level = { 31788 width: width, 31789 height: height, 31790 items: items 31791 }; 31792 this.levels.push(level); 31793 31794 width = Math.ceil(width / 2); 31795 height = Math.ceil(height / 2); 31796 } 31797 } 31798 InclusionTree.prototype = { 31799 reset: function InclusionTree_reset(i, j, stopValue) { 31800 var currentLevel = 0; 31801 while (currentLevel < this.levels.length) { 31802 var level = this.levels[currentLevel]; 31803 var index = i + j * level.width; 31804 level.index = index; 31805 var value = level.items[index]; 31806 31807 if (value == 0xFF) 31808 break; 31809 31810 if (value > stopValue) { 31811 this.currentLevel = currentLevel; 31812 // already know about this one, propagating the value to top levels 31813 this.propagateValues(); 31814 return false; 31815 } 31816 31817 i >>= 1; 31818 j >>= 1; 31819 currentLevel++; 31820 } 31821 this.currentLevel = currentLevel - 1; 31822 return true; 31823 }, 31824 incrementValue: function InclusionTree_incrementValue(stopValue) { 31825 var level = this.levels[this.currentLevel]; 31826 level.items[level.index] = stopValue + 1; 31827 this.propagateValues(); 31828 }, 31829 propagateValues: function InclusionTree_propagateValues() { 31830 var levelIndex = this.currentLevel; 31831 var level = this.levels[levelIndex]; 31832 var currentValue = level.items[level.index]; 31833 while (--levelIndex >= 0) { 31834 var level = this.levels[levelIndex]; 31835 level.items[level.index] = currentValue; 31836 } 31837 }, 31838 nextLevel: function InclusionTree_nextLevel() { 31839 var currentLevel = this.currentLevel; 31840 var level = this.levels[currentLevel]; 31841 var value = level.items[level.index]; 31842 level.items[level.index] = 0xFF; 31843 currentLevel--; 31844 if (currentLevel < 0) 31845 return false; 31846 31847 this.currentLevel = currentLevel; 31848 var level = this.levels[currentLevel]; 31849 level.items[level.index] = value; 31850 return true; 31851 } 31852 }; 31853 return InclusionTree; 31854 })(); 31855 31856 // Implements C.3. Arithmetic decoding procedures 31857 var ArithmeticDecoder = (function ArithmeticDecoderClosure() { 31858 var QeTable = [ 31859 {qe: 0x5601, nmps: 1, nlps: 1, switchFlag: 1}, 31860 {qe: 0x3401, nmps: 2, nlps: 6, switchFlag: 0}, 31861 {qe: 0x1801, nmps: 3, nlps: 9, switchFlag: 0}, 31862 {qe: 0x0AC1, nmps: 4, nlps: 12, switchFlag: 0}, 31863 {qe: 0x0521, nmps: 5, nlps: 29, switchFlag: 0}, 31864 {qe: 0x0221, nmps: 38, nlps: 33, switchFlag: 0}, 31865 {qe: 0x5601, nmps: 7, nlps: 6, switchFlag: 1}, 31866 {qe: 0x5401, nmps: 8, nlps: 14, switchFlag: 0}, 31867 {qe: 0x4801, nmps: 9, nlps: 14, switchFlag: 0}, 31868 {qe: 0x3801, nmps: 10, nlps: 14, switchFlag: 0}, 31869 {qe: 0x3001, nmps: 11, nlps: 17, switchFlag: 0}, 31870 {qe: 0x2401, nmps: 12, nlps: 18, switchFlag: 0}, 31871 {qe: 0x1C01, nmps: 13, nlps: 20, switchFlag: 0}, 31872 {qe: 0x1601, nmps: 29, nlps: 21, switchFlag: 0}, 31873 {qe: 0x5601, nmps: 15, nlps: 14, switchFlag: 1}, 31874 {qe: 0x5401, nmps: 16, nlps: 14, switchFlag: 0}, 31875 {qe: 0x5101, nmps: 17, nlps: 15, switchFlag: 0}, 31876 {qe: 0x4801, nmps: 18, nlps: 16, switchFlag: 0}, 31877 {qe: 0x3801, nmps: 19, nlps: 17, switchFlag: 0}, 31878 {qe: 0x3401, nmps: 20, nlps: 18, switchFlag: 0}, 31879 {qe: 0x3001, nmps: 21, nlps: 19, switchFlag: 0}, 31880 {qe: 0x2801, nmps: 22, nlps: 19, switchFlag: 0}, 31881 {qe: 0x2401, nmps: 23, nlps: 20, switchFlag: 0}, 31882 {qe: 0x2201, nmps: 24, nlps: 21, switchFlag: 0}, 31883 {qe: 0x1C01, nmps: 25, nlps: 22, switchFlag: 0}, 31884 {qe: 0x1801, nmps: 26, nlps: 23, switchFlag: 0}, 31885 {qe: 0x1601, nmps: 27, nlps: 24, switchFlag: 0}, 31886 {qe: 0x1401, nmps: 28, nlps: 25, switchFlag: 0}, 31887 {qe: 0x1201, nmps: 29, nlps: 26, switchFlag: 0}, 31888 {qe: 0x1101, nmps: 30, nlps: 27, switchFlag: 0}, 31889 {qe: 0x0AC1, nmps: 31, nlps: 28, switchFlag: 0}, 31890 {qe: 0x09C1, nmps: 32, nlps: 29, switchFlag: 0}, 31891 {qe: 0x08A1, nmps: 33, nlps: 30, switchFlag: 0}, 31892 {qe: 0x0521, nmps: 34, nlps: 31, switchFlag: 0}, 31893 {qe: 0x0441, nmps: 35, nlps: 32, switchFlag: 0}, 31894 {qe: 0x02A1, nmps: 36, nlps: 33, switchFlag: 0}, 31895 {qe: 0x0221, nmps: 37, nlps: 34, switchFlag: 0}, 31896 {qe: 0x0141, nmps: 38, nlps: 35, switchFlag: 0}, 31897 {qe: 0x0111, nmps: 39, nlps: 36, switchFlag: 0}, 31898 {qe: 0x0085, nmps: 40, nlps: 37, switchFlag: 0}, 31899 {qe: 0x0049, nmps: 41, nlps: 38, switchFlag: 0}, 31900 {qe: 0x0025, nmps: 42, nlps: 39, switchFlag: 0}, 31901 {qe: 0x0015, nmps: 43, nlps: 40, switchFlag: 0}, 31902 {qe: 0x0009, nmps: 44, nlps: 41, switchFlag: 0}, 31903 {qe: 0x0005, nmps: 45, nlps: 42, switchFlag: 0}, 31904 {qe: 0x0001, nmps: 45, nlps: 43, switchFlag: 0}, 31905 {qe: 0x5601, nmps: 46, nlps: 46, switchFlag: 0} 31906 ]; 31907 31908 function ArithmeticDecoder(data, start, end) { 31909 this.data = data; 31910 this.bp = start; 31911 this.dataEnd = end; 31912 31913 this.chigh = data[start]; 31914 this.clow = 0; 31915 31916 this.byteIn(); 31917 31918 this.chigh = ((this.chigh << 7) & 0xFFFF) | ((this.clow >> 9) & 0x7F); 31919 this.clow = (this.clow << 7) & 0xFFFF; 31920 this.ct -= 7; 31921 this.a = 0x8000; 31922 } 31923 31924 ArithmeticDecoder.prototype = { 31925 byteIn: function ArithmeticDecoder_byteIn() { 31926 var data = this.data; 31927 var bp = this.bp; 31928 if (data[bp] == 0xFF) { 31929 var b1 = data[bp + 1]; 31930 if (b1 > 0x8F) { 31931 this.clow += 0xFF00; 31932 this.ct = 8; 31933 } else { 31934 bp++; 31935 this.clow += (data[bp] << 9); 31936 this.ct = 7; 31937 this.bp = bp; 31938 } 31939 } else { 31940 bp++; 31941 this.clow += bp < this.dataEnd ? (data[bp] << 8) : 0xFF00; 31942 this.ct = 8; 31943 this.bp = bp; 31944 } 31945 if (this.clow > 0xFFFF) { 31946 this.chigh += (this.clow >> 16); 31947 this.clow &= 0xFFFF; 31948 } 31949 }, 31950 readBit: function ArithmeticDecoder_readBit(cx) { 31951 var qeIcx = QeTable[cx.index].qe; 31952 this.a -= qeIcx; 31953 31954 if (this.chigh < qeIcx) { 31955 var d = this.exchangeLps(cx); 31956 this.renormD(); 31957 return d; 31958 } else { 31959 this.chigh -= qeIcx; 31960 if ((this.a & 0x8000) == 0) { 31961 var d = this.exchangeMps(cx); 31962 this.renormD(); 31963 return d; 31964 } else { 31965 return cx.mps; 31966 } 31967 } 31968 }, 31969 renormD: function ArithmeticDecoder_renormD() { 31970 do { 31971 if (this.ct == 0) 31972 this.byteIn(); 31973 31974 this.a <<= 1; 31975 this.chigh = ((this.chigh << 1) & 0xFFFF) | ((this.clow >> 15) & 1); 31976 this.clow = (this.clow << 1) & 0xFFFF; 31977 this.ct--; 31978 } while ((this.a & 0x8000) == 0); 31979 }, 31980 exchangeMps: function ArithmeticDecoder_exchangeMps(cx) { 31981 var d; 31982 var qeTableIcx = QeTable[cx.index]; 31983 if (this.a < qeTableIcx.qe) { 31984 d = 1 - cx.mps; 31985 31986 if (qeTableIcx.switchFlag == 1) { 31987 cx.mps = 1 - cx.mps; 31988 } 31989 cx.index = qeTableIcx.nlps; 31990 } else { 31991 d = cx.mps; 31992 cx.index = qeTableIcx.nmps; 31993 } 31994 return d; 31995 }, 31996 exchangeLps: function ArithmeticDecoder_exchangeLps(cx) { 31997 var d; 31998 var qeTableIcx = QeTable[cx.index]; 31999 if (this.a < qeTableIcx.qe) { 32000 this.a = qeTableIcx.qe; 32001 d = cx.mps; 32002 cx.index = qeTableIcx.nmps; 32003 } else { 32004 this.a = qeTableIcx.qe; 32005 d = 1 - cx.mps; 32006 32007 if (qeTableIcx.switchFlag == 1) { 32008 cx.mps = 1 - cx.mps; 32009 } 32010 cx.index = qeTableIcx.nlps; 32011 } 32012 return d; 32013 } 32014 }; 32015 32016 return ArithmeticDecoder; 32017 })(); 32018 32019 // Section D. Coefficient bit modeling 32020 var BitModel = (function BitModelClosure() { 32021 // Table D-1 32022 // The index is binary presentation: 0dddvvhh, ddd - sum of Di (0..4), 32023 // vv - sum of Vi (0..2), and hh - sum of Hi (0..2) 32024 var LLAndLHContextsLabel = new Uint8Array([ 32025 0, 5, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 1, 6, 8, 0, 3, 7, 8, 0, 4, 32026 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 32027 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8 32028 ]); 32029 var HLContextLabel = new Uint8Array([ 32030 0, 3, 4, 0, 5, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 1, 3, 4, 0, 6, 7, 7, 0, 8, 32031 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 32032 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8 32033 ]); 32034 var HHContextLabel = new Uint8Array([ 32035 0, 1, 2, 0, 1, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 3, 4, 5, 0, 4, 5, 5, 0, 5, 32036 5, 5, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 8, 8, 32037 8, 0, 8, 8, 8, 0, 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8 32038 ]); 32039 32040 // Table D-2 32041 function calcSignContribution(significance0, sign0, significance1, sign1) { 32042 if (significance1) { 32043 if (!sign1) 32044 return significance0 ? (!sign0 ? 1 : 0) : 1; 32045 else 32046 return significance0 ? (!sign0 ? 0 : -1) : -1; 32047 } else 32048 return significance0 ? (!sign0 ? 1 : -1) : 0; 32049 } 32050 // Table D-3 32051 var SignContextLabels = [ 32052 {contextLabel: 13, xorBit: 0}, 32053 {contextLabel: 12, xorBit: 0}, 32054 {contextLabel: 11, xorBit: 0}, 32055 {contextLabel: 10, xorBit: 0}, 32056 {contextLabel: 9, xorBit: 0}, 32057 {contextLabel: 10, xorBit: 1}, 32058 {contextLabel: 11, xorBit: 1}, 32059 {contextLabel: 12, xorBit: 1}, 32060 {contextLabel: 13, xorBit: 1} 32061 ]; 32062 32063 function BitModel(width, height, subband, zeroBitPlanes) { 32064 this.width = width; 32065 this.height = height; 32066 32067 this.contextLabelTable = subband == 'HH' ? HHContextLabel : 32068 subband == 'HL' ? HLContextLabel : LLAndLHContextsLabel; 32069 32070 var coefficientCount = width * height; 32071 32072 // coefficients outside the encoding region treated as insignificant 32073 // add border state cells for significanceState 32074 this.neighborsSignificance = new Uint8Array(coefficientCount); 32075 this.coefficentsSign = new Uint8Array(coefficientCount); 32076 this.coefficentsMagnitude = new Uint32Array(coefficientCount); 32077 this.processingFlags = new Uint8Array(coefficientCount); 32078 32079 var bitsDecoded = new Uint8Array(this.width * this.height); 32080 for (var i = 0, ii = bitsDecoded.length; i < ii; i++) 32081 bitsDecoded[i] = zeroBitPlanes; 32082 this.bitsDecoded = bitsDecoded; 32083 32084 this.reset(); 32085 } 32086 32087 BitModel.prototype = { 32088 setDecoder: function BitModel_setDecoder(decoder) { 32089 this.decoder = decoder; 32090 }, 32091 reset: function BitModel_reset() { 32092 this.uniformContext = {index: 46, mps: 0}; 32093 this.runLengthContext = {index: 3, mps: 0}; 32094 this.contexts = []; 32095 this.contexts.push({index: 4, mps: 0}); 32096 for (var i = 1; i <= 16; i++) 32097 this.contexts.push({index: 0, mps: 0}); 32098 }, 32099 setNeighborsSignificance: 32100 function BitModel_setNeighborsSignificance(row, column) { 32101 var neighborsSignificance = this.neighborsSignificance; 32102 var width = this.width, height = this.height; 32103 var index = row * width + column; 32104 if (row > 0) { 32105 if (column > 0) 32106 neighborsSignificance[index - width - 1] += 0x10; 32107 if (column + 1 < width) 32108 neighborsSignificance[index - width + 1] += 0x10; 32109 neighborsSignificance[index - width] += 0x04; 32110 } 32111 if (row + 1 < height) { 32112 if (column > 0) 32113 neighborsSignificance[index + width - 1] += 0x10; 32114 if (column + 1 < width) 32115 neighborsSignificance[index + width + 1] += 0x10; 32116 neighborsSignificance[index + width] += 0x04; 32117 } 32118 if (column > 0) 32119 neighborsSignificance[index - 1] += 0x01; 32120 if (column + 1 < width) 32121 neighborsSignificance[index + 1] += 0x01; 32122 neighborsSignificance[index] |= 0x80; 32123 }, 32124 runSignificancePropogationPass: 32125 function BitModel_runSignificancePropogationPass() { 32126 var decoder = this.decoder; 32127 var width = this.width, height = this.height; 32128 var coefficentsMagnitude = this.coefficentsMagnitude; 32129 var coefficentsSign = this.coefficentsSign; 32130 var contextLabels = this.contextLabels; 32131 var neighborsSignificance = this.neighborsSignificance; 32132 var processingFlags = this.processingFlags; 32133 var contexts = this.contexts; 32134 var labels = this.contextLabelTable; 32135 var bitsDecoded = this.bitsDecoded; 32136 // clear processed flag 32137 var processedInverseMask = ~1; 32138 var processedMask = 1; 32139 var firstMagnitudeBitMask = 2; 32140 for (var q = 0, qq = width * height; q < qq; q++) 32141 processingFlags[q] &= processedInverseMask; 32142 32143 for (var i0 = 0; i0 < height; i0 += 4) { 32144 for (var j = 0; j < width; j++) { 32145 var index = i0 * width + j; 32146 for (var i1 = 0; i1 < 4; i1++, index += width) { 32147 var i = i0 + i1; 32148 if (i >= height) 32149 break; 32150 32151 if (coefficentsMagnitude[index] || !neighborsSignificance[index]) 32152 continue; 32153 32154 var contextLabel = labels[neighborsSignificance[index]]; 32155 var cx = contexts[contextLabel]; 32156 var decision = decoder.readBit(cx); 32157 if (decision) { 32158 var sign = this.decodeSignBit(i, j); 32159 coefficentsSign[index] = sign; 32160 coefficentsMagnitude[index] = 1; 32161 this.setNeighborsSignificance(i, j); 32162 processingFlags[index] |= firstMagnitudeBitMask; 32163 } 32164 bitsDecoded[index]++; 32165 processingFlags[index] |= processedMask; 32166 } 32167 } 32168 } 32169 }, 32170 decodeSignBit: function BitModel_decodeSignBit(row, column) { 32171 var width = this.width, height = this.height; 32172 var index = row * width + column; 32173 var coefficentsMagnitude = this.coefficentsMagnitude; 32174 var coefficentsSign = this.coefficentsSign; 32175 var horizontalContribution = calcSignContribution( 32176 column > 0 && coefficentsMagnitude[index - 1], 32177 coefficentsSign[index - 1], 32178 column + 1 < width && coefficentsMagnitude[index + 1], 32179 coefficentsSign[index + 1]); 32180 var verticalContribution = calcSignContribution( 32181 row > 0 && coefficentsMagnitude[index - width], 32182 coefficentsSign[index - width], 32183 row + 1 < height && coefficentsMagnitude[index + width], 32184 coefficentsSign[index + width]); 32185 32186 var contextLabelAndXor = SignContextLabels[ 32187 3 * (1 - horizontalContribution) + (1 - verticalContribution)]; 32188 var contextLabel = contextLabelAndXor.contextLabel; 32189 var cx = this.contexts[contextLabel]; 32190 var decoded = this.decoder.readBit(cx); 32191 return decoded ^ contextLabelAndXor.xorBit; 32192 }, 32193 runMagnitudeRefinementPass: 32194 function BitModel_runMagnitudeRefinementPass() { 32195 var decoder = this.decoder; 32196 var width = this.width, height = this.height; 32197 var coefficentsMagnitude = this.coefficentsMagnitude; 32198 var neighborsSignificance = this.neighborsSignificance; 32199 var contexts = this.contexts; 32200 var bitsDecoded = this.bitsDecoded; 32201 var processingFlags = this.processingFlags; 32202 var processedMask = 1; 32203 var firstMagnitudeBitMask = 2; 32204 for (var i0 = 0; i0 < height; i0 += 4) { 32205 for (var j = 0; j < width; j++) { 32206 for (var i1 = 0; i1 < 4; i1++) { 32207 var i = i0 + i1; 32208 if (i >= height) 32209 break; 32210 var index = i * width + j; 32211 32212 // significant but not those that have just become 32213 if (!coefficentsMagnitude[index] || 32214 (processingFlags[index] & processedMask) != 0) 32215 continue; 32216 32217 var contextLabel = 16; 32218 if ((processingFlags[index] & 32219 firstMagnitudeBitMask) != 0) { 32220 processingFlags[i * width + j] ^= firstMagnitudeBitMask; 32221 // first refinement 32222 var significance = neighborsSignificance[index]; 32223 var sumOfSignificance = (significance & 3) + 32224 ((significance >> 2) & 3) + ((significance >> 4) & 7); 32225 contextLabel = sumOfSignificance >= 1 ? 15 : 14; 32226 } 32227 32228 var cx = contexts[contextLabel]; 32229 var bit = decoder.readBit(cx); 32230 coefficentsMagnitude[index] = 32231 (coefficentsMagnitude[index] << 1) | bit; 32232 bitsDecoded[index]++; 32233 processingFlags[index] |= processedMask; 32234 } 32235 } 32236 } 32237 }, 32238 runCleanupPass: function BitModel_runCleanupPass() { 32239 var decoder = this.decoder; 32240 var width = this.width, height = this.height; 32241 var neighborsSignificance = this.neighborsSignificance; 32242 var significanceState = this.significanceState; 32243 var coefficentsMagnitude = this.coefficentsMagnitude; 32244 var coefficentsSign = this.coefficentsSign; 32245 var contexts = this.contexts; 32246 var labels = this.contextLabelTable; 32247 var bitsDecoded = this.bitsDecoded; 32248 var processingFlags = this.processingFlags; 32249 var processedMask = 1; 32250 var firstMagnitudeBitMask = 2; 32251 var oneRowDown = width; 32252 var twoRowsDown = width * 2; 32253 var threeRowsDown = width * 3; 32254 for (var i0 = 0; i0 < height; i0 += 4) { 32255 for (var j = 0; j < width; j++) { 32256 var index0 = i0 * width + j; 32257 // using the property: labels[neighborsSignificance[index]] == 0 32258 // when neighborsSignificance[index] == 0 32259 var allEmpty = i0 + 3 < height && 32260 processingFlags[index0] == 0 && 32261 processingFlags[index0 + oneRowDown] == 0 && 32262 processingFlags[index0 + twoRowsDown] == 0 && 32263 processingFlags[index0 + threeRowsDown] == 0 && 32264 neighborsSignificance[index0] == 0 && 32265 neighborsSignificance[index0 + oneRowDown] == 0 && 32266 neighborsSignificance[index0 + twoRowsDown] == 0 && 32267 neighborsSignificance[index0 + threeRowsDown] == 0; 32268 var i1 = 0, index = index0; 32269 var cx, i; 32270 if (allEmpty) { 32271 cx = this.runLengthContext; 32272 var hasSignificantCoefficent = decoder.readBit(cx); 32273 if (!hasSignificantCoefficent) { 32274 bitsDecoded[index0]++; 32275 bitsDecoded[index0 + oneRowDown]++; 32276 bitsDecoded[index0 + twoRowsDown]++; 32277 bitsDecoded[index0 + threeRowsDown]++; 32278 continue; // next column 32279 } 32280 cx = this.uniformContext; 32281 i1 = (decoder.readBit(cx) << 1) | decoder.readBit(cx); 32282 i = i0 + i1; 32283 index += i1 * width; 32284 32285 var sign = this.decodeSignBit(i, j); 32286 coefficentsSign[index] = sign; 32287 coefficentsMagnitude[index] = 1; 32288 this.setNeighborsSignificance(i, j); 32289 processingFlags[index] |= firstMagnitudeBitMask; 32290 32291 index = index0; 32292 for (var i2 = i0; i2 <= i; i2++, index += width) 32293 bitsDecoded[index]++; 32294 32295 i1++; 32296 } 32297 for (; i1 < 4; i1++, index += width) { 32298 i = i0 + i1; 32299 if (i >= height) 32300 break; 32301 32302 if (coefficentsMagnitude[index] || 32303 (processingFlags[index] & processedMask) != 0) 32304 continue; 32305 32306 var contextLabel = labels[neighborsSignificance[index]]; 32307 cx = contexts[contextLabel]; 32308 var decision = decoder.readBit(cx); 32309 if (decision == 1) { 32310 var sign = this.decodeSignBit(i, j); 32311 coefficentsSign[index] = sign; 32312 coefficentsMagnitude[index] = 1; 32313 this.setNeighborsSignificance(i, j); 32314 processingFlags[index] |= firstMagnitudeBitMask; 32315 } 32316 bitsDecoded[index]++; 32317 } 32318 } 32319 } 32320 } 32321 }; 32322 32323 return BitModel; 32324 })(); 32325 32326 // Section F, Discrete wavelet transofrmation 32327 var Transform = (function TransformClosure() { 32328 function Transform() { 32329 } 32330 Transform.prototype.calculate = 32331 function transformCalculate(subbands, u0, v0) { 32332 var ll = subbands[0]; 32333 for (var i = 1, ii = subbands.length, j = 1; i < ii; i += 3, j++) { 32334 ll = this.iterate(ll, subbands[i], subbands[i + 1], 32335 subbands[i + 2], u0, v0); 32336 } 32337 return ll; 32338 }; 32339 Transform.prototype.iterate = function Transform_iterate(ll, hl, lh, hh, 32340 u0, v0) { 32341 var llWidth = ll.width, llHeight = ll.height, llItems = ll.items; 32342 var hlWidth = hl.width, hlHeight = hl.height, hlItems = hl.items; 32343 var lhWidth = lh.width, lhHeight = lh.height, lhItems = lh.items; 32344 var hhWidth = hh.width, hhHeight = hh.height, hhItems = hh.items; 32345 32346 // Section F.3.3 interleave 32347 var width = llWidth + hlWidth; 32348 var height = llHeight + lhHeight; 32349 var items = new Float32Array(width * height); 32350 for (var i = 0, ii = llHeight; i < ii; i++) { 32351 var k = i * llWidth, l = i * 2 * width; 32352 for (var j = 0, jj = llWidth; j < jj; j++, k++, l += 2) 32353 items[l] = llItems[k]; 32354 } 32355 for (var i = 0, ii = hlHeight; i < ii; i++) { 32356 var k = i * hlWidth, l = i * 2 * width + 1; 32357 for (var j = 0, jj = hlWidth; j < jj; j++, k++, l += 2) 32358 items[l] = hlItems[k]; 32359 } 32360 for (var i = 0, ii = lhHeight; i < ii; i++) { 32361 var k = i * lhWidth, l = (i * 2 + 1) * width; 32362 for (var j = 0, jj = lhWidth; j < jj; j++, k++, l += 2) 32363 items[l] = lhItems[k]; 32364 } 32365 for (var i = 0, ii = hhHeight; i < ii; i++) { 32366 var k = i * hhWidth, l = (i * 2 + 1) * width + 1; 32367 for (var j = 0, jj = hhWidth; j < jj; j++, k++, l += 2) 32368 items[l] = hhItems[k]; 32369 } 32370 32371 var bufferPadding = 4; 32372 var bufferLength = new Float32Array(Math.max(width, height) + 32373 2 * bufferPadding); 32374 var buffer = new Float32Array(bufferLength); 32375 var bufferOut = new Float32Array(bufferLength); 32376 32377 // Section F.3.4 HOR_SR 32378 for (var v = 0; v < height; v++) { 32379 if (width == 1) { 32380 // if width = 1, when u0 even keep items as is, when odd divide by 2 32381 if ((u0 % 1) != 0) { 32382 items[v * width] /= 2; 32383 } 32384 continue; 32385 } 32386 32387 var k = v * width; 32388 var l = bufferPadding; 32389 for (var u = 0; u < width; u++, k++, l++) 32390 buffer[l] = items[k]; 32391 32392 // Section F.3.7 extending... using max extension of 4 32393 var i1 = bufferPadding - 1, j1 = bufferPadding + 1; 32394 var i2 = bufferPadding + width - 2, j2 = bufferPadding + width; 32395 buffer[i1--] = buffer[j1++]; 32396 buffer[j2++] = buffer[i2--]; 32397 buffer[i1--] = buffer[j1++]; 32398 buffer[j2++] = buffer[i2--]; 32399 buffer[i1--] = buffer[j1++]; 32400 buffer[j2++] = buffer[i2--]; 32401 buffer[i1--] = buffer[j1++]; 32402 buffer[j2++] = buffer[i2--]; 32403 32404 this.filter(buffer, bufferPadding, width, u0, bufferOut); 32405 32406 k = v * width; 32407 l = bufferPadding; 32408 for (var u = 0; u < width; u++, k++, l++) 32409 items[k] = bufferOut[l]; 32410 } 32411 32412 // Section F.3.5 VER_SR 32413 for (var u = 0; u < width; u++) { 32414 if (height == 1) { 32415 // if height = 1, when v0 even keep items as is, when odd divide by 2 32416 if ((v0 % 1) != 0) { 32417 items[u] /= 2; 32418 } 32419 continue; 32420 } 32421 32422 var k = u; 32423 var l = bufferPadding; 32424 for (var v = 0; v < height; v++, k += width, l++) 32425 buffer[l] = items[k]; 32426 32427 // Section F.3.7 extending... using max extension of 4 32428 var i1 = bufferPadding - 1, j1 = bufferPadding + 1; 32429 var i2 = bufferPadding + height - 2, j2 = bufferPadding + height; 32430 buffer[i1--] = buffer[j1++]; 32431 buffer[j2++] = buffer[i2--]; 32432 buffer[i1--] = buffer[j1++]; 32433 buffer[j2++] = buffer[i2--]; 32434 buffer[i1--] = buffer[j1++]; 32435 buffer[j2++] = buffer[i2--]; 32436 buffer[i1--] = buffer[j1++]; 32437 buffer[j2++] = buffer[i2--]; 32438 32439 this.filter(buffer, bufferPadding, height, v0, bufferOut); 32440 32441 k = u; 32442 l = bufferPadding; 32443 for (var v = 0; v < height; v++, k += width, l++) 32444 items[k] = bufferOut[l]; 32445 } 32446 return { 32447 width: width, 32448 height: height, 32449 items: items 32450 }; 32451 }; 32452 return Transform; 32453 })(); 32454 32455 // Section 3.8.2 Irreversible 9-7 filter 32456 var IrreversibleTransform = (function IrreversibleTransformClosure() { 32457 function IrreversibleTransform() { 32458 Transform.call(this); 32459 } 32460 32461 IrreversibleTransform.prototype = Object.create(Transform.prototype); 32462 IrreversibleTransform.prototype.filter = 32463 function irreversibleTransformFilter(y, offset, length, i0, x) { 32464 var i0_ = Math.floor(i0 / 2); 32465 var i1_ = Math.floor((i0 + length) / 2); 32466 var offset_ = offset - (i0 % 1); 32467 32468 var alpha = -1.586134342059924; 32469 var beta = -0.052980118572961; 32470 var gamma = 0.882911075530934; 32471 var delta = 0.443506852043971; 32472 var K = 1.230174104914001; 32473 var K_ = 1 / K; 32474 32475 // step 1 32476 var j = offset_ - 2; 32477 for (var n = i0_ - 1, nn = i1_ + 2; n < nn; n++, j += 2) 32478 x[j] = K * y[j]; 32479 32480 // step 2 32481 var j = offset_ - 3; 32482 for (var n = i0_ - 2, nn = i1_ + 2; n < nn; n++, j += 2) 32483 x[j] = K_ * y[j]; 32484 32485 // step 3 32486 var j = offset_ - 2; 32487 for (var n = i0_ - 1, nn = i1_ + 2; n < nn; n++, j += 2) 32488 x[j] -= delta * (x[j - 1] + x[j + 1]); 32489 32490 // step 4 32491 var j = offset_ - 1; 32492 for (var n = i0_ - 1, nn = i1_ + 1; n < nn; n++, j += 2) 32493 x[j] -= gamma * (x[j - 1] + x[j + 1]); 32494 32495 // step 5 32496 var j = offset_; 32497 for (var n = i0_, nn = i1_ + 1; n < nn; n++, j += 2) 32498 x[j] -= beta * (x[j - 1] + x[j + 1]); 32499 32500 // step 6 32501 var j = offset_ + 1; 32502 for (var n = i0_, nn = i1_; n < nn; n++, j += 2) 32503 x[j] -= alpha * (x[j - 1] + x[j + 1]); 32504 }; 32505 32506 return IrreversibleTransform; 32507 })(); 32508 32509 // Section 3.8.1 Reversible 5-3 filter 32510 var ReversibleTransform = (function ReversibleTransformClosure() { 32511 function ReversibleTransform() { 32512 Transform.call(this); 32513 } 32514 32515 ReversibleTransform.prototype = Object.create(Transform.prototype); 32516 ReversibleTransform.prototype.filter = 32517 function reversibleTransformFilter(y, offset, length, i0, x) { 32518 var i0_ = Math.floor(i0 / 2); 32519 var i1_ = Math.floor((i0 + length) / 2); 32520 var offset_ = offset - (i0 % 1); 32521 32522 for (var n = i0_, nn = i1_ + 1, j = offset_; n < nn; n++, j += 2) 32523 x[j] = y[j] - Math.floor((y[j - 1] + y[j + 1] + 2) / 4); 32524 32525 for (var n = i0_, nn = i1_, j = offset_ + 1; n < nn; n++, j += 2) 32526 x[j] = y[j] + Math.floor((x[j - 1] + x[j + 1]) / 2); 32527 }; 32528 32529 return ReversibleTransform; 32530 })(); 32531 32532 return JpxImage; 32533 })(); 32534 32535 32536 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 32537 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ 32538 32539 'use strict'; 32540 32541 var bidi = PDFJS.bidi = (function bidiClosure() { 32542 // Character types for symbols from 0000 to 00FF. 32543 var baseTypes = [ 32544 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'S', 'B', 'S', 'WS', 32545 'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 32546 'BN', 'BN', 'B', 'B', 'B', 'S', 'WS', 'ON', 'ON', 'ET', 'ET', 'ET', 'ON', 32547 'ON', 'ON', 'ON', 'ON', 'ON', 'CS', 'ON', 'CS', 'ON', 'EN', 'EN', 'EN', 32548 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'ON', 'ON', 'ON', 'ON', 'ON', 32549 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 32550 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON', 32551 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 32552 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 32553 'L', 'ON', 'ON', 'ON', 'ON', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'BN', 32554 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 32555 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 32556 'BN', 'CS', 'ON', 'ET', 'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'L', 'ON', 32557 'ON', 'ON', 'ON', 'ON', 'ET', 'ET', 'EN', 'EN', 'ON', 'L', 'ON', 'ON', 'ON', 32558 'EN', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 32559 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 32560 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 32561 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 32562 'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L' 32563 ]; 32564 32565 // Character types for symbols from 0600 to 06FF 32566 var arabicTypes = [ 32567 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 32568 'CS', 'AL', 'ON', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 32569 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 32570 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 32571 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 32572 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 32573 'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 32574 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL', 32575 'AL', 'AL', 'AL', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 32576 'AN', 'ET', 'AN', 'AN', 'AL', 'AL', 'AL', 'NSM', 'AL', 'AL', 'AL', 'AL', 32577 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 32578 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 32579 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 32580 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 32581 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 32582 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 32583 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 32584 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 32585 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 32586 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'ON', 'NSM', 32587 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 32588 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL' 32589 ]; 32590 32591 function isOdd(i) { 32592 return (i & 1) != 0; 32593 } 32594 32595 function isEven(i) { 32596 return (i & 1) == 0; 32597 } 32598 32599 function findUnequal(arr, start, value) { 32600 var j; 32601 for (var j = start, jj = arr.length; j < jj; ++j) { 32602 if (arr[j] != value) 32603 return j; 32604 } 32605 return j; 32606 } 32607 32608 function setValues(arr, start, end, value) { 32609 for (var j = start; j < end; ++j) { 32610 arr[j] = value; 32611 } 32612 } 32613 32614 function reverseValues(arr, start, end) { 32615 for (var i = start, j = end - 1; i < j; ++i, --j) { 32616 var temp = arr[i]; 32617 arr[i] = arr[j]; 32618 arr[j] = temp; 32619 } 32620 } 32621 32622 function mirrorGlyphs(c) { 32623 /* 32624 # BidiMirroring-1.txt 32625 0028; 0029 # LEFT PARENTHESIS 32626 0029; 0028 # RIGHT PARENTHESIS 32627 003C; 003E # LESS-THAN SIGN 32628 003E; 003C # GREATER-THAN SIGN 32629 005B; 005D # LEFT SQUARE BRACKET 32630 005D; 005B # RIGHT SQUARE BRACKET 32631 007B; 007D # LEFT CURLY BRACKET 32632 007D; 007B # RIGHT CURLY BRACKET 32633 00AB; 00BB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK 32634 00BB; 00AB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK 32635 */ 32636 switch (c) { 32637 case '(': 32638 return ')'; 32639 case ')': 32640 return '('; 32641 case '<': 32642 return '>'; 32643 case '>': 32644 return '<'; 32645 case ']': 32646 return '['; 32647 case '[': 32648 return ']'; 32649 case '}': 32650 return '{'; 32651 case '{': 32652 return '}'; 32653 case '\u00AB': 32654 return '\u00BB'; 32655 case '\u00BB': 32656 return '\u00AB'; 32657 default: 32658 return c; 32659 } 32660 } 32661 32662 function bidi(text, startLevel) { 32663 var str = text.str; 32664 var strLength = str.length; 32665 if (strLength == 0) 32666 return str; 32667 32668 // get types, fill arrays 32669 32670 var chars = []; 32671 var types = []; 32672 var oldtypes = []; 32673 var numBidi = 0; 32674 32675 for (var i = 0; i < strLength; ++i) { 32676 chars[i] = str.charAt(i); 32677 32678 var charCode = str.charCodeAt(i); 32679 var charType = 'L'; 32680 if (charCode <= 0x00ff) 32681 charType = baseTypes[charCode]; 32682 else if (0x0590 <= charCode && charCode <= 0x05f4) 32683 charType = 'R'; 32684 else if (0x0600 <= charCode && charCode <= 0x06ff) 32685 charType = arabicTypes[charCode & 0xff]; 32686 else if (0x0700 <= charCode && charCode <= 0x08AC) 32687 charType = 'AL'; 32688 32689 if (charType == 'R' || charType == 'AL' || charType == 'AN') 32690 numBidi++; 32691 32692 oldtypes[i] = types[i] = charType; 32693 } 32694 32695 // detect the bidi method 32696 // if there are no rtl characters then no bidi needed 32697 // if less than 30% chars are rtl then string is primarily ltr 32698 // if more than 30% chars are rtl then string is primarily rtl 32699 if (numBidi == 0) { 32700 text.direction = 'ltr'; 32701 return str; 32702 } 32703 32704 if (startLevel == -1) { 32705 if ((strLength / numBidi) < 0.3) { 32706 text.direction = 'ltr'; 32707 startLevel = 0; 32708 } else { 32709 text.direction = 'rtl'; 32710 startLevel = 1; 32711 } 32712 } 32713 32714 var levels = []; 32715 32716 for (var i = 0; i < strLength; ++i) { 32717 levels[i] = startLevel; 32718 } 32719 32720 /* 32721 X1-X10: skip most of this, since we are NOT doing the embeddings. 32722 */ 32723 32724 var e = isOdd(startLevel) ? 'R' : 'L'; 32725 var sor = e; 32726 var eor = sor; 32727 32728 /* 32729 W1. Examine each non-spacing mark (NSM) in the level run, and change the 32730 type of the NSM to the type of the previous character. If the NSM is at the 32731 start of the level run, it will get the type of sor. 32732 */ 32733 32734 var lastType = sor; 32735 for (var i = 0; i < strLength; ++i) { 32736 if (types[i] == 'NSM') 32737 types[i] = lastType; 32738 else 32739 lastType = types[i]; 32740 } 32741 32742 /* 32743 W2. Search backwards from each instance of a European number until the 32744 first strong type (R, L, AL, or sor) is found. If an AL is found, change 32745 the type of the European number to Arabic number. 32746 */ 32747 32748 var lastType = sor; 32749 for (var i = 0; i < strLength; ++i) { 32750 var t = types[i]; 32751 if (t == 'EN') 32752 types[i] = (lastType == 'AL') ? 'AN' : 'EN'; 32753 else if (t == 'R' || t == 'L' || t == 'AL') 32754 lastType = t; 32755 } 32756 32757 /* 32758 W3. Change all ALs to R. 32759 */ 32760 32761 for (var i = 0; i < strLength; ++i) { 32762 var t = types[i]; 32763 if (t == 'AL') 32764 types[i] = 'R'; 32765 } 32766 32767 /* 32768 W4. A single European separator between two European numbers changes to a 32769 European number. A single common separator between two numbers of the same 32770 type changes to that type: 32771 */ 32772 32773 for (var i = 1; i < strLength - 1; ++i) { 32774 if (types[i] == 'ES' && types[i - 1] == 'EN' && types[i + 1] == 'EN') 32775 types[i] = 'EN'; 32776 if (types[i] == 'CS' && (types[i - 1] == 'EN' || types[i - 1] == 'AN') && 32777 types[i + 1] == types[i - 1]) 32778 types[i] = types[i - 1]; 32779 } 32780 32781 /* 32782 W5. A sequence of European terminators adjacent to European numbers changes 32783 to all European numbers: 32784 */ 32785 32786 for (var i = 0; i < strLength; ++i) { 32787 if (types[i] == 'EN') { 32788 // do before 32789 for (var j = i - 1; j >= 0; --j) { 32790 if (types[j] != 'ET') 32791 break; 32792 types[j] = 'EN'; 32793 } 32794 // do after 32795 for (var j = i + 1; j < strLength; --j) { 32796 if (types[j] != 'ET') 32797 break; 32798 types[j] = 'EN'; 32799 } 32800 } 32801 } 32802 32803 /* 32804 W6. Otherwise, separators and terminators change to Other Neutral: 32805 */ 32806 32807 for (var i = 0; i < strLength; ++i) { 32808 var t = types[i]; 32809 if (t == 'WS' || t == 'ES' || t == 'ET' || t == 'CS') 32810 types[i] = 'ON'; 32811 } 32812 32813 /* 32814 W7. Search backwards from each instance of a European number until the 32815 first strong type (R, L, or sor) is found. If an L is found, then change 32816 the type of the European number to L. 32817 */ 32818 32819 var lastType = sor; 32820 for (var i = 0; i < strLength; ++i) { 32821 var t = types[i]; 32822 if (t == 'EN') 32823 types[i] = (lastType == 'L') ? 'L' : 'EN'; 32824 else if (t == 'R' || t == 'L') 32825 lastType = t; 32826 } 32827 32828 /* 32829 N1. A sequence of neutrals takes the direction of the surrounding strong 32830 text if the text on both sides has the same direction. European and Arabic 32831 numbers are treated as though they were R. Start-of-level-run (sor) and 32832 end-of-level-run (eor) are used at level run boundaries. 32833 */ 32834 32835 for (var i = 0; i < strLength; ++i) { 32836 if (types[i] == 'ON') { 32837 var end = findUnequal(types, i + 1, 'ON'); 32838 var before = sor; 32839 if (i > 0) 32840 before = types[i - 1]; 32841 var after = eor; 32842 if (end + 1 < strLength) 32843 after = types[end + 1]; 32844 if (before != 'L') 32845 before = 'R'; 32846 if (after != 'L') 32847 after = 'R'; 32848 if (before == after) 32849 setValues(types, i, end, before); 32850 i = end - 1; // reset to end (-1 so next iteration is ok) 32851 } 32852 } 32853 32854 /* 32855 N2. Any remaining neutrals take the embedding direction. 32856 */ 32857 32858 for (var i = 0; i < strLength; ++i) { 32859 if (types[i] == 'ON') 32860 types[i] = e; 32861 } 32862 32863 /* 32864 I1. For all characters with an even (left-to-right) embedding direction, 32865 those of type R go up one level and those of type AN or EN go up two 32866 levels. 32867 I2. For all characters with an odd (right-to-left) embedding direction, 32868 those of type L, EN or AN go up one level. 32869 */ 32870 32871 for (var i = 0; i < strLength; ++i) { 32872 var t = types[i]; 32873 if (isEven(levels[i])) { 32874 if (t == 'R') { 32875 levels[i] += 1; 32876 } else if (t == 'AN' || t == 'EN') { 32877 levels[i] += 2; 32878 } 32879 } else { // isOdd, so 32880 if (t == 'L' || t == 'AN' || t == 'EN') { 32881 levels[i] += 1; 32882 } 32883 } 32884 } 32885 32886 /* 32887 L1. On each line, reset the embedding level of the following characters to 32888 the paragraph embedding level: 32889 32890 segment separators, 32891 paragraph separators, 32892 any sequence of whitespace characters preceding a segment separator or 32893 paragraph separator, and any sequence of white space characters at the end 32894 of the line. 32895 */ 32896 32897 // don't bother as text is only single line 32898 32899 /* 32900 L2. From the highest level found in the text to the lowest odd level on 32901 each line, reverse any contiguous sequence of characters that are at that 32902 level or higher. 32903 */ 32904 32905 // find highest level & lowest odd level 32906 32907 var highestLevel = -1; 32908 var lowestOddLevel = 99; 32909 for (var i = 0, ii = levels.length; i < ii; ++i) { 32910 var level = levels[i]; 32911 if (highestLevel < level) 32912 highestLevel = level; 32913 if (lowestOddLevel > level && isOdd(level)) 32914 lowestOddLevel = level; 32915 } 32916 32917 // now reverse between those limits 32918 32919 for (var level = highestLevel; level >= lowestOddLevel; --level) { 32920 // find segments to reverse 32921 var start = -1; 32922 for (var i = 0, ii = levels.length; i < ii; ++i) { 32923 if (levels[i] < level) { 32924 if (start >= 0) { 32925 reverseValues(chars, start, i); 32926 start = -1; 32927 } 32928 } else if (start < 0) { 32929 start = i; 32930 } 32931 } 32932 if (start >= 0) { 32933 reverseValues(chars, start, levels.length); 32934 } 32935 } 32936 32937 /* 32938 L3. Combining marks applied to a right-to-left base character will at this 32939 point precede their base character. If the rendering engine expects them to 32940 follow the base characters in the final display process, then the ordering 32941 of the marks and the base character must be reversed. 32942 */ 32943 32944 // don't bother for now 32945 32946 /* 32947 L4. A character that possesses the mirrored property as specified by 32948 Section 4.7, Mirrored, must be depicted by a mirrored glyph if the resolved 32949 directionality of that character is R. 32950 */ 32951 32952 // don't mirror as characters are already mirrored in the pdf 32953 32954 // Finally, return string 32955 32956 var result = ''; 32957 for (var i = 0, ii = chars.length; i < ii; ++i) { 32958 var ch = chars[i]; 32959 if (ch != '<' && ch != '>') 32960 result += ch; 32961 } 32962 return result; 32963 } 32964 32965 return bidi; 32966 })(); 32967 32968 32969 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 32970 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ 32971 32972 'use strict'; 32973 32974 var Metadata = PDFJS.Metadata = (function MetadataClosure() { 32975 function fixMetadata(meta) { 32976 return meta.replace(/>\\376\\377([^<]+)/g, function(all, codes) { 32977 var bytes = codes.replace(/\\([0-3])([0-7])([0-7])/g, 32978 function(code, d1, d2, d3) { 32979 return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1); 32980 }); 32981 var chars = ''; 32982 for (var i = 0; i < bytes.length; i += 2) { 32983 var code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1); 32984 chars += code >= 32 && code < 127 && code != 60 && code != 62 && 32985 code != 38 && false ? String.fromCharCode(code) : 32986 '&#x' + (0x10000 + code).toString(16).substring(1) + ';'; 32987 } 32988 return '>' + chars; 32989 }); 32990 } 32991 32992 function Metadata(meta) { 32993 if (typeof meta === 'string') { 32994 // Ghostscript produces invalid metadata 32995 meta = fixMetadata(meta); 32996 32997 var parser = new DOMParser(); 32998 meta = parser.parseFromString(meta, 'application/xml'); 32999 } else if (!(meta instanceof Document)) { 33000 error('Metadata: Invalid metadata object'); 33001 } 33002 33003 this.metaDocument = meta; 33004 this.metadata = {}; 33005 this.parse(); 33006 } 33007 33008 Metadata.prototype = { 33009 parse: function Metadata_parse() { 33010 var doc = this.metaDocument; 33011 var rdf = doc.documentElement; 33012 33013 if (rdf.nodeName.toLowerCase() !== 'rdf:rdf') { // Wrapped in <xmpmeta> 33014 rdf = rdf.firstChild; 33015 while (rdf && rdf.nodeName.toLowerCase() !== 'rdf:rdf') 33016 rdf = rdf.nextSibling; 33017 } 33018 33019 var nodeName = (rdf) ? rdf.nodeName.toLowerCase() : null; 33020 if (!rdf || nodeName !== 'rdf:rdf' || !rdf.hasChildNodes()) 33021 return; 33022 33023 var childNodes = rdf.childNodes, desc, namespace, entries, entry; 33024 33025 for (var i = 0, length = childNodes.length; i < length; i++) { 33026 desc = childNodes[i]; 33027 if (desc.nodeName.toLowerCase() !== 'rdf:description') 33028 continue; 33029 33030 entries = []; 33031 for (var ii = 0, iLength = desc.childNodes.length; ii < iLength; ii++) { 33032 if (desc.childNodes[ii].nodeName.toLowerCase() !== '#text') 33033 entries.push(desc.childNodes[ii]); 33034 } 33035 33036 for (ii = 0, iLength = entries.length; ii < iLength; ii++) { 33037 var entry = entries[ii]; 33038 var name = entry.nodeName.toLowerCase(); 33039 this.metadata[name] = entry.textContent.trim(); 33040 } 33041 } 33042 }, 33043 33044 get: function Metadata_get(name) { 33045 return this.metadata[name] || null; 33046 }, 33047 33048 has: function Metadata_has(name) { 33049 return typeof this.metadata[name] !== 'undefined'; 33050 } 33051 }; 33052 33053 return Metadata; 33054 })(); 33055 33056 }).call((typeof PdfJS_window.window === 'undefined') ? this : PdfJS_window.window); 33057