ruby-prawn-2.1.0.orig/0000755000000000000000000000000012665203156013263 5ustar rootrootruby-prawn-2.1.0.orig/data/0000755000000000000000000000000012665203156014174 5ustar rootrootruby-prawn-2.1.0.orig/data/fonts/0000755000000000000000000000000012725515642015330 5ustar rootrootruby-prawn-2.1.0.orig/data/fonts/Courier.afm0000644000000000000000000003574712665203156017442 0ustar rootrootStartFontMetrics 4.1 Comment Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. Comment Creation Date: Thu May 1 17:27:09 1997 Comment UniqueID 43050 Comment VMusage 39754 50779 FontName Courier FullName Courier FamilyName Courier Weight Medium ItalicAngle 0 IsFixedPitch true CharacterSet ExtendedRoman FontBBox -23 -250 715 805 UnderlinePosition -100 UnderlineThickness 50 Version 003.000 Notice Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. EncodingScheme AdobeStandardEncoding CapHeight 562 XHeight 426 Ascender 629 Descender -157 StdHW 51 StdVW 51 StartCharMetrics 315 C 32 ; WX 600 ; N space ; B 0 0 0 0 ; C 33 ; WX 600 ; N exclam ; B 236 -15 364 572 ; C 34 ; WX 600 ; N quotedbl ; B 187 328 413 562 ; C 35 ; WX 600 ; N numbersign ; B 93 -32 507 639 ; C 36 ; WX 600 ; N dollar ; B 105 -126 496 662 ; C 37 ; WX 600 ; N percent ; B 81 -15 518 622 ; C 38 ; WX 600 ; N ampersand ; B 63 -15 538 543 ; C 39 ; WX 600 ; N quoteright ; B 213 328 376 562 ; C 40 ; WX 600 ; N parenleft ; B 269 -108 440 622 ; C 41 ; WX 600 ; N parenright ; B 160 -108 331 622 ; C 42 ; WX 600 ; N asterisk ; B 116 257 484 607 ; C 43 ; WX 600 ; N plus ; B 80 44 520 470 ; C 44 ; WX 600 ; N comma ; B 181 -112 344 122 ; C 45 ; WX 600 ; N hyphen ; B 103 231 497 285 ; C 46 ; WX 600 ; N period ; B 229 -15 371 109 ; C 47 ; WX 600 ; N slash ; B 125 -80 475 629 ; C 48 ; WX 600 ; N zero ; B 106 -15 494 622 ; C 49 ; WX 600 ; N one ; B 96 0 505 622 ; C 50 ; WX 600 ; N two ; B 70 0 471 622 ; C 51 ; WX 600 ; N three ; B 75 -15 466 622 ; C 52 ; WX 600 ; N four ; B 78 0 500 622 ; C 53 ; WX 600 ; N five ; B 92 -15 497 607 ; C 54 ; WX 600 ; N six ; B 111 -15 497 622 ; C 55 ; WX 600 ; N seven ; B 82 0 483 607 ; C 56 ; WX 600 ; N eight ; B 102 -15 498 622 ; C 57 ; WX 600 ; N nine ; B 96 -15 489 622 ; C 58 ; WX 600 ; N colon ; B 229 -15 371 385 ; C 59 ; WX 600 ; N semicolon ; B 181 -112 371 385 ; C 60 ; WX 600 ; N less ; B 41 42 519 472 ; C 61 ; WX 600 ; N equal ; B 80 138 520 376 ; C 62 ; WX 600 ; N greater ; B 66 42 544 472 ; C 63 ; WX 600 ; N question ; B 129 -15 492 572 ; C 64 ; WX 600 ; N at ; B 77 -15 533 622 ; C 65 ; WX 600 ; N A ; B 3 0 597 562 ; C 66 ; WX 600 ; N B ; B 43 0 559 562 ; C 67 ; WX 600 ; N C ; B 41 -18 540 580 ; C 68 ; WX 600 ; N D ; B 43 0 574 562 ; C 69 ; WX 600 ; N E ; B 53 0 550 562 ; C 70 ; WX 600 ; N F ; B 53 0 545 562 ; C 71 ; WX 600 ; N G ; B 31 -18 575 580 ; C 72 ; WX 600 ; N H ; B 32 0 568 562 ; C 73 ; WX 600 ; N I ; B 96 0 504 562 ; C 74 ; WX 600 ; N J ; B 34 -18 566 562 ; C 75 ; WX 600 ; N K ; B 38 0 582 562 ; C 76 ; WX 600 ; N L ; B 47 0 554 562 ; C 77 ; WX 600 ; N M ; B 4 0 596 562 ; C 78 ; WX 600 ; N N ; B 7 -13 593 562 ; C 79 ; WX 600 ; N O ; B 43 -18 557 580 ; C 80 ; WX 600 ; N P ; B 79 0 558 562 ; C 81 ; WX 600 ; N Q ; B 43 -138 557 580 ; C 82 ; WX 600 ; N R ; B 38 0 588 562 ; C 83 ; WX 600 ; N S ; B 72 -20 529 580 ; C 84 ; WX 600 ; N T ; B 38 0 563 562 ; C 85 ; WX 600 ; N U ; B 17 -18 583 562 ; C 86 ; WX 600 ; N V ; B -4 -13 604 562 ; C 87 ; WX 600 ; N W ; B -3 -13 603 562 ; C 88 ; WX 600 ; N X ; B 23 0 577 562 ; C 89 ; WX 600 ; N Y ; B 24 0 576 562 ; C 90 ; WX 600 ; N Z ; B 86 0 514 562 ; C 91 ; WX 600 ; N bracketleft ; B 269 -108 442 622 ; C 92 ; WX 600 ; N backslash ; B 118 -80 482 629 ; C 93 ; WX 600 ; N bracketright ; B 158 -108 331 622 ; C 94 ; WX 600 ; N asciicircum ; B 94 354 506 622 ; C 95 ; WX 600 ; N underscore ; B 0 -125 600 -75 ; C 96 ; WX 600 ; N quoteleft ; B 224 328 387 562 ; C 97 ; WX 600 ; N a ; B 53 -15 559 441 ; C 98 ; WX 600 ; N b ; B 14 -15 575 629 ; C 99 ; WX 600 ; N c ; B 66 -15 529 441 ; C 100 ; WX 600 ; N d ; B 45 -15 591 629 ; C 101 ; WX 600 ; N e ; B 66 -15 548 441 ; C 102 ; WX 600 ; N f ; B 114 0 531 629 ; L i fi ; L l fl ; C 103 ; WX 600 ; N g ; B 45 -157 566 441 ; C 104 ; WX 600 ; N h ; B 18 0 582 629 ; C 105 ; WX 600 ; N i ; B 95 0 505 657 ; C 106 ; WX 600 ; N j ; B 82 -157 410 657 ; C 107 ; WX 600 ; N k ; B 43 0 580 629 ; C 108 ; WX 600 ; N l ; B 95 0 505 629 ; C 109 ; WX 600 ; N m ; B -5 0 605 441 ; C 110 ; WX 600 ; N n ; B 26 0 575 441 ; C 111 ; WX 600 ; N o ; B 62 -15 538 441 ; C 112 ; WX 600 ; N p ; B 9 -157 555 441 ; C 113 ; WX 600 ; N q ; B 45 -157 591 441 ; C 114 ; WX 600 ; N r ; B 60 0 559 441 ; C 115 ; WX 600 ; N s ; B 80 -15 513 441 ; C 116 ; WX 600 ; N t ; B 87 -15 530 561 ; C 117 ; WX 600 ; N u ; B 21 -15 562 426 ; C 118 ; WX 600 ; N v ; B 10 -10 590 426 ; C 119 ; WX 600 ; N w ; B -4 -10 604 426 ; C 120 ; WX 600 ; N x ; B 20 0 580 426 ; C 121 ; WX 600 ; N y ; B 7 -157 592 426 ; C 122 ; WX 600 ; N z ; B 99 0 502 426 ; C 123 ; WX 600 ; N braceleft ; B 182 -108 437 622 ; C 124 ; WX 600 ; N bar ; B 275 -250 326 750 ; C 125 ; WX 600 ; N braceright ; B 163 -108 418 622 ; C 126 ; WX 600 ; N asciitilde ; B 63 197 540 320 ; C 161 ; WX 600 ; N exclamdown ; B 236 -157 364 430 ; C 162 ; WX 600 ; N cent ; B 96 -49 500 614 ; C 163 ; WX 600 ; N sterling ; B 84 -21 521 611 ; C 164 ; WX 600 ; N fraction ; B 92 -57 509 665 ; C 165 ; WX 600 ; N yen ; B 26 0 574 562 ; C 166 ; WX 600 ; N florin ; B 4 -143 539 622 ; C 167 ; WX 600 ; N section ; B 113 -78 488 580 ; C 168 ; WX 600 ; N currency ; B 73 58 527 506 ; C 169 ; WX 600 ; N quotesingle ; B 259 328 341 562 ; C 170 ; WX 600 ; N quotedblleft ; B 143 328 471 562 ; C 171 ; WX 600 ; N guillemotleft ; B 37 70 563 446 ; C 172 ; WX 600 ; N guilsinglleft ; B 149 70 451 446 ; C 173 ; WX 600 ; N guilsinglright ; B 149 70 451 446 ; C 174 ; WX 600 ; N fi ; B 3 0 597 629 ; C 175 ; WX 600 ; N fl ; B 3 0 597 629 ; C 177 ; WX 600 ; N endash ; B 75 231 525 285 ; C 178 ; WX 600 ; N dagger ; B 141 -78 459 580 ; C 179 ; WX 600 ; N daggerdbl ; B 141 -78 459 580 ; C 180 ; WX 600 ; N periodcentered ; B 222 189 378 327 ; C 182 ; WX 600 ; N paragraph ; B 50 -78 511 562 ; C 183 ; WX 600 ; N bullet ; B 172 130 428 383 ; C 184 ; WX 600 ; N quotesinglbase ; B 213 -134 376 100 ; C 185 ; WX 600 ; N quotedblbase ; B 143 -134 457 100 ; C 186 ; WX 600 ; N quotedblright ; B 143 328 457 562 ; C 187 ; WX 600 ; N guillemotright ; B 37 70 563 446 ; C 188 ; WX 600 ; N ellipsis ; B 37 -15 563 111 ; C 189 ; WX 600 ; N perthousand ; B 3 -15 600 622 ; C 191 ; WX 600 ; N questiondown ; B 108 -157 471 430 ; C 193 ; WX 600 ; N grave ; B 151 497 378 672 ; C 194 ; WX 600 ; N acute ; B 242 497 469 672 ; C 195 ; WX 600 ; N circumflex ; B 124 477 476 654 ; C 196 ; WX 600 ; N tilde ; B 105 489 503 606 ; C 197 ; WX 600 ; N macron ; B 120 525 480 565 ; C 198 ; WX 600 ; N breve ; B 153 501 447 609 ; C 199 ; WX 600 ; N dotaccent ; B 249 537 352 640 ; C 200 ; WX 600 ; N dieresis ; B 148 537 453 640 ; C 202 ; WX 600 ; N ring ; B 218 463 382 627 ; C 203 ; WX 600 ; N cedilla ; B 224 -151 362 10 ; C 205 ; WX 600 ; N hungarumlaut ; B 133 497 540 672 ; C 206 ; WX 600 ; N ogonek ; B 211 -172 407 4 ; C 207 ; WX 600 ; N caron ; B 124 492 476 669 ; C 208 ; WX 600 ; N emdash ; B 0 231 600 285 ; C 225 ; WX 600 ; N AE ; B 3 0 550 562 ; C 227 ; WX 600 ; N ordfeminine ; B 156 249 442 580 ; C 232 ; WX 600 ; N Lslash ; B 47 0 554 562 ; C 233 ; WX 600 ; N Oslash ; B 43 -80 557 629 ; C 234 ; WX 600 ; N OE ; B 7 0 567 562 ; C 235 ; WX 600 ; N ordmasculine ; B 157 249 443 580 ; C 241 ; WX 600 ; N ae ; B 19 -15 570 441 ; C 245 ; WX 600 ; N dotlessi ; B 95 0 505 426 ; C 248 ; WX 600 ; N lslash ; B 95 0 505 629 ; C 249 ; WX 600 ; N oslash ; B 62 -80 538 506 ; C 250 ; WX 600 ; N oe ; B 19 -15 559 441 ; C 251 ; WX 600 ; N germandbls ; B 48 -15 588 629 ; C -1 ; WX 600 ; N Idieresis ; B 96 0 504 753 ; C -1 ; WX 600 ; N eacute ; B 66 -15 548 672 ; C -1 ; WX 600 ; N abreve ; B 53 -15 559 609 ; C -1 ; WX 600 ; N uhungarumlaut ; B 21 -15 580 672 ; C -1 ; WX 600 ; N ecaron ; B 66 -15 548 669 ; C -1 ; WX 600 ; N Ydieresis ; B 24 0 576 753 ; C -1 ; WX 600 ; N divide ; B 87 48 513 467 ; C -1 ; WX 600 ; N Yacute ; B 24 0 576 805 ; C -1 ; WX 600 ; N Acircumflex ; B 3 0 597 787 ; C -1 ; WX 600 ; N aacute ; B 53 -15 559 672 ; C -1 ; WX 600 ; N Ucircumflex ; B 17 -18 583 787 ; C -1 ; WX 600 ; N yacute ; B 7 -157 592 672 ; C -1 ; WX 600 ; N scommaaccent ; B 80 -250 513 441 ; C -1 ; WX 600 ; N ecircumflex ; B 66 -15 548 654 ; C -1 ; WX 600 ; N Uring ; B 17 -18 583 760 ; C -1 ; WX 600 ; N Udieresis ; B 17 -18 583 753 ; C -1 ; WX 600 ; N aogonek ; B 53 -172 587 441 ; C -1 ; WX 600 ; N Uacute ; B 17 -18 583 805 ; C -1 ; WX 600 ; N uogonek ; B 21 -172 590 426 ; C -1 ; WX 600 ; N Edieresis ; B 53 0 550 753 ; C -1 ; WX 600 ; N Dcroat ; B 30 0 574 562 ; C -1 ; WX 600 ; N commaaccent ; B 198 -250 335 -58 ; C -1 ; WX 600 ; N copyright ; B 0 -18 600 580 ; C -1 ; WX 600 ; N Emacron ; B 53 0 550 698 ; C -1 ; WX 600 ; N ccaron ; B 66 -15 529 669 ; C -1 ; WX 600 ; N aring ; B 53 -15 559 627 ; C -1 ; WX 600 ; N Ncommaaccent ; B 7 -250 593 562 ; C -1 ; WX 600 ; N lacute ; B 95 0 505 805 ; C -1 ; WX 600 ; N agrave ; B 53 -15 559 672 ; C -1 ; WX 600 ; N Tcommaaccent ; B 38 -250 563 562 ; C -1 ; WX 600 ; N Cacute ; B 41 -18 540 805 ; C -1 ; WX 600 ; N atilde ; B 53 -15 559 606 ; C -1 ; WX 600 ; N Edotaccent ; B 53 0 550 753 ; C -1 ; WX 600 ; N scaron ; B 80 -15 513 669 ; C -1 ; WX 600 ; N scedilla ; B 80 -151 513 441 ; C -1 ; WX 600 ; N iacute ; B 95 0 505 672 ; C -1 ; WX 600 ; N lozenge ; B 18 0 443 706 ; C -1 ; WX 600 ; N Rcaron ; B 38 0 588 802 ; C -1 ; WX 600 ; N Gcommaaccent ; B 31 -250 575 580 ; C -1 ; WX 600 ; N ucircumflex ; B 21 -15 562 654 ; C -1 ; WX 600 ; N acircumflex ; B 53 -15 559 654 ; C -1 ; WX 600 ; N Amacron ; B 3 0 597 698 ; C -1 ; WX 600 ; N rcaron ; B 60 0 559 669 ; C -1 ; WX 600 ; N ccedilla ; B 66 -151 529 441 ; C -1 ; WX 600 ; N Zdotaccent ; B 86 0 514 753 ; C -1 ; WX 600 ; N Thorn ; B 79 0 538 562 ; C -1 ; WX 600 ; N Omacron ; B 43 -18 557 698 ; C -1 ; WX 600 ; N Racute ; B 38 0 588 805 ; C -1 ; WX 600 ; N Sacute ; B 72 -20 529 805 ; C -1 ; WX 600 ; N dcaron ; B 45 -15 715 629 ; C -1 ; WX 600 ; N Umacron ; B 17 -18 583 698 ; C -1 ; WX 600 ; N uring ; B 21 -15 562 627 ; C -1 ; WX 600 ; N threesuperior ; B 155 240 406 622 ; C -1 ; WX 600 ; N Ograve ; B 43 -18 557 805 ; C -1 ; WX 600 ; N Agrave ; B 3 0 597 805 ; C -1 ; WX 600 ; N Abreve ; B 3 0 597 732 ; C -1 ; WX 600 ; N multiply ; B 87 43 515 470 ; C -1 ; WX 600 ; N uacute ; B 21 -15 562 672 ; C -1 ; WX 600 ; N Tcaron ; B 38 0 563 802 ; C -1 ; WX 600 ; N partialdiff ; B 17 -38 459 710 ; C -1 ; WX 600 ; N ydieresis ; B 7 -157 592 620 ; C -1 ; WX 600 ; N Nacute ; B 7 -13 593 805 ; C -1 ; WX 600 ; N icircumflex ; B 94 0 505 654 ; C -1 ; WX 600 ; N Ecircumflex ; B 53 0 550 787 ; C -1 ; WX 600 ; N adieresis ; B 53 -15 559 620 ; C -1 ; WX 600 ; N edieresis ; B 66 -15 548 620 ; C -1 ; WX 600 ; N cacute ; B 66 -15 529 672 ; C -1 ; WX 600 ; N nacute ; B 26 0 575 672 ; C -1 ; WX 600 ; N umacron ; B 21 -15 562 565 ; C -1 ; WX 600 ; N Ncaron ; B 7 -13 593 802 ; C -1 ; WX 600 ; N Iacute ; B 96 0 504 805 ; C -1 ; WX 600 ; N plusminus ; B 87 44 513 558 ; C -1 ; WX 600 ; N brokenbar ; B 275 -175 326 675 ; C -1 ; WX 600 ; N registered ; B 0 -18 600 580 ; C -1 ; WX 600 ; N Gbreve ; B 31 -18 575 732 ; C -1 ; WX 600 ; N Idotaccent ; B 96 0 504 753 ; C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ; C -1 ; WX 600 ; N Egrave ; B 53 0 550 805 ; C -1 ; WX 600 ; N racute ; B 60 0 559 672 ; C -1 ; WX 600 ; N omacron ; B 62 -15 538 565 ; C -1 ; WX 600 ; N Zacute ; B 86 0 514 805 ; C -1 ; WX 600 ; N Zcaron ; B 86 0 514 802 ; C -1 ; WX 600 ; N greaterequal ; B 98 0 502 710 ; C -1 ; WX 600 ; N Eth ; B 30 0 574 562 ; C -1 ; WX 600 ; N Ccedilla ; B 41 -151 540 580 ; C -1 ; WX 600 ; N lcommaaccent ; B 95 -250 505 629 ; C -1 ; WX 600 ; N tcaron ; B 87 -15 530 717 ; C -1 ; WX 600 ; N eogonek ; B 66 -172 548 441 ; C -1 ; WX 600 ; N Uogonek ; B 17 -172 583 562 ; C -1 ; WX 600 ; N Aacute ; B 3 0 597 805 ; C -1 ; WX 600 ; N Adieresis ; B 3 0 597 753 ; C -1 ; WX 600 ; N egrave ; B 66 -15 548 672 ; C -1 ; WX 600 ; N zacute ; B 99 0 502 672 ; C -1 ; WX 600 ; N iogonek ; B 95 -172 505 657 ; C -1 ; WX 600 ; N Oacute ; B 43 -18 557 805 ; C -1 ; WX 600 ; N oacute ; B 62 -15 538 672 ; C -1 ; WX 600 ; N amacron ; B 53 -15 559 565 ; C -1 ; WX 600 ; N sacute ; B 80 -15 513 672 ; C -1 ; WX 600 ; N idieresis ; B 95 0 505 620 ; C -1 ; WX 600 ; N Ocircumflex ; B 43 -18 557 787 ; C -1 ; WX 600 ; N Ugrave ; B 17 -18 583 805 ; C -1 ; WX 600 ; N Delta ; B 6 0 598 688 ; C -1 ; WX 600 ; N thorn ; B -6 -157 555 629 ; C -1 ; WX 600 ; N twosuperior ; B 177 249 424 622 ; C -1 ; WX 600 ; N Odieresis ; B 43 -18 557 753 ; C -1 ; WX 600 ; N mu ; B 21 -157 562 426 ; C -1 ; WX 600 ; N igrave ; B 95 0 505 672 ; C -1 ; WX 600 ; N ohungarumlaut ; B 62 -15 580 672 ; C -1 ; WX 600 ; N Eogonek ; B 53 -172 561 562 ; C -1 ; WX 600 ; N dcroat ; B 45 -15 591 629 ; C -1 ; WX 600 ; N threequarters ; B 8 -56 593 666 ; C -1 ; WX 600 ; N Scedilla ; B 72 -151 529 580 ; C -1 ; WX 600 ; N lcaron ; B 95 0 533 629 ; C -1 ; WX 600 ; N Kcommaaccent ; B 38 -250 582 562 ; C -1 ; WX 600 ; N Lacute ; B 47 0 554 805 ; C -1 ; WX 600 ; N trademark ; B -23 263 623 562 ; C -1 ; WX 600 ; N edotaccent ; B 66 -15 548 620 ; C -1 ; WX 600 ; N Igrave ; B 96 0 504 805 ; C -1 ; WX 600 ; N Imacron ; B 96 0 504 698 ; C -1 ; WX 600 ; N Lcaron ; B 47 0 554 562 ; C -1 ; WX 600 ; N onehalf ; B 0 -57 611 665 ; C -1 ; WX 600 ; N lessequal ; B 98 0 502 710 ; C -1 ; WX 600 ; N ocircumflex ; B 62 -15 538 654 ; C -1 ; WX 600 ; N ntilde ; B 26 0 575 606 ; C -1 ; WX 600 ; N Uhungarumlaut ; B 17 -18 590 805 ; C -1 ; WX 600 ; N Eacute ; B 53 0 550 805 ; C -1 ; WX 600 ; N emacron ; B 66 -15 548 565 ; C -1 ; WX 600 ; N gbreve ; B 45 -157 566 609 ; C -1 ; WX 600 ; N onequarter ; B 0 -57 600 665 ; C -1 ; WX 600 ; N Scaron ; B 72 -20 529 802 ; C -1 ; WX 600 ; N Scommaaccent ; B 72 -250 529 580 ; C -1 ; WX 600 ; N Ohungarumlaut ; B 43 -18 580 805 ; C -1 ; WX 600 ; N degree ; B 123 269 477 622 ; C -1 ; WX 600 ; N ograve ; B 62 -15 538 672 ; C -1 ; WX 600 ; N Ccaron ; B 41 -18 540 802 ; C -1 ; WX 600 ; N ugrave ; B 21 -15 562 672 ; C -1 ; WX 600 ; N radical ; B 3 -15 597 792 ; C -1 ; WX 600 ; N Dcaron ; B 43 0 574 802 ; C -1 ; WX 600 ; N rcommaaccent ; B 60 -250 559 441 ; C -1 ; WX 600 ; N Ntilde ; B 7 -13 593 729 ; C -1 ; WX 600 ; N otilde ; B 62 -15 538 606 ; C -1 ; WX 600 ; N Rcommaaccent ; B 38 -250 588 562 ; C -1 ; WX 600 ; N Lcommaaccent ; B 47 -250 554 562 ; C -1 ; WX 600 ; N Atilde ; B 3 0 597 729 ; C -1 ; WX 600 ; N Aogonek ; B 3 -172 608 562 ; C -1 ; WX 600 ; N Aring ; B 3 0 597 750 ; C -1 ; WX 600 ; N Otilde ; B 43 -18 557 729 ; C -1 ; WX 600 ; N zdotaccent ; B 99 0 502 620 ; C -1 ; WX 600 ; N Ecaron ; B 53 0 550 802 ; C -1 ; WX 600 ; N Iogonek ; B 96 -172 504 562 ; C -1 ; WX 600 ; N kcommaaccent ; B 43 -250 580 629 ; C -1 ; WX 600 ; N minus ; B 80 232 520 283 ; C -1 ; WX 600 ; N Icircumflex ; B 96 0 504 787 ; C -1 ; WX 600 ; N ncaron ; B 26 0 575 669 ; C -1 ; WX 600 ; N tcommaaccent ; B 87 -250 530 561 ; C -1 ; WX 600 ; N logicalnot ; B 87 108 513 369 ; C -1 ; WX 600 ; N odieresis ; B 62 -15 538 620 ; C -1 ; WX 600 ; N udieresis ; B 21 -15 562 620 ; C -1 ; WX 600 ; N notequal ; B 15 -16 540 529 ; C -1 ; WX 600 ; N gcommaaccent ; B 45 -157 566 708 ; C -1 ; WX 600 ; N eth ; B 62 -15 538 629 ; C -1 ; WX 600 ; N zcaron ; B 99 0 502 669 ; C -1 ; WX 600 ; N ncommaaccent ; B 26 -250 575 441 ; C -1 ; WX 600 ; N onesuperior ; B 172 249 428 622 ; C -1 ; WX 600 ; N imacron ; B 95 0 505 565 ; C -1 ; WX 600 ; N Euro ; B 0 0 0 0 ; EndCharMetrics EndFontMetrics ruby-prawn-2.1.0.orig/data/fonts/Courier-Bold.afm0000644000000000000000000003574512665203156020316 0ustar rootrootStartFontMetrics 4.1 Comment Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. Comment Creation Date: Mon Jun 23 16:28:00 1997 Comment UniqueID 43048 Comment VMusage 41139 52164 FontName Courier-Bold FullName Courier Bold FamilyName Courier Weight Bold ItalicAngle 0 IsFixedPitch true CharacterSet ExtendedRoman FontBBox -113 -250 749 801 UnderlinePosition -100 UnderlineThickness 50 Version 003.000 Notice Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. EncodingScheme AdobeStandardEncoding CapHeight 562 XHeight 439 Ascender 629 Descender -157 StdHW 84 StdVW 106 StartCharMetrics 315 C 32 ; WX 600 ; N space ; B 0 0 0 0 ; C 33 ; WX 600 ; N exclam ; B 202 -15 398 572 ; C 34 ; WX 600 ; N quotedbl ; B 135 277 465 562 ; C 35 ; WX 600 ; N numbersign ; B 56 -45 544 651 ; C 36 ; WX 600 ; N dollar ; B 82 -126 519 666 ; C 37 ; WX 600 ; N percent ; B 5 -15 595 616 ; C 38 ; WX 600 ; N ampersand ; B 36 -15 546 543 ; C 39 ; WX 600 ; N quoteright ; B 171 277 423 562 ; C 40 ; WX 600 ; N parenleft ; B 219 -102 461 616 ; C 41 ; WX 600 ; N parenright ; B 139 -102 381 616 ; C 42 ; WX 600 ; N asterisk ; B 91 219 509 601 ; C 43 ; WX 600 ; N plus ; B 71 39 529 478 ; C 44 ; WX 600 ; N comma ; B 123 -111 393 174 ; C 45 ; WX 600 ; N hyphen ; B 100 203 500 313 ; C 46 ; WX 600 ; N period ; B 192 -15 408 171 ; C 47 ; WX 600 ; N slash ; B 98 -77 502 626 ; C 48 ; WX 600 ; N zero ; B 87 -15 513 616 ; C 49 ; WX 600 ; N one ; B 81 0 539 616 ; C 50 ; WX 600 ; N two ; B 61 0 499 616 ; C 51 ; WX 600 ; N three ; B 63 -15 501 616 ; C 52 ; WX 600 ; N four ; B 53 0 507 616 ; C 53 ; WX 600 ; N five ; B 70 -15 521 601 ; C 54 ; WX 600 ; N six ; B 90 -15 521 616 ; C 55 ; WX 600 ; N seven ; B 55 0 494 601 ; C 56 ; WX 600 ; N eight ; B 83 -15 517 616 ; C 57 ; WX 600 ; N nine ; B 79 -15 510 616 ; C 58 ; WX 600 ; N colon ; B 191 -15 407 425 ; C 59 ; WX 600 ; N semicolon ; B 123 -111 408 425 ; C 60 ; WX 600 ; N less ; B 66 15 523 501 ; C 61 ; WX 600 ; N equal ; B 71 118 529 398 ; C 62 ; WX 600 ; N greater ; B 77 15 534 501 ; C 63 ; WX 600 ; N question ; B 98 -14 501 580 ; C 64 ; WX 600 ; N at ; B 16 -15 584 616 ; C 65 ; WX 600 ; N A ; B -9 0 609 562 ; C 66 ; WX 600 ; N B ; B 30 0 573 562 ; C 67 ; WX 600 ; N C ; B 22 -18 560 580 ; C 68 ; WX 600 ; N D ; B 30 0 594 562 ; C 69 ; WX 600 ; N E ; B 25 0 560 562 ; C 70 ; WX 600 ; N F ; B 39 0 570 562 ; C 71 ; WX 600 ; N G ; B 22 -18 594 580 ; C 72 ; WX 600 ; N H ; B 20 0 580 562 ; C 73 ; WX 600 ; N I ; B 77 0 523 562 ; C 74 ; WX 600 ; N J ; B 37 -18 601 562 ; C 75 ; WX 600 ; N K ; B 21 0 599 562 ; C 76 ; WX 600 ; N L ; B 39 0 578 562 ; C 77 ; WX 600 ; N M ; B -2 0 602 562 ; C 78 ; WX 600 ; N N ; B 8 -12 610 562 ; C 79 ; WX 600 ; N O ; B 22 -18 578 580 ; C 80 ; WX 600 ; N P ; B 48 0 559 562 ; C 81 ; WX 600 ; N Q ; B 32 -138 578 580 ; C 82 ; WX 600 ; N R ; B 24 0 599 562 ; C 83 ; WX 600 ; N S ; B 47 -22 553 582 ; C 84 ; WX 600 ; N T ; B 21 0 579 562 ; C 85 ; WX 600 ; N U ; B 4 -18 596 562 ; C 86 ; WX 600 ; N V ; B -13 0 613 562 ; C 87 ; WX 600 ; N W ; B -18 0 618 562 ; C 88 ; WX 600 ; N X ; B 12 0 588 562 ; C 89 ; WX 600 ; N Y ; B 12 0 589 562 ; C 90 ; WX 600 ; N Z ; B 62 0 539 562 ; C 91 ; WX 600 ; N bracketleft ; B 245 -102 475 616 ; C 92 ; WX 600 ; N backslash ; B 99 -77 503 626 ; C 93 ; WX 600 ; N bracketright ; B 125 -102 355 616 ; C 94 ; WX 600 ; N asciicircum ; B 108 250 492 616 ; C 95 ; WX 600 ; N underscore ; B 0 -125 600 -75 ; C 96 ; WX 600 ; N quoteleft ; B 178 277 428 562 ; C 97 ; WX 600 ; N a ; B 35 -15 570 454 ; C 98 ; WX 600 ; N b ; B 0 -15 584 626 ; C 99 ; WX 600 ; N c ; B 40 -15 545 459 ; C 100 ; WX 600 ; N d ; B 20 -15 591 626 ; C 101 ; WX 600 ; N e ; B 40 -15 563 454 ; C 102 ; WX 600 ; N f ; B 83 0 547 626 ; L i fi ; L l fl ; C 103 ; WX 600 ; N g ; B 30 -146 580 454 ; C 104 ; WX 600 ; N h ; B 5 0 592 626 ; C 105 ; WX 600 ; N i ; B 77 0 523 658 ; C 106 ; WX 600 ; N j ; B 63 -146 440 658 ; C 107 ; WX 600 ; N k ; B 20 0 585 626 ; C 108 ; WX 600 ; N l ; B 77 0 523 626 ; C 109 ; WX 600 ; N m ; B -22 0 626 454 ; C 110 ; WX 600 ; N n ; B 18 0 592 454 ; C 111 ; WX 600 ; N o ; B 30 -15 570 454 ; C 112 ; WX 600 ; N p ; B -1 -142 570 454 ; C 113 ; WX 600 ; N q ; B 20 -142 591 454 ; C 114 ; WX 600 ; N r ; B 47 0 580 454 ; C 115 ; WX 600 ; N s ; B 68 -17 535 459 ; C 116 ; WX 600 ; N t ; B 47 -15 532 562 ; C 117 ; WX 600 ; N u ; B -1 -15 569 439 ; C 118 ; WX 600 ; N v ; B -1 0 601 439 ; C 119 ; WX 600 ; N w ; B -18 0 618 439 ; C 120 ; WX 600 ; N x ; B 6 0 594 439 ; C 121 ; WX 600 ; N y ; B -4 -142 601 439 ; C 122 ; WX 600 ; N z ; B 81 0 520 439 ; C 123 ; WX 600 ; N braceleft ; B 160 -102 464 616 ; C 124 ; WX 600 ; N bar ; B 255 -250 345 750 ; C 125 ; WX 600 ; N braceright ; B 136 -102 440 616 ; C 126 ; WX 600 ; N asciitilde ; B 71 153 530 356 ; C 161 ; WX 600 ; N exclamdown ; B 202 -146 398 449 ; C 162 ; WX 600 ; N cent ; B 66 -49 518 614 ; C 163 ; WX 600 ; N sterling ; B 72 -28 558 611 ; C 164 ; WX 600 ; N fraction ; B 25 -60 576 661 ; C 165 ; WX 600 ; N yen ; B 10 0 590 562 ; C 166 ; WX 600 ; N florin ; B -30 -131 572 616 ; C 167 ; WX 600 ; N section ; B 83 -70 517 580 ; C 168 ; WX 600 ; N currency ; B 54 49 546 517 ; C 169 ; WX 600 ; N quotesingle ; B 227 277 373 562 ; C 170 ; WX 600 ; N quotedblleft ; B 71 277 535 562 ; C 171 ; WX 600 ; N guillemotleft ; B 8 70 553 446 ; C 172 ; WX 600 ; N guilsinglleft ; B 141 70 459 446 ; C 173 ; WX 600 ; N guilsinglright ; B 141 70 459 446 ; C 174 ; WX 600 ; N fi ; B 12 0 593 626 ; C 175 ; WX 600 ; N fl ; B 12 0 593 626 ; C 177 ; WX 600 ; N endash ; B 65 203 535 313 ; C 178 ; WX 600 ; N dagger ; B 106 -70 494 580 ; C 179 ; WX 600 ; N daggerdbl ; B 106 -70 494 580 ; C 180 ; WX 600 ; N periodcentered ; B 196 165 404 351 ; C 182 ; WX 600 ; N paragraph ; B 6 -70 576 580 ; C 183 ; WX 600 ; N bullet ; B 140 132 460 430 ; C 184 ; WX 600 ; N quotesinglbase ; B 175 -142 427 143 ; C 185 ; WX 600 ; N quotedblbase ; B 65 -142 529 143 ; C 186 ; WX 600 ; N quotedblright ; B 61 277 525 562 ; C 187 ; WX 600 ; N guillemotright ; B 47 70 592 446 ; C 188 ; WX 600 ; N ellipsis ; B 26 -15 574 116 ; C 189 ; WX 600 ; N perthousand ; B -113 -15 713 616 ; C 191 ; WX 600 ; N questiondown ; B 99 -146 502 449 ; C 193 ; WX 600 ; N grave ; B 132 508 395 661 ; C 194 ; WX 600 ; N acute ; B 205 508 468 661 ; C 195 ; WX 600 ; N circumflex ; B 103 483 497 657 ; C 196 ; WX 600 ; N tilde ; B 89 493 512 636 ; C 197 ; WX 600 ; N macron ; B 88 505 512 585 ; C 198 ; WX 600 ; N breve ; B 83 468 517 631 ; C 199 ; WX 600 ; N dotaccent ; B 230 498 370 638 ; C 200 ; WX 600 ; N dieresis ; B 128 498 472 638 ; C 202 ; WX 600 ; N ring ; B 198 481 402 678 ; C 203 ; WX 600 ; N cedilla ; B 205 -206 387 0 ; C 205 ; WX 600 ; N hungarumlaut ; B 68 488 588 661 ; C 206 ; WX 600 ; N ogonek ; B 169 -199 400 0 ; C 207 ; WX 600 ; N caron ; B 103 493 497 667 ; C 208 ; WX 600 ; N emdash ; B -10 203 610 313 ; C 225 ; WX 600 ; N AE ; B -29 0 602 562 ; C 227 ; WX 600 ; N ordfeminine ; B 147 196 453 580 ; C 232 ; WX 600 ; N Lslash ; B 39 0 578 562 ; C 233 ; WX 600 ; N Oslash ; B 22 -22 578 584 ; C 234 ; WX 600 ; N OE ; B -25 0 595 562 ; C 235 ; WX 600 ; N ordmasculine ; B 147 196 453 580 ; C 241 ; WX 600 ; N ae ; B -4 -15 601 454 ; C 245 ; WX 600 ; N dotlessi ; B 77 0 523 439 ; C 248 ; WX 600 ; N lslash ; B 77 0 523 626 ; C 249 ; WX 600 ; N oslash ; B 30 -24 570 463 ; C 250 ; WX 600 ; N oe ; B -18 -15 611 454 ; C 251 ; WX 600 ; N germandbls ; B 22 -15 596 626 ; C -1 ; WX 600 ; N Idieresis ; B 77 0 523 761 ; C -1 ; WX 600 ; N eacute ; B 40 -15 563 661 ; C -1 ; WX 600 ; N abreve ; B 35 -15 570 661 ; C -1 ; WX 600 ; N uhungarumlaut ; B -1 -15 628 661 ; C -1 ; WX 600 ; N ecaron ; B 40 -15 563 667 ; C -1 ; WX 600 ; N Ydieresis ; B 12 0 589 761 ; C -1 ; WX 600 ; N divide ; B 71 16 529 500 ; C -1 ; WX 600 ; N Yacute ; B 12 0 589 784 ; C -1 ; WX 600 ; N Acircumflex ; B -9 0 609 780 ; C -1 ; WX 600 ; N aacute ; B 35 -15 570 661 ; C -1 ; WX 600 ; N Ucircumflex ; B 4 -18 596 780 ; C -1 ; WX 600 ; N yacute ; B -4 -142 601 661 ; C -1 ; WX 600 ; N scommaaccent ; B 68 -250 535 459 ; C -1 ; WX 600 ; N ecircumflex ; B 40 -15 563 657 ; C -1 ; WX 600 ; N Uring ; B 4 -18 596 801 ; C -1 ; WX 600 ; N Udieresis ; B 4 -18 596 761 ; C -1 ; WX 600 ; N aogonek ; B 35 -199 586 454 ; C -1 ; WX 600 ; N Uacute ; B 4 -18 596 784 ; C -1 ; WX 600 ; N uogonek ; B -1 -199 585 439 ; C -1 ; WX 600 ; N Edieresis ; B 25 0 560 761 ; C -1 ; WX 600 ; N Dcroat ; B 30 0 594 562 ; C -1 ; WX 600 ; N commaaccent ; B 205 -250 397 -57 ; C -1 ; WX 600 ; N copyright ; B 0 -18 600 580 ; C -1 ; WX 600 ; N Emacron ; B 25 0 560 708 ; C -1 ; WX 600 ; N ccaron ; B 40 -15 545 667 ; C -1 ; WX 600 ; N aring ; B 35 -15 570 678 ; C -1 ; WX 600 ; N Ncommaaccent ; B 8 -250 610 562 ; C -1 ; WX 600 ; N lacute ; B 77 0 523 801 ; C -1 ; WX 600 ; N agrave ; B 35 -15 570 661 ; C -1 ; WX 600 ; N Tcommaaccent ; B 21 -250 579 562 ; C -1 ; WX 600 ; N Cacute ; B 22 -18 560 784 ; C -1 ; WX 600 ; N atilde ; B 35 -15 570 636 ; C -1 ; WX 600 ; N Edotaccent ; B 25 0 560 761 ; C -1 ; WX 600 ; N scaron ; B 68 -17 535 667 ; C -1 ; WX 600 ; N scedilla ; B 68 -206 535 459 ; C -1 ; WX 600 ; N iacute ; B 77 0 523 661 ; C -1 ; WX 600 ; N lozenge ; B 66 0 534 740 ; C -1 ; WX 600 ; N Rcaron ; B 24 0 599 790 ; C -1 ; WX 600 ; N Gcommaaccent ; B 22 -250 594 580 ; C -1 ; WX 600 ; N ucircumflex ; B -1 -15 569 657 ; C -1 ; WX 600 ; N acircumflex ; B 35 -15 570 657 ; C -1 ; WX 600 ; N Amacron ; B -9 0 609 708 ; C -1 ; WX 600 ; N rcaron ; B 47 0 580 667 ; C -1 ; WX 600 ; N ccedilla ; B 40 -206 545 459 ; C -1 ; WX 600 ; N Zdotaccent ; B 62 0 539 761 ; C -1 ; WX 600 ; N Thorn ; B 48 0 557 562 ; C -1 ; WX 600 ; N Omacron ; B 22 -18 578 708 ; C -1 ; WX 600 ; N Racute ; B 24 0 599 784 ; C -1 ; WX 600 ; N Sacute ; B 47 -22 553 784 ; C -1 ; WX 600 ; N dcaron ; B 20 -15 727 626 ; C -1 ; WX 600 ; N Umacron ; B 4 -18 596 708 ; C -1 ; WX 600 ; N uring ; B -1 -15 569 678 ; C -1 ; WX 600 ; N threesuperior ; B 138 222 433 616 ; C -1 ; WX 600 ; N Ograve ; B 22 -18 578 784 ; C -1 ; WX 600 ; N Agrave ; B -9 0 609 784 ; C -1 ; WX 600 ; N Abreve ; B -9 0 609 784 ; C -1 ; WX 600 ; N multiply ; B 81 39 520 478 ; C -1 ; WX 600 ; N uacute ; B -1 -15 569 661 ; C -1 ; WX 600 ; N Tcaron ; B 21 0 579 790 ; C -1 ; WX 600 ; N partialdiff ; B 63 -38 537 728 ; C -1 ; WX 600 ; N ydieresis ; B -4 -142 601 638 ; C -1 ; WX 600 ; N Nacute ; B 8 -12 610 784 ; C -1 ; WX 600 ; N icircumflex ; B 73 0 523 657 ; C -1 ; WX 600 ; N Ecircumflex ; B 25 0 560 780 ; C -1 ; WX 600 ; N adieresis ; B 35 -15 570 638 ; C -1 ; WX 600 ; N edieresis ; B 40 -15 563 638 ; C -1 ; WX 600 ; N cacute ; B 40 -15 545 661 ; C -1 ; WX 600 ; N nacute ; B 18 0 592 661 ; C -1 ; WX 600 ; N umacron ; B -1 -15 569 585 ; C -1 ; WX 600 ; N Ncaron ; B 8 -12 610 790 ; C -1 ; WX 600 ; N Iacute ; B 77 0 523 784 ; C -1 ; WX 600 ; N plusminus ; B 71 24 529 515 ; C -1 ; WX 600 ; N brokenbar ; B 255 -175 345 675 ; C -1 ; WX 600 ; N registered ; B 0 -18 600 580 ; C -1 ; WX 600 ; N Gbreve ; B 22 -18 594 784 ; C -1 ; WX 600 ; N Idotaccent ; B 77 0 523 761 ; C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ; C -1 ; WX 600 ; N Egrave ; B 25 0 560 784 ; C -1 ; WX 600 ; N racute ; B 47 0 580 661 ; C -1 ; WX 600 ; N omacron ; B 30 -15 570 585 ; C -1 ; WX 600 ; N Zacute ; B 62 0 539 784 ; C -1 ; WX 600 ; N Zcaron ; B 62 0 539 790 ; C -1 ; WX 600 ; N greaterequal ; B 26 0 523 696 ; C -1 ; WX 600 ; N Eth ; B 30 0 594 562 ; C -1 ; WX 600 ; N Ccedilla ; B 22 -206 560 580 ; C -1 ; WX 600 ; N lcommaaccent ; B 77 -250 523 626 ; C -1 ; WX 600 ; N tcaron ; B 47 -15 532 703 ; C -1 ; WX 600 ; N eogonek ; B 40 -199 563 454 ; C -1 ; WX 600 ; N Uogonek ; B 4 -199 596 562 ; C -1 ; WX 600 ; N Aacute ; B -9 0 609 784 ; C -1 ; WX 600 ; N Adieresis ; B -9 0 609 761 ; C -1 ; WX 600 ; N egrave ; B 40 -15 563 661 ; C -1 ; WX 600 ; N zacute ; B 81 0 520 661 ; C -1 ; WX 600 ; N iogonek ; B 77 -199 523 658 ; C -1 ; WX 600 ; N Oacute ; B 22 -18 578 784 ; C -1 ; WX 600 ; N oacute ; B 30 -15 570 661 ; C -1 ; WX 600 ; N amacron ; B 35 -15 570 585 ; C -1 ; WX 600 ; N sacute ; B 68 -17 535 661 ; C -1 ; WX 600 ; N idieresis ; B 77 0 523 618 ; C -1 ; WX 600 ; N Ocircumflex ; B 22 -18 578 780 ; C -1 ; WX 600 ; N Ugrave ; B 4 -18 596 784 ; C -1 ; WX 600 ; N Delta ; B 6 0 594 688 ; C -1 ; WX 600 ; N thorn ; B -14 -142 570 626 ; C -1 ; WX 600 ; N twosuperior ; B 143 230 436 616 ; C -1 ; WX 600 ; N Odieresis ; B 22 -18 578 761 ; C -1 ; WX 600 ; N mu ; B -1 -142 569 439 ; C -1 ; WX 600 ; N igrave ; B 77 0 523 661 ; C -1 ; WX 600 ; N ohungarumlaut ; B 30 -15 668 661 ; C -1 ; WX 600 ; N Eogonek ; B 25 -199 576 562 ; C -1 ; WX 600 ; N dcroat ; B 20 -15 591 626 ; C -1 ; WX 600 ; N threequarters ; B -47 -60 648 661 ; C -1 ; WX 600 ; N Scedilla ; B 47 -206 553 582 ; C -1 ; WX 600 ; N lcaron ; B 77 0 597 626 ; C -1 ; WX 600 ; N Kcommaaccent ; B 21 -250 599 562 ; C -1 ; WX 600 ; N Lacute ; B 39 0 578 784 ; C -1 ; WX 600 ; N trademark ; B -9 230 749 562 ; C -1 ; WX 600 ; N edotaccent ; B 40 -15 563 638 ; C -1 ; WX 600 ; N Igrave ; B 77 0 523 784 ; C -1 ; WX 600 ; N Imacron ; B 77 0 523 708 ; C -1 ; WX 600 ; N Lcaron ; B 39 0 637 562 ; C -1 ; WX 600 ; N onehalf ; B -47 -60 648 661 ; C -1 ; WX 600 ; N lessequal ; B 26 0 523 696 ; C -1 ; WX 600 ; N ocircumflex ; B 30 -15 570 657 ; C -1 ; WX 600 ; N ntilde ; B 18 0 592 636 ; C -1 ; WX 600 ; N Uhungarumlaut ; B 4 -18 638 784 ; C -1 ; WX 600 ; N Eacute ; B 25 0 560 784 ; C -1 ; WX 600 ; N emacron ; B 40 -15 563 585 ; C -1 ; WX 600 ; N gbreve ; B 30 -146 580 661 ; C -1 ; WX 600 ; N onequarter ; B -56 -60 656 661 ; C -1 ; WX 600 ; N Scaron ; B 47 -22 553 790 ; C -1 ; WX 600 ; N Scommaaccent ; B 47 -250 553 582 ; C -1 ; WX 600 ; N Ohungarumlaut ; B 22 -18 628 784 ; C -1 ; WX 600 ; N degree ; B 86 243 474 616 ; C -1 ; WX 600 ; N ograve ; B 30 -15 570 661 ; C -1 ; WX 600 ; N Ccaron ; B 22 -18 560 790 ; C -1 ; WX 600 ; N ugrave ; B -1 -15 569 661 ; C -1 ; WX 600 ; N radical ; B -19 -104 473 778 ; C -1 ; WX 600 ; N Dcaron ; B 30 0 594 790 ; C -1 ; WX 600 ; N rcommaaccent ; B 47 -250 580 454 ; C -1 ; WX 600 ; N Ntilde ; B 8 -12 610 759 ; C -1 ; WX 600 ; N otilde ; B 30 -15 570 636 ; C -1 ; WX 600 ; N Rcommaaccent ; B 24 -250 599 562 ; C -1 ; WX 600 ; N Lcommaaccent ; B 39 -250 578 562 ; C -1 ; WX 600 ; N Atilde ; B -9 0 609 759 ; C -1 ; WX 600 ; N Aogonek ; B -9 -199 625 562 ; C -1 ; WX 600 ; N Aring ; B -9 0 609 801 ; C -1 ; WX 600 ; N Otilde ; B 22 -18 578 759 ; C -1 ; WX 600 ; N zdotaccent ; B 81 0 520 638 ; C -1 ; WX 600 ; N Ecaron ; B 25 0 560 790 ; C -1 ; WX 600 ; N Iogonek ; B 77 -199 523 562 ; C -1 ; WX 600 ; N kcommaaccent ; B 20 -250 585 626 ; C -1 ; WX 600 ; N minus ; B 71 203 529 313 ; C -1 ; WX 600 ; N Icircumflex ; B 77 0 523 780 ; C -1 ; WX 600 ; N ncaron ; B 18 0 592 667 ; C -1 ; WX 600 ; N tcommaaccent ; B 47 -250 532 562 ; C -1 ; WX 600 ; N logicalnot ; B 71 103 529 413 ; C -1 ; WX 600 ; N odieresis ; B 30 -15 570 638 ; C -1 ; WX 600 ; N udieresis ; B -1 -15 569 638 ; C -1 ; WX 600 ; N notequal ; B 12 -47 537 563 ; C -1 ; WX 600 ; N gcommaaccent ; B 30 -146 580 714 ; C -1 ; WX 600 ; N eth ; B 58 -27 543 626 ; C -1 ; WX 600 ; N zcaron ; B 81 0 520 667 ; C -1 ; WX 600 ; N ncommaaccent ; B 18 -250 592 454 ; C -1 ; WX 600 ; N onesuperior ; B 153 230 447 616 ; C -1 ; WX 600 ; N imacron ; B 77 0 523 585 ; C -1 ; WX 600 ; N Euro ; B 0 0 0 0 ; EndCharMetrics EndFontMetrics ruby-prawn-2.1.0.orig/data/fonts/Helvetica-Oblique.afm0000644000000000000000000022123012665203156021314 0ustar rootrootStartFontMetrics 4.1 Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved. Comment Creation Date: Thu May 1 12:44:31 1997 Comment UniqueID 43055 Comment VMusage 14960 69346 FontName Helvetica-Oblique FullName Helvetica Oblique FamilyName Helvetica Weight Medium ItalicAngle -12 IsFixedPitch false CharacterSet ExtendedRoman FontBBox -170 -225 1116 931 UnderlinePosition -100 UnderlineThickness 50 Version 002.000 Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. EncodingScheme AdobeStandardEncoding CapHeight 718 XHeight 523 Ascender 718 Descender -207 StdHW 76 StdVW 88 StartCharMetrics 315 C 32 ; WX 278 ; N space ; B 0 0 0 0 ; C 33 ; WX 278 ; N exclam ; B 90 0 340 718 ; C 34 ; WX 355 ; N quotedbl ; B 168 463 438 718 ; C 35 ; WX 556 ; N numbersign ; B 73 0 631 688 ; C 36 ; WX 556 ; N dollar ; B 69 -115 617 775 ; C 37 ; WX 889 ; N percent ; B 147 -19 889 703 ; C 38 ; WX 667 ; N ampersand ; B 77 -15 647 718 ; C 39 ; WX 222 ; N quoteright ; B 151 463 310 718 ; C 40 ; WX 333 ; N parenleft ; B 108 -207 454 733 ; C 41 ; WX 333 ; N parenright ; B -9 -207 337 733 ; C 42 ; WX 389 ; N asterisk ; B 165 431 475 718 ; C 43 ; WX 584 ; N plus ; B 85 0 606 505 ; C 44 ; WX 278 ; N comma ; B 56 -147 214 106 ; C 45 ; WX 333 ; N hyphen ; B 93 232 357 322 ; C 46 ; WX 278 ; N period ; B 87 0 214 106 ; C 47 ; WX 278 ; N slash ; B -21 -19 452 737 ; C 48 ; WX 556 ; N zero ; B 93 -19 608 703 ; C 49 ; WX 556 ; N one ; B 207 0 508 703 ; C 50 ; WX 556 ; N two ; B 26 0 617 703 ; C 51 ; WX 556 ; N three ; B 75 -19 610 703 ; C 52 ; WX 556 ; N four ; B 61 0 576 703 ; C 53 ; WX 556 ; N five ; B 68 -19 621 688 ; C 54 ; WX 556 ; N six ; B 91 -19 615 703 ; C 55 ; WX 556 ; N seven ; B 137 0 669 688 ; C 56 ; WX 556 ; N eight ; B 74 -19 607 703 ; C 57 ; WX 556 ; N nine ; B 82 -19 609 703 ; C 58 ; WX 278 ; N colon ; B 87 0 301 516 ; C 59 ; WX 278 ; N semicolon ; B 56 -147 301 516 ; C 60 ; WX 584 ; N less ; B 94 11 641 495 ; C 61 ; WX 584 ; N equal ; B 63 115 628 390 ; C 62 ; WX 584 ; N greater ; B 50 11 597 495 ; C 63 ; WX 556 ; N question ; B 161 0 610 727 ; C 64 ; WX 1015 ; N at ; B 215 -19 965 737 ; C 65 ; WX 667 ; N A ; B 14 0 654 718 ; C 66 ; WX 667 ; N B ; B 74 0 712 718 ; C 67 ; WX 722 ; N C ; B 108 -19 782 737 ; C 68 ; WX 722 ; N D ; B 81 0 764 718 ; C 69 ; WX 667 ; N E ; B 86 0 762 718 ; C 70 ; WX 611 ; N F ; B 86 0 736 718 ; C 71 ; WX 778 ; N G ; B 111 -19 799 737 ; C 72 ; WX 722 ; N H ; B 77 0 799 718 ; C 73 ; WX 278 ; N I ; B 91 0 341 718 ; C 74 ; WX 500 ; N J ; B 47 -19 581 718 ; C 75 ; WX 667 ; N K ; B 76 0 808 718 ; C 76 ; WX 556 ; N L ; B 76 0 555 718 ; C 77 ; WX 833 ; N M ; B 73 0 914 718 ; C 78 ; WX 722 ; N N ; B 76 0 799 718 ; C 79 ; WX 778 ; N O ; B 105 -19 826 737 ; C 80 ; WX 667 ; N P ; B 86 0 737 718 ; C 81 ; WX 778 ; N Q ; B 105 -56 826 737 ; C 82 ; WX 722 ; N R ; B 88 0 773 718 ; C 83 ; WX 667 ; N S ; B 90 -19 713 737 ; C 84 ; WX 611 ; N T ; B 148 0 750 718 ; C 85 ; WX 722 ; N U ; B 123 -19 797 718 ; C 86 ; WX 667 ; N V ; B 173 0 800 718 ; C 87 ; WX 944 ; N W ; B 169 0 1081 718 ; C 88 ; WX 667 ; N X ; B 19 0 790 718 ; C 89 ; WX 667 ; N Y ; B 167 0 806 718 ; C 90 ; WX 611 ; N Z ; B 23 0 741 718 ; C 91 ; WX 278 ; N bracketleft ; B 21 -196 403 722 ; C 92 ; WX 278 ; N backslash ; B 140 -19 291 737 ; C 93 ; WX 278 ; N bracketright ; B -14 -196 368 722 ; C 94 ; WX 469 ; N asciicircum ; B 42 264 539 688 ; C 95 ; WX 556 ; N underscore ; B -27 -125 540 -75 ; C 96 ; WX 222 ; N quoteleft ; B 165 470 323 725 ; C 97 ; WX 556 ; N a ; B 61 -15 559 538 ; C 98 ; WX 556 ; N b ; B 58 -15 584 718 ; C 99 ; WX 500 ; N c ; B 74 -15 553 538 ; C 100 ; WX 556 ; N d ; B 84 -15 652 718 ; C 101 ; WX 556 ; N e ; B 84 -15 578 538 ; C 102 ; WX 278 ; N f ; B 86 0 416 728 ; L i fi ; L l fl ; C 103 ; WX 556 ; N g ; B 42 -220 610 538 ; C 104 ; WX 556 ; N h ; B 65 0 573 718 ; C 105 ; WX 222 ; N i ; B 67 0 308 718 ; C 106 ; WX 222 ; N j ; B -60 -210 308 718 ; C 107 ; WX 500 ; N k ; B 67 0 600 718 ; C 108 ; WX 222 ; N l ; B 67 0 308 718 ; C 109 ; WX 833 ; N m ; B 65 0 852 538 ; C 110 ; WX 556 ; N n ; B 65 0 573 538 ; C 111 ; WX 556 ; N o ; B 83 -14 585 538 ; C 112 ; WX 556 ; N p ; B 14 -207 584 538 ; C 113 ; WX 556 ; N q ; B 84 -207 605 538 ; C 114 ; WX 333 ; N r ; B 77 0 446 538 ; C 115 ; WX 500 ; N s ; B 63 -15 529 538 ; C 116 ; WX 278 ; N t ; B 102 -7 368 669 ; C 117 ; WX 556 ; N u ; B 94 -15 600 523 ; C 118 ; WX 500 ; N v ; B 119 0 603 523 ; C 119 ; WX 722 ; N w ; B 125 0 820 523 ; C 120 ; WX 500 ; N x ; B 11 0 594 523 ; C 121 ; WX 500 ; N y ; B 15 -214 600 523 ; C 122 ; WX 500 ; N z ; B 31 0 571 523 ; C 123 ; WX 334 ; N braceleft ; B 92 -196 445 722 ; C 124 ; WX 260 ; N bar ; B 46 -225 332 775 ; C 125 ; WX 334 ; N braceright ; B 0 -196 354 722 ; C 126 ; WX 584 ; N asciitilde ; B 111 180 580 326 ; C 161 ; WX 333 ; N exclamdown ; B 77 -195 326 523 ; C 162 ; WX 556 ; N cent ; B 95 -115 584 623 ; C 163 ; WX 556 ; N sterling ; B 49 -16 634 718 ; C 164 ; WX 167 ; N fraction ; B -170 -19 482 703 ; C 165 ; WX 556 ; N yen ; B 81 0 699 688 ; C 166 ; WX 556 ; N florin ; B -52 -207 654 737 ; C 167 ; WX 556 ; N section ; B 76 -191 584 737 ; C 168 ; WX 556 ; N currency ; B 60 99 646 603 ; C 169 ; WX 191 ; N quotesingle ; B 157 463 285 718 ; C 170 ; WX 333 ; N quotedblleft ; B 138 470 461 725 ; C 171 ; WX 556 ; N guillemotleft ; B 146 108 554 446 ; C 172 ; WX 333 ; N guilsinglleft ; B 137 108 340 446 ; C 173 ; WX 333 ; N guilsinglright ; B 111 108 314 446 ; C 174 ; WX 500 ; N fi ; B 86 0 587 728 ; C 175 ; WX 500 ; N fl ; B 86 0 585 728 ; C 177 ; WX 556 ; N endash ; B 51 240 623 313 ; C 178 ; WX 556 ; N dagger ; B 135 -159 622 718 ; C 179 ; WX 556 ; N daggerdbl ; B 52 -159 623 718 ; C 180 ; WX 278 ; N periodcentered ; B 129 190 257 315 ; C 182 ; WX 537 ; N paragraph ; B 126 -173 650 718 ; C 183 ; WX 350 ; N bullet ; B 91 202 413 517 ; C 184 ; WX 222 ; N quotesinglbase ; B 21 -149 180 106 ; C 185 ; WX 333 ; N quotedblbase ; B -6 -149 318 106 ; C 186 ; WX 333 ; N quotedblright ; B 124 463 448 718 ; C 187 ; WX 556 ; N guillemotright ; B 120 108 528 446 ; C 188 ; WX 1000 ; N ellipsis ; B 115 0 908 106 ; C 189 ; WX 1000 ; N perthousand ; B 88 -19 1029 703 ; C 191 ; WX 611 ; N questiondown ; B 85 -201 534 525 ; C 193 ; WX 333 ; N grave ; B 170 593 337 734 ; C 194 ; WX 333 ; N acute ; B 248 593 475 734 ; C 195 ; WX 333 ; N circumflex ; B 147 593 438 734 ; C 196 ; WX 333 ; N tilde ; B 125 606 490 722 ; C 197 ; WX 333 ; N macron ; B 143 627 468 684 ; C 198 ; WX 333 ; N breve ; B 167 595 476 731 ; C 199 ; WX 333 ; N dotaccent ; B 249 604 362 706 ; C 200 ; WX 333 ; N dieresis ; B 168 604 443 706 ; C 202 ; WX 333 ; N ring ; B 214 572 402 756 ; C 203 ; WX 333 ; N cedilla ; B 2 -225 232 0 ; C 205 ; WX 333 ; N hungarumlaut ; B 157 593 565 734 ; C 206 ; WX 333 ; N ogonek ; B 43 -225 249 0 ; C 207 ; WX 333 ; N caron ; B 177 593 468 734 ; C 208 ; WX 1000 ; N emdash ; B 51 240 1067 313 ; C 225 ; WX 1000 ; N AE ; B 8 0 1097 718 ; C 227 ; WX 370 ; N ordfeminine ; B 127 405 449 737 ; C 232 ; WX 556 ; N Lslash ; B 41 0 555 718 ; C 233 ; WX 778 ; N Oslash ; B 43 -19 890 737 ; C 234 ; WX 1000 ; N OE ; B 98 -19 1116 737 ; C 235 ; WX 365 ; N ordmasculine ; B 141 405 468 737 ; C 241 ; WX 889 ; N ae ; B 61 -15 909 538 ; C 245 ; WX 278 ; N dotlessi ; B 95 0 294 523 ; C 248 ; WX 222 ; N lslash ; B 41 0 347 718 ; C 249 ; WX 611 ; N oslash ; B 29 -22 647 545 ; C 250 ; WX 944 ; N oe ; B 83 -15 964 538 ; C 251 ; WX 611 ; N germandbls ; B 67 -15 658 728 ; C -1 ; WX 278 ; N Idieresis ; B 91 0 458 901 ; C -1 ; WX 556 ; N eacute ; B 84 -15 587 734 ; C -1 ; WX 556 ; N abreve ; B 61 -15 578 731 ; C -1 ; WX 556 ; N uhungarumlaut ; B 94 -15 677 734 ; C -1 ; WX 556 ; N ecaron ; B 84 -15 580 734 ; C -1 ; WX 667 ; N Ydieresis ; B 167 0 806 901 ; C -1 ; WX 584 ; N divide ; B 85 -19 606 524 ; C -1 ; WX 667 ; N Yacute ; B 167 0 806 929 ; C -1 ; WX 667 ; N Acircumflex ; B 14 0 654 929 ; C -1 ; WX 556 ; N aacute ; B 61 -15 587 734 ; C -1 ; WX 722 ; N Ucircumflex ; B 123 -19 797 929 ; C -1 ; WX 500 ; N yacute ; B 15 -214 600 734 ; C -1 ; WX 500 ; N scommaaccent ; B 63 -225 529 538 ; C -1 ; WX 556 ; N ecircumflex ; B 84 -15 578 734 ; C -1 ; WX 722 ; N Uring ; B 123 -19 797 931 ; C -1 ; WX 722 ; N Udieresis ; B 123 -19 797 901 ; C -1 ; WX 556 ; N aogonek ; B 61 -220 559 538 ; C -1 ; WX 722 ; N Uacute ; B 123 -19 797 929 ; C -1 ; WX 556 ; N uogonek ; B 94 -225 600 523 ; C -1 ; WX 667 ; N Edieresis ; B 86 0 762 901 ; C -1 ; WX 722 ; N Dcroat ; B 69 0 764 718 ; C -1 ; WX 250 ; N commaaccent ; B 39 -225 172 -40 ; C -1 ; WX 737 ; N copyright ; B 54 -19 837 737 ; C -1 ; WX 667 ; N Emacron ; B 86 0 762 879 ; C -1 ; WX 500 ; N ccaron ; B 74 -15 553 734 ; C -1 ; WX 556 ; N aring ; B 61 -15 559 756 ; C -1 ; WX 722 ; N Ncommaaccent ; B 76 -225 799 718 ; C -1 ; WX 222 ; N lacute ; B 67 0 461 929 ; C -1 ; WX 556 ; N agrave ; B 61 -15 559 734 ; C -1 ; WX 611 ; N Tcommaaccent ; B 148 -225 750 718 ; C -1 ; WX 722 ; N Cacute ; B 108 -19 782 929 ; C -1 ; WX 556 ; N atilde ; B 61 -15 592 722 ; C -1 ; WX 667 ; N Edotaccent ; B 86 0 762 901 ; C -1 ; WX 500 ; N scaron ; B 63 -15 552 734 ; C -1 ; WX 500 ; N scedilla ; B 63 -225 529 538 ; C -1 ; WX 278 ; N iacute ; B 95 0 448 734 ; C -1 ; WX 471 ; N lozenge ; B 88 0 540 728 ; C -1 ; WX 722 ; N Rcaron ; B 88 0 773 929 ; C -1 ; WX 778 ; N Gcommaaccent ; B 111 -225 799 737 ; C -1 ; WX 556 ; N ucircumflex ; B 94 -15 600 734 ; C -1 ; WX 556 ; N acircumflex ; B 61 -15 559 734 ; C -1 ; WX 667 ; N Amacron ; B 14 0 677 879 ; C -1 ; WX 333 ; N rcaron ; B 77 0 508 734 ; C -1 ; WX 500 ; N ccedilla ; B 74 -225 553 538 ; C -1 ; WX 611 ; N Zdotaccent ; B 23 0 741 901 ; C -1 ; WX 667 ; N Thorn ; B 86 0 712 718 ; C -1 ; WX 778 ; N Omacron ; B 105 -19 826 879 ; C -1 ; WX 722 ; N Racute ; B 88 0 773 929 ; C -1 ; WX 667 ; N Sacute ; B 90 -19 713 929 ; C -1 ; WX 643 ; N dcaron ; B 84 -15 808 718 ; C -1 ; WX 722 ; N Umacron ; B 123 -19 797 879 ; C -1 ; WX 556 ; N uring ; B 94 -15 600 756 ; C -1 ; WX 333 ; N threesuperior ; B 90 270 436 703 ; C -1 ; WX 778 ; N Ograve ; B 105 -19 826 929 ; C -1 ; WX 667 ; N Agrave ; B 14 0 654 929 ; C -1 ; WX 667 ; N Abreve ; B 14 0 685 926 ; C -1 ; WX 584 ; N multiply ; B 50 0 642 506 ; C -1 ; WX 556 ; N uacute ; B 94 -15 600 734 ; C -1 ; WX 611 ; N Tcaron ; B 148 0 750 929 ; C -1 ; WX 476 ; N partialdiff ; B 41 -38 550 714 ; C -1 ; WX 500 ; N ydieresis ; B 15 -214 600 706 ; C -1 ; WX 722 ; N Nacute ; B 76 0 799 929 ; C -1 ; WX 278 ; N icircumflex ; B 95 0 411 734 ; C -1 ; WX 667 ; N Ecircumflex ; B 86 0 762 929 ; C -1 ; WX 556 ; N adieresis ; B 61 -15 559 706 ; C -1 ; WX 556 ; N edieresis ; B 84 -15 578 706 ; C -1 ; WX 500 ; N cacute ; B 74 -15 559 734 ; C -1 ; WX 556 ; N nacute ; B 65 0 587 734 ; C -1 ; WX 556 ; N umacron ; B 94 -15 600 684 ; C -1 ; WX 722 ; N Ncaron ; B 76 0 799 929 ; C -1 ; WX 278 ; N Iacute ; B 91 0 489 929 ; C -1 ; WX 584 ; N plusminus ; B 39 0 618 506 ; C -1 ; WX 260 ; N brokenbar ; B 62 -150 316 700 ; C -1 ; WX 737 ; N registered ; B 54 -19 837 737 ; C -1 ; WX 778 ; N Gbreve ; B 111 -19 799 926 ; C -1 ; WX 278 ; N Idotaccent ; B 91 0 377 901 ; C -1 ; WX 600 ; N summation ; B 15 -10 671 706 ; C -1 ; WX 667 ; N Egrave ; B 86 0 762 929 ; C -1 ; WX 333 ; N racute ; B 77 0 475 734 ; C -1 ; WX 556 ; N omacron ; B 83 -14 585 684 ; C -1 ; WX 611 ; N Zacute ; B 23 0 741 929 ; C -1 ; WX 611 ; N Zcaron ; B 23 0 741 929 ; C -1 ; WX 549 ; N greaterequal ; B 26 0 620 674 ; C -1 ; WX 722 ; N Eth ; B 69 0 764 718 ; C -1 ; WX 722 ; N Ccedilla ; B 108 -225 782 737 ; C -1 ; WX 222 ; N lcommaaccent ; B 25 -225 308 718 ; C -1 ; WX 317 ; N tcaron ; B 102 -7 501 808 ; C -1 ; WX 556 ; N eogonek ; B 84 -225 578 538 ; C -1 ; WX 722 ; N Uogonek ; B 123 -225 797 718 ; C -1 ; WX 667 ; N Aacute ; B 14 0 683 929 ; C -1 ; WX 667 ; N Adieresis ; B 14 0 654 901 ; C -1 ; WX 556 ; N egrave ; B 84 -15 578 734 ; C -1 ; WX 500 ; N zacute ; B 31 0 571 734 ; C -1 ; WX 222 ; N iogonek ; B -61 -225 308 718 ; C -1 ; WX 778 ; N Oacute ; B 105 -19 826 929 ; C -1 ; WX 556 ; N oacute ; B 83 -14 587 734 ; C -1 ; WX 556 ; N amacron ; B 61 -15 580 684 ; C -1 ; WX 500 ; N sacute ; B 63 -15 559 734 ; C -1 ; WX 278 ; N idieresis ; B 95 0 416 706 ; C -1 ; WX 778 ; N Ocircumflex ; B 105 -19 826 929 ; C -1 ; WX 722 ; N Ugrave ; B 123 -19 797 929 ; C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; C -1 ; WX 556 ; N thorn ; B 14 -207 584 718 ; C -1 ; WX 333 ; N twosuperior ; B 64 281 449 703 ; C -1 ; WX 778 ; N Odieresis ; B 105 -19 826 901 ; C -1 ; WX 556 ; N mu ; B 24 -207 600 523 ; C -1 ; WX 278 ; N igrave ; B 95 0 310 734 ; C -1 ; WX 556 ; N ohungarumlaut ; B 83 -14 677 734 ; C -1 ; WX 667 ; N Eogonek ; B 86 -220 762 718 ; C -1 ; WX 556 ; N dcroat ; B 84 -15 689 718 ; C -1 ; WX 834 ; N threequarters ; B 130 -19 861 703 ; C -1 ; WX 667 ; N Scedilla ; B 90 -225 713 737 ; C -1 ; WX 299 ; N lcaron ; B 67 0 464 718 ; C -1 ; WX 667 ; N Kcommaaccent ; B 76 -225 808 718 ; C -1 ; WX 556 ; N Lacute ; B 76 0 555 929 ; C -1 ; WX 1000 ; N trademark ; B 186 306 1056 718 ; C -1 ; WX 556 ; N edotaccent ; B 84 -15 578 706 ; C -1 ; WX 278 ; N Igrave ; B 91 0 351 929 ; C -1 ; WX 278 ; N Imacron ; B 91 0 483 879 ; C -1 ; WX 556 ; N Lcaron ; B 76 0 570 718 ; C -1 ; WX 834 ; N onehalf ; B 114 -19 839 703 ; C -1 ; WX 549 ; N lessequal ; B 26 0 666 674 ; C -1 ; WX 556 ; N ocircumflex ; B 83 -14 585 734 ; C -1 ; WX 556 ; N ntilde ; B 65 0 592 722 ; C -1 ; WX 722 ; N Uhungarumlaut ; B 123 -19 801 929 ; C -1 ; WX 667 ; N Eacute ; B 86 0 762 929 ; C -1 ; WX 556 ; N emacron ; B 84 -15 580 684 ; C -1 ; WX 556 ; N gbreve ; B 42 -220 610 731 ; C -1 ; WX 834 ; N onequarter ; B 150 -19 802 703 ; C -1 ; WX 667 ; N Scaron ; B 90 -19 713 929 ; C -1 ; WX 667 ; N Scommaaccent ; B 90 -225 713 737 ; C -1 ; WX 778 ; N Ohungarumlaut ; B 105 -19 829 929 ; C -1 ; WX 400 ; N degree ; B 169 411 468 703 ; C -1 ; WX 556 ; N ograve ; B 83 -14 585 734 ; C -1 ; WX 722 ; N Ccaron ; B 108 -19 782 929 ; C -1 ; WX 556 ; N ugrave ; B 94 -15 600 734 ; C -1 ; WX 453 ; N radical ; B 79 -80 617 762 ; C -1 ; WX 722 ; N Dcaron ; B 81 0 764 929 ; C -1 ; WX 333 ; N rcommaaccent ; B 30 -225 446 538 ; C -1 ; WX 722 ; N Ntilde ; B 76 0 799 917 ; C -1 ; WX 556 ; N otilde ; B 83 -14 602 722 ; C -1 ; WX 722 ; N Rcommaaccent ; B 88 -225 773 718 ; C -1 ; WX 556 ; N Lcommaaccent ; B 76 -225 555 718 ; C -1 ; WX 667 ; N Atilde ; B 14 0 699 917 ; C -1 ; WX 667 ; N Aogonek ; B 14 -225 654 718 ; C -1 ; WX 667 ; N Aring ; B 14 0 654 931 ; C -1 ; WX 778 ; N Otilde ; B 105 -19 826 917 ; C -1 ; WX 500 ; N zdotaccent ; B 31 0 571 706 ; C -1 ; WX 667 ; N Ecaron ; B 86 0 762 929 ; C -1 ; WX 278 ; N Iogonek ; B -33 -225 341 718 ; C -1 ; WX 500 ; N kcommaaccent ; B 67 -225 600 718 ; C -1 ; WX 584 ; N minus ; B 85 216 606 289 ; C -1 ; WX 278 ; N Icircumflex ; B 91 0 452 929 ; C -1 ; WX 556 ; N ncaron ; B 65 0 580 734 ; C -1 ; WX 278 ; N tcommaaccent ; B 63 -225 368 669 ; C -1 ; WX 584 ; N logicalnot ; B 106 108 628 390 ; C -1 ; WX 556 ; N odieresis ; B 83 -14 585 706 ; C -1 ; WX 556 ; N udieresis ; B 94 -15 600 706 ; C -1 ; WX 549 ; N notequal ; B 34 -35 623 551 ; C -1 ; WX 556 ; N gcommaaccent ; B 42 -220 610 822 ; C -1 ; WX 556 ; N eth ; B 81 -15 617 737 ; C -1 ; WX 500 ; N zcaron ; B 31 0 571 734 ; C -1 ; WX 556 ; N ncommaaccent ; B 65 -225 573 538 ; C -1 ; WX 333 ; N onesuperior ; B 166 281 371 703 ; C -1 ; WX 278 ; N imacron ; B 95 0 417 684 ; C -1 ; WX 556 ; N Euro ; B 0 0 0 0 ; EndCharMetrics StartKernData StartKernPairs 2705 KPX A C -30 KPX A Cacute -30 KPX A Ccaron -30 KPX A Ccedilla -30 KPX A G -30 KPX A Gbreve -30 KPX A Gcommaaccent -30 KPX A O -30 KPX A Oacute -30 KPX A Ocircumflex -30 KPX A Odieresis -30 KPX A Ograve -30 KPX A Ohungarumlaut -30 KPX A Omacron -30 KPX A Oslash -30 KPX A Otilde -30 KPX A Q -30 KPX A T -120 KPX A Tcaron -120 KPX A Tcommaaccent -120 KPX A U -50 KPX A Uacute -50 KPX A Ucircumflex -50 KPX A Udieresis -50 KPX A Ugrave -50 KPX A Uhungarumlaut -50 KPX A Umacron -50 KPX A Uogonek -50 KPX A Uring -50 KPX A V -70 KPX A W -50 KPX A Y -100 KPX A Yacute -100 KPX A Ydieresis -100 KPX A u -30 KPX A uacute -30 KPX A ucircumflex -30 KPX A udieresis -30 KPX A ugrave -30 KPX A uhungarumlaut -30 KPX A umacron -30 KPX A uogonek -30 KPX A uring -30 KPX A v -40 KPX A w -40 KPX A y -40 KPX A yacute -40 KPX A ydieresis -40 KPX Aacute C -30 KPX Aacute Cacute -30 KPX Aacute Ccaron -30 KPX Aacute Ccedilla -30 KPX Aacute G -30 KPX Aacute Gbreve -30 KPX Aacute Gcommaaccent -30 KPX Aacute O -30 KPX Aacute Oacute -30 KPX Aacute Ocircumflex -30 KPX Aacute Odieresis -30 KPX Aacute Ograve -30 KPX Aacute Ohungarumlaut -30 KPX Aacute Omacron -30 KPX Aacute Oslash -30 KPX Aacute Otilde -30 KPX Aacute Q -30 KPX Aacute T -120 KPX Aacute Tcaron -120 KPX Aacute Tcommaaccent -120 KPX Aacute U -50 KPX Aacute Uacute -50 KPX Aacute Ucircumflex -50 KPX Aacute Udieresis -50 KPX Aacute Ugrave -50 KPX Aacute Uhungarumlaut -50 KPX Aacute Umacron -50 KPX Aacute Uogonek -50 KPX Aacute Uring -50 KPX Aacute V -70 KPX Aacute W -50 KPX Aacute Y -100 KPX Aacute Yacute -100 KPX Aacute Ydieresis -100 KPX Aacute u -30 KPX Aacute uacute -30 KPX Aacute ucircumflex -30 KPX Aacute udieresis -30 KPX Aacute ugrave -30 KPX Aacute uhungarumlaut -30 KPX Aacute umacron -30 KPX Aacute uogonek -30 KPX Aacute uring -30 KPX Aacute v -40 KPX Aacute w -40 KPX Aacute y -40 KPX Aacute yacute -40 KPX Aacute ydieresis -40 KPX Abreve C -30 KPX Abreve Cacute -30 KPX Abreve Ccaron -30 KPX Abreve Ccedilla -30 KPX Abreve G -30 KPX Abreve Gbreve -30 KPX Abreve Gcommaaccent -30 KPX Abreve O -30 KPX Abreve Oacute -30 KPX Abreve Ocircumflex -30 KPX Abreve Odieresis -30 KPX Abreve Ograve -30 KPX Abreve Ohungarumlaut -30 KPX Abreve Omacron -30 KPX Abreve Oslash -30 KPX Abreve Otilde -30 KPX Abreve Q -30 KPX Abreve T -120 KPX Abreve Tcaron -120 KPX Abreve Tcommaaccent -120 KPX Abreve U -50 KPX Abreve Uacute -50 KPX Abreve Ucircumflex -50 KPX Abreve Udieresis -50 KPX Abreve Ugrave -50 KPX Abreve Uhungarumlaut -50 KPX Abreve Umacron -50 KPX Abreve Uogonek -50 KPX Abreve Uring -50 KPX Abreve V -70 KPX Abreve W -50 KPX Abreve Y -100 KPX Abreve Yacute -100 KPX Abreve Ydieresis -100 KPX Abreve u -30 KPX Abreve uacute -30 KPX Abreve ucircumflex -30 KPX Abreve udieresis -30 KPX Abreve ugrave -30 KPX Abreve uhungarumlaut -30 KPX Abreve umacron -30 KPX Abreve uogonek -30 KPX Abreve uring -30 KPX Abreve v -40 KPX Abreve w -40 KPX Abreve y -40 KPX Abreve yacute -40 KPX Abreve ydieresis -40 KPX Acircumflex C -30 KPX Acircumflex Cacute -30 KPX Acircumflex Ccaron -30 KPX Acircumflex Ccedilla -30 KPX Acircumflex G -30 KPX Acircumflex Gbreve -30 KPX Acircumflex Gcommaaccent -30 KPX Acircumflex O -30 KPX Acircumflex Oacute -30 KPX Acircumflex Ocircumflex -30 KPX Acircumflex Odieresis -30 KPX Acircumflex Ograve -30 KPX Acircumflex Ohungarumlaut -30 KPX Acircumflex Omacron -30 KPX Acircumflex Oslash -30 KPX Acircumflex Otilde -30 KPX Acircumflex Q -30 KPX Acircumflex T -120 KPX Acircumflex Tcaron -120 KPX Acircumflex Tcommaaccent -120 KPX Acircumflex U -50 KPX Acircumflex Uacute -50 KPX Acircumflex Ucircumflex -50 KPX Acircumflex Udieresis -50 KPX Acircumflex Ugrave -50 KPX Acircumflex Uhungarumlaut -50 KPX Acircumflex Umacron -50 KPX Acircumflex Uogonek -50 KPX Acircumflex Uring -50 KPX Acircumflex V -70 KPX Acircumflex W -50 KPX Acircumflex Y -100 KPX Acircumflex Yacute -100 KPX Acircumflex Ydieresis -100 KPX Acircumflex u -30 KPX Acircumflex uacute -30 KPX Acircumflex ucircumflex -30 KPX Acircumflex udieresis -30 KPX Acircumflex ugrave -30 KPX Acircumflex uhungarumlaut -30 KPX Acircumflex umacron -30 KPX Acircumflex uogonek -30 KPX Acircumflex uring -30 KPX Acircumflex v -40 KPX Acircumflex w -40 KPX Acircumflex y -40 KPX Acircumflex yacute -40 KPX Acircumflex ydieresis -40 KPX Adieresis C -30 KPX Adieresis Cacute -30 KPX Adieresis Ccaron -30 KPX Adieresis Ccedilla -30 KPX Adieresis G -30 KPX Adieresis Gbreve -30 KPX Adieresis Gcommaaccent -30 KPX Adieresis O -30 KPX Adieresis Oacute -30 KPX Adieresis Ocircumflex -30 KPX Adieresis Odieresis -30 KPX Adieresis Ograve -30 KPX Adieresis Ohungarumlaut -30 KPX Adieresis Omacron -30 KPX Adieresis Oslash -30 KPX Adieresis Otilde -30 KPX Adieresis Q -30 KPX Adieresis T -120 KPX Adieresis Tcaron -120 KPX Adieresis Tcommaaccent -120 KPX Adieresis U -50 KPX Adieresis Uacute -50 KPX Adieresis Ucircumflex -50 KPX Adieresis Udieresis -50 KPX Adieresis Ugrave -50 KPX Adieresis Uhungarumlaut -50 KPX Adieresis Umacron -50 KPX Adieresis Uogonek -50 KPX Adieresis Uring -50 KPX Adieresis V -70 KPX Adieresis W -50 KPX Adieresis Y -100 KPX Adieresis Yacute -100 KPX Adieresis Ydieresis -100 KPX Adieresis u -30 KPX Adieresis uacute -30 KPX Adieresis ucircumflex -30 KPX Adieresis udieresis -30 KPX Adieresis ugrave -30 KPX Adieresis uhungarumlaut -30 KPX Adieresis umacron -30 KPX Adieresis uogonek -30 KPX Adieresis uring -30 KPX Adieresis v -40 KPX Adieresis w -40 KPX Adieresis y -40 KPX Adieresis yacute -40 KPX Adieresis ydieresis -40 KPX Agrave C -30 KPX Agrave Cacute -30 KPX Agrave Ccaron -30 KPX Agrave Ccedilla -30 KPX Agrave G -30 KPX Agrave Gbreve -30 KPX Agrave Gcommaaccent -30 KPX Agrave O -30 KPX Agrave Oacute -30 KPX Agrave Ocircumflex -30 KPX Agrave Odieresis -30 KPX Agrave Ograve -30 KPX Agrave Ohungarumlaut -30 KPX Agrave Omacron -30 KPX Agrave Oslash -30 KPX Agrave Otilde -30 KPX Agrave Q -30 KPX Agrave T -120 KPX Agrave Tcaron -120 KPX Agrave Tcommaaccent -120 KPX Agrave U -50 KPX Agrave Uacute -50 KPX Agrave Ucircumflex -50 KPX Agrave Udieresis -50 KPX Agrave Ugrave -50 KPX Agrave Uhungarumlaut -50 KPX Agrave Umacron -50 KPX Agrave Uogonek -50 KPX Agrave Uring -50 KPX Agrave V -70 KPX Agrave W -50 KPX Agrave Y -100 KPX Agrave Yacute -100 KPX Agrave Ydieresis -100 KPX Agrave u -30 KPX Agrave uacute -30 KPX Agrave ucircumflex -30 KPX Agrave udieresis -30 KPX Agrave ugrave -30 KPX Agrave uhungarumlaut -30 KPX Agrave umacron -30 KPX Agrave uogonek -30 KPX Agrave uring -30 KPX Agrave v -40 KPX Agrave w -40 KPX Agrave y -40 KPX Agrave yacute -40 KPX Agrave ydieresis -40 KPX Amacron C -30 KPX Amacron Cacute -30 KPX Amacron Ccaron -30 KPX Amacron Ccedilla -30 KPX Amacron G -30 KPX Amacron Gbreve -30 KPX Amacron Gcommaaccent -30 KPX Amacron O -30 KPX Amacron Oacute -30 KPX Amacron Ocircumflex -30 KPX Amacron Odieresis -30 KPX Amacron Ograve -30 KPX Amacron Ohungarumlaut -30 KPX Amacron Omacron -30 KPX Amacron Oslash -30 KPX Amacron Otilde -30 KPX Amacron Q -30 KPX Amacron T -120 KPX Amacron Tcaron -120 KPX Amacron Tcommaaccent -120 KPX Amacron U -50 KPX Amacron Uacute -50 KPX Amacron Ucircumflex -50 KPX Amacron Udieresis -50 KPX Amacron Ugrave -50 KPX Amacron Uhungarumlaut -50 KPX Amacron Umacron -50 KPX Amacron Uogonek -50 KPX Amacron Uring -50 KPX Amacron V -70 KPX Amacron W -50 KPX Amacron Y -100 KPX Amacron Yacute -100 KPX Amacron Ydieresis -100 KPX Amacron u -30 KPX Amacron uacute -30 KPX Amacron ucircumflex -30 KPX Amacron udieresis -30 KPX Amacron ugrave -30 KPX Amacron uhungarumlaut -30 KPX Amacron umacron -30 KPX Amacron uogonek -30 KPX Amacron uring -30 KPX Amacron v -40 KPX Amacron w -40 KPX Amacron y -40 KPX Amacron yacute -40 KPX Amacron ydieresis -40 KPX Aogonek C -30 KPX Aogonek Cacute -30 KPX Aogonek Ccaron -30 KPX Aogonek Ccedilla -30 KPX Aogonek G -30 KPX Aogonek Gbreve -30 KPX Aogonek Gcommaaccent -30 KPX Aogonek O -30 KPX Aogonek Oacute -30 KPX Aogonek Ocircumflex -30 KPX Aogonek Odieresis -30 KPX Aogonek Ograve -30 KPX Aogonek Ohungarumlaut -30 KPX Aogonek Omacron -30 KPX Aogonek Oslash -30 KPX Aogonek Otilde -30 KPX Aogonek Q -30 KPX Aogonek T -120 KPX Aogonek Tcaron -120 KPX Aogonek Tcommaaccent -120 KPX Aogonek U -50 KPX Aogonek Uacute -50 KPX Aogonek Ucircumflex -50 KPX Aogonek Udieresis -50 KPX Aogonek Ugrave -50 KPX Aogonek Uhungarumlaut -50 KPX Aogonek Umacron -50 KPX Aogonek Uogonek -50 KPX Aogonek Uring -50 KPX Aogonek V -70 KPX Aogonek W -50 KPX Aogonek Y -100 KPX Aogonek Yacute -100 KPX Aogonek Ydieresis -100 KPX Aogonek u -30 KPX Aogonek uacute -30 KPX Aogonek ucircumflex -30 KPX Aogonek udieresis -30 KPX Aogonek ugrave -30 KPX Aogonek uhungarumlaut -30 KPX Aogonek umacron -30 KPX Aogonek uogonek -30 KPX Aogonek uring -30 KPX Aogonek v -40 KPX Aogonek w -40 KPX Aogonek y -40 KPX Aogonek yacute -40 KPX Aogonek ydieresis -40 KPX Aring C -30 KPX Aring Cacute -30 KPX Aring Ccaron -30 KPX Aring Ccedilla -30 KPX Aring G -30 KPX Aring Gbreve -30 KPX Aring Gcommaaccent -30 KPX Aring O -30 KPX Aring Oacute -30 KPX Aring Ocircumflex -30 KPX Aring Odieresis -30 KPX Aring Ograve -30 KPX Aring Ohungarumlaut -30 KPX Aring Omacron -30 KPX Aring Oslash -30 KPX Aring Otilde -30 KPX Aring Q -30 KPX Aring T -120 KPX Aring Tcaron -120 KPX Aring Tcommaaccent -120 KPX Aring U -50 KPX Aring Uacute -50 KPX Aring Ucircumflex -50 KPX Aring Udieresis -50 KPX Aring Ugrave -50 KPX Aring Uhungarumlaut -50 KPX Aring Umacron -50 KPX Aring Uogonek -50 KPX Aring Uring -50 KPX Aring V -70 KPX Aring W -50 KPX Aring Y -100 KPX Aring Yacute -100 KPX Aring Ydieresis -100 KPX Aring u -30 KPX Aring uacute -30 KPX Aring ucircumflex -30 KPX Aring udieresis -30 KPX Aring ugrave -30 KPX Aring uhungarumlaut -30 KPX Aring umacron -30 KPX Aring uogonek -30 KPX Aring uring -30 KPX Aring v -40 KPX Aring w -40 KPX Aring y -40 KPX Aring yacute -40 KPX Aring ydieresis -40 KPX Atilde C -30 KPX Atilde Cacute -30 KPX Atilde Ccaron -30 KPX Atilde Ccedilla -30 KPX Atilde G -30 KPX Atilde Gbreve -30 KPX Atilde Gcommaaccent -30 KPX Atilde O -30 KPX Atilde Oacute -30 KPX Atilde Ocircumflex -30 KPX Atilde Odieresis -30 KPX Atilde Ograve -30 KPX Atilde Ohungarumlaut -30 KPX Atilde Omacron -30 KPX Atilde Oslash -30 KPX Atilde Otilde -30 KPX Atilde Q -30 KPX Atilde T -120 KPX Atilde Tcaron -120 KPX Atilde Tcommaaccent -120 KPX Atilde U -50 KPX Atilde Uacute -50 KPX Atilde Ucircumflex -50 KPX Atilde Udieresis -50 KPX Atilde Ugrave -50 KPX Atilde Uhungarumlaut -50 KPX Atilde Umacron -50 KPX Atilde Uogonek -50 KPX Atilde Uring -50 KPX Atilde V -70 KPX Atilde W -50 KPX Atilde Y -100 KPX Atilde Yacute -100 KPX Atilde Ydieresis -100 KPX Atilde u -30 KPX Atilde uacute -30 KPX Atilde ucircumflex -30 KPX Atilde udieresis -30 KPX Atilde ugrave -30 KPX Atilde uhungarumlaut -30 KPX Atilde umacron -30 KPX Atilde uogonek -30 KPX Atilde uring -30 KPX Atilde v -40 KPX Atilde w -40 KPX Atilde y -40 KPX Atilde yacute -40 KPX Atilde ydieresis -40 KPX B U -10 KPX B Uacute -10 KPX B Ucircumflex -10 KPX B Udieresis -10 KPX B Ugrave -10 KPX B Uhungarumlaut -10 KPX B Umacron -10 KPX B Uogonek -10 KPX B Uring -10 KPX B comma -20 KPX B period -20 KPX C comma -30 KPX C period -30 KPX Cacute comma -30 KPX Cacute period -30 KPX Ccaron comma -30 KPX Ccaron period -30 KPX Ccedilla comma -30 KPX Ccedilla period -30 KPX D A -40 KPX D Aacute -40 KPX D Abreve -40 KPX D Acircumflex -40 KPX D Adieresis -40 KPX D Agrave -40 KPX D Amacron -40 KPX D Aogonek -40 KPX D Aring -40 KPX D Atilde -40 KPX D V -70 KPX D W -40 KPX D Y -90 KPX D Yacute -90 KPX D Ydieresis -90 KPX D comma -70 KPX D period -70 KPX Dcaron A -40 KPX Dcaron Aacute -40 KPX Dcaron Abreve -40 KPX Dcaron Acircumflex -40 KPX Dcaron Adieresis -40 KPX Dcaron Agrave -40 KPX Dcaron Amacron -40 KPX Dcaron Aogonek -40 KPX Dcaron Aring -40 KPX Dcaron Atilde -40 KPX Dcaron V -70 KPX Dcaron W -40 KPX Dcaron Y -90 KPX Dcaron Yacute -90 KPX Dcaron Ydieresis -90 KPX Dcaron comma -70 KPX Dcaron period -70 KPX Dcroat A -40 KPX Dcroat Aacute -40 KPX Dcroat Abreve -40 KPX Dcroat Acircumflex -40 KPX Dcroat Adieresis -40 KPX Dcroat Agrave -40 KPX Dcroat Amacron -40 KPX Dcroat Aogonek -40 KPX Dcroat Aring -40 KPX Dcroat Atilde -40 KPX Dcroat V -70 KPX Dcroat W -40 KPX Dcroat Y -90 KPX Dcroat Yacute -90 KPX Dcroat Ydieresis -90 KPX Dcroat comma -70 KPX Dcroat period -70 KPX F A -80 KPX F Aacute -80 KPX F Abreve -80 KPX F Acircumflex -80 KPX F Adieresis -80 KPX F Agrave -80 KPX F Amacron -80 KPX F Aogonek -80 KPX F Aring -80 KPX F Atilde -80 KPX F a -50 KPX F aacute -50 KPX F abreve -50 KPX F acircumflex -50 KPX F adieresis -50 KPX F agrave -50 KPX F amacron -50 KPX F aogonek -50 KPX F aring -50 KPX F atilde -50 KPX F comma -150 KPX F e -30 KPX F eacute -30 KPX F ecaron -30 KPX F ecircumflex -30 KPX F edieresis -30 KPX F edotaccent -30 KPX F egrave -30 KPX F emacron -30 KPX F eogonek -30 KPX F o -30 KPX F oacute -30 KPX F ocircumflex -30 KPX F odieresis -30 KPX F ograve -30 KPX F ohungarumlaut -30 KPX F omacron -30 KPX F oslash -30 KPX F otilde -30 KPX F period -150 KPX F r -45 KPX F racute -45 KPX F rcaron -45 KPX F rcommaaccent -45 KPX J A -20 KPX J Aacute -20 KPX J Abreve -20 KPX J Acircumflex -20 KPX J Adieresis -20 KPX J Agrave -20 KPX J Amacron -20 KPX J Aogonek -20 KPX J Aring -20 KPX J Atilde -20 KPX J a -20 KPX J aacute -20 KPX J abreve -20 KPX J acircumflex -20 KPX J adieresis -20 KPX J agrave -20 KPX J amacron -20 KPX J aogonek -20 KPX J aring -20 KPX J atilde -20 KPX J comma -30 KPX J period -30 KPX J u -20 KPX J uacute -20 KPX J ucircumflex -20 KPX J udieresis -20 KPX J ugrave -20 KPX J uhungarumlaut -20 KPX J umacron -20 KPX J uogonek -20 KPX J uring -20 KPX K O -50 KPX K Oacute -50 KPX K Ocircumflex -50 KPX K Odieresis -50 KPX K Ograve -50 KPX K Ohungarumlaut -50 KPX K Omacron -50 KPX K Oslash -50 KPX K Otilde -50 KPX K e -40 KPX K eacute -40 KPX K ecaron -40 KPX K ecircumflex -40 KPX K edieresis -40 KPX K edotaccent -40 KPX K egrave -40 KPX K emacron -40 KPX K eogonek -40 KPX K o -40 KPX K oacute -40 KPX K ocircumflex -40 KPX K odieresis -40 KPX K ograve -40 KPX K ohungarumlaut -40 KPX K omacron -40 KPX K oslash -40 KPX K otilde -40 KPX K u -30 KPX K uacute -30 KPX K ucircumflex -30 KPX K udieresis -30 KPX K ugrave -30 KPX K uhungarumlaut -30 KPX K umacron -30 KPX K uogonek -30 KPX K uring -30 KPX K y -50 KPX K yacute -50 KPX K ydieresis -50 KPX Kcommaaccent O -50 KPX Kcommaaccent Oacute -50 KPX Kcommaaccent Ocircumflex -50 KPX Kcommaaccent Odieresis -50 KPX Kcommaaccent Ograve -50 KPX Kcommaaccent Ohungarumlaut -50 KPX Kcommaaccent Omacron -50 KPX Kcommaaccent Oslash -50 KPX Kcommaaccent Otilde -50 KPX Kcommaaccent e -40 KPX Kcommaaccent eacute -40 KPX Kcommaaccent ecaron -40 KPX Kcommaaccent ecircumflex -40 KPX Kcommaaccent edieresis -40 KPX Kcommaaccent edotaccent -40 KPX Kcommaaccent egrave -40 KPX Kcommaaccent emacron -40 KPX Kcommaaccent eogonek -40 KPX Kcommaaccent o -40 KPX Kcommaaccent oacute -40 KPX Kcommaaccent ocircumflex -40 KPX Kcommaaccent odieresis -40 KPX Kcommaaccent ograve -40 KPX Kcommaaccent ohungarumlaut -40 KPX Kcommaaccent omacron -40 KPX Kcommaaccent oslash -40 KPX Kcommaaccent otilde -40 KPX Kcommaaccent u -30 KPX Kcommaaccent uacute -30 KPX Kcommaaccent ucircumflex -30 KPX Kcommaaccent udieresis -30 KPX Kcommaaccent ugrave -30 KPX Kcommaaccent uhungarumlaut -30 KPX Kcommaaccent umacron -30 KPX Kcommaaccent uogonek -30 KPX Kcommaaccent uring -30 KPX Kcommaaccent y -50 KPX Kcommaaccent yacute -50 KPX Kcommaaccent ydieresis -50 KPX L T -110 KPX L Tcaron -110 KPX L Tcommaaccent -110 KPX L V -110 KPX L W -70 KPX L Y -140 KPX L Yacute -140 KPX L Ydieresis -140 KPX L quotedblright -140 KPX L quoteright -160 KPX L y -30 KPX L yacute -30 KPX L ydieresis -30 KPX Lacute T -110 KPX Lacute Tcaron -110 KPX Lacute Tcommaaccent -110 KPX Lacute V -110 KPX Lacute W -70 KPX Lacute Y -140 KPX Lacute Yacute -140 KPX Lacute Ydieresis -140 KPX Lacute quotedblright -140 KPX Lacute quoteright -160 KPX Lacute y -30 KPX Lacute yacute -30 KPX Lacute ydieresis -30 KPX Lcaron T -110 KPX Lcaron Tcaron -110 KPX Lcaron Tcommaaccent -110 KPX Lcaron V -110 KPX Lcaron W -70 KPX Lcaron Y -140 KPX Lcaron Yacute -140 KPX Lcaron Ydieresis -140 KPX Lcaron quotedblright -140 KPX Lcaron quoteright -160 KPX Lcaron y -30 KPX Lcaron yacute -30 KPX Lcaron ydieresis -30 KPX Lcommaaccent T -110 KPX Lcommaaccent Tcaron -110 KPX Lcommaaccent Tcommaaccent -110 KPX Lcommaaccent V -110 KPX Lcommaaccent W -70 KPX Lcommaaccent Y -140 KPX Lcommaaccent Yacute -140 KPX Lcommaaccent Ydieresis -140 KPX Lcommaaccent quotedblright -140 KPX Lcommaaccent quoteright -160 KPX Lcommaaccent y -30 KPX Lcommaaccent yacute -30 KPX Lcommaaccent ydieresis -30 KPX Lslash T -110 KPX Lslash Tcaron -110 KPX Lslash Tcommaaccent -110 KPX Lslash V -110 KPX Lslash W -70 KPX Lslash Y -140 KPX Lslash Yacute -140 KPX Lslash Ydieresis -140 KPX Lslash quotedblright -140 KPX Lslash quoteright -160 KPX Lslash y -30 KPX Lslash yacute -30 KPX Lslash ydieresis -30 KPX O A -20 KPX O Aacute -20 KPX O Abreve -20 KPX O Acircumflex -20 KPX O Adieresis -20 KPX O Agrave -20 KPX O Amacron -20 KPX O Aogonek -20 KPX O Aring -20 KPX O Atilde -20 KPX O T -40 KPX O Tcaron -40 KPX O Tcommaaccent -40 KPX O V -50 KPX O W -30 KPX O X -60 KPX O Y -70 KPX O Yacute -70 KPX O Ydieresis -70 KPX O comma -40 KPX O period -40 KPX Oacute A -20 KPX Oacute Aacute -20 KPX Oacute Abreve -20 KPX Oacute Acircumflex -20 KPX Oacute Adieresis -20 KPX Oacute Agrave -20 KPX Oacute Amacron -20 KPX Oacute Aogonek -20 KPX Oacute Aring -20 KPX Oacute Atilde -20 KPX Oacute T -40 KPX Oacute Tcaron -40 KPX Oacute Tcommaaccent -40 KPX Oacute V -50 KPX Oacute W -30 KPX Oacute X -60 KPX Oacute Y -70 KPX Oacute Yacute -70 KPX Oacute Ydieresis -70 KPX Oacute comma -40 KPX Oacute period -40 KPX Ocircumflex A -20 KPX Ocircumflex Aacute -20 KPX Ocircumflex Abreve -20 KPX Ocircumflex Acircumflex -20 KPX Ocircumflex Adieresis -20 KPX Ocircumflex Agrave -20 KPX Ocircumflex Amacron -20 KPX Ocircumflex Aogonek -20 KPX Ocircumflex Aring -20 KPX Ocircumflex Atilde -20 KPX Ocircumflex T -40 KPX Ocircumflex Tcaron -40 KPX Ocircumflex Tcommaaccent -40 KPX Ocircumflex V -50 KPX Ocircumflex W -30 KPX Ocircumflex X -60 KPX Ocircumflex Y -70 KPX Ocircumflex Yacute -70 KPX Ocircumflex Ydieresis -70 KPX Ocircumflex comma -40 KPX Ocircumflex period -40 KPX Odieresis A -20 KPX Odieresis Aacute -20 KPX Odieresis Abreve -20 KPX Odieresis Acircumflex -20 KPX Odieresis Adieresis -20 KPX Odieresis Agrave -20 KPX Odieresis Amacron -20 KPX Odieresis Aogonek -20 KPX Odieresis Aring -20 KPX Odieresis Atilde -20 KPX Odieresis T -40 KPX Odieresis Tcaron -40 KPX Odieresis Tcommaaccent -40 KPX Odieresis V -50 KPX Odieresis W -30 KPX Odieresis X -60 KPX Odieresis Y -70 KPX Odieresis Yacute -70 KPX Odieresis Ydieresis -70 KPX Odieresis comma -40 KPX Odieresis period -40 KPX Ograve A -20 KPX Ograve Aacute -20 KPX Ograve Abreve -20 KPX Ograve Acircumflex -20 KPX Ograve Adieresis -20 KPX Ograve Agrave -20 KPX Ograve Amacron -20 KPX Ograve Aogonek -20 KPX Ograve Aring -20 KPX Ograve Atilde -20 KPX Ograve T -40 KPX Ograve Tcaron -40 KPX Ograve Tcommaaccent -40 KPX Ograve V -50 KPX Ograve W -30 KPX Ograve X -60 KPX Ograve Y -70 KPX Ograve Yacute -70 KPX Ograve Ydieresis -70 KPX Ograve comma -40 KPX Ograve period -40 KPX Ohungarumlaut A -20 KPX Ohungarumlaut Aacute -20 KPX Ohungarumlaut Abreve -20 KPX Ohungarumlaut Acircumflex -20 KPX Ohungarumlaut Adieresis -20 KPX Ohungarumlaut Agrave -20 KPX Ohungarumlaut Amacron -20 KPX Ohungarumlaut Aogonek -20 KPX Ohungarumlaut Aring -20 KPX Ohungarumlaut Atilde -20 KPX Ohungarumlaut T -40 KPX Ohungarumlaut Tcaron -40 KPX Ohungarumlaut Tcommaaccent -40 KPX Ohungarumlaut V -50 KPX Ohungarumlaut W -30 KPX Ohungarumlaut X -60 KPX Ohungarumlaut Y -70 KPX Ohungarumlaut Yacute -70 KPX Ohungarumlaut Ydieresis -70 KPX Ohungarumlaut comma -40 KPX Ohungarumlaut period -40 KPX Omacron A -20 KPX Omacron Aacute -20 KPX Omacron Abreve -20 KPX Omacron Acircumflex -20 KPX Omacron Adieresis -20 KPX Omacron Agrave -20 KPX Omacron Amacron -20 KPX Omacron Aogonek -20 KPX Omacron Aring -20 KPX Omacron Atilde -20 KPX Omacron T -40 KPX Omacron Tcaron -40 KPX Omacron Tcommaaccent -40 KPX Omacron V -50 KPX Omacron W -30 KPX Omacron X -60 KPX Omacron Y -70 KPX Omacron Yacute -70 KPX Omacron Ydieresis -70 KPX Omacron comma -40 KPX Omacron period -40 KPX Oslash A -20 KPX Oslash Aacute -20 KPX Oslash Abreve -20 KPX Oslash Acircumflex -20 KPX Oslash Adieresis -20 KPX Oslash Agrave -20 KPX Oslash Amacron -20 KPX Oslash Aogonek -20 KPX Oslash Aring -20 KPX Oslash Atilde -20 KPX Oslash T -40 KPX Oslash Tcaron -40 KPX Oslash Tcommaaccent -40 KPX Oslash V -50 KPX Oslash W -30 KPX Oslash X -60 KPX Oslash Y -70 KPX Oslash Yacute -70 KPX Oslash Ydieresis -70 KPX Oslash comma -40 KPX Oslash period -40 KPX Otilde A -20 KPX Otilde Aacute -20 KPX Otilde Abreve -20 KPX Otilde Acircumflex -20 KPX Otilde Adieresis -20 KPX Otilde Agrave -20 KPX Otilde Amacron -20 KPX Otilde Aogonek -20 KPX Otilde Aring -20 KPX Otilde Atilde -20 KPX Otilde T -40 KPX Otilde Tcaron -40 KPX Otilde Tcommaaccent -40 KPX Otilde V -50 KPX Otilde W -30 KPX Otilde X -60 KPX Otilde Y -70 KPX Otilde Yacute -70 KPX Otilde Ydieresis -70 KPX Otilde comma -40 KPX Otilde period -40 KPX P A -120 KPX P Aacute -120 KPX P Abreve -120 KPX P Acircumflex -120 KPX P Adieresis -120 KPX P Agrave -120 KPX P Amacron -120 KPX P Aogonek -120 KPX P Aring -120 KPX P Atilde -120 KPX P a -40 KPX P aacute -40 KPX P abreve -40 KPX P acircumflex -40 KPX P adieresis -40 KPX P agrave -40 KPX P amacron -40 KPX P aogonek -40 KPX P aring -40 KPX P atilde -40 KPX P comma -180 KPX P e -50 KPX P eacute -50 KPX P ecaron -50 KPX P ecircumflex -50 KPX P edieresis -50 KPX P edotaccent -50 KPX P egrave -50 KPX P emacron -50 KPX P eogonek -50 KPX P o -50 KPX P oacute -50 KPX P ocircumflex -50 KPX P odieresis -50 KPX P ograve -50 KPX P ohungarumlaut -50 KPX P omacron -50 KPX P oslash -50 KPX P otilde -50 KPX P period -180 KPX Q U -10 KPX Q Uacute -10 KPX Q Ucircumflex -10 KPX Q Udieresis -10 KPX Q Ugrave -10 KPX Q Uhungarumlaut -10 KPX Q Umacron -10 KPX Q Uogonek -10 KPX Q Uring -10 KPX R O -20 KPX R Oacute -20 KPX R Ocircumflex -20 KPX R Odieresis -20 KPX R Ograve -20 KPX R Ohungarumlaut -20 KPX R Omacron -20 KPX R Oslash -20 KPX R Otilde -20 KPX R T -30 KPX R Tcaron -30 KPX R Tcommaaccent -30 KPX R U -40 KPX R Uacute -40 KPX R Ucircumflex -40 KPX R Udieresis -40 KPX R Ugrave -40 KPX R Uhungarumlaut -40 KPX R Umacron -40 KPX R Uogonek -40 KPX R Uring -40 KPX R V -50 KPX R W -30 KPX R Y -50 KPX R Yacute -50 KPX R Ydieresis -50 KPX Racute O -20 KPX Racute Oacute -20 KPX Racute Ocircumflex -20 KPX Racute Odieresis -20 KPX Racute Ograve -20 KPX Racute Ohungarumlaut -20 KPX Racute Omacron -20 KPX Racute Oslash -20 KPX Racute Otilde -20 KPX Racute T -30 KPX Racute Tcaron -30 KPX Racute Tcommaaccent -30 KPX Racute U -40 KPX Racute Uacute -40 KPX Racute Ucircumflex -40 KPX Racute Udieresis -40 KPX Racute Ugrave -40 KPX Racute Uhungarumlaut -40 KPX Racute Umacron -40 KPX Racute Uogonek -40 KPX Racute Uring -40 KPX Racute V -50 KPX Racute W -30 KPX Racute Y -50 KPX Racute Yacute -50 KPX Racute Ydieresis -50 KPX Rcaron O -20 KPX Rcaron Oacute -20 KPX Rcaron Ocircumflex -20 KPX Rcaron Odieresis -20 KPX Rcaron Ograve -20 KPX Rcaron Ohungarumlaut -20 KPX Rcaron Omacron -20 KPX Rcaron Oslash -20 KPX Rcaron Otilde -20 KPX Rcaron T -30 KPX Rcaron Tcaron -30 KPX Rcaron Tcommaaccent -30 KPX Rcaron U -40 KPX Rcaron Uacute -40 KPX Rcaron Ucircumflex -40 KPX Rcaron Udieresis -40 KPX Rcaron Ugrave -40 KPX Rcaron Uhungarumlaut -40 KPX Rcaron Umacron -40 KPX Rcaron Uogonek -40 KPX Rcaron Uring -40 KPX Rcaron V -50 KPX Rcaron W -30 KPX Rcaron Y -50 KPX Rcaron Yacute -50 KPX Rcaron Ydieresis -50 KPX Rcommaaccent O -20 KPX Rcommaaccent Oacute -20 KPX Rcommaaccent Ocircumflex -20 KPX Rcommaaccent Odieresis -20 KPX Rcommaaccent Ograve -20 KPX Rcommaaccent Ohungarumlaut -20 KPX Rcommaaccent Omacron -20 KPX Rcommaaccent Oslash -20 KPX Rcommaaccent Otilde -20 KPX Rcommaaccent T -30 KPX Rcommaaccent Tcaron -30 KPX Rcommaaccent Tcommaaccent -30 KPX Rcommaaccent U -40 KPX Rcommaaccent Uacute -40 KPX Rcommaaccent Ucircumflex -40 KPX Rcommaaccent Udieresis -40 KPX Rcommaaccent Ugrave -40 KPX Rcommaaccent Uhungarumlaut -40 KPX Rcommaaccent Umacron -40 KPX Rcommaaccent Uogonek -40 KPX Rcommaaccent Uring -40 KPX Rcommaaccent V -50 KPX Rcommaaccent W -30 KPX Rcommaaccent Y -50 KPX Rcommaaccent Yacute -50 KPX Rcommaaccent Ydieresis -50 KPX S comma -20 KPX S period -20 KPX Sacute comma -20 KPX Sacute period -20 KPX Scaron comma -20 KPX Scaron period -20 KPX Scedilla comma -20 KPX Scedilla period -20 KPX Scommaaccent comma -20 KPX Scommaaccent period -20 KPX T A -120 KPX T Aacute -120 KPX T Abreve -120 KPX T Acircumflex -120 KPX T Adieresis -120 KPX T Agrave -120 KPX T Amacron -120 KPX T Aogonek -120 KPX T Aring -120 KPX T Atilde -120 KPX T O -40 KPX T Oacute -40 KPX T Ocircumflex -40 KPX T Odieresis -40 KPX T Ograve -40 KPX T Ohungarumlaut -40 KPX T Omacron -40 KPX T Oslash -40 KPX T Otilde -40 KPX T a -120 KPX T aacute -120 KPX T abreve -60 KPX T acircumflex -120 KPX T adieresis -120 KPX T agrave -120 KPX T amacron -60 KPX T aogonek -120 KPX T aring -120 KPX T atilde -60 KPX T colon -20 KPX T comma -120 KPX T e -120 KPX T eacute -120 KPX T ecaron -120 KPX T ecircumflex -120 KPX T edieresis -120 KPX T edotaccent -120 KPX T egrave -60 KPX T emacron -60 KPX T eogonek -120 KPX T hyphen -140 KPX T o -120 KPX T oacute -120 KPX T ocircumflex -120 KPX T odieresis -120 KPX T ograve -120 KPX T ohungarumlaut -120 KPX T omacron -60 KPX T oslash -120 KPX T otilde -60 KPX T period -120 KPX T r -120 KPX T racute -120 KPX T rcaron -120 KPX T rcommaaccent -120 KPX T semicolon -20 KPX T u -120 KPX T uacute -120 KPX T ucircumflex -120 KPX T udieresis -120 KPX T ugrave -120 KPX T uhungarumlaut -120 KPX T umacron -60 KPX T uogonek -120 KPX T uring -120 KPX T w -120 KPX T y -120 KPX T yacute -120 KPX T ydieresis -60 KPX Tcaron A -120 KPX Tcaron Aacute -120 KPX Tcaron Abreve -120 KPX Tcaron Acircumflex -120 KPX Tcaron Adieresis -120 KPX Tcaron Agrave -120 KPX Tcaron Amacron -120 KPX Tcaron Aogonek -120 KPX Tcaron Aring -120 KPX Tcaron Atilde -120 KPX Tcaron O -40 KPX Tcaron Oacute -40 KPX Tcaron Ocircumflex -40 KPX Tcaron Odieresis -40 KPX Tcaron Ograve -40 KPX Tcaron Ohungarumlaut -40 KPX Tcaron Omacron -40 KPX Tcaron Oslash -40 KPX Tcaron Otilde -40 KPX Tcaron a -120 KPX Tcaron aacute -120 KPX Tcaron abreve -60 KPX Tcaron acircumflex -120 KPX Tcaron adieresis -120 KPX Tcaron agrave -120 KPX Tcaron amacron -60 KPX Tcaron aogonek -120 KPX Tcaron aring -120 KPX Tcaron atilde -60 KPX Tcaron colon -20 KPX Tcaron comma -120 KPX Tcaron e -120 KPX Tcaron eacute -120 KPX Tcaron ecaron -120 KPX Tcaron ecircumflex -120 KPX Tcaron edieresis -120 KPX Tcaron edotaccent -120 KPX Tcaron egrave -60 KPX Tcaron emacron -60 KPX Tcaron eogonek -120 KPX Tcaron hyphen -140 KPX Tcaron o -120 KPX Tcaron oacute -120 KPX Tcaron ocircumflex -120 KPX Tcaron odieresis -120 KPX Tcaron ograve -120 KPX Tcaron ohungarumlaut -120 KPX Tcaron omacron -60 KPX Tcaron oslash -120 KPX Tcaron otilde -60 KPX Tcaron period -120 KPX Tcaron r -120 KPX Tcaron racute -120 KPX Tcaron rcaron -120 KPX Tcaron rcommaaccent -120 KPX Tcaron semicolon -20 KPX Tcaron u -120 KPX Tcaron uacute -120 KPX Tcaron ucircumflex -120 KPX Tcaron udieresis -120 KPX Tcaron ugrave -120 KPX Tcaron uhungarumlaut -120 KPX Tcaron umacron -60 KPX Tcaron uogonek -120 KPX Tcaron uring -120 KPX Tcaron w -120 KPX Tcaron y -120 KPX Tcaron yacute -120 KPX Tcaron ydieresis -60 KPX Tcommaaccent A -120 KPX Tcommaaccent Aacute -120 KPX Tcommaaccent Abreve -120 KPX Tcommaaccent Acircumflex -120 KPX Tcommaaccent Adieresis -120 KPX Tcommaaccent Agrave -120 KPX Tcommaaccent Amacron -120 KPX Tcommaaccent Aogonek -120 KPX Tcommaaccent Aring -120 KPX Tcommaaccent Atilde -120 KPX Tcommaaccent O -40 KPX Tcommaaccent Oacute -40 KPX Tcommaaccent Ocircumflex -40 KPX Tcommaaccent Odieresis -40 KPX Tcommaaccent Ograve -40 KPX Tcommaaccent Ohungarumlaut -40 KPX Tcommaaccent Omacron -40 KPX Tcommaaccent Oslash -40 KPX Tcommaaccent Otilde -40 KPX Tcommaaccent a -120 KPX Tcommaaccent aacute -120 KPX Tcommaaccent abreve -60 KPX Tcommaaccent acircumflex -120 KPX Tcommaaccent adieresis -120 KPX Tcommaaccent agrave -120 KPX Tcommaaccent amacron -60 KPX Tcommaaccent aogonek -120 KPX Tcommaaccent aring -120 KPX Tcommaaccent atilde -60 KPX Tcommaaccent colon -20 KPX Tcommaaccent comma -120 KPX Tcommaaccent e -120 KPX Tcommaaccent eacute -120 KPX Tcommaaccent ecaron -120 KPX Tcommaaccent ecircumflex -120 KPX Tcommaaccent edieresis -120 KPX Tcommaaccent edotaccent -120 KPX Tcommaaccent egrave -60 KPX Tcommaaccent emacron -60 KPX Tcommaaccent eogonek -120 KPX Tcommaaccent hyphen -140 KPX Tcommaaccent o -120 KPX Tcommaaccent oacute -120 KPX Tcommaaccent ocircumflex -120 KPX Tcommaaccent odieresis -120 KPX Tcommaaccent ograve -120 KPX Tcommaaccent ohungarumlaut -120 KPX Tcommaaccent omacron -60 KPX Tcommaaccent oslash -120 KPX Tcommaaccent otilde -60 KPX Tcommaaccent period -120 KPX Tcommaaccent r -120 KPX Tcommaaccent racute -120 KPX Tcommaaccent rcaron -120 KPX Tcommaaccent rcommaaccent -120 KPX Tcommaaccent semicolon -20 KPX Tcommaaccent u -120 KPX Tcommaaccent uacute -120 KPX Tcommaaccent ucircumflex -120 KPX Tcommaaccent udieresis -120 KPX Tcommaaccent ugrave -120 KPX Tcommaaccent uhungarumlaut -120 KPX Tcommaaccent umacron -60 KPX Tcommaaccent uogonek -120 KPX Tcommaaccent uring -120 KPX Tcommaaccent w -120 KPX Tcommaaccent y -120 KPX Tcommaaccent yacute -120 KPX Tcommaaccent ydieresis -60 KPX U A -40 KPX U Aacute -40 KPX U Abreve -40 KPX U Acircumflex -40 KPX U Adieresis -40 KPX U Agrave -40 KPX U Amacron -40 KPX U Aogonek -40 KPX U Aring -40 KPX U Atilde -40 KPX U comma -40 KPX U period -40 KPX Uacute A -40 KPX Uacute Aacute -40 KPX Uacute Abreve -40 KPX Uacute Acircumflex -40 KPX Uacute Adieresis -40 KPX Uacute Agrave -40 KPX Uacute Amacron -40 KPX Uacute Aogonek -40 KPX Uacute Aring -40 KPX Uacute Atilde -40 KPX Uacute comma -40 KPX Uacute period -40 KPX Ucircumflex A -40 KPX Ucircumflex Aacute -40 KPX Ucircumflex Abreve -40 KPX Ucircumflex Acircumflex -40 KPX Ucircumflex Adieresis -40 KPX Ucircumflex Agrave -40 KPX Ucircumflex Amacron -40 KPX Ucircumflex Aogonek -40 KPX Ucircumflex Aring -40 KPX Ucircumflex Atilde -40 KPX Ucircumflex comma -40 KPX Ucircumflex period -40 KPX Udieresis A -40 KPX Udieresis Aacute -40 KPX Udieresis Abreve -40 KPX Udieresis Acircumflex -40 KPX Udieresis Adieresis -40 KPX Udieresis Agrave -40 KPX Udieresis Amacron -40 KPX Udieresis Aogonek -40 KPX Udieresis Aring -40 KPX Udieresis Atilde -40 KPX Udieresis comma -40 KPX Udieresis period -40 KPX Ugrave A -40 KPX Ugrave Aacute -40 KPX Ugrave Abreve -40 KPX Ugrave Acircumflex -40 KPX Ugrave Adieresis -40 KPX Ugrave Agrave -40 KPX Ugrave Amacron -40 KPX Ugrave Aogonek -40 KPX Ugrave Aring -40 KPX Ugrave Atilde -40 KPX Ugrave comma -40 KPX Ugrave period -40 KPX Uhungarumlaut A -40 KPX Uhungarumlaut Aacute -40 KPX Uhungarumlaut Abreve -40 KPX Uhungarumlaut Acircumflex -40 KPX Uhungarumlaut Adieresis -40 KPX Uhungarumlaut Agrave -40 KPX Uhungarumlaut Amacron -40 KPX Uhungarumlaut Aogonek -40 KPX Uhungarumlaut Aring -40 KPX Uhungarumlaut Atilde -40 KPX Uhungarumlaut comma -40 KPX Uhungarumlaut period -40 KPX Umacron A -40 KPX Umacron Aacute -40 KPX Umacron Abreve -40 KPX Umacron Acircumflex -40 KPX Umacron Adieresis -40 KPX Umacron Agrave -40 KPX Umacron Amacron -40 KPX Umacron Aogonek -40 KPX Umacron Aring -40 KPX Umacron Atilde -40 KPX Umacron comma -40 KPX Umacron period -40 KPX Uogonek A -40 KPX Uogonek Aacute -40 KPX Uogonek Abreve -40 KPX Uogonek Acircumflex -40 KPX Uogonek Adieresis -40 KPX Uogonek Agrave -40 KPX Uogonek Amacron -40 KPX Uogonek Aogonek -40 KPX Uogonek Aring -40 KPX Uogonek Atilde -40 KPX Uogonek comma -40 KPX Uogonek period -40 KPX Uring A -40 KPX Uring Aacute -40 KPX Uring Abreve -40 KPX Uring Acircumflex -40 KPX Uring Adieresis -40 KPX Uring Agrave -40 KPX Uring Amacron -40 KPX Uring Aogonek -40 KPX Uring Aring -40 KPX Uring Atilde -40 KPX Uring comma -40 KPX Uring period -40 KPX V A -80 KPX V Aacute -80 KPX V Abreve -80 KPX V Acircumflex -80 KPX V Adieresis -80 KPX V Agrave -80 KPX V Amacron -80 KPX V Aogonek -80 KPX V Aring -80 KPX V Atilde -80 KPX V G -40 KPX V Gbreve -40 KPX V Gcommaaccent -40 KPX V O -40 KPX V Oacute -40 KPX V Ocircumflex -40 KPX V Odieresis -40 KPX V Ograve -40 KPX V Ohungarumlaut -40 KPX V Omacron -40 KPX V Oslash -40 KPX V Otilde -40 KPX V a -70 KPX V aacute -70 KPX V abreve -70 KPX V acircumflex -70 KPX V adieresis -70 KPX V agrave -70 KPX V amacron -70 KPX V aogonek -70 KPX V aring -70 KPX V atilde -70 KPX V colon -40 KPX V comma -125 KPX V e -80 KPX V eacute -80 KPX V ecaron -80 KPX V ecircumflex -80 KPX V edieresis -80 KPX V edotaccent -80 KPX V egrave -80 KPX V emacron -80 KPX V eogonek -80 KPX V hyphen -80 KPX V o -80 KPX V oacute -80 KPX V ocircumflex -80 KPX V odieresis -80 KPX V ograve -80 KPX V ohungarumlaut -80 KPX V omacron -80 KPX V oslash -80 KPX V otilde -80 KPX V period -125 KPX V semicolon -40 KPX V u -70 KPX V uacute -70 KPX V ucircumflex -70 KPX V udieresis -70 KPX V ugrave -70 KPX V uhungarumlaut -70 KPX V umacron -70 KPX V uogonek -70 KPX V uring -70 KPX W A -50 KPX W Aacute -50 KPX W Abreve -50 KPX W Acircumflex -50 KPX W Adieresis -50 KPX W Agrave -50 KPX W Amacron -50 KPX W Aogonek -50 KPX W Aring -50 KPX W Atilde -50 KPX W O -20 KPX W Oacute -20 KPX W Ocircumflex -20 KPX W Odieresis -20 KPX W Ograve -20 KPX W Ohungarumlaut -20 KPX W Omacron -20 KPX W Oslash -20 KPX W Otilde -20 KPX W a -40 KPX W aacute -40 KPX W abreve -40 KPX W acircumflex -40 KPX W adieresis -40 KPX W agrave -40 KPX W amacron -40 KPX W aogonek -40 KPX W aring -40 KPX W atilde -40 KPX W comma -80 KPX W e -30 KPX W eacute -30 KPX W ecaron -30 KPX W ecircumflex -30 KPX W edieresis -30 KPX W edotaccent -30 KPX W egrave -30 KPX W emacron -30 KPX W eogonek -30 KPX W hyphen -40 KPX W o -30 KPX W oacute -30 KPX W ocircumflex -30 KPX W odieresis -30 KPX W ograve -30 KPX W ohungarumlaut -30 KPX W omacron -30 KPX W oslash -30 KPX W otilde -30 KPX W period -80 KPX W u -30 KPX W uacute -30 KPX W ucircumflex -30 KPX W udieresis -30 KPX W ugrave -30 KPX W uhungarumlaut -30 KPX W umacron -30 KPX W uogonek -30 KPX W uring -30 KPX W y -20 KPX W yacute -20 KPX W ydieresis -20 KPX Y A -110 KPX Y Aacute -110 KPX Y Abreve -110 KPX Y Acircumflex -110 KPX Y Adieresis -110 KPX Y Agrave -110 KPX Y Amacron -110 KPX Y Aogonek -110 KPX Y Aring -110 KPX Y Atilde -110 KPX Y O -85 KPX Y Oacute -85 KPX Y Ocircumflex -85 KPX Y Odieresis -85 KPX Y Ograve -85 KPX Y Ohungarumlaut -85 KPX Y Omacron -85 KPX Y Oslash -85 KPX Y Otilde -85 KPX Y a -140 KPX Y aacute -140 KPX Y abreve -70 KPX Y acircumflex -140 KPX Y adieresis -140 KPX Y agrave -140 KPX Y amacron -70 KPX Y aogonek -140 KPX Y aring -140 KPX Y atilde -140 KPX Y colon -60 KPX Y comma -140 KPX Y e -140 KPX Y eacute -140 KPX Y ecaron -140 KPX Y ecircumflex -140 KPX Y edieresis -140 KPX Y edotaccent -140 KPX Y egrave -140 KPX Y emacron -70 KPX Y eogonek -140 KPX Y hyphen -140 KPX Y i -20 KPX Y iacute -20 KPX Y iogonek -20 KPX Y o -140 KPX Y oacute -140 KPX Y ocircumflex -140 KPX Y odieresis -140 KPX Y ograve -140 KPX Y ohungarumlaut -140 KPX Y omacron -140 KPX Y oslash -140 KPX Y otilde -140 KPX Y period -140 KPX Y semicolon -60 KPX Y u -110 KPX Y uacute -110 KPX Y ucircumflex -110 KPX Y udieresis -110 KPX Y ugrave -110 KPX Y uhungarumlaut -110 KPX Y umacron -110 KPX Y uogonek -110 KPX Y uring -110 KPX Yacute A -110 KPX Yacute Aacute -110 KPX Yacute Abreve -110 KPX Yacute Acircumflex -110 KPX Yacute Adieresis -110 KPX Yacute Agrave -110 KPX Yacute Amacron -110 KPX Yacute Aogonek -110 KPX Yacute Aring -110 KPX Yacute Atilde -110 KPX Yacute O -85 KPX Yacute Oacute -85 KPX Yacute Ocircumflex -85 KPX Yacute Odieresis -85 KPX Yacute Ograve -85 KPX Yacute Ohungarumlaut -85 KPX Yacute Omacron -85 KPX Yacute Oslash -85 KPX Yacute Otilde -85 KPX Yacute a -140 KPX Yacute aacute -140 KPX Yacute abreve -70 KPX Yacute acircumflex -140 KPX Yacute adieresis -140 KPX Yacute agrave -140 KPX Yacute amacron -70 KPX Yacute aogonek -140 KPX Yacute aring -140 KPX Yacute atilde -70 KPX Yacute colon -60 KPX Yacute comma -140 KPX Yacute e -140 KPX Yacute eacute -140 KPX Yacute ecaron -140 KPX Yacute ecircumflex -140 KPX Yacute edieresis -140 KPX Yacute edotaccent -140 KPX Yacute egrave -140 KPX Yacute emacron -70 KPX Yacute eogonek -140 KPX Yacute hyphen -140 KPX Yacute i -20 KPX Yacute iacute -20 KPX Yacute iogonek -20 KPX Yacute o -140 KPX Yacute oacute -140 KPX Yacute ocircumflex -140 KPX Yacute odieresis -140 KPX Yacute ograve -140 KPX Yacute ohungarumlaut -140 KPX Yacute omacron -70 KPX Yacute oslash -140 KPX Yacute otilde -140 KPX Yacute period -140 KPX Yacute semicolon -60 KPX Yacute u -110 KPX Yacute uacute -110 KPX Yacute ucircumflex -110 KPX Yacute udieresis -110 KPX Yacute ugrave -110 KPX Yacute uhungarumlaut -110 KPX Yacute umacron -110 KPX Yacute uogonek -110 KPX Yacute uring -110 KPX Ydieresis A -110 KPX Ydieresis Aacute -110 KPX Ydieresis Abreve -110 KPX Ydieresis Acircumflex -110 KPX Ydieresis Adieresis -110 KPX Ydieresis Agrave -110 KPX Ydieresis Amacron -110 KPX Ydieresis Aogonek -110 KPX Ydieresis Aring -110 KPX Ydieresis Atilde -110 KPX Ydieresis O -85 KPX Ydieresis Oacute -85 KPX Ydieresis Ocircumflex -85 KPX Ydieresis Odieresis -85 KPX Ydieresis Ograve -85 KPX Ydieresis Ohungarumlaut -85 KPX Ydieresis Omacron -85 KPX Ydieresis Oslash -85 KPX Ydieresis Otilde -85 KPX Ydieresis a -140 KPX Ydieresis aacute -140 KPX Ydieresis abreve -70 KPX Ydieresis acircumflex -140 KPX Ydieresis adieresis -140 KPX Ydieresis agrave -140 KPX Ydieresis amacron -70 KPX Ydieresis aogonek -140 KPX Ydieresis aring -140 KPX Ydieresis atilde -70 KPX Ydieresis colon -60 KPX Ydieresis comma -140 KPX Ydieresis e -140 KPX Ydieresis eacute -140 KPX Ydieresis ecaron -140 KPX Ydieresis ecircumflex -140 KPX Ydieresis edieresis -140 KPX Ydieresis edotaccent -140 KPX Ydieresis egrave -140 KPX Ydieresis emacron -70 KPX Ydieresis eogonek -140 KPX Ydieresis hyphen -140 KPX Ydieresis i -20 KPX Ydieresis iacute -20 KPX Ydieresis iogonek -20 KPX Ydieresis o -140 KPX Ydieresis oacute -140 KPX Ydieresis ocircumflex -140 KPX Ydieresis odieresis -140 KPX Ydieresis ograve -140 KPX Ydieresis ohungarumlaut -140 KPX Ydieresis omacron -140 KPX Ydieresis oslash -140 KPX Ydieresis otilde -140 KPX Ydieresis period -140 KPX Ydieresis semicolon -60 KPX Ydieresis u -110 KPX Ydieresis uacute -110 KPX Ydieresis ucircumflex -110 KPX Ydieresis udieresis -110 KPX Ydieresis ugrave -110 KPX Ydieresis uhungarumlaut -110 KPX Ydieresis umacron -110 KPX Ydieresis uogonek -110 KPX Ydieresis uring -110 KPX a v -20 KPX a w -20 KPX a y -30 KPX a yacute -30 KPX a ydieresis -30 KPX aacute v -20 KPX aacute w -20 KPX aacute y -30 KPX aacute yacute -30 KPX aacute ydieresis -30 KPX abreve v -20 KPX abreve w -20 KPX abreve y -30 KPX abreve yacute -30 KPX abreve ydieresis -30 KPX acircumflex v -20 KPX acircumflex w -20 KPX acircumflex y -30 KPX acircumflex yacute -30 KPX acircumflex ydieresis -30 KPX adieresis v -20 KPX adieresis w -20 KPX adieresis y -30 KPX adieresis yacute -30 KPX adieresis ydieresis -30 KPX agrave v -20 KPX agrave w -20 KPX agrave y -30 KPX agrave yacute -30 KPX agrave ydieresis -30 KPX amacron v -20 KPX amacron w -20 KPX amacron y -30 KPX amacron yacute -30 KPX amacron ydieresis -30 KPX aogonek v -20 KPX aogonek w -20 KPX aogonek y -30 KPX aogonek yacute -30 KPX aogonek ydieresis -30 KPX aring v -20 KPX aring w -20 KPX aring y -30 KPX aring yacute -30 KPX aring ydieresis -30 KPX atilde v -20 KPX atilde w -20 KPX atilde y -30 KPX atilde yacute -30 KPX atilde ydieresis -30 KPX b b -10 KPX b comma -40 KPX b l -20 KPX b lacute -20 KPX b lcommaaccent -20 KPX b lslash -20 KPX b period -40 KPX b u -20 KPX b uacute -20 KPX b ucircumflex -20 KPX b udieresis -20 KPX b ugrave -20 KPX b uhungarumlaut -20 KPX b umacron -20 KPX b uogonek -20 KPX b uring -20 KPX b v -20 KPX b y -20 KPX b yacute -20 KPX b ydieresis -20 KPX c comma -15 KPX c k -20 KPX c kcommaaccent -20 KPX cacute comma -15 KPX cacute k -20 KPX cacute kcommaaccent -20 KPX ccaron comma -15 KPX ccaron k -20 KPX ccaron kcommaaccent -20 KPX ccedilla comma -15 KPX ccedilla k -20 KPX ccedilla kcommaaccent -20 KPX colon space -50 KPX comma quotedblright -100 KPX comma quoteright -100 KPX e comma -15 KPX e period -15 KPX e v -30 KPX e w -20 KPX e x -30 KPX e y -20 KPX e yacute -20 KPX e ydieresis -20 KPX eacute comma -15 KPX eacute period -15 KPX eacute v -30 KPX eacute w -20 KPX eacute x -30 KPX eacute y -20 KPX eacute yacute -20 KPX eacute ydieresis -20 KPX ecaron comma -15 KPX ecaron period -15 KPX ecaron v -30 KPX ecaron w -20 KPX ecaron x -30 KPX ecaron y -20 KPX ecaron yacute -20 KPX ecaron ydieresis -20 KPX ecircumflex comma -15 KPX ecircumflex period -15 KPX ecircumflex v -30 KPX ecircumflex w -20 KPX ecircumflex x -30 KPX ecircumflex y -20 KPX ecircumflex yacute -20 KPX ecircumflex ydieresis -20 KPX edieresis comma -15 KPX edieresis period -15 KPX edieresis v -30 KPX edieresis w -20 KPX edieresis x -30 KPX edieresis y -20 KPX edieresis yacute -20 KPX edieresis ydieresis -20 KPX edotaccent comma -15 KPX edotaccent period -15 KPX edotaccent v -30 KPX edotaccent w -20 KPX edotaccent x -30 KPX edotaccent y -20 KPX edotaccent yacute -20 KPX edotaccent ydieresis -20 KPX egrave comma -15 KPX egrave period -15 KPX egrave v -30 KPX egrave w -20 KPX egrave x -30 KPX egrave y -20 KPX egrave yacute -20 KPX egrave ydieresis -20 KPX emacron comma -15 KPX emacron period -15 KPX emacron v -30 KPX emacron w -20 KPX emacron x -30 KPX emacron y -20 KPX emacron yacute -20 KPX emacron ydieresis -20 KPX eogonek comma -15 KPX eogonek period -15 KPX eogonek v -30 KPX eogonek w -20 KPX eogonek x -30 KPX eogonek y -20 KPX eogonek yacute -20 KPX eogonek ydieresis -20 KPX f a -30 KPX f aacute -30 KPX f abreve -30 KPX f acircumflex -30 KPX f adieresis -30 KPX f agrave -30 KPX f amacron -30 KPX f aogonek -30 KPX f aring -30 KPX f atilde -30 KPX f comma -30 KPX f dotlessi -28 KPX f e -30 KPX f eacute -30 KPX f ecaron -30 KPX f ecircumflex -30 KPX f edieresis -30 KPX f edotaccent -30 KPX f egrave -30 KPX f emacron -30 KPX f eogonek -30 KPX f o -30 KPX f oacute -30 KPX f ocircumflex -30 KPX f odieresis -30 KPX f ograve -30 KPX f ohungarumlaut -30 KPX f omacron -30 KPX f oslash -30 KPX f otilde -30 KPX f period -30 KPX f quotedblright 60 KPX f quoteright 50 KPX g r -10 KPX g racute -10 KPX g rcaron -10 KPX g rcommaaccent -10 KPX gbreve r -10 KPX gbreve racute -10 KPX gbreve rcaron -10 KPX gbreve rcommaaccent -10 KPX gcommaaccent r -10 KPX gcommaaccent racute -10 KPX gcommaaccent rcaron -10 KPX gcommaaccent rcommaaccent -10 KPX h y -30 KPX h yacute -30 KPX h ydieresis -30 KPX k e -20 KPX k eacute -20 KPX k ecaron -20 KPX k ecircumflex -20 KPX k edieresis -20 KPX k edotaccent -20 KPX k egrave -20 KPX k emacron -20 KPX k eogonek -20 KPX k o -20 KPX k oacute -20 KPX k ocircumflex -20 KPX k odieresis -20 KPX k ograve -20 KPX k ohungarumlaut -20 KPX k omacron -20 KPX k oslash -20 KPX k otilde -20 KPX kcommaaccent e -20 KPX kcommaaccent eacute -20 KPX kcommaaccent ecaron -20 KPX kcommaaccent ecircumflex -20 KPX kcommaaccent edieresis -20 KPX kcommaaccent edotaccent -20 KPX kcommaaccent egrave -20 KPX kcommaaccent emacron -20 KPX kcommaaccent eogonek -20 KPX kcommaaccent o -20 KPX kcommaaccent oacute -20 KPX kcommaaccent ocircumflex -20 KPX kcommaaccent odieresis -20 KPX kcommaaccent ograve -20 KPX kcommaaccent ohungarumlaut -20 KPX kcommaaccent omacron -20 KPX kcommaaccent oslash -20 KPX kcommaaccent otilde -20 KPX m u -10 KPX m uacute -10 KPX m ucircumflex -10 KPX m udieresis -10 KPX m ugrave -10 KPX m uhungarumlaut -10 KPX m umacron -10 KPX m uogonek -10 KPX m uring -10 KPX m y -15 KPX m yacute -15 KPX m ydieresis -15 KPX n u -10 KPX n uacute -10 KPX n ucircumflex -10 KPX n udieresis -10 KPX n ugrave -10 KPX n uhungarumlaut -10 KPX n umacron -10 KPX n uogonek -10 KPX n uring -10 KPX n v -20 KPX n y -15 KPX n yacute -15 KPX n ydieresis -15 KPX nacute u -10 KPX nacute uacute -10 KPX nacute ucircumflex -10 KPX nacute udieresis -10 KPX nacute ugrave -10 KPX nacute uhungarumlaut -10 KPX nacute umacron -10 KPX nacute uogonek -10 KPX nacute uring -10 KPX nacute v -20 KPX nacute y -15 KPX nacute yacute -15 KPX nacute ydieresis -15 KPX ncaron u -10 KPX ncaron uacute -10 KPX ncaron ucircumflex -10 KPX ncaron udieresis -10 KPX ncaron ugrave -10 KPX ncaron uhungarumlaut -10 KPX ncaron umacron -10 KPX ncaron uogonek -10 KPX ncaron uring -10 KPX ncaron v -20 KPX ncaron y -15 KPX ncaron yacute -15 KPX ncaron ydieresis -15 KPX ncommaaccent u -10 KPX ncommaaccent uacute -10 KPX ncommaaccent ucircumflex -10 KPX ncommaaccent udieresis -10 KPX ncommaaccent ugrave -10 KPX ncommaaccent uhungarumlaut -10 KPX ncommaaccent umacron -10 KPX ncommaaccent uogonek -10 KPX ncommaaccent uring -10 KPX ncommaaccent v -20 KPX ncommaaccent y -15 KPX ncommaaccent yacute -15 KPX ncommaaccent ydieresis -15 KPX ntilde u -10 KPX ntilde uacute -10 KPX ntilde ucircumflex -10 KPX ntilde udieresis -10 KPX ntilde ugrave -10 KPX ntilde uhungarumlaut -10 KPX ntilde umacron -10 KPX ntilde uogonek -10 KPX ntilde uring -10 KPX ntilde v -20 KPX ntilde y -15 KPX ntilde yacute -15 KPX ntilde ydieresis -15 KPX o comma -40 KPX o period -40 KPX o v -15 KPX o w -15 KPX o x -30 KPX o y -30 KPX o yacute -30 KPX o ydieresis -30 KPX oacute comma -40 KPX oacute period -40 KPX oacute v -15 KPX oacute w -15 KPX oacute x -30 KPX oacute y -30 KPX oacute yacute -30 KPX oacute ydieresis -30 KPX ocircumflex comma -40 KPX ocircumflex period -40 KPX ocircumflex v -15 KPX ocircumflex w -15 KPX ocircumflex x -30 KPX ocircumflex y -30 KPX ocircumflex yacute -30 KPX ocircumflex ydieresis -30 KPX odieresis comma -40 KPX odieresis period -40 KPX odieresis v -15 KPX odieresis w -15 KPX odieresis x -30 KPX odieresis y -30 KPX odieresis yacute -30 KPX odieresis ydieresis -30 KPX ograve comma -40 KPX ograve period -40 KPX ograve v -15 KPX ograve w -15 KPX ograve x -30 KPX ograve y -30 KPX ograve yacute -30 KPX ograve ydieresis -30 KPX ohungarumlaut comma -40 KPX ohungarumlaut period -40 KPX ohungarumlaut v -15 KPX ohungarumlaut w -15 KPX ohungarumlaut x -30 KPX ohungarumlaut y -30 KPX ohungarumlaut yacute -30 KPX ohungarumlaut ydieresis -30 KPX omacron comma -40 KPX omacron period -40 KPX omacron v -15 KPX omacron w -15 KPX omacron x -30 KPX omacron y -30 KPX omacron yacute -30 KPX omacron ydieresis -30 KPX oslash a -55 KPX oslash aacute -55 KPX oslash abreve -55 KPX oslash acircumflex -55 KPX oslash adieresis -55 KPX oslash agrave -55 KPX oslash amacron -55 KPX oslash aogonek -55 KPX oslash aring -55 KPX oslash atilde -55 KPX oslash b -55 KPX oslash c -55 KPX oslash cacute -55 KPX oslash ccaron -55 KPX oslash ccedilla -55 KPX oslash comma -95 KPX oslash d -55 KPX oslash dcroat -55 KPX oslash e -55 KPX oslash eacute -55 KPX oslash ecaron -55 KPX oslash ecircumflex -55 KPX oslash edieresis -55 KPX oslash edotaccent -55 KPX oslash egrave -55 KPX oslash emacron -55 KPX oslash eogonek -55 KPX oslash f -55 KPX oslash g -55 KPX oslash gbreve -55 KPX oslash gcommaaccent -55 KPX oslash h -55 KPX oslash i -55 KPX oslash iacute -55 KPX oslash icircumflex -55 KPX oslash idieresis -55 KPX oslash igrave -55 KPX oslash imacron -55 KPX oslash iogonek -55 KPX oslash j -55 KPX oslash k -55 KPX oslash kcommaaccent -55 KPX oslash l -55 KPX oslash lacute -55 KPX oslash lcommaaccent -55 KPX oslash lslash -55 KPX oslash m -55 KPX oslash n -55 KPX oslash nacute -55 KPX oslash ncaron -55 KPX oslash ncommaaccent -55 KPX oslash ntilde -55 KPX oslash o -55 KPX oslash oacute -55 KPX oslash ocircumflex -55 KPX oslash odieresis -55 KPX oslash ograve -55 KPX oslash ohungarumlaut -55 KPX oslash omacron -55 KPX oslash oslash -55 KPX oslash otilde -55 KPX oslash p -55 KPX oslash period -95 KPX oslash q -55 KPX oslash r -55 KPX oslash racute -55 KPX oslash rcaron -55 KPX oslash rcommaaccent -55 KPX oslash s -55 KPX oslash sacute -55 KPX oslash scaron -55 KPX oslash scedilla -55 KPX oslash scommaaccent -55 KPX oslash t -55 KPX oslash tcommaaccent -55 KPX oslash u -55 KPX oslash uacute -55 KPX oslash ucircumflex -55 KPX oslash udieresis -55 KPX oslash ugrave -55 KPX oslash uhungarumlaut -55 KPX oslash umacron -55 KPX oslash uogonek -55 KPX oslash uring -55 KPX oslash v -70 KPX oslash w -70 KPX oslash x -85 KPX oslash y -70 KPX oslash yacute -70 KPX oslash ydieresis -70 KPX oslash z -55 KPX oslash zacute -55 KPX oslash zcaron -55 KPX oslash zdotaccent -55 KPX otilde comma -40 KPX otilde period -40 KPX otilde v -15 KPX otilde w -15 KPX otilde x -30 KPX otilde y -30 KPX otilde yacute -30 KPX otilde ydieresis -30 KPX p comma -35 KPX p period -35 KPX p y -30 KPX p yacute -30 KPX p ydieresis -30 KPX period quotedblright -100 KPX period quoteright -100 KPX period space -60 KPX quotedblright space -40 KPX quoteleft quoteleft -57 KPX quoteright d -50 KPX quoteright dcroat -50 KPX quoteright quoteright -57 KPX quoteright r -50 KPX quoteright racute -50 KPX quoteright rcaron -50 KPX quoteright rcommaaccent -50 KPX quoteright s -50 KPX quoteright sacute -50 KPX quoteright scaron -50 KPX quoteright scedilla -50 KPX quoteright scommaaccent -50 KPX quoteright space -70 KPX r a -10 KPX r aacute -10 KPX r abreve -10 KPX r acircumflex -10 KPX r adieresis -10 KPX r agrave -10 KPX r amacron -10 KPX r aogonek -10 KPX r aring -10 KPX r atilde -10 KPX r colon 30 KPX r comma -50 KPX r i 15 KPX r iacute 15 KPX r icircumflex 15 KPX r idieresis 15 KPX r igrave 15 KPX r imacron 15 KPX r iogonek 15 KPX r k 15 KPX r kcommaaccent 15 KPX r l 15 KPX r lacute 15 KPX r lcommaaccent 15 KPX r lslash 15 KPX r m 25 KPX r n 25 KPX r nacute 25 KPX r ncaron 25 KPX r ncommaaccent 25 KPX r ntilde 25 KPX r p 30 KPX r period -50 KPX r semicolon 30 KPX r t 40 KPX r tcommaaccent 40 KPX r u 15 KPX r uacute 15 KPX r ucircumflex 15 KPX r udieresis 15 KPX r ugrave 15 KPX r uhungarumlaut 15 KPX r umacron 15 KPX r uogonek 15 KPX r uring 15 KPX r v 30 KPX r y 30 KPX r yacute 30 KPX r ydieresis 30 KPX racute a -10 KPX racute aacute -10 KPX racute abreve -10 KPX racute acircumflex -10 KPX racute adieresis -10 KPX racute agrave -10 KPX racute amacron -10 KPX racute aogonek -10 KPX racute aring -10 KPX racute atilde -10 KPX racute colon 30 KPX racute comma -50 KPX racute i 15 KPX racute iacute 15 KPX racute icircumflex 15 KPX racute idieresis 15 KPX racute igrave 15 KPX racute imacron 15 KPX racute iogonek 15 KPX racute k 15 KPX racute kcommaaccent 15 KPX racute l 15 KPX racute lacute 15 KPX racute lcommaaccent 15 KPX racute lslash 15 KPX racute m 25 KPX racute n 25 KPX racute nacute 25 KPX racute ncaron 25 KPX racute ncommaaccent 25 KPX racute ntilde 25 KPX racute p 30 KPX racute period -50 KPX racute semicolon 30 KPX racute t 40 KPX racute tcommaaccent 40 KPX racute u 15 KPX racute uacute 15 KPX racute ucircumflex 15 KPX racute udieresis 15 KPX racute ugrave 15 KPX racute uhungarumlaut 15 KPX racute umacron 15 KPX racute uogonek 15 KPX racute uring 15 KPX racute v 30 KPX racute y 30 KPX racute yacute 30 KPX racute ydieresis 30 KPX rcaron a -10 KPX rcaron aacute -10 KPX rcaron abreve -10 KPX rcaron acircumflex -10 KPX rcaron adieresis -10 KPX rcaron agrave -10 KPX rcaron amacron -10 KPX rcaron aogonek -10 KPX rcaron aring -10 KPX rcaron atilde -10 KPX rcaron colon 30 KPX rcaron comma -50 KPX rcaron i 15 KPX rcaron iacute 15 KPX rcaron icircumflex 15 KPX rcaron idieresis 15 KPX rcaron igrave 15 KPX rcaron imacron 15 KPX rcaron iogonek 15 KPX rcaron k 15 KPX rcaron kcommaaccent 15 KPX rcaron l 15 KPX rcaron lacute 15 KPX rcaron lcommaaccent 15 KPX rcaron lslash 15 KPX rcaron m 25 KPX rcaron n 25 KPX rcaron nacute 25 KPX rcaron ncaron 25 KPX rcaron ncommaaccent 25 KPX rcaron ntilde 25 KPX rcaron p 30 KPX rcaron period -50 KPX rcaron semicolon 30 KPX rcaron t 40 KPX rcaron tcommaaccent 40 KPX rcaron u 15 KPX rcaron uacute 15 KPX rcaron ucircumflex 15 KPX rcaron udieresis 15 KPX rcaron ugrave 15 KPX rcaron uhungarumlaut 15 KPX rcaron umacron 15 KPX rcaron uogonek 15 KPX rcaron uring 15 KPX rcaron v 30 KPX rcaron y 30 KPX rcaron yacute 30 KPX rcaron ydieresis 30 KPX rcommaaccent a -10 KPX rcommaaccent aacute -10 KPX rcommaaccent abreve -10 KPX rcommaaccent acircumflex -10 KPX rcommaaccent adieresis -10 KPX rcommaaccent agrave -10 KPX rcommaaccent amacron -10 KPX rcommaaccent aogonek -10 KPX rcommaaccent aring -10 KPX rcommaaccent atilde -10 KPX rcommaaccent colon 30 KPX rcommaaccent comma -50 KPX rcommaaccent i 15 KPX rcommaaccent iacute 15 KPX rcommaaccent icircumflex 15 KPX rcommaaccent idieresis 15 KPX rcommaaccent igrave 15 KPX rcommaaccent imacron 15 KPX rcommaaccent iogonek 15 KPX rcommaaccent k 15 KPX rcommaaccent kcommaaccent 15 KPX rcommaaccent l 15 KPX rcommaaccent lacute 15 KPX rcommaaccent lcommaaccent 15 KPX rcommaaccent lslash 15 KPX rcommaaccent m 25 KPX rcommaaccent n 25 KPX rcommaaccent nacute 25 KPX rcommaaccent ncaron 25 KPX rcommaaccent ncommaaccent 25 KPX rcommaaccent ntilde 25 KPX rcommaaccent p 30 KPX rcommaaccent period -50 KPX rcommaaccent semicolon 30 KPX rcommaaccent t 40 KPX rcommaaccent tcommaaccent 40 KPX rcommaaccent u 15 KPX rcommaaccent uacute 15 KPX rcommaaccent ucircumflex 15 KPX rcommaaccent udieresis 15 KPX rcommaaccent ugrave 15 KPX rcommaaccent uhungarumlaut 15 KPX rcommaaccent umacron 15 KPX rcommaaccent uogonek 15 KPX rcommaaccent uring 15 KPX rcommaaccent v 30 KPX rcommaaccent y 30 KPX rcommaaccent yacute 30 KPX rcommaaccent ydieresis 30 KPX s comma -15 KPX s period -15 KPX s w -30 KPX sacute comma -15 KPX sacute period -15 KPX sacute w -30 KPX scaron comma -15 KPX scaron period -15 KPX scaron w -30 KPX scedilla comma -15 KPX scedilla period -15 KPX scedilla w -30 KPX scommaaccent comma -15 KPX scommaaccent period -15 KPX scommaaccent w -30 KPX semicolon space -50 KPX space T -50 KPX space Tcaron -50 KPX space Tcommaaccent -50 KPX space V -50 KPX space W -40 KPX space Y -90 KPX space Yacute -90 KPX space Ydieresis -90 KPX space quotedblleft -30 KPX space quoteleft -60 KPX v a -25 KPX v aacute -25 KPX v abreve -25 KPX v acircumflex -25 KPX v adieresis -25 KPX v agrave -25 KPX v amacron -25 KPX v aogonek -25 KPX v aring -25 KPX v atilde -25 KPX v comma -80 KPX v e -25 KPX v eacute -25 KPX v ecaron -25 KPX v ecircumflex -25 KPX v edieresis -25 KPX v edotaccent -25 KPX v egrave -25 KPX v emacron -25 KPX v eogonek -25 KPX v o -25 KPX v oacute -25 KPX v ocircumflex -25 KPX v odieresis -25 KPX v ograve -25 KPX v ohungarumlaut -25 KPX v omacron -25 KPX v oslash -25 KPX v otilde -25 KPX v period -80 KPX w a -15 KPX w aacute -15 KPX w abreve -15 KPX w acircumflex -15 KPX w adieresis -15 KPX w agrave -15 KPX w amacron -15 KPX w aogonek -15 KPX w aring -15 KPX w atilde -15 KPX w comma -60 KPX w e -10 KPX w eacute -10 KPX w ecaron -10 KPX w ecircumflex -10 KPX w edieresis -10 KPX w edotaccent -10 KPX w egrave -10 KPX w emacron -10 KPX w eogonek -10 KPX w o -10 KPX w oacute -10 KPX w ocircumflex -10 KPX w odieresis -10 KPX w ograve -10 KPX w ohungarumlaut -10 KPX w omacron -10 KPX w oslash -10 KPX w otilde -10 KPX w period -60 KPX x e -30 KPX x eacute -30 KPX x ecaron -30 KPX x ecircumflex -30 KPX x edieresis -30 KPX x edotaccent -30 KPX x egrave -30 KPX x emacron -30 KPX x eogonek -30 KPX y a -20 KPX y aacute -20 KPX y abreve -20 KPX y acircumflex -20 KPX y adieresis -20 KPX y agrave -20 KPX y amacron -20 KPX y aogonek -20 KPX y aring -20 KPX y atilde -20 KPX y comma -100 KPX y e -20 KPX y eacute -20 KPX y ecaron -20 KPX y ecircumflex -20 KPX y edieresis -20 KPX y edotaccent -20 KPX y egrave -20 KPX y emacron -20 KPX y eogonek -20 KPX y o -20 KPX y oacute -20 KPX y ocircumflex -20 KPX y odieresis -20 KPX y ograve -20 KPX y ohungarumlaut -20 KPX y omacron -20 KPX y oslash -20 KPX y otilde -20 KPX y period -100 KPX yacute a -20 KPX yacute aacute -20 KPX yacute abreve -20 KPX yacute acircumflex -20 KPX yacute adieresis -20 KPX yacute agrave -20 KPX yacute amacron -20 KPX yacute aogonek -20 KPX yacute aring -20 KPX yacute atilde -20 KPX yacute comma -100 KPX yacute e -20 KPX yacute eacute -20 KPX yacute ecaron -20 KPX yacute ecircumflex -20 KPX yacute edieresis -20 KPX yacute edotaccent -20 KPX yacute egrave -20 KPX yacute emacron -20 KPX yacute eogonek -20 KPX yacute o -20 KPX yacute oacute -20 KPX yacute ocircumflex -20 KPX yacute odieresis -20 KPX yacute ograve -20 KPX yacute ohungarumlaut -20 KPX yacute omacron -20 KPX yacute oslash -20 KPX yacute otilde -20 KPX yacute period -100 KPX ydieresis a -20 KPX ydieresis aacute -20 KPX ydieresis abreve -20 KPX ydieresis acircumflex -20 KPX ydieresis adieresis -20 KPX ydieresis agrave -20 KPX ydieresis amacron -20 KPX ydieresis aogonek -20 KPX ydieresis aring -20 KPX ydieresis atilde -20 KPX ydieresis comma -100 KPX ydieresis e -20 KPX ydieresis eacute -20 KPX ydieresis ecaron -20 KPX ydieresis ecircumflex -20 KPX ydieresis edieresis -20 KPX ydieresis edotaccent -20 KPX ydieresis egrave -20 KPX ydieresis emacron -20 KPX ydieresis eogonek -20 KPX ydieresis o -20 KPX ydieresis oacute -20 KPX ydieresis ocircumflex -20 KPX ydieresis odieresis -20 KPX ydieresis ograve -20 KPX ydieresis ohungarumlaut -20 KPX ydieresis omacron -20 KPX ydieresis oslash -20 KPX ydieresis otilde -20 KPX ydieresis period -100 KPX z e -15 KPX z eacute -15 KPX z ecaron -15 KPX z ecircumflex -15 KPX z edieresis -15 KPX z edotaccent -15 KPX z egrave -15 KPX z emacron -15 KPX z eogonek -15 KPX z o -15 KPX z oacute -15 KPX z ocircumflex -15 KPX z odieresis -15 KPX z ograve -15 KPX z ohungarumlaut -15 KPX z omacron -15 KPX z oslash -15 KPX z otilde -15 KPX zacute e -15 KPX zacute eacute -15 KPX zacute ecaron -15 KPX zacute ecircumflex -15 KPX zacute edieresis -15 KPX zacute edotaccent -15 KPX zacute egrave -15 KPX zacute emacron -15 KPX zacute eogonek -15 KPX zacute o -15 KPX zacute oacute -15 KPX zacute ocircumflex -15 KPX zacute odieresis -15 KPX zacute ograve -15 KPX zacute ohungarumlaut -15 KPX zacute omacron -15 KPX zacute oslash -15 KPX zacute otilde -15 KPX zcaron e -15 KPX zcaron eacute -15 KPX zcaron ecaron -15 KPX zcaron ecircumflex -15 KPX zcaron edieresis -15 KPX zcaron edotaccent -15 KPX zcaron egrave -15 KPX zcaron emacron -15 KPX zcaron eogonek -15 KPX zcaron o -15 KPX zcaron oacute -15 KPX zcaron ocircumflex -15 KPX zcaron odieresis -15 KPX zcaron ograve -15 KPX zcaron ohungarumlaut -15 KPX zcaron omacron -15 KPX zcaron oslash -15 KPX zcaron otilde -15 KPX zdotaccent e -15 KPX zdotaccent eacute -15 KPX zdotaccent ecaron -15 KPX zdotaccent ecircumflex -15 KPX zdotaccent edieresis -15 KPX zdotaccent edotaccent -15 KPX zdotaccent egrave -15 KPX zdotaccent emacron -15 KPX zdotaccent eogonek -15 KPX zdotaccent o -15 KPX zdotaccent oacute -15 KPX zdotaccent ocircumflex -15 KPX zdotaccent odieresis -15 KPX zdotaccent ograve -15 KPX zdotaccent ohungarumlaut -15 KPX zdotaccent omacron -15 KPX zdotaccent oslash -15 KPX zdotaccent otilde -15 EndKernPairs EndKernData EndFontMetrics ruby-prawn-2.1.0.orig/data/fonts/Helvetica-Bold.afm0000644000000000000000000020722512665203156020604 0ustar rootrootStartFontMetrics 4.1 Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved. Comment Creation Date: Thu May 1 12:43:52 1997 Comment UniqueID 43052 Comment VMusage 37169 48194 FontName Helvetica-Bold FullName Helvetica Bold FamilyName Helvetica Weight Bold ItalicAngle 0 IsFixedPitch false CharacterSet ExtendedRoman FontBBox -170 -228 1003 962 UnderlinePosition -100 UnderlineThickness 50 Version 002.000 Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. EncodingScheme AdobeStandardEncoding CapHeight 718 XHeight 532 Ascender 718 Descender -207 StdHW 118 StdVW 140 StartCharMetrics 315 C 32 ; WX 278 ; N space ; B 0 0 0 0 ; C 33 ; WX 333 ; N exclam ; B 90 0 244 718 ; C 34 ; WX 474 ; N quotedbl ; B 98 447 376 718 ; C 35 ; WX 556 ; N numbersign ; B 18 0 538 698 ; C 36 ; WX 556 ; N dollar ; B 30 -115 523 775 ; C 37 ; WX 889 ; N percent ; B 28 -19 861 710 ; C 38 ; WX 722 ; N ampersand ; B 54 -19 701 718 ; C 39 ; WX 278 ; N quoteright ; B 69 445 209 718 ; C 40 ; WX 333 ; N parenleft ; B 35 -208 314 734 ; C 41 ; WX 333 ; N parenright ; B 19 -208 298 734 ; C 42 ; WX 389 ; N asterisk ; B 27 387 362 718 ; C 43 ; WX 584 ; N plus ; B 40 0 544 506 ; C 44 ; WX 278 ; N comma ; B 64 -168 214 146 ; C 45 ; WX 333 ; N hyphen ; B 27 215 306 345 ; C 46 ; WX 278 ; N period ; B 64 0 214 146 ; C 47 ; WX 278 ; N slash ; B -33 -19 311 737 ; C 48 ; WX 556 ; N zero ; B 32 -19 524 710 ; C 49 ; WX 556 ; N one ; B 69 0 378 710 ; C 50 ; WX 556 ; N two ; B 26 0 511 710 ; C 51 ; WX 556 ; N three ; B 27 -19 516 710 ; C 52 ; WX 556 ; N four ; B 27 0 526 710 ; C 53 ; WX 556 ; N five ; B 27 -19 516 698 ; C 54 ; WX 556 ; N six ; B 31 -19 520 710 ; C 55 ; WX 556 ; N seven ; B 25 0 528 698 ; C 56 ; WX 556 ; N eight ; B 32 -19 524 710 ; C 57 ; WX 556 ; N nine ; B 30 -19 522 710 ; C 58 ; WX 333 ; N colon ; B 92 0 242 512 ; C 59 ; WX 333 ; N semicolon ; B 92 -168 242 512 ; C 60 ; WX 584 ; N less ; B 38 -8 546 514 ; C 61 ; WX 584 ; N equal ; B 40 87 544 419 ; C 62 ; WX 584 ; N greater ; B 38 -8 546 514 ; C 63 ; WX 611 ; N question ; B 60 0 556 727 ; C 64 ; WX 975 ; N at ; B 118 -19 856 737 ; C 65 ; WX 722 ; N A ; B 20 0 702 718 ; C 66 ; WX 722 ; N B ; B 76 0 669 718 ; C 67 ; WX 722 ; N C ; B 44 -19 684 737 ; C 68 ; WX 722 ; N D ; B 76 0 685 718 ; C 69 ; WX 667 ; N E ; B 76 0 621 718 ; C 70 ; WX 611 ; N F ; B 76 0 587 718 ; C 71 ; WX 778 ; N G ; B 44 -19 713 737 ; C 72 ; WX 722 ; N H ; B 71 0 651 718 ; C 73 ; WX 278 ; N I ; B 64 0 214 718 ; C 74 ; WX 556 ; N J ; B 22 -18 484 718 ; C 75 ; WX 722 ; N K ; B 87 0 722 718 ; C 76 ; WX 611 ; N L ; B 76 0 583 718 ; C 77 ; WX 833 ; N M ; B 69 0 765 718 ; C 78 ; WX 722 ; N N ; B 69 0 654 718 ; C 79 ; WX 778 ; N O ; B 44 -19 734 737 ; C 80 ; WX 667 ; N P ; B 76 0 627 718 ; C 81 ; WX 778 ; N Q ; B 44 -52 737 737 ; C 82 ; WX 722 ; N R ; B 76 0 677 718 ; C 83 ; WX 667 ; N S ; B 39 -19 629 737 ; C 84 ; WX 611 ; N T ; B 14 0 598 718 ; C 85 ; WX 722 ; N U ; B 72 -19 651 718 ; C 86 ; WX 667 ; N V ; B 19 0 648 718 ; C 87 ; WX 944 ; N W ; B 16 0 929 718 ; C 88 ; WX 667 ; N X ; B 14 0 653 718 ; C 89 ; WX 667 ; N Y ; B 15 0 653 718 ; C 90 ; WX 611 ; N Z ; B 25 0 586 718 ; C 91 ; WX 333 ; N bracketleft ; B 63 -196 309 722 ; C 92 ; WX 278 ; N backslash ; B -33 -19 311 737 ; C 93 ; WX 333 ; N bracketright ; B 24 -196 270 722 ; C 94 ; WX 584 ; N asciicircum ; B 62 323 522 698 ; C 95 ; WX 556 ; N underscore ; B 0 -125 556 -75 ; C 96 ; WX 278 ; N quoteleft ; B 69 454 209 727 ; C 97 ; WX 556 ; N a ; B 29 -14 527 546 ; C 98 ; WX 611 ; N b ; B 61 -14 578 718 ; C 99 ; WX 556 ; N c ; B 34 -14 524 546 ; C 100 ; WX 611 ; N d ; B 34 -14 551 718 ; C 101 ; WX 556 ; N e ; B 23 -14 528 546 ; C 102 ; WX 333 ; N f ; B 10 0 318 727 ; L i fi ; L l fl ; C 103 ; WX 611 ; N g ; B 40 -217 553 546 ; C 104 ; WX 611 ; N h ; B 65 0 546 718 ; C 105 ; WX 278 ; N i ; B 69 0 209 725 ; C 106 ; WX 278 ; N j ; B 3 -214 209 725 ; C 107 ; WX 556 ; N k ; B 69 0 562 718 ; C 108 ; WX 278 ; N l ; B 69 0 209 718 ; C 109 ; WX 889 ; N m ; B 64 0 826 546 ; C 110 ; WX 611 ; N n ; B 65 0 546 546 ; C 111 ; WX 611 ; N o ; B 34 -14 578 546 ; C 112 ; WX 611 ; N p ; B 62 -207 578 546 ; C 113 ; WX 611 ; N q ; B 34 -207 552 546 ; C 114 ; WX 389 ; N r ; B 64 0 373 546 ; C 115 ; WX 556 ; N s ; B 30 -14 519 546 ; C 116 ; WX 333 ; N t ; B 10 -6 309 676 ; C 117 ; WX 611 ; N u ; B 66 -14 545 532 ; C 118 ; WX 556 ; N v ; B 13 0 543 532 ; C 119 ; WX 778 ; N w ; B 10 0 769 532 ; C 120 ; WX 556 ; N x ; B 15 0 541 532 ; C 121 ; WX 556 ; N y ; B 10 -214 539 532 ; C 122 ; WX 500 ; N z ; B 20 0 480 532 ; C 123 ; WX 389 ; N braceleft ; B 48 -196 365 722 ; C 124 ; WX 280 ; N bar ; B 84 -225 196 775 ; C 125 ; WX 389 ; N braceright ; B 24 -196 341 722 ; C 126 ; WX 584 ; N asciitilde ; B 61 163 523 343 ; C 161 ; WX 333 ; N exclamdown ; B 90 -186 244 532 ; C 162 ; WX 556 ; N cent ; B 34 -118 524 628 ; C 163 ; WX 556 ; N sterling ; B 28 -16 541 718 ; C 164 ; WX 167 ; N fraction ; B -170 -19 336 710 ; C 165 ; WX 556 ; N yen ; B -9 0 565 698 ; C 166 ; WX 556 ; N florin ; B -10 -210 516 737 ; C 167 ; WX 556 ; N section ; B 34 -184 522 727 ; C 168 ; WX 556 ; N currency ; B -3 76 559 636 ; C 169 ; WX 238 ; N quotesingle ; B 70 447 168 718 ; C 170 ; WX 500 ; N quotedblleft ; B 64 454 436 727 ; C 171 ; WX 556 ; N guillemotleft ; B 88 76 468 484 ; C 172 ; WX 333 ; N guilsinglleft ; B 83 76 250 484 ; C 173 ; WX 333 ; N guilsinglright ; B 83 76 250 484 ; C 174 ; WX 611 ; N fi ; B 10 0 542 727 ; C 175 ; WX 611 ; N fl ; B 10 0 542 727 ; C 177 ; WX 556 ; N endash ; B 0 227 556 333 ; C 178 ; WX 556 ; N dagger ; B 36 -171 520 718 ; C 179 ; WX 556 ; N daggerdbl ; B 36 -171 520 718 ; C 180 ; WX 278 ; N periodcentered ; B 58 172 220 334 ; C 182 ; WX 556 ; N paragraph ; B -8 -191 539 700 ; C 183 ; WX 350 ; N bullet ; B 10 194 340 524 ; C 184 ; WX 278 ; N quotesinglbase ; B 69 -146 209 127 ; C 185 ; WX 500 ; N quotedblbase ; B 64 -146 436 127 ; C 186 ; WX 500 ; N quotedblright ; B 64 445 436 718 ; C 187 ; WX 556 ; N guillemotright ; B 88 76 468 484 ; C 188 ; WX 1000 ; N ellipsis ; B 92 0 908 146 ; C 189 ; WX 1000 ; N perthousand ; B -3 -19 1003 710 ; C 191 ; WX 611 ; N questiondown ; B 55 -195 551 532 ; C 193 ; WX 333 ; N grave ; B -23 604 225 750 ; C 194 ; WX 333 ; N acute ; B 108 604 356 750 ; C 195 ; WX 333 ; N circumflex ; B -10 604 343 750 ; C 196 ; WX 333 ; N tilde ; B -17 610 350 737 ; C 197 ; WX 333 ; N macron ; B -6 604 339 678 ; C 198 ; WX 333 ; N breve ; B -2 604 335 750 ; C 199 ; WX 333 ; N dotaccent ; B 104 614 230 729 ; C 200 ; WX 333 ; N dieresis ; B 6 614 327 729 ; C 202 ; WX 333 ; N ring ; B 59 568 275 776 ; C 203 ; WX 333 ; N cedilla ; B 6 -228 245 0 ; C 205 ; WX 333 ; N hungarumlaut ; B 9 604 486 750 ; C 206 ; WX 333 ; N ogonek ; B 71 -228 304 0 ; C 207 ; WX 333 ; N caron ; B -10 604 343 750 ; C 208 ; WX 1000 ; N emdash ; B 0 227 1000 333 ; C 225 ; WX 1000 ; N AE ; B 5 0 954 718 ; C 227 ; WX 370 ; N ordfeminine ; B 22 401 347 737 ; C 232 ; WX 611 ; N Lslash ; B -20 0 583 718 ; C 233 ; WX 778 ; N Oslash ; B 33 -27 744 745 ; C 234 ; WX 1000 ; N OE ; B 37 -19 961 737 ; C 235 ; WX 365 ; N ordmasculine ; B 6 401 360 737 ; C 241 ; WX 889 ; N ae ; B 29 -14 858 546 ; C 245 ; WX 278 ; N dotlessi ; B 69 0 209 532 ; C 248 ; WX 278 ; N lslash ; B -18 0 296 718 ; C 249 ; WX 611 ; N oslash ; B 22 -29 589 560 ; C 250 ; WX 944 ; N oe ; B 34 -14 912 546 ; C 251 ; WX 611 ; N germandbls ; B 69 -14 579 731 ; C -1 ; WX 278 ; N Idieresis ; B -21 0 300 915 ; C -1 ; WX 556 ; N eacute ; B 23 -14 528 750 ; C -1 ; WX 556 ; N abreve ; B 29 -14 527 750 ; C -1 ; WX 611 ; N uhungarumlaut ; B 66 -14 625 750 ; C -1 ; WX 556 ; N ecaron ; B 23 -14 528 750 ; C -1 ; WX 667 ; N Ydieresis ; B 15 0 653 915 ; C -1 ; WX 584 ; N divide ; B 40 -42 544 548 ; C -1 ; WX 667 ; N Yacute ; B 15 0 653 936 ; C -1 ; WX 722 ; N Acircumflex ; B 20 0 702 936 ; C -1 ; WX 556 ; N aacute ; B 29 -14 527 750 ; C -1 ; WX 722 ; N Ucircumflex ; B 72 -19 651 936 ; C -1 ; WX 556 ; N yacute ; B 10 -214 539 750 ; C -1 ; WX 556 ; N scommaaccent ; B 30 -228 519 546 ; C -1 ; WX 556 ; N ecircumflex ; B 23 -14 528 750 ; C -1 ; WX 722 ; N Uring ; B 72 -19 651 962 ; C -1 ; WX 722 ; N Udieresis ; B 72 -19 651 915 ; C -1 ; WX 556 ; N aogonek ; B 29 -224 545 546 ; C -1 ; WX 722 ; N Uacute ; B 72 -19 651 936 ; C -1 ; WX 611 ; N uogonek ; B 66 -228 545 532 ; C -1 ; WX 667 ; N Edieresis ; B 76 0 621 915 ; C -1 ; WX 722 ; N Dcroat ; B -5 0 685 718 ; C -1 ; WX 250 ; N commaaccent ; B 64 -228 199 -50 ; C -1 ; WX 737 ; N copyright ; B -11 -19 749 737 ; C -1 ; WX 667 ; N Emacron ; B 76 0 621 864 ; C -1 ; WX 556 ; N ccaron ; B 34 -14 524 750 ; C -1 ; WX 556 ; N aring ; B 29 -14 527 776 ; C -1 ; WX 722 ; N Ncommaaccent ; B 69 -228 654 718 ; C -1 ; WX 278 ; N lacute ; B 69 0 329 936 ; C -1 ; WX 556 ; N agrave ; B 29 -14 527 750 ; C -1 ; WX 611 ; N Tcommaaccent ; B 14 -228 598 718 ; C -1 ; WX 722 ; N Cacute ; B 44 -19 684 936 ; C -1 ; WX 556 ; N atilde ; B 29 -14 527 737 ; C -1 ; WX 667 ; N Edotaccent ; B 76 0 621 915 ; C -1 ; WX 556 ; N scaron ; B 30 -14 519 750 ; C -1 ; WX 556 ; N scedilla ; B 30 -228 519 546 ; C -1 ; WX 278 ; N iacute ; B 69 0 329 750 ; C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ; C -1 ; WX 722 ; N Rcaron ; B 76 0 677 936 ; C -1 ; WX 778 ; N Gcommaaccent ; B 44 -228 713 737 ; C -1 ; WX 611 ; N ucircumflex ; B 66 -14 545 750 ; C -1 ; WX 556 ; N acircumflex ; B 29 -14 527 750 ; C -1 ; WX 722 ; N Amacron ; B 20 0 702 864 ; C -1 ; WX 389 ; N rcaron ; B 18 0 373 750 ; C -1 ; WX 556 ; N ccedilla ; B 34 -228 524 546 ; C -1 ; WX 611 ; N Zdotaccent ; B 25 0 586 915 ; C -1 ; WX 667 ; N Thorn ; B 76 0 627 718 ; C -1 ; WX 778 ; N Omacron ; B 44 -19 734 864 ; C -1 ; WX 722 ; N Racute ; B 76 0 677 936 ; C -1 ; WX 667 ; N Sacute ; B 39 -19 629 936 ; C -1 ; WX 743 ; N dcaron ; B 34 -14 750 718 ; C -1 ; WX 722 ; N Umacron ; B 72 -19 651 864 ; C -1 ; WX 611 ; N uring ; B 66 -14 545 776 ; C -1 ; WX 333 ; N threesuperior ; B 8 271 326 710 ; C -1 ; WX 778 ; N Ograve ; B 44 -19 734 936 ; C -1 ; WX 722 ; N Agrave ; B 20 0 702 936 ; C -1 ; WX 722 ; N Abreve ; B 20 0 702 936 ; C -1 ; WX 584 ; N multiply ; B 40 1 545 505 ; C -1 ; WX 611 ; N uacute ; B 66 -14 545 750 ; C -1 ; WX 611 ; N Tcaron ; B 14 0 598 936 ; C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ; C -1 ; WX 556 ; N ydieresis ; B 10 -214 539 729 ; C -1 ; WX 722 ; N Nacute ; B 69 0 654 936 ; C -1 ; WX 278 ; N icircumflex ; B -37 0 316 750 ; C -1 ; WX 667 ; N Ecircumflex ; B 76 0 621 936 ; C -1 ; WX 556 ; N adieresis ; B 29 -14 527 729 ; C -1 ; WX 556 ; N edieresis ; B 23 -14 528 729 ; C -1 ; WX 556 ; N cacute ; B 34 -14 524 750 ; C -1 ; WX 611 ; N nacute ; B 65 0 546 750 ; C -1 ; WX 611 ; N umacron ; B 66 -14 545 678 ; C -1 ; WX 722 ; N Ncaron ; B 69 0 654 936 ; C -1 ; WX 278 ; N Iacute ; B 64 0 329 936 ; C -1 ; WX 584 ; N plusminus ; B 40 0 544 506 ; C -1 ; WX 280 ; N brokenbar ; B 84 -150 196 700 ; C -1 ; WX 737 ; N registered ; B -11 -19 748 737 ; C -1 ; WX 778 ; N Gbreve ; B 44 -19 713 936 ; C -1 ; WX 278 ; N Idotaccent ; B 64 0 214 915 ; C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ; C -1 ; WX 667 ; N Egrave ; B 76 0 621 936 ; C -1 ; WX 389 ; N racute ; B 64 0 384 750 ; C -1 ; WX 611 ; N omacron ; B 34 -14 578 678 ; C -1 ; WX 611 ; N Zacute ; B 25 0 586 936 ; C -1 ; WX 611 ; N Zcaron ; B 25 0 586 936 ; C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ; C -1 ; WX 722 ; N Eth ; B -5 0 685 718 ; C -1 ; WX 722 ; N Ccedilla ; B 44 -228 684 737 ; C -1 ; WX 278 ; N lcommaaccent ; B 69 -228 213 718 ; C -1 ; WX 389 ; N tcaron ; B 10 -6 421 878 ; C -1 ; WX 556 ; N eogonek ; B 23 -228 528 546 ; C -1 ; WX 722 ; N Uogonek ; B 72 -228 651 718 ; C -1 ; WX 722 ; N Aacute ; B 20 0 702 936 ; C -1 ; WX 722 ; N Adieresis ; B 20 0 702 915 ; C -1 ; WX 556 ; N egrave ; B 23 -14 528 750 ; C -1 ; WX 500 ; N zacute ; B 20 0 480 750 ; C -1 ; WX 278 ; N iogonek ; B 16 -224 249 725 ; C -1 ; WX 778 ; N Oacute ; B 44 -19 734 936 ; C -1 ; WX 611 ; N oacute ; B 34 -14 578 750 ; C -1 ; WX 556 ; N amacron ; B 29 -14 527 678 ; C -1 ; WX 556 ; N sacute ; B 30 -14 519 750 ; C -1 ; WX 278 ; N idieresis ; B -21 0 300 729 ; C -1 ; WX 778 ; N Ocircumflex ; B 44 -19 734 936 ; C -1 ; WX 722 ; N Ugrave ; B 72 -19 651 936 ; C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; C -1 ; WX 611 ; N thorn ; B 62 -208 578 718 ; C -1 ; WX 333 ; N twosuperior ; B 9 283 324 710 ; C -1 ; WX 778 ; N Odieresis ; B 44 -19 734 915 ; C -1 ; WX 611 ; N mu ; B 66 -207 545 532 ; C -1 ; WX 278 ; N igrave ; B -50 0 209 750 ; C -1 ; WX 611 ; N ohungarumlaut ; B 34 -14 625 750 ; C -1 ; WX 667 ; N Eogonek ; B 76 -224 639 718 ; C -1 ; WX 611 ; N dcroat ; B 34 -14 650 718 ; C -1 ; WX 834 ; N threequarters ; B 16 -19 799 710 ; C -1 ; WX 667 ; N Scedilla ; B 39 -228 629 737 ; C -1 ; WX 400 ; N lcaron ; B 69 0 408 718 ; C -1 ; WX 722 ; N Kcommaaccent ; B 87 -228 722 718 ; C -1 ; WX 611 ; N Lacute ; B 76 0 583 936 ; C -1 ; WX 1000 ; N trademark ; B 44 306 956 718 ; C -1 ; WX 556 ; N edotaccent ; B 23 -14 528 729 ; C -1 ; WX 278 ; N Igrave ; B -50 0 214 936 ; C -1 ; WX 278 ; N Imacron ; B -33 0 312 864 ; C -1 ; WX 611 ; N Lcaron ; B 76 0 583 718 ; C -1 ; WX 834 ; N onehalf ; B 26 -19 794 710 ; C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ; C -1 ; WX 611 ; N ocircumflex ; B 34 -14 578 750 ; C -1 ; WX 611 ; N ntilde ; B 65 0 546 737 ; C -1 ; WX 722 ; N Uhungarumlaut ; B 72 -19 681 936 ; C -1 ; WX 667 ; N Eacute ; B 76 0 621 936 ; C -1 ; WX 556 ; N emacron ; B 23 -14 528 678 ; C -1 ; WX 611 ; N gbreve ; B 40 -217 553 750 ; C -1 ; WX 834 ; N onequarter ; B 26 -19 766 710 ; C -1 ; WX 667 ; N Scaron ; B 39 -19 629 936 ; C -1 ; WX 667 ; N Scommaaccent ; B 39 -228 629 737 ; C -1 ; WX 778 ; N Ohungarumlaut ; B 44 -19 734 936 ; C -1 ; WX 400 ; N degree ; B 57 426 343 712 ; C -1 ; WX 611 ; N ograve ; B 34 -14 578 750 ; C -1 ; WX 722 ; N Ccaron ; B 44 -19 684 936 ; C -1 ; WX 611 ; N ugrave ; B 66 -14 545 750 ; C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ; C -1 ; WX 722 ; N Dcaron ; B 76 0 685 936 ; C -1 ; WX 389 ; N rcommaaccent ; B 64 -228 373 546 ; C -1 ; WX 722 ; N Ntilde ; B 69 0 654 923 ; C -1 ; WX 611 ; N otilde ; B 34 -14 578 737 ; C -1 ; WX 722 ; N Rcommaaccent ; B 76 -228 677 718 ; C -1 ; WX 611 ; N Lcommaaccent ; B 76 -228 583 718 ; C -1 ; WX 722 ; N Atilde ; B 20 0 702 923 ; C -1 ; WX 722 ; N Aogonek ; B 20 -224 742 718 ; C -1 ; WX 722 ; N Aring ; B 20 0 702 962 ; C -1 ; WX 778 ; N Otilde ; B 44 -19 734 923 ; C -1 ; WX 500 ; N zdotaccent ; B 20 0 480 729 ; C -1 ; WX 667 ; N Ecaron ; B 76 0 621 936 ; C -1 ; WX 278 ; N Iogonek ; B -11 -228 222 718 ; C -1 ; WX 556 ; N kcommaaccent ; B 69 -228 562 718 ; C -1 ; WX 584 ; N minus ; B 40 197 544 309 ; C -1 ; WX 278 ; N Icircumflex ; B -37 0 316 936 ; C -1 ; WX 611 ; N ncaron ; B 65 0 546 750 ; C -1 ; WX 333 ; N tcommaaccent ; B 10 -228 309 676 ; C -1 ; WX 584 ; N logicalnot ; B 40 108 544 419 ; C -1 ; WX 611 ; N odieresis ; B 34 -14 578 729 ; C -1 ; WX 611 ; N udieresis ; B 66 -14 545 729 ; C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ; C -1 ; WX 611 ; N gcommaaccent ; B 40 -217 553 850 ; C -1 ; WX 611 ; N eth ; B 34 -14 578 737 ; C -1 ; WX 500 ; N zcaron ; B 20 0 480 750 ; C -1 ; WX 611 ; N ncommaaccent ; B 65 -228 546 546 ; C -1 ; WX 333 ; N onesuperior ; B 26 283 237 710 ; C -1 ; WX 278 ; N imacron ; B -8 0 285 678 ; C -1 ; WX 556 ; N Euro ; B 0 0 0 0 ; EndCharMetrics StartKernData StartKernPairs 2481 KPX A C -40 KPX A Cacute -40 KPX A Ccaron -40 KPX A Ccedilla -40 KPX A G -50 KPX A Gbreve -50 KPX A Gcommaaccent -50 KPX A O -40 KPX A Oacute -40 KPX A Ocircumflex -40 KPX A Odieresis -40 KPX A Ograve -40 KPX A Ohungarumlaut -40 KPX A Omacron -40 KPX A Oslash -40 KPX A Otilde -40 KPX A Q -40 KPX A T -90 KPX A Tcaron -90 KPX A Tcommaaccent -90 KPX A U -50 KPX A Uacute -50 KPX A Ucircumflex -50 KPX A Udieresis -50 KPX A Ugrave -50 KPX A Uhungarumlaut -50 KPX A Umacron -50 KPX A Uogonek -50 KPX A Uring -50 KPX A V -80 KPX A W -60 KPX A Y -110 KPX A Yacute -110 KPX A Ydieresis -110 KPX A u -30 KPX A uacute -30 KPX A ucircumflex -30 KPX A udieresis -30 KPX A ugrave -30 KPX A uhungarumlaut -30 KPX A umacron -30 KPX A uogonek -30 KPX A uring -30 KPX A v -40 KPX A w -30 KPX A y -30 KPX A yacute -30 KPX A ydieresis -30 KPX Aacute C -40 KPX Aacute Cacute -40 KPX Aacute Ccaron -40 KPX Aacute Ccedilla -40 KPX Aacute G -50 KPX Aacute Gbreve -50 KPX Aacute Gcommaaccent -50 KPX Aacute O -40 KPX Aacute Oacute -40 KPX Aacute Ocircumflex -40 KPX Aacute Odieresis -40 KPX Aacute Ograve -40 KPX Aacute Ohungarumlaut -40 KPX Aacute Omacron -40 KPX Aacute Oslash -40 KPX Aacute Otilde -40 KPX Aacute Q -40 KPX Aacute T -90 KPX Aacute Tcaron -90 KPX Aacute Tcommaaccent -90 KPX Aacute U -50 KPX Aacute Uacute -50 KPX Aacute Ucircumflex -50 KPX Aacute Udieresis -50 KPX Aacute Ugrave -50 KPX Aacute Uhungarumlaut -50 KPX Aacute Umacron -50 KPX Aacute Uogonek -50 KPX Aacute Uring -50 KPX Aacute V -80 KPX Aacute W -60 KPX Aacute Y -110 KPX Aacute Yacute -110 KPX Aacute Ydieresis -110 KPX Aacute u -30 KPX Aacute uacute -30 KPX Aacute ucircumflex -30 KPX Aacute udieresis -30 KPX Aacute ugrave -30 KPX Aacute uhungarumlaut -30 KPX Aacute umacron -30 KPX Aacute uogonek -30 KPX Aacute uring -30 KPX Aacute v -40 KPX Aacute w -30 KPX Aacute y -30 KPX Aacute yacute -30 KPX Aacute ydieresis -30 KPX Abreve C -40 KPX Abreve Cacute -40 KPX Abreve Ccaron -40 KPX Abreve Ccedilla -40 KPX Abreve G -50 KPX Abreve Gbreve -50 KPX Abreve Gcommaaccent -50 KPX Abreve O -40 KPX Abreve Oacute -40 KPX Abreve Ocircumflex -40 KPX Abreve Odieresis -40 KPX Abreve Ograve -40 KPX Abreve Ohungarumlaut -40 KPX Abreve Omacron -40 KPX Abreve Oslash -40 KPX Abreve Otilde -40 KPX Abreve Q -40 KPX Abreve T -90 KPX Abreve Tcaron -90 KPX Abreve Tcommaaccent -90 KPX Abreve U -50 KPX Abreve Uacute -50 KPX Abreve Ucircumflex -50 KPX Abreve Udieresis -50 KPX Abreve Ugrave -50 KPX Abreve Uhungarumlaut -50 KPX Abreve Umacron -50 KPX Abreve Uogonek -50 KPX Abreve Uring -50 KPX Abreve V -80 KPX Abreve W -60 KPX Abreve Y -110 KPX Abreve Yacute -110 KPX Abreve Ydieresis -110 KPX Abreve u -30 KPX Abreve uacute -30 KPX Abreve ucircumflex -30 KPX Abreve udieresis -30 KPX Abreve ugrave -30 KPX Abreve uhungarumlaut -30 KPX Abreve umacron -30 KPX Abreve uogonek -30 KPX Abreve uring -30 KPX Abreve v -40 KPX Abreve w -30 KPX Abreve y -30 KPX Abreve yacute -30 KPX Abreve ydieresis -30 KPX Acircumflex C -40 KPX Acircumflex Cacute -40 KPX Acircumflex Ccaron -40 KPX Acircumflex Ccedilla -40 KPX Acircumflex G -50 KPX Acircumflex Gbreve -50 KPX Acircumflex Gcommaaccent -50 KPX Acircumflex O -40 KPX Acircumflex Oacute -40 KPX Acircumflex Ocircumflex -40 KPX Acircumflex Odieresis -40 KPX Acircumflex Ograve -40 KPX Acircumflex Ohungarumlaut -40 KPX Acircumflex Omacron -40 KPX Acircumflex Oslash -40 KPX Acircumflex Otilde -40 KPX Acircumflex Q -40 KPX Acircumflex T -90 KPX Acircumflex Tcaron -90 KPX Acircumflex Tcommaaccent -90 KPX Acircumflex U -50 KPX Acircumflex Uacute -50 KPX Acircumflex Ucircumflex -50 KPX Acircumflex Udieresis -50 KPX Acircumflex Ugrave -50 KPX Acircumflex Uhungarumlaut -50 KPX Acircumflex Umacron -50 KPX Acircumflex Uogonek -50 KPX Acircumflex Uring -50 KPX Acircumflex V -80 KPX Acircumflex W -60 KPX Acircumflex Y -110 KPX Acircumflex Yacute -110 KPX Acircumflex Ydieresis -110 KPX Acircumflex u -30 KPX Acircumflex uacute -30 KPX Acircumflex ucircumflex -30 KPX Acircumflex udieresis -30 KPX Acircumflex ugrave -30 KPX Acircumflex uhungarumlaut -30 KPX Acircumflex umacron -30 KPX Acircumflex uogonek -30 KPX Acircumflex uring -30 KPX Acircumflex v -40 KPX Acircumflex w -30 KPX Acircumflex y -30 KPX Acircumflex yacute -30 KPX Acircumflex ydieresis -30 KPX Adieresis C -40 KPX Adieresis Cacute -40 KPX Adieresis Ccaron -40 KPX Adieresis Ccedilla -40 KPX Adieresis G -50 KPX Adieresis Gbreve -50 KPX Adieresis Gcommaaccent -50 KPX Adieresis O -40 KPX Adieresis Oacute -40 KPX Adieresis Ocircumflex -40 KPX Adieresis Odieresis -40 KPX Adieresis Ograve -40 KPX Adieresis Ohungarumlaut -40 KPX Adieresis Omacron -40 KPX Adieresis Oslash -40 KPX Adieresis Otilde -40 KPX Adieresis Q -40 KPX Adieresis T -90 KPX Adieresis Tcaron -90 KPX Adieresis Tcommaaccent -90 KPX Adieresis U -50 KPX Adieresis Uacute -50 KPX Adieresis Ucircumflex -50 KPX Adieresis Udieresis -50 KPX Adieresis Ugrave -50 KPX Adieresis Uhungarumlaut -50 KPX Adieresis Umacron -50 KPX Adieresis Uogonek -50 KPX Adieresis Uring -50 KPX Adieresis V -80 KPX Adieresis W -60 KPX Adieresis Y -110 KPX Adieresis Yacute -110 KPX Adieresis Ydieresis -110 KPX Adieresis u -30 KPX Adieresis uacute -30 KPX Adieresis ucircumflex -30 KPX Adieresis udieresis -30 KPX Adieresis ugrave -30 KPX Adieresis uhungarumlaut -30 KPX Adieresis umacron -30 KPX Adieresis uogonek -30 KPX Adieresis uring -30 KPX Adieresis v -40 KPX Adieresis w -30 KPX Adieresis y -30 KPX Adieresis yacute -30 KPX Adieresis ydieresis -30 KPX Agrave C -40 KPX Agrave Cacute -40 KPX Agrave Ccaron -40 KPX Agrave Ccedilla -40 KPX Agrave G -50 KPX Agrave Gbreve -50 KPX Agrave Gcommaaccent -50 KPX Agrave O -40 KPX Agrave Oacute -40 KPX Agrave Ocircumflex -40 KPX Agrave Odieresis -40 KPX Agrave Ograve -40 KPX Agrave Ohungarumlaut -40 KPX Agrave Omacron -40 KPX Agrave Oslash -40 KPX Agrave Otilde -40 KPX Agrave Q -40 KPX Agrave T -90 KPX Agrave Tcaron -90 KPX Agrave Tcommaaccent -90 KPX Agrave U -50 KPX Agrave Uacute -50 KPX Agrave Ucircumflex -50 KPX Agrave Udieresis -50 KPX Agrave Ugrave -50 KPX Agrave Uhungarumlaut -50 KPX Agrave Umacron -50 KPX Agrave Uogonek -50 KPX Agrave Uring -50 KPX Agrave V -80 KPX Agrave W -60 KPX Agrave Y -110 KPX Agrave Yacute -110 KPX Agrave Ydieresis -110 KPX Agrave u -30 KPX Agrave uacute -30 KPX Agrave ucircumflex -30 KPX Agrave udieresis -30 KPX Agrave ugrave -30 KPX Agrave uhungarumlaut -30 KPX Agrave umacron -30 KPX Agrave uogonek -30 KPX Agrave uring -30 KPX Agrave v -40 KPX Agrave w -30 KPX Agrave y -30 KPX Agrave yacute -30 KPX Agrave ydieresis -30 KPX Amacron C -40 KPX Amacron Cacute -40 KPX Amacron Ccaron -40 KPX Amacron Ccedilla -40 KPX Amacron G -50 KPX Amacron Gbreve -50 KPX Amacron Gcommaaccent -50 KPX Amacron O -40 KPX Amacron Oacute -40 KPX Amacron Ocircumflex -40 KPX Amacron Odieresis -40 KPX Amacron Ograve -40 KPX Amacron Ohungarumlaut -40 KPX Amacron Omacron -40 KPX Amacron Oslash -40 KPX Amacron Otilde -40 KPX Amacron Q -40 KPX Amacron T -90 KPX Amacron Tcaron -90 KPX Amacron Tcommaaccent -90 KPX Amacron U -50 KPX Amacron Uacute -50 KPX Amacron Ucircumflex -50 KPX Amacron Udieresis -50 KPX Amacron Ugrave -50 KPX Amacron Uhungarumlaut -50 KPX Amacron Umacron -50 KPX Amacron Uogonek -50 KPX Amacron Uring -50 KPX Amacron V -80 KPX Amacron W -60 KPX Amacron Y -110 KPX Amacron Yacute -110 KPX Amacron Ydieresis -110 KPX Amacron u -30 KPX Amacron uacute -30 KPX Amacron ucircumflex -30 KPX Amacron udieresis -30 KPX Amacron ugrave -30 KPX Amacron uhungarumlaut -30 KPX Amacron umacron -30 KPX Amacron uogonek -30 KPX Amacron uring -30 KPX Amacron v -40 KPX Amacron w -30 KPX Amacron y -30 KPX Amacron yacute -30 KPX Amacron ydieresis -30 KPX Aogonek C -40 KPX Aogonek Cacute -40 KPX Aogonek Ccaron -40 KPX Aogonek Ccedilla -40 KPX Aogonek G -50 KPX Aogonek Gbreve -50 KPX Aogonek Gcommaaccent -50 KPX Aogonek O -40 KPX Aogonek Oacute -40 KPX Aogonek Ocircumflex -40 KPX Aogonek Odieresis -40 KPX Aogonek Ograve -40 KPX Aogonek Ohungarumlaut -40 KPX Aogonek Omacron -40 KPX Aogonek Oslash -40 KPX Aogonek Otilde -40 KPX Aogonek Q -40 KPX Aogonek T -90 KPX Aogonek Tcaron -90 KPX Aogonek Tcommaaccent -90 KPX Aogonek U -50 KPX Aogonek Uacute -50 KPX Aogonek Ucircumflex -50 KPX Aogonek Udieresis -50 KPX Aogonek Ugrave -50 KPX Aogonek Uhungarumlaut -50 KPX Aogonek Umacron -50 KPX Aogonek Uogonek -50 KPX Aogonek Uring -50 KPX Aogonek V -80 KPX Aogonek W -60 KPX Aogonek Y -110 KPX Aogonek Yacute -110 KPX Aogonek Ydieresis -110 KPX Aogonek u -30 KPX Aogonek uacute -30 KPX Aogonek ucircumflex -30 KPX Aogonek udieresis -30 KPX Aogonek ugrave -30 KPX Aogonek uhungarumlaut -30 KPX Aogonek umacron -30 KPX Aogonek uogonek -30 KPX Aogonek uring -30 KPX Aogonek v -40 KPX Aogonek w -30 KPX Aogonek y -30 KPX Aogonek yacute -30 KPX Aogonek ydieresis -30 KPX Aring C -40 KPX Aring Cacute -40 KPX Aring Ccaron -40 KPX Aring Ccedilla -40 KPX Aring G -50 KPX Aring Gbreve -50 KPX Aring Gcommaaccent -50 KPX Aring O -40 KPX Aring Oacute -40 KPX Aring Ocircumflex -40 KPX Aring Odieresis -40 KPX Aring Ograve -40 KPX Aring Ohungarumlaut -40 KPX Aring Omacron -40 KPX Aring Oslash -40 KPX Aring Otilde -40 KPX Aring Q -40 KPX Aring T -90 KPX Aring Tcaron -90 KPX Aring Tcommaaccent -90 KPX Aring U -50 KPX Aring Uacute -50 KPX Aring Ucircumflex -50 KPX Aring Udieresis -50 KPX Aring Ugrave -50 KPX Aring Uhungarumlaut -50 KPX Aring Umacron -50 KPX Aring Uogonek -50 KPX Aring Uring -50 KPX Aring V -80 KPX Aring W -60 KPX Aring Y -110 KPX Aring Yacute -110 KPX Aring Ydieresis -110 KPX Aring u -30 KPX Aring uacute -30 KPX Aring ucircumflex -30 KPX Aring udieresis -30 KPX Aring ugrave -30 KPX Aring uhungarumlaut -30 KPX Aring umacron -30 KPX Aring uogonek -30 KPX Aring uring -30 KPX Aring v -40 KPX Aring w -30 KPX Aring y -30 KPX Aring yacute -30 KPX Aring ydieresis -30 KPX Atilde C -40 KPX Atilde Cacute -40 KPX Atilde Ccaron -40 KPX Atilde Ccedilla -40 KPX Atilde G -50 KPX Atilde Gbreve -50 KPX Atilde Gcommaaccent -50 KPX Atilde O -40 KPX Atilde Oacute -40 KPX Atilde Ocircumflex -40 KPX Atilde Odieresis -40 KPX Atilde Ograve -40 KPX Atilde Ohungarumlaut -40 KPX Atilde Omacron -40 KPX Atilde Oslash -40 KPX Atilde Otilde -40 KPX Atilde Q -40 KPX Atilde T -90 KPX Atilde Tcaron -90 KPX Atilde Tcommaaccent -90 KPX Atilde U -50 KPX Atilde Uacute -50 KPX Atilde Ucircumflex -50 KPX Atilde Udieresis -50 KPX Atilde Ugrave -50 KPX Atilde Uhungarumlaut -50 KPX Atilde Umacron -50 KPX Atilde Uogonek -50 KPX Atilde Uring -50 KPX Atilde V -80 KPX Atilde W -60 KPX Atilde Y -110 KPX Atilde Yacute -110 KPX Atilde Ydieresis -110 KPX Atilde u -30 KPX Atilde uacute -30 KPX Atilde ucircumflex -30 KPX Atilde udieresis -30 KPX Atilde ugrave -30 KPX Atilde uhungarumlaut -30 KPX Atilde umacron -30 KPX Atilde uogonek -30 KPX Atilde uring -30 KPX Atilde v -40 KPX Atilde w -30 KPX Atilde y -30 KPX Atilde yacute -30 KPX Atilde ydieresis -30 KPX B A -30 KPX B Aacute -30 KPX B Abreve -30 KPX B Acircumflex -30 KPX B Adieresis -30 KPX B Agrave -30 KPX B Amacron -30 KPX B Aogonek -30 KPX B Aring -30 KPX B Atilde -30 KPX B U -10 KPX B Uacute -10 KPX B Ucircumflex -10 KPX B Udieresis -10 KPX B Ugrave -10 KPX B Uhungarumlaut -10 KPX B Umacron -10 KPX B Uogonek -10 KPX B Uring -10 KPX D A -40 KPX D Aacute -40 KPX D Abreve -40 KPX D Acircumflex -40 KPX D Adieresis -40 KPX D Agrave -40 KPX D Amacron -40 KPX D Aogonek -40 KPX D Aring -40 KPX D Atilde -40 KPX D V -40 KPX D W -40 KPX D Y -70 KPX D Yacute -70 KPX D Ydieresis -70 KPX D comma -30 KPX D period -30 KPX Dcaron A -40 KPX Dcaron Aacute -40 KPX Dcaron Abreve -40 KPX Dcaron Acircumflex -40 KPX Dcaron Adieresis -40 KPX Dcaron Agrave -40 KPX Dcaron Amacron -40 KPX Dcaron Aogonek -40 KPX Dcaron Aring -40 KPX Dcaron Atilde -40 KPX Dcaron V -40 KPX Dcaron W -40 KPX Dcaron Y -70 KPX Dcaron Yacute -70 KPX Dcaron Ydieresis -70 KPX Dcaron comma -30 KPX Dcaron period -30 KPX Dcroat A -40 KPX Dcroat Aacute -40 KPX Dcroat Abreve -40 KPX Dcroat Acircumflex -40 KPX Dcroat Adieresis -40 KPX Dcroat Agrave -40 KPX Dcroat Amacron -40 KPX Dcroat Aogonek -40 KPX Dcroat Aring -40 KPX Dcroat Atilde -40 KPX Dcroat V -40 KPX Dcroat W -40 KPX Dcroat Y -70 KPX Dcroat Yacute -70 KPX Dcroat Ydieresis -70 KPX Dcroat comma -30 KPX Dcroat period -30 KPX F A -80 KPX F Aacute -80 KPX F Abreve -80 KPX F Acircumflex -80 KPX F Adieresis -80 KPX F Agrave -80 KPX F Amacron -80 KPX F Aogonek -80 KPX F Aring -80 KPX F Atilde -80 KPX F a -20 KPX F aacute -20 KPX F abreve -20 KPX F acircumflex -20 KPX F adieresis -20 KPX F agrave -20 KPX F amacron -20 KPX F aogonek -20 KPX F aring -20 KPX F atilde -20 KPX F comma -100 KPX F period -100 KPX J A -20 KPX J Aacute -20 KPX J Abreve -20 KPX J Acircumflex -20 KPX J Adieresis -20 KPX J Agrave -20 KPX J Amacron -20 KPX J Aogonek -20 KPX J Aring -20 KPX J Atilde -20 KPX J comma -20 KPX J period -20 KPX J u -20 KPX J uacute -20 KPX J ucircumflex -20 KPX J udieresis -20 KPX J ugrave -20 KPX J uhungarumlaut -20 KPX J umacron -20 KPX J uogonek -20 KPX J uring -20 KPX K O -30 KPX K Oacute -30 KPX K Ocircumflex -30 KPX K Odieresis -30 KPX K Ograve -30 KPX K Ohungarumlaut -30 KPX K Omacron -30 KPX K Oslash -30 KPX K Otilde -30 KPX K e -15 KPX K eacute -15 KPX K ecaron -15 KPX K ecircumflex -15 KPX K edieresis -15 KPX K edotaccent -15 KPX K egrave -15 KPX K emacron -15 KPX K eogonek -15 KPX K o -35 KPX K oacute -35 KPX K ocircumflex -35 KPX K odieresis -35 KPX K ograve -35 KPX K ohungarumlaut -35 KPX K omacron -35 KPX K oslash -35 KPX K otilde -35 KPX K u -30 KPX K uacute -30 KPX K ucircumflex -30 KPX K udieresis -30 KPX K ugrave -30 KPX K uhungarumlaut -30 KPX K umacron -30 KPX K uogonek -30 KPX K uring -30 KPX K y -40 KPX K yacute -40 KPX K ydieresis -40 KPX Kcommaaccent O -30 KPX Kcommaaccent Oacute -30 KPX Kcommaaccent Ocircumflex -30 KPX Kcommaaccent Odieresis -30 KPX Kcommaaccent Ograve -30 KPX Kcommaaccent Ohungarumlaut -30 KPX Kcommaaccent Omacron -30 KPX Kcommaaccent Oslash -30 KPX Kcommaaccent Otilde -30 KPX Kcommaaccent e -15 KPX Kcommaaccent eacute -15 KPX Kcommaaccent ecaron -15 KPX Kcommaaccent ecircumflex -15 KPX Kcommaaccent edieresis -15 KPX Kcommaaccent edotaccent -15 KPX Kcommaaccent egrave -15 KPX Kcommaaccent emacron -15 KPX Kcommaaccent eogonek -15 KPX Kcommaaccent o -35 KPX Kcommaaccent oacute -35 KPX Kcommaaccent ocircumflex -35 KPX Kcommaaccent odieresis -35 KPX Kcommaaccent ograve -35 KPX Kcommaaccent ohungarumlaut -35 KPX Kcommaaccent omacron -35 KPX Kcommaaccent oslash -35 KPX Kcommaaccent otilde -35 KPX Kcommaaccent u -30 KPX Kcommaaccent uacute -30 KPX Kcommaaccent ucircumflex -30 KPX Kcommaaccent udieresis -30 KPX Kcommaaccent ugrave -30 KPX Kcommaaccent uhungarumlaut -30 KPX Kcommaaccent umacron -30 KPX Kcommaaccent uogonek -30 KPX Kcommaaccent uring -30 KPX Kcommaaccent y -40 KPX Kcommaaccent yacute -40 KPX Kcommaaccent ydieresis -40 KPX L T -90 KPX L Tcaron -90 KPX L Tcommaaccent -90 KPX L V -110 KPX L W -80 KPX L Y -120 KPX L Yacute -120 KPX L Ydieresis -120 KPX L quotedblright -140 KPX L quoteright -140 KPX L y -30 KPX L yacute -30 KPX L ydieresis -30 KPX Lacute T -90 KPX Lacute Tcaron -90 KPX Lacute Tcommaaccent -90 KPX Lacute V -110 KPX Lacute W -80 KPX Lacute Y -120 KPX Lacute Yacute -120 KPX Lacute Ydieresis -120 KPX Lacute quotedblright -140 KPX Lacute quoteright -140 KPX Lacute y -30 KPX Lacute yacute -30 KPX Lacute ydieresis -30 KPX Lcommaaccent T -90 KPX Lcommaaccent Tcaron -90 KPX Lcommaaccent Tcommaaccent -90 KPX Lcommaaccent V -110 KPX Lcommaaccent W -80 KPX Lcommaaccent Y -120 KPX Lcommaaccent Yacute -120 KPX Lcommaaccent Ydieresis -120 KPX Lcommaaccent quotedblright -140 KPX Lcommaaccent quoteright -140 KPX Lcommaaccent y -30 KPX Lcommaaccent yacute -30 KPX Lcommaaccent ydieresis -30 KPX Lslash T -90 KPX Lslash Tcaron -90 KPX Lslash Tcommaaccent -90 KPX Lslash V -110 KPX Lslash W -80 KPX Lslash Y -120 KPX Lslash Yacute -120 KPX Lslash Ydieresis -120 KPX Lslash quotedblright -140 KPX Lslash quoteright -140 KPX Lslash y -30 KPX Lslash yacute -30 KPX Lslash ydieresis -30 KPX O A -50 KPX O Aacute -50 KPX O Abreve -50 KPX O Acircumflex -50 KPX O Adieresis -50 KPX O Agrave -50 KPX O Amacron -50 KPX O Aogonek -50 KPX O Aring -50 KPX O Atilde -50 KPX O T -40 KPX O Tcaron -40 KPX O Tcommaaccent -40 KPX O V -50 KPX O W -50 KPX O X -50 KPX O Y -70 KPX O Yacute -70 KPX O Ydieresis -70 KPX O comma -40 KPX O period -40 KPX Oacute A -50 KPX Oacute Aacute -50 KPX Oacute Abreve -50 KPX Oacute Acircumflex -50 KPX Oacute Adieresis -50 KPX Oacute Agrave -50 KPX Oacute Amacron -50 KPX Oacute Aogonek -50 KPX Oacute Aring -50 KPX Oacute Atilde -50 KPX Oacute T -40 KPX Oacute Tcaron -40 KPX Oacute Tcommaaccent -40 KPX Oacute V -50 KPX Oacute W -50 KPX Oacute X -50 KPX Oacute Y -70 KPX Oacute Yacute -70 KPX Oacute Ydieresis -70 KPX Oacute comma -40 KPX Oacute period -40 KPX Ocircumflex A -50 KPX Ocircumflex Aacute -50 KPX Ocircumflex Abreve -50 KPX Ocircumflex Acircumflex -50 KPX Ocircumflex Adieresis -50 KPX Ocircumflex Agrave -50 KPX Ocircumflex Amacron -50 KPX Ocircumflex Aogonek -50 KPX Ocircumflex Aring -50 KPX Ocircumflex Atilde -50 KPX Ocircumflex T -40 KPX Ocircumflex Tcaron -40 KPX Ocircumflex Tcommaaccent -40 KPX Ocircumflex V -50 KPX Ocircumflex W -50 KPX Ocircumflex X -50 KPX Ocircumflex Y -70 KPX Ocircumflex Yacute -70 KPX Ocircumflex Ydieresis -70 KPX Ocircumflex comma -40 KPX Ocircumflex period -40 KPX Odieresis A -50 KPX Odieresis Aacute -50 KPX Odieresis Abreve -50 KPX Odieresis Acircumflex -50 KPX Odieresis Adieresis -50 KPX Odieresis Agrave -50 KPX Odieresis Amacron -50 KPX Odieresis Aogonek -50 KPX Odieresis Aring -50 KPX Odieresis Atilde -50 KPX Odieresis T -40 KPX Odieresis Tcaron -40 KPX Odieresis Tcommaaccent -40 KPX Odieresis V -50 KPX Odieresis W -50 KPX Odieresis X -50 KPX Odieresis Y -70 KPX Odieresis Yacute -70 KPX Odieresis Ydieresis -70 KPX Odieresis comma -40 KPX Odieresis period -40 KPX Ograve A -50 KPX Ograve Aacute -50 KPX Ograve Abreve -50 KPX Ograve Acircumflex -50 KPX Ograve Adieresis -50 KPX Ograve Agrave -50 KPX Ograve Amacron -50 KPX Ograve Aogonek -50 KPX Ograve Aring -50 KPX Ograve Atilde -50 KPX Ograve T -40 KPX Ograve Tcaron -40 KPX Ograve Tcommaaccent -40 KPX Ograve V -50 KPX Ograve W -50 KPX Ograve X -50 KPX Ograve Y -70 KPX Ograve Yacute -70 KPX Ograve Ydieresis -70 KPX Ograve comma -40 KPX Ograve period -40 KPX Ohungarumlaut A -50 KPX Ohungarumlaut Aacute -50 KPX Ohungarumlaut Abreve -50 KPX Ohungarumlaut Acircumflex -50 KPX Ohungarumlaut Adieresis -50 KPX Ohungarumlaut Agrave -50 KPX Ohungarumlaut Amacron -50 KPX Ohungarumlaut Aogonek -50 KPX Ohungarumlaut Aring -50 KPX Ohungarumlaut Atilde -50 KPX Ohungarumlaut T -40 KPX Ohungarumlaut Tcaron -40 KPX Ohungarumlaut Tcommaaccent -40 KPX Ohungarumlaut V -50 KPX Ohungarumlaut W -50 KPX Ohungarumlaut X -50 KPX Ohungarumlaut Y -70 KPX Ohungarumlaut Yacute -70 KPX Ohungarumlaut Ydieresis -70 KPX Ohungarumlaut comma -40 KPX Ohungarumlaut period -40 KPX Omacron A -50 KPX Omacron Aacute -50 KPX Omacron Abreve -50 KPX Omacron Acircumflex -50 KPX Omacron Adieresis -50 KPX Omacron Agrave -50 KPX Omacron Amacron -50 KPX Omacron Aogonek -50 KPX Omacron Aring -50 KPX Omacron Atilde -50 KPX Omacron T -40 KPX Omacron Tcaron -40 KPX Omacron Tcommaaccent -40 KPX Omacron V -50 KPX Omacron W -50 KPX Omacron X -50 KPX Omacron Y -70 KPX Omacron Yacute -70 KPX Omacron Ydieresis -70 KPX Omacron comma -40 KPX Omacron period -40 KPX Oslash A -50 KPX Oslash Aacute -50 KPX Oslash Abreve -50 KPX Oslash Acircumflex -50 KPX Oslash Adieresis -50 KPX Oslash Agrave -50 KPX Oslash Amacron -50 KPX Oslash Aogonek -50 KPX Oslash Aring -50 KPX Oslash Atilde -50 KPX Oslash T -40 KPX Oslash Tcaron -40 KPX Oslash Tcommaaccent -40 KPX Oslash V -50 KPX Oslash W -50 KPX Oslash X -50 KPX Oslash Y -70 KPX Oslash Yacute -70 KPX Oslash Ydieresis -70 KPX Oslash comma -40 KPX Oslash period -40 KPX Otilde A -50 KPX Otilde Aacute -50 KPX Otilde Abreve -50 KPX Otilde Acircumflex -50 KPX Otilde Adieresis -50 KPX Otilde Agrave -50 KPX Otilde Amacron -50 KPX Otilde Aogonek -50 KPX Otilde Aring -50 KPX Otilde Atilde -50 KPX Otilde T -40 KPX Otilde Tcaron -40 KPX Otilde Tcommaaccent -40 KPX Otilde V -50 KPX Otilde W -50 KPX Otilde X -50 KPX Otilde Y -70 KPX Otilde Yacute -70 KPX Otilde Ydieresis -70 KPX Otilde comma -40 KPX Otilde period -40 KPX P A -100 KPX P Aacute -100 KPX P Abreve -100 KPX P Acircumflex -100 KPX P Adieresis -100 KPX P Agrave -100 KPX P Amacron -100 KPX P Aogonek -100 KPX P Aring -100 KPX P Atilde -100 KPX P a -30 KPX P aacute -30 KPX P abreve -30 KPX P acircumflex -30 KPX P adieresis -30 KPX P agrave -30 KPX P amacron -30 KPX P aogonek -30 KPX P aring -30 KPX P atilde -30 KPX P comma -120 KPX P e -30 KPX P eacute -30 KPX P ecaron -30 KPX P ecircumflex -30 KPX P edieresis -30 KPX P edotaccent -30 KPX P egrave -30 KPX P emacron -30 KPX P eogonek -30 KPX P o -40 KPX P oacute -40 KPX P ocircumflex -40 KPX P odieresis -40 KPX P ograve -40 KPX P ohungarumlaut -40 KPX P omacron -40 KPX P oslash -40 KPX P otilde -40 KPX P period -120 KPX Q U -10 KPX Q Uacute -10 KPX Q Ucircumflex -10 KPX Q Udieresis -10 KPX Q Ugrave -10 KPX Q Uhungarumlaut -10 KPX Q Umacron -10 KPX Q Uogonek -10 KPX Q Uring -10 KPX Q comma 20 KPX Q period 20 KPX R O -20 KPX R Oacute -20 KPX R Ocircumflex -20 KPX R Odieresis -20 KPX R Ograve -20 KPX R Ohungarumlaut -20 KPX R Omacron -20 KPX R Oslash -20 KPX R Otilde -20 KPX R T -20 KPX R Tcaron -20 KPX R Tcommaaccent -20 KPX R U -20 KPX R Uacute -20 KPX R Ucircumflex -20 KPX R Udieresis -20 KPX R Ugrave -20 KPX R Uhungarumlaut -20 KPX R Umacron -20 KPX R Uogonek -20 KPX R Uring -20 KPX R V -50 KPX R W -40 KPX R Y -50 KPX R Yacute -50 KPX R Ydieresis -50 KPX Racute O -20 KPX Racute Oacute -20 KPX Racute Ocircumflex -20 KPX Racute Odieresis -20 KPX Racute Ograve -20 KPX Racute Ohungarumlaut -20 KPX Racute Omacron -20 KPX Racute Oslash -20 KPX Racute Otilde -20 KPX Racute T -20 KPX Racute Tcaron -20 KPX Racute Tcommaaccent -20 KPX Racute U -20 KPX Racute Uacute -20 KPX Racute Ucircumflex -20 KPX Racute Udieresis -20 KPX Racute Ugrave -20 KPX Racute Uhungarumlaut -20 KPX Racute Umacron -20 KPX Racute Uogonek -20 KPX Racute Uring -20 KPX Racute V -50 KPX Racute W -40 KPX Racute Y -50 KPX Racute Yacute -50 KPX Racute Ydieresis -50 KPX Rcaron O -20 KPX Rcaron Oacute -20 KPX Rcaron Ocircumflex -20 KPX Rcaron Odieresis -20 KPX Rcaron Ograve -20 KPX Rcaron Ohungarumlaut -20 KPX Rcaron Omacron -20 KPX Rcaron Oslash -20 KPX Rcaron Otilde -20 KPX Rcaron T -20 KPX Rcaron Tcaron -20 KPX Rcaron Tcommaaccent -20 KPX Rcaron U -20 KPX Rcaron Uacute -20 KPX Rcaron Ucircumflex -20 KPX Rcaron Udieresis -20 KPX Rcaron Ugrave -20 KPX Rcaron Uhungarumlaut -20 KPX Rcaron Umacron -20 KPX Rcaron Uogonek -20 KPX Rcaron Uring -20 KPX Rcaron V -50 KPX Rcaron W -40 KPX Rcaron Y -50 KPX Rcaron Yacute -50 KPX Rcaron Ydieresis -50 KPX Rcommaaccent O -20 KPX Rcommaaccent Oacute -20 KPX Rcommaaccent Ocircumflex -20 KPX Rcommaaccent Odieresis -20 KPX Rcommaaccent Ograve -20 KPX Rcommaaccent Ohungarumlaut -20 KPX Rcommaaccent Omacron -20 KPX Rcommaaccent Oslash -20 KPX Rcommaaccent Otilde -20 KPX Rcommaaccent T -20 KPX Rcommaaccent Tcaron -20 KPX Rcommaaccent Tcommaaccent -20 KPX Rcommaaccent U -20 KPX Rcommaaccent Uacute -20 KPX Rcommaaccent Ucircumflex -20 KPX Rcommaaccent Udieresis -20 KPX Rcommaaccent Ugrave -20 KPX Rcommaaccent Uhungarumlaut -20 KPX Rcommaaccent Umacron -20 KPX Rcommaaccent Uogonek -20 KPX Rcommaaccent Uring -20 KPX Rcommaaccent V -50 KPX Rcommaaccent W -40 KPX Rcommaaccent Y -50 KPX Rcommaaccent Yacute -50 KPX Rcommaaccent Ydieresis -50 KPX T A -90 KPX T Aacute -90 KPX T Abreve -90 KPX T Acircumflex -90 KPX T Adieresis -90 KPX T Agrave -90 KPX T Amacron -90 KPX T Aogonek -90 KPX T Aring -90 KPX T Atilde -90 KPX T O -40 KPX T Oacute -40 KPX T Ocircumflex -40 KPX T Odieresis -40 KPX T Ograve -40 KPX T Ohungarumlaut -40 KPX T Omacron -40 KPX T Oslash -40 KPX T Otilde -40 KPX T a -80 KPX T aacute -80 KPX T abreve -80 KPX T acircumflex -80 KPX T adieresis -80 KPX T agrave -80 KPX T amacron -80 KPX T aogonek -80 KPX T aring -80 KPX T atilde -80 KPX T colon -40 KPX T comma -80 KPX T e -60 KPX T eacute -60 KPX T ecaron -60 KPX T ecircumflex -60 KPX T edieresis -60 KPX T edotaccent -60 KPX T egrave -60 KPX T emacron -60 KPX T eogonek -60 KPX T hyphen -120 KPX T o -80 KPX T oacute -80 KPX T ocircumflex -80 KPX T odieresis -80 KPX T ograve -80 KPX T ohungarumlaut -80 KPX T omacron -80 KPX T oslash -80 KPX T otilde -80 KPX T period -80 KPX T r -80 KPX T racute -80 KPX T rcommaaccent -80 KPX T semicolon -40 KPX T u -90 KPX T uacute -90 KPX T ucircumflex -90 KPX T udieresis -90 KPX T ugrave -90 KPX T uhungarumlaut -90 KPX T umacron -90 KPX T uogonek -90 KPX T uring -90 KPX T w -60 KPX T y -60 KPX T yacute -60 KPX T ydieresis -60 KPX Tcaron A -90 KPX Tcaron Aacute -90 KPX Tcaron Abreve -90 KPX Tcaron Acircumflex -90 KPX Tcaron Adieresis -90 KPX Tcaron Agrave -90 KPX Tcaron Amacron -90 KPX Tcaron Aogonek -90 KPX Tcaron Aring -90 KPX Tcaron Atilde -90 KPX Tcaron O -40 KPX Tcaron Oacute -40 KPX Tcaron Ocircumflex -40 KPX Tcaron Odieresis -40 KPX Tcaron Ograve -40 KPX Tcaron Ohungarumlaut -40 KPX Tcaron Omacron -40 KPX Tcaron Oslash -40 KPX Tcaron Otilde -40 KPX Tcaron a -80 KPX Tcaron aacute -80 KPX Tcaron abreve -80 KPX Tcaron acircumflex -80 KPX Tcaron adieresis -80 KPX Tcaron agrave -80 KPX Tcaron amacron -80 KPX Tcaron aogonek -80 KPX Tcaron aring -80 KPX Tcaron atilde -80 KPX Tcaron colon -40 KPX Tcaron comma -80 KPX Tcaron e -60 KPX Tcaron eacute -60 KPX Tcaron ecaron -60 KPX Tcaron ecircumflex -60 KPX Tcaron edieresis -60 KPX Tcaron edotaccent -60 KPX Tcaron egrave -60 KPX Tcaron emacron -60 KPX Tcaron eogonek -60 KPX Tcaron hyphen -120 KPX Tcaron o -80 KPX Tcaron oacute -80 KPX Tcaron ocircumflex -80 KPX Tcaron odieresis -80 KPX Tcaron ograve -80 KPX Tcaron ohungarumlaut -80 KPX Tcaron omacron -80 KPX Tcaron oslash -80 KPX Tcaron otilde -80 KPX Tcaron period -80 KPX Tcaron r -80 KPX Tcaron racute -80 KPX Tcaron rcommaaccent -80 KPX Tcaron semicolon -40 KPX Tcaron u -90 KPX Tcaron uacute -90 KPX Tcaron ucircumflex -90 KPX Tcaron udieresis -90 KPX Tcaron ugrave -90 KPX Tcaron uhungarumlaut -90 KPX Tcaron umacron -90 KPX Tcaron uogonek -90 KPX Tcaron uring -90 KPX Tcaron w -60 KPX Tcaron y -60 KPX Tcaron yacute -60 KPX Tcaron ydieresis -60 KPX Tcommaaccent A -90 KPX Tcommaaccent Aacute -90 KPX Tcommaaccent Abreve -90 KPX Tcommaaccent Acircumflex -90 KPX Tcommaaccent Adieresis -90 KPX Tcommaaccent Agrave -90 KPX Tcommaaccent Amacron -90 KPX Tcommaaccent Aogonek -90 KPX Tcommaaccent Aring -90 KPX Tcommaaccent Atilde -90 KPX Tcommaaccent O -40 KPX Tcommaaccent Oacute -40 KPX Tcommaaccent Ocircumflex -40 KPX Tcommaaccent Odieresis -40 KPX Tcommaaccent Ograve -40 KPX Tcommaaccent Ohungarumlaut -40 KPX Tcommaaccent Omacron -40 KPX Tcommaaccent Oslash -40 KPX Tcommaaccent Otilde -40 KPX Tcommaaccent a -80 KPX Tcommaaccent aacute -80 KPX Tcommaaccent abreve -80 KPX Tcommaaccent acircumflex -80 KPX Tcommaaccent adieresis -80 KPX Tcommaaccent agrave -80 KPX Tcommaaccent amacron -80 KPX Tcommaaccent aogonek -80 KPX Tcommaaccent aring -80 KPX Tcommaaccent atilde -80 KPX Tcommaaccent colon -40 KPX Tcommaaccent comma -80 KPX Tcommaaccent e -60 KPX Tcommaaccent eacute -60 KPX Tcommaaccent ecaron -60 KPX Tcommaaccent ecircumflex -60 KPX Tcommaaccent edieresis -60 KPX Tcommaaccent edotaccent -60 KPX Tcommaaccent egrave -60 KPX Tcommaaccent emacron -60 KPX Tcommaaccent eogonek -60 KPX Tcommaaccent hyphen -120 KPX Tcommaaccent o -80 KPX Tcommaaccent oacute -80 KPX Tcommaaccent ocircumflex -80 KPX Tcommaaccent odieresis -80 KPX Tcommaaccent ograve -80 KPX Tcommaaccent ohungarumlaut -80 KPX Tcommaaccent omacron -80 KPX Tcommaaccent oslash -80 KPX Tcommaaccent otilde -80 KPX Tcommaaccent period -80 KPX Tcommaaccent r -80 KPX Tcommaaccent racute -80 KPX Tcommaaccent rcommaaccent -80 KPX Tcommaaccent semicolon -40 KPX Tcommaaccent u -90 KPX Tcommaaccent uacute -90 KPX Tcommaaccent ucircumflex -90 KPX Tcommaaccent udieresis -90 KPX Tcommaaccent ugrave -90 KPX Tcommaaccent uhungarumlaut -90 KPX Tcommaaccent umacron -90 KPX Tcommaaccent uogonek -90 KPX Tcommaaccent uring -90 KPX Tcommaaccent w -60 KPX Tcommaaccent y -60 KPX Tcommaaccent yacute -60 KPX Tcommaaccent ydieresis -60 KPX U A -50 KPX U Aacute -50 KPX U Abreve -50 KPX U Acircumflex -50 KPX U Adieresis -50 KPX U Agrave -50 KPX U Amacron -50 KPX U Aogonek -50 KPX U Aring -50 KPX U Atilde -50 KPX U comma -30 KPX U period -30 KPX Uacute A -50 KPX Uacute Aacute -50 KPX Uacute Abreve -50 KPX Uacute Acircumflex -50 KPX Uacute Adieresis -50 KPX Uacute Agrave -50 KPX Uacute Amacron -50 KPX Uacute Aogonek -50 KPX Uacute Aring -50 KPX Uacute Atilde -50 KPX Uacute comma -30 KPX Uacute period -30 KPX Ucircumflex A -50 KPX Ucircumflex Aacute -50 KPX Ucircumflex Abreve -50 KPX Ucircumflex Acircumflex -50 KPX Ucircumflex Adieresis -50 KPX Ucircumflex Agrave -50 KPX Ucircumflex Amacron -50 KPX Ucircumflex Aogonek -50 KPX Ucircumflex Aring -50 KPX Ucircumflex Atilde -50 KPX Ucircumflex comma -30 KPX Ucircumflex period -30 KPX Udieresis A -50 KPX Udieresis Aacute -50 KPX Udieresis Abreve -50 KPX Udieresis Acircumflex -50 KPX Udieresis Adieresis -50 KPX Udieresis Agrave -50 KPX Udieresis Amacron -50 KPX Udieresis Aogonek -50 KPX Udieresis Aring -50 KPX Udieresis Atilde -50 KPX Udieresis comma -30 KPX Udieresis period -30 KPX Ugrave A -50 KPX Ugrave Aacute -50 KPX Ugrave Abreve -50 KPX Ugrave Acircumflex -50 KPX Ugrave Adieresis -50 KPX Ugrave Agrave -50 KPX Ugrave Amacron -50 KPX Ugrave Aogonek -50 KPX Ugrave Aring -50 KPX Ugrave Atilde -50 KPX Ugrave comma -30 KPX Ugrave period -30 KPX Uhungarumlaut A -50 KPX Uhungarumlaut Aacute -50 KPX Uhungarumlaut Abreve -50 KPX Uhungarumlaut Acircumflex -50 KPX Uhungarumlaut Adieresis -50 KPX Uhungarumlaut Agrave -50 KPX Uhungarumlaut Amacron -50 KPX Uhungarumlaut Aogonek -50 KPX Uhungarumlaut Aring -50 KPX Uhungarumlaut Atilde -50 KPX Uhungarumlaut comma -30 KPX Uhungarumlaut period -30 KPX Umacron A -50 KPX Umacron Aacute -50 KPX Umacron Abreve -50 KPX Umacron Acircumflex -50 KPX Umacron Adieresis -50 KPX Umacron Agrave -50 KPX Umacron Amacron -50 KPX Umacron Aogonek -50 KPX Umacron Aring -50 KPX Umacron Atilde -50 KPX Umacron comma -30 KPX Umacron period -30 KPX Uogonek A -50 KPX Uogonek Aacute -50 KPX Uogonek Abreve -50 KPX Uogonek Acircumflex -50 KPX Uogonek Adieresis -50 KPX Uogonek Agrave -50 KPX Uogonek Amacron -50 KPX Uogonek Aogonek -50 KPX Uogonek Aring -50 KPX Uogonek Atilde -50 KPX Uogonek comma -30 KPX Uogonek period -30 KPX Uring A -50 KPX Uring Aacute -50 KPX Uring Abreve -50 KPX Uring Acircumflex -50 KPX Uring Adieresis -50 KPX Uring Agrave -50 KPX Uring Amacron -50 KPX Uring Aogonek -50 KPX Uring Aring -50 KPX Uring Atilde -50 KPX Uring comma -30 KPX Uring period -30 KPX V A -80 KPX V Aacute -80 KPX V Abreve -80 KPX V Acircumflex -80 KPX V Adieresis -80 KPX V Agrave -80 KPX V Amacron -80 KPX V Aogonek -80 KPX V Aring -80 KPX V Atilde -80 KPX V G -50 KPX V Gbreve -50 KPX V Gcommaaccent -50 KPX V O -50 KPX V Oacute -50 KPX V Ocircumflex -50 KPX V Odieresis -50 KPX V Ograve -50 KPX V Ohungarumlaut -50 KPX V Omacron -50 KPX V Oslash -50 KPX V Otilde -50 KPX V a -60 KPX V aacute -60 KPX V abreve -60 KPX V acircumflex -60 KPX V adieresis -60 KPX V agrave -60 KPX V amacron -60 KPX V aogonek -60 KPX V aring -60 KPX V atilde -60 KPX V colon -40 KPX V comma -120 KPX V e -50 KPX V eacute -50 KPX V ecaron -50 KPX V ecircumflex -50 KPX V edieresis -50 KPX V edotaccent -50 KPX V egrave -50 KPX V emacron -50 KPX V eogonek -50 KPX V hyphen -80 KPX V o -90 KPX V oacute -90 KPX V ocircumflex -90 KPX V odieresis -90 KPX V ograve -90 KPX V ohungarumlaut -90 KPX V omacron -90 KPX V oslash -90 KPX V otilde -90 KPX V period -120 KPX V semicolon -40 KPX V u -60 KPX V uacute -60 KPX V ucircumflex -60 KPX V udieresis -60 KPX V ugrave -60 KPX V uhungarumlaut -60 KPX V umacron -60 KPX V uogonek -60 KPX V uring -60 KPX W A -60 KPX W Aacute -60 KPX W Abreve -60 KPX W Acircumflex -60 KPX W Adieresis -60 KPX W Agrave -60 KPX W Amacron -60 KPX W Aogonek -60 KPX W Aring -60 KPX W Atilde -60 KPX W O -20 KPX W Oacute -20 KPX W Ocircumflex -20 KPX W Odieresis -20 KPX W Ograve -20 KPX W Ohungarumlaut -20 KPX W Omacron -20 KPX W Oslash -20 KPX W Otilde -20 KPX W a -40 KPX W aacute -40 KPX W abreve -40 KPX W acircumflex -40 KPX W adieresis -40 KPX W agrave -40 KPX W amacron -40 KPX W aogonek -40 KPX W aring -40 KPX W atilde -40 KPX W colon -10 KPX W comma -80 KPX W e -35 KPX W eacute -35 KPX W ecaron -35 KPX W ecircumflex -35 KPX W edieresis -35 KPX W edotaccent -35 KPX W egrave -35 KPX W emacron -35 KPX W eogonek -35 KPX W hyphen -40 KPX W o -60 KPX W oacute -60 KPX W ocircumflex -60 KPX W odieresis -60 KPX W ograve -60 KPX W ohungarumlaut -60 KPX W omacron -60 KPX W oslash -60 KPX W otilde -60 KPX W period -80 KPX W semicolon -10 KPX W u -45 KPX W uacute -45 KPX W ucircumflex -45 KPX W udieresis -45 KPX W ugrave -45 KPX W uhungarumlaut -45 KPX W umacron -45 KPX W uogonek -45 KPX W uring -45 KPX W y -20 KPX W yacute -20 KPX W ydieresis -20 KPX Y A -110 KPX Y Aacute -110 KPX Y Abreve -110 KPX Y Acircumflex -110 KPX Y Adieresis -110 KPX Y Agrave -110 KPX Y Amacron -110 KPX Y Aogonek -110 KPX Y Aring -110 KPX Y Atilde -110 KPX Y O -70 KPX Y Oacute -70 KPX Y Ocircumflex -70 KPX Y Odieresis -70 KPX Y Ograve -70 KPX Y Ohungarumlaut -70 KPX Y Omacron -70 KPX Y Oslash -70 KPX Y Otilde -70 KPX Y a -90 KPX Y aacute -90 KPX Y abreve -90 KPX Y acircumflex -90 KPX Y adieresis -90 KPX Y agrave -90 KPX Y amacron -90 KPX Y aogonek -90 KPX Y aring -90 KPX Y atilde -90 KPX Y colon -50 KPX Y comma -100 KPX Y e -80 KPX Y eacute -80 KPX Y ecaron -80 KPX Y ecircumflex -80 KPX Y edieresis -80 KPX Y edotaccent -80 KPX Y egrave -80 KPX Y emacron -80 KPX Y eogonek -80 KPX Y o -100 KPX Y oacute -100 KPX Y ocircumflex -100 KPX Y odieresis -100 KPX Y ograve -100 KPX Y ohungarumlaut -100 KPX Y omacron -100 KPX Y oslash -100 KPX Y otilde -100 KPX Y period -100 KPX Y semicolon -50 KPX Y u -100 KPX Y uacute -100 KPX Y ucircumflex -100 KPX Y udieresis -100 KPX Y ugrave -100 KPX Y uhungarumlaut -100 KPX Y umacron -100 KPX Y uogonek -100 KPX Y uring -100 KPX Yacute A -110 KPX Yacute Aacute -110 KPX Yacute Abreve -110 KPX Yacute Acircumflex -110 KPX Yacute Adieresis -110 KPX Yacute Agrave -110 KPX Yacute Amacron -110 KPX Yacute Aogonek -110 KPX Yacute Aring -110 KPX Yacute Atilde -110 KPX Yacute O -70 KPX Yacute Oacute -70 KPX Yacute Ocircumflex -70 KPX Yacute Odieresis -70 KPX Yacute Ograve -70 KPX Yacute Ohungarumlaut -70 KPX Yacute Omacron -70 KPX Yacute Oslash -70 KPX Yacute Otilde -70 KPX Yacute a -90 KPX Yacute aacute -90 KPX Yacute abreve -90 KPX Yacute acircumflex -90 KPX Yacute adieresis -90 KPX Yacute agrave -90 KPX Yacute amacron -90 KPX Yacute aogonek -90 KPX Yacute aring -90 KPX Yacute atilde -90 KPX Yacute colon -50 KPX Yacute comma -100 KPX Yacute e -80 KPX Yacute eacute -80 KPX Yacute ecaron -80 KPX Yacute ecircumflex -80 KPX Yacute edieresis -80 KPX Yacute edotaccent -80 KPX Yacute egrave -80 KPX Yacute emacron -80 KPX Yacute eogonek -80 KPX Yacute o -100 KPX Yacute oacute -100 KPX Yacute ocircumflex -100 KPX Yacute odieresis -100 KPX Yacute ograve -100 KPX Yacute ohungarumlaut -100 KPX Yacute omacron -100 KPX Yacute oslash -100 KPX Yacute otilde -100 KPX Yacute period -100 KPX Yacute semicolon -50 KPX Yacute u -100 KPX Yacute uacute -100 KPX Yacute ucircumflex -100 KPX Yacute udieresis -100 KPX Yacute ugrave -100 KPX Yacute uhungarumlaut -100 KPX Yacute umacron -100 KPX Yacute uogonek -100 KPX Yacute uring -100 KPX Ydieresis A -110 KPX Ydieresis Aacute -110 KPX Ydieresis Abreve -110 KPX Ydieresis Acircumflex -110 KPX Ydieresis Adieresis -110 KPX Ydieresis Agrave -110 KPX Ydieresis Amacron -110 KPX Ydieresis Aogonek -110 KPX Ydieresis Aring -110 KPX Ydieresis Atilde -110 KPX Ydieresis O -70 KPX Ydieresis Oacute -70 KPX Ydieresis Ocircumflex -70 KPX Ydieresis Odieresis -70 KPX Ydieresis Ograve -70 KPX Ydieresis Ohungarumlaut -70 KPX Ydieresis Omacron -70 KPX Ydieresis Oslash -70 KPX Ydieresis Otilde -70 KPX Ydieresis a -90 KPX Ydieresis aacute -90 KPX Ydieresis abreve -90 KPX Ydieresis acircumflex -90 KPX Ydieresis adieresis -90 KPX Ydieresis agrave -90 KPX Ydieresis amacron -90 KPX Ydieresis aogonek -90 KPX Ydieresis aring -90 KPX Ydieresis atilde -90 KPX Ydieresis colon -50 KPX Ydieresis comma -100 KPX Ydieresis e -80 KPX Ydieresis eacute -80 KPX Ydieresis ecaron -80 KPX Ydieresis ecircumflex -80 KPX Ydieresis edieresis -80 KPX Ydieresis edotaccent -80 KPX Ydieresis egrave -80 KPX Ydieresis emacron -80 KPX Ydieresis eogonek -80 KPX Ydieresis o -100 KPX Ydieresis oacute -100 KPX Ydieresis ocircumflex -100 KPX Ydieresis odieresis -100 KPX Ydieresis ograve -100 KPX Ydieresis ohungarumlaut -100 KPX Ydieresis omacron -100 KPX Ydieresis oslash -100 KPX Ydieresis otilde -100 KPX Ydieresis period -100 KPX Ydieresis semicolon -50 KPX Ydieresis u -100 KPX Ydieresis uacute -100 KPX Ydieresis ucircumflex -100 KPX Ydieresis udieresis -100 KPX Ydieresis ugrave -100 KPX Ydieresis uhungarumlaut -100 KPX Ydieresis umacron -100 KPX Ydieresis uogonek -100 KPX Ydieresis uring -100 KPX a g -10 KPX a gbreve -10 KPX a gcommaaccent -10 KPX a v -15 KPX a w -15 KPX a y -20 KPX a yacute -20 KPX a ydieresis -20 KPX aacute g -10 KPX aacute gbreve -10 KPX aacute gcommaaccent -10 KPX aacute v -15 KPX aacute w -15 KPX aacute y -20 KPX aacute yacute -20 KPX aacute ydieresis -20 KPX abreve g -10 KPX abreve gbreve -10 KPX abreve gcommaaccent -10 KPX abreve v -15 KPX abreve w -15 KPX abreve y -20 KPX abreve yacute -20 KPX abreve ydieresis -20 KPX acircumflex g -10 KPX acircumflex gbreve -10 KPX acircumflex gcommaaccent -10 KPX acircumflex v -15 KPX acircumflex w -15 KPX acircumflex y -20 KPX acircumflex yacute -20 KPX acircumflex ydieresis -20 KPX adieresis g -10 KPX adieresis gbreve -10 KPX adieresis gcommaaccent -10 KPX adieresis v -15 KPX adieresis w -15 KPX adieresis y -20 KPX adieresis yacute -20 KPX adieresis ydieresis -20 KPX agrave g -10 KPX agrave gbreve -10 KPX agrave gcommaaccent -10 KPX agrave v -15 KPX agrave w -15 KPX agrave y -20 KPX agrave yacute -20 KPX agrave ydieresis -20 KPX amacron g -10 KPX amacron gbreve -10 KPX amacron gcommaaccent -10 KPX amacron v -15 KPX amacron w -15 KPX amacron y -20 KPX amacron yacute -20 KPX amacron ydieresis -20 KPX aogonek g -10 KPX aogonek gbreve -10 KPX aogonek gcommaaccent -10 KPX aogonek v -15 KPX aogonek w -15 KPX aogonek y -20 KPX aogonek yacute -20 KPX aogonek ydieresis -20 KPX aring g -10 KPX aring gbreve -10 KPX aring gcommaaccent -10 KPX aring v -15 KPX aring w -15 KPX aring y -20 KPX aring yacute -20 KPX aring ydieresis -20 KPX atilde g -10 KPX atilde gbreve -10 KPX atilde gcommaaccent -10 KPX atilde v -15 KPX atilde w -15 KPX atilde y -20 KPX atilde yacute -20 KPX atilde ydieresis -20 KPX b l -10 KPX b lacute -10 KPX b lcommaaccent -10 KPX b lslash -10 KPX b u -20 KPX b uacute -20 KPX b ucircumflex -20 KPX b udieresis -20 KPX b ugrave -20 KPX b uhungarumlaut -20 KPX b umacron -20 KPX b uogonek -20 KPX b uring -20 KPX b v -20 KPX b y -20 KPX b yacute -20 KPX b ydieresis -20 KPX c h -10 KPX c k -20 KPX c kcommaaccent -20 KPX c l -20 KPX c lacute -20 KPX c lcommaaccent -20 KPX c lslash -20 KPX c y -10 KPX c yacute -10 KPX c ydieresis -10 KPX cacute h -10 KPX cacute k -20 KPX cacute kcommaaccent -20 KPX cacute l -20 KPX cacute lacute -20 KPX cacute lcommaaccent -20 KPX cacute lslash -20 KPX cacute y -10 KPX cacute yacute -10 KPX cacute ydieresis -10 KPX ccaron h -10 KPX ccaron k -20 KPX ccaron kcommaaccent -20 KPX ccaron l -20 KPX ccaron lacute -20 KPX ccaron lcommaaccent -20 KPX ccaron lslash -20 KPX ccaron y -10 KPX ccaron yacute -10 KPX ccaron ydieresis -10 KPX ccedilla h -10 KPX ccedilla k -20 KPX ccedilla kcommaaccent -20 KPX ccedilla l -20 KPX ccedilla lacute -20 KPX ccedilla lcommaaccent -20 KPX ccedilla lslash -20 KPX ccedilla y -10 KPX ccedilla yacute -10 KPX ccedilla ydieresis -10 KPX colon space -40 KPX comma quotedblright -120 KPX comma quoteright -120 KPX comma space -40 KPX d d -10 KPX d dcroat -10 KPX d v -15 KPX d w -15 KPX d y -15 KPX d yacute -15 KPX d ydieresis -15 KPX dcroat d -10 KPX dcroat dcroat -10 KPX dcroat v -15 KPX dcroat w -15 KPX dcroat y -15 KPX dcroat yacute -15 KPX dcroat ydieresis -15 KPX e comma 10 KPX e period 20 KPX e v -15 KPX e w -15 KPX e x -15 KPX e y -15 KPX e yacute -15 KPX e ydieresis -15 KPX eacute comma 10 KPX eacute period 20 KPX eacute v -15 KPX eacute w -15 KPX eacute x -15 KPX eacute y -15 KPX eacute yacute -15 KPX eacute ydieresis -15 KPX ecaron comma 10 KPX ecaron period 20 KPX ecaron v -15 KPX ecaron w -15 KPX ecaron x -15 KPX ecaron y -15 KPX ecaron yacute -15 KPX ecaron ydieresis -15 KPX ecircumflex comma 10 KPX ecircumflex period 20 KPX ecircumflex v -15 KPX ecircumflex w -15 KPX ecircumflex x -15 KPX ecircumflex y -15 KPX ecircumflex yacute -15 KPX ecircumflex ydieresis -15 KPX edieresis comma 10 KPX edieresis period 20 KPX edieresis v -15 KPX edieresis w -15 KPX edieresis x -15 KPX edieresis y -15 KPX edieresis yacute -15 KPX edieresis ydieresis -15 KPX edotaccent comma 10 KPX edotaccent period 20 KPX edotaccent v -15 KPX edotaccent w -15 KPX edotaccent x -15 KPX edotaccent y -15 KPX edotaccent yacute -15 KPX edotaccent ydieresis -15 KPX egrave comma 10 KPX egrave period 20 KPX egrave v -15 KPX egrave w -15 KPX egrave x -15 KPX egrave y -15 KPX egrave yacute -15 KPX egrave ydieresis -15 KPX emacron comma 10 KPX emacron period 20 KPX emacron v -15 KPX emacron w -15 KPX emacron x -15 KPX emacron y -15 KPX emacron yacute -15 KPX emacron ydieresis -15 KPX eogonek comma 10 KPX eogonek period 20 KPX eogonek v -15 KPX eogonek w -15 KPX eogonek x -15 KPX eogonek y -15 KPX eogonek yacute -15 KPX eogonek ydieresis -15 KPX f comma -10 KPX f e -10 KPX f eacute -10 KPX f ecaron -10 KPX f ecircumflex -10 KPX f edieresis -10 KPX f edotaccent -10 KPX f egrave -10 KPX f emacron -10 KPX f eogonek -10 KPX f o -20 KPX f oacute -20 KPX f ocircumflex -20 KPX f odieresis -20 KPX f ograve -20 KPX f ohungarumlaut -20 KPX f omacron -20 KPX f oslash -20 KPX f otilde -20 KPX f period -10 KPX f quotedblright 30 KPX f quoteright 30 KPX g e 10 KPX g eacute 10 KPX g ecaron 10 KPX g ecircumflex 10 KPX g edieresis 10 KPX g edotaccent 10 KPX g egrave 10 KPX g emacron 10 KPX g eogonek 10 KPX g g -10 KPX g gbreve -10 KPX g gcommaaccent -10 KPX gbreve e 10 KPX gbreve eacute 10 KPX gbreve ecaron 10 KPX gbreve ecircumflex 10 KPX gbreve edieresis 10 KPX gbreve edotaccent 10 KPX gbreve egrave 10 KPX gbreve emacron 10 KPX gbreve eogonek 10 KPX gbreve g -10 KPX gbreve gbreve -10 KPX gbreve gcommaaccent -10 KPX gcommaaccent e 10 KPX gcommaaccent eacute 10 KPX gcommaaccent ecaron 10 KPX gcommaaccent ecircumflex 10 KPX gcommaaccent edieresis 10 KPX gcommaaccent edotaccent 10 KPX gcommaaccent egrave 10 KPX gcommaaccent emacron 10 KPX gcommaaccent eogonek 10 KPX gcommaaccent g -10 KPX gcommaaccent gbreve -10 KPX gcommaaccent gcommaaccent -10 KPX h y -20 KPX h yacute -20 KPX h ydieresis -20 KPX k o -15 KPX k oacute -15 KPX k ocircumflex -15 KPX k odieresis -15 KPX k ograve -15 KPX k ohungarumlaut -15 KPX k omacron -15 KPX k oslash -15 KPX k otilde -15 KPX kcommaaccent o -15 KPX kcommaaccent oacute -15 KPX kcommaaccent ocircumflex -15 KPX kcommaaccent odieresis -15 KPX kcommaaccent ograve -15 KPX kcommaaccent ohungarumlaut -15 KPX kcommaaccent omacron -15 KPX kcommaaccent oslash -15 KPX kcommaaccent otilde -15 KPX l w -15 KPX l y -15 KPX l yacute -15 KPX l ydieresis -15 KPX lacute w -15 KPX lacute y -15 KPX lacute yacute -15 KPX lacute ydieresis -15 KPX lcommaaccent w -15 KPX lcommaaccent y -15 KPX lcommaaccent yacute -15 KPX lcommaaccent ydieresis -15 KPX lslash w -15 KPX lslash y -15 KPX lslash yacute -15 KPX lslash ydieresis -15 KPX m u -20 KPX m uacute -20 KPX m ucircumflex -20 KPX m udieresis -20 KPX m ugrave -20 KPX m uhungarumlaut -20 KPX m umacron -20 KPX m uogonek -20 KPX m uring -20 KPX m y -30 KPX m yacute -30 KPX m ydieresis -30 KPX n u -10 KPX n uacute -10 KPX n ucircumflex -10 KPX n udieresis -10 KPX n ugrave -10 KPX n uhungarumlaut -10 KPX n umacron -10 KPX n uogonek -10 KPX n uring -10 KPX n v -40 KPX n y -20 KPX n yacute -20 KPX n ydieresis -20 KPX nacute u -10 KPX nacute uacute -10 KPX nacute ucircumflex -10 KPX nacute udieresis -10 KPX nacute ugrave -10 KPX nacute uhungarumlaut -10 KPX nacute umacron -10 KPX nacute uogonek -10 KPX nacute uring -10 KPX nacute v -40 KPX nacute y -20 KPX nacute yacute -20 KPX nacute ydieresis -20 KPX ncaron u -10 KPX ncaron uacute -10 KPX ncaron ucircumflex -10 KPX ncaron udieresis -10 KPX ncaron ugrave -10 KPX ncaron uhungarumlaut -10 KPX ncaron umacron -10 KPX ncaron uogonek -10 KPX ncaron uring -10 KPX ncaron v -40 KPX ncaron y -20 KPX ncaron yacute -20 KPX ncaron ydieresis -20 KPX ncommaaccent u -10 KPX ncommaaccent uacute -10 KPX ncommaaccent ucircumflex -10 KPX ncommaaccent udieresis -10 KPX ncommaaccent ugrave -10 KPX ncommaaccent uhungarumlaut -10 KPX ncommaaccent umacron -10 KPX ncommaaccent uogonek -10 KPX ncommaaccent uring -10 KPX ncommaaccent v -40 KPX ncommaaccent y -20 KPX ncommaaccent yacute -20 KPX ncommaaccent ydieresis -20 KPX ntilde u -10 KPX ntilde uacute -10 KPX ntilde ucircumflex -10 KPX ntilde udieresis -10 KPX ntilde ugrave -10 KPX ntilde uhungarumlaut -10 KPX ntilde umacron -10 KPX ntilde uogonek -10 KPX ntilde uring -10 KPX ntilde v -40 KPX ntilde y -20 KPX ntilde yacute -20 KPX ntilde ydieresis -20 KPX o v -20 KPX o w -15 KPX o x -30 KPX o y -20 KPX o yacute -20 KPX o ydieresis -20 KPX oacute v -20 KPX oacute w -15 KPX oacute x -30 KPX oacute y -20 KPX oacute yacute -20 KPX oacute ydieresis -20 KPX ocircumflex v -20 KPX ocircumflex w -15 KPX ocircumflex x -30 KPX ocircumflex y -20 KPX ocircumflex yacute -20 KPX ocircumflex ydieresis -20 KPX odieresis v -20 KPX odieresis w -15 KPX odieresis x -30 KPX odieresis y -20 KPX odieresis yacute -20 KPX odieresis ydieresis -20 KPX ograve v -20 KPX ograve w -15 KPX ograve x -30 KPX ograve y -20 KPX ograve yacute -20 KPX ograve ydieresis -20 KPX ohungarumlaut v -20 KPX ohungarumlaut w -15 KPX ohungarumlaut x -30 KPX ohungarumlaut y -20 KPX ohungarumlaut yacute -20 KPX ohungarumlaut ydieresis -20 KPX omacron v -20 KPX omacron w -15 KPX omacron x -30 KPX omacron y -20 KPX omacron yacute -20 KPX omacron ydieresis -20 KPX oslash v -20 KPX oslash w -15 KPX oslash x -30 KPX oslash y -20 KPX oslash yacute -20 KPX oslash ydieresis -20 KPX otilde v -20 KPX otilde w -15 KPX otilde x -30 KPX otilde y -20 KPX otilde yacute -20 KPX otilde ydieresis -20 KPX p y -15 KPX p yacute -15 KPX p ydieresis -15 KPX period quotedblright -120 KPX period quoteright -120 KPX period space -40 KPX quotedblright space -80 KPX quoteleft quoteleft -46 KPX quoteright d -80 KPX quoteright dcroat -80 KPX quoteright l -20 KPX quoteright lacute -20 KPX quoteright lcommaaccent -20 KPX quoteright lslash -20 KPX quoteright quoteright -46 KPX quoteright r -40 KPX quoteright racute -40 KPX quoteright rcaron -40 KPX quoteright rcommaaccent -40 KPX quoteright s -60 KPX quoteright sacute -60 KPX quoteright scaron -60 KPX quoteright scedilla -60 KPX quoteright scommaaccent -60 KPX quoteright space -80 KPX quoteright v -20 KPX r c -20 KPX r cacute -20 KPX r ccaron -20 KPX r ccedilla -20 KPX r comma -60 KPX r d -20 KPX r dcroat -20 KPX r g -15 KPX r gbreve -15 KPX r gcommaaccent -15 KPX r hyphen -20 KPX r o -20 KPX r oacute -20 KPX r ocircumflex -20 KPX r odieresis -20 KPX r ograve -20 KPX r ohungarumlaut -20 KPX r omacron -20 KPX r oslash -20 KPX r otilde -20 KPX r period -60 KPX r q -20 KPX r s -15 KPX r sacute -15 KPX r scaron -15 KPX r scedilla -15 KPX r scommaaccent -15 KPX r t 20 KPX r tcommaaccent 20 KPX r v 10 KPX r y 10 KPX r yacute 10 KPX r ydieresis 10 KPX racute c -20 KPX racute cacute -20 KPX racute ccaron -20 KPX racute ccedilla -20 KPX racute comma -60 KPX racute d -20 KPX racute dcroat -20 KPX racute g -15 KPX racute gbreve -15 KPX racute gcommaaccent -15 KPX racute hyphen -20 KPX racute o -20 KPX racute oacute -20 KPX racute ocircumflex -20 KPX racute odieresis -20 KPX racute ograve -20 KPX racute ohungarumlaut -20 KPX racute omacron -20 KPX racute oslash -20 KPX racute otilde -20 KPX racute period -60 KPX racute q -20 KPX racute s -15 KPX racute sacute -15 KPX racute scaron -15 KPX racute scedilla -15 KPX racute scommaaccent -15 KPX racute t 20 KPX racute tcommaaccent 20 KPX racute v 10 KPX racute y 10 KPX racute yacute 10 KPX racute ydieresis 10 KPX rcaron c -20 KPX rcaron cacute -20 KPX rcaron ccaron -20 KPX rcaron ccedilla -20 KPX rcaron comma -60 KPX rcaron d -20 KPX rcaron dcroat -20 KPX rcaron g -15 KPX rcaron gbreve -15 KPX rcaron gcommaaccent -15 KPX rcaron hyphen -20 KPX rcaron o -20 KPX rcaron oacute -20 KPX rcaron ocircumflex -20 KPX rcaron odieresis -20 KPX rcaron ograve -20 KPX rcaron ohungarumlaut -20 KPX rcaron omacron -20 KPX rcaron oslash -20 KPX rcaron otilde -20 KPX rcaron period -60 KPX rcaron q -20 KPX rcaron s -15 KPX rcaron sacute -15 KPX rcaron scaron -15 KPX rcaron scedilla -15 KPX rcaron scommaaccent -15 KPX rcaron t 20 KPX rcaron tcommaaccent 20 KPX rcaron v 10 KPX rcaron y 10 KPX rcaron yacute 10 KPX rcaron ydieresis 10 KPX rcommaaccent c -20 KPX rcommaaccent cacute -20 KPX rcommaaccent ccaron -20 KPX rcommaaccent ccedilla -20 KPX rcommaaccent comma -60 KPX rcommaaccent d -20 KPX rcommaaccent dcroat -20 KPX rcommaaccent g -15 KPX rcommaaccent gbreve -15 KPX rcommaaccent gcommaaccent -15 KPX rcommaaccent hyphen -20 KPX rcommaaccent o -20 KPX rcommaaccent oacute -20 KPX rcommaaccent ocircumflex -20 KPX rcommaaccent odieresis -20 KPX rcommaaccent ograve -20 KPX rcommaaccent ohungarumlaut -20 KPX rcommaaccent omacron -20 KPX rcommaaccent oslash -20 KPX rcommaaccent otilde -20 KPX rcommaaccent period -60 KPX rcommaaccent q -20 KPX rcommaaccent s -15 KPX rcommaaccent sacute -15 KPX rcommaaccent scaron -15 KPX rcommaaccent scedilla -15 KPX rcommaaccent scommaaccent -15 KPX rcommaaccent t 20 KPX rcommaaccent tcommaaccent 20 KPX rcommaaccent v 10 KPX rcommaaccent y 10 KPX rcommaaccent yacute 10 KPX rcommaaccent ydieresis 10 KPX s w -15 KPX sacute w -15 KPX scaron w -15 KPX scedilla w -15 KPX scommaaccent w -15 KPX semicolon space -40 KPX space T -100 KPX space Tcaron -100 KPX space Tcommaaccent -100 KPX space V -80 KPX space W -80 KPX space Y -120 KPX space Yacute -120 KPX space Ydieresis -120 KPX space quotedblleft -80 KPX space quoteleft -60 KPX v a -20 KPX v aacute -20 KPX v abreve -20 KPX v acircumflex -20 KPX v adieresis -20 KPX v agrave -20 KPX v amacron -20 KPX v aogonek -20 KPX v aring -20 KPX v atilde -20 KPX v comma -80 KPX v o -30 KPX v oacute -30 KPX v ocircumflex -30 KPX v odieresis -30 KPX v ograve -30 KPX v ohungarumlaut -30 KPX v omacron -30 KPX v oslash -30 KPX v otilde -30 KPX v period -80 KPX w comma -40 KPX w o -20 KPX w oacute -20 KPX w ocircumflex -20 KPX w odieresis -20 KPX w ograve -20 KPX w ohungarumlaut -20 KPX w omacron -20 KPX w oslash -20 KPX w otilde -20 KPX w period -40 KPX x e -10 KPX x eacute -10 KPX x ecaron -10 KPX x ecircumflex -10 KPX x edieresis -10 KPX x edotaccent -10 KPX x egrave -10 KPX x emacron -10 KPX x eogonek -10 KPX y a -30 KPX y aacute -30 KPX y abreve -30 KPX y acircumflex -30 KPX y adieresis -30 KPX y agrave -30 KPX y amacron -30 KPX y aogonek -30 KPX y aring -30 KPX y atilde -30 KPX y comma -80 KPX y e -10 KPX y eacute -10 KPX y ecaron -10 KPX y ecircumflex -10 KPX y edieresis -10 KPX y edotaccent -10 KPX y egrave -10 KPX y emacron -10 KPX y eogonek -10 KPX y o -25 KPX y oacute -25 KPX y ocircumflex -25 KPX y odieresis -25 KPX y ograve -25 KPX y ohungarumlaut -25 KPX y omacron -25 KPX y oslash -25 KPX y otilde -25 KPX y period -80 KPX yacute a -30 KPX yacute aacute -30 KPX yacute abreve -30 KPX yacute acircumflex -30 KPX yacute adieresis -30 KPX yacute agrave -30 KPX yacute amacron -30 KPX yacute aogonek -30 KPX yacute aring -30 KPX yacute atilde -30 KPX yacute comma -80 KPX yacute e -10 KPX yacute eacute -10 KPX yacute ecaron -10 KPX yacute ecircumflex -10 KPX yacute edieresis -10 KPX yacute edotaccent -10 KPX yacute egrave -10 KPX yacute emacron -10 KPX yacute eogonek -10 KPX yacute o -25 KPX yacute oacute -25 KPX yacute ocircumflex -25 KPX yacute odieresis -25 KPX yacute ograve -25 KPX yacute ohungarumlaut -25 KPX yacute omacron -25 KPX yacute oslash -25 KPX yacute otilde -25 KPX yacute period -80 KPX ydieresis a -30 KPX ydieresis aacute -30 KPX ydieresis abreve -30 KPX ydieresis acircumflex -30 KPX ydieresis adieresis -30 KPX ydieresis agrave -30 KPX ydieresis amacron -30 KPX ydieresis aogonek -30 KPX ydieresis aring -30 KPX ydieresis atilde -30 KPX ydieresis comma -80 KPX ydieresis e -10 KPX ydieresis eacute -10 KPX ydieresis ecaron -10 KPX ydieresis ecircumflex -10 KPX ydieresis edieresis -10 KPX ydieresis edotaccent -10 KPX ydieresis egrave -10 KPX ydieresis emacron -10 KPX ydieresis eogonek -10 KPX ydieresis o -25 KPX ydieresis oacute -25 KPX ydieresis ocircumflex -25 KPX ydieresis odieresis -25 KPX ydieresis ograve -25 KPX ydieresis ohungarumlaut -25 KPX ydieresis omacron -25 KPX ydieresis oslash -25 KPX ydieresis otilde -25 KPX ydieresis period -80 KPX z e 10 KPX z eacute 10 KPX z ecaron 10 KPX z ecircumflex 10 KPX z edieresis 10 KPX z edotaccent 10 KPX z egrave 10 KPX z emacron 10 KPX z eogonek 10 KPX zacute e 10 KPX zacute eacute 10 KPX zacute ecaron 10 KPX zacute ecircumflex 10 KPX zacute edieresis 10 KPX zacute edotaccent 10 KPX zacute egrave 10 KPX zacute emacron 10 KPX zacute eogonek 10 KPX zcaron e 10 KPX zcaron eacute 10 KPX zcaron ecaron 10 KPX zcaron ecircumflex 10 KPX zcaron edieresis 10 KPX zcaron edotaccent 10 KPX zcaron egrave 10 KPX zcaron emacron 10 KPX zcaron eogonek 10 KPX zdotaccent e 10 KPX zdotaccent eacute 10 KPX zdotaccent ecaron 10 KPX zdotaccent ecircumflex 10 KPX zdotaccent edieresis 10 KPX zdotaccent edotaccent 10 KPX zdotaccent egrave 10 KPX zdotaccent emacron 10 KPX zdotaccent eogonek 10 EndKernPairs EndKernData EndFontMetrics ruby-prawn-2.1.0.orig/data/fonts/Times-Roman.afm0000644000000000000000000016605412665203156020161 0ustar rootrootStartFontMetrics 4.1 Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. Comment Creation Date: Thu May 1 12:49:17 1997 Comment UniqueID 43068 Comment VMusage 43909 54934 FontName Times-Roman FullName Times Roman FamilyName Times Weight Roman ItalicAngle 0 IsFixedPitch false CharacterSet ExtendedRoman FontBBox -168 -218 1000 898 UnderlinePosition -100 UnderlineThickness 50 Version 002.000 Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries. EncodingScheme AdobeStandardEncoding CapHeight 662 XHeight 450 Ascender 683 Descender -217 StdHW 28 StdVW 84 StartCharMetrics 315 C 32 ; WX 250 ; N space ; B 0 0 0 0 ; C 33 ; WX 333 ; N exclam ; B 130 -9 238 676 ; C 34 ; WX 408 ; N quotedbl ; B 77 431 331 676 ; C 35 ; WX 500 ; N numbersign ; B 5 0 496 662 ; C 36 ; WX 500 ; N dollar ; B 44 -87 457 727 ; C 37 ; WX 833 ; N percent ; B 61 -13 772 676 ; C 38 ; WX 778 ; N ampersand ; B 42 -13 750 676 ; C 39 ; WX 333 ; N quoteright ; B 79 433 218 676 ; C 40 ; WX 333 ; N parenleft ; B 48 -177 304 676 ; C 41 ; WX 333 ; N parenright ; B 29 -177 285 676 ; C 42 ; WX 500 ; N asterisk ; B 69 265 432 676 ; C 43 ; WX 564 ; N plus ; B 30 0 534 506 ; C 44 ; WX 250 ; N comma ; B 56 -141 195 102 ; C 45 ; WX 333 ; N hyphen ; B 39 194 285 257 ; C 46 ; WX 250 ; N period ; B 70 -11 181 100 ; C 47 ; WX 278 ; N slash ; B -9 -14 287 676 ; C 48 ; WX 500 ; N zero ; B 24 -14 476 676 ; C 49 ; WX 500 ; N one ; B 111 0 394 676 ; C 50 ; WX 500 ; N two ; B 30 0 475 676 ; C 51 ; WX 500 ; N three ; B 43 -14 431 676 ; C 52 ; WX 500 ; N four ; B 12 0 472 676 ; C 53 ; WX 500 ; N five ; B 32 -14 438 688 ; C 54 ; WX 500 ; N six ; B 34 -14 468 684 ; C 55 ; WX 500 ; N seven ; B 20 -8 449 662 ; C 56 ; WX 500 ; N eight ; B 56 -14 445 676 ; C 57 ; WX 500 ; N nine ; B 30 -22 459 676 ; C 58 ; WX 278 ; N colon ; B 81 -11 192 459 ; C 59 ; WX 278 ; N semicolon ; B 80 -141 219 459 ; C 60 ; WX 564 ; N less ; B 28 -8 536 514 ; C 61 ; WX 564 ; N equal ; B 30 120 534 386 ; C 62 ; WX 564 ; N greater ; B 28 -8 536 514 ; C 63 ; WX 444 ; N question ; B 68 -8 414 676 ; C 64 ; WX 921 ; N at ; B 116 -14 809 676 ; C 65 ; WX 722 ; N A ; B 15 0 706 674 ; C 66 ; WX 667 ; N B ; B 17 0 593 662 ; C 67 ; WX 667 ; N C ; B 28 -14 633 676 ; C 68 ; WX 722 ; N D ; B 16 0 685 662 ; C 69 ; WX 611 ; N E ; B 12 0 597 662 ; C 70 ; WX 556 ; N F ; B 12 0 546 662 ; C 71 ; WX 722 ; N G ; B 32 -14 709 676 ; C 72 ; WX 722 ; N H ; B 19 0 702 662 ; C 73 ; WX 333 ; N I ; B 18 0 315 662 ; C 74 ; WX 389 ; N J ; B 10 -14 370 662 ; C 75 ; WX 722 ; N K ; B 34 0 723 662 ; C 76 ; WX 611 ; N L ; B 12 0 598 662 ; C 77 ; WX 889 ; N M ; B 12 0 863 662 ; C 78 ; WX 722 ; N N ; B 12 -11 707 662 ; C 79 ; WX 722 ; N O ; B 34 -14 688 676 ; C 80 ; WX 556 ; N P ; B 16 0 542 662 ; C 81 ; WX 722 ; N Q ; B 34 -178 701 676 ; C 82 ; WX 667 ; N R ; B 17 0 659 662 ; C 83 ; WX 556 ; N S ; B 42 -14 491 676 ; C 84 ; WX 611 ; N T ; B 17 0 593 662 ; C 85 ; WX 722 ; N U ; B 14 -14 705 662 ; C 86 ; WX 722 ; N V ; B 16 -11 697 662 ; C 87 ; WX 944 ; N W ; B 5 -11 932 662 ; C 88 ; WX 722 ; N X ; B 10 0 704 662 ; C 89 ; WX 722 ; N Y ; B 22 0 703 662 ; C 90 ; WX 611 ; N Z ; B 9 0 597 662 ; C 91 ; WX 333 ; N bracketleft ; B 88 -156 299 662 ; C 92 ; WX 278 ; N backslash ; B -9 -14 287 676 ; C 93 ; WX 333 ; N bracketright ; B 34 -156 245 662 ; C 94 ; WX 469 ; N asciicircum ; B 24 297 446 662 ; C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; C 96 ; WX 333 ; N quoteleft ; B 115 433 254 676 ; C 97 ; WX 444 ; N a ; B 37 -10 442 460 ; C 98 ; WX 500 ; N b ; B 3 -10 468 683 ; C 99 ; WX 444 ; N c ; B 25 -10 412 460 ; C 100 ; WX 500 ; N d ; B 27 -10 491 683 ; C 101 ; WX 444 ; N e ; B 25 -10 424 460 ; C 102 ; WX 333 ; N f ; B 20 0 383 683 ; L i fi ; L l fl ; C 103 ; WX 500 ; N g ; B 28 -218 470 460 ; C 104 ; WX 500 ; N h ; B 9 0 487 683 ; C 105 ; WX 278 ; N i ; B 16 0 253 683 ; C 106 ; WX 278 ; N j ; B -70 -218 194 683 ; C 107 ; WX 500 ; N k ; B 7 0 505 683 ; C 108 ; WX 278 ; N l ; B 19 0 257 683 ; C 109 ; WX 778 ; N m ; B 16 0 775 460 ; C 110 ; WX 500 ; N n ; B 16 0 485 460 ; C 111 ; WX 500 ; N o ; B 29 -10 470 460 ; C 112 ; WX 500 ; N p ; B 5 -217 470 460 ; C 113 ; WX 500 ; N q ; B 24 -217 488 460 ; C 114 ; WX 333 ; N r ; B 5 0 335 460 ; C 115 ; WX 389 ; N s ; B 51 -10 348 460 ; C 116 ; WX 278 ; N t ; B 13 -10 279 579 ; C 117 ; WX 500 ; N u ; B 9 -10 479 450 ; C 118 ; WX 500 ; N v ; B 19 -14 477 450 ; C 119 ; WX 722 ; N w ; B 21 -14 694 450 ; C 120 ; WX 500 ; N x ; B 17 0 479 450 ; C 121 ; WX 500 ; N y ; B 14 -218 475 450 ; C 122 ; WX 444 ; N z ; B 27 0 418 450 ; C 123 ; WX 480 ; N braceleft ; B 100 -181 350 680 ; C 124 ; WX 200 ; N bar ; B 67 -218 133 782 ; C 125 ; WX 480 ; N braceright ; B 130 -181 380 680 ; C 126 ; WX 541 ; N asciitilde ; B 40 183 502 323 ; C 161 ; WX 333 ; N exclamdown ; B 97 -218 205 467 ; C 162 ; WX 500 ; N cent ; B 53 -138 448 579 ; C 163 ; WX 500 ; N sterling ; B 12 -8 490 676 ; C 164 ; WX 167 ; N fraction ; B -168 -14 331 676 ; C 165 ; WX 500 ; N yen ; B -53 0 512 662 ; C 166 ; WX 500 ; N florin ; B 7 -189 490 676 ; C 167 ; WX 500 ; N section ; B 70 -148 426 676 ; C 168 ; WX 500 ; N currency ; B -22 58 522 602 ; C 169 ; WX 180 ; N quotesingle ; B 48 431 133 676 ; C 170 ; WX 444 ; N quotedblleft ; B 43 433 414 676 ; C 171 ; WX 500 ; N guillemotleft ; B 42 33 456 416 ; C 172 ; WX 333 ; N guilsinglleft ; B 63 33 285 416 ; C 173 ; WX 333 ; N guilsinglright ; B 48 33 270 416 ; C 174 ; WX 556 ; N fi ; B 31 0 521 683 ; C 175 ; WX 556 ; N fl ; B 32 0 521 683 ; C 177 ; WX 500 ; N endash ; B 0 201 500 250 ; C 178 ; WX 500 ; N dagger ; B 59 -149 442 676 ; C 179 ; WX 500 ; N daggerdbl ; B 58 -153 442 676 ; C 180 ; WX 250 ; N periodcentered ; B 70 199 181 310 ; C 182 ; WX 453 ; N paragraph ; B -22 -154 450 662 ; C 183 ; WX 350 ; N bullet ; B 40 196 310 466 ; C 184 ; WX 333 ; N quotesinglbase ; B 79 -141 218 102 ; C 185 ; WX 444 ; N quotedblbase ; B 45 -141 416 102 ; C 186 ; WX 444 ; N quotedblright ; B 30 433 401 676 ; C 187 ; WX 500 ; N guillemotright ; B 44 33 458 416 ; C 188 ; WX 1000 ; N ellipsis ; B 111 -11 888 100 ; C 189 ; WX 1000 ; N perthousand ; B 7 -19 994 706 ; C 191 ; WX 444 ; N questiondown ; B 30 -218 376 466 ; C 193 ; WX 333 ; N grave ; B 19 507 242 678 ; C 194 ; WX 333 ; N acute ; B 93 507 317 678 ; C 195 ; WX 333 ; N circumflex ; B 11 507 322 674 ; C 196 ; WX 333 ; N tilde ; B 1 532 331 638 ; C 197 ; WX 333 ; N macron ; B 11 547 322 601 ; C 198 ; WX 333 ; N breve ; B 26 507 307 664 ; C 199 ; WX 333 ; N dotaccent ; B 118 581 216 681 ; C 200 ; WX 333 ; N dieresis ; B 18 581 315 681 ; C 202 ; WX 333 ; N ring ; B 67 512 266 711 ; C 203 ; WX 333 ; N cedilla ; B 52 -215 261 0 ; C 205 ; WX 333 ; N hungarumlaut ; B -3 507 377 678 ; C 206 ; WX 333 ; N ogonek ; B 62 -165 243 0 ; C 207 ; WX 333 ; N caron ; B 11 507 322 674 ; C 208 ; WX 1000 ; N emdash ; B 0 201 1000 250 ; C 225 ; WX 889 ; N AE ; B 0 0 863 662 ; C 227 ; WX 276 ; N ordfeminine ; B 4 394 270 676 ; C 232 ; WX 611 ; N Lslash ; B 12 0 598 662 ; C 233 ; WX 722 ; N Oslash ; B 34 -80 688 734 ; C 234 ; WX 889 ; N OE ; B 30 -6 885 668 ; C 235 ; WX 310 ; N ordmasculine ; B 6 394 304 676 ; C 241 ; WX 667 ; N ae ; B 38 -10 632 460 ; C 245 ; WX 278 ; N dotlessi ; B 16 0 253 460 ; C 248 ; WX 278 ; N lslash ; B 19 0 259 683 ; C 249 ; WX 500 ; N oslash ; B 29 -112 470 551 ; C 250 ; WX 722 ; N oe ; B 30 -10 690 460 ; C 251 ; WX 500 ; N germandbls ; B 12 -9 468 683 ; C -1 ; WX 333 ; N Idieresis ; B 18 0 315 835 ; C -1 ; WX 444 ; N eacute ; B 25 -10 424 678 ; C -1 ; WX 444 ; N abreve ; B 37 -10 442 664 ; C -1 ; WX 500 ; N uhungarumlaut ; B 9 -10 501 678 ; C -1 ; WX 444 ; N ecaron ; B 25 -10 424 674 ; C -1 ; WX 722 ; N Ydieresis ; B 22 0 703 835 ; C -1 ; WX 564 ; N divide ; B 30 -10 534 516 ; C -1 ; WX 722 ; N Yacute ; B 22 0 703 890 ; C -1 ; WX 722 ; N Acircumflex ; B 15 0 706 886 ; C -1 ; WX 444 ; N aacute ; B 37 -10 442 678 ; C -1 ; WX 722 ; N Ucircumflex ; B 14 -14 705 886 ; C -1 ; WX 500 ; N yacute ; B 14 -218 475 678 ; C -1 ; WX 389 ; N scommaaccent ; B 51 -218 348 460 ; C -1 ; WX 444 ; N ecircumflex ; B 25 -10 424 674 ; C -1 ; WX 722 ; N Uring ; B 14 -14 705 898 ; C -1 ; WX 722 ; N Udieresis ; B 14 -14 705 835 ; C -1 ; WX 444 ; N aogonek ; B 37 -165 469 460 ; C -1 ; WX 722 ; N Uacute ; B 14 -14 705 890 ; C -1 ; WX 500 ; N uogonek ; B 9 -155 487 450 ; C -1 ; WX 611 ; N Edieresis ; B 12 0 597 835 ; C -1 ; WX 722 ; N Dcroat ; B 16 0 685 662 ; C -1 ; WX 250 ; N commaaccent ; B 59 -218 184 -50 ; C -1 ; WX 760 ; N copyright ; B 38 -14 722 676 ; C -1 ; WX 611 ; N Emacron ; B 12 0 597 813 ; C -1 ; WX 444 ; N ccaron ; B 25 -10 412 674 ; C -1 ; WX 444 ; N aring ; B 37 -10 442 711 ; C -1 ; WX 722 ; N Ncommaaccent ; B 12 -198 707 662 ; C -1 ; WX 278 ; N lacute ; B 19 0 290 890 ; C -1 ; WX 444 ; N agrave ; B 37 -10 442 678 ; C -1 ; WX 611 ; N Tcommaaccent ; B 17 -218 593 662 ; C -1 ; WX 667 ; N Cacute ; B 28 -14 633 890 ; C -1 ; WX 444 ; N atilde ; B 37 -10 442 638 ; C -1 ; WX 611 ; N Edotaccent ; B 12 0 597 835 ; C -1 ; WX 389 ; N scaron ; B 39 -10 350 674 ; C -1 ; WX 389 ; N scedilla ; B 51 -215 348 460 ; C -1 ; WX 278 ; N iacute ; B 16 0 290 678 ; C -1 ; WX 471 ; N lozenge ; B 13 0 459 724 ; C -1 ; WX 667 ; N Rcaron ; B 17 0 659 886 ; C -1 ; WX 722 ; N Gcommaaccent ; B 32 -218 709 676 ; C -1 ; WX 500 ; N ucircumflex ; B 9 -10 479 674 ; C -1 ; WX 444 ; N acircumflex ; B 37 -10 442 674 ; C -1 ; WX 722 ; N Amacron ; B 15 0 706 813 ; C -1 ; WX 333 ; N rcaron ; B 5 0 335 674 ; C -1 ; WX 444 ; N ccedilla ; B 25 -215 412 460 ; C -1 ; WX 611 ; N Zdotaccent ; B 9 0 597 835 ; C -1 ; WX 556 ; N Thorn ; B 16 0 542 662 ; C -1 ; WX 722 ; N Omacron ; B 34 -14 688 813 ; C -1 ; WX 667 ; N Racute ; B 17 0 659 890 ; C -1 ; WX 556 ; N Sacute ; B 42 -14 491 890 ; C -1 ; WX 588 ; N dcaron ; B 27 -10 589 695 ; C -1 ; WX 722 ; N Umacron ; B 14 -14 705 813 ; C -1 ; WX 500 ; N uring ; B 9 -10 479 711 ; C -1 ; WX 300 ; N threesuperior ; B 15 262 291 676 ; C -1 ; WX 722 ; N Ograve ; B 34 -14 688 890 ; C -1 ; WX 722 ; N Agrave ; B 15 0 706 890 ; C -1 ; WX 722 ; N Abreve ; B 15 0 706 876 ; C -1 ; WX 564 ; N multiply ; B 38 8 527 497 ; C -1 ; WX 500 ; N uacute ; B 9 -10 479 678 ; C -1 ; WX 611 ; N Tcaron ; B 17 0 593 886 ; C -1 ; WX 476 ; N partialdiff ; B 17 -38 459 710 ; C -1 ; WX 500 ; N ydieresis ; B 14 -218 475 623 ; C -1 ; WX 722 ; N Nacute ; B 12 -11 707 890 ; C -1 ; WX 278 ; N icircumflex ; B -16 0 295 674 ; C -1 ; WX 611 ; N Ecircumflex ; B 12 0 597 886 ; C -1 ; WX 444 ; N adieresis ; B 37 -10 442 623 ; C -1 ; WX 444 ; N edieresis ; B 25 -10 424 623 ; C -1 ; WX 444 ; N cacute ; B 25 -10 413 678 ; C -1 ; WX 500 ; N nacute ; B 16 0 485 678 ; C -1 ; WX 500 ; N umacron ; B 9 -10 479 601 ; C -1 ; WX 722 ; N Ncaron ; B 12 -11 707 886 ; C -1 ; WX 333 ; N Iacute ; B 18 0 317 890 ; C -1 ; WX 564 ; N plusminus ; B 30 0 534 506 ; C -1 ; WX 200 ; N brokenbar ; B 67 -143 133 707 ; C -1 ; WX 760 ; N registered ; B 38 -14 722 676 ; C -1 ; WX 722 ; N Gbreve ; B 32 -14 709 876 ; C -1 ; WX 333 ; N Idotaccent ; B 18 0 315 835 ; C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ; C -1 ; WX 611 ; N Egrave ; B 12 0 597 890 ; C -1 ; WX 333 ; N racute ; B 5 0 335 678 ; C -1 ; WX 500 ; N omacron ; B 29 -10 470 601 ; C -1 ; WX 611 ; N Zacute ; B 9 0 597 890 ; C -1 ; WX 611 ; N Zcaron ; B 9 0 597 886 ; C -1 ; WX 549 ; N greaterequal ; B 26 0 523 666 ; C -1 ; WX 722 ; N Eth ; B 16 0 685 662 ; C -1 ; WX 667 ; N Ccedilla ; B 28 -215 633 676 ; C -1 ; WX 278 ; N lcommaaccent ; B 19 -218 257 683 ; C -1 ; WX 326 ; N tcaron ; B 13 -10 318 722 ; C -1 ; WX 444 ; N eogonek ; B 25 -165 424 460 ; C -1 ; WX 722 ; N Uogonek ; B 14 -165 705 662 ; C -1 ; WX 722 ; N Aacute ; B 15 0 706 890 ; C -1 ; WX 722 ; N Adieresis ; B 15 0 706 835 ; C -1 ; WX 444 ; N egrave ; B 25 -10 424 678 ; C -1 ; WX 444 ; N zacute ; B 27 0 418 678 ; C -1 ; WX 278 ; N iogonek ; B 16 -165 265 683 ; C -1 ; WX 722 ; N Oacute ; B 34 -14 688 890 ; C -1 ; WX 500 ; N oacute ; B 29 -10 470 678 ; C -1 ; WX 444 ; N amacron ; B 37 -10 442 601 ; C -1 ; WX 389 ; N sacute ; B 51 -10 348 678 ; C -1 ; WX 278 ; N idieresis ; B -9 0 288 623 ; C -1 ; WX 722 ; N Ocircumflex ; B 34 -14 688 886 ; C -1 ; WX 722 ; N Ugrave ; B 14 -14 705 890 ; C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; C -1 ; WX 500 ; N thorn ; B 5 -217 470 683 ; C -1 ; WX 300 ; N twosuperior ; B 1 270 296 676 ; C -1 ; WX 722 ; N Odieresis ; B 34 -14 688 835 ; C -1 ; WX 500 ; N mu ; B 36 -218 512 450 ; C -1 ; WX 278 ; N igrave ; B -8 0 253 678 ; C -1 ; WX 500 ; N ohungarumlaut ; B 29 -10 491 678 ; C -1 ; WX 611 ; N Eogonek ; B 12 -165 597 662 ; C -1 ; WX 500 ; N dcroat ; B 27 -10 500 683 ; C -1 ; WX 750 ; N threequarters ; B 15 -14 718 676 ; C -1 ; WX 556 ; N Scedilla ; B 42 -215 491 676 ; C -1 ; WX 344 ; N lcaron ; B 19 0 347 695 ; C -1 ; WX 722 ; N Kcommaaccent ; B 34 -198 723 662 ; C -1 ; WX 611 ; N Lacute ; B 12 0 598 890 ; C -1 ; WX 980 ; N trademark ; B 30 256 957 662 ; C -1 ; WX 444 ; N edotaccent ; B 25 -10 424 623 ; C -1 ; WX 333 ; N Igrave ; B 18 0 315 890 ; C -1 ; WX 333 ; N Imacron ; B 11 0 322 813 ; C -1 ; WX 611 ; N Lcaron ; B 12 0 598 676 ; C -1 ; WX 750 ; N onehalf ; B 31 -14 746 676 ; C -1 ; WX 549 ; N lessequal ; B 26 0 523 666 ; C -1 ; WX 500 ; N ocircumflex ; B 29 -10 470 674 ; C -1 ; WX 500 ; N ntilde ; B 16 0 485 638 ; C -1 ; WX 722 ; N Uhungarumlaut ; B 14 -14 705 890 ; C -1 ; WX 611 ; N Eacute ; B 12 0 597 890 ; C -1 ; WX 444 ; N emacron ; B 25 -10 424 601 ; C -1 ; WX 500 ; N gbreve ; B 28 -218 470 664 ; C -1 ; WX 750 ; N onequarter ; B 37 -14 718 676 ; C -1 ; WX 556 ; N Scaron ; B 42 -14 491 886 ; C -1 ; WX 556 ; N Scommaaccent ; B 42 -218 491 676 ; C -1 ; WX 722 ; N Ohungarumlaut ; B 34 -14 688 890 ; C -1 ; WX 400 ; N degree ; B 57 390 343 676 ; C -1 ; WX 500 ; N ograve ; B 29 -10 470 678 ; C -1 ; WX 667 ; N Ccaron ; B 28 -14 633 886 ; C -1 ; WX 500 ; N ugrave ; B 9 -10 479 678 ; C -1 ; WX 453 ; N radical ; B 2 -60 452 768 ; C -1 ; WX 722 ; N Dcaron ; B 16 0 685 886 ; C -1 ; WX 333 ; N rcommaaccent ; B 5 -218 335 460 ; C -1 ; WX 722 ; N Ntilde ; B 12 -11 707 850 ; C -1 ; WX 500 ; N otilde ; B 29 -10 470 638 ; C -1 ; WX 667 ; N Rcommaaccent ; B 17 -198 659 662 ; C -1 ; WX 611 ; N Lcommaaccent ; B 12 -218 598 662 ; C -1 ; WX 722 ; N Atilde ; B 15 0 706 850 ; C -1 ; WX 722 ; N Aogonek ; B 15 -165 738 674 ; C -1 ; WX 722 ; N Aring ; B 15 0 706 898 ; C -1 ; WX 722 ; N Otilde ; B 34 -14 688 850 ; C -1 ; WX 444 ; N zdotaccent ; B 27 0 418 623 ; C -1 ; WX 611 ; N Ecaron ; B 12 0 597 886 ; C -1 ; WX 333 ; N Iogonek ; B 18 -165 315 662 ; C -1 ; WX 500 ; N kcommaaccent ; B 7 -218 505 683 ; C -1 ; WX 564 ; N minus ; B 30 220 534 286 ; C -1 ; WX 333 ; N Icircumflex ; B 11 0 322 886 ; C -1 ; WX 500 ; N ncaron ; B 16 0 485 674 ; C -1 ; WX 278 ; N tcommaaccent ; B 13 -218 279 579 ; C -1 ; WX 564 ; N logicalnot ; B 30 108 534 386 ; C -1 ; WX 500 ; N odieresis ; B 29 -10 470 623 ; C -1 ; WX 500 ; N udieresis ; B 9 -10 479 623 ; C -1 ; WX 549 ; N notequal ; B 12 -31 537 547 ; C -1 ; WX 500 ; N gcommaaccent ; B 28 -218 470 749 ; C -1 ; WX 500 ; N eth ; B 29 -10 471 686 ; C -1 ; WX 444 ; N zcaron ; B 27 0 418 674 ; C -1 ; WX 500 ; N ncommaaccent ; B 16 -218 485 460 ; C -1 ; WX 300 ; N onesuperior ; B 57 270 248 676 ; C -1 ; WX 278 ; N imacron ; B 6 0 271 601 ; C -1 ; WX 500 ; N Euro ; B 0 0 0 0 ; EndCharMetrics StartKernData StartKernPairs 2073 KPX A C -40 KPX A Cacute -40 KPX A Ccaron -40 KPX A Ccedilla -40 KPX A G -40 KPX A Gbreve -40 KPX A Gcommaaccent -40 KPX A O -55 KPX A Oacute -55 KPX A Ocircumflex -55 KPX A Odieresis -55 KPX A Ograve -55 KPX A Ohungarumlaut -55 KPX A Omacron -55 KPX A Oslash -55 KPX A Otilde -55 KPX A Q -55 KPX A T -111 KPX A Tcaron -111 KPX A Tcommaaccent -111 KPX A U -55 KPX A Uacute -55 KPX A Ucircumflex -55 KPX A Udieresis -55 KPX A Ugrave -55 KPX A Uhungarumlaut -55 KPX A Umacron -55 KPX A Uogonek -55 KPX A Uring -55 KPX A V -135 KPX A W -90 KPX A Y -105 KPX A Yacute -105 KPX A Ydieresis -105 KPX A quoteright -111 KPX A v -74 KPX A w -92 KPX A y -92 KPX A yacute -92 KPX A ydieresis -92 KPX Aacute C -40 KPX Aacute Cacute -40 KPX Aacute Ccaron -40 KPX Aacute Ccedilla -40 KPX Aacute G -40 KPX Aacute Gbreve -40 KPX Aacute Gcommaaccent -40 KPX Aacute O -55 KPX Aacute Oacute -55 KPX Aacute Ocircumflex -55 KPX Aacute Odieresis -55 KPX Aacute Ograve -55 KPX Aacute Ohungarumlaut -55 KPX Aacute Omacron -55 KPX Aacute Oslash -55 KPX Aacute Otilde -55 KPX Aacute Q -55 KPX Aacute T -111 KPX Aacute Tcaron -111 KPX Aacute Tcommaaccent -111 KPX Aacute U -55 KPX Aacute Uacute -55 KPX Aacute Ucircumflex -55 KPX Aacute Udieresis -55 KPX Aacute Ugrave -55 KPX Aacute Uhungarumlaut -55 KPX Aacute Umacron -55 KPX Aacute Uogonek -55 KPX Aacute Uring -55 KPX Aacute V -135 KPX Aacute W -90 KPX Aacute Y -105 KPX Aacute Yacute -105 KPX Aacute Ydieresis -105 KPX Aacute quoteright -111 KPX Aacute v -74 KPX Aacute w -92 KPX Aacute y -92 KPX Aacute yacute -92 KPX Aacute ydieresis -92 KPX Abreve C -40 KPX Abreve Cacute -40 KPX Abreve Ccaron -40 KPX Abreve Ccedilla -40 KPX Abreve G -40 KPX Abreve Gbreve -40 KPX Abreve Gcommaaccent -40 KPX Abreve O -55 KPX Abreve Oacute -55 KPX Abreve Ocircumflex -55 KPX Abreve Odieresis -55 KPX Abreve Ograve -55 KPX Abreve Ohungarumlaut -55 KPX Abreve Omacron -55 KPX Abreve Oslash -55 KPX Abreve Otilde -55 KPX Abreve Q -55 KPX Abreve T -111 KPX Abreve Tcaron -111 KPX Abreve Tcommaaccent -111 KPX Abreve U -55 KPX Abreve Uacute -55 KPX Abreve Ucircumflex -55 KPX Abreve Udieresis -55 KPX Abreve Ugrave -55 KPX Abreve Uhungarumlaut -55 KPX Abreve Umacron -55 KPX Abreve Uogonek -55 KPX Abreve Uring -55 KPX Abreve V -135 KPX Abreve W -90 KPX Abreve Y -105 KPX Abreve Yacute -105 KPX Abreve Ydieresis -105 KPX Abreve quoteright -111 KPX Abreve v -74 KPX Abreve w -92 KPX Abreve y -92 KPX Abreve yacute -92 KPX Abreve ydieresis -92 KPX Acircumflex C -40 KPX Acircumflex Cacute -40 KPX Acircumflex Ccaron -40 KPX Acircumflex Ccedilla -40 KPX Acircumflex G -40 KPX Acircumflex Gbreve -40 KPX Acircumflex Gcommaaccent -40 KPX Acircumflex O -55 KPX Acircumflex Oacute -55 KPX Acircumflex Ocircumflex -55 KPX Acircumflex Odieresis -55 KPX Acircumflex Ograve -55 KPX Acircumflex Ohungarumlaut -55 KPX Acircumflex Omacron -55 KPX Acircumflex Oslash -55 KPX Acircumflex Otilde -55 KPX Acircumflex Q -55 KPX Acircumflex T -111 KPX Acircumflex Tcaron -111 KPX Acircumflex Tcommaaccent -111 KPX Acircumflex U -55 KPX Acircumflex Uacute -55 KPX Acircumflex Ucircumflex -55 KPX Acircumflex Udieresis -55 KPX Acircumflex Ugrave -55 KPX Acircumflex Uhungarumlaut -55 KPX Acircumflex Umacron -55 KPX Acircumflex Uogonek -55 KPX Acircumflex Uring -55 KPX Acircumflex V -135 KPX Acircumflex W -90 KPX Acircumflex Y -105 KPX Acircumflex Yacute -105 KPX Acircumflex Ydieresis -105 KPX Acircumflex quoteright -111 KPX Acircumflex v -74 KPX Acircumflex w -92 KPX Acircumflex y -92 KPX Acircumflex yacute -92 KPX Acircumflex ydieresis -92 KPX Adieresis C -40 KPX Adieresis Cacute -40 KPX Adieresis Ccaron -40 KPX Adieresis Ccedilla -40 KPX Adieresis G -40 KPX Adieresis Gbreve -40 KPX Adieresis Gcommaaccent -40 KPX Adieresis O -55 KPX Adieresis Oacute -55 KPX Adieresis Ocircumflex -55 KPX Adieresis Odieresis -55 KPX Adieresis Ograve -55 KPX Adieresis Ohungarumlaut -55 KPX Adieresis Omacron -55 KPX Adieresis Oslash -55 KPX Adieresis Otilde -55 KPX Adieresis Q -55 KPX Adieresis T -111 KPX Adieresis Tcaron -111 KPX Adieresis Tcommaaccent -111 KPX Adieresis U -55 KPX Adieresis Uacute -55 KPX Adieresis Ucircumflex -55 KPX Adieresis Udieresis -55 KPX Adieresis Ugrave -55 KPX Adieresis Uhungarumlaut -55 KPX Adieresis Umacron -55 KPX Adieresis Uogonek -55 KPX Adieresis Uring -55 KPX Adieresis V -135 KPX Adieresis W -90 KPX Adieresis Y -105 KPX Adieresis Yacute -105 KPX Adieresis Ydieresis -105 KPX Adieresis quoteright -111 KPX Adieresis v -74 KPX Adieresis w -92 KPX Adieresis y -92 KPX Adieresis yacute -92 KPX Adieresis ydieresis -92 KPX Agrave C -40 KPX Agrave Cacute -40 KPX Agrave Ccaron -40 KPX Agrave Ccedilla -40 KPX Agrave G -40 KPX Agrave Gbreve -40 KPX Agrave Gcommaaccent -40 KPX Agrave O -55 KPX Agrave Oacute -55 KPX Agrave Ocircumflex -55 KPX Agrave Odieresis -55 KPX Agrave Ograve -55 KPX Agrave Ohungarumlaut -55 KPX Agrave Omacron -55 KPX Agrave Oslash -55 KPX Agrave Otilde -55 KPX Agrave Q -55 KPX Agrave T -111 KPX Agrave Tcaron -111 KPX Agrave Tcommaaccent -111 KPX Agrave U -55 KPX Agrave Uacute -55 KPX Agrave Ucircumflex -55 KPX Agrave Udieresis -55 KPX Agrave Ugrave -55 KPX Agrave Uhungarumlaut -55 KPX Agrave Umacron -55 KPX Agrave Uogonek -55 KPX Agrave Uring -55 KPX Agrave V -135 KPX Agrave W -90 KPX Agrave Y -105 KPX Agrave Yacute -105 KPX Agrave Ydieresis -105 KPX Agrave quoteright -111 KPX Agrave v -74 KPX Agrave w -92 KPX Agrave y -92 KPX Agrave yacute -92 KPX Agrave ydieresis -92 KPX Amacron C -40 KPX Amacron Cacute -40 KPX Amacron Ccaron -40 KPX Amacron Ccedilla -40 KPX Amacron G -40 KPX Amacron Gbreve -40 KPX Amacron Gcommaaccent -40 KPX Amacron O -55 KPX Amacron Oacute -55 KPX Amacron Ocircumflex -55 KPX Amacron Odieresis -55 KPX Amacron Ograve -55 KPX Amacron Ohungarumlaut -55 KPX Amacron Omacron -55 KPX Amacron Oslash -55 KPX Amacron Otilde -55 KPX Amacron Q -55 KPX Amacron T -111 KPX Amacron Tcaron -111 KPX Amacron Tcommaaccent -111 KPX Amacron U -55 KPX Amacron Uacute -55 KPX Amacron Ucircumflex -55 KPX Amacron Udieresis -55 KPX Amacron Ugrave -55 KPX Amacron Uhungarumlaut -55 KPX Amacron Umacron -55 KPX Amacron Uogonek -55 KPX Amacron Uring -55 KPX Amacron V -135 KPX Amacron W -90 KPX Amacron Y -105 KPX Amacron Yacute -105 KPX Amacron Ydieresis -105 KPX Amacron quoteright -111 KPX Amacron v -74 KPX Amacron w -92 KPX Amacron y -92 KPX Amacron yacute -92 KPX Amacron ydieresis -92 KPX Aogonek C -40 KPX Aogonek Cacute -40 KPX Aogonek Ccaron -40 KPX Aogonek Ccedilla -40 KPX Aogonek G -40 KPX Aogonek Gbreve -40 KPX Aogonek Gcommaaccent -40 KPX Aogonek O -55 KPX Aogonek Oacute -55 KPX Aogonek Ocircumflex -55 KPX Aogonek Odieresis -55 KPX Aogonek Ograve -55 KPX Aogonek Ohungarumlaut -55 KPX Aogonek Omacron -55 KPX Aogonek Oslash -55 KPX Aogonek Otilde -55 KPX Aogonek Q -55 KPX Aogonek T -111 KPX Aogonek Tcaron -111 KPX Aogonek Tcommaaccent -111 KPX Aogonek U -55 KPX Aogonek Uacute -55 KPX Aogonek Ucircumflex -55 KPX Aogonek Udieresis -55 KPX Aogonek Ugrave -55 KPX Aogonek Uhungarumlaut -55 KPX Aogonek Umacron -55 KPX Aogonek Uogonek -55 KPX Aogonek Uring -55 KPX Aogonek V -135 KPX Aogonek W -90 KPX Aogonek Y -105 KPX Aogonek Yacute -105 KPX Aogonek Ydieresis -105 KPX Aogonek quoteright -111 KPX Aogonek v -74 KPX Aogonek w -52 KPX Aogonek y -52 KPX Aogonek yacute -52 KPX Aogonek ydieresis -52 KPX Aring C -40 KPX Aring Cacute -40 KPX Aring Ccaron -40 KPX Aring Ccedilla -40 KPX Aring G -40 KPX Aring Gbreve -40 KPX Aring Gcommaaccent -40 KPX Aring O -55 KPX Aring Oacute -55 KPX Aring Ocircumflex -55 KPX Aring Odieresis -55 KPX Aring Ograve -55 KPX Aring Ohungarumlaut -55 KPX Aring Omacron -55 KPX Aring Oslash -55 KPX Aring Otilde -55 KPX Aring Q -55 KPX Aring T -111 KPX Aring Tcaron -111 KPX Aring Tcommaaccent -111 KPX Aring U -55 KPX Aring Uacute -55 KPX Aring Ucircumflex -55 KPX Aring Udieresis -55 KPX Aring Ugrave -55 KPX Aring Uhungarumlaut -55 KPX Aring Umacron -55 KPX Aring Uogonek -55 KPX Aring Uring -55 KPX Aring V -135 KPX Aring W -90 KPX Aring Y -105 KPX Aring Yacute -105 KPX Aring Ydieresis -105 KPX Aring quoteright -111 KPX Aring v -74 KPX Aring w -92 KPX Aring y -92 KPX Aring yacute -92 KPX Aring ydieresis -92 KPX Atilde C -40 KPX Atilde Cacute -40 KPX Atilde Ccaron -40 KPX Atilde Ccedilla -40 KPX Atilde G -40 KPX Atilde Gbreve -40 KPX Atilde Gcommaaccent -40 KPX Atilde O -55 KPX Atilde Oacute -55 KPX Atilde Ocircumflex -55 KPX Atilde Odieresis -55 KPX Atilde Ograve -55 KPX Atilde Ohungarumlaut -55 KPX Atilde Omacron -55 KPX Atilde Oslash -55 KPX Atilde Otilde -55 KPX Atilde Q -55 KPX Atilde T -111 KPX Atilde Tcaron -111 KPX Atilde Tcommaaccent -111 KPX Atilde U -55 KPX Atilde Uacute -55 KPX Atilde Ucircumflex -55 KPX Atilde Udieresis -55 KPX Atilde Ugrave -55 KPX Atilde Uhungarumlaut -55 KPX Atilde Umacron -55 KPX Atilde Uogonek -55 KPX Atilde Uring -55 KPX Atilde V -135 KPX Atilde W -90 KPX Atilde Y -105 KPX Atilde Yacute -105 KPX Atilde Ydieresis -105 KPX Atilde quoteright -111 KPX Atilde v -74 KPX Atilde w -92 KPX Atilde y -92 KPX Atilde yacute -92 KPX Atilde ydieresis -92 KPX B A -35 KPX B Aacute -35 KPX B Abreve -35 KPX B Acircumflex -35 KPX B Adieresis -35 KPX B Agrave -35 KPX B Amacron -35 KPX B Aogonek -35 KPX B Aring -35 KPX B Atilde -35 KPX B U -10 KPX B Uacute -10 KPX B Ucircumflex -10 KPX B Udieresis -10 KPX B Ugrave -10 KPX B Uhungarumlaut -10 KPX B Umacron -10 KPX B Uogonek -10 KPX B Uring -10 KPX D A -40 KPX D Aacute -40 KPX D Abreve -40 KPX D Acircumflex -40 KPX D Adieresis -40 KPX D Agrave -40 KPX D Amacron -40 KPX D Aogonek -40 KPX D Aring -40 KPX D Atilde -40 KPX D V -40 KPX D W -30 KPX D Y -55 KPX D Yacute -55 KPX D Ydieresis -55 KPX Dcaron A -40 KPX Dcaron Aacute -40 KPX Dcaron Abreve -40 KPX Dcaron Acircumflex -40 KPX Dcaron Adieresis -40 KPX Dcaron Agrave -40 KPX Dcaron Amacron -40 KPX Dcaron Aogonek -40 KPX Dcaron Aring -40 KPX Dcaron Atilde -40 KPX Dcaron V -40 KPX Dcaron W -30 KPX Dcaron Y -55 KPX Dcaron Yacute -55 KPX Dcaron Ydieresis -55 KPX Dcroat A -40 KPX Dcroat Aacute -40 KPX Dcroat Abreve -40 KPX Dcroat Acircumflex -40 KPX Dcroat Adieresis -40 KPX Dcroat Agrave -40 KPX Dcroat Amacron -40 KPX Dcroat Aogonek -40 KPX Dcroat Aring -40 KPX Dcroat Atilde -40 KPX Dcroat V -40 KPX Dcroat W -30 KPX Dcroat Y -55 KPX Dcroat Yacute -55 KPX Dcroat Ydieresis -55 KPX F A -74 KPX F Aacute -74 KPX F Abreve -74 KPX F Acircumflex -74 KPX F Adieresis -74 KPX F Agrave -74 KPX F Amacron -74 KPX F Aogonek -74 KPX F Aring -74 KPX F Atilde -74 KPX F a -15 KPX F aacute -15 KPX F abreve -15 KPX F acircumflex -15 KPX F adieresis -15 KPX F agrave -15 KPX F amacron -15 KPX F aogonek -15 KPX F aring -15 KPX F atilde -15 KPX F comma -80 KPX F o -15 KPX F oacute -15 KPX F ocircumflex -15 KPX F odieresis -15 KPX F ograve -15 KPX F ohungarumlaut -15 KPX F omacron -15 KPX F oslash -15 KPX F otilde -15 KPX F period -80 KPX J A -60 KPX J Aacute -60 KPX J Abreve -60 KPX J Acircumflex -60 KPX J Adieresis -60 KPX J Agrave -60 KPX J Amacron -60 KPX J Aogonek -60 KPX J Aring -60 KPX J Atilde -60 KPX K O -30 KPX K Oacute -30 KPX K Ocircumflex -30 KPX K Odieresis -30 KPX K Ograve -30 KPX K Ohungarumlaut -30 KPX K Omacron -30 KPX K Oslash -30 KPX K Otilde -30 KPX K e -25 KPX K eacute -25 KPX K ecaron -25 KPX K ecircumflex -25 KPX K edieresis -25 KPX K edotaccent -25 KPX K egrave -25 KPX K emacron -25 KPX K eogonek -25 KPX K o -35 KPX K oacute -35 KPX K ocircumflex -35 KPX K odieresis -35 KPX K ograve -35 KPX K ohungarumlaut -35 KPX K omacron -35 KPX K oslash -35 KPX K otilde -35 KPX K u -15 KPX K uacute -15 KPX K ucircumflex -15 KPX K udieresis -15 KPX K ugrave -15 KPX K uhungarumlaut -15 KPX K umacron -15 KPX K uogonek -15 KPX K uring -15 KPX K y -25 KPX K yacute -25 KPX K ydieresis -25 KPX Kcommaaccent O -30 KPX Kcommaaccent Oacute -30 KPX Kcommaaccent Ocircumflex -30 KPX Kcommaaccent Odieresis -30 KPX Kcommaaccent Ograve -30 KPX Kcommaaccent Ohungarumlaut -30 KPX Kcommaaccent Omacron -30 KPX Kcommaaccent Oslash -30 KPX Kcommaaccent Otilde -30 KPX Kcommaaccent e -25 KPX Kcommaaccent eacute -25 KPX Kcommaaccent ecaron -25 KPX Kcommaaccent ecircumflex -25 KPX Kcommaaccent edieresis -25 KPX Kcommaaccent edotaccent -25 KPX Kcommaaccent egrave -25 KPX Kcommaaccent emacron -25 KPX Kcommaaccent eogonek -25 KPX Kcommaaccent o -35 KPX Kcommaaccent oacute -35 KPX Kcommaaccent ocircumflex -35 KPX Kcommaaccent odieresis -35 KPX Kcommaaccent ograve -35 KPX Kcommaaccent ohungarumlaut -35 KPX Kcommaaccent omacron -35 KPX Kcommaaccent oslash -35 KPX Kcommaaccent otilde -35 KPX Kcommaaccent u -15 KPX Kcommaaccent uacute -15 KPX Kcommaaccent ucircumflex -15 KPX Kcommaaccent udieresis -15 KPX Kcommaaccent ugrave -15 KPX Kcommaaccent uhungarumlaut -15 KPX Kcommaaccent umacron -15 KPX Kcommaaccent uogonek -15 KPX Kcommaaccent uring -15 KPX Kcommaaccent y -25 KPX Kcommaaccent yacute -25 KPX Kcommaaccent ydieresis -25 KPX L T -92 KPX L Tcaron -92 KPX L Tcommaaccent -92 KPX L V -100 KPX L W -74 KPX L Y -100 KPX L Yacute -100 KPX L Ydieresis -100 KPX L quoteright -92 KPX L y -55 KPX L yacute -55 KPX L ydieresis -55 KPX Lacute T -92 KPX Lacute Tcaron -92 KPX Lacute Tcommaaccent -92 KPX Lacute V -100 KPX Lacute W -74 KPX Lacute Y -100 KPX Lacute Yacute -100 KPX Lacute Ydieresis -100 KPX Lacute quoteright -92 KPX Lacute y -55 KPX Lacute yacute -55 KPX Lacute ydieresis -55 KPX Lcaron quoteright -92 KPX Lcaron y -55 KPX Lcaron yacute -55 KPX Lcaron ydieresis -55 KPX Lcommaaccent T -92 KPX Lcommaaccent Tcaron -92 KPX Lcommaaccent Tcommaaccent -92 KPX Lcommaaccent V -100 KPX Lcommaaccent W -74 KPX Lcommaaccent Y -100 KPX Lcommaaccent Yacute -100 KPX Lcommaaccent Ydieresis -100 KPX Lcommaaccent quoteright -92 KPX Lcommaaccent y -55 KPX Lcommaaccent yacute -55 KPX Lcommaaccent ydieresis -55 KPX Lslash T -92 KPX Lslash Tcaron -92 KPX Lslash Tcommaaccent -92 KPX Lslash V -100 KPX Lslash W -74 KPX Lslash Y -100 KPX Lslash Yacute -100 KPX Lslash Ydieresis -100 KPX Lslash quoteright -92 KPX Lslash y -55 KPX Lslash yacute -55 KPX Lslash ydieresis -55 KPX N A -35 KPX N Aacute -35 KPX N Abreve -35 KPX N Acircumflex -35 KPX N Adieresis -35 KPX N Agrave -35 KPX N Amacron -35 KPX N Aogonek -35 KPX N Aring -35 KPX N Atilde -35 KPX Nacute A -35 KPX Nacute Aacute -35 KPX Nacute Abreve -35 KPX Nacute Acircumflex -35 KPX Nacute Adieresis -35 KPX Nacute Agrave -35 KPX Nacute Amacron -35 KPX Nacute Aogonek -35 KPX Nacute Aring -35 KPX Nacute Atilde -35 KPX Ncaron A -35 KPX Ncaron Aacute -35 KPX Ncaron Abreve -35 KPX Ncaron Acircumflex -35 KPX Ncaron Adieresis -35 KPX Ncaron Agrave -35 KPX Ncaron Amacron -35 KPX Ncaron Aogonek -35 KPX Ncaron Aring -35 KPX Ncaron Atilde -35 KPX Ncommaaccent A -35 KPX Ncommaaccent Aacute -35 KPX Ncommaaccent Abreve -35 KPX Ncommaaccent Acircumflex -35 KPX Ncommaaccent Adieresis -35 KPX Ncommaaccent Agrave -35 KPX Ncommaaccent Amacron -35 KPX Ncommaaccent Aogonek -35 KPX Ncommaaccent Aring -35 KPX Ncommaaccent Atilde -35 KPX Ntilde A -35 KPX Ntilde Aacute -35 KPX Ntilde Abreve -35 KPX Ntilde Acircumflex -35 KPX Ntilde Adieresis -35 KPX Ntilde Agrave -35 KPX Ntilde Amacron -35 KPX Ntilde Aogonek -35 KPX Ntilde Aring -35 KPX Ntilde Atilde -35 KPX O A -35 KPX O Aacute -35 KPX O Abreve -35 KPX O Acircumflex -35 KPX O Adieresis -35 KPX O Agrave -35 KPX O Amacron -35 KPX O Aogonek -35 KPX O Aring -35 KPX O Atilde -35 KPX O T -40 KPX O Tcaron -40 KPX O Tcommaaccent -40 KPX O V -50 KPX O W -35 KPX O X -40 KPX O Y -50 KPX O Yacute -50 KPX O Ydieresis -50 KPX Oacute A -35 KPX Oacute Aacute -35 KPX Oacute Abreve -35 KPX Oacute Acircumflex -35 KPX Oacute Adieresis -35 KPX Oacute Agrave -35 KPX Oacute Amacron -35 KPX Oacute Aogonek -35 KPX Oacute Aring -35 KPX Oacute Atilde -35 KPX Oacute T -40 KPX Oacute Tcaron -40 KPX Oacute Tcommaaccent -40 KPX Oacute V -50 KPX Oacute W -35 KPX Oacute X -40 KPX Oacute Y -50 KPX Oacute Yacute -50 KPX Oacute Ydieresis -50 KPX Ocircumflex A -35 KPX Ocircumflex Aacute -35 KPX Ocircumflex Abreve -35 KPX Ocircumflex Acircumflex -35 KPX Ocircumflex Adieresis -35 KPX Ocircumflex Agrave -35 KPX Ocircumflex Amacron -35 KPX Ocircumflex Aogonek -35 KPX Ocircumflex Aring -35 KPX Ocircumflex Atilde -35 KPX Ocircumflex T -40 KPX Ocircumflex Tcaron -40 KPX Ocircumflex Tcommaaccent -40 KPX Ocircumflex V -50 KPX Ocircumflex W -35 KPX Ocircumflex X -40 KPX Ocircumflex Y -50 KPX Ocircumflex Yacute -50 KPX Ocircumflex Ydieresis -50 KPX Odieresis A -35 KPX Odieresis Aacute -35 KPX Odieresis Abreve -35 KPX Odieresis Acircumflex -35 KPX Odieresis Adieresis -35 KPX Odieresis Agrave -35 KPX Odieresis Amacron -35 KPX Odieresis Aogonek -35 KPX Odieresis Aring -35 KPX Odieresis Atilde -35 KPX Odieresis T -40 KPX Odieresis Tcaron -40 KPX Odieresis Tcommaaccent -40 KPX Odieresis V -50 KPX Odieresis W -35 KPX Odieresis X -40 KPX Odieresis Y -50 KPX Odieresis Yacute -50 KPX Odieresis Ydieresis -50 KPX Ograve A -35 KPX Ograve Aacute -35 KPX Ograve Abreve -35 KPX Ograve Acircumflex -35 KPX Ograve Adieresis -35 KPX Ograve Agrave -35 KPX Ograve Amacron -35 KPX Ograve Aogonek -35 KPX Ograve Aring -35 KPX Ograve Atilde -35 KPX Ograve T -40 KPX Ograve Tcaron -40 KPX Ograve Tcommaaccent -40 KPX Ograve V -50 KPX Ograve W -35 KPX Ograve X -40 KPX Ograve Y -50 KPX Ograve Yacute -50 KPX Ograve Ydieresis -50 KPX Ohungarumlaut A -35 KPX Ohungarumlaut Aacute -35 KPX Ohungarumlaut Abreve -35 KPX Ohungarumlaut Acircumflex -35 KPX Ohungarumlaut Adieresis -35 KPX Ohungarumlaut Agrave -35 KPX Ohungarumlaut Amacron -35 KPX Ohungarumlaut Aogonek -35 KPX Ohungarumlaut Aring -35 KPX Ohungarumlaut Atilde -35 KPX Ohungarumlaut T -40 KPX Ohungarumlaut Tcaron -40 KPX Ohungarumlaut Tcommaaccent -40 KPX Ohungarumlaut V -50 KPX Ohungarumlaut W -35 KPX Ohungarumlaut X -40 KPX Ohungarumlaut Y -50 KPX Ohungarumlaut Yacute -50 KPX Ohungarumlaut Ydieresis -50 KPX Omacron A -35 KPX Omacron Aacute -35 KPX Omacron Abreve -35 KPX Omacron Acircumflex -35 KPX Omacron Adieresis -35 KPX Omacron Agrave -35 KPX Omacron Amacron -35 KPX Omacron Aogonek -35 KPX Omacron Aring -35 KPX Omacron Atilde -35 KPX Omacron T -40 KPX Omacron Tcaron -40 KPX Omacron Tcommaaccent -40 KPX Omacron V -50 KPX Omacron W -35 KPX Omacron X -40 KPX Omacron Y -50 KPX Omacron Yacute -50 KPX Omacron Ydieresis -50 KPX Oslash A -35 KPX Oslash Aacute -35 KPX Oslash Abreve -35 KPX Oslash Acircumflex -35 KPX Oslash Adieresis -35 KPX Oslash Agrave -35 KPX Oslash Amacron -35 KPX Oslash Aogonek -35 KPX Oslash Aring -35 KPX Oslash Atilde -35 KPX Oslash T -40 KPX Oslash Tcaron -40 KPX Oslash Tcommaaccent -40 KPX Oslash V -50 KPX Oslash W -35 KPX Oslash X -40 KPX Oslash Y -50 KPX Oslash Yacute -50 KPX Oslash Ydieresis -50 KPX Otilde A -35 KPX Otilde Aacute -35 KPX Otilde Abreve -35 KPX Otilde Acircumflex -35 KPX Otilde Adieresis -35 KPX Otilde Agrave -35 KPX Otilde Amacron -35 KPX Otilde Aogonek -35 KPX Otilde Aring -35 KPX Otilde Atilde -35 KPX Otilde T -40 KPX Otilde Tcaron -40 KPX Otilde Tcommaaccent -40 KPX Otilde V -50 KPX Otilde W -35 KPX Otilde X -40 KPX Otilde Y -50 KPX Otilde Yacute -50 KPX Otilde Ydieresis -50 KPX P A -92 KPX P Aacute -92 KPX P Abreve -92 KPX P Acircumflex -92 KPX P Adieresis -92 KPX P Agrave -92 KPX P Amacron -92 KPX P Aogonek -92 KPX P Aring -92 KPX P Atilde -92 KPX P a -15 KPX P aacute -15 KPX P abreve -15 KPX P acircumflex -15 KPX P adieresis -15 KPX P agrave -15 KPX P amacron -15 KPX P aogonek -15 KPX P aring -15 KPX P atilde -15 KPX P comma -111 KPX P period -111 KPX Q U -10 KPX Q Uacute -10 KPX Q Ucircumflex -10 KPX Q Udieresis -10 KPX Q Ugrave -10 KPX Q Uhungarumlaut -10 KPX Q Umacron -10 KPX Q Uogonek -10 KPX Q Uring -10 KPX R O -40 KPX R Oacute -40 KPX R Ocircumflex -40 KPX R Odieresis -40 KPX R Ograve -40 KPX R Ohungarumlaut -40 KPX R Omacron -40 KPX R Oslash -40 KPX R Otilde -40 KPX R T -60 KPX R Tcaron -60 KPX R Tcommaaccent -60 KPX R U -40 KPX R Uacute -40 KPX R Ucircumflex -40 KPX R Udieresis -40 KPX R Ugrave -40 KPX R Uhungarumlaut -40 KPX R Umacron -40 KPX R Uogonek -40 KPX R Uring -40 KPX R V -80 KPX R W -55 KPX R Y -65 KPX R Yacute -65 KPX R Ydieresis -65 KPX Racute O -40 KPX Racute Oacute -40 KPX Racute Ocircumflex -40 KPX Racute Odieresis -40 KPX Racute Ograve -40 KPX Racute Ohungarumlaut -40 KPX Racute Omacron -40 KPX Racute Oslash -40 KPX Racute Otilde -40 KPX Racute T -60 KPX Racute Tcaron -60 KPX Racute Tcommaaccent -60 KPX Racute U -40 KPX Racute Uacute -40 KPX Racute Ucircumflex -40 KPX Racute Udieresis -40 KPX Racute Ugrave -40 KPX Racute Uhungarumlaut -40 KPX Racute Umacron -40 KPX Racute Uogonek -40 KPX Racute Uring -40 KPX Racute V -80 KPX Racute W -55 KPX Racute Y -65 KPX Racute Yacute -65 KPX Racute Ydieresis -65 KPX Rcaron O -40 KPX Rcaron Oacute -40 KPX Rcaron Ocircumflex -40 KPX Rcaron Odieresis -40 KPX Rcaron Ograve -40 KPX Rcaron Ohungarumlaut -40 KPX Rcaron Omacron -40 KPX Rcaron Oslash -40 KPX Rcaron Otilde -40 KPX Rcaron T -60 KPX Rcaron Tcaron -60 KPX Rcaron Tcommaaccent -60 KPX Rcaron U -40 KPX Rcaron Uacute -40 KPX Rcaron Ucircumflex -40 KPX Rcaron Udieresis -40 KPX Rcaron Ugrave -40 KPX Rcaron Uhungarumlaut -40 KPX Rcaron Umacron -40 KPX Rcaron Uogonek -40 KPX Rcaron Uring -40 KPX Rcaron V -80 KPX Rcaron W -55 KPX Rcaron Y -65 KPX Rcaron Yacute -65 KPX Rcaron Ydieresis -65 KPX Rcommaaccent O -40 KPX Rcommaaccent Oacute -40 KPX Rcommaaccent Ocircumflex -40 KPX Rcommaaccent Odieresis -40 KPX Rcommaaccent Ograve -40 KPX Rcommaaccent Ohungarumlaut -40 KPX Rcommaaccent Omacron -40 KPX Rcommaaccent Oslash -40 KPX Rcommaaccent Otilde -40 KPX Rcommaaccent T -60 KPX Rcommaaccent Tcaron -60 KPX Rcommaaccent Tcommaaccent -60 KPX Rcommaaccent U -40 KPX Rcommaaccent Uacute -40 KPX Rcommaaccent Ucircumflex -40 KPX Rcommaaccent Udieresis -40 KPX Rcommaaccent Ugrave -40 KPX Rcommaaccent Uhungarumlaut -40 KPX Rcommaaccent Umacron -40 KPX Rcommaaccent Uogonek -40 KPX Rcommaaccent Uring -40 KPX Rcommaaccent V -80 KPX Rcommaaccent W -55 KPX Rcommaaccent Y -65 KPX Rcommaaccent Yacute -65 KPX Rcommaaccent Ydieresis -65 KPX T A -93 KPX T Aacute -93 KPX T Abreve -93 KPX T Acircumflex -93 KPX T Adieresis -93 KPX T Agrave -93 KPX T Amacron -93 KPX T Aogonek -93 KPX T Aring -93 KPX T Atilde -93 KPX T O -18 KPX T Oacute -18 KPX T Ocircumflex -18 KPX T Odieresis -18 KPX T Ograve -18 KPX T Ohungarumlaut -18 KPX T Omacron -18 KPX T Oslash -18 KPX T Otilde -18 KPX T a -80 KPX T aacute -80 KPX T abreve -80 KPX T acircumflex -80 KPX T adieresis -40 KPX T agrave -40 KPX T amacron -40 KPX T aogonek -80 KPX T aring -80 KPX T atilde -40 KPX T colon -50 KPX T comma -74 KPX T e -70 KPX T eacute -70 KPX T ecaron -70 KPX T ecircumflex -70 KPX T edieresis -30 KPX T edotaccent -70 KPX T egrave -70 KPX T emacron -30 KPX T eogonek -70 KPX T hyphen -92 KPX T i -35 KPX T iacute -35 KPX T iogonek -35 KPX T o -80 KPX T oacute -80 KPX T ocircumflex -80 KPX T odieresis -80 KPX T ograve -80 KPX T ohungarumlaut -80 KPX T omacron -80 KPX T oslash -80 KPX T otilde -80 KPX T period -74 KPX T r -35 KPX T racute -35 KPX T rcaron -35 KPX T rcommaaccent -35 KPX T semicolon -55 KPX T u -45 KPX T uacute -45 KPX T ucircumflex -45 KPX T udieresis -45 KPX T ugrave -45 KPX T uhungarumlaut -45 KPX T umacron -45 KPX T uogonek -45 KPX T uring -45 KPX T w -80 KPX T y -80 KPX T yacute -80 KPX T ydieresis -80 KPX Tcaron A -93 KPX Tcaron Aacute -93 KPX Tcaron Abreve -93 KPX Tcaron Acircumflex -93 KPX Tcaron Adieresis -93 KPX Tcaron Agrave -93 KPX Tcaron Amacron -93 KPX Tcaron Aogonek -93 KPX Tcaron Aring -93 KPX Tcaron Atilde -93 KPX Tcaron O -18 KPX Tcaron Oacute -18 KPX Tcaron Ocircumflex -18 KPX Tcaron Odieresis -18 KPX Tcaron Ograve -18 KPX Tcaron Ohungarumlaut -18 KPX Tcaron Omacron -18 KPX Tcaron Oslash -18 KPX Tcaron Otilde -18 KPX Tcaron a -80 KPX Tcaron aacute -80 KPX Tcaron abreve -80 KPX Tcaron acircumflex -80 KPX Tcaron adieresis -40 KPX Tcaron agrave -40 KPX Tcaron amacron -40 KPX Tcaron aogonek -80 KPX Tcaron aring -80 KPX Tcaron atilde -40 KPX Tcaron colon -50 KPX Tcaron comma -74 KPX Tcaron e -70 KPX Tcaron eacute -70 KPX Tcaron ecaron -70 KPX Tcaron ecircumflex -30 KPX Tcaron edieresis -30 KPX Tcaron edotaccent -70 KPX Tcaron egrave -70 KPX Tcaron emacron -30 KPX Tcaron eogonek -70 KPX Tcaron hyphen -92 KPX Tcaron i -35 KPX Tcaron iacute -35 KPX Tcaron iogonek -35 KPX Tcaron o -80 KPX Tcaron oacute -80 KPX Tcaron ocircumflex -80 KPX Tcaron odieresis -80 KPX Tcaron ograve -80 KPX Tcaron ohungarumlaut -80 KPX Tcaron omacron -80 KPX Tcaron oslash -80 KPX Tcaron otilde -80 KPX Tcaron period -74 KPX Tcaron r -35 KPX Tcaron racute -35 KPX Tcaron rcaron -35 KPX Tcaron rcommaaccent -35 KPX Tcaron semicolon -55 KPX Tcaron u -45 KPX Tcaron uacute -45 KPX Tcaron ucircumflex -45 KPX Tcaron udieresis -45 KPX Tcaron ugrave -45 KPX Tcaron uhungarumlaut -45 KPX Tcaron umacron -45 KPX Tcaron uogonek -45 KPX Tcaron uring -45 KPX Tcaron w -80 KPX Tcaron y -80 KPX Tcaron yacute -80 KPX Tcaron ydieresis -80 KPX Tcommaaccent A -93 KPX Tcommaaccent Aacute -93 KPX Tcommaaccent Abreve -93 KPX Tcommaaccent Acircumflex -93 KPX Tcommaaccent Adieresis -93 KPX Tcommaaccent Agrave -93 KPX Tcommaaccent Amacron -93 KPX Tcommaaccent Aogonek -93 KPX Tcommaaccent Aring -93 KPX Tcommaaccent Atilde -93 KPX Tcommaaccent O -18 KPX Tcommaaccent Oacute -18 KPX Tcommaaccent Ocircumflex -18 KPX Tcommaaccent Odieresis -18 KPX Tcommaaccent Ograve -18 KPX Tcommaaccent Ohungarumlaut -18 KPX Tcommaaccent Omacron -18 KPX Tcommaaccent Oslash -18 KPX Tcommaaccent Otilde -18 KPX Tcommaaccent a -80 KPX Tcommaaccent aacute -80 KPX Tcommaaccent abreve -80 KPX Tcommaaccent acircumflex -80 KPX Tcommaaccent adieresis -40 KPX Tcommaaccent agrave -40 KPX Tcommaaccent amacron -40 KPX Tcommaaccent aogonek -80 KPX Tcommaaccent aring -80 KPX Tcommaaccent atilde -40 KPX Tcommaaccent colon -50 KPX Tcommaaccent comma -74 KPX Tcommaaccent e -70 KPX Tcommaaccent eacute -70 KPX Tcommaaccent ecaron -70 KPX Tcommaaccent ecircumflex -30 KPX Tcommaaccent edieresis -30 KPX Tcommaaccent edotaccent -70 KPX Tcommaaccent egrave -30 KPX Tcommaaccent emacron -70 KPX Tcommaaccent eogonek -70 KPX Tcommaaccent hyphen -92 KPX Tcommaaccent i -35 KPX Tcommaaccent iacute -35 KPX Tcommaaccent iogonek -35 KPX Tcommaaccent o -80 KPX Tcommaaccent oacute -80 KPX Tcommaaccent ocircumflex -80 KPX Tcommaaccent odieresis -80 KPX Tcommaaccent ograve -80 KPX Tcommaaccent ohungarumlaut -80 KPX Tcommaaccent omacron -80 KPX Tcommaaccent oslash -80 KPX Tcommaaccent otilde -80 KPX Tcommaaccent period -74 KPX Tcommaaccent r -35 KPX Tcommaaccent racute -35 KPX Tcommaaccent rcaron -35 KPX Tcommaaccent rcommaaccent -35 KPX Tcommaaccent semicolon -55 KPX Tcommaaccent u -45 KPX Tcommaaccent uacute -45 KPX Tcommaaccent ucircumflex -45 KPX Tcommaaccent udieresis -45 KPX Tcommaaccent ugrave -45 KPX Tcommaaccent uhungarumlaut -45 KPX Tcommaaccent umacron -45 KPX Tcommaaccent uogonek -45 KPX Tcommaaccent uring -45 KPX Tcommaaccent w -80 KPX Tcommaaccent y -80 KPX Tcommaaccent yacute -80 KPX Tcommaaccent ydieresis -80 KPX U A -40 KPX U Aacute -40 KPX U Abreve -40 KPX U Acircumflex -40 KPX U Adieresis -40 KPX U Agrave -40 KPX U Amacron -40 KPX U Aogonek -40 KPX U Aring -40 KPX U Atilde -40 KPX Uacute A -40 KPX Uacute Aacute -40 KPX Uacute Abreve -40 KPX Uacute Acircumflex -40 KPX Uacute Adieresis -40 KPX Uacute Agrave -40 KPX Uacute Amacron -40 KPX Uacute Aogonek -40 KPX Uacute Aring -40 KPX Uacute Atilde -40 KPX Ucircumflex A -40 KPX Ucircumflex Aacute -40 KPX Ucircumflex Abreve -40 KPX Ucircumflex Acircumflex -40 KPX Ucircumflex Adieresis -40 KPX Ucircumflex Agrave -40 KPX Ucircumflex Amacron -40 KPX Ucircumflex Aogonek -40 KPX Ucircumflex Aring -40 KPX Ucircumflex Atilde -40 KPX Udieresis A -40 KPX Udieresis Aacute -40 KPX Udieresis Abreve -40 KPX Udieresis Acircumflex -40 KPX Udieresis Adieresis -40 KPX Udieresis Agrave -40 KPX Udieresis Amacron -40 KPX Udieresis Aogonek -40 KPX Udieresis Aring -40 KPX Udieresis Atilde -40 KPX Ugrave A -40 KPX Ugrave Aacute -40 KPX Ugrave Abreve -40 KPX Ugrave Acircumflex -40 KPX Ugrave Adieresis -40 KPX Ugrave Agrave -40 KPX Ugrave Amacron -40 KPX Ugrave Aogonek -40 KPX Ugrave Aring -40 KPX Ugrave Atilde -40 KPX Uhungarumlaut A -40 KPX Uhungarumlaut Aacute -40 KPX Uhungarumlaut Abreve -40 KPX Uhungarumlaut Acircumflex -40 KPX Uhungarumlaut Adieresis -40 KPX Uhungarumlaut Agrave -40 KPX Uhungarumlaut Amacron -40 KPX Uhungarumlaut Aogonek -40 KPX Uhungarumlaut Aring -40 KPX Uhungarumlaut Atilde -40 KPX Umacron A -40 KPX Umacron Aacute -40 KPX Umacron Abreve -40 KPX Umacron Acircumflex -40 KPX Umacron Adieresis -40 KPX Umacron Agrave -40 KPX Umacron Amacron -40 KPX Umacron Aogonek -40 KPX Umacron Aring -40 KPX Umacron Atilde -40 KPX Uogonek A -40 KPX Uogonek Aacute -40 KPX Uogonek Abreve -40 KPX Uogonek Acircumflex -40 KPX Uogonek Adieresis -40 KPX Uogonek Agrave -40 KPX Uogonek Amacron -40 KPX Uogonek Aogonek -40 KPX Uogonek Aring -40 KPX Uogonek Atilde -40 KPX Uring A -40 KPX Uring Aacute -40 KPX Uring Abreve -40 KPX Uring Acircumflex -40 KPX Uring Adieresis -40 KPX Uring Agrave -40 KPX Uring Amacron -40 KPX Uring Aogonek -40 KPX Uring Aring -40 KPX Uring Atilde -40 KPX V A -135 KPX V Aacute -135 KPX V Abreve -135 KPX V Acircumflex -135 KPX V Adieresis -135 KPX V Agrave -135 KPX V Amacron -135 KPX V Aogonek -135 KPX V Aring -135 KPX V Atilde -135 KPX V G -15 KPX V Gbreve -15 KPX V Gcommaaccent -15 KPX V O -40 KPX V Oacute -40 KPX V Ocircumflex -40 KPX V Odieresis -40 KPX V Ograve -40 KPX V Ohungarumlaut -40 KPX V Omacron -40 KPX V Oslash -40 KPX V Otilde -40 KPX V a -111 KPX V aacute -111 KPX V abreve -111 KPX V acircumflex -71 KPX V adieresis -71 KPX V agrave -71 KPX V amacron -71 KPX V aogonek -111 KPX V aring -111 KPX V atilde -71 KPX V colon -74 KPX V comma -129 KPX V e -111 KPX V eacute -111 KPX V ecaron -71 KPX V ecircumflex -71 KPX V edieresis -71 KPX V edotaccent -111 KPX V egrave -71 KPX V emacron -71 KPX V eogonek -111 KPX V hyphen -100 KPX V i -60 KPX V iacute -60 KPX V icircumflex -20 KPX V idieresis -20 KPX V igrave -20 KPX V imacron -20 KPX V iogonek -60 KPX V o -129 KPX V oacute -129 KPX V ocircumflex -129 KPX V odieresis -89 KPX V ograve -89 KPX V ohungarumlaut -129 KPX V omacron -89 KPX V oslash -129 KPX V otilde -89 KPX V period -129 KPX V semicolon -74 KPX V u -75 KPX V uacute -75 KPX V ucircumflex -75 KPX V udieresis -75 KPX V ugrave -75 KPX V uhungarumlaut -75 KPX V umacron -75 KPX V uogonek -75 KPX V uring -75 KPX W A -120 KPX W Aacute -120 KPX W Abreve -120 KPX W Acircumflex -120 KPX W Adieresis -120 KPX W Agrave -120 KPX W Amacron -120 KPX W Aogonek -120 KPX W Aring -120 KPX W Atilde -120 KPX W O -10 KPX W Oacute -10 KPX W Ocircumflex -10 KPX W Odieresis -10 KPX W Ograve -10 KPX W Ohungarumlaut -10 KPX W Omacron -10 KPX W Oslash -10 KPX W Otilde -10 KPX W a -80 KPX W aacute -80 KPX W abreve -80 KPX W acircumflex -80 KPX W adieresis -80 KPX W agrave -80 KPX W amacron -80 KPX W aogonek -80 KPX W aring -80 KPX W atilde -80 KPX W colon -37 KPX W comma -92 KPX W e -80 KPX W eacute -80 KPX W ecaron -80 KPX W ecircumflex -80 KPX W edieresis -40 KPX W edotaccent -80 KPX W egrave -40 KPX W emacron -40 KPX W eogonek -80 KPX W hyphen -65 KPX W i -40 KPX W iacute -40 KPX W iogonek -40 KPX W o -80 KPX W oacute -80 KPX W ocircumflex -80 KPX W odieresis -80 KPX W ograve -80 KPX W ohungarumlaut -80 KPX W omacron -80 KPX W oslash -80 KPX W otilde -80 KPX W period -92 KPX W semicolon -37 KPX W u -50 KPX W uacute -50 KPX W ucircumflex -50 KPX W udieresis -50 KPX W ugrave -50 KPX W uhungarumlaut -50 KPX W umacron -50 KPX W uogonek -50 KPX W uring -50 KPX W y -73 KPX W yacute -73 KPX W ydieresis -73 KPX Y A -120 KPX Y Aacute -120 KPX Y Abreve -120 KPX Y Acircumflex -120 KPX Y Adieresis -120 KPX Y Agrave -120 KPX Y Amacron -120 KPX Y Aogonek -120 KPX Y Aring -120 KPX Y Atilde -120 KPX Y O -30 KPX Y Oacute -30 KPX Y Ocircumflex -30 KPX Y Odieresis -30 KPX Y Ograve -30 KPX Y Ohungarumlaut -30 KPX Y Omacron -30 KPX Y Oslash -30 KPX Y Otilde -30 KPX Y a -100 KPX Y aacute -100 KPX Y abreve -100 KPX Y acircumflex -100 KPX Y adieresis -60 KPX Y agrave -60 KPX Y amacron -60 KPX Y aogonek -100 KPX Y aring -100 KPX Y atilde -60 KPX Y colon -92 KPX Y comma -129 KPX Y e -100 KPX Y eacute -100 KPX Y ecaron -100 KPX Y ecircumflex -100 KPX Y edieresis -60 KPX Y edotaccent -100 KPX Y egrave -60 KPX Y emacron -60 KPX Y eogonek -100 KPX Y hyphen -111 KPX Y i -55 KPX Y iacute -55 KPX Y iogonek -55 KPX Y o -110 KPX Y oacute -110 KPX Y ocircumflex -110 KPX Y odieresis -70 KPX Y ograve -70 KPX Y ohungarumlaut -110 KPX Y omacron -70 KPX Y oslash -110 KPX Y otilde -70 KPX Y period -129 KPX Y semicolon -92 KPX Y u -111 KPX Y uacute -111 KPX Y ucircumflex -111 KPX Y udieresis -71 KPX Y ugrave -71 KPX Y uhungarumlaut -111 KPX Y umacron -71 KPX Y uogonek -111 KPX Y uring -111 KPX Yacute A -120 KPX Yacute Aacute -120 KPX Yacute Abreve -120 KPX Yacute Acircumflex -120 KPX Yacute Adieresis -120 KPX Yacute Agrave -120 KPX Yacute Amacron -120 KPX Yacute Aogonek -120 KPX Yacute Aring -120 KPX Yacute Atilde -120 KPX Yacute O -30 KPX Yacute Oacute -30 KPX Yacute Ocircumflex -30 KPX Yacute Odieresis -30 KPX Yacute Ograve -30 KPX Yacute Ohungarumlaut -30 KPX Yacute Omacron -30 KPX Yacute Oslash -30 KPX Yacute Otilde -30 KPX Yacute a -100 KPX Yacute aacute -100 KPX Yacute abreve -100 KPX Yacute acircumflex -100 KPX Yacute adieresis -60 KPX Yacute agrave -60 KPX Yacute amacron -60 KPX Yacute aogonek -100 KPX Yacute aring -100 KPX Yacute atilde -60 KPX Yacute colon -92 KPX Yacute comma -129 KPX Yacute e -100 KPX Yacute eacute -100 KPX Yacute ecaron -100 KPX Yacute ecircumflex -100 KPX Yacute edieresis -60 KPX Yacute edotaccent -100 KPX Yacute egrave -60 KPX Yacute emacron -60 KPX Yacute eogonek -100 KPX Yacute hyphen -111 KPX Yacute i -55 KPX Yacute iacute -55 KPX Yacute iogonek -55 KPX Yacute o -110 KPX Yacute oacute -110 KPX Yacute ocircumflex -110 KPX Yacute odieresis -70 KPX Yacute ograve -70 KPX Yacute ohungarumlaut -110 KPX Yacute omacron -70 KPX Yacute oslash -110 KPX Yacute otilde -70 KPX Yacute period -129 KPX Yacute semicolon -92 KPX Yacute u -111 KPX Yacute uacute -111 KPX Yacute ucircumflex -111 KPX Yacute udieresis -71 KPX Yacute ugrave -71 KPX Yacute uhungarumlaut -111 KPX Yacute umacron -71 KPX Yacute uogonek -111 KPX Yacute uring -111 KPX Ydieresis A -120 KPX Ydieresis Aacute -120 KPX Ydieresis Abreve -120 KPX Ydieresis Acircumflex -120 KPX Ydieresis Adieresis -120 KPX Ydieresis Agrave -120 KPX Ydieresis Amacron -120 KPX Ydieresis Aogonek -120 KPX Ydieresis Aring -120 KPX Ydieresis Atilde -120 KPX Ydieresis O -30 KPX Ydieresis Oacute -30 KPX Ydieresis Ocircumflex -30 KPX Ydieresis Odieresis -30 KPX Ydieresis Ograve -30 KPX Ydieresis Ohungarumlaut -30 KPX Ydieresis Omacron -30 KPX Ydieresis Oslash -30 KPX Ydieresis Otilde -30 KPX Ydieresis a -100 KPX Ydieresis aacute -100 KPX Ydieresis abreve -100 KPX Ydieresis acircumflex -100 KPX Ydieresis adieresis -60 KPX Ydieresis agrave -60 KPX Ydieresis amacron -60 KPX Ydieresis aogonek -100 KPX Ydieresis aring -100 KPX Ydieresis atilde -100 KPX Ydieresis colon -92 KPX Ydieresis comma -129 KPX Ydieresis e -100 KPX Ydieresis eacute -100 KPX Ydieresis ecaron -100 KPX Ydieresis ecircumflex -100 KPX Ydieresis edieresis -60 KPX Ydieresis edotaccent -100 KPX Ydieresis egrave -60 KPX Ydieresis emacron -60 KPX Ydieresis eogonek -100 KPX Ydieresis hyphen -111 KPX Ydieresis i -55 KPX Ydieresis iacute -55 KPX Ydieresis iogonek -55 KPX Ydieresis o -110 KPX Ydieresis oacute -110 KPX Ydieresis ocircumflex -110 KPX Ydieresis odieresis -70 KPX Ydieresis ograve -70 KPX Ydieresis ohungarumlaut -110 KPX Ydieresis omacron -70 KPX Ydieresis oslash -110 KPX Ydieresis otilde -70 KPX Ydieresis period -129 KPX Ydieresis semicolon -92 KPX Ydieresis u -111 KPX Ydieresis uacute -111 KPX Ydieresis ucircumflex -111 KPX Ydieresis udieresis -71 KPX Ydieresis ugrave -71 KPX Ydieresis uhungarumlaut -111 KPX Ydieresis umacron -71 KPX Ydieresis uogonek -111 KPX Ydieresis uring -111 KPX a v -20 KPX a w -15 KPX aacute v -20 KPX aacute w -15 KPX abreve v -20 KPX abreve w -15 KPX acircumflex v -20 KPX acircumflex w -15 KPX adieresis v -20 KPX adieresis w -15 KPX agrave v -20 KPX agrave w -15 KPX amacron v -20 KPX amacron w -15 KPX aogonek v -20 KPX aogonek w -15 KPX aring v -20 KPX aring w -15 KPX atilde v -20 KPX atilde w -15 KPX b period -40 KPX b u -20 KPX b uacute -20 KPX b ucircumflex -20 KPX b udieresis -20 KPX b ugrave -20 KPX b uhungarumlaut -20 KPX b umacron -20 KPX b uogonek -20 KPX b uring -20 KPX b v -15 KPX c y -15 KPX c yacute -15 KPX c ydieresis -15 KPX cacute y -15 KPX cacute yacute -15 KPX cacute ydieresis -15 KPX ccaron y -15 KPX ccaron yacute -15 KPX ccaron ydieresis -15 KPX ccedilla y -15 KPX ccedilla yacute -15 KPX ccedilla ydieresis -15 KPX comma quotedblright -70 KPX comma quoteright -70 KPX e g -15 KPX e gbreve -15 KPX e gcommaaccent -15 KPX e v -25 KPX e w -25 KPX e x -15 KPX e y -15 KPX e yacute -15 KPX e ydieresis -15 KPX eacute g -15 KPX eacute gbreve -15 KPX eacute gcommaaccent -15 KPX eacute v -25 KPX eacute w -25 KPX eacute x -15 KPX eacute y -15 KPX eacute yacute -15 KPX eacute ydieresis -15 KPX ecaron g -15 KPX ecaron gbreve -15 KPX ecaron gcommaaccent -15 KPX ecaron v -25 KPX ecaron w -25 KPX ecaron x -15 KPX ecaron y -15 KPX ecaron yacute -15 KPX ecaron ydieresis -15 KPX ecircumflex g -15 KPX ecircumflex gbreve -15 KPX ecircumflex gcommaaccent -15 KPX ecircumflex v -25 KPX ecircumflex w -25 KPX ecircumflex x -15 KPX ecircumflex y -15 KPX ecircumflex yacute -15 KPX ecircumflex ydieresis -15 KPX edieresis g -15 KPX edieresis gbreve -15 KPX edieresis gcommaaccent -15 KPX edieresis v -25 KPX edieresis w -25 KPX edieresis x -15 KPX edieresis y -15 KPX edieresis yacute -15 KPX edieresis ydieresis -15 KPX edotaccent g -15 KPX edotaccent gbreve -15 KPX edotaccent gcommaaccent -15 KPX edotaccent v -25 KPX edotaccent w -25 KPX edotaccent x -15 KPX edotaccent y -15 KPX edotaccent yacute -15 KPX edotaccent ydieresis -15 KPX egrave g -15 KPX egrave gbreve -15 KPX egrave gcommaaccent -15 KPX egrave v -25 KPX egrave w -25 KPX egrave x -15 KPX egrave y -15 KPX egrave yacute -15 KPX egrave ydieresis -15 KPX emacron g -15 KPX emacron gbreve -15 KPX emacron gcommaaccent -15 KPX emacron v -25 KPX emacron w -25 KPX emacron x -15 KPX emacron y -15 KPX emacron yacute -15 KPX emacron ydieresis -15 KPX eogonek g -15 KPX eogonek gbreve -15 KPX eogonek gcommaaccent -15 KPX eogonek v -25 KPX eogonek w -25 KPX eogonek x -15 KPX eogonek y -15 KPX eogonek yacute -15 KPX eogonek ydieresis -15 KPX f a -10 KPX f aacute -10 KPX f abreve -10 KPX f acircumflex -10 KPX f adieresis -10 KPX f agrave -10 KPX f amacron -10 KPX f aogonek -10 KPX f aring -10 KPX f atilde -10 KPX f dotlessi -50 KPX f f -25 KPX f i -20 KPX f iacute -20 KPX f quoteright 55 KPX g a -5 KPX g aacute -5 KPX g abreve -5 KPX g acircumflex -5 KPX g adieresis -5 KPX g agrave -5 KPX g amacron -5 KPX g aogonek -5 KPX g aring -5 KPX g atilde -5 KPX gbreve a -5 KPX gbreve aacute -5 KPX gbreve abreve -5 KPX gbreve acircumflex -5 KPX gbreve adieresis -5 KPX gbreve agrave -5 KPX gbreve amacron -5 KPX gbreve aogonek -5 KPX gbreve aring -5 KPX gbreve atilde -5 KPX gcommaaccent a -5 KPX gcommaaccent aacute -5 KPX gcommaaccent abreve -5 KPX gcommaaccent acircumflex -5 KPX gcommaaccent adieresis -5 KPX gcommaaccent agrave -5 KPX gcommaaccent amacron -5 KPX gcommaaccent aogonek -5 KPX gcommaaccent aring -5 KPX gcommaaccent atilde -5 KPX h y -5 KPX h yacute -5 KPX h ydieresis -5 KPX i v -25 KPX iacute v -25 KPX icircumflex v -25 KPX idieresis v -25 KPX igrave v -25 KPX imacron v -25 KPX iogonek v -25 KPX k e -10 KPX k eacute -10 KPX k ecaron -10 KPX k ecircumflex -10 KPX k edieresis -10 KPX k edotaccent -10 KPX k egrave -10 KPX k emacron -10 KPX k eogonek -10 KPX k o -10 KPX k oacute -10 KPX k ocircumflex -10 KPX k odieresis -10 KPX k ograve -10 KPX k ohungarumlaut -10 KPX k omacron -10 KPX k oslash -10 KPX k otilde -10 KPX k y -15 KPX k yacute -15 KPX k ydieresis -15 KPX kcommaaccent e -10 KPX kcommaaccent eacute -10 KPX kcommaaccent ecaron -10 KPX kcommaaccent ecircumflex -10 KPX kcommaaccent edieresis -10 KPX kcommaaccent edotaccent -10 KPX kcommaaccent egrave -10 KPX kcommaaccent emacron -10 KPX kcommaaccent eogonek -10 KPX kcommaaccent o -10 KPX kcommaaccent oacute -10 KPX kcommaaccent ocircumflex -10 KPX kcommaaccent odieresis -10 KPX kcommaaccent ograve -10 KPX kcommaaccent ohungarumlaut -10 KPX kcommaaccent omacron -10 KPX kcommaaccent oslash -10 KPX kcommaaccent otilde -10 KPX kcommaaccent y -15 KPX kcommaaccent yacute -15 KPX kcommaaccent ydieresis -15 KPX l w -10 KPX lacute w -10 KPX lcommaaccent w -10 KPX lslash w -10 KPX n v -40 KPX n y -15 KPX n yacute -15 KPX n ydieresis -15 KPX nacute v -40 KPX nacute y -15 KPX nacute yacute -15 KPX nacute ydieresis -15 KPX ncaron v -40 KPX ncaron y -15 KPX ncaron yacute -15 KPX ncaron ydieresis -15 KPX ncommaaccent v -40 KPX ncommaaccent y -15 KPX ncommaaccent yacute -15 KPX ncommaaccent ydieresis -15 KPX ntilde v -40 KPX ntilde y -15 KPX ntilde yacute -15 KPX ntilde ydieresis -15 KPX o v -15 KPX o w -25 KPX o y -10 KPX o yacute -10 KPX o ydieresis -10 KPX oacute v -15 KPX oacute w -25 KPX oacute y -10 KPX oacute yacute -10 KPX oacute ydieresis -10 KPX ocircumflex v -15 KPX ocircumflex w -25 KPX ocircumflex y -10 KPX ocircumflex yacute -10 KPX ocircumflex ydieresis -10 KPX odieresis v -15 KPX odieresis w -25 KPX odieresis y -10 KPX odieresis yacute -10 KPX odieresis ydieresis -10 KPX ograve v -15 KPX ograve w -25 KPX ograve y -10 KPX ograve yacute -10 KPX ograve ydieresis -10 KPX ohungarumlaut v -15 KPX ohungarumlaut w -25 KPX ohungarumlaut y -10 KPX ohungarumlaut yacute -10 KPX ohungarumlaut ydieresis -10 KPX omacron v -15 KPX omacron w -25 KPX omacron y -10 KPX omacron yacute -10 KPX omacron ydieresis -10 KPX oslash v -15 KPX oslash w -25 KPX oslash y -10 KPX oslash yacute -10 KPX oslash ydieresis -10 KPX otilde v -15 KPX otilde w -25 KPX otilde y -10 KPX otilde yacute -10 KPX otilde ydieresis -10 KPX p y -10 KPX p yacute -10 KPX p ydieresis -10 KPX period quotedblright -70 KPX period quoteright -70 KPX quotedblleft A -80 KPX quotedblleft Aacute -80 KPX quotedblleft Abreve -80 KPX quotedblleft Acircumflex -80 KPX quotedblleft Adieresis -80 KPX quotedblleft Agrave -80 KPX quotedblleft Amacron -80 KPX quotedblleft Aogonek -80 KPX quotedblleft Aring -80 KPX quotedblleft Atilde -80 KPX quoteleft A -80 KPX quoteleft Aacute -80 KPX quoteleft Abreve -80 KPX quoteleft Acircumflex -80 KPX quoteleft Adieresis -80 KPX quoteleft Agrave -80 KPX quoteleft Amacron -80 KPX quoteleft Aogonek -80 KPX quoteleft Aring -80 KPX quoteleft Atilde -80 KPX quoteleft quoteleft -74 KPX quoteright d -50 KPX quoteright dcroat -50 KPX quoteright l -10 KPX quoteright lacute -10 KPX quoteright lcommaaccent -10 KPX quoteright lslash -10 KPX quoteright quoteright -74 KPX quoteright r -50 KPX quoteright racute -50 KPX quoteright rcaron -50 KPX quoteright rcommaaccent -50 KPX quoteright s -55 KPX quoteright sacute -55 KPX quoteright scaron -55 KPX quoteright scedilla -55 KPX quoteright scommaaccent -55 KPX quoteright space -74 KPX quoteright t -18 KPX quoteright tcommaaccent -18 KPX quoteright v -50 KPX r comma -40 KPX r g -18 KPX r gbreve -18 KPX r gcommaaccent -18 KPX r hyphen -20 KPX r period -55 KPX racute comma -40 KPX racute g -18 KPX racute gbreve -18 KPX racute gcommaaccent -18 KPX racute hyphen -20 KPX racute period -55 KPX rcaron comma -40 KPX rcaron g -18 KPX rcaron gbreve -18 KPX rcaron gcommaaccent -18 KPX rcaron hyphen -20 KPX rcaron period -55 KPX rcommaaccent comma -40 KPX rcommaaccent g -18 KPX rcommaaccent gbreve -18 KPX rcommaaccent gcommaaccent -18 KPX rcommaaccent hyphen -20 KPX rcommaaccent period -55 KPX space A -55 KPX space Aacute -55 KPX space Abreve -55 KPX space Acircumflex -55 KPX space Adieresis -55 KPX space Agrave -55 KPX space Amacron -55 KPX space Aogonek -55 KPX space Aring -55 KPX space Atilde -55 KPX space T -18 KPX space Tcaron -18 KPX space Tcommaaccent -18 KPX space V -50 KPX space W -30 KPX space Y -90 KPX space Yacute -90 KPX space Ydieresis -90 KPX v a -25 KPX v aacute -25 KPX v abreve -25 KPX v acircumflex -25 KPX v adieresis -25 KPX v agrave -25 KPX v amacron -25 KPX v aogonek -25 KPX v aring -25 KPX v atilde -25 KPX v comma -65 KPX v e -15 KPX v eacute -15 KPX v ecaron -15 KPX v ecircumflex -15 KPX v edieresis -15 KPX v edotaccent -15 KPX v egrave -15 KPX v emacron -15 KPX v eogonek -15 KPX v o -20 KPX v oacute -20 KPX v ocircumflex -20 KPX v odieresis -20 KPX v ograve -20 KPX v ohungarumlaut -20 KPX v omacron -20 KPX v oslash -20 KPX v otilde -20 KPX v period -65 KPX w a -10 KPX w aacute -10 KPX w abreve -10 KPX w acircumflex -10 KPX w adieresis -10 KPX w agrave -10 KPX w amacron -10 KPX w aogonek -10 KPX w aring -10 KPX w atilde -10 KPX w comma -65 KPX w o -10 KPX w oacute -10 KPX w ocircumflex -10 KPX w odieresis -10 KPX w ograve -10 KPX w ohungarumlaut -10 KPX w omacron -10 KPX w oslash -10 KPX w otilde -10 KPX w period -65 KPX x e -15 KPX x eacute -15 KPX x ecaron -15 KPX x ecircumflex -15 KPX x edieresis -15 KPX x edotaccent -15 KPX x egrave -15 KPX x emacron -15 KPX x eogonek -15 KPX y comma -65 KPX y period -65 KPX yacute comma -65 KPX yacute period -65 KPX ydieresis comma -65 KPX ydieresis period -65 EndKernPairs EndKernData EndFontMetrics ruby-prawn-2.1.0.orig/data/fonts/Courier-BoldOblique.afm0000644000000000000000000003604712665203156021633 0ustar rootrootStartFontMetrics 4.1 Comment Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. Comment Creation Date: Mon Jun 23 16:28:46 1997 Comment UniqueID 43049 Comment VMusage 17529 79244 FontName Courier-BoldOblique FullName Courier Bold Oblique FamilyName Courier Weight Bold ItalicAngle -12 IsFixedPitch true CharacterSet ExtendedRoman FontBBox -57 -250 869 801 UnderlinePosition -100 UnderlineThickness 50 Version 003.000 Notice Copyright (c) 1989, 1990, 1991, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. EncodingScheme AdobeStandardEncoding CapHeight 562 XHeight 439 Ascender 629 Descender -157 StdHW 84 StdVW 106 StartCharMetrics 315 C 32 ; WX 600 ; N space ; B 0 0 0 0 ; C 33 ; WX 600 ; N exclam ; B 215 -15 495 572 ; C 34 ; WX 600 ; N quotedbl ; B 211 277 585 562 ; C 35 ; WX 600 ; N numbersign ; B 88 -45 641 651 ; C 36 ; WX 600 ; N dollar ; B 87 -126 630 666 ; C 37 ; WX 600 ; N percent ; B 101 -15 625 616 ; C 38 ; WX 600 ; N ampersand ; B 61 -15 595 543 ; C 39 ; WX 600 ; N quoteright ; B 229 277 543 562 ; C 40 ; WX 600 ; N parenleft ; B 265 -102 592 616 ; C 41 ; WX 600 ; N parenright ; B 117 -102 444 616 ; C 42 ; WX 600 ; N asterisk ; B 179 219 598 601 ; C 43 ; WX 600 ; N plus ; B 114 39 596 478 ; C 44 ; WX 600 ; N comma ; B 99 -111 430 174 ; C 45 ; WX 600 ; N hyphen ; B 143 203 567 313 ; C 46 ; WX 600 ; N period ; B 206 -15 427 171 ; C 47 ; WX 600 ; N slash ; B 90 -77 626 626 ; C 48 ; WX 600 ; N zero ; B 135 -15 593 616 ; C 49 ; WX 600 ; N one ; B 93 0 562 616 ; C 50 ; WX 600 ; N two ; B 61 0 594 616 ; C 51 ; WX 600 ; N three ; B 71 -15 571 616 ; C 52 ; WX 600 ; N four ; B 81 0 559 616 ; C 53 ; WX 600 ; N five ; B 77 -15 621 601 ; C 54 ; WX 600 ; N six ; B 135 -15 652 616 ; C 55 ; WX 600 ; N seven ; B 147 0 622 601 ; C 56 ; WX 600 ; N eight ; B 115 -15 604 616 ; C 57 ; WX 600 ; N nine ; B 75 -15 592 616 ; C 58 ; WX 600 ; N colon ; B 205 -15 480 425 ; C 59 ; WX 600 ; N semicolon ; B 99 -111 481 425 ; C 60 ; WX 600 ; N less ; B 120 15 613 501 ; C 61 ; WX 600 ; N equal ; B 96 118 614 398 ; C 62 ; WX 600 ; N greater ; B 97 15 589 501 ; C 63 ; WX 600 ; N question ; B 183 -14 592 580 ; C 64 ; WX 600 ; N at ; B 65 -15 642 616 ; C 65 ; WX 600 ; N A ; B -9 0 632 562 ; C 66 ; WX 600 ; N B ; B 30 0 630 562 ; C 67 ; WX 600 ; N C ; B 74 -18 675 580 ; C 68 ; WX 600 ; N D ; B 30 0 664 562 ; C 69 ; WX 600 ; N E ; B 25 0 670 562 ; C 70 ; WX 600 ; N F ; B 39 0 684 562 ; C 71 ; WX 600 ; N G ; B 74 -18 675 580 ; C 72 ; WX 600 ; N H ; B 20 0 700 562 ; C 73 ; WX 600 ; N I ; B 77 0 643 562 ; C 74 ; WX 600 ; N J ; B 58 -18 721 562 ; C 75 ; WX 600 ; N K ; B 21 0 692 562 ; C 76 ; WX 600 ; N L ; B 39 0 636 562 ; C 77 ; WX 600 ; N M ; B -2 0 722 562 ; C 78 ; WX 600 ; N N ; B 8 -12 730 562 ; C 79 ; WX 600 ; N O ; B 74 -18 645 580 ; C 80 ; WX 600 ; N P ; B 48 0 643 562 ; C 81 ; WX 600 ; N Q ; B 83 -138 636 580 ; C 82 ; WX 600 ; N R ; B 24 0 617 562 ; C 83 ; WX 600 ; N S ; B 54 -22 673 582 ; C 84 ; WX 600 ; N T ; B 86 0 679 562 ; C 85 ; WX 600 ; N U ; B 101 -18 716 562 ; C 86 ; WX 600 ; N V ; B 84 0 733 562 ; C 87 ; WX 600 ; N W ; B 79 0 738 562 ; C 88 ; WX 600 ; N X ; B 12 0 690 562 ; C 89 ; WX 600 ; N Y ; B 109 0 709 562 ; C 90 ; WX 600 ; N Z ; B 62 0 637 562 ; C 91 ; WX 600 ; N bracketleft ; B 223 -102 606 616 ; C 92 ; WX 600 ; N backslash ; B 222 -77 496 626 ; C 93 ; WX 600 ; N bracketright ; B 103 -102 486 616 ; C 94 ; WX 600 ; N asciicircum ; B 171 250 556 616 ; C 95 ; WX 600 ; N underscore ; B -27 -125 585 -75 ; C 96 ; WX 600 ; N quoteleft ; B 297 277 487 562 ; C 97 ; WX 600 ; N a ; B 61 -15 593 454 ; C 98 ; WX 600 ; N b ; B 13 -15 636 626 ; C 99 ; WX 600 ; N c ; B 81 -15 631 459 ; C 100 ; WX 600 ; N d ; B 60 -15 645 626 ; C 101 ; WX 600 ; N e ; B 81 -15 605 454 ; C 102 ; WX 600 ; N f ; B 83 0 677 626 ; L i fi ; L l fl ; C 103 ; WX 600 ; N g ; B 40 -146 674 454 ; C 104 ; WX 600 ; N h ; B 18 0 615 626 ; C 105 ; WX 600 ; N i ; B 77 0 546 658 ; C 106 ; WX 600 ; N j ; B 36 -146 580 658 ; C 107 ; WX 600 ; N k ; B 33 0 643 626 ; C 108 ; WX 600 ; N l ; B 77 0 546 626 ; C 109 ; WX 600 ; N m ; B -22 0 649 454 ; C 110 ; WX 600 ; N n ; B 18 0 615 454 ; C 111 ; WX 600 ; N o ; B 71 -15 622 454 ; C 112 ; WX 600 ; N p ; B -32 -142 622 454 ; C 113 ; WX 600 ; N q ; B 60 -142 685 454 ; C 114 ; WX 600 ; N r ; B 47 0 655 454 ; C 115 ; WX 600 ; N s ; B 66 -17 608 459 ; C 116 ; WX 600 ; N t ; B 118 -15 567 562 ; C 117 ; WX 600 ; N u ; B 70 -15 592 439 ; C 118 ; WX 600 ; N v ; B 70 0 695 439 ; C 119 ; WX 600 ; N w ; B 53 0 712 439 ; C 120 ; WX 600 ; N x ; B 6 0 671 439 ; C 121 ; WX 600 ; N y ; B -21 -142 695 439 ; C 122 ; WX 600 ; N z ; B 81 0 614 439 ; C 123 ; WX 600 ; N braceleft ; B 203 -102 595 616 ; C 124 ; WX 600 ; N bar ; B 201 -250 505 750 ; C 125 ; WX 600 ; N braceright ; B 114 -102 506 616 ; C 126 ; WX 600 ; N asciitilde ; B 120 153 590 356 ; C 161 ; WX 600 ; N exclamdown ; B 196 -146 477 449 ; C 162 ; WX 600 ; N cent ; B 121 -49 605 614 ; C 163 ; WX 600 ; N sterling ; B 106 -28 650 611 ; C 164 ; WX 600 ; N fraction ; B 22 -60 708 661 ; C 165 ; WX 600 ; N yen ; B 98 0 710 562 ; C 166 ; WX 600 ; N florin ; B -57 -131 702 616 ; C 167 ; WX 600 ; N section ; B 74 -70 620 580 ; C 168 ; WX 600 ; N currency ; B 77 49 644 517 ; C 169 ; WX 600 ; N quotesingle ; B 303 277 493 562 ; C 170 ; WX 600 ; N quotedblleft ; B 190 277 594 562 ; C 171 ; WX 600 ; N guillemotleft ; B 62 70 639 446 ; C 172 ; WX 600 ; N guilsinglleft ; B 195 70 545 446 ; C 173 ; WX 600 ; N guilsinglright ; B 165 70 514 446 ; C 174 ; WX 600 ; N fi ; B 12 0 644 626 ; C 175 ; WX 600 ; N fl ; B 12 0 644 626 ; C 177 ; WX 600 ; N endash ; B 108 203 602 313 ; C 178 ; WX 600 ; N dagger ; B 175 -70 586 580 ; C 179 ; WX 600 ; N daggerdbl ; B 121 -70 587 580 ; C 180 ; WX 600 ; N periodcentered ; B 248 165 461 351 ; C 182 ; WX 600 ; N paragraph ; B 61 -70 700 580 ; C 183 ; WX 600 ; N bullet ; B 196 132 523 430 ; C 184 ; WX 600 ; N quotesinglbase ; B 144 -142 458 143 ; C 185 ; WX 600 ; N quotedblbase ; B 34 -142 560 143 ; C 186 ; WX 600 ; N quotedblright ; B 119 277 645 562 ; C 187 ; WX 600 ; N guillemotright ; B 71 70 647 446 ; C 188 ; WX 600 ; N ellipsis ; B 35 -15 587 116 ; C 189 ; WX 600 ; N perthousand ; B -45 -15 743 616 ; C 191 ; WX 600 ; N questiondown ; B 100 -146 509 449 ; C 193 ; WX 600 ; N grave ; B 272 508 503 661 ; C 194 ; WX 600 ; N acute ; B 312 508 609 661 ; C 195 ; WX 600 ; N circumflex ; B 212 483 607 657 ; C 196 ; WX 600 ; N tilde ; B 199 493 643 636 ; C 197 ; WX 600 ; N macron ; B 195 505 637 585 ; C 198 ; WX 600 ; N breve ; B 217 468 652 631 ; C 199 ; WX 600 ; N dotaccent ; B 348 498 493 638 ; C 200 ; WX 600 ; N dieresis ; B 246 498 595 638 ; C 202 ; WX 600 ; N ring ; B 319 481 528 678 ; C 203 ; WX 600 ; N cedilla ; B 168 -206 368 0 ; C 205 ; WX 600 ; N hungarumlaut ; B 171 488 729 661 ; C 206 ; WX 600 ; N ogonek ; B 143 -199 367 0 ; C 207 ; WX 600 ; N caron ; B 238 493 633 667 ; C 208 ; WX 600 ; N emdash ; B 33 203 677 313 ; C 225 ; WX 600 ; N AE ; B -29 0 708 562 ; C 227 ; WX 600 ; N ordfeminine ; B 188 196 526 580 ; C 232 ; WX 600 ; N Lslash ; B 39 0 636 562 ; C 233 ; WX 600 ; N Oslash ; B 48 -22 673 584 ; C 234 ; WX 600 ; N OE ; B 26 0 701 562 ; C 235 ; WX 600 ; N ordmasculine ; B 188 196 543 580 ; C 241 ; WX 600 ; N ae ; B 21 -15 652 454 ; C 245 ; WX 600 ; N dotlessi ; B 77 0 546 439 ; C 248 ; WX 600 ; N lslash ; B 77 0 587 626 ; C 249 ; WX 600 ; N oslash ; B 54 -24 638 463 ; C 250 ; WX 600 ; N oe ; B 18 -15 662 454 ; C 251 ; WX 600 ; N germandbls ; B 22 -15 629 626 ; C -1 ; WX 600 ; N Idieresis ; B 77 0 643 761 ; C -1 ; WX 600 ; N eacute ; B 81 -15 609 661 ; C -1 ; WX 600 ; N abreve ; B 61 -15 658 661 ; C -1 ; WX 600 ; N uhungarumlaut ; B 70 -15 769 661 ; C -1 ; WX 600 ; N ecaron ; B 81 -15 633 667 ; C -1 ; WX 600 ; N Ydieresis ; B 109 0 709 761 ; C -1 ; WX 600 ; N divide ; B 114 16 596 500 ; C -1 ; WX 600 ; N Yacute ; B 109 0 709 784 ; C -1 ; WX 600 ; N Acircumflex ; B -9 0 632 780 ; C -1 ; WX 600 ; N aacute ; B 61 -15 609 661 ; C -1 ; WX 600 ; N Ucircumflex ; B 101 -18 716 780 ; C -1 ; WX 600 ; N yacute ; B -21 -142 695 661 ; C -1 ; WX 600 ; N scommaaccent ; B 66 -250 608 459 ; C -1 ; WX 600 ; N ecircumflex ; B 81 -15 607 657 ; C -1 ; WX 600 ; N Uring ; B 101 -18 716 801 ; C -1 ; WX 600 ; N Udieresis ; B 101 -18 716 761 ; C -1 ; WX 600 ; N aogonek ; B 61 -199 593 454 ; C -1 ; WX 600 ; N Uacute ; B 101 -18 716 784 ; C -1 ; WX 600 ; N uogonek ; B 70 -199 592 439 ; C -1 ; WX 600 ; N Edieresis ; B 25 0 670 761 ; C -1 ; WX 600 ; N Dcroat ; B 30 0 664 562 ; C -1 ; WX 600 ; N commaaccent ; B 151 -250 385 -57 ; C -1 ; WX 600 ; N copyright ; B 53 -18 667 580 ; C -1 ; WX 600 ; N Emacron ; B 25 0 670 708 ; C -1 ; WX 600 ; N ccaron ; B 81 -15 633 667 ; C -1 ; WX 600 ; N aring ; B 61 -15 593 678 ; C -1 ; WX 600 ; N Ncommaaccent ; B 8 -250 730 562 ; C -1 ; WX 600 ; N lacute ; B 77 0 639 801 ; C -1 ; WX 600 ; N agrave ; B 61 -15 593 661 ; C -1 ; WX 600 ; N Tcommaaccent ; B 86 -250 679 562 ; C -1 ; WX 600 ; N Cacute ; B 74 -18 675 784 ; C -1 ; WX 600 ; N atilde ; B 61 -15 643 636 ; C -1 ; WX 600 ; N Edotaccent ; B 25 0 670 761 ; C -1 ; WX 600 ; N scaron ; B 66 -17 633 667 ; C -1 ; WX 600 ; N scedilla ; B 66 -206 608 459 ; C -1 ; WX 600 ; N iacute ; B 77 0 609 661 ; C -1 ; WX 600 ; N lozenge ; B 145 0 614 740 ; C -1 ; WX 600 ; N Rcaron ; B 24 0 659 790 ; C -1 ; WX 600 ; N Gcommaaccent ; B 74 -250 675 580 ; C -1 ; WX 600 ; N ucircumflex ; B 70 -15 597 657 ; C -1 ; WX 600 ; N acircumflex ; B 61 -15 607 657 ; C -1 ; WX 600 ; N Amacron ; B -9 0 633 708 ; C -1 ; WX 600 ; N rcaron ; B 47 0 655 667 ; C -1 ; WX 600 ; N ccedilla ; B 81 -206 631 459 ; C -1 ; WX 600 ; N Zdotaccent ; B 62 0 637 761 ; C -1 ; WX 600 ; N Thorn ; B 48 0 620 562 ; C -1 ; WX 600 ; N Omacron ; B 74 -18 663 708 ; C -1 ; WX 600 ; N Racute ; B 24 0 665 784 ; C -1 ; WX 600 ; N Sacute ; B 54 -22 673 784 ; C -1 ; WX 600 ; N dcaron ; B 60 -15 861 626 ; C -1 ; WX 600 ; N Umacron ; B 101 -18 716 708 ; C -1 ; WX 600 ; N uring ; B 70 -15 592 678 ; C -1 ; WX 600 ; N threesuperior ; B 193 222 526 616 ; C -1 ; WX 600 ; N Ograve ; B 74 -18 645 784 ; C -1 ; WX 600 ; N Agrave ; B -9 0 632 784 ; C -1 ; WX 600 ; N Abreve ; B -9 0 684 784 ; C -1 ; WX 600 ; N multiply ; B 104 39 606 478 ; C -1 ; WX 600 ; N uacute ; B 70 -15 599 661 ; C -1 ; WX 600 ; N Tcaron ; B 86 0 679 790 ; C -1 ; WX 600 ; N partialdiff ; B 91 -38 627 728 ; C -1 ; WX 600 ; N ydieresis ; B -21 -142 695 638 ; C -1 ; WX 600 ; N Nacute ; B 8 -12 730 784 ; C -1 ; WX 600 ; N icircumflex ; B 77 0 577 657 ; C -1 ; WX 600 ; N Ecircumflex ; B 25 0 670 780 ; C -1 ; WX 600 ; N adieresis ; B 61 -15 595 638 ; C -1 ; WX 600 ; N edieresis ; B 81 -15 605 638 ; C -1 ; WX 600 ; N cacute ; B 81 -15 649 661 ; C -1 ; WX 600 ; N nacute ; B 18 0 639 661 ; C -1 ; WX 600 ; N umacron ; B 70 -15 637 585 ; C -1 ; WX 600 ; N Ncaron ; B 8 -12 730 790 ; C -1 ; WX 600 ; N Iacute ; B 77 0 643 784 ; C -1 ; WX 600 ; N plusminus ; B 76 24 614 515 ; C -1 ; WX 600 ; N brokenbar ; B 217 -175 489 675 ; C -1 ; WX 600 ; N registered ; B 53 -18 667 580 ; C -1 ; WX 600 ; N Gbreve ; B 74 -18 684 784 ; C -1 ; WX 600 ; N Idotaccent ; B 77 0 643 761 ; C -1 ; WX 600 ; N summation ; B 15 -10 672 706 ; C -1 ; WX 600 ; N Egrave ; B 25 0 670 784 ; C -1 ; WX 600 ; N racute ; B 47 0 655 661 ; C -1 ; WX 600 ; N omacron ; B 71 -15 637 585 ; C -1 ; WX 600 ; N Zacute ; B 62 0 665 784 ; C -1 ; WX 600 ; N Zcaron ; B 62 0 659 790 ; C -1 ; WX 600 ; N greaterequal ; B 26 0 627 696 ; C -1 ; WX 600 ; N Eth ; B 30 0 664 562 ; C -1 ; WX 600 ; N Ccedilla ; B 74 -206 675 580 ; C -1 ; WX 600 ; N lcommaaccent ; B 77 -250 546 626 ; C -1 ; WX 600 ; N tcaron ; B 118 -15 627 703 ; C -1 ; WX 600 ; N eogonek ; B 81 -199 605 454 ; C -1 ; WX 600 ; N Uogonek ; B 101 -199 716 562 ; C -1 ; WX 600 ; N Aacute ; B -9 0 655 784 ; C -1 ; WX 600 ; N Adieresis ; B -9 0 632 761 ; C -1 ; WX 600 ; N egrave ; B 81 -15 605 661 ; C -1 ; WX 600 ; N zacute ; B 81 0 614 661 ; C -1 ; WX 600 ; N iogonek ; B 77 -199 546 658 ; C -1 ; WX 600 ; N Oacute ; B 74 -18 645 784 ; C -1 ; WX 600 ; N oacute ; B 71 -15 649 661 ; C -1 ; WX 600 ; N amacron ; B 61 -15 637 585 ; C -1 ; WX 600 ; N sacute ; B 66 -17 609 661 ; C -1 ; WX 600 ; N idieresis ; B 77 0 561 618 ; C -1 ; WX 600 ; N Ocircumflex ; B 74 -18 645 780 ; C -1 ; WX 600 ; N Ugrave ; B 101 -18 716 784 ; C -1 ; WX 600 ; N Delta ; B 6 0 594 688 ; C -1 ; WX 600 ; N thorn ; B -32 -142 622 626 ; C -1 ; WX 600 ; N twosuperior ; B 191 230 542 616 ; C -1 ; WX 600 ; N Odieresis ; B 74 -18 645 761 ; C -1 ; WX 600 ; N mu ; B 49 -142 592 439 ; C -1 ; WX 600 ; N igrave ; B 77 0 546 661 ; C -1 ; WX 600 ; N ohungarumlaut ; B 71 -15 809 661 ; C -1 ; WX 600 ; N Eogonek ; B 25 -199 670 562 ; C -1 ; WX 600 ; N dcroat ; B 60 -15 712 626 ; C -1 ; WX 600 ; N threequarters ; B 8 -60 699 661 ; C -1 ; WX 600 ; N Scedilla ; B 54 -206 673 582 ; C -1 ; WX 600 ; N lcaron ; B 77 0 731 626 ; C -1 ; WX 600 ; N Kcommaaccent ; B 21 -250 692 562 ; C -1 ; WX 600 ; N Lacute ; B 39 0 636 784 ; C -1 ; WX 600 ; N trademark ; B 86 230 869 562 ; C -1 ; WX 600 ; N edotaccent ; B 81 -15 605 638 ; C -1 ; WX 600 ; N Igrave ; B 77 0 643 784 ; C -1 ; WX 600 ; N Imacron ; B 77 0 663 708 ; C -1 ; WX 600 ; N Lcaron ; B 39 0 757 562 ; C -1 ; WX 600 ; N onehalf ; B 22 -60 716 661 ; C -1 ; WX 600 ; N lessequal ; B 26 0 671 696 ; C -1 ; WX 600 ; N ocircumflex ; B 71 -15 622 657 ; C -1 ; WX 600 ; N ntilde ; B 18 0 643 636 ; C -1 ; WX 600 ; N Uhungarumlaut ; B 101 -18 805 784 ; C -1 ; WX 600 ; N Eacute ; B 25 0 670 784 ; C -1 ; WX 600 ; N emacron ; B 81 -15 637 585 ; C -1 ; WX 600 ; N gbreve ; B 40 -146 674 661 ; C -1 ; WX 600 ; N onequarter ; B 13 -60 707 661 ; C -1 ; WX 600 ; N Scaron ; B 54 -22 689 790 ; C -1 ; WX 600 ; N Scommaaccent ; B 54 -250 673 582 ; C -1 ; WX 600 ; N Ohungarumlaut ; B 74 -18 795 784 ; C -1 ; WX 600 ; N degree ; B 173 243 570 616 ; C -1 ; WX 600 ; N ograve ; B 71 -15 622 661 ; C -1 ; WX 600 ; N Ccaron ; B 74 -18 689 790 ; C -1 ; WX 600 ; N ugrave ; B 70 -15 592 661 ; C -1 ; WX 600 ; N radical ; B 67 -104 635 778 ; C -1 ; WX 600 ; N Dcaron ; B 30 0 664 790 ; C -1 ; WX 600 ; N rcommaaccent ; B 47 -250 655 454 ; C -1 ; WX 600 ; N Ntilde ; B 8 -12 730 759 ; C -1 ; WX 600 ; N otilde ; B 71 -15 643 636 ; C -1 ; WX 600 ; N Rcommaaccent ; B 24 -250 617 562 ; C -1 ; WX 600 ; N Lcommaaccent ; B 39 -250 636 562 ; C -1 ; WX 600 ; N Atilde ; B -9 0 669 759 ; C -1 ; WX 600 ; N Aogonek ; B -9 -199 632 562 ; C -1 ; WX 600 ; N Aring ; B -9 0 632 801 ; C -1 ; WX 600 ; N Otilde ; B 74 -18 669 759 ; C -1 ; WX 600 ; N zdotaccent ; B 81 0 614 638 ; C -1 ; WX 600 ; N Ecaron ; B 25 0 670 790 ; C -1 ; WX 600 ; N Iogonek ; B 77 -199 643 562 ; C -1 ; WX 600 ; N kcommaaccent ; B 33 -250 643 626 ; C -1 ; WX 600 ; N minus ; B 114 203 596 313 ; C -1 ; WX 600 ; N Icircumflex ; B 77 0 643 780 ; C -1 ; WX 600 ; N ncaron ; B 18 0 633 667 ; C -1 ; WX 600 ; N tcommaaccent ; B 118 -250 567 562 ; C -1 ; WX 600 ; N logicalnot ; B 135 103 617 413 ; C -1 ; WX 600 ; N odieresis ; B 71 -15 622 638 ; C -1 ; WX 600 ; N udieresis ; B 70 -15 595 638 ; C -1 ; WX 600 ; N notequal ; B 30 -47 626 563 ; C -1 ; WX 600 ; N gcommaaccent ; B 40 -146 674 714 ; C -1 ; WX 600 ; N eth ; B 93 -27 661 626 ; C -1 ; WX 600 ; N zcaron ; B 81 0 643 667 ; C -1 ; WX 600 ; N ncommaaccent ; B 18 -250 615 454 ; C -1 ; WX 600 ; N onesuperior ; B 212 230 514 616 ; C -1 ; WX 600 ; N imacron ; B 77 0 575 585 ; C -1 ; WX 600 ; N Euro ; B 0 0 0 0 ; EndCharMetrics EndFontMetrics ruby-prawn-2.1.0.orig/data/fonts/Panic+Sans.dfont0000644000000000000000000066740612665203156020336 0ustar rootrootnRmR LTSHB>&G@OS/2W`PCLT!?Ό6VDMXnOuTcmap(._"|rcvt  22fpgma(gasp΀ glyf%wP4Duhdmx=5& 4HheadI,6hhea ?d$hmtxϴ8locamaxp name W(postprep2*D#_<DDmmMF@W/GBGSf   JBits@ m` hR!9\XffXXX%fmVuu/9%fZH{{{mjdLhX%%u{{{{+?j?X)XVX%PJ)/X;XwP%%uHXuh%fZ##%%uuu)=/VX)L%hXXBFf{{d%?y77 /    !" #!$"%#&$'%(&)'*'+(,)-*.+/,0-1.2/30415263748495:6;7<8=9>:?;@<A=B>C?D@EAFAGBHCIDJEKFLGMHNIOJPKQLRMSNTNUOVPWQXRYSZT[U\V]W^X_Y`Za[b[c\d]e^f_g`haibjckdlemfngohphqirjsktlumvnwoxpyqzr{s|t}u~uvwxyz{|}~                   ,   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~FR@~ 1BS_ax~    " & 0 : !"""""""""+"H"`"e%  0AR^`x}    & 0 9 !"""""""""+"H"`"d%^ChVjޖޢދާtq_/0Pbcdefghjikmlnoqprsutvwxzy{}|~FR@~ 1BS_ax~    " & 0 : !"""""""""+"H"`"e%  0AR^`x}    & 0 9 !"""""""""+"H"`"d%^ChVjޖޢދާtq_/0Pbcdefghjikmlnoqprsutvwxzy{}|~, %Id@QX Y!-,%Id@QX Y!-,  P y PXY%%# P y PXY%-,KPX EDY!-,%E`D-,KSX%%EDY!!-,ED-,KPXYD_^-, EiD`- ,*!- , F%FRX#Y Id F had%F hadRX#eY/ SXi TX!@Yi TX!@eYY:- , F%FRX#Y F jad%F jadRX#Y/- ,K &PXQXD@DY!! EPXD!YY- , EiD` E}iD`-, *-,K &SX@Y &SX#!#Y &SX#!#Y &SX#!#Y &SX#!@#Y &SX%EPX#!#!%E#!#!Y!YD-,KSXED!!Y-+]A GA% } % 2  %%@Y}2}Y&Y@&//2G@Gddkߖږ؍ }:Ս :  ϊ̖ˋ%}Ś   ]%]@%AA dd@2(-}-d   ..A]%]@%%%A  %d%BSx~}~}}|{zwvut uu@t tss@rqponSonm(nSm(lk2ji2hgfedcbcbba`_^Z ^]d\[Z [Z YXWVUU2TSRQ}PONM-MLK(JIJ7ICIHEHGCGdFEFEDCD7CBCC@@ BABB@ A@AA@ @? @@@ ? ? ?@@d>=-=<;(:9B9d818K76-65K404K3032B21-10/-/. .-,--@ ,,,@@+*%+* *%):)('&%B%E$#""! -!} -KBBF-B-B-B@  @   @    @  @7    -:-:-d++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++f 7X!uu9!{Xm{o{RoZ!=fs +b#1N {T\q#w`j#fy```{{w`b{!{RNNfffHF?{L'oo5jo{-{3=foD7f}s*hh/10!%!!hsr) @ <2991/03#3#qeR@1<20###Ѯ++J@0     91/<<<<<<<2220333!3!###!5!!5!#3hiiThiih)T/hTaabbNZ /d@9($)%/%$(!$, ( 0<2<1/299990>54&'#.'5.546753.'n|phumdfbdcӿdOTUPDNtd]gp^Vd-.)>B+/Qš ! *9V@/7(" "7(.+  % 4  + :99991/9999032654&#"4632#"&'%32654&#"4632#"&iNMklLNi@s..2H#)iOMllMMk@u--1?NjkMMljO0./t?``OikMMkjN0--uA9*7@b  -,.+2345617B7 1 +"1"!% (! 7+!(!(! .899999991/9990KSX999Y" >54/3#'#"5467.54632.#"3267>7#'&JKNSj抋20ǭAF;}Eap:6\[ț*\,#1h F'XmFD ̉dHG'%[M;I\ 10#+u @  29910#&547u;:\' @  299103#654\<<J+N@,       <2<2991<22990 %#'-73%+f9s9f9PsPbybcyXqy '@    <<1<<0!!#!5!CDDD/@ 103#Śc/%+ +01!!5ɤ11/03#1fB7@ 103#ymL # @  $!"!$10@////////// / / ?????????? ? ? OOOO O ____ _    F////////// / / __________ _ _  $]]4632#"&"32'2#"M68PO98K7PP78NL0670xx~F &@ ## 1/20%!5%3!!:P6ȪuLJժ#Q@)%%B   "$91/20KSX92Y"%!!567>54&#"5>32uu5dF[pga Yd8ժ.>zO}BC12`tA7(G@)  #)&" )9190#"&'532654&+532654&#"5>32ggfbYhyI'Ǖ&$54zms{(( ۵{fo B@   B    $<291/<290KSXY" !33##!5)!3d-=@"   "190!!>32#"&'532654&#"+W,wN\aQFժ 21%%L$=@#  %"& "%190.#">32# !2"32654&?M0n#J݁%'dkuzl75@%%B"991/0KSXY"!#!5V+N #/C@% '-'0 $*$ "!0991990"32654&%.54632#"$54632654&#"hʁ򑁖Myz{yŗT!Ѳ!!ȟɠbx~~xzF $;@" ""%"  &%1902654&#"532#"543 !"&T?M/nI%'!dk  os'@ <21/03#3#'9' %@  103#3#Śc /Xyw!@('29190 5yR!÷X`y@ <210!!!!X!! BXyw!@('<919055X!R^^="{@B  %%B !    ) #99991/9990KSX99Y"#546?>54&#"5>323#=TZ>/mNb^hC^XE&bRY;X1YnED98L\VBT=/s 4p@1(+$ 4 '$+1+5' ( + . !+ -.5<991999990@ ]4&#"326#5#"&5463254&#"!267# !2kkkk%RӡP$J6l90?{:]x<!o?DF=?z% @A%%%% % % %  % B   / 91/<90KSXY"]@    ]]!3#!#hnl#+{q +  + + A]A)9IYiy ]9/A]A)9IYiy ]ܺ9" + + + 90132654&#32654&#%!2)qﰖ뒃JF{D`N}qdƵ|1.@  2 10210%# !2.#"32671M[?[MJVXI5))pn))=@@=R(@  2 1099991/0%26&!# )`dVDѦHKw/N )@  13 21/0!!!!!!vTrwժFX $@14 21/0!!!!#o\eժH7fP<@!   6251990%# !2.#"3267#5!PQv@^PQ_ſCe){KMon56MI!H &@ 1 0 221/<203!3#!#)d+9 %@ 77 221/220!!!!5!!=99ժm,@    51990753265!5!#"&m[hqG`=QQD, @!% %B  0 291/<290KSXY"]@L&&6FUWX dzy{ ',+&:IGG[WXXWkzx]]33 ##wVhs@ 141/03!!dժVy @,  B    / 0 91/<290KSXY" ]@$  &)&) 6968  ]]! !###V+'F m@B10 991/<2990KSXY"]@&)&8Wdjuz &)FIWgh]]!3!#3+3u\ #@ 2 62510#"32#"32IIz~u+@  2 8 3291/032654&#%!2+#ꌝL/ϔu\=@   2 625999919990"#"32#"32ȗyHdIj@8  %%B     21  0299991/<9990KSX9Y"#.+#!232654&#NnRٲM{cݑohy]ҔYJ'@=  %  %B %( &919"0(9999190KSX99Y"]@ ]].#"#"&'532654&/.54$32\^mjikshulм V;=3#"&'.  yVWx! 9FBjiCE:= m];<<;\l^h?;::;>9L@)%%%%B/091/290KSXY"%3#3h_KKѪ++ @D    %%% % B    /91/<<90KSXY" ]@^ //+ ??8 ZZ  &*%*(+ % & 5:5:;: 4 6 TTZXWV[[RW X ] gh yvy v #]]333# #ŏӬ߿ʿD"+w @K % % % %%%% % B   ;/; 0 91/<290KSXY"7]@8  '()& X xyw !%+% 5UYX es]]3 3 # #VHNAu3B}%Y@.%%%%B<< 9991/290KSXY"3 3#%lk!mb E@%%B/0 991/0KSXY"]]!!!5!" ՚ow@=210!#3!XfB7@ 10 #%mZ@=210!53#5XޏH@ 91290 # #Ȳu-|q+ +01!5qf1@ <10K TKT[X@878Y #fx#{ )n@*  ! $   D >*22991/99990@00 0!0" ]#"326757#5#"&546;5.#"5>32=zl;^[fX=& 3qpepӺ)Ld_y64''RR2X 0@  G F221/9904&#"326>32#"&'#3,fd./xRXWS%{/@   F210%# !2.#"3267%JR%QNI]`A9++88*,A:;>{0@G H221/9903#5#"3232654&#"Z.deCSW;7W {X{U+//ܸи/ܺ 9и/ + + +01!3267# 32.#"X㿮Xmi[ lZ89++9 @޷'4@     <<2991/22990#"!!#!5!5463'cM+Qgc/яN{H{ )H@' '  $(*' G!H*221999904&#"326#"&'5326=#"3253ZLSbC,ml/9.,}^\::VZ,@  J  F21/<990#4&#"#3>32jq1sJ`cD .@ L LK <<1/20!!!5!!3#mnm`/BCV 8@   <2991990!5!+53263#XZZӜ} @:  B  DE 291/<90KSXY"]@R546Ffuv ('(;;797JIYYkiiiyxyy]]33 ##Gb{ZFB?  &@   L 991/990;#"&5!5![Y饵|~mo{"@'  MNMNME#<91/<<<299990@G000000 0 0 ????????? #]K TKT[KT[X#@##878YKTX###@878Y>32#4&#"#4&#"#3>32"iJo5FP;9JI9!c?LeHEws{p{``32jq1sJ``cH{ #@  D>10"32654&'2#"hڜ-.VT{3@ GF221990%#3>32#"&4&#"326w.df SWWRw 3@   G>22199032654&#"#"3253#L-ed.+SY7:WSj{O@   21/990@%  0030@@C@PPPP].#"#3>32;zI.Dv6y.*`w"${'u@@    B %( OI"E(99991990KSX99Y".#"#"&'532654/.54632OS}{\JSjgTzEZ9..QSKJ#}##55cY1!1@  <<2991/<2990!!;#"&5!5!f^^uϪ+|b`>^,@    JF21/2990332653#5#"&økp1qJyaddm`e@)BIE91/290KSXY"']@%]]3 3#dEFr`T` @E      B    /91/<<90KSXY" ]@      &&)&))#, 96993< EI F J VX W Y fifij e vzx| r -   ++>>< H Y jih {yz|  ]]333# #àö`wBfL` @H      B  IE 91/<290KSXY" ]@ fivy  :4 ZV ]] # # 3 ^oo)'`?HkhV`@E       B   IE9129990KSX9Y"8]@v  &&8IIY ]]+532673 3Z.Gc".\mQ\GOLGhu:NN^Nlb X@BIE 2991/0KSXY"8]@68EJWXejuz ]!!!5!-}bܖ%$f@5 %   !  % $  = %<<29999999199999990#"&=4&+5326=46;#"3@k>>j@FU[noZUtrݓWV10#$j@7%   #%#= %<2<9999999199999990326=467.=4&+532;#"+DVZon[VD>k@@k>XXrtݔXy &@  '1<2990#"'&'.#"5>32326yKOZq Mg3OINS5dJ t]F ;73 !;?<6 7=%N&$u%m !@W % %%% %!%! %!! % !B     !  PPK/K!"2299999991/<9990KSXY"]@  ]]4&#"326!.54632#!#Y?@WX??Y:Arr@;nlZ?YWA?XXP!yIrrIv${u1&&dNk&(uF^&1uu\N&2u=N&8u#f&D#f&DC#f&D#&D#7&D#&Du%{&Fh{Xf&H{Xf&HC{Xf&H{X&HDf&Df&CDf&D&7&QHf&RHf&RCHf&RH&RH7&Rf&Xf&XCf&X&X;/ '@  RQ R <<1<203!!#!5!nn\]+u @ STS 102#"&546"32654&hAu,-/OomOPqp1.-rBoPPlnNOp%!N@*   " E"<<<2212<990.'>7#&5473%C??BI9gg9ބ5(,-("9="+` 츸X>@     <<1/2<2990.#"!!!!53#5354632D>Cs3A,,ُ/я= 2>j@<#$93 $*0?#54&S9akԂ[]=:̭IWW9fqր][<;ȧH>=><''PGZsweZ54m@''TLf{xf[1,pE-Z/L-Z/L?!   V 104632#"&?}|}||{|j; #@WW1 9120!###.54$FfNݸ}/V@1-'!  **.  !' $'$-DF099991/9904632#"&'532654&/.5467.#"#7C:oEBL;lAxC\[yqyrq|d1M*%]taQG_J'8O#kr}N4L@I  ] ] B   A)5)M  \\ [G#X;#Y//29999129990KSX9Y"2#'.+##32654&2#"&'.5467>"3267>54&'.XXP:&rk1=-7ffZJJDZZ\[[[~}[[[\ZZ~jKKMMKLijLLKLKKLbeG]C;P*T6?>5VZZ[~}[[[[[[}~[ZZgJKKjhKLLLLLijKKJ}N1ID@'  &>>2J\ ^,8 8YD/210.#"3267#"&54632'"3267>54&'.'2#"&'.5467>`:o:u8g24r=г=rjKKMMKLijLLKLKKkZZ\[[[~}[[[\ZZ/lhȬJKKjhKLLLLLijKKJgZZ[~}[[[[[[}~[ZZfh@6    B     ` `_`_/91<<2<<90KSXY"###5!3###r}r7q^^-Bf1@ <10KTK T[X@878Y3#f?F\@aa1<20K TK T[KT[X@878YK TKT[X@878Y3#%3#?X%y<@     <291<2<<990!3!!!'7#5!7!X}y}J;fժhӬg@7 % %%%B    c /<291/<20KSXY"!!!!!!#!3eex5ժFժ +k@:+)&  *&&, #* #)+262#5,999999991/9999990324&' .#"#"&''7&5327sT sV)+y=g %s9d/NZIn-QUPeQzQQFIRPJ) /7@$ '! -0 $dd*099991<2<299032654&#".#"3267>32#"&'#"&546329[=G[TFBi8\=G[SDCj~/[w~SNAU}^sdlkutcjmvu۠d|k֥sXy.@    <2<21/<<07!!!!#!5!X!dCDLIVw? (@( ' <2291/905!5w!!LK Xy? (@ (' <<291/90-5!!X#!!V%@D% % %%B  < e e<<2<299991/2<2<290KSXY"3 33!!!#!5!5'!53%lkVoqZmo#o o#oT` L@*  !   JF!99912<9903326533267#"&'#"&'øxo ! &D">K .Y\,T H;8 OOPNLP-):@'! '! @ * $$*9991990>54&#"#"&54632#"&54324&#"32JIH7$$0e՘ݢe WOmVPmmWKt,>bFأ[t}t{L= 7   @  <91990!!5 5!!LR%# Չ\P_L9@ 120!#!L^PL?@!   hggf91/2299990!#3267#"&5!##P117,#J%q\TL@H? HL%1  @ & &1026732#"&'.#" #"&54632j Pd@7*9  kOeD=!0 l9TA6?&#Hn!bSA8?T %)d@6  (&&  #*& (' j kji*22999199990"326=7#5#"&546;54&#"5>32!!|WHi1Rwu3}CD?kdPDN@Ms=@pABtZ\#! { 3@   jkji9910"32654&'2#"&546!!hfssfeusgʫ˫\{u༻߻`{J>@#qqro prol 991/<20353&5323!5654#"J{n !o{1xx 7oȼ߅LI L){ C@I=70 6 %C "76. 3@:("D%=/.M/u MCM6+sD299912<2<2<999990@ 05060708]5#"32654&#"!3267#"&'#"&546;54&#"5>32>321xYS\JMWWLepO27Gn 'aȿuc^8>M<[|%!YHZqYa4+#"33)+RNPPXx+'#!?@=B/ +s@>+,&  )&  *&& &,+,* # )#D>,99999999199999990 32654&'.#".5327#"&''m1$eA H#cC')d<]*,g9\ //4o0.0tGGq.78MBz;54565#53%=TZ>/mNb^hC^XC&DbRY;X1YnED98L\V@T? @ <2991/0533)eqXsy^@ '10!#!X!^?; /@     99190'%3##d)#Ӕ/}b%9V#@N   B   !$  /912299990KSX99Y".#"!!#"&'53267#5!>32$R,fs-/d+Ǻ9f.1d0`yu1Ɣ1c|ɏ!JX1y7K@&' 10+5  * 5'.810*8<2991<2<<99990#"'&'.#"5>32326#"'&'.#"5>323326yKOZq Mg3OINS5dK t]FJKOZq Sc1NJOR` t]Dï;73 ";@<7  6<а;83 $77 7=O@*iiiiB91/90KSXY"#3 !qw# /@    v v<2991<2990 5 5L-+-+#RR\# /@   vv <<991<2990 5 %5 +-:+-#^R^  ^R^  P1 #@   1/<<2203#3#3#P3f111%k&$u%^&$uu\^&2uH;@     -299991/220%! )!!!";(RH=MKF{ 8i@92/ & 8   #5/)#92& MuMCM,s9299912<229999904654&#"265&#"!3267#"&'#"32>32PVWMfRPhgPPcpP/;}Jb04TY/%W & +#T53+)CBDA88>A>Ay/10!!/yy/10!!/y %@   1<20#53#53Ěb5Ǚb~~ '@   1<203#%3#řb5Ěb-@ 10#53Ěb~-@ 103#1řbXyo '@ w <<103#3#!!j!u#\u"@91990 h 9%-hV&\%N&<ufB7@ 103#ymLB /@ (-  * -'! @') -0)$ !'$* xyx( $02299999999912299999999904&#"3267'#"&''7.5467'7>32d|[Z}}Z[|Z^.[20`0\^.[3.^Z{{Z\}~t]1]02[-^Z3].2]-_Z/#@ v29190 5/-+#Ry#@ v<9190 5 +-#^R^  #7N@*        JEE<2<2991/<299903#'#"!#!##535463wcM%ɩQge/яN#7B@#    JE E<<991/<29990#!"!!##5354637cM%۸ɩ{Qge/яN;/<@  R Q R <<2<<212<220%!#!5!!5!3!!!/nnnn\\/`103#`/103#Śc// * @  1<203#%3#řb5Ěb/'3?Kt@%1= 1%+C@&7IF:4(:PFz4P@ PzP"P.zP@(/99991/<22299990'32654&#"4632#"&32654&#"4632#"&32654&#"4632#"&H%'H_EDbcCE_yxxwyLaEEacCEayyxxy aEF`bDEayyxxy7a`JGacECcaEyxyEaaECcaExxy"GaaGCcaExxy%m&$uNm&(u%k&$uNN&(uNk&(uk&,um&,uN&,uk&,uu\k&2uu\m&2uu\k&2u=k&8u=m&8u=k&8uD` "@LLK 1/20!!!5!!mnm`/B)f7@  91290K TKT[X@878Y3#'#f7@!   PP99991<<99990K TK T[X@878YKTX@878Y@?       ]'.#"#>3232673#"&d9!&$|f['@%9! '$}f['@Z7JQ!7JQ=b10!!=V/)H 8 @ PP1<0K TX@878Y332673#"&/w `WU`w HLJJLD6@ a10K TK T[KT[X@878Y3#V{ W @  P{P10K TK T[X@878YK TX@878Y#"&546324&#"326{tsst{X@@WW@@Xssss?XW@AWXu)'  @ |1/90!#"&'532654&'85xv-W,"K/:=,,>i0Y[ 0.W=XfZ@991<20K TKT[X@878YK TX@878Y3#3# fxu"  @  |1/90!33267#"&546w-+76 >&Dzs5=X.. W]0i)f7@  91<90K TKT[X@878Y373xs 7@   1 4<2.9991/903%!!'7;NwdPo;jnL >@!    <<2999991/9990;#"&5'!5!%[Y饵P{;Pu|~$o/nJm&6uf&Vm&=uf&]!<210##  N ;@!    21 0 0<291/220 )#5326&!#!!VD}}/`ŕ{HK+H)@O B $ *'! !'D! >*999999199990KSX9Y"#"32.''7'3%.#"32654&Ŷ"#!H&!!#R-:/(  (-Y,\bPȑ^b n%k&<uhVf&\4 @  28  32299991/032654&#33 !##ꞝL!󄃃VT3@ GF221990%#3>32#"&4&#"326w.dfSWWX-y10!!X!ת;T .@     <91<290 7   ^t^_t\t%\^u^uw^X 9A      @  aW}a 12035733!j c)t'+nB}a@WWBA     @9991990KSX9Y"!!57>54&#"5>32eQdR1q?Ay;Jwrnaz3=L$$}k9wuF(\A          @#) & )99190#"&'532654&+532654&#"5>32^c:r;Eq-evnmBJ]b`W,p;Eu2X`lP|yQDJLl?<8?yvcG]Z{'&  WZ{'& WZ'&  WfPm&* u{HH&JP&, uuJ&6u{&V1k&&Zu%f&FZ1m&&Zu%f&FZ{$H@ "  @"   GH%<<1/<2990!5!533##5#"3232654&#"Z1.de5yySW;7W dm10!!d /`103#`%%3p@< 1& (# #43('1)-&- 2'-4229999999999122<2032.#"!!!!3267#"#73&'&54767#70TJBN1Fi1OCHU,1u1!(*=Dl-.&nC>*( n -/ l?Q@ aa1<20KTX@878YKTK T[X@878Y3#%3#?Zk10K TX@878YKTX@878Y@&  //// //]]3#@   99991<<990KTKT[X@878Y@t        !      ]]'.#"#4632326=3#"&d9 #(}gU$=19#(}fT"<9! 2-ev 3)dwyi10K TX@878YKTX@878YKTX@878Y@ //]#1Ś7]@ 91<90K TX@878YKTX@878Y@ //, ]3#'# ӌ7i@ 91290KTX@878YK TX@878Y@ //*//]373 ӌ Zj@ 9910'3$ll  5   @  W <291<29033##5!5 !wtt}oyc/ @ PP120332673#"&/w dRSaw 6978w{za103#&&&&LnL~<ht\Npz  l  ^ @ l 6 R @ z 4Vd Bdx^FR 8 F" Pl& LX ".:FR^jv*6BNZ$n N t!!\!!""d"#H#~##$F$$%4%X%%&f&''(,((())**R****++ ++d+,,,H,v,,,- --"-<--..^...//J//0 00"0.0:0F0R0^0j0v00000011112N2223$3^3333334J4445,5v5556T666667777(747@7L7X7778l8899::N:j::::a ak r |  0  7 8        0  D  ^ ` p :  0  n :Modifications (c) 2006 by Panic, Inc. Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Panic SansRegularPanic SansPanic SansVersion 1.000PanicSansBitstream Vera is a trademark of Bitstream, Inc.Panic, Inc. / Bitstream, Inc.http://www.bitstream.comCopyright (c) 2006 by Panic, Inc. / Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.Modifications (c) 2006 by Panic, Inc. Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Panic SansRegularPanic SansPanic SansVersion 1.000PanicSansBitstream Vera is a trademark of Bitstream, Inc.Panic, Inc. / Bitstream, Inc.http://www.bitstream.comCopyright (c) 2006 by Panic, Inc. / Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.+  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~     NULL sfthyphenperiodcenteredEuroc6459c6460c6461c6468c6470c6472c6477c6478c6475c6476B`#cVeraSansMono6628R00@l LTSHA@&F<OS/21`PCLTc46VDMXnOuPcmap(._"xrcvt In/fpgmN7X(gasp( glyf/uV1lw0hdmx32` 0HheadnI,6hhea "d$hmtx ϜQ4locaU maxp nameo$ postʌprepQ^*| _<DDmm  ME@/GBGSf   JBits m` h!%5yBjq{s}fosXXX!}umuVw\\Zj9so/9^Z\bZRbZ#oP7;X!!w\j^^^^^^\\\\bbbbbwF-N XXXHZX1 Xw9!!\DBu;qZ  j!!\\\jjj -Lo)%sb;Bw9///ubZ-- /     !" #!$"%#&$'%(&)'*'+(,)-*.+/,0-1.2/30415263748495:6;7<8=9>:?;@<A=B>C?D@EAFAGBHCIDJEKFLGMHNIOJPKQLRMSNTNUOVPWQXRYSZT[U\V]W^X_Y`Za[b[c\d]e^f_g`haibjckdlemfngohphqirjsktlumvnwoxpyqzr{s|t}u~uvwxyz{|}~             ,   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~FR@~ 1BS_ax~    " & 0 : !"""""""""+"H"`"e%  0AR^`x}    & 0 9 !"""""""""+"H"`"d%^ChVjޖޢދާtq_/0Pbcdefghjikmlnoqprsutvwxzy{}|~FR@~ 1BS_ax~    " & 0 : !"""""""""+"H"`"e%  0AR^`x}    & 0 9 !"""""""""+"H"`"d%^ChVjޖޢދާtq_/0Pbcdefghjikmlnoqprsutvwxzy{}|~, %Id@QX Y!-,%Id@QX Y!-,  P y PXY%%# P y PXY%-,KPX EDY!-,%E`D-,KSX%%EDY!!-,ED-,KPXYD_^-, EiD`- ,*!- , F%FRX#Y Id F had%F hadRX#eY/ SXi TX!@Yi TX!@eYY:- , F%FRX#Y F jad%F jadRX#Y/- ,K &PXQXD@DY!! EPXD!YY- , EiD` E}iD`-, *-,K &SX@Y &SX#!#Y &SX#!#Y &SX#!#Y &SX#!@#Y &SX%EPX#!#!%E#!#!Y!YD-,KSXED!!Y-+@tGG22dk  Y&Y@&2G@AGA2k2%e}f2 ]%]@%e2d~}d|S{f{2zez2yxfxdwvts s rq.rq.pfp}onmnml]mmli%l]l@kkji%ji@%hfhdgfgdfefedcba}`^d\[\[Z2Y-YXWWV2UTS TS RQRQPQPONMdNMdLKJIJIHGF}EDE}DCA?2>=<=<; <; :9:98 998 8@76776-6545K4343212d1-10/@0D/.-.-,--@@ ,+,,@ +*++@ * **@W)K('K&$&$%$%K$$#""2! 4!>  42@ @@ @WK77222X}X       @   @   @ @  d+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++3#N\{#'##\ #\\w#3b##\b b b%%1/#/ 9bRsq#oVd\Hf```{\{`o7L'5%={D=!/s*hh@ b/10!%!!hsr) @ d <2991/0!!!#  !#qe@ d1<20!!!++J@0g g    91/<<<<<<<2220333#3!####5!#5!#3_^aJ^^^^J^Jvuu%vD /P@+)%$(hh!/$, ( 0<21/<22290>54&#.'.546753.'?FE>??ˍWggU̹GP>[ٴ O=>O-C:9L-.+=BI' (0Ϭ ! '3V@-(  (kk kj.k%1"+1""499991/999904632#"&"32654& 4632#"&"32654&!?9PP9:OP)˹=8ON9:QRXO::OO:9PP`^P::OP99Q%*8@Z)(*()(-,.+23456718%8+(%#1) #1p#popnr)($ +.#  .8 )$. 9999999991/99990KSX999Y"%#"5467.54632.#">54&'3!32676767fKWꍋ20ID@APR=D9DI"BCr;H23ёXN<$%86$~f &b993V+wIz  d10!+ @ut  29910#&547䟚@=5R @ut  299103#6545䞛䄀=?y9TJ@(   n   <2<2991<22990 %#'-73%TJLLLLKLXXB\ #@ v    <<1<<0!!#!5!RPRPjo@ w 10!#9co+ +01!!5ow 1/0!!MoqB`@ d103#m{V #$@ x! xn!r$  $10@////////// / / ?????????? ? ? OOKKKKK K O TTTPPPTT T ddd```dd d    T////////// / /   $]]4632#"&"326&32#"H45HH54H|f^^fg^^5HH54HGB~{|~o $@xxdx  1/20!%!!!J5JML J/s'[@/% zy xnx    991/990KSX9Y"!!577>54&#">32uL=KByoOkk^;H5/FVAdm?<')ݿX^D}L(G@)p zy#p z y pnr) &  )9190#32654&#">32!"&'32654&%nyynTgg\qd^xxWOS]*( !εǢ&$/1o^s}fu B@   % xd   <291/<290KSXY" !!3#!!y5jBF<@!xzyx xd r  190!!>32!"&'32654&#"+$R.`fSXOQ  ))u''b $5@{{ z y{"nr%   %190"32654&.#">32# !2`ee``gg#OC/c..F싄--AAn75@%xd 991/0KSXY"!!!P #/D@% {'{-{nr'0 $*  ! 0991990"32654&%.54632#"&54632654&#"hczzcc{zqvto|eWXeeXVf}gg~eg}}'yغx(&ĉ׊TXggXWefoN$7@{ zy{ {nr% " %19073267#"&543 !"&2654&#"OC/dF7_ee_`gg .,AAi}}'@ ww <21/0!!!!MM's' "@ww   <210!#!!MNMoXmy@29190 5y!X'y@vv<210!!!!X!!Xmy@<919055X!`a)$q@8   %$  fhn !  %<2999991/9990KSX99Y"!!!546?>54&#">32  >PZ?-\\T`beD^XD&cNY=P+CDGF 89L\VBT= s 4]@1(+$ 4| | }'$|+}|+15'(   ! .529919999904&#"326#5#"&5463254&#"3267# !2fYYeeYYf&gHȥGl"0PE\Qm`v4!qqrR511/)//77! @;      %h~d     91/<90KSXY"K TK T[X  @878Y@,0000 5::5s|]]!!!!!hi\uZq+q} >@$h hdh   !2991/9032654&#32654&#%!2)čqvp_anF`wyjFP\\S뽼 İ9.@op op nr! 210%# !2.#"32679FU>.UDLLLL+$$xy$$FAAFu(@p dp !  "99991/0326&#! )P<nB? tsJ *@ppd p#  2<1/0)!!!!!J^?{yX %@ppd# 21/0!!!!!XBuujS@!ppopnr%! 1990@]]#5!# !2.#"326hUu?-ZL>`.DTIKsy30PQH &@pd  " 221/<20!!!!!!'q'9+h% #@pd p 221/220!!!!!y))3m.@ opp dr  199073265!!!"&mVctl_JVX\t 4u a@3  %d   291/<290KSXY"!! !!u'N)Nw@ pd1/03!!'w/V{ @,  % d   % % 91/<290KSXY" ]@R )=??   & )/708?    ]]!!###V`bq+sTwX S@%d&& 991/<2990KSXY"]@  ]]!!!!w=^=+=\u #@ppnr !! '10"326&! ! hqhhqrhh    xx{,@pp d !  299991/032654&#%! !#!yuu`5nJbyyb\u<@ pp n ! !'9919990# ! "326&   ~xqhhqrhh~xL  f@6  %p pd   !  "29991/<9990KSX9Y"!&'&+!! 32654&#',A/ Ok^ yihz A^y暶 i_mm^V'p@>'' '%' o!p o pnr('$ ($"(9999190KSX99Y".54$32.#"!"&'32654&'ߞge_`krSohvlmxPLU/.CFVP>Q10Bڦ541TRcYCeZw@ pd1/20)!!!jf*@  pr d  1299990!3265!! j'reer''ppR9s@%%d91/290KSXY"K TX@878Y@  ]]%!!!h)g)+ @@      % d   /91/<<90KSXY"]@6fe   )&ghj f g wzsx]]!3!! !kT;H+ @C    % d   91/<290KSXY"K TX  @878Y@  ]]) ! ! !V11X%!S@(%d 9991/290KSXY"! !!>"#>3XwLs 8@%pdp 991/0KSXY"!!!5!Lw#$@ut10!#3!ZoB`@ d9910 #Nm/+ @ut9910!53#5+޾9@ d91290 # #--@+ +01!5/f.10K TKT[X@878Y #fx^T{ %@/   ggh g#r #  .)&22991/99990@-400 4!urr  ]"326=%!5#"&546!354&#"5>3 ZMt#5d gdikapTfLZq}JPʵĻ1GI5:(&w 6@  h hrt2 0221/9904&#"326>32#"&'!!Rl__nn__lh6Ze.$-6]]ba%}.@yh yh r 75210%# !2.#"3267%Jb&ZS@RUB9++89*,7;9:Z;6@hhrt2 )221/990!!5#"3232654&#"$/eZl__nn__lSab40]\}{L@#   hy h r .)190@ ]%# 32!3267.#"Nfv ekspex 7**->w:?itw{q;4@ t  <<2991/22990!!!!5!546;#"XB/bNʜ0bXH} (I@(  &' hyhh#')& 2 ))221999904&#"326!"&'326=#"325!#r]\qq\]r%\]S[|v+f`+%B .,u|yPN, 8ZR/.@ h t 7  521/<99990!4&#"!!>32/ENPZ#j)yh}]f B@  s  <<1/20K TX@878Y!!!5!!!!Dlm%`XR O@  s  <2991990K TX@878Y%#!53265!5!5!!RbRN%+nTV @@! %t  .5 291/<90KSXY"!! !!%`cXd}^B `TZF %@t  991/990!5!;!"&NRbѶ`nR{"@'  h :=:=:#91/<<<299990K TK T[X###@878Y@7      /////////?? ? ? ? ?????]>32#4&#"#4&#"#3>32!fJo&22((22&nDDpGD}TV{1{VT}1`tBMQ/{0@  h 7  521/<99990!4&#"!!>32/ENO[#j)zi~`]fbo{ #@hhr . )10"32654&32#"hixxijxx==Vw{9@hhr 20221990%!!>32#"&4&#"326$.eZbl__nn__l ab]񢸸ZV;{ 5@ h hr 2)22199032654&#"#"325!!l__nn__l6Ze/$1^]04ba#{)@ h  21/990.#"!!>320M]&%+w&ln``i+{'@=    %  yhyh%r( >7"5(99991990KSX99Y"(!]@+ $)) ) ) ) ) ),//,))))) (!$'].#"#"&'32654&/.54632QXbd Tema^gjKQ_=4598P2&##7:<98<"&o1N@  <<2991/<2990K TK T[X@878Y!!;#"&5!5!IUKA>%`0@  hr   7521/299990!3265!!5#"&%DOOY%iTyh~]fP`i@%%1/91/290KSXY"X]@U  ZUUY]] !!)``j` @@      %    /91/<<90KSXY"h ]@@     )&') 96k c wxuy   ]]333! !ywꈇ`5ZF7` @B    %  1/ 91/<290KSXY" ]@    96]] ! ! !yV`yHN;X`w@A     %    1 /9129990KSX9Y"+5326?!!;vwZT+V44y=o<A)9` 8@%6/ 2991/0KSXY"!!!5!MiN``$^@0 %   !  t% $  %<<29999999199999990#"&=4&+5326=46;#"3k>>k{hFb~~bFhחsrݓTѥ͐Ut10#!$`@1%   #t%# %<2<9999999199999990326=467.=4&+532;#"+yhHb}~aGiym>>mVͤэVחstݔXy++@  19990#"'&'.#"5>32326yKOZq Mg3NJNS5dJ t]F+<73 ":?=6 7=!k&$u!m!@M ! !%h  i ~!   "999991/<9990KSXY"]@\ !000 0!o  !!' )!;44 ;!t |! ! !]] !!!.54632%32654&#"!/\uZ,*uv*N57MN65Nsq%a=uu>_6MM66MMAo9&&uJk&(uwXm&1u\uk&2ujfk&8u^Tf&D^Tf&DC^Tf&D^T1&D^T9&D^T&Do%}&FH\}f&H'\}f&HC'\}f&H'\}1&H'f&f&Cf&1&/9&Qbo0@ hhr .)10!#"32654&32#"œixxijxx==bo0@ hhr .)10 # "32654&32#"ixxijxx+t==bo8@ hhr . )912903#'#"32654&32#"ƲxixxijxxՓ==bo7@hhr . ) 12203#%3#"32654&32#"-Pixxijxxj==bo".:h@:    )h8#h2 28r;&,5.&/ /);99991999990'&'&#"#54632326=3#"&"32654&32#"j7 +"'lY$G*>%$'kX#A4ixxijxx3%@9!q+>: s|==%f&X%f&XC%f&X%1&X;3 $@f d ?  <<1<20!!!!!5!LK}8V@ n@@102#"&546"32654&hCz//12.0zDHdbHHdc30/xDBz./3dHHbcGHd !F@& yh yh r" -/"<<<2212<220.'>7#&5473 8x?@w84xC=ur{~5*1L0+" :9!wb>@  zyhn x <<1/222990.#"!!!!3#535632N9EjcPS)+N=% >y@C/0*1 06 'f&*f# f f54%.#"#"&'532654/$5467.5463271a71|U6LU v_fFAѺYUUIMR haG@ЬJX$E(6X`$E+Ql:4Ki neY/2{Q95Fs^!2xR` 10467>32#"&'.736HI256743IH426I235624HI447743F;) "@d 91290!###.54$!fN۲2X@2)#,2&h&h/tr*  #A  ) .+/399991/990#"&'532654'&/.5467.#"!4632 }t aRP=|C:s6IUsV;< b\^`#[Q@Y J>^ C:HX D0M~JIebf}N 4L\@3-*+'0!52+A M*',$0-!1E3+E$CGB3C;B/29991<99902#"&'.5467>#32654&'2#'.'##%"3267>54&'.hZZ\[[[~}[[[\ZZb@@998(NG&7O?9)cIGHHGHccGHHHHHNZZ[~}[[[[[[}~[ZZb((+)oXZAU 81:/qGIGebJGHHGJbeGIG}N1ID@%  >2>&JDB C8B ,/210.#"3267#"&546322#"&'.5467>"3267>54&'.P4[0akjb5`*7j2ʩ7iZZ\[[[~}[[[\ZZ~cIGHHGGcdFHHHHHh__g$ZZ[~}[[[[[[}~[ZZGIGebHHIIHHbeGIGf A@$   d F F FFF/91<<2<<9073#######5dYЙkKuTKBC f.10KTK T[X@878Y!#f-;1I@ 1<20K TX@878YK TX@878Y3#%3#u1N >@"   v v  <291<2<2.990!3!!!'7#5!7!NŮmA1}c@3  %p hpdp~  % /<291/<20KSXY"!!!!!!#36Vfnj{ )s@> )*  '$ ($p$ pn$r*(! '!)!!!'*.99999991999999903264&'.#".5!27!"&''U8rh9N4pi## g=q''j@xb9= >5 33X>=s^xCBr  /7@$ '! -0 $GG*099991<2<299032654&#".#"326>32#"&'#"&546320P2;JC88b6J0"#>VddVX𻗽JT` G@'  hr !    75!29912<<990!3265!3267#"&'#"&'RRQP!+J#H[%nF;ST XrsrsG> KSNP/0DF)8@'! '!* $$*9991990>54&#"#"&54632#"&54324&#"32?3-,:*:}fMHeLJdcBds<+@lFWt|uy LP *@     <91990 5!! !!5my=/9) ӇL9@__120!!!9_^-L<@    LKJKJH1/2299990#3267#"&'.=!!#51F",c7OrL? " VX#o{H)*@$ *'! `a!`*91026732#"&'&'&#" #"&54632mfbwL=.> b )'8yaxMB3F KbPJ?(: %)d@4 $#(&$& n*&(' #*229991999905#"326#"&546;54&#"5>32#!!fmd=6Vn2yN[[R@ILP4818g96u11!"@w0@ n  9910!!4632#"&"32654&%PŦçkIUUIIUUV޾~mm}}mm~ZwF@$    OON N 9991/<299073&5323!>54&#"!Zxllx)QNpgfqPR'm8nȿm O֦M{ A@K. 4, ;5#A  ggy 451g8g,>8& rB#;-, 4T)-RB<999912222999990@'33040536G3G4G5G6YYYYW3W6 A]5#"326554&#"!3267#"&'#"&546;54&#"5>32>32IWY@=?=2??2=d_A=B +s@>+,  )*&h&h&r,+,* # )#.),99999999199999990 32654&.#".5327#"&''?B&hxJZ>'jy--UC./SCc:"4Im=+-yLk--w%x@<   %%  fhrd&# !  &<<99999919990KSX99Y"!!!3267#"&546?>54765  >PZ=-\\SabeD^XB&ocMY;Q,CDGF89L\V@T? @ d <2991/0!!!3 !#+eXjy@ v 10!#!X!,1 ,@     9190'%3##q@`44{$ V#@I   %   yhyh!n$  $912299990KSX99Y".#"!!#"&'53267#5!>32)R%^g^ʠ>s7+P'_iP'ˠ323326#"'&'.#"5>323326yKOZq Mg3NJNS` t_FIKOZq Mg3NJNS` u_GZ<73 ":?=67 6=;73 ":?<77 6<K@&%h91/90KSXY"% !!{!5qw# -@   U U <2991<2990 5 5++#\# -@   U U<<991<29905-5-++#wvwv9o #@w VV V 1/<<220!!!!!!q'd'd'ooo!k&$u!m&$u\um&2uD>@!p  pdp %  <99991/220! )!!!";C=.{\[|478nͲɮ{ )5o@1("!% !gy3g -%g r6*0T!*R(6<9912<22999990@ !"()]!3267#"&'#"32>32'54&#"4&#"326>c_>2:MN;;NM:ߐ;:,*JJMG8;;B32;dJIeeIJd$P0'T-)S.'QIccIJffq)S,/Q$*S)/Q&Z/#@ U29190 5/+#y#@ U<9190 5-+#wv JG@& t ZYX  X<2<<991/<2<2990!!!!!!#53546;#"%%\۽PDB/-cNʜ0 J?@" t ZYX X<2991/<229903#!#535463!!#"۽B/cNʜ30;39@ff  d ?  <<2<<212<220!!!!!!!5!!5!LLKK}+}w 10!!Mjo@ wW10!#9co9o &@ w WW 1<20!#!#9b9bo $0<HLp@?J%K+I"L 71= +"%j4C: L(I1KJ\\F\7@\1.\1(\/99991/<2229999904632#"&5%"32654&4632#"&%"32654&4632#"&%"32654&%wwwu2IH33JJxvvw4GH33JKޥxwvw3HH33JK'!xwxwK24KK42IxwxG45LM41J+xwxH35LM41J^\!k&$uJk&(u!k&$uJk&(uJk&(u%k&,u%k&,u%k&,u%k&,u\uk&2u\uk&2u\uk&2ujfk&8ujfk&8ujfk&8u` @ 1/20!!!5!!Dlm`f5@ 91290K TKT[X@878Y3#'#Ʋf 9@$    999919999990K TK T[X@878YK TK T[X@878Y@M           &]'&'&#"#4632326=3#"&j7 +$%g^$H)>%$'g^$BT%>;+?:-X@10K TX@878YK TX@878Y!!-wF `@  ]]1<0K TX@878YK TX@878Y@]332673#"& dSSc FEKJF;1M10K TX@878YK TK T[X@878Y00]!!1L R@ ] ]10K TK T[X@878YK TX@878Y4632#"&732654&#"LvwwvM67MN66Mvvvv7LM66MMoo3!@   ]1/90!#"&'532654&'97{0e5-T$:A*.>j/_[ .(R<)=fI@991<20K TKT[X@878Y55]3#3#Vfxoj@  ] 1/90!33267#"&546-5%=2&M(6_)r|7GF'1 \V5mf5@ 91<90K TKT[X@878Y 373Dzx 7@  pd    <2.9991/903'%!%!q'p}wo™%\D@%  t  <<99991/99905'!5!%;!"&duK'grSbѶӦâѠnVk&6u+f&Vsk&=u9f&]@ <210##  u 9@hp dp  ! "/<29991/2203#326&#! )#53P<nBĉr tsbf(@N (((#$%$"!"%%$%('%"! #&#h hr#t)'& !#(%" .))999919990KSX9Y".#"32654&#"432''%'!%+1b0izwhms udV(?7%\)B}-b2 wumt{uk&<u;Xf&\{0@hh d !  2299991/032654&#!3 !#!ytu`'n5nIbxydVw9@hhrt 20221990%!!>32#"&4&#"326$.eZbl__nn__lab]񢸸B v10!!BKwXs 0@   <291<290  ' 7 XJJGJHJHH9 )@   ^ 12035733!9x-+)N2@ ^9190!!56754&#"5>32f3Z:WK8MKB6-+KO4<#"}o~*(D@& #  )^&^ )9190#532654&#"5>32#"&'532654&FooJUOFEDECibouKJCPU_b2,-3teI^p\y@8=D/w{'&  W/w{'& W/w'&  Wujk&* ubXHF&J%k&, uoV&6o+{&VAk&&upf&Ffjk&&uGf&FfZ$F@&"   "hhrt   2)%<<1/<2990!5!5!3#!5#"3232654&#"2$/eZl__nn__l"ttab40]-10!!-ww 10!!M51@9&(  ox#o xn#r/21('/),&, 0',2229999999999122<20@]]632.#"!!!#3267#"'#73.5467#7,$SDJMkT  \  v `  6  0 ( n XModifications (c) 2006 by Panic, Inc. Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Panic SansBoldPanic Sans BoldPanic Sans BoldVersion 1.000PanicSans-BoldBitstream Vera is a trademark of Bitstream, Inc.Panic Inc. / Bitstream Inc.http://www.bitstream.comCopyright (c) 2006 by Panic, Inc. / Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.Modifications (c) 2006 by Panic, Inc. Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Panic SansBoldPanic Sans BoldPanic Sans BoldVersion 1.000PanicSans-BoldBitstream Vera is a trademark of Bitstream, Inc.Panic Inc. / Bitstream Inc.http://www.bitstream.comCopyright (c) 2006 by Panic, Inc. / Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.#   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~     NULL sfthyphenperiodcenteredEuroc6459c6460c6461c6468c6470c6472c6477c6478c6475c6476B`#cVeraSansMonoBd6628B00@H LTSHB@&F<OS/2R`PCLTp6VDMXnOuPcmap(._"xrcvt &/fpgmNTX(gasp glyf:>1hdmx73` 0HheadI,6hhea Ed$hmtx 4loca#`maxp nameXMl|postThprep*_b`_<DDommoJ  QK@/GBGSf    JBits m` hsR!uXbb{\)?XXXXFs5\N9NR3R PRdHH;wb;T=Z7Tubs}\NXs5RPHHHHHHbbbb====Tuuuuu}}}}+{d?}7?Xo)XVX/PJ/X;XJRR#Xu5=bb;5559999RRRPPP=wXsNw3X\3///N;9sssw/?/m     !" #!$"%#&$'%(&)'*'+(,)-*.+/,0-1.2/30415263748495:6;7<8=9>:?;@<A=B>C?D@EAFAGBHCIDJEKFLGMHNIOJPKQLRMSNTNUOVPWQXRYSZT[U\V]W^X_Y`Za[b[c\d]e^f_g`haibjckdlemfngohphqirjsktlumvnwoxpyqzr{s|t}u~uvwxyz{|}~             ,   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~FR@~ 1BS_ax~    " & 0 : !"""""""""+"H"`"e%  0AR^`x}    & 0 9 !"""""""""+"H"`"d%^ChVjޖޢދާtq_/0Pbcdefghjikmlnoqprsutvwxzy{}|~FR@~ 1BS_ax~    " & 0 : !"""""""""+"H"`"e%  0AR^`x}    & 0 9 !"""""""""+"H"`"d%^ChVjޖޢދާtq_/0Pbcdefghjikmlnoqprsutvwxzy{}|~, %Id@QX Y!-,%Id@QX Y!-,  P y PXY%%# P y PXY%-,KPX EDY!-,%E`D-,KSX%%EDY!!-,ED-,KPXYD_^-, EiD`- ,*!- , F%FRX#Y Id F had%F hadRX#eY/ SXi TX!@Yi TX!@eYY:- , F%FRX#Y F jad%F jadRX#Y/- ,K &PXQXD@DY!! EPXD!YY- , EiD` E}iD`-, *-,K &SX@Y &SX#!#Y &SX#!#Y &SX#!#Y &SX#!@#Y &SX%EPX#!#!%E#!#!Y!YD-,KSXED!!Y-+@֚ԴG}%2і}2»}Y&Y@&//2G@GddkY }:Y :  V f   XA W%d]%]@%XA~XA~}|d{dzy@}xwvutst2srqpq(ponmlkldkjkji hgf f f@ed.ed.cXAcbY ba`a`_]``_[%_]_@^]\[%\[%ZY ZY XW%XAWVW%VUTSRSRQPONBNSMLxKJ}KJ}IHGDCB2A@BAF@?-@B?>@?->=<;:9S:98(9S8(76543210/+ /.d-,+ ,+ *)('-'&%%2$#"!-!1 d 2 @:%%:B-B   :    @$--:-  d++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++##X!#/{{RfoZ!7={fs +bb#3N{T\q#w!`j#fy```{w`{{RNNfffHF?{L'5oojo{-{{=foD7f}s*hh@ O/10!%!!hsr)s` Y@.   :TSQ 991/0KSX9Y"3 #3#ʁX2s2qeR@UQ1<20###Ѯ++P@5 X X    91/<2<<22<<220#3 33!!!!###!7!!7! Siih'T'hhii'T'haabbN; 0l@@()%/0%W$ZXWZX!0 !()/ %$, 19991/29999902654&'#.'7.54$?3.'+uV^PwTe;__#QhZ 0d/UH AYQ LEtNUcEJ-.+73#'#"&547.54632.#"326773>J zk{;_hǼA|9#*zLq,_AGB͋fqGG֯!g4l7&&s^/Iuw96Q10#+u @hg   99910 #&5;32267654&#"P77ON87PsTTߔürUUݓþP/E]bkP0F\g7PP78NOEEg`f__{ T@* :ccQc   99991/20KSX2Y"7!7%3!!9#`5!ɪuLJժf^@1: q cac99991/29990KSX9Y"%!!7754&#"7>32  n!7'r\~)paGR!#]jCD12›`g*N(J@+c W q cW qc#ae) )  & )99190!"&'732654&+732654&#"7>32rl^&[b {Rq%{Tس~%%45uy|d_((!? s@>      : cQ     991/<290KSXY" !33##!7JٜFE$3dT j@8  : cWbccQe!   !999190KSX9Y"!!>32#"&'732654&#"`!H/Y,i`XlH)T^OKժ|VPP!32ꮀ(&\h *;@ ccr W bc(ae+ "+9104&#"32.#">32#"&5476$32\tkzk $:K7DqPDNzNDb1KRqzy '%'fiǸwSa`צf5@:cQ91/0KSXY"!#! <^+)f #/?@" c* c$cae*t0 '-!09919904&#"326.5432#"&546"32654&5vpykl(ֲ ~uf{xtŚi~&i)̳`|cr}[l?L *3@cr c( ca(e+"+91032654&#"732#"&5467>32#"&Jtkxk#:K7DqPCNzNDbKqzzٺ%'fiȹvS`a֦X#%O@):nun91/0KSXY"3#3#'?>54&#"7>323#`MqkUGpcOi$meaiT<1[^[Ho8JRGB98~^lVFfVu @o@5.1*@ xx -*x1!x1:A@= -. ='=4A9991999990@ ]2654&#"#7#"&54327>54&#"3267# 476$32}eX{c3QT_TX9xC-BS|n& Ә`nїap}o?D9H=+#4~}՝{=ѰM/ v@B      :cyQ    91/<90KSXY" !3#!##-+{ u@@       :c cQc z   !9991/90KSX99Y"32654&# 32654&#%!2)mkÈ{Xo}bи}<ݮkff>^T|s2@|{c|{c ae  99910%#"5476$32.#"3267T[rkPK)@P_GhUX5)) |*(?>QS{@=j P@(   : c Qc   99991/0KSX99Y"%267654&+ )DD6ErgTGh#}s?w/5 X@0    :ccQcz   991/0KSXY"!!!!!!Xu!TV rh!wժF\ S@,    :ccQz  991/0KSXY"!!!!#o!\Vd ժH7N)a@3&))#$"%):%&"&c("c|{cae*('&%)*9991990KSX9Y"%#"5467>76$32.#"3267#7!Wu! #^8kPM)AQbD,N"#Dl%L`>? ZouC|*(?>SQ4arQ%# {@B     :czQ   9991/<20KSXY"3!3#!#v)vʋՉd+99 ?@"  : cQc   91/220KSXY"!!!!7!!Z>!:!!9ժNU@.  : {cc Qe  991990KSX9Y"'73267!7!#"&-Hg(!H8a=OSD.J j@;      :}   991/<290KSXY"33 ##ApyN 8@:cQ9991/0KSXY"3!!q!eժ  @D     : }   99991/<290KSXY"]@&  ]]!!# ## nݺNs +/ @<  :}  9991/<2990KSXY"]@  )]!3!#3+3R)!@c c'ae**10%267654&#"#"&467>7>32U/J\inU/L\i-+C'Xڑ++C'XڑÇf_f_hun\;yo\;y3h@6    :cc Q   99991/0KSX999Y"32654&#%!2!##m|mu/ϿlgR-3@c%c ae.+"+.991990#"&467>7>32267654&#" ++C'Xڑ@%6OU/J\inU/L\io\;ySotC_!\f_f_h @R       :c c Q      9999991/<9990KSX999Y"#.+#!232654&#HW6yj,mn{!)fۣ~jhybճWpi{'@:    : |qc|qc%ae(  "(9999190KSX99Y"8]@<'''))))777  (((%%%%88VVVV]].#"!"&'732654&/.54!2{'Q]byhd)bpXeJ P;<GX('2--EBRZ)!:y(5@@:cQ99991/20KSXY"!!#!t!++ժ+P~@K   : ceQ991290KSX99Y"33267>73#"&546s˳mnY|--˲*_NGj=h ;\\9>h?8;%~+J@':}91/290KSXY"%3!3V1ƾ+R` @J        : }    91/<<90KSXY" ]@\  ;u      )%& 86736 FFCE ZVTU kfch e zvvy u   %]]333##ZIyF +f9 ~@H      : }    91/<290KSXY"33 ##D1dDf@5:} 9991/290KSXY"33#σub 9@:cQc   91/0KSXY"!!!7!1-" )՚oG@":~~g9910KSXY"!#3!mVdB0@:Q910KSXY"#3ժǪC@ :~~g9910KSXY" !73#7X+ޏH@ Q91290 # #Ȳu-|+ +01!5(Pf2@ 910K TKT[X@878Y#ŏfxH?{ .@a! "   : %  &W%")e,% &,/99991/99990KSX99999Y"']@65$0%0&5'  ' ]]"326?#7#"&54$!37>54&#"7>32wt+DRgX&} Hn5 ~uVo#lY 3{IScԹ)L^e= U[33'' h;T%@L$#  $#"$# !#$#$#%$$#:! e$""#%!#$ $#&999991/990KSX9999Y"%267>54&#">32#"&'#3T.19eeS30:k>fRHL|b"/ZV^l\XVo{RTVϺlsVTq{4@WZWZ e   99910%#"&547>32.#"3267IZk[]߅YO%BUn<8?`S3')ܕbcb++:6YYRh>?w%@L  $%#: # e# &999991/990KSX9999Y""3267>54&3#7#"&547>32X.16feU018msѸAdPEK|aWWZsZXWrxCTVҼ!lvxWbf} &+'//A]A)9IYiy ]и/ и /'и/ܸ A & 6 F V f v ]A ]и/&9(# + + +01>54&#"#"&547>32!3267t{,uigxjSm Xr#j++֜,mVZ"eN B98j@9     :       999991/22990KSXY"#"!!#!7!7>3_`)&Sec/яN;Hy{.@[ ... ..-.)*+(,..: , W  ) -/-,. .#/999199990KSX99999Y"%267>54&#"#"&'7326?#"&547>3273O.17pdr5RK%IP%:nPHJoe"ZTZjwwI,.uW[׸jp|aUTH@R    :   99991/<990KSX999Y"#67654&#"#3>323]W!{/tKb J G'QWab ^= h@7   :      99991/20KSXY"!!!7!!3#f׾mnm-`/BCV r@@  :     91990KSX9Y"!7!+73263#)ʵ_nJ-wZ {@:!!     :   991/<90KSXY"w]v}p]]33 ##%uͨXZFF?7]@/:    99999991/990KSX9Y";#"&5467!7!XY[ϭ #6IHP.{+@e    $%"%#""%:!  &$ )$" $"%  &!"% # %" ,.999999999991/<<<299990KSX99Y"K TX,,,@878Y>32#>54&#"#>54&#"#3>32'}MVg}.3KT+}}/1JQ-}٨,o@K\DIm\6kw\u?8aq=:w``323]W!{۸ Kb J G'QW`ab ^uZ{ !@ e  10"324&'2#"&547>ppp_RJO⓻RKOVΊmvvˇqtxVh{%@N%$#" ! :e&&# &.99991990KSX9999Y"%#3>32#"&7267>54&#"%o-=dOFKzdQ-18gfU018p RXлnvzTHYU\qZXXr{bV{{%s@=  : e&# &999991990KSX99Y"%#"&547>3273#"3267>54&=fRHKтd#ոU.19efR20:kTVϻ"pvxUUXV^l[WUp{{h@7       : c    991/990KSX99Y".#"#3>32-wL&kٸ(CՇGs(y,,`x~%#s5{)@;  !    ! : !WZWZ'e* ! $*9999190KSX99Y"]@`++''99IIDDYYYY)iiii)yyytty)) ' ' //55GGv]].#"#"&'732654'&/.54$325#GMHutQc%^S CyX9-/f\b8{\##55w\c4!g!dp@@  :   9991/<2990KSX9Y"!!;#"&5467!7!=^wNfߧ w+>3B5ovD/`>}m`@Q     :  e   99991/2990KSX999Y"332673#7#"&546]U!{ڸ!Ii J%DOUyba~']`J@'!!!!:91/290KSXY"33#`D\#` @J      !!! ! :     91/<<90KSXY" ]@f   * J       *$ :4 GCD ZZ T kfh c yxy u   !]]333##\ 1j<צ`wBo` ~@H!! ! !  !  !!!:    91/<290KSXY" ## 3>_4q`DT uV`~@F!  !!!!!:     99129990KSX9Y"+7326?33>g6:`lQu<+ٷhkILJ]qTN^Nm` 7@!!:  91/0KSXY"!!!7!?.!u!`ۓ%4@f -.-..-    : 5'- )'.)~)~'~g5)(54.  $-5999199999990KSX9999Y"#";#"&546?67654&+7326?>7>3N^3!xoIP/VaNH- bq>=~2H6/OgK@&!3?9m{D% 2-UKn{'"10#4@e -.-..-    :-5)  )'.)~'~)~g54.  5)('*(5.99199999990KSX9999Y"7326?>7.546?>54&+732;#"#N^3!xpJP/UbMJ- bp>= /H6/OfLA&"3@9l{ D% 1-VJn|'"Xy &@ ll 1<2990#"'&'.#"5>32326yKOZq Mg3OINS5dJ t]F ;73 !;?<6 7=LN&$3um !@Q   !! !!  !:  c  [ y   " ""!"99991/<9990KSXY"4&#"326!.54632#!#Y?@WW@?Y33srPF#Z?YWA?XX`#kErrQ {su&&h5k&(`u^&1/uRN&2+uPN&87uHjf&DH?f&DCH?f&DH?&DHZ7&DH?N&Duq{&Fwbff&Hbff&HCbff&Hbf&H=Jf&=f&C=f&=&TV7&Quff&RuZf&RCuZf&RuZ&RuZ7&R}mf&X}mf&XC}mf&X}m&X;o \@0: Q   99991<20KSXY"3!!#!7!Roٮo\]+u @ a#$# 102#"&546"32654&hAu,-/OomOPqp1.-rBoPPlnNOp{?$V@3WY WY  e %  "" %912<990.'>7#.547>73? 1{HAK!K?7f7̢FV8f7<}u5&,-(!úD`16"+`႙@F  :  Wqa c  9991/2<2990KSX9Y".#"!!!!73#737$32%6y?&+rZ 3!Z/3<+-ُ/яd7-4Bv@E$%B<;5& %, XX2aC$%5 "<%&,/B;"%/"%8%/?%)C9999919990.#"#"&'732654/.5467.54632>54&/-!G:gV|Ur))FS!J=p J}Pv)%GTXkPRVU~&(bHOZ ;VuEe5#Z7$'^Nb| 3UoI`?%P53o75p^34p73`S?!   & 104632#"&?}|}||{|};u g@0  :Q  99991290KSX9Y"!###.54/эZfN7f5@[#$# $$#45512035:3*$ #0W0e445$'# 35'*-  '' '-56999999991/990KSX999Y">32#"&'732654&/.5467>54&#"#*˰ )<3sQGA;G6U=Z8˲h\yۻqϠ!F$`&=,'UW !}l4R?/D\?$OY}N4L@I  . . :   A)5)M  -- ,G(#);(#*//29999129990KSX9Y"2#'.+##32654&2#"&'.5467>"3267>54&'.XXP:&rk1=-7ffZJJDZZ\[[[~}[[[\ZZ~jKKMMKLijLLKLKKLbeG]C;P*T6?>5VZZ[~}[[[[[[}~[ZZgJKKjhKLLLLLijKKJ}N1ID@'  &>>2J- /,(8 (8*D/210.#"3267#"&54632'"3267>54&'.'2#"&'.5467>`:o:u8g24r=г=rjKKMMKLijLLKLKKkZZ\[[[~}[[[\ZZ/lhȬJKKjhKLLLLLijKKJgZZ[~}[[[[[[}~[ZZfh@6    :   Q  1 1010/91<<2<<90KSXY"###5!3###r}r7q^^-B?ff/10K TKT[X@878Y3#ufF-n@99991<20@@@@@PPPP]K TX@878YK TX@878Y3#%3#''X%y<@ l  l  <291<2<<990!3!!!'7#5!7!X}y}J;fժhӬo@P   :c ccQcz  91/<20KSXY"!!!!!!#!!V3!jd!K\5ժFժ 8o@;)9$863 '$*73(c$c3a$e9)9(*-7  '-6 8 -999999999199999990%3267654&' .#"#"&''7.547>327B^Bp=26yf[8q<2:$iSXQ6^cwhTXM6Td,2'{#)u'+l <[Z..@:V++}@) /7@$ '! -0 $22*099991<2<299032654&#".#"3267>32#"&'#"&546329[=G[TFBi8\=G[SDCj~/[w~SNAU}^sdlkutcjmvu۠d|k֥sXy.@ l l   <2<21/<<07!!!!#!5!X!dCDLIVw? (@l  <2291/905!5w!!LK Xy? (@l  <<291/90-5!!X#!!V/@]  :    Q    9991/2<2<290KSXY"!#!7!7'!73333!! wbbs7ln   o#o1ho#V`&@\   &#$"% :%   c"e '&'  %'99912<99999990KSX999Y"3326733267#"&5#"&''-mf! (J!CO5b\| mV H6[a  UIRLSS-)6@'! '!* $$*9991990>54&#"#"&54632#"&54324&#"32JIH7$$0e՘ݢe WOmVPmmWKt,>bFأ[t}t{L= -@     <91990!!5 5!!LR%# Չ\P_L9@ LL120!#!L^PL?@!   544391/2299990!#3267#"&5!##P117,#J%q\TL@H? HL%&@  & MNM&1026732#"&'.#" #"&54632j Pd@7*9  kOeD=!0 l9TA6?&#Hn!bSA8?T  +/o@?  .,#", &a0 .- )/,0 #"6)6099999919990"326?#7#"&546;47654&#"7>32!!ٔI3232654&#"!!yA8=Z@7=cWjcWk\WCJNXBJNTixؗix{J>@#<<=: ;=:7 991/<20353&5323!5654#"J{n !o{1xx 7oȼ߅LI L{ OP@'O'OO'  ';:987<6'5':+ $!F@6?$O4%W$!(@W?<IC.(ePOL?965F$%+4@L'1P999999912<2<29999990KSX9999Y"@`>#>$>%0?0@Z#Z$Z%Z&ooollloooooj#j$j%j2o3o4o5oNoO{#{${%{&#$%&%9#9$9%2?2@I#I$I%I&j3 ]]7#"3267>54&#"!3267#"&'#"&546;7>54&#"7>32>321}i##N;Ze=D;SjaUF5";Hj/]uUM1L#O8Rv2PyH'!b3C'\/ '1m@:'2"1( +%&""+"e2'2& 1(.%.  . 299999999199999990 324&.547>327#"&''.#"N4PKQߓNx.p]{ RJOJ{3w\%I49W.`0Pnwu$$M2Tmvv%%L'!@J !!!:S WY ce Q"  ! ! "99919990KSX9Y"33267#"&546?>7#73PojUGodOj%lebhT=1D]]YHo8JRGB98~^lVFfVs ^@/ :SQ 99991/0KSX9Y"#73#3B1ˁX1+eXsy^@ l10!#!X!^?; /@     99190'%3##d)#Ӕ/}b%9V#@NAA  A A:   XX!$  /912299990KSX99Y".#"!!#"&'53267#5!>32$R,fs-/d+Ǻ9f.1d0`yu1Ɣ1c|ɏ!JX1y7K@&' 10+5  ll* l5'l.810*8<2991<2<<99990#"'&'.#"5>32326#"'&'.#"5>323326yKOZq Mg3OINS5dK t]FJKOZq Sc1NJOR` t]Dï;73 ";@<7  6<а;83 $77 7=O@*BBBB:91/90KSXY"#3 !qJR# 3@  u  CC 991<299077R+#}R+#}#RRRZ# 3@  u   CC991<2990?777R+^#T+^# ^R^ ^R)/ w@<    :n    999991/<<220KSXY"3#3#3#<o;;///k&$3u^&$3uR^&2+u#H"b@7!"!"!"!""!:c c Q c"!    #91/220KSXY"%!"&5476$3!!!! ";P!B5VR!WH!k!v/1}{>᪪ђlêFlm7~j=xz{,8P@\-'@?6758'@@?  '@? '?@?:8/-59 - E5- W 5*eQB8/.- N N2'N'!Q9999912<99999990KSX99Y"o.]@oo o o jjo-i/o8 ]>32!3267#"&'#"&5467>7>32!7>54&#"267>7>54&#":Pz aUF6#;G_":Q;'8uP|4IB=Sk7<`(HCA_(J?@+TZ[nNX:2)+E@AD6NyGfkDVL8GNGB,jl MTEF5`V$QWy@ 9910!!/yy@ 9910!!/y e@3     :o g     991<20KSX99Y"#73#73& '~~y _@0     : og     91<20KSX99Y"3#%3#))9@:og910KSX9Y"#73)~5@:og10KSX9Y"3#)Xyo '@l D <<103#3#!!j!u#\u"@91990 h 9%-V&\DN&<9uB#@ :Q10KSXY"3TmLB /}@B (-  * -'! ) -0)$ !'$* EFE( $02299999999912299999999904&#"3267'#"&''7.5467'7>32d|[Z}}Z[|Z^.[20`0\^.[3.^Z{{Z\}~t]1]02[-^Z3].2]-_5m#@uC91907m+!{#R=s#@uC9190%77=+_# ^Rb@`   :        2999991/<2<2990KSX9Y"3#'#"!#!##737>3/-J__۸%&Sec/яNb@K   :     99991/<22990KSX9Y"!#!"!!##737>Ѹ__)پ&{Sec/яN;;o@L       :   Q   999122220KSXY"%!#!7!!7!3!!!RPojoRRohn\\/`/@:n910KSXY"3#;`/5@:on10KSX9Y"3#)// _@0     : on     91<20KSX99Y"3#%3#''/'3?Km@<%1= 1%+\C7IF:4(:"FG4"@ "G""".G"@(/99991/<22299990'32654&#"4632#"&32654&#"4632#"&32654&#"4632#"&H%'H_EDbcCE_yxxwyLaEEacCEayyxxy aEF`bDEayyxxy7a`JGacECcaEyxyEaaECcaExxy"GaaGCcaExxy3m&$3u5m&(`uEk&$3u5N&(`u5k&(`u9k&,9u9m&,9u9N&,9u9k&,9uRk&2+uRm&2+uRk&2+uPk&87uPm&87uPk&87u=` C@":   991/20KSXY"!!!7!!f׾mnm`/BfR@91290K TKT[X@878YK TX@878Y3#'#͓ufV7@!   91<99990K TK T[X@878Y@=     ]K TK T[X@878Y@           ]'.#"#>3232673#"&/#*/}rY+D&/ )1}qY,B`1KN&/NMb+@ 9910!!V)JHn@ H H91<90K TX@878Y@   ]K TX@878Y332673#"&546xWUPjw HADJLvwDm;@ 9910K TX@878Y@ @@PP]3#))N h@ " I"10K TK T[K T[X@878YKTKT[KT[KT[X@878Y4&#"3267#"&54632X@@WW@@X{ssss;@XWA@WX?sstus&@    991/90!#"&'732654&'+%#w,^/(I CK@]$]m<6N6fe@ 1<20KTK T[X@878Y@)////2222BBBBVSUU]3#3#҇LfxuX"@    9991/90!33267#"&546w=@/-!B "G"alK:e&%& PG7xNf:@91<90K TKT[X@878Y#373wx e@8    : Qc     .99991/90KSXY"3%!!'%sr)Iqq dqJdϨ3hdXZ@K:   99991/990KSX9Y";#"&5467'!7!%XY[ϭ ;Jss;JX%6IH#O(c$)b{m&69usNf&Vm&=9uNmf&]@ <210##  jk@;  : cQc    99991/220KSXY"%267654&+!! )#73DD6Er[ kgTGhщ{}s?+/ŕ{wj!0@L:! %%+ e1( .(!. ( 19999199990KSX9Y"#"&5467>32.''%'3%.#"324&f{qKFMLGL0 5)h%P,sh/֗htx~io{&V:^\VȑX\ xA@eDk&<9uVf&\3 @I   :c cQ   999991/0KSX9999Y"#32! 32654&#FH#3`i|m縘gbVh%@M%$#" ! :e&& &.9991990KSX9999Y"%#3>32#"&7267>54&#"%or=dOFKzdQ-18gfU018pRXлnvzTHYU\qZXXr{X-yl10!!X!ת;T .@     <91<290 7   ^t^_t\t%\^u^uw^\ X@. JJ:  `     99120KSX2Y"3?33!qu c)t'+n3j@5:  aK999999199990KSX99Y"!!?$54&#"7>32!9J?3zST}5vrni3=%)o^(H@*  #a)   KK& )99190#"&'732654&+732654&#"7>32HNЯB;Ch2pUYHHavVV*e<Gz7yr\ [Gy\NC@jP@33sd[Ot/m{'&  W/y{'& W/m'&  WNm&* 9u;HyH&J9P&, 9uu{&6su5{&Vsk&&uf&FZsm&&uf&FZw-@|  "! #+,-+,-*: + "e+ %.999991/<2990KSX99999Y""3267>54&!7!733##7#"&547>32X.16feU018m>IAdPEK|aWWZsZXWrx5yyTVҼ!lvxW/Z9910!!P !/`/@:n910KSXY"3#;`-|@C$%|{c!|{ c '+a!e.'.-,+($$ &,$.9999999991<22299032.#"!!!!3267#"5#73>7#7]LJH'FGG28 /LU'PV1 1!*(A3232673#"&"*&"6}#|U">##$(8 } ~\79 32mn 6.mn=Y910@//]]KTX@878YK TX@878Y#]@ 91<90@/// ]K TX@878YKTX@878Y3#'#՞ј5c@ 91290@//// ]K TX@878YKTX@878Y#373-՞ї /mf@ 9910'F#ll t@> JJ J  J: `   991<290KSXY"33##7!7 !iuw!#~ oy}y5 3@  HH120KTX@878Y332673#"&rOKWky!x=68;qym`:@ 9910@ OO__]KTX@878Y3#'""""hvdh$ $j N > T P 2 ,8\(>d>$8DDN` h F ^!!B!N!!!!""""&"2">"J"V"b"n"z"""""""""""# ##"#.#:##$.$%>%^%&V' ''((d())* *B*r*+ +,,@,b,,-x-. /0001R12 2H2222233n4H4d4455J5v555566667\7868\889z99999999999: ::":.:h:;:;T;;<0>,>?.?:?F?@:@P@@A.AAAAAAAAABBBB*BBCCCD6DEEHEEFF6F`a akq 0  7 J     " , " N  p   `  6  0 @ n pModifications (c) 2006 by Panic, Inc. Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Panic SansItalicPanic Sans ItalicPanic Sans ItalicVersion 1.000PanicSans-ItalicBitstream Vera is a trademark of Bitstream, Inc.Panic Inc. / Bitstream Inc.http://www.bitstream.comCopyright (c) 2006 by Panic, Inc. / Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.Modifications (c) 2006 by Panic, Inc. Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Panic SansItalicPanic Sans ItalicPanic Sans ItalicVersion 1.000PanicSans-ItalicBitstream Vera is a trademark of Bitstream, Inc.Panic Inc. / Bitstream Inc.http://www.bitstream.comCopyright (c) 2006 by Panic, Inc. / Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.+   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~     NULL sfthyphenperiodcenteredEuroc6459c6460c6461c6468c6470c6472c6477c6478c6475c6476B`#cVeraSansMonoOb6628I00@ LTSHA\&G@OS/2;`PCLTck6VDMXnOuTcmap(._"|rcvt >=.8fpgmNX(gasp glyfjQ/hdmx33> 4HheadI,6hhea Zd$hmtxl8loca!maxpk nameD %postѻ:?;@<A=B>C?D@EAFAGBHCIDJEKFLGMHNIOJPKQLRMSNTNUOVPWQXRYSZT[U\V]W^X_Y`Za[b[c\d]e^f_g`haibjckdlemfngohphqirjsktlumvnwoxpyqzr{s|t}u~uvwxyz{|}~             ,   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~FR@~ 1BS_ax~    " & 0 : !"""""""""+"H"`"e%  0AR^`x}    & 0 9 !"""""""""+"H"`"d%^ChVjޖޢދާtq_/0Pbcdefghjikmlnoqprsutvwxzy{}|~FR@~ 1BS_ax~    " & 0 : !"""""""""+"H"`"e%  0AR^`x}    & 0 9 !"""""""""+"H"`"d%^ChVjޖޢދާtq_/0Pbcdefghjikmlnoqprsutvwxzy{}|~, %Id@QX Y!-,%Id@QX Y!-,  P y PXY%%# P y PXY%-,KPX EDY!-,%E`D-,KSX%%EDY!!-,ED-,KPXYD_^-, EiD`- ,*!- , F%FRX#Y Id F had%F hadRX#eY/ SXi TX!@Yi TX!@eYY:- , F%FRX#Y F jad%F jadRX#Y/- ,K &PXQXD@DY!! EPXD!YY- , EiD` E}iD`-, *-,K &SX@Y &SX#!#Y &SX#!#Y &SX#!#Y &SX#!@#Y &SX%EPX#!#!%E#!#!Y!YD-,KSXED!!Y-+@tGG22dk  Y&Y@&~2}|{zG{{@zyAzGyAxw2xkw2vutsrqp%olkj j iihghhgg@fed:d}cbcbaba`;`2_^_^];]d\ [Z[ZY]ZZYX%Y]Y@X%WV;V}U:U2T;T'SRSdRQPdOSM;M2L:L2KJ;JdIHGF F F@ED.ED@.CBABA@]AA@=%@]@@?k>=%>=%<;4K7 7   @6 2   2X}Xd++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#3#N#'#\ ##3##/%%1/;sqoV#d\H```{\{`o7L'5%={D=!/s*hh@ 7/10!%!!hsr)R ]@.    49    99991/0KSX9Y"!!! # 7# f!qe@ 91<20!!!++N@3      91/<2<<22<<220#3333#3#####73#73J^^^6H6^_^_5H5^qrvuu%v'D /m@;)%%$(<54&#.'.546?3.';Rb95HS49Ua3YWD0/GL22 ZD*9-.,=BZ(|',.! '3V@-(  (?? ?>.?%1"+1""499991/999904632#"&"32654& 4632#"&"32654&!?9PP9:OP)˹=8ON9:QRXO::OO:9PP`^P::OP99Q&0@O$%$&%%$()'/.040'$ % -<;C<BE%%!&!0$ ' !* 199999991/99990KSX999Y"%#"&547.54$32.#">73!3267VWź FA16BX^&(*0 xlsZ^^,Z.H23հi:d/#&GB"tW :][4\c910!+R7 @ G   99910 #&5789RPۏͦJ"F!qV @G  999104'3q89QQ8[%3y9TJ@(   B   <2<2991<22990 %#'-73%TJLLLLKLXXB\ #@ H   <<1<<0!!#!5!RPRPo4@4I10KSX9Y"!#:6׬o^+ +01!!e8\o/@4I91/0KSXY"!!NFoB3@ 49/9910KSXY"3#TmZw /@ J$J-B$E0 '010@////////// / / ?????????? ? ? D@@@@@E UPPPPPU ookkkkk k o   C////////// / /  ]]4632#"&3267654&#"#"&547>32I45JJ54IjDG@k$6ABGCj$6AfUIeSJ5HI43IGqljc\rkheI+ O@(4JJ9J   991/20KSXY"!%!!!^J3F53bL J/oc@24LK JBJ 9999991/9990KSX9Y"!!7%6754&#">32bi3K13^pcRv3me:(.RbHQ;: (*{"`(M@,M LK#M L K MBE) ) &  )999190#32654&#">32!"&'32654&4|sjSn6hXfz6`loUFL*( Ÿ$&$.0Rc` o@<      4 J9    991/<290KSXY" !!3#!!u51>?:jBj@84JLKJ J9 E  999190KSX9Y"!!>32!"&'32654&#"T+35!H)__3F_ǎzNO  (*hy(&` '8@M M L KM%BE(  (91904&#"326.#">32#"&5476$32#[Mi[Kln3?654&#">32Z 7XX]kJEYt5fhbui~`N]~C9>IH 7:_bVis ?a@4-0)? OO P,)O0P O09@? < ,- <&<3@999991999902654&#"#7#"&5432>54&#"3267# 476$32hQGgP+rB3#uf&x@3#&& !"&4"##V%VUCV BE'%$#"&'991990KSX9Y"K TX'@''878Y%#"476$32.#"3267#7!FsxbQMB3QG4)E "t$?91^;@"os$$CF;9/~MbN# @?     4VS9   91/<20KSXY"P]@ PPPPP]!!!!!!'oqn'ف9+h J@&  4V9 V    991/220KSXY"!!!!! 3y3׼)43)3R@+  4 UCVV 9E  991990KSX9Y"'3267!!#"&ANgtq4!RCCqoNX`_l 7785X w@B      49   91/<290KSXY"!! !!'l3\R_- P!6@4V991/0KSXY"3!!P#'w3/  @I     4 9   991/<290KSXY"K TK T[X @ 878Y@>  /////   '//)/;8]]!!## #a1)h/q+qR @:  49  9991/<2990KSXY"(]@*5(*'%300005QWPPWPWPW]]!!! ! /=+==)P@V'VB'E*! *10@+0044553300000000 0!0"0#0$0%]4&#"3267>7>47>32#"&dPQ;d$+PQ;c%-dUMbTNxxGE'\sKxvGE,Ss ck@;    4TT 9   9991/0KSX999Y"32654&#%!2+!)Th}I:N蹤mJ[MrB[Q=-|@%VV BE." " ".99991990@A000 0 0 00000000005553$3%3&0'0(0)0*0+0,0- ]#"&547>324&#"3267>7>cTNaU#iIӛPQ;d$+PQ;c%-]Bn/xxGE'\sKxvGE,Ss@Q       4T T9    999991/<9990KSX999Y"(](]!&'&+!!232654&#=Dj5ius#ZP{\\ HWx կi|NM'@;'''4 ' UC!V U C VBE('$ $(99991990KSX99Y"   ]@    ( ]]@() ( ( 9 9 9 I I I Y Y Y h h h y y y ( ]].54!2.#"!"&'32654&'|Cg[9Dovtn|;akFEP~))>?qXTS3A451QUud>[}@4V9991/20KSXY"K TKT[KT[KT[KT[KT[X@878Y@ ])!!!j1#3-s@=   4  VE9 9991299990KSX99Y"!3267!#"&546D'\Tl'#P?L} '/RZz|R?JNƷ*d-F@#4991/290KSXY"%!!!-{dA#+)Z @A      4 9    91/<290KSXY"]@**5888]33!!!l )3 ;H+q? u@?    4 9   91/<290KSXY")! !!/pf#hA1N`@149 91/290KSXY"!!!%BsswwL  7@4V9V   91/0KSXY"!!!7!13/Z}#?F@!4WWG9910KSXY"!#3!D&%ZTB.@49910KSXY"#mjB@4WWG9910KSXY"!73#7!d%%9@ 991290 # #--C+ +01%!5/s`f/910K TKT[X@878Y#fx/u{ *@O      4!  ]]!<"\]%[E_ (  !"(+99999991/9990KSX999Y"K TK T[KT[KT[KT[KT[KT[X+++@878Y@23 0!0"3#vv x  ]]"3267%!7#"&54$!37>54&#"7>32Q?v7{Cn7%faRv/q[hm?Rm}MM1 9<98'''j/ @J    4 <<E[G    999991/990KSX9999Y"K TKT[KT[KT[X  @878Y%254&#"!!>32#"&XoSJrZ)/%w?_=7Euoephw`c۽i}{W@ ` <K< K [E  99910K TKT[KT[X@878Y%#"$5!2.#"3267MSo(bL5=Nz|F[%!!=)+:8ƀ~44B @J    4 <<E[ G    999991/990KSX9999Y"K TK T[KT[KT[X  @878Y"3254&7!!7#"&547>32yoSIrZ}%B_>8Eupephw`cܾkL}&w@#`d<Kc#< [E'& '999910K TK T[X'''@878Y@ & ]%#"$547>32!3267>54&#"_nXPT  l]fYd(7**afm-vSce>;h Ubvv@=    4 ddG e    99991/22990KSX9Y"K TX@878YK TKT[KT[X@878Y!!!!7!7>;#"XX+ۮ+*+A:LNӓ7X +@\+ + + + +* +'(&)+ +4)* `<<K<&[*ef,* )+ + ,9999199990KSX99999Y"K TK T[KT[X,,,@878Y]%254&#"!"&'326?#"&547>327!sRHrP5bW6KW}6`TIFjh#% dofo --u|SUѲlgtng;`@L   4  <[G   99991/<99990KSX999Y"K TK T[KT[KT[KT[KT[X@878Y@    7 ]!>54&#"!!>32Nۅ:7Sty/#t0e (5:=\gL7 @5   4 i hded    991/20KSXY"K TK T[KT[KT[KT[KT[X@878Y!!!7!!!!5Dl++m%C`X@?   4 id dhef  .991990KSX9Y"K TX@878YK TK T[KT[KT[X@878Y]%#!73267!7!7!!!=/;-df+N)B%+.;4kTVR @D      4eG   991/<90KSXY"K TX  @878Y!! !!%r9tRZ^B `T @/ 4dGd  999991/990KSX9Y"K TKT[KT[KT[X@878Y@ ]3!!"&5467!7!q>N-ͪ +Vm!-%pF,{+@k !    $!"!#""!4&$!  <)[$e" $,"%  &!"% # % " ,.999999999991/<<<29990KSX99Y"KTK T[KT[KT[KT[X,,,@878Y@? ? ? ?????7???????@@@@@@@ @ GOOOOOOOOOO O!O"O#O$O%O&O'O(PPPPPP P __________ _!_"_#_$_%_&_'_( !"$%&'L]>32#>54&#"#>54&#"#3>32 L\l  #"09 $"/7)yEEW@Kpa/aK13=(*Zw1*B(*Wz1`tDKK;`{@L   4  <[e   9991/<99990KSX999Y"K TK T[KT[KT[KT[KT[X@878Y@ ]!>54&#"!!>32Nۅ:7Ruy% 0e (5:=`\gLXy} !@ <<[E 104&#"32!2!"&R]U{aSyM mvjy6BpV{@M4<<[Efe    999991990KSX9999Y"K TX @ 878Y%!!>32#"&7254&#"{{-%!G]>8EupoSJrZ ba۽j|rephwDV}@N4<<[Efe  999991990KSX9999Y"K TK T[KT[X  @878Y7!!#"&547>32"3254&V'%s?_>8FtooTJrZP_dܾk}sdqhw{}@5       4 <[ e   91/990KSX99Y"KTX@878Y.#"!!>320vJ(d%#>w>o,/+)``iZF{'@<    4 ``<K<K%[E( " "(9999190KSX99Y"K TK T[X(((@878Y@(-/// / / ,/. / :::JJJYYY ]].#"#"&'32654&/.54$32F2K]^nIJvhc3V]n{=Xzr]=56F;-7%%r##8;KC.4'$p@>  4 de d  9991/<2990KSX9Y"K TX@878YK TKT[KT[X@878Y!!;#"&5467!7!P>+hj`@O   4  <E e  9991/299990KSX999Y"K TK T[X@878YKTX@878Y@      ]!3267!!7#"&546{#:6Sqz#!,eT4:?wZiH`@#4e91/290KSXY"K TK T[X@878YKTK T[K T[KT[KT[KT[X@878Y@    ] !!P``nZ-` @B      4 e    91/<290KSXY"]@.&))::KL   **-<<<IM[\]]333! !`!#^`5ZN` @@    4 e   91/<290KSXY"K TX @ 878YKTKT[KT[KT[KT[KT[KT[KT[X  @878Y@ )8HYY]] !! !#ժ- `dR=X`@A     4  df e  99129990KSX9Y"K TX@878YK TK T[KT[KT[X@878Y+7326?!!'p~-uWd<')5yi54&+7326?>!3#"3o%Ĩ + `w>%=)+${hY& }_S) DPm}880=L=nVѧWLE'.8;3k10#0@i+,+,,+ 4+1''%,%W'W/W'G1/, 1'&%(&01.991999999990KSX9999Y"326?>7.546?>54&+732;#"+{gX' ~^T) BQy%ͤ)_t>%>)+UͤTOG*06<1`r#m :UFtޓXy++@ ll  19990#"'&'.#"5>32326yKOZq Mg3NJNS5dJ t]F+<73 ":?=6 7=nk&$3um !@J    !  !4 < = Q  " !  "99991/<9990KSXY"32654&#"!!!.54632!oM66MN56MEku$*vt/P6MM66MMq$j5uu;lo&&yk&(Xum&13u=k&23u-k&89u/f&D/uf&DC/uf&D/u1&D/9&D/u&Do{&FLf&HLf&HCLf&HL1&Hf&7f&C7f&71&;h9&QXf&Xyf&CXyf&Xy1&Xy9&jf&Xjf&XCjf&Xj1&X;y Z@/4; 9    9991<20KSXY"!!!!!7!yLL++L}8V@m mB102#"&546"32654&hCz//12.0zDHdbHHdc30/xDBz./3dHHbcGHdhN$R@1` `J K JK[ E%  ""%912<220.'>7#.547>73N5-n@@@3>A77mfP{775rh5(/L.)" țjSY"j@F  4 dLK<B J  9991/222990KSX9Y".#"!!!!3#737$325i!P+?34@-%3J))N h=#G@N7829 %8?/;.2;+;;EB+H785 (" 5%(9B 8?"B5("B54&'.#"#"&'732654/.5467.54632P&:>#&N:)9>&"J-D?U^=micUor-+Rb.JKV^dmPzr30G7,X&':6&'X(#@"!D?)HECAzLTC+e?!"D?Ee DHsK]2)b?` 10467>32#"&'.736HI256743IH426I235624HI447743f; `@-  49  <9991290KSX9Y"!###.54-վEfN'3@e )*+*&'%(++*4("!%3.+%`< %<.G E))*31! (+*1!  ! 1*499999999991/99990KSX999Y"KTKT[KT[KT[K T[X444@878Y@lllllllllll ]#"&'732654/.546754&#"!6$32y`L;:B@1:k.ZhoE,*ZR]r) #dS9`L;}D ODBoG-g;%@Gfefݮ+d}N 4L\@3-*+'0!o5n2+oAn M*',$0-!1"3+"$ G3 ;/29991<99902#"&'.5467>#32654&'2#'.'##%"3267>54&'.hZZ\[[[~}[[[\ZZb@@998(NG&7O?9)cIGHHGHccGHHHHHNZZ[~}[[[[[[}~[ZZb((+)oXZAU 81:/qGIGebJGHHGJbeGIG}N1ID@%  q po>qpo2n>n&JD  8 ,/210.#"3267#"&546322#"&'.5467>"3267>54&'.P4[0akjb5`*7j2ʩ7iZZ\[[[~}[[[\ZZ~cIGHHGGcdFHHHHHh__g$ZZ[~}[[[[[[}~[ZZGIGebHHIIHHbeGIGf A@$   9 # # ###/91<<2<<9073#######5dYЙkKuTKBC9f-10KTK T[X@878Y!#wAFf;H1a@99991<20K TK T[X@878Y@////????]]3#%3#Z111N >@"   H H   <291<2<2.990!3!!!'7#5!7!NŮmA1}j@L    4V <V9VQS  91/<20KSXY"!!!!!!!33<3N64H}nj{sL'.l@8+'/.(+%&"V"+VB"E/ .(% '& &/999999919999999032.547>327#"&''.#"wM8}4 bUNi= L5Nr9K4y6b<=2^"J'BAs8a,>ObJHrN47  /7@$ s'!t s-r0 $$$*099991<2<299032654&#".#"326>32#"&'#"&546320P2;JC88b6J054&#"#"&54632#"&54324&#"32?3-,:*:}fMHeLJdcBds<+@lFWt|uy LP *@     <91990 5!! !!5my=/9) ӇL9@44120!!!9_^-L<@  xv { )('('%1/2299990#3267#"&'.=!!#51F",c7OrL? " VX#o{H)*@$ *'! 56!5*91026732#"&'&'&#" #"&54632mfbwL=.> b )'8yaxMB3F KbPJ?(: *.t@A! '~!~ -~+ +'~}~|B/! *$-,.+/  $ $ /999999919990#7#"&546;7>54&#"7>32"3267!!X.{OkЇIF9S!PAzu:,Up#P@X65zh#(*(&i^ EHK,:x+ 4@~~ }~B  999910432#"&4&#"326!!3%D=WxE54&#"!Zxllx)QNpgfqPR'm8nȿm O֦M{ L3@. .8765493.01/2.43 <1!C=("L !`"<`= ]]1]"K%c9]=\F@[+%E1_MLI 32!"<=.(16C.I..M9999999912<22999990KSX9999Y"KTXMMM@878Y@,3;3<3=/012 L0000;0<0=]]7#"3267>54&#"!3267#"&'#"&546;7>54&#"7>32>32Jbu:1CP% (,8G=UF8A/9Q^ =Yl DA4V/OERt4T~NgU3IH7:_bViR ]@. 49 99991/0KSX9Y"!!!3H8 f#+eXjy@ H 10!#!X!,1 ,@     9190'%3##q@`44{$ V#@I   4   d`K<`K32)R%^g^ʠ>s7+P'_iP'ˠ323326#"'&'.#"5>323326yKOZq Mg3NJNS` t_FIKOZq Mg3NJNS` u_GZ<73 ":?=67 6=;73 ":?<77 6<K@&4<91/90KSXY"% !!{!5qNN# 1@    // 991<299077N--v\/-w#RT# 1@    / /991<2990 7%'%7%'-B-A#wvwvLo u@;    4I   999991/<<220KSXY"!!!!!!:F'E;Hoook&$3um&$3u=m&23uHc@84V V 9VS    91/220KSXY"!"&547>3!!!! ";b3C54&#"!3267#"&'#"&547>32>32267>7>54&#" (,7G> VH9@/9R^2\@68DŽSx%0Rr4D 394D3B'40UYF54O]72((QEKK<=<;>1XZ@JvaZxHA@I*|HQz"IA@ 9910!! 1/@ 9910!! 1/ d@2     4 G    991<20KSX99Y"!3!35׬5׬~~ `@0     4 G   91<20KSX99Y"!#!#}95׬-95׬8@4G910KSX9Y"!35׬~4@4G10KSX9Y"!#95׬BV $@H  <<10!!!!!!55uKu#\u"@91990 h 9%-X1&\Nk&</uB3@ 49/9910KSXY"3#Tm^T /c@8  *( -'! ) -0)'!$ * ( $02299912299904&#"3267'#"&''7.5467'7>32;dJIeeIJd$P0'T-)S.'QIccIJffq)S,/Q$*S)/Q&1m#@ /91907m2)w#=w#@ /9190 7%'-B#wvB@]       4 ddGe       999991/<2<2990KSX9Y"!!!!!!#737>;#"%9Zۮɮۮ-'P+CB:-cNɝ1B@M    4 ddG e      99991/<22990KSX9Y"3#!#737>3!!#"d+ۮ-'B:cNɝ311;{@J   4;;  9      999912<220KSXY"!!!!!!!7!!7!yLN-ZL+JJ+LZ-J}+}-/@4I910KSXY"!!NHo4@4I10KSX9Y"!#:6׬oo `@0     4 I   91<20KSX99Y"!#!#93լ+:3լo $0<HLp@?J%K+I"L 71= +"%>4C: L(I1KJ11F17@11.11(1/99991/<2229999904632#"&5%"32654&4632#"&%"32654&4632#"&%"32654&%wwwu2IH33JJxvvw4GH33JKޥxwvw3HH33JK'!xwxwK24KK42IxwxG45LM41J+xwxH35LM41J^\rk&$3uk&(Xuwk&$3uk&(Xuk&(Xuk&,/uk&,/uk&,/uk&,/u=k&23u=k&23u=k&23u-k&89u-k&89u-k&89u7` j@"4ded   991/20KSXY"KTKT[KT[K T[X  @878Y!!!7!!5Dl++m`PFf6@ 991290K TKT[X@878Y3#'#󷰘fyh9@     99991999999990K TK T[X@878YK TX@878Y@'           ]'&'&#"#>3232673#"&1*"4 _"=.3$&4 }e#AT%!E<$'C>XB19910K TK T[X@878Y!!w%`Fd@  1<990K TX@878YK TX@878Y@  ]332673#"&5XLQuƘF =HMER;189910K TX@878Y@ //??]!!/1 :@ 2 210K TK T[X@878Y4632#"&732654&#"ϦwvvwM76MN57Mvvvv7LM66MMo{%@    291/90!#"&'732654&'3$$4f0+R#DI0\,cv 62E7ufi@ 1<20K TKT[X@878Y@/,,,,&87663146LLJJBB]!#3#fxo#@   2 91/90!33267#"&546K04*%P-1\+ctNPJ!) MB<f6@ 991<90K TKT[X@878Y#373F򶮙x! d@8   4  V9   .9991/90KSXY"3'%!7!P`s+'_s^\w3c#%@J 4dGd  99991/990KSX9Y"KTKT[K T[X@878Y3!!"&5467'!7!%=N-Ω 5Zb+V^"gEl -%pF,Ò:ˊk&6 /uZf&V k&= /u1f&]@ <210##  "}@F!" 4<V9V #" #99991/220KSX99Y"! #!#733#3267654&#;%hH^/f?-N`p+4A}WqE\PFrXXj%~R)@G!"! %&'&$#$''&4)('$#"!%< <E%G*() "#'%$! ) *999999199990KSX9Y".#"32654&!"&532.''%'!%F&R,dT~32#"&ZoSJrZ{%uG]>8Eupephwba۽j|B H 10!!BKwXs 0@   <291<290  ' 7 XJJGJHJHH! S@+334       99120KSXY"3?33!;jŇo-+)NL@&4 3999999190KSXY"!!76754&#"7>32h3[HC?MLIfD-%A[-1$#lc/(K@+ # )  &33)999190#732654&#"7>32#"&'732654&omX^PF0PIBypScKE>O`oW73(.fYZo cJQF-5 w{'&  W {'& W/w'&  Wfk&* /uXF&Jk&, /uo&6ZoF{&Vk&&uf&FV4k&& uf&FVBs'@h'&% #"$      4 "  <"<E[G %      (999991/<2990KSX9999Y"!7!7!3#!7#"&547>32"3254&VB%/%%B_>8EupoSIrZTtt`cܾkqephw9910!!+u8-/@4I910KSXY"!!NH,v@@#$u& uUCJ UC JB E*-,&+*'## %+#-999999999122<290632.#"!!!!3267#"=#73>7#7]VPI@8Oi9RZRhMs?LUTT$$KMg|>Z$$ +K!;\@99991<20KTX@878Y@////????]]3#%3#P/15Ds10K TX@878YK TX@878YKTX@878Y@++//]]!#+s`@  99991<<99990K TX@878YK TX@878YKTX@878Y@%         ]'.#"#>3232673#"&1!#5 `%A#5%'4 ^%@!% @8) =:Xy} !@ <<[E 104&#"32!2!"&R]U{aSyM mvjy6BpX910#ɏX?@ 991<90!#'#L\s@ 991290!373/wo@ 9910'T%#%vu _@3 3  3 334      991<290KSXY" 333##7!7Reml#${)N@  1290332673#"&5 ROGj(Ɠ<7=6}H9910!!w/""""lvLvd"Z D (  d j  ^ vN2TJ V BV~@(2\bNV, . !2!"""#^##$2$>$J$V$b$n$z$$$$$$$$$$$% %%"%.%:%F%R%^%j%v%%%%&"&'''(4))*2*x**+&+,,~,,--. .h..//\/0*012 2223 344X445(5(545@5L566677^77788"8.8J889 99:h::; ;;;;;;;< <<"<.<:>J>~>>?*?|@@ @@$@0@R@ATA`AlAB\BrBBC@CCCCCCCDDDD&D2D>DDEEEF,FFGG"GBG^GGGa a kv 0  7& ]    3 , I , u   (  `  6 C 0 y n Modifications (c) 2006 by Panic, Inc. Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Panic SansBold ItalicPanic Sans Bold ItalicPanic Sans Bold ItalicVersion 1.000PanicSans-BoldItalicBitstream Vera is a trademark of Bitstream, Inc.Panic Inc. / Bitstream Inc.http://www.bitstream.comCopyright (c) 2006 by Panic, Inc. / Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.Modifications (c) 2006 by Panic, Inc. Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Panic SansBold ItalicPanic Sans Bold ItalicPanic Sans Bold ItalicVersion 1.000PanicSans-BoldItalicBitstream Vera is a trademark of Bitstream, Inc.Panic Inc. / Bitstream Inc.http://www.bitstream.comCopyright (c) 2006 by Panic, Inc. / Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org.#  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~     NULL sfthyphenperiodcenteredEuroc6459c6460c6461c6462c6469c6471c6473c6478c6479c6476c6477B`#cVeraSansMonoBdOb6628J00@ ((4 ~7-0m: : : :     ] PanicSans-Bold-Italic -BoldItalicnRmR_jsfntFONDB7- 08m*?dP ` PanicSansPanicSans-BoldPanicSans-ItalicPanicSans-BoldItalic Panic Sansruby-prawn-2.1.0.orig/data/fonts/ZapfDingbats.afm0000644000000000000000000002246712665203156020401 0ustar rootrootStartFontMetrics 4.1 Comment Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved. Comment Creation Date: Thu May 1 15:14:13 1997 Comment UniqueID 43082 Comment VMusage 45775 55535 FontName ZapfDingbats FullName ITC Zapf Dingbats FamilyName ZapfDingbats Weight Medium ItalicAngle 0 IsFixedPitch false CharacterSet Special FontBBox -1 -143 981 820 UnderlinePosition -100 UnderlineThickness 50 Version 002.000 Notice Copyright (c) 1985, 1987, 1988, 1989, 1997 Adobe Systems Incorporated. All Rights Reserved.ITC Zapf Dingbats is a registered trademark of International Typeface Corporation. EncodingScheme FontSpecific StdHW 28 StdVW 90 StartCharMetrics 202 C 32 ; WX 278 ; N space ; B 0 0 0 0 ; C 33 ; WX 974 ; N a1 ; B 35 72 939 621 ; C 34 ; WX 961 ; N a2 ; B 35 81 927 611 ; C 35 ; WX 974 ; N a202 ; B 35 72 939 621 ; C 36 ; WX 980 ; N a3 ; B 35 0 945 692 ; C 37 ; WX 719 ; N a4 ; B 34 139 685 566 ; C 38 ; WX 789 ; N a5 ; B 35 -14 755 705 ; C 39 ; WX 790 ; N a119 ; B 35 -14 755 705 ; C 40 ; WX 791 ; N a118 ; B 35 -13 761 705 ; C 41 ; WX 690 ; N a117 ; B 34 138 655 553 ; C 42 ; WX 960 ; N a11 ; B 35 123 925 568 ; C 43 ; WX 939 ; N a12 ; B 35 134 904 559 ; C 44 ; WX 549 ; N a13 ; B 29 -11 516 705 ; C 45 ; WX 855 ; N a14 ; B 34 59 820 632 ; C 46 ; WX 911 ; N a15 ; B 35 50 876 642 ; C 47 ; WX 933 ; N a16 ; B 35 139 899 550 ; C 48 ; WX 911 ; N a105 ; B 35 50 876 642 ; C 49 ; WX 945 ; N a17 ; B 35 139 909 553 ; C 50 ; WX 974 ; N a18 ; B 35 104 938 587 ; C 51 ; WX 755 ; N a19 ; B 34 -13 721 705 ; C 52 ; WX 846 ; N a20 ; B 36 -14 811 705 ; C 53 ; WX 762 ; N a21 ; B 35 0 727 692 ; C 54 ; WX 761 ; N a22 ; B 35 0 727 692 ; C 55 ; WX 571 ; N a23 ; B -1 -68 571 661 ; C 56 ; WX 677 ; N a24 ; B 36 -13 642 705 ; C 57 ; WX 763 ; N a25 ; B 35 0 728 692 ; C 58 ; WX 760 ; N a26 ; B 35 0 726 692 ; C 59 ; WX 759 ; N a27 ; B 35 0 725 692 ; C 60 ; WX 754 ; N a28 ; B 35 0 720 692 ; C 61 ; WX 494 ; N a6 ; B 35 0 460 692 ; C 62 ; WX 552 ; N a7 ; B 35 0 517 692 ; C 63 ; WX 537 ; N a8 ; B 35 0 503 692 ; C 64 ; WX 577 ; N a9 ; B 35 96 542 596 ; C 65 ; WX 692 ; N a10 ; B 35 -14 657 705 ; C 66 ; WX 786 ; N a29 ; B 35 -14 751 705 ; C 67 ; WX 788 ; N a30 ; B 35 -14 752 705 ; C 68 ; WX 788 ; N a31 ; B 35 -14 753 705 ; C 69 ; WX 790 ; N a32 ; B 35 -14 756 705 ; C 70 ; WX 793 ; N a33 ; B 35 -13 759 705 ; C 71 ; WX 794 ; N a34 ; B 35 -13 759 705 ; C 72 ; WX 816 ; N a35 ; B 35 -14 782 705 ; C 73 ; WX 823 ; N a36 ; B 35 -14 787 705 ; C 74 ; WX 789 ; N a37 ; B 35 -14 754 705 ; C 75 ; WX 841 ; N a38 ; B 35 -14 807 705 ; C 76 ; WX 823 ; N a39 ; B 35 -14 789 705 ; C 77 ; WX 833 ; N a40 ; B 35 -14 798 705 ; C 78 ; WX 816 ; N a41 ; B 35 -13 782 705 ; C 79 ; WX 831 ; N a42 ; B 35 -14 796 705 ; C 80 ; WX 923 ; N a43 ; B 35 -14 888 705 ; C 81 ; WX 744 ; N a44 ; B 35 0 710 692 ; C 82 ; WX 723 ; N a45 ; B 35 0 688 692 ; C 83 ; WX 749 ; N a46 ; B 35 0 714 692 ; C 84 ; WX 790 ; N a47 ; B 34 -14 756 705 ; C 85 ; WX 792 ; N a48 ; B 35 -14 758 705 ; C 86 ; WX 695 ; N a49 ; B 35 -14 661 706 ; C 87 ; WX 776 ; N a50 ; B 35 -6 741 699 ; C 88 ; WX 768 ; N a51 ; B 35 -7 734 699 ; C 89 ; WX 792 ; N a52 ; B 35 -14 757 705 ; C 90 ; WX 759 ; N a53 ; B 35 0 725 692 ; C 91 ; WX 707 ; N a54 ; B 35 -13 672 704 ; C 92 ; WX 708 ; N a55 ; B 35 -14 672 705 ; C 93 ; WX 682 ; N a56 ; B 35 -14 647 705 ; C 94 ; WX 701 ; N a57 ; B 35 -14 666 705 ; C 95 ; WX 826 ; N a58 ; B 35 -14 791 705 ; C 96 ; WX 815 ; N a59 ; B 35 -14 780 705 ; C 97 ; WX 789 ; N a60 ; B 35 -14 754 705 ; C 98 ; WX 789 ; N a61 ; B 35 -14 754 705 ; C 99 ; WX 707 ; N a62 ; B 34 -14 673 705 ; C 100 ; WX 687 ; N a63 ; B 36 0 651 692 ; C 101 ; WX 696 ; N a64 ; B 35 0 661 691 ; C 102 ; WX 689 ; N a65 ; B 35 0 655 692 ; C 103 ; WX 786 ; N a66 ; B 34 -14 751 705 ; C 104 ; WX 787 ; N a67 ; B 35 -14 752 705 ; C 105 ; WX 713 ; N a68 ; B 35 -14 678 705 ; C 106 ; WX 791 ; N a69 ; B 35 -14 756 705 ; C 107 ; WX 785 ; N a70 ; B 36 -14 751 705 ; C 108 ; WX 791 ; N a71 ; B 35 -14 757 705 ; C 109 ; WX 873 ; N a72 ; B 35 -14 838 705 ; C 110 ; WX 761 ; N a73 ; B 35 0 726 692 ; C 111 ; WX 762 ; N a74 ; B 35 0 727 692 ; C 112 ; WX 762 ; N a203 ; B 35 0 727 692 ; C 113 ; WX 759 ; N a75 ; B 35 0 725 692 ; C 114 ; WX 759 ; N a204 ; B 35 0 725 692 ; C 115 ; WX 892 ; N a76 ; B 35 0 858 705 ; C 116 ; WX 892 ; N a77 ; B 35 -14 858 692 ; C 117 ; WX 788 ; N a78 ; B 35 -14 754 705 ; C 118 ; WX 784 ; N a79 ; B 35 -14 749 705 ; C 119 ; WX 438 ; N a81 ; B 35 -14 403 705 ; C 120 ; WX 138 ; N a82 ; B 35 0 104 692 ; C 121 ; WX 277 ; N a83 ; B 35 0 242 692 ; C 122 ; WX 415 ; N a84 ; B 35 0 380 692 ; C 123 ; WX 392 ; N a97 ; B 35 263 357 705 ; C 124 ; WX 392 ; N a98 ; B 34 263 357 705 ; C 125 ; WX 668 ; N a99 ; B 35 263 633 705 ; C 126 ; WX 668 ; N a100 ; B 36 263 634 705 ; C 128 ; WX 390 ; N a89 ; B 35 -14 356 705 ; C 129 ; WX 390 ; N a90 ; B 35 -14 355 705 ; C 130 ; WX 317 ; N a93 ; B 35 0 283 692 ; C 131 ; WX 317 ; N a94 ; B 35 0 283 692 ; C 132 ; WX 276 ; N a91 ; B 35 0 242 692 ; C 133 ; WX 276 ; N a92 ; B 35 0 242 692 ; C 134 ; WX 509 ; N a205 ; B 35 0 475 692 ; C 135 ; WX 509 ; N a85 ; B 35 0 475 692 ; C 136 ; WX 410 ; N a206 ; B 35 0 375 692 ; C 137 ; WX 410 ; N a86 ; B 35 0 375 692 ; C 138 ; WX 234 ; N a87 ; B 35 -14 199 705 ; C 139 ; WX 234 ; N a88 ; B 35 -14 199 705 ; C 140 ; WX 334 ; N a95 ; B 35 0 299 692 ; C 141 ; WX 334 ; N a96 ; B 35 0 299 692 ; C 161 ; WX 732 ; N a101 ; B 35 -143 697 806 ; C 162 ; WX 544 ; N a102 ; B 56 -14 488 706 ; C 163 ; WX 544 ; N a103 ; B 34 -14 508 705 ; C 164 ; WX 910 ; N a104 ; B 35 40 875 651 ; C 165 ; WX 667 ; N a106 ; B 35 -14 633 705 ; C 166 ; WX 760 ; N a107 ; B 35 -14 726 705 ; C 167 ; WX 760 ; N a108 ; B 0 121 758 569 ; C 168 ; WX 776 ; N a112 ; B 35 0 741 705 ; C 169 ; WX 595 ; N a111 ; B 34 -14 560 705 ; C 170 ; WX 694 ; N a110 ; B 35 -14 659 705 ; C 171 ; WX 626 ; N a109 ; B 34 0 591 705 ; C 172 ; WX 788 ; N a120 ; B 35 -14 754 705 ; C 173 ; WX 788 ; N a121 ; B 35 -14 754 705 ; C 174 ; WX 788 ; N a122 ; B 35 -14 754 705 ; C 175 ; WX 788 ; N a123 ; B 35 -14 754 705 ; C 176 ; WX 788 ; N a124 ; B 35 -14 754 705 ; C 177 ; WX 788 ; N a125 ; B 35 -14 754 705 ; C 178 ; WX 788 ; N a126 ; B 35 -14 754 705 ; C 179 ; WX 788 ; N a127 ; B 35 -14 754 705 ; C 180 ; WX 788 ; N a128 ; B 35 -14 754 705 ; C 181 ; WX 788 ; N a129 ; B 35 -14 754 705 ; C 182 ; WX 788 ; N a130 ; B 35 -14 754 705 ; C 183 ; WX 788 ; N a131 ; B 35 -14 754 705 ; C 184 ; WX 788 ; N a132 ; B 35 -14 754 705 ; C 185 ; WX 788 ; N a133 ; B 35 -14 754 705 ; C 186 ; WX 788 ; N a134 ; B 35 -14 754 705 ; C 187 ; WX 788 ; N a135 ; B 35 -14 754 705 ; C 188 ; WX 788 ; N a136 ; B 35 -14 754 705 ; C 189 ; WX 788 ; N a137 ; B 35 -14 754 705 ; C 190 ; WX 788 ; N a138 ; B 35 -14 754 705 ; C 191 ; WX 788 ; N a139 ; B 35 -14 754 705 ; C 192 ; WX 788 ; N a140 ; B 35 -14 754 705 ; C 193 ; WX 788 ; N a141 ; B 35 -14 754 705 ; C 194 ; WX 788 ; N a142 ; B 35 -14 754 705 ; C 195 ; WX 788 ; N a143 ; B 35 -14 754 705 ; C 196 ; WX 788 ; N a144 ; B 35 -14 754 705 ; C 197 ; WX 788 ; N a145 ; B 35 -14 754 705 ; C 198 ; WX 788 ; N a146 ; B 35 -14 754 705 ; C 199 ; WX 788 ; N a147 ; B 35 -14 754 705 ; C 200 ; WX 788 ; N a148 ; B 35 -14 754 705 ; C 201 ; WX 788 ; N a149 ; B 35 -14 754 705 ; C 202 ; WX 788 ; N a150 ; B 35 -14 754 705 ; C 203 ; WX 788 ; N a151 ; B 35 -14 754 705 ; C 204 ; WX 788 ; N a152 ; B 35 -14 754 705 ; C 205 ; WX 788 ; N a153 ; B 35 -14 754 705 ; C 206 ; WX 788 ; N a154 ; B 35 -14 754 705 ; C 207 ; WX 788 ; N a155 ; B 35 -14 754 705 ; C 208 ; WX 788 ; N a156 ; B 35 -14 754 705 ; C 209 ; WX 788 ; N a157 ; B 35 -14 754 705 ; C 210 ; WX 788 ; N a158 ; B 35 -14 754 705 ; C 211 ; WX 788 ; N a159 ; B 35 -14 754 705 ; C 212 ; WX 894 ; N a160 ; B 35 58 860 634 ; C 213 ; WX 838 ; N a161 ; B 35 152 803 540 ; C 214 ; WX 1016 ; N a163 ; B 34 152 981 540 ; C 215 ; WX 458 ; N a164 ; B 35 -127 422 820 ; C 216 ; WX 748 ; N a196 ; B 35 94 698 597 ; C 217 ; WX 924 ; N a165 ; B 35 140 890 552 ; C 218 ; WX 748 ; N a192 ; B 35 94 698 597 ; C 219 ; WX 918 ; N a166 ; B 35 166 884 526 ; C 220 ; WX 927 ; N a167 ; B 35 32 892 660 ; C 221 ; WX 928 ; N a168 ; B 35 129 891 562 ; C 222 ; WX 928 ; N a169 ; B 35 128 893 563 ; C 223 ; WX 834 ; N a170 ; B 35 155 799 537 ; C 224 ; WX 873 ; N a171 ; B 35 93 838 599 ; C 225 ; WX 828 ; N a172 ; B 35 104 791 588 ; C 226 ; WX 924 ; N a173 ; B 35 98 889 594 ; C 227 ; WX 924 ; N a162 ; B 35 98 889 594 ; C 228 ; WX 917 ; N a174 ; B 35 0 882 692 ; C 229 ; WX 930 ; N a175 ; B 35 84 896 608 ; C 230 ; WX 931 ; N a176 ; B 35 84 896 608 ; C 231 ; WX 463 ; N a177 ; B 35 -99 429 791 ; C 232 ; WX 883 ; N a178 ; B 35 71 848 623 ; C 233 ; WX 836 ; N a179 ; B 35 44 802 648 ; C 234 ; WX 836 ; N a193 ; B 35 44 802 648 ; C 235 ; WX 867 ; N a180 ; B 35 101 832 591 ; C 236 ; WX 867 ; N a199 ; B 35 101 832 591 ; C 237 ; WX 696 ; N a181 ; B 35 44 661 648 ; C 238 ; WX 696 ; N a200 ; B 35 44 661 648 ; C 239 ; WX 874 ; N a182 ; B 35 77 840 619 ; C 241 ; WX 874 ; N a201 ; B 35 73 840 615 ; C 242 ; WX 760 ; N a183 ; B 35 0 725 692 ; C 243 ; WX 946 ; N a184 ; B 35 160 911 533 ; C 244 ; WX 771 ; N a197 ; B 34 37 736 655 ; C 245 ; WX 865 ; N a185 ; B 35 207 830 481 ; C 246 ; WX 771 ; N a194 ; B 34 37 736 655 ; C 247 ; WX 888 ; N a198 ; B 34 -19 853 712 ; C 248 ; WX 967 ; N a186 ; B 35 124 932 568 ; C 249 ; WX 888 ; N a195 ; B 34 -19 853 712 ; C 250 ; WX 831 ; N a187 ; B 35 113 796 579 ; C 251 ; WX 873 ; N a188 ; B 36 118 838 578 ; C 252 ; WX 927 ; N a189 ; B 35 150 891 542 ; C 253 ; WX 970 ; N a190 ; B 35 76 931 616 ; C 254 ; WX 918 ; N a191 ; B 34 99 884 593 ; EndCharMetrics EndFontMetrics ruby-prawn-2.1.0.orig/data/fonts/Courier-Oblique.afm0000644000000000000000000003612112665203156021023 0ustar rootrootStartFontMetrics 4.1 Comment Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. Comment Creation Date: Thu May 1 17:37:52 1997 Comment UniqueID 43051 Comment VMusage 16248 75829 FontName Courier-Oblique FullName Courier Oblique FamilyName Courier Weight Medium ItalicAngle -12 IsFixedPitch true CharacterSet ExtendedRoman FontBBox -27 -250 849 805 UnderlinePosition -100 UnderlineThickness 50 Version 003.000 Notice Copyright (c) 1989, 1990, 1991, 1992, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. EncodingScheme AdobeStandardEncoding CapHeight 562 XHeight 426 Ascender 629 Descender -157 StdHW 51 StdVW 51 StartCharMetrics 315 C 32 ; WX 600 ; N space ; B 0 0 0 0 ; C 33 ; WX 600 ; N exclam ; B 243 -15 464 572 ; C 34 ; WX 600 ; N quotedbl ; B 273 328 532 562 ; C 35 ; WX 600 ; N numbersign ; B 133 -32 596 639 ; C 36 ; WX 600 ; N dollar ; B 108 -126 596 662 ; C 37 ; WX 600 ; N percent ; B 134 -15 599 622 ; C 38 ; WX 600 ; N ampersand ; B 87 -15 580 543 ; C 39 ; WX 600 ; N quoteright ; B 283 328 495 562 ; C 40 ; WX 600 ; N parenleft ; B 313 -108 572 622 ; C 41 ; WX 600 ; N parenright ; B 137 -108 396 622 ; C 42 ; WX 600 ; N asterisk ; B 212 257 580 607 ; C 43 ; WX 600 ; N plus ; B 129 44 580 470 ; C 44 ; WX 600 ; N comma ; B 157 -112 370 122 ; C 45 ; WX 600 ; N hyphen ; B 152 231 558 285 ; C 46 ; WX 600 ; N period ; B 238 -15 382 109 ; C 47 ; WX 600 ; N slash ; B 112 -80 604 629 ; C 48 ; WX 600 ; N zero ; B 154 -15 575 622 ; C 49 ; WX 600 ; N one ; B 98 0 515 622 ; C 50 ; WX 600 ; N two ; B 70 0 568 622 ; C 51 ; WX 600 ; N three ; B 82 -15 538 622 ; C 52 ; WX 600 ; N four ; B 108 0 541 622 ; C 53 ; WX 600 ; N five ; B 99 -15 589 607 ; C 54 ; WX 600 ; N six ; B 155 -15 629 622 ; C 55 ; WX 600 ; N seven ; B 182 0 612 607 ; C 56 ; WX 600 ; N eight ; B 132 -15 588 622 ; C 57 ; WX 600 ; N nine ; B 93 -15 574 622 ; C 58 ; WX 600 ; N colon ; B 238 -15 441 385 ; C 59 ; WX 600 ; N semicolon ; B 157 -112 441 385 ; C 60 ; WX 600 ; N less ; B 96 42 610 472 ; C 61 ; WX 600 ; N equal ; B 109 138 600 376 ; C 62 ; WX 600 ; N greater ; B 85 42 599 472 ; C 63 ; WX 600 ; N question ; B 222 -15 583 572 ; C 64 ; WX 600 ; N at ; B 127 -15 582 622 ; C 65 ; WX 600 ; N A ; B 3 0 607 562 ; C 66 ; WX 600 ; N B ; B 43 0 616 562 ; C 67 ; WX 600 ; N C ; B 93 -18 655 580 ; C 68 ; WX 600 ; N D ; B 43 0 645 562 ; C 69 ; WX 600 ; N E ; B 53 0 660 562 ; C 70 ; WX 600 ; N F ; B 53 0 660 562 ; C 71 ; WX 600 ; N G ; B 83 -18 645 580 ; C 72 ; WX 600 ; N H ; B 32 0 687 562 ; C 73 ; WX 600 ; N I ; B 96 0 623 562 ; C 74 ; WX 600 ; N J ; B 52 -18 685 562 ; C 75 ; WX 600 ; N K ; B 38 0 671 562 ; C 76 ; WX 600 ; N L ; B 47 0 607 562 ; C 77 ; WX 600 ; N M ; B 4 0 715 562 ; C 78 ; WX 600 ; N N ; B 7 -13 712 562 ; C 79 ; WX 600 ; N O ; B 94 -18 625 580 ; C 80 ; WX 600 ; N P ; B 79 0 644 562 ; C 81 ; WX 600 ; N Q ; B 95 -138 625 580 ; C 82 ; WX 600 ; N R ; B 38 0 598 562 ; C 83 ; WX 600 ; N S ; B 76 -20 650 580 ; C 84 ; WX 600 ; N T ; B 108 0 665 562 ; C 85 ; WX 600 ; N U ; B 125 -18 702 562 ; C 86 ; WX 600 ; N V ; B 105 -13 723 562 ; C 87 ; WX 600 ; N W ; B 106 -13 722 562 ; C 88 ; WX 600 ; N X ; B 23 0 675 562 ; C 89 ; WX 600 ; N Y ; B 133 0 695 562 ; C 90 ; WX 600 ; N Z ; B 86 0 610 562 ; C 91 ; WX 600 ; N bracketleft ; B 246 -108 574 622 ; C 92 ; WX 600 ; N backslash ; B 249 -80 468 629 ; C 93 ; WX 600 ; N bracketright ; B 135 -108 463 622 ; C 94 ; WX 600 ; N asciicircum ; B 175 354 587 622 ; C 95 ; WX 600 ; N underscore ; B -27 -125 584 -75 ; C 96 ; WX 600 ; N quoteleft ; B 343 328 457 562 ; C 97 ; WX 600 ; N a ; B 76 -15 569 441 ; C 98 ; WX 600 ; N b ; B 29 -15 625 629 ; C 99 ; WX 600 ; N c ; B 106 -15 608 441 ; C 100 ; WX 600 ; N d ; B 85 -15 640 629 ; C 101 ; WX 600 ; N e ; B 106 -15 598 441 ; C 102 ; WX 600 ; N f ; B 114 0 662 629 ; L i fi ; L l fl ; C 103 ; WX 600 ; N g ; B 61 -157 657 441 ; C 104 ; WX 600 ; N h ; B 33 0 592 629 ; C 105 ; WX 600 ; N i ; B 95 0 515 657 ; C 106 ; WX 600 ; N j ; B 52 -157 550 657 ; C 107 ; WX 600 ; N k ; B 58 0 633 629 ; C 108 ; WX 600 ; N l ; B 95 0 515 629 ; C 109 ; WX 600 ; N m ; B -5 0 615 441 ; C 110 ; WX 600 ; N n ; B 26 0 585 441 ; C 111 ; WX 600 ; N o ; B 102 -15 588 441 ; C 112 ; WX 600 ; N p ; B -24 -157 605 441 ; C 113 ; WX 600 ; N q ; B 85 -157 682 441 ; C 114 ; WX 600 ; N r ; B 60 0 636 441 ; C 115 ; WX 600 ; N s ; B 78 -15 584 441 ; C 116 ; WX 600 ; N t ; B 167 -15 561 561 ; C 117 ; WX 600 ; N u ; B 101 -15 572 426 ; C 118 ; WX 600 ; N v ; B 90 -10 681 426 ; C 119 ; WX 600 ; N w ; B 76 -10 695 426 ; C 120 ; WX 600 ; N x ; B 20 0 655 426 ; C 121 ; WX 600 ; N y ; B -4 -157 683 426 ; C 122 ; WX 600 ; N z ; B 99 0 593 426 ; C 123 ; WX 600 ; N braceleft ; B 233 -108 569 622 ; C 124 ; WX 600 ; N bar ; B 222 -250 485 750 ; C 125 ; WX 600 ; N braceright ; B 140 -108 477 622 ; C 126 ; WX 600 ; N asciitilde ; B 116 197 600 320 ; C 161 ; WX 600 ; N exclamdown ; B 225 -157 445 430 ; C 162 ; WX 600 ; N cent ; B 151 -49 588 614 ; C 163 ; WX 600 ; N sterling ; B 124 -21 621 611 ; C 164 ; WX 600 ; N fraction ; B 84 -57 646 665 ; C 165 ; WX 600 ; N yen ; B 120 0 693 562 ; C 166 ; WX 600 ; N florin ; B -26 -143 671 622 ; C 167 ; WX 600 ; N section ; B 104 -78 590 580 ; C 168 ; WX 600 ; N currency ; B 94 58 628 506 ; C 169 ; WX 600 ; N quotesingle ; B 345 328 460 562 ; C 170 ; WX 600 ; N quotedblleft ; B 262 328 541 562 ; C 171 ; WX 600 ; N guillemotleft ; B 92 70 652 446 ; C 172 ; WX 600 ; N guilsinglleft ; B 204 70 540 446 ; C 173 ; WX 600 ; N guilsinglright ; B 170 70 506 446 ; C 174 ; WX 600 ; N fi ; B 3 0 619 629 ; C 175 ; WX 600 ; N fl ; B 3 0 619 629 ; C 177 ; WX 600 ; N endash ; B 124 231 586 285 ; C 178 ; WX 600 ; N dagger ; B 217 -78 546 580 ; C 179 ; WX 600 ; N daggerdbl ; B 163 -78 546 580 ; C 180 ; WX 600 ; N periodcentered ; B 275 189 434 327 ; C 182 ; WX 600 ; N paragraph ; B 100 -78 630 562 ; C 183 ; WX 600 ; N bullet ; B 224 130 485 383 ; C 184 ; WX 600 ; N quotesinglbase ; B 185 -134 397 100 ; C 185 ; WX 600 ; N quotedblbase ; B 115 -134 478 100 ; C 186 ; WX 600 ; N quotedblright ; B 213 328 576 562 ; C 187 ; WX 600 ; N guillemotright ; B 58 70 618 446 ; C 188 ; WX 600 ; N ellipsis ; B 46 -15 575 111 ; C 189 ; WX 600 ; N perthousand ; B 59 -15 627 622 ; C 191 ; WX 600 ; N questiondown ; B 105 -157 466 430 ; C 193 ; WX 600 ; N grave ; B 294 497 484 672 ; C 194 ; WX 600 ; N acute ; B 348 497 612 672 ; C 195 ; WX 600 ; N circumflex ; B 229 477 581 654 ; C 196 ; WX 600 ; N tilde ; B 212 489 629 606 ; C 197 ; WX 600 ; N macron ; B 232 525 600 565 ; C 198 ; WX 600 ; N breve ; B 279 501 576 609 ; C 199 ; WX 600 ; N dotaccent ; B 373 537 478 640 ; C 200 ; WX 600 ; N dieresis ; B 272 537 579 640 ; C 202 ; WX 600 ; N ring ; B 332 463 500 627 ; C 203 ; WX 600 ; N cedilla ; B 197 -151 344 10 ; C 205 ; WX 600 ; N hungarumlaut ; B 239 497 683 672 ; C 206 ; WX 600 ; N ogonek ; B 189 -172 377 4 ; C 207 ; WX 600 ; N caron ; B 262 492 614 669 ; C 208 ; WX 600 ; N emdash ; B 49 231 661 285 ; C 225 ; WX 600 ; N AE ; B 3 0 655 562 ; C 227 ; WX 600 ; N ordfeminine ; B 209 249 512 580 ; C 232 ; WX 600 ; N Lslash ; B 47 0 607 562 ; C 233 ; WX 600 ; N Oslash ; B 94 -80 625 629 ; C 234 ; WX 600 ; N OE ; B 59 0 672 562 ; C 235 ; WX 600 ; N ordmasculine ; B 210 249 535 580 ; C 241 ; WX 600 ; N ae ; B 41 -15 626 441 ; C 245 ; WX 600 ; N dotlessi ; B 95 0 515 426 ; C 248 ; WX 600 ; N lslash ; B 95 0 587 629 ; C 249 ; WX 600 ; N oslash ; B 102 -80 588 506 ; C 250 ; WX 600 ; N oe ; B 54 -15 615 441 ; C 251 ; WX 600 ; N germandbls ; B 48 -15 617 629 ; C -1 ; WX 600 ; N Idieresis ; B 96 0 623 753 ; C -1 ; WX 600 ; N eacute ; B 106 -15 612 672 ; C -1 ; WX 600 ; N abreve ; B 76 -15 576 609 ; C -1 ; WX 600 ; N uhungarumlaut ; B 101 -15 723 672 ; C -1 ; WX 600 ; N ecaron ; B 106 -15 614 669 ; C -1 ; WX 600 ; N Ydieresis ; B 133 0 695 753 ; C -1 ; WX 600 ; N divide ; B 136 48 573 467 ; C -1 ; WX 600 ; N Yacute ; B 133 0 695 805 ; C -1 ; WX 600 ; N Acircumflex ; B 3 0 607 787 ; C -1 ; WX 600 ; N aacute ; B 76 -15 612 672 ; C -1 ; WX 600 ; N Ucircumflex ; B 125 -18 702 787 ; C -1 ; WX 600 ; N yacute ; B -4 -157 683 672 ; C -1 ; WX 600 ; N scommaaccent ; B 78 -250 584 441 ; C -1 ; WX 600 ; N ecircumflex ; B 106 -15 598 654 ; C -1 ; WX 600 ; N Uring ; B 125 -18 702 760 ; C -1 ; WX 600 ; N Udieresis ; B 125 -18 702 753 ; C -1 ; WX 600 ; N aogonek ; B 76 -172 569 441 ; C -1 ; WX 600 ; N Uacute ; B 125 -18 702 805 ; C -1 ; WX 600 ; N uogonek ; B 101 -172 572 426 ; C -1 ; WX 600 ; N Edieresis ; B 53 0 660 753 ; C -1 ; WX 600 ; N Dcroat ; B 43 0 645 562 ; C -1 ; WX 600 ; N commaaccent ; B 145 -250 323 -58 ; C -1 ; WX 600 ; N copyright ; B 53 -18 667 580 ; C -1 ; WX 600 ; N Emacron ; B 53 0 660 698 ; C -1 ; WX 600 ; N ccaron ; B 106 -15 614 669 ; C -1 ; WX 600 ; N aring ; B 76 -15 569 627 ; C -1 ; WX 600 ; N Ncommaaccent ; B 7 -250 712 562 ; C -1 ; WX 600 ; N lacute ; B 95 0 640 805 ; C -1 ; WX 600 ; N agrave ; B 76 -15 569 672 ; C -1 ; WX 600 ; N Tcommaaccent ; B 108 -250 665 562 ; C -1 ; WX 600 ; N Cacute ; B 93 -18 655 805 ; C -1 ; WX 600 ; N atilde ; B 76 -15 629 606 ; C -1 ; WX 600 ; N Edotaccent ; B 53 0 660 753 ; C -1 ; WX 600 ; N scaron ; B 78 -15 614 669 ; C -1 ; WX 600 ; N scedilla ; B 78 -151 584 441 ; C -1 ; WX 600 ; N iacute ; B 95 0 612 672 ; C -1 ; WX 600 ; N lozenge ; B 94 0 519 706 ; C -1 ; WX 600 ; N Rcaron ; B 38 0 642 802 ; C -1 ; WX 600 ; N Gcommaaccent ; B 83 -250 645 580 ; C -1 ; WX 600 ; N ucircumflex ; B 101 -15 572 654 ; C -1 ; WX 600 ; N acircumflex ; B 76 -15 581 654 ; C -1 ; WX 600 ; N Amacron ; B 3 0 607 698 ; C -1 ; WX 600 ; N rcaron ; B 60 0 636 669 ; C -1 ; WX 600 ; N ccedilla ; B 106 -151 614 441 ; C -1 ; WX 600 ; N Zdotaccent ; B 86 0 610 753 ; C -1 ; WX 600 ; N Thorn ; B 79 0 606 562 ; C -1 ; WX 600 ; N Omacron ; B 94 -18 628 698 ; C -1 ; WX 600 ; N Racute ; B 38 0 670 805 ; C -1 ; WX 600 ; N Sacute ; B 76 -20 650 805 ; C -1 ; WX 600 ; N dcaron ; B 85 -15 849 629 ; C -1 ; WX 600 ; N Umacron ; B 125 -18 702 698 ; C -1 ; WX 600 ; N uring ; B 101 -15 572 627 ; C -1 ; WX 600 ; N threesuperior ; B 213 240 501 622 ; C -1 ; WX 600 ; N Ograve ; B 94 -18 625 805 ; C -1 ; WX 600 ; N Agrave ; B 3 0 607 805 ; C -1 ; WX 600 ; N Abreve ; B 3 0 607 732 ; C -1 ; WX 600 ; N multiply ; B 103 43 607 470 ; C -1 ; WX 600 ; N uacute ; B 101 -15 602 672 ; C -1 ; WX 600 ; N Tcaron ; B 108 0 665 802 ; C -1 ; WX 600 ; N partialdiff ; B 45 -38 546 710 ; C -1 ; WX 600 ; N ydieresis ; B -4 -157 683 620 ; C -1 ; WX 600 ; N Nacute ; B 7 -13 712 805 ; C -1 ; WX 600 ; N icircumflex ; B 95 0 551 654 ; C -1 ; WX 600 ; N Ecircumflex ; B 53 0 660 787 ; C -1 ; WX 600 ; N adieresis ; B 76 -15 575 620 ; C -1 ; WX 600 ; N edieresis ; B 106 -15 598 620 ; C -1 ; WX 600 ; N cacute ; B 106 -15 612 672 ; C -1 ; WX 600 ; N nacute ; B 26 0 602 672 ; C -1 ; WX 600 ; N umacron ; B 101 -15 600 565 ; C -1 ; WX 600 ; N Ncaron ; B 7 -13 712 802 ; C -1 ; WX 600 ; N Iacute ; B 96 0 640 805 ; C -1 ; WX 600 ; N plusminus ; B 96 44 594 558 ; C -1 ; WX 600 ; N brokenbar ; B 238 -175 469 675 ; C -1 ; WX 600 ; N registered ; B 53 -18 667 580 ; C -1 ; WX 600 ; N Gbreve ; B 83 -18 645 732 ; C -1 ; WX 600 ; N Idotaccent ; B 96 0 623 753 ; C -1 ; WX 600 ; N summation ; B 15 -10 670 706 ; C -1 ; WX 600 ; N Egrave ; B 53 0 660 805 ; C -1 ; WX 600 ; N racute ; B 60 0 636 672 ; C -1 ; WX 600 ; N omacron ; B 102 -15 600 565 ; C -1 ; WX 600 ; N Zacute ; B 86 0 670 805 ; C -1 ; WX 600 ; N Zcaron ; B 86 0 642 802 ; C -1 ; WX 600 ; N greaterequal ; B 98 0 594 710 ; C -1 ; WX 600 ; N Eth ; B 43 0 645 562 ; C -1 ; WX 600 ; N Ccedilla ; B 93 -151 658 580 ; C -1 ; WX 600 ; N lcommaaccent ; B 95 -250 515 629 ; C -1 ; WX 600 ; N tcaron ; B 167 -15 587 717 ; C -1 ; WX 600 ; N eogonek ; B 106 -172 598 441 ; C -1 ; WX 600 ; N Uogonek ; B 124 -172 702 562 ; C -1 ; WX 600 ; N Aacute ; B 3 0 660 805 ; C -1 ; WX 600 ; N Adieresis ; B 3 0 607 753 ; C -1 ; WX 600 ; N egrave ; B 106 -15 598 672 ; C -1 ; WX 600 ; N zacute ; B 99 0 612 672 ; C -1 ; WX 600 ; N iogonek ; B 95 -172 515 657 ; C -1 ; WX 600 ; N Oacute ; B 94 -18 640 805 ; C -1 ; WX 600 ; N oacute ; B 102 -15 612 672 ; C -1 ; WX 600 ; N amacron ; B 76 -15 600 565 ; C -1 ; WX 600 ; N sacute ; B 78 -15 612 672 ; C -1 ; WX 600 ; N idieresis ; B 95 0 545 620 ; C -1 ; WX 600 ; N Ocircumflex ; B 94 -18 625 787 ; C -1 ; WX 600 ; N Ugrave ; B 125 -18 702 805 ; C -1 ; WX 600 ; N Delta ; B 6 0 598 688 ; C -1 ; WX 600 ; N thorn ; B -24 -157 605 629 ; C -1 ; WX 600 ; N twosuperior ; B 230 249 535 622 ; C -1 ; WX 600 ; N Odieresis ; B 94 -18 625 753 ; C -1 ; WX 600 ; N mu ; B 72 -157 572 426 ; C -1 ; WX 600 ; N igrave ; B 95 0 515 672 ; C -1 ; WX 600 ; N ohungarumlaut ; B 102 -15 723 672 ; C -1 ; WX 600 ; N Eogonek ; B 53 -172 660 562 ; C -1 ; WX 600 ; N dcroat ; B 85 -15 704 629 ; C -1 ; WX 600 ; N threequarters ; B 73 -56 659 666 ; C -1 ; WX 600 ; N Scedilla ; B 76 -151 650 580 ; C -1 ; WX 600 ; N lcaron ; B 95 0 667 629 ; C -1 ; WX 600 ; N Kcommaaccent ; B 38 -250 671 562 ; C -1 ; WX 600 ; N Lacute ; B 47 0 607 805 ; C -1 ; WX 600 ; N trademark ; B 75 263 742 562 ; C -1 ; WX 600 ; N edotaccent ; B 106 -15 598 620 ; C -1 ; WX 600 ; N Igrave ; B 96 0 623 805 ; C -1 ; WX 600 ; N Imacron ; B 96 0 628 698 ; C -1 ; WX 600 ; N Lcaron ; B 47 0 632 562 ; C -1 ; WX 600 ; N onehalf ; B 65 -57 669 665 ; C -1 ; WX 600 ; N lessequal ; B 98 0 645 710 ; C -1 ; WX 600 ; N ocircumflex ; B 102 -15 588 654 ; C -1 ; WX 600 ; N ntilde ; B 26 0 629 606 ; C -1 ; WX 600 ; N Uhungarumlaut ; B 125 -18 761 805 ; C -1 ; WX 600 ; N Eacute ; B 53 0 670 805 ; C -1 ; WX 600 ; N emacron ; B 106 -15 600 565 ; C -1 ; WX 600 ; N gbreve ; B 61 -157 657 609 ; C -1 ; WX 600 ; N onequarter ; B 65 -57 674 665 ; C -1 ; WX 600 ; N Scaron ; B 76 -20 672 802 ; C -1 ; WX 600 ; N Scommaaccent ; B 76 -250 650 580 ; C -1 ; WX 600 ; N Ohungarumlaut ; B 94 -18 751 805 ; C -1 ; WX 600 ; N degree ; B 214 269 576 622 ; C -1 ; WX 600 ; N ograve ; B 102 -15 588 672 ; C -1 ; WX 600 ; N Ccaron ; B 93 -18 672 802 ; C -1 ; WX 600 ; N ugrave ; B 101 -15 572 672 ; C -1 ; WX 600 ; N radical ; B 85 -15 765 792 ; C -1 ; WX 600 ; N Dcaron ; B 43 0 645 802 ; C -1 ; WX 600 ; N rcommaaccent ; B 60 -250 636 441 ; C -1 ; WX 600 ; N Ntilde ; B 7 -13 712 729 ; C -1 ; WX 600 ; N otilde ; B 102 -15 629 606 ; C -1 ; WX 600 ; N Rcommaaccent ; B 38 -250 598 562 ; C -1 ; WX 600 ; N Lcommaaccent ; B 47 -250 607 562 ; C -1 ; WX 600 ; N Atilde ; B 3 0 655 729 ; C -1 ; WX 600 ; N Aogonek ; B 3 -172 607 562 ; C -1 ; WX 600 ; N Aring ; B 3 0 607 750 ; C -1 ; WX 600 ; N Otilde ; B 94 -18 655 729 ; C -1 ; WX 600 ; N zdotaccent ; B 99 0 593 620 ; C -1 ; WX 600 ; N Ecaron ; B 53 0 660 802 ; C -1 ; WX 600 ; N Iogonek ; B 96 -172 623 562 ; C -1 ; WX 600 ; N kcommaaccent ; B 58 -250 633 629 ; C -1 ; WX 600 ; N minus ; B 129 232 580 283 ; C -1 ; WX 600 ; N Icircumflex ; B 96 0 623 787 ; C -1 ; WX 600 ; N ncaron ; B 26 0 614 669 ; C -1 ; WX 600 ; N tcommaaccent ; B 165 -250 561 561 ; C -1 ; WX 600 ; N logicalnot ; B 155 108 591 369 ; C -1 ; WX 600 ; N odieresis ; B 102 -15 588 620 ; C -1 ; WX 600 ; N udieresis ; B 101 -15 575 620 ; C -1 ; WX 600 ; N notequal ; B 43 -16 621 529 ; C -1 ; WX 600 ; N gcommaaccent ; B 61 -157 657 708 ; C -1 ; WX 600 ; N eth ; B 102 -15 639 629 ; C -1 ; WX 600 ; N zcaron ; B 99 0 624 669 ; C -1 ; WX 600 ; N ncommaaccent ; B 26 -250 585 441 ; C -1 ; WX 600 ; N onesuperior ; B 231 249 491 622 ; C -1 ; WX 600 ; N imacron ; B 95 0 543 565 ; C -1 ; WX 600 ; N Euro ; B 0 0 0 0 ; EndCharMetrics EndFontMetrics ruby-prawn-2.1.0.orig/data/fonts/MustRead.html0000644000000000000000000000165112665203156017742 0ustar rootroot Core 14 AFM Files - ReadMe or
This file and the 14 PostScript(R) AFM files it accompanies may be used, copied, and distributed for any purpose and without charge, with or without modification, provided that all copyright notices are retained; that the AFM files are not distributed without this file; that all modifications to this file or any of the AFM files are prominently noted in the modified file(s); and that this paragraph is not modified. Adobe Systems has no responsibility or obligation to support the use of the AFM files. Col
ruby-prawn-2.1.0.orig/data/fonts/Times-Bold.afm0000644000000000000000000017537312665203156017771 0ustar rootrootStartFontMetrics 4.1 Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. Comment Creation Date: Thu May 1 12:52:56 1997 Comment UniqueID 43065 Comment VMusage 41636 52661 FontName Times-Bold FullName Times Bold FamilyName Times Weight Bold ItalicAngle 0 IsFixedPitch false CharacterSet ExtendedRoman FontBBox -168 -218 1000 935 UnderlinePosition -100 UnderlineThickness 50 Version 002.000 Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries. EncodingScheme AdobeStandardEncoding CapHeight 676 XHeight 461 Ascender 683 Descender -217 StdHW 44 StdVW 139 StartCharMetrics 315 C 32 ; WX 250 ; N space ; B 0 0 0 0 ; C 33 ; WX 333 ; N exclam ; B 81 -13 251 691 ; C 34 ; WX 555 ; N quotedbl ; B 83 404 472 691 ; C 35 ; WX 500 ; N numbersign ; B 4 0 496 700 ; C 36 ; WX 500 ; N dollar ; B 29 -99 472 750 ; C 37 ; WX 1000 ; N percent ; B 124 -14 877 692 ; C 38 ; WX 833 ; N ampersand ; B 62 -16 787 691 ; C 39 ; WX 333 ; N quoteright ; B 79 356 263 691 ; C 40 ; WX 333 ; N parenleft ; B 46 -168 306 694 ; C 41 ; WX 333 ; N parenright ; B 27 -168 287 694 ; C 42 ; WX 500 ; N asterisk ; B 56 255 447 691 ; C 43 ; WX 570 ; N plus ; B 33 0 537 506 ; C 44 ; WX 250 ; N comma ; B 39 -180 223 155 ; C 45 ; WX 333 ; N hyphen ; B 44 171 287 287 ; C 46 ; WX 250 ; N period ; B 41 -13 210 156 ; C 47 ; WX 278 ; N slash ; B -24 -19 302 691 ; C 48 ; WX 500 ; N zero ; B 24 -13 476 688 ; C 49 ; WX 500 ; N one ; B 65 0 442 688 ; C 50 ; WX 500 ; N two ; B 17 0 478 688 ; C 51 ; WX 500 ; N three ; B 16 -14 468 688 ; C 52 ; WX 500 ; N four ; B 19 0 475 688 ; C 53 ; WX 500 ; N five ; B 22 -8 470 676 ; C 54 ; WX 500 ; N six ; B 28 -13 475 688 ; C 55 ; WX 500 ; N seven ; B 17 0 477 676 ; C 56 ; WX 500 ; N eight ; B 28 -13 472 688 ; C 57 ; WX 500 ; N nine ; B 26 -13 473 688 ; C 58 ; WX 333 ; N colon ; B 82 -13 251 472 ; C 59 ; WX 333 ; N semicolon ; B 82 -180 266 472 ; C 60 ; WX 570 ; N less ; B 31 -8 539 514 ; C 61 ; WX 570 ; N equal ; B 33 107 537 399 ; C 62 ; WX 570 ; N greater ; B 31 -8 539 514 ; C 63 ; WX 500 ; N question ; B 57 -13 445 689 ; C 64 ; WX 930 ; N at ; B 108 -19 822 691 ; C 65 ; WX 722 ; N A ; B 9 0 689 690 ; C 66 ; WX 667 ; N B ; B 16 0 619 676 ; C 67 ; WX 722 ; N C ; B 49 -19 687 691 ; C 68 ; WX 722 ; N D ; B 14 0 690 676 ; C 69 ; WX 667 ; N E ; B 16 0 641 676 ; C 70 ; WX 611 ; N F ; B 16 0 583 676 ; C 71 ; WX 778 ; N G ; B 37 -19 755 691 ; C 72 ; WX 778 ; N H ; B 21 0 759 676 ; C 73 ; WX 389 ; N I ; B 20 0 370 676 ; C 74 ; WX 500 ; N J ; B 3 -96 479 676 ; C 75 ; WX 778 ; N K ; B 30 0 769 676 ; C 76 ; WX 667 ; N L ; B 19 0 638 676 ; C 77 ; WX 944 ; N M ; B 14 0 921 676 ; C 78 ; WX 722 ; N N ; B 16 -18 701 676 ; C 79 ; WX 778 ; N O ; B 35 -19 743 691 ; C 80 ; WX 611 ; N P ; B 16 0 600 676 ; C 81 ; WX 778 ; N Q ; B 35 -176 743 691 ; C 82 ; WX 722 ; N R ; B 26 0 715 676 ; C 83 ; WX 556 ; N S ; B 35 -19 513 692 ; C 84 ; WX 667 ; N T ; B 31 0 636 676 ; C 85 ; WX 722 ; N U ; B 16 -19 701 676 ; C 86 ; WX 722 ; N V ; B 16 -18 701 676 ; C 87 ; WX 1000 ; N W ; B 19 -15 981 676 ; C 88 ; WX 722 ; N X ; B 16 0 699 676 ; C 89 ; WX 722 ; N Y ; B 15 0 699 676 ; C 90 ; WX 667 ; N Z ; B 28 0 634 676 ; C 91 ; WX 333 ; N bracketleft ; B 67 -149 301 678 ; C 92 ; WX 278 ; N backslash ; B -25 -19 303 691 ; C 93 ; WX 333 ; N bracketright ; B 32 -149 266 678 ; C 94 ; WX 581 ; N asciicircum ; B 73 311 509 676 ; C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; C 96 ; WX 333 ; N quoteleft ; B 70 356 254 691 ; C 97 ; WX 500 ; N a ; B 25 -14 488 473 ; C 98 ; WX 556 ; N b ; B 17 -14 521 676 ; C 99 ; WX 444 ; N c ; B 25 -14 430 473 ; C 100 ; WX 556 ; N d ; B 25 -14 534 676 ; C 101 ; WX 444 ; N e ; B 25 -14 426 473 ; C 102 ; WX 333 ; N f ; B 14 0 389 691 ; L i fi ; L l fl ; C 103 ; WX 500 ; N g ; B 28 -206 483 473 ; C 104 ; WX 556 ; N h ; B 16 0 534 676 ; C 105 ; WX 278 ; N i ; B 16 0 255 691 ; C 106 ; WX 333 ; N j ; B -57 -203 263 691 ; C 107 ; WX 556 ; N k ; B 22 0 543 676 ; C 108 ; WX 278 ; N l ; B 16 0 255 676 ; C 109 ; WX 833 ; N m ; B 16 0 814 473 ; C 110 ; WX 556 ; N n ; B 21 0 539 473 ; C 111 ; WX 500 ; N o ; B 25 -14 476 473 ; C 112 ; WX 556 ; N p ; B 19 -205 524 473 ; C 113 ; WX 556 ; N q ; B 34 -205 536 473 ; C 114 ; WX 444 ; N r ; B 29 0 434 473 ; C 115 ; WX 389 ; N s ; B 25 -14 361 473 ; C 116 ; WX 333 ; N t ; B 20 -12 332 630 ; C 117 ; WX 556 ; N u ; B 16 -14 537 461 ; C 118 ; WX 500 ; N v ; B 21 -14 485 461 ; C 119 ; WX 722 ; N w ; B 23 -14 707 461 ; C 120 ; WX 500 ; N x ; B 12 0 484 461 ; C 121 ; WX 500 ; N y ; B 16 -205 480 461 ; C 122 ; WX 444 ; N z ; B 21 0 420 461 ; C 123 ; WX 394 ; N braceleft ; B 22 -175 340 698 ; C 124 ; WX 220 ; N bar ; B 66 -218 154 782 ; C 125 ; WX 394 ; N braceright ; B 54 -175 372 698 ; C 126 ; WX 520 ; N asciitilde ; B 29 173 491 333 ; C 161 ; WX 333 ; N exclamdown ; B 82 -203 252 501 ; C 162 ; WX 500 ; N cent ; B 53 -140 458 588 ; C 163 ; WX 500 ; N sterling ; B 21 -14 477 684 ; C 164 ; WX 167 ; N fraction ; B -168 -12 329 688 ; C 165 ; WX 500 ; N yen ; B -64 0 547 676 ; C 166 ; WX 500 ; N florin ; B 0 -155 498 706 ; C 167 ; WX 500 ; N section ; B 57 -132 443 691 ; C 168 ; WX 500 ; N currency ; B -26 61 526 613 ; C 169 ; WX 278 ; N quotesingle ; B 75 404 204 691 ; C 170 ; WX 500 ; N quotedblleft ; B 32 356 486 691 ; C 171 ; WX 500 ; N guillemotleft ; B 23 36 473 415 ; C 172 ; WX 333 ; N guilsinglleft ; B 51 36 305 415 ; C 173 ; WX 333 ; N guilsinglright ; B 28 36 282 415 ; C 174 ; WX 556 ; N fi ; B 14 0 536 691 ; C 175 ; WX 556 ; N fl ; B 14 0 536 691 ; C 177 ; WX 500 ; N endash ; B 0 181 500 271 ; C 178 ; WX 500 ; N dagger ; B 47 -134 453 691 ; C 179 ; WX 500 ; N daggerdbl ; B 45 -132 456 691 ; C 180 ; WX 250 ; N periodcentered ; B 41 248 210 417 ; C 182 ; WX 540 ; N paragraph ; B 0 -186 519 676 ; C 183 ; WX 350 ; N bullet ; B 35 198 315 478 ; C 184 ; WX 333 ; N quotesinglbase ; B 79 -180 263 155 ; C 185 ; WX 500 ; N quotedblbase ; B 14 -180 468 155 ; C 186 ; WX 500 ; N quotedblright ; B 14 356 468 691 ; C 187 ; WX 500 ; N guillemotright ; B 27 36 477 415 ; C 188 ; WX 1000 ; N ellipsis ; B 82 -13 917 156 ; C 189 ; WX 1000 ; N perthousand ; B 7 -29 995 706 ; C 191 ; WX 500 ; N questiondown ; B 55 -201 443 501 ; C 193 ; WX 333 ; N grave ; B 8 528 246 713 ; C 194 ; WX 333 ; N acute ; B 86 528 324 713 ; C 195 ; WX 333 ; N circumflex ; B -2 528 335 704 ; C 196 ; WX 333 ; N tilde ; B -16 547 349 674 ; C 197 ; WX 333 ; N macron ; B 1 565 331 637 ; C 198 ; WX 333 ; N breve ; B 15 528 318 691 ; C 199 ; WX 333 ; N dotaccent ; B 103 536 258 691 ; C 200 ; WX 333 ; N dieresis ; B -2 537 335 667 ; C 202 ; WX 333 ; N ring ; B 60 527 273 740 ; C 203 ; WX 333 ; N cedilla ; B 68 -218 294 0 ; C 205 ; WX 333 ; N hungarumlaut ; B -13 528 425 713 ; C 206 ; WX 333 ; N ogonek ; B 90 -193 319 24 ; C 207 ; WX 333 ; N caron ; B -2 528 335 704 ; C 208 ; WX 1000 ; N emdash ; B 0 181 1000 271 ; C 225 ; WX 1000 ; N AE ; B 4 0 951 676 ; C 227 ; WX 300 ; N ordfeminine ; B -1 397 301 688 ; C 232 ; WX 667 ; N Lslash ; B 19 0 638 676 ; C 233 ; WX 778 ; N Oslash ; B 35 -74 743 737 ; C 234 ; WX 1000 ; N OE ; B 22 -5 981 684 ; C 235 ; WX 330 ; N ordmasculine ; B 18 397 312 688 ; C 241 ; WX 722 ; N ae ; B 33 -14 693 473 ; C 245 ; WX 278 ; N dotlessi ; B 16 0 255 461 ; C 248 ; WX 278 ; N lslash ; B -22 0 303 676 ; C 249 ; WX 500 ; N oslash ; B 25 -92 476 549 ; C 250 ; WX 722 ; N oe ; B 22 -14 696 473 ; C 251 ; WX 556 ; N germandbls ; B 19 -12 517 691 ; C -1 ; WX 389 ; N Idieresis ; B 20 0 370 877 ; C -1 ; WX 444 ; N eacute ; B 25 -14 426 713 ; C -1 ; WX 500 ; N abreve ; B 25 -14 488 691 ; C -1 ; WX 556 ; N uhungarumlaut ; B 16 -14 557 713 ; C -1 ; WX 444 ; N ecaron ; B 25 -14 426 704 ; C -1 ; WX 722 ; N Ydieresis ; B 15 0 699 877 ; C -1 ; WX 570 ; N divide ; B 33 -31 537 537 ; C -1 ; WX 722 ; N Yacute ; B 15 0 699 923 ; C -1 ; WX 722 ; N Acircumflex ; B 9 0 689 914 ; C -1 ; WX 500 ; N aacute ; B 25 -14 488 713 ; C -1 ; WX 722 ; N Ucircumflex ; B 16 -19 701 914 ; C -1 ; WX 500 ; N yacute ; B 16 -205 480 713 ; C -1 ; WX 389 ; N scommaaccent ; B 25 -218 361 473 ; C -1 ; WX 444 ; N ecircumflex ; B 25 -14 426 704 ; C -1 ; WX 722 ; N Uring ; B 16 -19 701 935 ; C -1 ; WX 722 ; N Udieresis ; B 16 -19 701 877 ; C -1 ; WX 500 ; N aogonek ; B 25 -193 504 473 ; C -1 ; WX 722 ; N Uacute ; B 16 -19 701 923 ; C -1 ; WX 556 ; N uogonek ; B 16 -193 539 461 ; C -1 ; WX 667 ; N Edieresis ; B 16 0 641 877 ; C -1 ; WX 722 ; N Dcroat ; B 6 0 690 676 ; C -1 ; WX 250 ; N commaaccent ; B 47 -218 203 -50 ; C -1 ; WX 747 ; N copyright ; B 26 -19 721 691 ; C -1 ; WX 667 ; N Emacron ; B 16 0 641 847 ; C -1 ; WX 444 ; N ccaron ; B 25 -14 430 704 ; C -1 ; WX 500 ; N aring ; B 25 -14 488 740 ; C -1 ; WX 722 ; N Ncommaaccent ; B 16 -188 701 676 ; C -1 ; WX 278 ; N lacute ; B 16 0 297 923 ; C -1 ; WX 500 ; N agrave ; B 25 -14 488 713 ; C -1 ; WX 667 ; N Tcommaaccent ; B 31 -218 636 676 ; C -1 ; WX 722 ; N Cacute ; B 49 -19 687 923 ; C -1 ; WX 500 ; N atilde ; B 25 -14 488 674 ; C -1 ; WX 667 ; N Edotaccent ; B 16 0 641 901 ; C -1 ; WX 389 ; N scaron ; B 25 -14 363 704 ; C -1 ; WX 389 ; N scedilla ; B 25 -218 361 473 ; C -1 ; WX 278 ; N iacute ; B 16 0 289 713 ; C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ; C -1 ; WX 722 ; N Rcaron ; B 26 0 715 914 ; C -1 ; WX 778 ; N Gcommaaccent ; B 37 -218 755 691 ; C -1 ; WX 556 ; N ucircumflex ; B 16 -14 537 704 ; C -1 ; WX 500 ; N acircumflex ; B 25 -14 488 704 ; C -1 ; WX 722 ; N Amacron ; B 9 0 689 847 ; C -1 ; WX 444 ; N rcaron ; B 29 0 434 704 ; C -1 ; WX 444 ; N ccedilla ; B 25 -218 430 473 ; C -1 ; WX 667 ; N Zdotaccent ; B 28 0 634 901 ; C -1 ; WX 611 ; N Thorn ; B 16 0 600 676 ; C -1 ; WX 778 ; N Omacron ; B 35 -19 743 847 ; C -1 ; WX 722 ; N Racute ; B 26 0 715 923 ; C -1 ; WX 556 ; N Sacute ; B 35 -19 513 923 ; C -1 ; WX 672 ; N dcaron ; B 25 -14 681 682 ; C -1 ; WX 722 ; N Umacron ; B 16 -19 701 847 ; C -1 ; WX 556 ; N uring ; B 16 -14 537 740 ; C -1 ; WX 300 ; N threesuperior ; B 3 268 297 688 ; C -1 ; WX 778 ; N Ograve ; B 35 -19 743 923 ; C -1 ; WX 722 ; N Agrave ; B 9 0 689 923 ; C -1 ; WX 722 ; N Abreve ; B 9 0 689 901 ; C -1 ; WX 570 ; N multiply ; B 48 16 522 490 ; C -1 ; WX 556 ; N uacute ; B 16 -14 537 713 ; C -1 ; WX 667 ; N Tcaron ; B 31 0 636 914 ; C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ; C -1 ; WX 500 ; N ydieresis ; B 16 -205 480 667 ; C -1 ; WX 722 ; N Nacute ; B 16 -18 701 923 ; C -1 ; WX 278 ; N icircumflex ; B -37 0 300 704 ; C -1 ; WX 667 ; N Ecircumflex ; B 16 0 641 914 ; C -1 ; WX 500 ; N adieresis ; B 25 -14 488 667 ; C -1 ; WX 444 ; N edieresis ; B 25 -14 426 667 ; C -1 ; WX 444 ; N cacute ; B 25 -14 430 713 ; C -1 ; WX 556 ; N nacute ; B 21 0 539 713 ; C -1 ; WX 556 ; N umacron ; B 16 -14 537 637 ; C -1 ; WX 722 ; N Ncaron ; B 16 -18 701 914 ; C -1 ; WX 389 ; N Iacute ; B 20 0 370 923 ; C -1 ; WX 570 ; N plusminus ; B 33 0 537 506 ; C -1 ; WX 220 ; N brokenbar ; B 66 -143 154 707 ; C -1 ; WX 747 ; N registered ; B 26 -19 721 691 ; C -1 ; WX 778 ; N Gbreve ; B 37 -19 755 901 ; C -1 ; WX 389 ; N Idotaccent ; B 20 0 370 901 ; C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ; C -1 ; WX 667 ; N Egrave ; B 16 0 641 923 ; C -1 ; WX 444 ; N racute ; B 29 0 434 713 ; C -1 ; WX 500 ; N omacron ; B 25 -14 476 637 ; C -1 ; WX 667 ; N Zacute ; B 28 0 634 923 ; C -1 ; WX 667 ; N Zcaron ; B 28 0 634 914 ; C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ; C -1 ; WX 722 ; N Eth ; B 6 0 690 676 ; C -1 ; WX 722 ; N Ccedilla ; B 49 -218 687 691 ; C -1 ; WX 278 ; N lcommaaccent ; B 16 -218 255 676 ; C -1 ; WX 416 ; N tcaron ; B 20 -12 425 815 ; C -1 ; WX 444 ; N eogonek ; B 25 -193 426 473 ; C -1 ; WX 722 ; N Uogonek ; B 16 -193 701 676 ; C -1 ; WX 722 ; N Aacute ; B 9 0 689 923 ; C -1 ; WX 722 ; N Adieresis ; B 9 0 689 877 ; C -1 ; WX 444 ; N egrave ; B 25 -14 426 713 ; C -1 ; WX 444 ; N zacute ; B 21 0 420 713 ; C -1 ; WX 278 ; N iogonek ; B 16 -193 274 691 ; C -1 ; WX 778 ; N Oacute ; B 35 -19 743 923 ; C -1 ; WX 500 ; N oacute ; B 25 -14 476 713 ; C -1 ; WX 500 ; N amacron ; B 25 -14 488 637 ; C -1 ; WX 389 ; N sacute ; B 25 -14 361 713 ; C -1 ; WX 278 ; N idieresis ; B -37 0 300 667 ; C -1 ; WX 778 ; N Ocircumflex ; B 35 -19 743 914 ; C -1 ; WX 722 ; N Ugrave ; B 16 -19 701 923 ; C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; C -1 ; WX 556 ; N thorn ; B 19 -205 524 676 ; C -1 ; WX 300 ; N twosuperior ; B 0 275 300 688 ; C -1 ; WX 778 ; N Odieresis ; B 35 -19 743 877 ; C -1 ; WX 556 ; N mu ; B 33 -206 536 461 ; C -1 ; WX 278 ; N igrave ; B -27 0 255 713 ; C -1 ; WX 500 ; N ohungarumlaut ; B 25 -14 529 713 ; C -1 ; WX 667 ; N Eogonek ; B 16 -193 644 676 ; C -1 ; WX 556 ; N dcroat ; B 25 -14 534 676 ; C -1 ; WX 750 ; N threequarters ; B 23 -12 733 688 ; C -1 ; WX 556 ; N Scedilla ; B 35 -218 513 692 ; C -1 ; WX 394 ; N lcaron ; B 16 0 412 682 ; C -1 ; WX 778 ; N Kcommaaccent ; B 30 -218 769 676 ; C -1 ; WX 667 ; N Lacute ; B 19 0 638 923 ; C -1 ; WX 1000 ; N trademark ; B 24 271 977 676 ; C -1 ; WX 444 ; N edotaccent ; B 25 -14 426 691 ; C -1 ; WX 389 ; N Igrave ; B 20 0 370 923 ; C -1 ; WX 389 ; N Imacron ; B 20 0 370 847 ; C -1 ; WX 667 ; N Lcaron ; B 19 0 652 682 ; C -1 ; WX 750 ; N onehalf ; B -7 -12 775 688 ; C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ; C -1 ; WX 500 ; N ocircumflex ; B 25 -14 476 704 ; C -1 ; WX 556 ; N ntilde ; B 21 0 539 674 ; C -1 ; WX 722 ; N Uhungarumlaut ; B 16 -19 701 923 ; C -1 ; WX 667 ; N Eacute ; B 16 0 641 923 ; C -1 ; WX 444 ; N emacron ; B 25 -14 426 637 ; C -1 ; WX 500 ; N gbreve ; B 28 -206 483 691 ; C -1 ; WX 750 ; N onequarter ; B 28 -12 743 688 ; C -1 ; WX 556 ; N Scaron ; B 35 -19 513 914 ; C -1 ; WX 556 ; N Scommaaccent ; B 35 -218 513 692 ; C -1 ; WX 778 ; N Ohungarumlaut ; B 35 -19 743 923 ; C -1 ; WX 400 ; N degree ; B 57 402 343 688 ; C -1 ; WX 500 ; N ograve ; B 25 -14 476 713 ; C -1 ; WX 722 ; N Ccaron ; B 49 -19 687 914 ; C -1 ; WX 556 ; N ugrave ; B 16 -14 537 713 ; C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ; C -1 ; WX 722 ; N Dcaron ; B 14 0 690 914 ; C -1 ; WX 444 ; N rcommaaccent ; B 29 -218 434 473 ; C -1 ; WX 722 ; N Ntilde ; B 16 -18 701 884 ; C -1 ; WX 500 ; N otilde ; B 25 -14 476 674 ; C -1 ; WX 722 ; N Rcommaaccent ; B 26 -218 715 676 ; C -1 ; WX 667 ; N Lcommaaccent ; B 19 -218 638 676 ; C -1 ; WX 722 ; N Atilde ; B 9 0 689 884 ; C -1 ; WX 722 ; N Aogonek ; B 9 -193 699 690 ; C -1 ; WX 722 ; N Aring ; B 9 0 689 935 ; C -1 ; WX 778 ; N Otilde ; B 35 -19 743 884 ; C -1 ; WX 444 ; N zdotaccent ; B 21 0 420 691 ; C -1 ; WX 667 ; N Ecaron ; B 16 0 641 914 ; C -1 ; WX 389 ; N Iogonek ; B 20 -193 370 676 ; C -1 ; WX 556 ; N kcommaaccent ; B 22 -218 543 676 ; C -1 ; WX 570 ; N minus ; B 33 209 537 297 ; C -1 ; WX 389 ; N Icircumflex ; B 20 0 370 914 ; C -1 ; WX 556 ; N ncaron ; B 21 0 539 704 ; C -1 ; WX 333 ; N tcommaaccent ; B 20 -218 332 630 ; C -1 ; WX 570 ; N logicalnot ; B 33 108 537 399 ; C -1 ; WX 500 ; N odieresis ; B 25 -14 476 667 ; C -1 ; WX 556 ; N udieresis ; B 16 -14 537 667 ; C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ; C -1 ; WX 500 ; N gcommaaccent ; B 28 -206 483 829 ; C -1 ; WX 500 ; N eth ; B 25 -14 476 691 ; C -1 ; WX 444 ; N zcaron ; B 21 0 420 704 ; C -1 ; WX 556 ; N ncommaaccent ; B 21 -218 539 473 ; C -1 ; WX 300 ; N onesuperior ; B 28 275 273 688 ; C -1 ; WX 278 ; N imacron ; B -8 0 272 637 ; C -1 ; WX 500 ; N Euro ; B 0 0 0 0 ; EndCharMetrics StartKernData StartKernPairs 2242 KPX A C -55 KPX A Cacute -55 KPX A Ccaron -55 KPX A Ccedilla -55 KPX A G -55 KPX A Gbreve -55 KPX A Gcommaaccent -55 KPX A O -45 KPX A Oacute -45 KPX A Ocircumflex -45 KPX A Odieresis -45 KPX A Ograve -45 KPX A Ohungarumlaut -45 KPX A Omacron -45 KPX A Oslash -45 KPX A Otilde -45 KPX A Q -45 KPX A T -95 KPX A Tcaron -95 KPX A Tcommaaccent -95 KPX A U -50 KPX A Uacute -50 KPX A Ucircumflex -50 KPX A Udieresis -50 KPX A Ugrave -50 KPX A Uhungarumlaut -50 KPX A Umacron -50 KPX A Uogonek -50 KPX A Uring -50 KPX A V -145 KPX A W -130 KPX A Y -100 KPX A Yacute -100 KPX A Ydieresis -100 KPX A p -25 KPX A quoteright -74 KPX A u -50 KPX A uacute -50 KPX A ucircumflex -50 KPX A udieresis -50 KPX A ugrave -50 KPX A uhungarumlaut -50 KPX A umacron -50 KPX A uogonek -50 KPX A uring -50 KPX A v -100 KPX A w -90 KPX A y -74 KPX A yacute -74 KPX A ydieresis -74 KPX Aacute C -55 KPX Aacute Cacute -55 KPX Aacute Ccaron -55 KPX Aacute Ccedilla -55 KPX Aacute G -55 KPX Aacute Gbreve -55 KPX Aacute Gcommaaccent -55 KPX Aacute O -45 KPX Aacute Oacute -45 KPX Aacute Ocircumflex -45 KPX Aacute Odieresis -45 KPX Aacute Ograve -45 KPX Aacute Ohungarumlaut -45 KPX Aacute Omacron -45 KPX Aacute Oslash -45 KPX Aacute Otilde -45 KPX Aacute Q -45 KPX Aacute T -95 KPX Aacute Tcaron -95 KPX Aacute Tcommaaccent -95 KPX Aacute U -50 KPX Aacute Uacute -50 KPX Aacute Ucircumflex -50 KPX Aacute Udieresis -50 KPX Aacute Ugrave -50 KPX Aacute Uhungarumlaut -50 KPX Aacute Umacron -50 KPX Aacute Uogonek -50 KPX Aacute Uring -50 KPX Aacute V -145 KPX Aacute W -130 KPX Aacute Y -100 KPX Aacute Yacute -100 KPX Aacute Ydieresis -100 KPX Aacute p -25 KPX Aacute quoteright -74 KPX Aacute u -50 KPX Aacute uacute -50 KPX Aacute ucircumflex -50 KPX Aacute udieresis -50 KPX Aacute ugrave -50 KPX Aacute uhungarumlaut -50 KPX Aacute umacron -50 KPX Aacute uogonek -50 KPX Aacute uring -50 KPX Aacute v -100 KPX Aacute w -90 KPX Aacute y -74 KPX Aacute yacute -74 KPX Aacute ydieresis -74 KPX Abreve C -55 KPX Abreve Cacute -55 KPX Abreve Ccaron -55 KPX Abreve Ccedilla -55 KPX Abreve G -55 KPX Abreve Gbreve -55 KPX Abreve Gcommaaccent -55 KPX Abreve O -45 KPX Abreve Oacute -45 KPX Abreve Ocircumflex -45 KPX Abreve Odieresis -45 KPX Abreve Ograve -45 KPX Abreve Ohungarumlaut -45 KPX Abreve Omacron -45 KPX Abreve Oslash -45 KPX Abreve Otilde -45 KPX Abreve Q -45 KPX Abreve T -95 KPX Abreve Tcaron -95 KPX Abreve Tcommaaccent -95 KPX Abreve U -50 KPX Abreve Uacute -50 KPX Abreve Ucircumflex -50 KPX Abreve Udieresis -50 KPX Abreve Ugrave -50 KPX Abreve Uhungarumlaut -50 KPX Abreve Umacron -50 KPX Abreve Uogonek -50 KPX Abreve Uring -50 KPX Abreve V -145 KPX Abreve W -130 KPX Abreve Y -100 KPX Abreve Yacute -100 KPX Abreve Ydieresis -100 KPX Abreve p -25 KPX Abreve quoteright -74 KPX Abreve u -50 KPX Abreve uacute -50 KPX Abreve ucircumflex -50 KPX Abreve udieresis -50 KPX Abreve ugrave -50 KPX Abreve uhungarumlaut -50 KPX Abreve umacron -50 KPX Abreve uogonek -50 KPX Abreve uring -50 KPX Abreve v -100 KPX Abreve w -90 KPX Abreve y -74 KPX Abreve yacute -74 KPX Abreve ydieresis -74 KPX Acircumflex C -55 KPX Acircumflex Cacute -55 KPX Acircumflex Ccaron -55 KPX Acircumflex Ccedilla -55 KPX Acircumflex G -55 KPX Acircumflex Gbreve -55 KPX Acircumflex Gcommaaccent -55 KPX Acircumflex O -45 KPX Acircumflex Oacute -45 KPX Acircumflex Ocircumflex -45 KPX Acircumflex Odieresis -45 KPX Acircumflex Ograve -45 KPX Acircumflex Ohungarumlaut -45 KPX Acircumflex Omacron -45 KPX Acircumflex Oslash -45 KPX Acircumflex Otilde -45 KPX Acircumflex Q -45 KPX Acircumflex T -95 KPX Acircumflex Tcaron -95 KPX Acircumflex Tcommaaccent -95 KPX Acircumflex U -50 KPX Acircumflex Uacute -50 KPX Acircumflex Ucircumflex -50 KPX Acircumflex Udieresis -50 KPX Acircumflex Ugrave -50 KPX Acircumflex Uhungarumlaut -50 KPX Acircumflex Umacron -50 KPX Acircumflex Uogonek -50 KPX Acircumflex Uring -50 KPX Acircumflex V -145 KPX Acircumflex W -130 KPX Acircumflex Y -100 KPX Acircumflex Yacute -100 KPX Acircumflex Ydieresis -100 KPX Acircumflex p -25 KPX Acircumflex quoteright -74 KPX Acircumflex u -50 KPX Acircumflex uacute -50 KPX Acircumflex ucircumflex -50 KPX Acircumflex udieresis -50 KPX Acircumflex ugrave -50 KPX Acircumflex uhungarumlaut -50 KPX Acircumflex umacron -50 KPX Acircumflex uogonek -50 KPX Acircumflex uring -50 KPX Acircumflex v -100 KPX Acircumflex w -90 KPX Acircumflex y -74 KPX Acircumflex yacute -74 KPX Acircumflex ydieresis -74 KPX Adieresis C -55 KPX Adieresis Cacute -55 KPX Adieresis Ccaron -55 KPX Adieresis Ccedilla -55 KPX Adieresis G -55 KPX Adieresis Gbreve -55 KPX Adieresis Gcommaaccent -55 KPX Adieresis O -45 KPX Adieresis Oacute -45 KPX Adieresis Ocircumflex -45 KPX Adieresis Odieresis -45 KPX Adieresis Ograve -45 KPX Adieresis Ohungarumlaut -45 KPX Adieresis Omacron -45 KPX Adieresis Oslash -45 KPX Adieresis Otilde -45 KPX Adieresis Q -45 KPX Adieresis T -95 KPX Adieresis Tcaron -95 KPX Adieresis Tcommaaccent -95 KPX Adieresis U -50 KPX Adieresis Uacute -50 KPX Adieresis Ucircumflex -50 KPX Adieresis Udieresis -50 KPX Adieresis Ugrave -50 KPX Adieresis Uhungarumlaut -50 KPX Adieresis Umacron -50 KPX Adieresis Uogonek -50 KPX Adieresis Uring -50 KPX Adieresis V -145 KPX Adieresis W -130 KPX Adieresis Y -100 KPX Adieresis Yacute -100 KPX Adieresis Ydieresis -100 KPX Adieresis p -25 KPX Adieresis quoteright -74 KPX Adieresis u -50 KPX Adieresis uacute -50 KPX Adieresis ucircumflex -50 KPX Adieresis udieresis -50 KPX Adieresis ugrave -50 KPX Adieresis uhungarumlaut -50 KPX Adieresis umacron -50 KPX Adieresis uogonek -50 KPX Adieresis uring -50 KPX Adieresis v -100 KPX Adieresis w -90 KPX Adieresis y -74 KPX Adieresis yacute -74 KPX Adieresis ydieresis -74 KPX Agrave C -55 KPX Agrave Cacute -55 KPX Agrave Ccaron -55 KPX Agrave Ccedilla -55 KPX Agrave G -55 KPX Agrave Gbreve -55 KPX Agrave Gcommaaccent -55 KPX Agrave O -45 KPX Agrave Oacute -45 KPX Agrave Ocircumflex -45 KPX Agrave Odieresis -45 KPX Agrave Ograve -45 KPX Agrave Ohungarumlaut -45 KPX Agrave Omacron -45 KPX Agrave Oslash -45 KPX Agrave Otilde -45 KPX Agrave Q -45 KPX Agrave T -95 KPX Agrave Tcaron -95 KPX Agrave Tcommaaccent -95 KPX Agrave U -50 KPX Agrave Uacute -50 KPX Agrave Ucircumflex -50 KPX Agrave Udieresis -50 KPX Agrave Ugrave -50 KPX Agrave Uhungarumlaut -50 KPX Agrave Umacron -50 KPX Agrave Uogonek -50 KPX Agrave Uring -50 KPX Agrave V -145 KPX Agrave W -130 KPX Agrave Y -100 KPX Agrave Yacute -100 KPX Agrave Ydieresis -100 KPX Agrave p -25 KPX Agrave quoteright -74 KPX Agrave u -50 KPX Agrave uacute -50 KPX Agrave ucircumflex -50 KPX Agrave udieresis -50 KPX Agrave ugrave -50 KPX Agrave uhungarumlaut -50 KPX Agrave umacron -50 KPX Agrave uogonek -50 KPX Agrave uring -50 KPX Agrave v -100 KPX Agrave w -90 KPX Agrave y -74 KPX Agrave yacute -74 KPX Agrave ydieresis -74 KPX Amacron C -55 KPX Amacron Cacute -55 KPX Amacron Ccaron -55 KPX Amacron Ccedilla -55 KPX Amacron G -55 KPX Amacron Gbreve -55 KPX Amacron Gcommaaccent -55 KPX Amacron O -45 KPX Amacron Oacute -45 KPX Amacron Ocircumflex -45 KPX Amacron Odieresis -45 KPX Amacron Ograve -45 KPX Amacron Ohungarumlaut -45 KPX Amacron Omacron -45 KPX Amacron Oslash -45 KPX Amacron Otilde -45 KPX Amacron Q -45 KPX Amacron T -95 KPX Amacron Tcaron -95 KPX Amacron Tcommaaccent -95 KPX Amacron U -50 KPX Amacron Uacute -50 KPX Amacron Ucircumflex -50 KPX Amacron Udieresis -50 KPX Amacron Ugrave -50 KPX Amacron Uhungarumlaut -50 KPX Amacron Umacron -50 KPX Amacron Uogonek -50 KPX Amacron Uring -50 KPX Amacron V -145 KPX Amacron W -130 KPX Amacron Y -100 KPX Amacron Yacute -100 KPX Amacron Ydieresis -100 KPX Amacron p -25 KPX Amacron quoteright -74 KPX Amacron u -50 KPX Amacron uacute -50 KPX Amacron ucircumflex -50 KPX Amacron udieresis -50 KPX Amacron ugrave -50 KPX Amacron uhungarumlaut -50 KPX Amacron umacron -50 KPX Amacron uogonek -50 KPX Amacron uring -50 KPX Amacron v -100 KPX Amacron w -90 KPX Amacron y -74 KPX Amacron yacute -74 KPX Amacron ydieresis -74 KPX Aogonek C -55 KPX Aogonek Cacute -55 KPX Aogonek Ccaron -55 KPX Aogonek Ccedilla -55 KPX Aogonek G -55 KPX Aogonek Gbreve -55 KPX Aogonek Gcommaaccent -55 KPX Aogonek O -45 KPX Aogonek Oacute -45 KPX Aogonek Ocircumflex -45 KPX Aogonek Odieresis -45 KPX Aogonek Ograve -45 KPX Aogonek Ohungarumlaut -45 KPX Aogonek Omacron -45 KPX Aogonek Oslash -45 KPX Aogonek Otilde -45 KPX Aogonek Q -45 KPX Aogonek T -95 KPX Aogonek Tcaron -95 KPX Aogonek Tcommaaccent -95 KPX Aogonek U -50 KPX Aogonek Uacute -50 KPX Aogonek Ucircumflex -50 KPX Aogonek Udieresis -50 KPX Aogonek Ugrave -50 KPX Aogonek Uhungarumlaut -50 KPX Aogonek Umacron -50 KPX Aogonek Uogonek -50 KPX Aogonek Uring -50 KPX Aogonek V -145 KPX Aogonek W -130 KPX Aogonek Y -100 KPX Aogonek Yacute -100 KPX Aogonek Ydieresis -100 KPX Aogonek p -25 KPX Aogonek quoteright -74 KPX Aogonek u -50 KPX Aogonek uacute -50 KPX Aogonek ucircumflex -50 KPX Aogonek udieresis -50 KPX Aogonek ugrave -50 KPX Aogonek uhungarumlaut -50 KPX Aogonek umacron -50 KPX Aogonek uogonek -50 KPX Aogonek uring -50 KPX Aogonek v -100 KPX Aogonek w -90 KPX Aogonek y -34 KPX Aogonek yacute -34 KPX Aogonek ydieresis -34 KPX Aring C -55 KPX Aring Cacute -55 KPX Aring Ccaron -55 KPX Aring Ccedilla -55 KPX Aring G -55 KPX Aring Gbreve -55 KPX Aring Gcommaaccent -55 KPX Aring O -45 KPX Aring Oacute -45 KPX Aring Ocircumflex -45 KPX Aring Odieresis -45 KPX Aring Ograve -45 KPX Aring Ohungarumlaut -45 KPX Aring Omacron -45 KPX Aring Oslash -45 KPX Aring Otilde -45 KPX Aring Q -45 KPX Aring T -95 KPX Aring Tcaron -95 KPX Aring Tcommaaccent -95 KPX Aring U -50 KPX Aring Uacute -50 KPX Aring Ucircumflex -50 KPX Aring Udieresis -50 KPX Aring Ugrave -50 KPX Aring Uhungarumlaut -50 KPX Aring Umacron -50 KPX Aring Uogonek -50 KPX Aring Uring -50 KPX Aring V -145 KPX Aring W -130 KPX Aring Y -100 KPX Aring Yacute -100 KPX Aring Ydieresis -100 KPX Aring p -25 KPX Aring quoteright -74 KPX Aring u -50 KPX Aring uacute -50 KPX Aring ucircumflex -50 KPX Aring udieresis -50 KPX Aring ugrave -50 KPX Aring uhungarumlaut -50 KPX Aring umacron -50 KPX Aring uogonek -50 KPX Aring uring -50 KPX Aring v -100 KPX Aring w -90 KPX Aring y -74 KPX Aring yacute -74 KPX Aring ydieresis -74 KPX Atilde C -55 KPX Atilde Cacute -55 KPX Atilde Ccaron -55 KPX Atilde Ccedilla -55 KPX Atilde G -55 KPX Atilde Gbreve -55 KPX Atilde Gcommaaccent -55 KPX Atilde O -45 KPX Atilde Oacute -45 KPX Atilde Ocircumflex -45 KPX Atilde Odieresis -45 KPX Atilde Ograve -45 KPX Atilde Ohungarumlaut -45 KPX Atilde Omacron -45 KPX Atilde Oslash -45 KPX Atilde Otilde -45 KPX Atilde Q -45 KPX Atilde T -95 KPX Atilde Tcaron -95 KPX Atilde Tcommaaccent -95 KPX Atilde U -50 KPX Atilde Uacute -50 KPX Atilde Ucircumflex -50 KPX Atilde Udieresis -50 KPX Atilde Ugrave -50 KPX Atilde Uhungarumlaut -50 KPX Atilde Umacron -50 KPX Atilde Uogonek -50 KPX Atilde Uring -50 KPX Atilde V -145 KPX Atilde W -130 KPX Atilde Y -100 KPX Atilde Yacute -100 KPX Atilde Ydieresis -100 KPX Atilde p -25 KPX Atilde quoteright -74 KPX Atilde u -50 KPX Atilde uacute -50 KPX Atilde ucircumflex -50 KPX Atilde udieresis -50 KPX Atilde ugrave -50 KPX Atilde uhungarumlaut -50 KPX Atilde umacron -50 KPX Atilde uogonek -50 KPX Atilde uring -50 KPX Atilde v -100 KPX Atilde w -90 KPX Atilde y -74 KPX Atilde yacute -74 KPX Atilde ydieresis -74 KPX B A -30 KPX B Aacute -30 KPX B Abreve -30 KPX B Acircumflex -30 KPX B Adieresis -30 KPX B Agrave -30 KPX B Amacron -30 KPX B Aogonek -30 KPX B Aring -30 KPX B Atilde -30 KPX B U -10 KPX B Uacute -10 KPX B Ucircumflex -10 KPX B Udieresis -10 KPX B Ugrave -10 KPX B Uhungarumlaut -10 KPX B Umacron -10 KPX B Uogonek -10 KPX B Uring -10 KPX D A -35 KPX D Aacute -35 KPX D Abreve -35 KPX D Acircumflex -35 KPX D Adieresis -35 KPX D Agrave -35 KPX D Amacron -35 KPX D Aogonek -35 KPX D Aring -35 KPX D Atilde -35 KPX D V -40 KPX D W -40 KPX D Y -40 KPX D Yacute -40 KPX D Ydieresis -40 KPX D period -20 KPX Dcaron A -35 KPX Dcaron Aacute -35 KPX Dcaron Abreve -35 KPX Dcaron Acircumflex -35 KPX Dcaron Adieresis -35 KPX Dcaron Agrave -35 KPX Dcaron Amacron -35 KPX Dcaron Aogonek -35 KPX Dcaron Aring -35 KPX Dcaron Atilde -35 KPX Dcaron V -40 KPX Dcaron W -40 KPX Dcaron Y -40 KPX Dcaron Yacute -40 KPX Dcaron Ydieresis -40 KPX Dcaron period -20 KPX Dcroat A -35 KPX Dcroat Aacute -35 KPX Dcroat Abreve -35 KPX Dcroat Acircumflex -35 KPX Dcroat Adieresis -35 KPX Dcroat Agrave -35 KPX Dcroat Amacron -35 KPX Dcroat Aogonek -35 KPX Dcroat Aring -35 KPX Dcroat Atilde -35 KPX Dcroat V -40 KPX Dcroat W -40 KPX Dcroat Y -40 KPX Dcroat Yacute -40 KPX Dcroat Ydieresis -40 KPX Dcroat period -20 KPX F A -90 KPX F Aacute -90 KPX F Abreve -90 KPX F Acircumflex -90 KPX F Adieresis -90 KPX F Agrave -90 KPX F Amacron -90 KPX F Aogonek -90 KPX F Aring -90 KPX F Atilde -90 KPX F a -25 KPX F aacute -25 KPX F abreve -25 KPX F acircumflex -25 KPX F adieresis -25 KPX F agrave -25 KPX F amacron -25 KPX F aogonek -25 KPX F aring -25 KPX F atilde -25 KPX F comma -92 KPX F e -25 KPX F eacute -25 KPX F ecaron -25 KPX F ecircumflex -25 KPX F edieresis -25 KPX F edotaccent -25 KPX F egrave -25 KPX F emacron -25 KPX F eogonek -25 KPX F o -25 KPX F oacute -25 KPX F ocircumflex -25 KPX F odieresis -25 KPX F ograve -25 KPX F ohungarumlaut -25 KPX F omacron -25 KPX F oslash -25 KPX F otilde -25 KPX F period -110 KPX J A -30 KPX J Aacute -30 KPX J Abreve -30 KPX J Acircumflex -30 KPX J Adieresis -30 KPX J Agrave -30 KPX J Amacron -30 KPX J Aogonek -30 KPX J Aring -30 KPX J Atilde -30 KPX J a -15 KPX J aacute -15 KPX J abreve -15 KPX J acircumflex -15 KPX J adieresis -15 KPX J agrave -15 KPX J amacron -15 KPX J aogonek -15 KPX J aring -15 KPX J atilde -15 KPX J e -15 KPX J eacute -15 KPX J ecaron -15 KPX J ecircumflex -15 KPX J edieresis -15 KPX J edotaccent -15 KPX J egrave -15 KPX J emacron -15 KPX J eogonek -15 KPX J o -15 KPX J oacute -15 KPX J ocircumflex -15 KPX J odieresis -15 KPX J ograve -15 KPX J ohungarumlaut -15 KPX J omacron -15 KPX J oslash -15 KPX J otilde -15 KPX J period -20 KPX J u -15 KPX J uacute -15 KPX J ucircumflex -15 KPX J udieresis -15 KPX J ugrave -15 KPX J uhungarumlaut -15 KPX J umacron -15 KPX J uogonek -15 KPX J uring -15 KPX K O -30 KPX K Oacute -30 KPX K Ocircumflex -30 KPX K Odieresis -30 KPX K Ograve -30 KPX K Ohungarumlaut -30 KPX K Omacron -30 KPX K Oslash -30 KPX K Otilde -30 KPX K e -25 KPX K eacute -25 KPX K ecaron -25 KPX K ecircumflex -25 KPX K edieresis -25 KPX K edotaccent -25 KPX K egrave -25 KPX K emacron -25 KPX K eogonek -25 KPX K o -25 KPX K oacute -25 KPX K ocircumflex -25 KPX K odieresis -25 KPX K ograve -25 KPX K ohungarumlaut -25 KPX K omacron -25 KPX K oslash -25 KPX K otilde -25 KPX K u -15 KPX K uacute -15 KPX K ucircumflex -15 KPX K udieresis -15 KPX K ugrave -15 KPX K uhungarumlaut -15 KPX K umacron -15 KPX K uogonek -15 KPX K uring -15 KPX K y -45 KPX K yacute -45 KPX K ydieresis -45 KPX Kcommaaccent O -30 KPX Kcommaaccent Oacute -30 KPX Kcommaaccent Ocircumflex -30 KPX Kcommaaccent Odieresis -30 KPX Kcommaaccent Ograve -30 KPX Kcommaaccent Ohungarumlaut -30 KPX Kcommaaccent Omacron -30 KPX Kcommaaccent Oslash -30 KPX Kcommaaccent Otilde -30 KPX Kcommaaccent e -25 KPX Kcommaaccent eacute -25 KPX Kcommaaccent ecaron -25 KPX Kcommaaccent ecircumflex -25 KPX Kcommaaccent edieresis -25 KPX Kcommaaccent edotaccent -25 KPX Kcommaaccent egrave -25 KPX Kcommaaccent emacron -25 KPX Kcommaaccent eogonek -25 KPX Kcommaaccent o -25 KPX Kcommaaccent oacute -25 KPX Kcommaaccent ocircumflex -25 KPX Kcommaaccent odieresis -25 KPX Kcommaaccent ograve -25 KPX Kcommaaccent ohungarumlaut -25 KPX Kcommaaccent omacron -25 KPX Kcommaaccent oslash -25 KPX Kcommaaccent otilde -25 KPX Kcommaaccent u -15 KPX Kcommaaccent uacute -15 KPX Kcommaaccent ucircumflex -15 KPX Kcommaaccent udieresis -15 KPX Kcommaaccent ugrave -15 KPX Kcommaaccent uhungarumlaut -15 KPX Kcommaaccent umacron -15 KPX Kcommaaccent uogonek -15 KPX Kcommaaccent uring -15 KPX Kcommaaccent y -45 KPX Kcommaaccent yacute -45 KPX Kcommaaccent ydieresis -45 KPX L T -92 KPX L Tcaron -92 KPX L Tcommaaccent -92 KPX L V -92 KPX L W -92 KPX L Y -92 KPX L Yacute -92 KPX L Ydieresis -92 KPX L quotedblright -20 KPX L quoteright -110 KPX L y -55 KPX L yacute -55 KPX L ydieresis -55 KPX Lacute T -92 KPX Lacute Tcaron -92 KPX Lacute Tcommaaccent -92 KPX Lacute V -92 KPX Lacute W -92 KPX Lacute Y -92 KPX Lacute Yacute -92 KPX Lacute Ydieresis -92 KPX Lacute quotedblright -20 KPX Lacute quoteright -110 KPX Lacute y -55 KPX Lacute yacute -55 KPX Lacute ydieresis -55 KPX Lcommaaccent T -92 KPX Lcommaaccent Tcaron -92 KPX Lcommaaccent Tcommaaccent -92 KPX Lcommaaccent V -92 KPX Lcommaaccent W -92 KPX Lcommaaccent Y -92 KPX Lcommaaccent Yacute -92 KPX Lcommaaccent Ydieresis -92 KPX Lcommaaccent quotedblright -20 KPX Lcommaaccent quoteright -110 KPX Lcommaaccent y -55 KPX Lcommaaccent yacute -55 KPX Lcommaaccent ydieresis -55 KPX Lslash T -92 KPX Lslash Tcaron -92 KPX Lslash Tcommaaccent -92 KPX Lslash V -92 KPX Lslash W -92 KPX Lslash Y -92 KPX Lslash Yacute -92 KPX Lslash Ydieresis -92 KPX Lslash quotedblright -20 KPX Lslash quoteright -110 KPX Lslash y -55 KPX Lslash yacute -55 KPX Lslash ydieresis -55 KPX N A -20 KPX N Aacute -20 KPX N Abreve -20 KPX N Acircumflex -20 KPX N Adieresis -20 KPX N Agrave -20 KPX N Amacron -20 KPX N Aogonek -20 KPX N Aring -20 KPX N Atilde -20 KPX Nacute A -20 KPX Nacute Aacute -20 KPX Nacute Abreve -20 KPX Nacute Acircumflex -20 KPX Nacute Adieresis -20 KPX Nacute Agrave -20 KPX Nacute Amacron -20 KPX Nacute Aogonek -20 KPX Nacute Aring -20 KPX Nacute Atilde -20 KPX Ncaron A -20 KPX Ncaron Aacute -20 KPX Ncaron Abreve -20 KPX Ncaron Acircumflex -20 KPX Ncaron Adieresis -20 KPX Ncaron Agrave -20 KPX Ncaron Amacron -20 KPX Ncaron Aogonek -20 KPX Ncaron Aring -20 KPX Ncaron Atilde -20 KPX Ncommaaccent A -20 KPX Ncommaaccent Aacute -20 KPX Ncommaaccent Abreve -20 KPX Ncommaaccent Acircumflex -20 KPX Ncommaaccent Adieresis -20 KPX Ncommaaccent Agrave -20 KPX Ncommaaccent Amacron -20 KPX Ncommaaccent Aogonek -20 KPX Ncommaaccent Aring -20 KPX Ncommaaccent Atilde -20 KPX Ntilde A -20 KPX Ntilde Aacute -20 KPX Ntilde Abreve -20 KPX Ntilde Acircumflex -20 KPX Ntilde Adieresis -20 KPX Ntilde Agrave -20 KPX Ntilde Amacron -20 KPX Ntilde Aogonek -20 KPX Ntilde Aring -20 KPX Ntilde Atilde -20 KPX O A -40 KPX O Aacute -40 KPX O Abreve -40 KPX O Acircumflex -40 KPX O Adieresis -40 KPX O Agrave -40 KPX O Amacron -40 KPX O Aogonek -40 KPX O Aring -40 KPX O Atilde -40 KPX O T -40 KPX O Tcaron -40 KPX O Tcommaaccent -40 KPX O V -50 KPX O W -50 KPX O X -40 KPX O Y -50 KPX O Yacute -50 KPX O Ydieresis -50 KPX Oacute A -40 KPX Oacute Aacute -40 KPX Oacute Abreve -40 KPX Oacute Acircumflex -40 KPX Oacute Adieresis -40 KPX Oacute Agrave -40 KPX Oacute Amacron -40 KPX Oacute Aogonek -40 KPX Oacute Aring -40 KPX Oacute Atilde -40 KPX Oacute T -40 KPX Oacute Tcaron -40 KPX Oacute Tcommaaccent -40 KPX Oacute V -50 KPX Oacute W -50 KPX Oacute X -40 KPX Oacute Y -50 KPX Oacute Yacute -50 KPX Oacute Ydieresis -50 KPX Ocircumflex A -40 KPX Ocircumflex Aacute -40 KPX Ocircumflex Abreve -40 KPX Ocircumflex Acircumflex -40 KPX Ocircumflex Adieresis -40 KPX Ocircumflex Agrave -40 KPX Ocircumflex Amacron -40 KPX Ocircumflex Aogonek -40 KPX Ocircumflex Aring -40 KPX Ocircumflex Atilde -40 KPX Ocircumflex T -40 KPX Ocircumflex Tcaron -40 KPX Ocircumflex Tcommaaccent -40 KPX Ocircumflex V -50 KPX Ocircumflex W -50 KPX Ocircumflex X -40 KPX Ocircumflex Y -50 KPX Ocircumflex Yacute -50 KPX Ocircumflex Ydieresis -50 KPX Odieresis A -40 KPX Odieresis Aacute -40 KPX Odieresis Abreve -40 KPX Odieresis Acircumflex -40 KPX Odieresis Adieresis -40 KPX Odieresis Agrave -40 KPX Odieresis Amacron -40 KPX Odieresis Aogonek -40 KPX Odieresis Aring -40 KPX Odieresis Atilde -40 KPX Odieresis T -40 KPX Odieresis Tcaron -40 KPX Odieresis Tcommaaccent -40 KPX Odieresis V -50 KPX Odieresis W -50 KPX Odieresis X -40 KPX Odieresis Y -50 KPX Odieresis Yacute -50 KPX Odieresis Ydieresis -50 KPX Ograve A -40 KPX Ograve Aacute -40 KPX Ograve Abreve -40 KPX Ograve Acircumflex -40 KPX Ograve Adieresis -40 KPX Ograve Agrave -40 KPX Ograve Amacron -40 KPX Ograve Aogonek -40 KPX Ograve Aring -40 KPX Ograve Atilde -40 KPX Ograve T -40 KPX Ograve Tcaron -40 KPX Ograve Tcommaaccent -40 KPX Ograve V -50 KPX Ograve W -50 KPX Ograve X -40 KPX Ograve Y -50 KPX Ograve Yacute -50 KPX Ograve Ydieresis -50 KPX Ohungarumlaut A -40 KPX Ohungarumlaut Aacute -40 KPX Ohungarumlaut Abreve -40 KPX Ohungarumlaut Acircumflex -40 KPX Ohungarumlaut Adieresis -40 KPX Ohungarumlaut Agrave -40 KPX Ohungarumlaut Amacron -40 KPX Ohungarumlaut Aogonek -40 KPX Ohungarumlaut Aring -40 KPX Ohungarumlaut Atilde -40 KPX Ohungarumlaut T -40 KPX Ohungarumlaut Tcaron -40 KPX Ohungarumlaut Tcommaaccent -40 KPX Ohungarumlaut V -50 KPX Ohungarumlaut W -50 KPX Ohungarumlaut X -40 KPX Ohungarumlaut Y -50 KPX Ohungarumlaut Yacute -50 KPX Ohungarumlaut Ydieresis -50 KPX Omacron A -40 KPX Omacron Aacute -40 KPX Omacron Abreve -40 KPX Omacron Acircumflex -40 KPX Omacron Adieresis -40 KPX Omacron Agrave -40 KPX Omacron Amacron -40 KPX Omacron Aogonek -40 KPX Omacron Aring -40 KPX Omacron Atilde -40 KPX Omacron T -40 KPX Omacron Tcaron -40 KPX Omacron Tcommaaccent -40 KPX Omacron V -50 KPX Omacron W -50 KPX Omacron X -40 KPX Omacron Y -50 KPX Omacron Yacute -50 KPX Omacron Ydieresis -50 KPX Oslash A -40 KPX Oslash Aacute -40 KPX Oslash Abreve -40 KPX Oslash Acircumflex -40 KPX Oslash Adieresis -40 KPX Oslash Agrave -40 KPX Oslash Amacron -40 KPX Oslash Aogonek -40 KPX Oslash Aring -40 KPX Oslash Atilde -40 KPX Oslash T -40 KPX Oslash Tcaron -40 KPX Oslash Tcommaaccent -40 KPX Oslash V -50 KPX Oslash W -50 KPX Oslash X -40 KPX Oslash Y -50 KPX Oslash Yacute -50 KPX Oslash Ydieresis -50 KPX Otilde A -40 KPX Otilde Aacute -40 KPX Otilde Abreve -40 KPX Otilde Acircumflex -40 KPX Otilde Adieresis -40 KPX Otilde Agrave -40 KPX Otilde Amacron -40 KPX Otilde Aogonek -40 KPX Otilde Aring -40 KPX Otilde Atilde -40 KPX Otilde T -40 KPX Otilde Tcaron -40 KPX Otilde Tcommaaccent -40 KPX Otilde V -50 KPX Otilde W -50 KPX Otilde X -40 KPX Otilde Y -50 KPX Otilde Yacute -50 KPX Otilde Ydieresis -50 KPX P A -74 KPX P Aacute -74 KPX P Abreve -74 KPX P Acircumflex -74 KPX P Adieresis -74 KPX P Agrave -74 KPX P Amacron -74 KPX P Aogonek -74 KPX P Aring -74 KPX P Atilde -74 KPX P a -10 KPX P aacute -10 KPX P abreve -10 KPX P acircumflex -10 KPX P adieresis -10 KPX P agrave -10 KPX P amacron -10 KPX P aogonek -10 KPX P aring -10 KPX P atilde -10 KPX P comma -92 KPX P e -20 KPX P eacute -20 KPX P ecaron -20 KPX P ecircumflex -20 KPX P edieresis -20 KPX P edotaccent -20 KPX P egrave -20 KPX P emacron -20 KPX P eogonek -20 KPX P o -20 KPX P oacute -20 KPX P ocircumflex -20 KPX P odieresis -20 KPX P ograve -20 KPX P ohungarumlaut -20 KPX P omacron -20 KPX P oslash -20 KPX P otilde -20 KPX P period -110 KPX Q U -10 KPX Q Uacute -10 KPX Q Ucircumflex -10 KPX Q Udieresis -10 KPX Q Ugrave -10 KPX Q Uhungarumlaut -10 KPX Q Umacron -10 KPX Q Uogonek -10 KPX Q Uring -10 KPX Q period -20 KPX R O -30 KPX R Oacute -30 KPX R Ocircumflex -30 KPX R Odieresis -30 KPX R Ograve -30 KPX R Ohungarumlaut -30 KPX R Omacron -30 KPX R Oslash -30 KPX R Otilde -30 KPX R T -40 KPX R Tcaron -40 KPX R Tcommaaccent -40 KPX R U -30 KPX R Uacute -30 KPX R Ucircumflex -30 KPX R Udieresis -30 KPX R Ugrave -30 KPX R Uhungarumlaut -30 KPX R Umacron -30 KPX R Uogonek -30 KPX R Uring -30 KPX R V -55 KPX R W -35 KPX R Y -35 KPX R Yacute -35 KPX R Ydieresis -35 KPX Racute O -30 KPX Racute Oacute -30 KPX Racute Ocircumflex -30 KPX Racute Odieresis -30 KPX Racute Ograve -30 KPX Racute Ohungarumlaut -30 KPX Racute Omacron -30 KPX Racute Oslash -30 KPX Racute Otilde -30 KPX Racute T -40 KPX Racute Tcaron -40 KPX Racute Tcommaaccent -40 KPX Racute U -30 KPX Racute Uacute -30 KPX Racute Ucircumflex -30 KPX Racute Udieresis -30 KPX Racute Ugrave -30 KPX Racute Uhungarumlaut -30 KPX Racute Umacron -30 KPX Racute Uogonek -30 KPX Racute Uring -30 KPX Racute V -55 KPX Racute W -35 KPX Racute Y -35 KPX Racute Yacute -35 KPX Racute Ydieresis -35 KPX Rcaron O -30 KPX Rcaron Oacute -30 KPX Rcaron Ocircumflex -30 KPX Rcaron Odieresis -30 KPX Rcaron Ograve -30 KPX Rcaron Ohungarumlaut -30 KPX Rcaron Omacron -30 KPX Rcaron Oslash -30 KPX Rcaron Otilde -30 KPX Rcaron T -40 KPX Rcaron Tcaron -40 KPX Rcaron Tcommaaccent -40 KPX Rcaron U -30 KPX Rcaron Uacute -30 KPX Rcaron Ucircumflex -30 KPX Rcaron Udieresis -30 KPX Rcaron Ugrave -30 KPX Rcaron Uhungarumlaut -30 KPX Rcaron Umacron -30 KPX Rcaron Uogonek -30 KPX Rcaron Uring -30 KPX Rcaron V -55 KPX Rcaron W -35 KPX Rcaron Y -35 KPX Rcaron Yacute -35 KPX Rcaron Ydieresis -35 KPX Rcommaaccent O -30 KPX Rcommaaccent Oacute -30 KPX Rcommaaccent Ocircumflex -30 KPX Rcommaaccent Odieresis -30 KPX Rcommaaccent Ograve -30 KPX Rcommaaccent Ohungarumlaut -30 KPX Rcommaaccent Omacron -30 KPX Rcommaaccent Oslash -30 KPX Rcommaaccent Otilde -30 KPX Rcommaaccent T -40 KPX Rcommaaccent Tcaron -40 KPX Rcommaaccent Tcommaaccent -40 KPX Rcommaaccent U -30 KPX Rcommaaccent Uacute -30 KPX Rcommaaccent Ucircumflex -30 KPX Rcommaaccent Udieresis -30 KPX Rcommaaccent Ugrave -30 KPX Rcommaaccent Uhungarumlaut -30 KPX Rcommaaccent Umacron -30 KPX Rcommaaccent Uogonek -30 KPX Rcommaaccent Uring -30 KPX Rcommaaccent V -55 KPX Rcommaaccent W -35 KPX Rcommaaccent Y -35 KPX Rcommaaccent Yacute -35 KPX Rcommaaccent Ydieresis -35 KPX T A -90 KPX T Aacute -90 KPX T Abreve -90 KPX T Acircumflex -90 KPX T Adieresis -90 KPX T Agrave -90 KPX T Amacron -90 KPX T Aogonek -90 KPX T Aring -90 KPX T Atilde -90 KPX T O -18 KPX T Oacute -18 KPX T Ocircumflex -18 KPX T Odieresis -18 KPX T Ograve -18 KPX T Ohungarumlaut -18 KPX T Omacron -18 KPX T Oslash -18 KPX T Otilde -18 KPX T a -92 KPX T aacute -92 KPX T abreve -52 KPX T acircumflex -52 KPX T adieresis -52 KPX T agrave -52 KPX T amacron -52 KPX T aogonek -92 KPX T aring -92 KPX T atilde -52 KPX T colon -74 KPX T comma -74 KPX T e -92 KPX T eacute -92 KPX T ecaron -92 KPX T ecircumflex -92 KPX T edieresis -52 KPX T edotaccent -92 KPX T egrave -52 KPX T emacron -52 KPX T eogonek -92 KPX T hyphen -92 KPX T i -18 KPX T iacute -18 KPX T iogonek -18 KPX T o -92 KPX T oacute -92 KPX T ocircumflex -92 KPX T odieresis -92 KPX T ograve -92 KPX T ohungarumlaut -92 KPX T omacron -92 KPX T oslash -92 KPX T otilde -92 KPX T period -90 KPX T r -74 KPX T racute -74 KPX T rcaron -74 KPX T rcommaaccent -74 KPX T semicolon -74 KPX T u -92 KPX T uacute -92 KPX T ucircumflex -92 KPX T udieresis -92 KPX T ugrave -92 KPX T uhungarumlaut -92 KPX T umacron -92 KPX T uogonek -92 KPX T uring -92 KPX T w -74 KPX T y -34 KPX T yacute -34 KPX T ydieresis -34 KPX Tcaron A -90 KPX Tcaron Aacute -90 KPX Tcaron Abreve -90 KPX Tcaron Acircumflex -90 KPX Tcaron Adieresis -90 KPX Tcaron Agrave -90 KPX Tcaron Amacron -90 KPX Tcaron Aogonek -90 KPX Tcaron Aring -90 KPX Tcaron Atilde -90 KPX Tcaron O -18 KPX Tcaron Oacute -18 KPX Tcaron Ocircumflex -18 KPX Tcaron Odieresis -18 KPX Tcaron Ograve -18 KPX Tcaron Ohungarumlaut -18 KPX Tcaron Omacron -18 KPX Tcaron Oslash -18 KPX Tcaron Otilde -18 KPX Tcaron a -92 KPX Tcaron aacute -92 KPX Tcaron abreve -52 KPX Tcaron acircumflex -52 KPX Tcaron adieresis -52 KPX Tcaron agrave -52 KPX Tcaron amacron -52 KPX Tcaron aogonek -92 KPX Tcaron aring -92 KPX Tcaron atilde -52 KPX Tcaron colon -74 KPX Tcaron comma -74 KPX Tcaron e -92 KPX Tcaron eacute -92 KPX Tcaron ecaron -92 KPX Tcaron ecircumflex -92 KPX Tcaron edieresis -52 KPX Tcaron edotaccent -92 KPX Tcaron egrave -52 KPX Tcaron emacron -52 KPX Tcaron eogonek -92 KPX Tcaron hyphen -92 KPX Tcaron i -18 KPX Tcaron iacute -18 KPX Tcaron iogonek -18 KPX Tcaron o -92 KPX Tcaron oacute -92 KPX Tcaron ocircumflex -92 KPX Tcaron odieresis -92 KPX Tcaron ograve -92 KPX Tcaron ohungarumlaut -92 KPX Tcaron omacron -92 KPX Tcaron oslash -92 KPX Tcaron otilde -92 KPX Tcaron period -90 KPX Tcaron r -74 KPX Tcaron racute -74 KPX Tcaron rcaron -74 KPX Tcaron rcommaaccent -74 KPX Tcaron semicolon -74 KPX Tcaron u -92 KPX Tcaron uacute -92 KPX Tcaron ucircumflex -92 KPX Tcaron udieresis -92 KPX Tcaron ugrave -92 KPX Tcaron uhungarumlaut -92 KPX Tcaron umacron -92 KPX Tcaron uogonek -92 KPX Tcaron uring -92 KPX Tcaron w -74 KPX Tcaron y -34 KPX Tcaron yacute -34 KPX Tcaron ydieresis -34 KPX Tcommaaccent A -90 KPX Tcommaaccent Aacute -90 KPX Tcommaaccent Abreve -90 KPX Tcommaaccent Acircumflex -90 KPX Tcommaaccent Adieresis -90 KPX Tcommaaccent Agrave -90 KPX Tcommaaccent Amacron -90 KPX Tcommaaccent Aogonek -90 KPX Tcommaaccent Aring -90 KPX Tcommaaccent Atilde -90 KPX Tcommaaccent O -18 KPX Tcommaaccent Oacute -18 KPX Tcommaaccent Ocircumflex -18 KPX Tcommaaccent Odieresis -18 KPX Tcommaaccent Ograve -18 KPX Tcommaaccent Ohungarumlaut -18 KPX Tcommaaccent Omacron -18 KPX Tcommaaccent Oslash -18 KPX Tcommaaccent Otilde -18 KPX Tcommaaccent a -92 KPX Tcommaaccent aacute -92 KPX Tcommaaccent abreve -52 KPX Tcommaaccent acircumflex -52 KPX Tcommaaccent adieresis -52 KPX Tcommaaccent agrave -52 KPX Tcommaaccent amacron -52 KPX Tcommaaccent aogonek -92 KPX Tcommaaccent aring -92 KPX Tcommaaccent atilde -52 KPX Tcommaaccent colon -74 KPX Tcommaaccent comma -74 KPX Tcommaaccent e -92 KPX Tcommaaccent eacute -92 KPX Tcommaaccent ecaron -92 KPX Tcommaaccent ecircumflex -92 KPX Tcommaaccent edieresis -52 KPX Tcommaaccent edotaccent -92 KPX Tcommaaccent egrave -52 KPX Tcommaaccent emacron -52 KPX Tcommaaccent eogonek -92 KPX Tcommaaccent hyphen -92 KPX Tcommaaccent i -18 KPX Tcommaaccent iacute -18 KPX Tcommaaccent iogonek -18 KPX Tcommaaccent o -92 KPX Tcommaaccent oacute -92 KPX Tcommaaccent ocircumflex -92 KPX Tcommaaccent odieresis -92 KPX Tcommaaccent ograve -92 KPX Tcommaaccent ohungarumlaut -92 KPX Tcommaaccent omacron -92 KPX Tcommaaccent oslash -92 KPX Tcommaaccent otilde -92 KPX Tcommaaccent period -90 KPX Tcommaaccent r -74 KPX Tcommaaccent racute -74 KPX Tcommaaccent rcaron -74 KPX Tcommaaccent rcommaaccent -74 KPX Tcommaaccent semicolon -74 KPX Tcommaaccent u -92 KPX Tcommaaccent uacute -92 KPX Tcommaaccent ucircumflex -92 KPX Tcommaaccent udieresis -92 KPX Tcommaaccent ugrave -92 KPX Tcommaaccent uhungarumlaut -92 KPX Tcommaaccent umacron -92 KPX Tcommaaccent uogonek -92 KPX Tcommaaccent uring -92 KPX Tcommaaccent w -74 KPX Tcommaaccent y -34 KPX Tcommaaccent yacute -34 KPX Tcommaaccent ydieresis -34 KPX U A -60 KPX U Aacute -60 KPX U Abreve -60 KPX U Acircumflex -60 KPX U Adieresis -60 KPX U Agrave -60 KPX U Amacron -60 KPX U Aogonek -60 KPX U Aring -60 KPX U Atilde -60 KPX U comma -50 KPX U period -50 KPX Uacute A -60 KPX Uacute Aacute -60 KPX Uacute Abreve -60 KPX Uacute Acircumflex -60 KPX Uacute Adieresis -60 KPX Uacute Agrave -60 KPX Uacute Amacron -60 KPX Uacute Aogonek -60 KPX Uacute Aring -60 KPX Uacute Atilde -60 KPX Uacute comma -50 KPX Uacute period -50 KPX Ucircumflex A -60 KPX Ucircumflex Aacute -60 KPX Ucircumflex Abreve -60 KPX Ucircumflex Acircumflex -60 KPX Ucircumflex Adieresis -60 KPX Ucircumflex Agrave -60 KPX Ucircumflex Amacron -60 KPX Ucircumflex Aogonek -60 KPX Ucircumflex Aring -60 KPX Ucircumflex Atilde -60 KPX Ucircumflex comma -50 KPX Ucircumflex period -50 KPX Udieresis A -60 KPX Udieresis Aacute -60 KPX Udieresis Abreve -60 KPX Udieresis Acircumflex -60 KPX Udieresis Adieresis -60 KPX Udieresis Agrave -60 KPX Udieresis Amacron -60 KPX Udieresis Aogonek -60 KPX Udieresis Aring -60 KPX Udieresis Atilde -60 KPX Udieresis comma -50 KPX Udieresis period -50 KPX Ugrave A -60 KPX Ugrave Aacute -60 KPX Ugrave Abreve -60 KPX Ugrave Acircumflex -60 KPX Ugrave Adieresis -60 KPX Ugrave Agrave -60 KPX Ugrave Amacron -60 KPX Ugrave Aogonek -60 KPX Ugrave Aring -60 KPX Ugrave Atilde -60 KPX Ugrave comma -50 KPX Ugrave period -50 KPX Uhungarumlaut A -60 KPX Uhungarumlaut Aacute -60 KPX Uhungarumlaut Abreve -60 KPX Uhungarumlaut Acircumflex -60 KPX Uhungarumlaut Adieresis -60 KPX Uhungarumlaut Agrave -60 KPX Uhungarumlaut Amacron -60 KPX Uhungarumlaut Aogonek -60 KPX Uhungarumlaut Aring -60 KPX Uhungarumlaut Atilde -60 KPX Uhungarumlaut comma -50 KPX Uhungarumlaut period -50 KPX Umacron A -60 KPX Umacron Aacute -60 KPX Umacron Abreve -60 KPX Umacron Acircumflex -60 KPX Umacron Adieresis -60 KPX Umacron Agrave -60 KPX Umacron Amacron -60 KPX Umacron Aogonek -60 KPX Umacron Aring -60 KPX Umacron Atilde -60 KPX Umacron comma -50 KPX Umacron period -50 KPX Uogonek A -60 KPX Uogonek Aacute -60 KPX Uogonek Abreve -60 KPX Uogonek Acircumflex -60 KPX Uogonek Adieresis -60 KPX Uogonek Agrave -60 KPX Uogonek Amacron -60 KPX Uogonek Aogonek -60 KPX Uogonek Aring -60 KPX Uogonek Atilde -60 KPX Uogonek comma -50 KPX Uogonek period -50 KPX Uring A -60 KPX Uring Aacute -60 KPX Uring Abreve -60 KPX Uring Acircumflex -60 KPX Uring Adieresis -60 KPX Uring Agrave -60 KPX Uring Amacron -60 KPX Uring Aogonek -60 KPX Uring Aring -60 KPX Uring Atilde -60 KPX Uring comma -50 KPX Uring period -50 KPX V A -135 KPX V Aacute -135 KPX V Abreve -135 KPX V Acircumflex -135 KPX V Adieresis -135 KPX V Agrave -135 KPX V Amacron -135 KPX V Aogonek -135 KPX V Aring -135 KPX V Atilde -135 KPX V G -30 KPX V Gbreve -30 KPX V Gcommaaccent -30 KPX V O -45 KPX V Oacute -45 KPX V Ocircumflex -45 KPX V Odieresis -45 KPX V Ograve -45 KPX V Ohungarumlaut -45 KPX V Omacron -45 KPX V Oslash -45 KPX V Otilde -45 KPX V a -92 KPX V aacute -92 KPX V abreve -92 KPX V acircumflex -92 KPX V adieresis -92 KPX V agrave -92 KPX V amacron -92 KPX V aogonek -92 KPX V aring -92 KPX V atilde -92 KPX V colon -92 KPX V comma -129 KPX V e -100 KPX V eacute -100 KPX V ecaron -100 KPX V ecircumflex -100 KPX V edieresis -100 KPX V edotaccent -100 KPX V egrave -100 KPX V emacron -100 KPX V eogonek -100 KPX V hyphen -74 KPX V i -37 KPX V iacute -37 KPX V icircumflex -37 KPX V idieresis -37 KPX V igrave -37 KPX V imacron -37 KPX V iogonek -37 KPX V o -100 KPX V oacute -100 KPX V ocircumflex -100 KPX V odieresis -100 KPX V ograve -100 KPX V ohungarumlaut -100 KPX V omacron -100 KPX V oslash -100 KPX V otilde -100 KPX V period -145 KPX V semicolon -92 KPX V u -92 KPX V uacute -92 KPX V ucircumflex -92 KPX V udieresis -92 KPX V ugrave -92 KPX V uhungarumlaut -92 KPX V umacron -92 KPX V uogonek -92 KPX V uring -92 KPX W A -120 KPX W Aacute -120 KPX W Abreve -120 KPX W Acircumflex -120 KPX W Adieresis -120 KPX W Agrave -120 KPX W Amacron -120 KPX W Aogonek -120 KPX W Aring -120 KPX W Atilde -120 KPX W O -10 KPX W Oacute -10 KPX W Ocircumflex -10 KPX W Odieresis -10 KPX W Ograve -10 KPX W Ohungarumlaut -10 KPX W Omacron -10 KPX W Oslash -10 KPX W Otilde -10 KPX W a -65 KPX W aacute -65 KPX W abreve -65 KPX W acircumflex -65 KPX W adieresis -65 KPX W agrave -65 KPX W amacron -65 KPX W aogonek -65 KPX W aring -65 KPX W atilde -65 KPX W colon -55 KPX W comma -92 KPX W e -65 KPX W eacute -65 KPX W ecaron -65 KPX W ecircumflex -65 KPX W edieresis -65 KPX W edotaccent -65 KPX W egrave -65 KPX W emacron -65 KPX W eogonek -65 KPX W hyphen -37 KPX W i -18 KPX W iacute -18 KPX W iogonek -18 KPX W o -75 KPX W oacute -75 KPX W ocircumflex -75 KPX W odieresis -75 KPX W ograve -75 KPX W ohungarumlaut -75 KPX W omacron -75 KPX W oslash -75 KPX W otilde -75 KPX W period -92 KPX W semicolon -55 KPX W u -50 KPX W uacute -50 KPX W ucircumflex -50 KPX W udieresis -50 KPX W ugrave -50 KPX W uhungarumlaut -50 KPX W umacron -50 KPX W uogonek -50 KPX W uring -50 KPX W y -60 KPX W yacute -60 KPX W ydieresis -60 KPX Y A -110 KPX Y Aacute -110 KPX Y Abreve -110 KPX Y Acircumflex -110 KPX Y Adieresis -110 KPX Y Agrave -110 KPX Y Amacron -110 KPX Y Aogonek -110 KPX Y Aring -110 KPX Y Atilde -110 KPX Y O -35 KPX Y Oacute -35 KPX Y Ocircumflex -35 KPX Y Odieresis -35 KPX Y Ograve -35 KPX Y Ohungarumlaut -35 KPX Y Omacron -35 KPX Y Oslash -35 KPX Y Otilde -35 KPX Y a -85 KPX Y aacute -85 KPX Y abreve -85 KPX Y acircumflex -85 KPX Y adieresis -85 KPX Y agrave -85 KPX Y amacron -85 KPX Y aogonek -85 KPX Y aring -85 KPX Y atilde -85 KPX Y colon -92 KPX Y comma -92 KPX Y e -111 KPX Y eacute -111 KPX Y ecaron -111 KPX Y ecircumflex -111 KPX Y edieresis -71 KPX Y edotaccent -111 KPX Y egrave -71 KPX Y emacron -71 KPX Y eogonek -111 KPX Y hyphen -92 KPX Y i -37 KPX Y iacute -37 KPX Y iogonek -37 KPX Y o -111 KPX Y oacute -111 KPX Y ocircumflex -111 KPX Y odieresis -111 KPX Y ograve -111 KPX Y ohungarumlaut -111 KPX Y omacron -111 KPX Y oslash -111 KPX Y otilde -111 KPX Y period -92 KPX Y semicolon -92 KPX Y u -92 KPX Y uacute -92 KPX Y ucircumflex -92 KPX Y udieresis -92 KPX Y ugrave -92 KPX Y uhungarumlaut -92 KPX Y umacron -92 KPX Y uogonek -92 KPX Y uring -92 KPX Yacute A -110 KPX Yacute Aacute -110 KPX Yacute Abreve -110 KPX Yacute Acircumflex -110 KPX Yacute Adieresis -110 KPX Yacute Agrave -110 KPX Yacute Amacron -110 KPX Yacute Aogonek -110 KPX Yacute Aring -110 KPX Yacute Atilde -110 KPX Yacute O -35 KPX Yacute Oacute -35 KPX Yacute Ocircumflex -35 KPX Yacute Odieresis -35 KPX Yacute Ograve -35 KPX Yacute Ohungarumlaut -35 KPX Yacute Omacron -35 KPX Yacute Oslash -35 KPX Yacute Otilde -35 KPX Yacute a -85 KPX Yacute aacute -85 KPX Yacute abreve -85 KPX Yacute acircumflex -85 KPX Yacute adieresis -85 KPX Yacute agrave -85 KPX Yacute amacron -85 KPX Yacute aogonek -85 KPX Yacute aring -85 KPX Yacute atilde -85 KPX Yacute colon -92 KPX Yacute comma -92 KPX Yacute e -111 KPX Yacute eacute -111 KPX Yacute ecaron -111 KPX Yacute ecircumflex -111 KPX Yacute edieresis -71 KPX Yacute edotaccent -111 KPX Yacute egrave -71 KPX Yacute emacron -71 KPX Yacute eogonek -111 KPX Yacute hyphen -92 KPX Yacute i -37 KPX Yacute iacute -37 KPX Yacute iogonek -37 KPX Yacute o -111 KPX Yacute oacute -111 KPX Yacute ocircumflex -111 KPX Yacute odieresis -111 KPX Yacute ograve -111 KPX Yacute ohungarumlaut -111 KPX Yacute omacron -111 KPX Yacute oslash -111 KPX Yacute otilde -111 KPX Yacute period -92 KPX Yacute semicolon -92 KPX Yacute u -92 KPX Yacute uacute -92 KPX Yacute ucircumflex -92 KPX Yacute udieresis -92 KPX Yacute ugrave -92 KPX Yacute uhungarumlaut -92 KPX Yacute umacron -92 KPX Yacute uogonek -92 KPX Yacute uring -92 KPX Ydieresis A -110 KPX Ydieresis Aacute -110 KPX Ydieresis Abreve -110 KPX Ydieresis Acircumflex -110 KPX Ydieresis Adieresis -110 KPX Ydieresis Agrave -110 KPX Ydieresis Amacron -110 KPX Ydieresis Aogonek -110 KPX Ydieresis Aring -110 KPX Ydieresis Atilde -110 KPX Ydieresis O -35 KPX Ydieresis Oacute -35 KPX Ydieresis Ocircumflex -35 KPX Ydieresis Odieresis -35 KPX Ydieresis Ograve -35 KPX Ydieresis Ohungarumlaut -35 KPX Ydieresis Omacron -35 KPX Ydieresis Oslash -35 KPX Ydieresis Otilde -35 KPX Ydieresis a -85 KPX Ydieresis aacute -85 KPX Ydieresis abreve -85 KPX Ydieresis acircumflex -85 KPX Ydieresis adieresis -85 KPX Ydieresis agrave -85 KPX Ydieresis amacron -85 KPX Ydieresis aogonek -85 KPX Ydieresis aring -85 KPX Ydieresis atilde -85 KPX Ydieresis colon -92 KPX Ydieresis comma -92 KPX Ydieresis e -111 KPX Ydieresis eacute -111 KPX Ydieresis ecaron -111 KPX Ydieresis ecircumflex -111 KPX Ydieresis edieresis -71 KPX Ydieresis edotaccent -111 KPX Ydieresis egrave -71 KPX Ydieresis emacron -71 KPX Ydieresis eogonek -111 KPX Ydieresis hyphen -92 KPX Ydieresis i -37 KPX Ydieresis iacute -37 KPX Ydieresis iogonek -37 KPX Ydieresis o -111 KPX Ydieresis oacute -111 KPX Ydieresis ocircumflex -111 KPX Ydieresis odieresis -111 KPX Ydieresis ograve -111 KPX Ydieresis ohungarumlaut -111 KPX Ydieresis omacron -111 KPX Ydieresis oslash -111 KPX Ydieresis otilde -111 KPX Ydieresis period -92 KPX Ydieresis semicolon -92 KPX Ydieresis u -92 KPX Ydieresis uacute -92 KPX Ydieresis ucircumflex -92 KPX Ydieresis udieresis -92 KPX Ydieresis ugrave -92 KPX Ydieresis uhungarumlaut -92 KPX Ydieresis umacron -92 KPX Ydieresis uogonek -92 KPX Ydieresis uring -92 KPX a v -25 KPX aacute v -25 KPX abreve v -25 KPX acircumflex v -25 KPX adieresis v -25 KPX agrave v -25 KPX amacron v -25 KPX aogonek v -25 KPX aring v -25 KPX atilde v -25 KPX b b -10 KPX b period -40 KPX b u -20 KPX b uacute -20 KPX b ucircumflex -20 KPX b udieresis -20 KPX b ugrave -20 KPX b uhungarumlaut -20 KPX b umacron -20 KPX b uogonek -20 KPX b uring -20 KPX b v -15 KPX comma quotedblright -45 KPX comma quoteright -55 KPX d w -15 KPX dcroat w -15 KPX e v -15 KPX eacute v -15 KPX ecaron v -15 KPX ecircumflex v -15 KPX edieresis v -15 KPX edotaccent v -15 KPX egrave v -15 KPX emacron v -15 KPX eogonek v -15 KPX f comma -15 KPX f dotlessi -35 KPX f i -25 KPX f o -25 KPX f oacute -25 KPX f ocircumflex -25 KPX f odieresis -25 KPX f ograve -25 KPX f ohungarumlaut -25 KPX f omacron -25 KPX f oslash -25 KPX f otilde -25 KPX f period -15 KPX f quotedblright 50 KPX f quoteright 55 KPX g period -15 KPX gbreve period -15 KPX gcommaaccent period -15 KPX h y -15 KPX h yacute -15 KPX h ydieresis -15 KPX i v -10 KPX iacute v -10 KPX icircumflex v -10 KPX idieresis v -10 KPX igrave v -10 KPX imacron v -10 KPX iogonek v -10 KPX k e -10 KPX k eacute -10 KPX k ecaron -10 KPX k ecircumflex -10 KPX k edieresis -10 KPX k edotaccent -10 KPX k egrave -10 KPX k emacron -10 KPX k eogonek -10 KPX k o -15 KPX k oacute -15 KPX k ocircumflex -15 KPX k odieresis -15 KPX k ograve -15 KPX k ohungarumlaut -15 KPX k omacron -15 KPX k oslash -15 KPX k otilde -15 KPX k y -15 KPX k yacute -15 KPX k ydieresis -15 KPX kcommaaccent e -10 KPX kcommaaccent eacute -10 KPX kcommaaccent ecaron -10 KPX kcommaaccent ecircumflex -10 KPX kcommaaccent edieresis -10 KPX kcommaaccent edotaccent -10 KPX kcommaaccent egrave -10 KPX kcommaaccent emacron -10 KPX kcommaaccent eogonek -10 KPX kcommaaccent o -15 KPX kcommaaccent oacute -15 KPX kcommaaccent ocircumflex -15 KPX kcommaaccent odieresis -15 KPX kcommaaccent ograve -15 KPX kcommaaccent ohungarumlaut -15 KPX kcommaaccent omacron -15 KPX kcommaaccent oslash -15 KPX kcommaaccent otilde -15 KPX kcommaaccent y -15 KPX kcommaaccent yacute -15 KPX kcommaaccent ydieresis -15 KPX n v -40 KPX nacute v -40 KPX ncaron v -40 KPX ncommaaccent v -40 KPX ntilde v -40 KPX o v -10 KPX o w -10 KPX oacute v -10 KPX oacute w -10 KPX ocircumflex v -10 KPX ocircumflex w -10 KPX odieresis v -10 KPX odieresis w -10 KPX ograve v -10 KPX ograve w -10 KPX ohungarumlaut v -10 KPX ohungarumlaut w -10 KPX omacron v -10 KPX omacron w -10 KPX oslash v -10 KPX oslash w -10 KPX otilde v -10 KPX otilde w -10 KPX period quotedblright -55 KPX period quoteright -55 KPX quotedblleft A -10 KPX quotedblleft Aacute -10 KPX quotedblleft Abreve -10 KPX quotedblleft Acircumflex -10 KPX quotedblleft Adieresis -10 KPX quotedblleft Agrave -10 KPX quotedblleft Amacron -10 KPX quotedblleft Aogonek -10 KPX quotedblleft Aring -10 KPX quotedblleft Atilde -10 KPX quoteleft A -10 KPX quoteleft Aacute -10 KPX quoteleft Abreve -10 KPX quoteleft Acircumflex -10 KPX quoteleft Adieresis -10 KPX quoteleft Agrave -10 KPX quoteleft Amacron -10 KPX quoteleft Aogonek -10 KPX quoteleft Aring -10 KPX quoteleft Atilde -10 KPX quoteleft quoteleft -63 KPX quoteright d -20 KPX quoteright dcroat -20 KPX quoteright quoteright -63 KPX quoteright r -20 KPX quoteright racute -20 KPX quoteright rcaron -20 KPX quoteright rcommaaccent -20 KPX quoteright s -37 KPX quoteright sacute -37 KPX quoteright scaron -37 KPX quoteright scedilla -37 KPX quoteright scommaaccent -37 KPX quoteright space -74 KPX quoteright v -20 KPX r c -18 KPX r cacute -18 KPX r ccaron -18 KPX r ccedilla -18 KPX r comma -92 KPX r e -18 KPX r eacute -18 KPX r ecaron -18 KPX r ecircumflex -18 KPX r edieresis -18 KPX r edotaccent -18 KPX r egrave -18 KPX r emacron -18 KPX r eogonek -18 KPX r g -10 KPX r gbreve -10 KPX r gcommaaccent -10 KPX r hyphen -37 KPX r n -15 KPX r nacute -15 KPX r ncaron -15 KPX r ncommaaccent -15 KPX r ntilde -15 KPX r o -18 KPX r oacute -18 KPX r ocircumflex -18 KPX r odieresis -18 KPX r ograve -18 KPX r ohungarumlaut -18 KPX r omacron -18 KPX r oslash -18 KPX r otilde -18 KPX r p -10 KPX r period -100 KPX r q -18 KPX r v -10 KPX racute c -18 KPX racute cacute -18 KPX racute ccaron -18 KPX racute ccedilla -18 KPX racute comma -92 KPX racute e -18 KPX racute eacute -18 KPX racute ecaron -18 KPX racute ecircumflex -18 KPX racute edieresis -18 KPX racute edotaccent -18 KPX racute egrave -18 KPX racute emacron -18 KPX racute eogonek -18 KPX racute g -10 KPX racute gbreve -10 KPX racute gcommaaccent -10 KPX racute hyphen -37 KPX racute n -15 KPX racute nacute -15 KPX racute ncaron -15 KPX racute ncommaaccent -15 KPX racute ntilde -15 KPX racute o -18 KPX racute oacute -18 KPX racute ocircumflex -18 KPX racute odieresis -18 KPX racute ograve -18 KPX racute ohungarumlaut -18 KPX racute omacron -18 KPX racute oslash -18 KPX racute otilde -18 KPX racute p -10 KPX racute period -100 KPX racute q -18 KPX racute v -10 KPX rcaron c -18 KPX rcaron cacute -18 KPX rcaron ccaron -18 KPX rcaron ccedilla -18 KPX rcaron comma -92 KPX rcaron e -18 KPX rcaron eacute -18 KPX rcaron ecaron -18 KPX rcaron ecircumflex -18 KPX rcaron edieresis -18 KPX rcaron edotaccent -18 KPX rcaron egrave -18 KPX rcaron emacron -18 KPX rcaron eogonek -18 KPX rcaron g -10 KPX rcaron gbreve -10 KPX rcaron gcommaaccent -10 KPX rcaron hyphen -37 KPX rcaron n -15 KPX rcaron nacute -15 KPX rcaron ncaron -15 KPX rcaron ncommaaccent -15 KPX rcaron ntilde -15 KPX rcaron o -18 KPX rcaron oacute -18 KPX rcaron ocircumflex -18 KPX rcaron odieresis -18 KPX rcaron ograve -18 KPX rcaron ohungarumlaut -18 KPX rcaron omacron -18 KPX rcaron oslash -18 KPX rcaron otilde -18 KPX rcaron p -10 KPX rcaron period -100 KPX rcaron q -18 KPX rcaron v -10 KPX rcommaaccent c -18 KPX rcommaaccent cacute -18 KPX rcommaaccent ccaron -18 KPX rcommaaccent ccedilla -18 KPX rcommaaccent comma -92 KPX rcommaaccent e -18 KPX rcommaaccent eacute -18 KPX rcommaaccent ecaron -18 KPX rcommaaccent ecircumflex -18 KPX rcommaaccent edieresis -18 KPX rcommaaccent edotaccent -18 KPX rcommaaccent egrave -18 KPX rcommaaccent emacron -18 KPX rcommaaccent eogonek -18 KPX rcommaaccent g -10 KPX rcommaaccent gbreve -10 KPX rcommaaccent gcommaaccent -10 KPX rcommaaccent hyphen -37 KPX rcommaaccent n -15 KPX rcommaaccent nacute -15 KPX rcommaaccent ncaron -15 KPX rcommaaccent ncommaaccent -15 KPX rcommaaccent ntilde -15 KPX rcommaaccent o -18 KPX rcommaaccent oacute -18 KPX rcommaaccent ocircumflex -18 KPX rcommaaccent odieresis -18 KPX rcommaaccent ograve -18 KPX rcommaaccent ohungarumlaut -18 KPX rcommaaccent omacron -18 KPX rcommaaccent oslash -18 KPX rcommaaccent otilde -18 KPX rcommaaccent p -10 KPX rcommaaccent period -100 KPX rcommaaccent q -18 KPX rcommaaccent v -10 KPX space A -55 KPX space Aacute -55 KPX space Abreve -55 KPX space Acircumflex -55 KPX space Adieresis -55 KPX space Agrave -55 KPX space Amacron -55 KPX space Aogonek -55 KPX space Aring -55 KPX space Atilde -55 KPX space T -30 KPX space Tcaron -30 KPX space Tcommaaccent -30 KPX space V -45 KPX space W -30 KPX space Y -55 KPX space Yacute -55 KPX space Ydieresis -55 KPX v a -10 KPX v aacute -10 KPX v abreve -10 KPX v acircumflex -10 KPX v adieresis -10 KPX v agrave -10 KPX v amacron -10 KPX v aogonek -10 KPX v aring -10 KPX v atilde -10 KPX v comma -55 KPX v e -10 KPX v eacute -10 KPX v ecaron -10 KPX v ecircumflex -10 KPX v edieresis -10 KPX v edotaccent -10 KPX v egrave -10 KPX v emacron -10 KPX v eogonek -10 KPX v o -10 KPX v oacute -10 KPX v ocircumflex -10 KPX v odieresis -10 KPX v ograve -10 KPX v ohungarumlaut -10 KPX v omacron -10 KPX v oslash -10 KPX v otilde -10 KPX v period -70 KPX w comma -55 KPX w o -10 KPX w oacute -10 KPX w ocircumflex -10 KPX w odieresis -10 KPX w ograve -10 KPX w ohungarumlaut -10 KPX w omacron -10 KPX w oslash -10 KPX w otilde -10 KPX w period -70 KPX y comma -55 KPX y e -10 KPX y eacute -10 KPX y ecaron -10 KPX y ecircumflex -10 KPX y edieresis -10 KPX y edotaccent -10 KPX y egrave -10 KPX y emacron -10 KPX y eogonek -10 KPX y o -25 KPX y oacute -25 KPX y ocircumflex -25 KPX y odieresis -25 KPX y ograve -25 KPX y ohungarumlaut -25 KPX y omacron -25 KPX y oslash -25 KPX y otilde -25 KPX y period -70 KPX yacute comma -55 KPX yacute e -10 KPX yacute eacute -10 KPX yacute ecaron -10 KPX yacute ecircumflex -10 KPX yacute edieresis -10 KPX yacute edotaccent -10 KPX yacute egrave -10 KPX yacute emacron -10 KPX yacute eogonek -10 KPX yacute o -25 KPX yacute oacute -25 KPX yacute ocircumflex -25 KPX yacute odieresis -25 KPX yacute ograve -25 KPX yacute ohungarumlaut -25 KPX yacute omacron -25 KPX yacute oslash -25 KPX yacute otilde -25 KPX yacute period -70 KPX ydieresis comma -55 KPX ydieresis e -10 KPX ydieresis eacute -10 KPX ydieresis ecaron -10 KPX ydieresis ecircumflex -10 KPX ydieresis edieresis -10 KPX ydieresis edotaccent -10 KPX ydieresis egrave -10 KPX ydieresis emacron -10 KPX ydieresis eogonek -10 KPX ydieresis o -25 KPX ydieresis oacute -25 KPX ydieresis ocircumflex -25 KPX ydieresis odieresis -25 KPX ydieresis ograve -25 KPX ydieresis ohungarumlaut -25 KPX ydieresis omacron -25 KPX ydieresis oslash -25 KPX ydieresis otilde -25 KPX ydieresis period -70 EndKernPairs EndKernData EndFontMetrics ruby-prawn-2.1.0.orig/data/fonts/Times-Italic.afm0000644000000000000000000020143012665203156020276 0ustar rootrootStartFontMetrics 4.1 Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. Comment Creation Date: Thu May 1 12:56:55 1997 Comment UniqueID 43067 Comment VMusage 47727 58752 FontName Times-Italic FullName Times Italic FamilyName Times Weight Medium ItalicAngle -15.5 IsFixedPitch false CharacterSet ExtendedRoman FontBBox -169 -217 1010 883 UnderlinePosition -100 UnderlineThickness 50 Version 002.000 Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries. EncodingScheme AdobeStandardEncoding CapHeight 653 XHeight 441 Ascender 683 Descender -217 StdHW 32 StdVW 76 StartCharMetrics 315 C 32 ; WX 250 ; N space ; B 0 0 0 0 ; C 33 ; WX 333 ; N exclam ; B 39 -11 302 667 ; C 34 ; WX 420 ; N quotedbl ; B 144 421 432 666 ; C 35 ; WX 500 ; N numbersign ; B 2 0 540 676 ; C 36 ; WX 500 ; N dollar ; B 31 -89 497 731 ; C 37 ; WX 833 ; N percent ; B 79 -13 790 676 ; C 38 ; WX 778 ; N ampersand ; B 76 -18 723 666 ; C 39 ; WX 333 ; N quoteright ; B 151 436 290 666 ; C 40 ; WX 333 ; N parenleft ; B 42 -181 315 669 ; C 41 ; WX 333 ; N parenright ; B 16 -180 289 669 ; C 42 ; WX 500 ; N asterisk ; B 128 255 492 666 ; C 43 ; WX 675 ; N plus ; B 86 0 590 506 ; C 44 ; WX 250 ; N comma ; B -4 -129 135 101 ; C 45 ; WX 333 ; N hyphen ; B 49 192 282 255 ; C 46 ; WX 250 ; N period ; B 27 -11 138 100 ; C 47 ; WX 278 ; N slash ; B -65 -18 386 666 ; C 48 ; WX 500 ; N zero ; B 32 -7 497 676 ; C 49 ; WX 500 ; N one ; B 49 0 409 676 ; C 50 ; WX 500 ; N two ; B 12 0 452 676 ; C 51 ; WX 500 ; N three ; B 15 -7 465 676 ; C 52 ; WX 500 ; N four ; B 1 0 479 676 ; C 53 ; WX 500 ; N five ; B 15 -7 491 666 ; C 54 ; WX 500 ; N six ; B 30 -7 521 686 ; C 55 ; WX 500 ; N seven ; B 75 -8 537 666 ; C 56 ; WX 500 ; N eight ; B 30 -7 493 676 ; C 57 ; WX 500 ; N nine ; B 23 -17 492 676 ; C 58 ; WX 333 ; N colon ; B 50 -11 261 441 ; C 59 ; WX 333 ; N semicolon ; B 27 -129 261 441 ; C 60 ; WX 675 ; N less ; B 84 -8 592 514 ; C 61 ; WX 675 ; N equal ; B 86 120 590 386 ; C 62 ; WX 675 ; N greater ; B 84 -8 592 514 ; C 63 ; WX 500 ; N question ; B 132 -12 472 664 ; C 64 ; WX 920 ; N at ; B 118 -18 806 666 ; C 65 ; WX 611 ; N A ; B -51 0 564 668 ; C 66 ; WX 611 ; N B ; B -8 0 588 653 ; C 67 ; WX 667 ; N C ; B 66 -18 689 666 ; C 68 ; WX 722 ; N D ; B -8 0 700 653 ; C 69 ; WX 611 ; N E ; B -1 0 634 653 ; C 70 ; WX 611 ; N F ; B 8 0 645 653 ; C 71 ; WX 722 ; N G ; B 52 -18 722 666 ; C 72 ; WX 722 ; N H ; B -8 0 767 653 ; C 73 ; WX 333 ; N I ; B -8 0 384 653 ; C 74 ; WX 444 ; N J ; B -6 -18 491 653 ; C 75 ; WX 667 ; N K ; B 7 0 722 653 ; C 76 ; WX 556 ; N L ; B -8 0 559 653 ; C 77 ; WX 833 ; N M ; B -18 0 873 653 ; C 78 ; WX 667 ; N N ; B -20 -15 727 653 ; C 79 ; WX 722 ; N O ; B 60 -18 699 666 ; C 80 ; WX 611 ; N P ; B 0 0 605 653 ; C 81 ; WX 722 ; N Q ; B 59 -182 699 666 ; C 82 ; WX 611 ; N R ; B -13 0 588 653 ; C 83 ; WX 500 ; N S ; B 17 -18 508 667 ; C 84 ; WX 556 ; N T ; B 59 0 633 653 ; C 85 ; WX 722 ; N U ; B 102 -18 765 653 ; C 86 ; WX 611 ; N V ; B 76 -18 688 653 ; C 87 ; WX 833 ; N W ; B 71 -18 906 653 ; C 88 ; WX 611 ; N X ; B -29 0 655 653 ; C 89 ; WX 556 ; N Y ; B 78 0 633 653 ; C 90 ; WX 556 ; N Z ; B -6 0 606 653 ; C 91 ; WX 389 ; N bracketleft ; B 21 -153 391 663 ; C 92 ; WX 278 ; N backslash ; B -41 -18 319 666 ; C 93 ; WX 389 ; N bracketright ; B 12 -153 382 663 ; C 94 ; WX 422 ; N asciicircum ; B 0 301 422 666 ; C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; C 96 ; WX 333 ; N quoteleft ; B 171 436 310 666 ; C 97 ; WX 500 ; N a ; B 17 -11 476 441 ; C 98 ; WX 500 ; N b ; B 23 -11 473 683 ; C 99 ; WX 444 ; N c ; B 30 -11 425 441 ; C 100 ; WX 500 ; N d ; B 15 -13 527 683 ; C 101 ; WX 444 ; N e ; B 31 -11 412 441 ; C 102 ; WX 278 ; N f ; B -147 -207 424 678 ; L i fi ; L l fl ; C 103 ; WX 500 ; N g ; B 8 -206 472 441 ; C 104 ; WX 500 ; N h ; B 19 -9 478 683 ; C 105 ; WX 278 ; N i ; B 49 -11 264 654 ; C 106 ; WX 278 ; N j ; B -124 -207 276 654 ; C 107 ; WX 444 ; N k ; B 14 -11 461 683 ; C 108 ; WX 278 ; N l ; B 41 -11 279 683 ; C 109 ; WX 722 ; N m ; B 12 -9 704 441 ; C 110 ; WX 500 ; N n ; B 14 -9 474 441 ; C 111 ; WX 500 ; N o ; B 27 -11 468 441 ; C 112 ; WX 500 ; N p ; B -75 -205 469 441 ; C 113 ; WX 500 ; N q ; B 25 -209 483 441 ; C 114 ; WX 389 ; N r ; B 45 0 412 441 ; C 115 ; WX 389 ; N s ; B 16 -13 366 442 ; C 116 ; WX 278 ; N t ; B 37 -11 296 546 ; C 117 ; WX 500 ; N u ; B 42 -11 475 441 ; C 118 ; WX 444 ; N v ; B 21 -18 426 441 ; C 119 ; WX 667 ; N w ; B 16 -18 648 441 ; C 120 ; WX 444 ; N x ; B -27 -11 447 441 ; C 121 ; WX 444 ; N y ; B -24 -206 426 441 ; C 122 ; WX 389 ; N z ; B -2 -81 380 428 ; C 123 ; WX 400 ; N braceleft ; B 51 -177 407 687 ; C 124 ; WX 275 ; N bar ; B 105 -217 171 783 ; C 125 ; WX 400 ; N braceright ; B -7 -177 349 687 ; C 126 ; WX 541 ; N asciitilde ; B 40 183 502 323 ; C 161 ; WX 389 ; N exclamdown ; B 59 -205 322 473 ; C 162 ; WX 500 ; N cent ; B 77 -143 472 560 ; C 163 ; WX 500 ; N sterling ; B 10 -6 517 670 ; C 164 ; WX 167 ; N fraction ; B -169 -10 337 676 ; C 165 ; WX 500 ; N yen ; B 27 0 603 653 ; C 166 ; WX 500 ; N florin ; B 25 -182 507 682 ; C 167 ; WX 500 ; N section ; B 53 -162 461 666 ; C 168 ; WX 500 ; N currency ; B -22 53 522 597 ; C 169 ; WX 214 ; N quotesingle ; B 132 421 241 666 ; C 170 ; WX 556 ; N quotedblleft ; B 166 436 514 666 ; C 171 ; WX 500 ; N guillemotleft ; B 53 37 445 403 ; C 172 ; WX 333 ; N guilsinglleft ; B 51 37 281 403 ; C 173 ; WX 333 ; N guilsinglright ; B 52 37 282 403 ; C 174 ; WX 500 ; N fi ; B -141 -207 481 681 ; C 175 ; WX 500 ; N fl ; B -141 -204 518 682 ; C 177 ; WX 500 ; N endash ; B -6 197 505 243 ; C 178 ; WX 500 ; N dagger ; B 101 -159 488 666 ; C 179 ; WX 500 ; N daggerdbl ; B 22 -143 491 666 ; C 180 ; WX 250 ; N periodcentered ; B 70 199 181 310 ; C 182 ; WX 523 ; N paragraph ; B 55 -123 616 653 ; C 183 ; WX 350 ; N bullet ; B 40 191 310 461 ; C 184 ; WX 333 ; N quotesinglbase ; B 44 -129 183 101 ; C 185 ; WX 556 ; N quotedblbase ; B 57 -129 405 101 ; C 186 ; WX 556 ; N quotedblright ; B 151 436 499 666 ; C 187 ; WX 500 ; N guillemotright ; B 55 37 447 403 ; C 188 ; WX 889 ; N ellipsis ; B 57 -11 762 100 ; C 189 ; WX 1000 ; N perthousand ; B 25 -19 1010 706 ; C 191 ; WX 500 ; N questiondown ; B 28 -205 368 471 ; C 193 ; WX 333 ; N grave ; B 121 492 311 664 ; C 194 ; WX 333 ; N acute ; B 180 494 403 664 ; C 195 ; WX 333 ; N circumflex ; B 91 492 385 661 ; C 196 ; WX 333 ; N tilde ; B 100 517 427 624 ; C 197 ; WX 333 ; N macron ; B 99 532 411 583 ; C 198 ; WX 333 ; N breve ; B 117 492 418 650 ; C 199 ; WX 333 ; N dotaccent ; B 207 548 305 646 ; C 200 ; WX 333 ; N dieresis ; B 107 548 405 646 ; C 202 ; WX 333 ; N ring ; B 155 492 355 691 ; C 203 ; WX 333 ; N cedilla ; B -30 -217 182 0 ; C 205 ; WX 333 ; N hungarumlaut ; B 93 494 486 664 ; C 206 ; WX 333 ; N ogonek ; B 20 -169 203 40 ; C 207 ; WX 333 ; N caron ; B 121 492 426 661 ; C 208 ; WX 889 ; N emdash ; B -6 197 894 243 ; C 225 ; WX 889 ; N AE ; B -27 0 911 653 ; C 227 ; WX 276 ; N ordfeminine ; B 42 406 352 676 ; C 232 ; WX 556 ; N Lslash ; B -8 0 559 653 ; C 233 ; WX 722 ; N Oslash ; B 60 -105 699 722 ; C 234 ; WX 944 ; N OE ; B 49 -8 964 666 ; C 235 ; WX 310 ; N ordmasculine ; B 67 406 362 676 ; C 241 ; WX 667 ; N ae ; B 23 -11 640 441 ; C 245 ; WX 278 ; N dotlessi ; B 49 -11 235 441 ; C 248 ; WX 278 ; N lslash ; B 41 -11 312 683 ; C 249 ; WX 500 ; N oslash ; B 28 -135 469 554 ; C 250 ; WX 667 ; N oe ; B 20 -12 646 441 ; C 251 ; WX 500 ; N germandbls ; B -168 -207 493 679 ; C -1 ; WX 333 ; N Idieresis ; B -8 0 435 818 ; C -1 ; WX 444 ; N eacute ; B 31 -11 459 664 ; C -1 ; WX 500 ; N abreve ; B 17 -11 502 650 ; C -1 ; WX 500 ; N uhungarumlaut ; B 42 -11 580 664 ; C -1 ; WX 444 ; N ecaron ; B 31 -11 482 661 ; C -1 ; WX 556 ; N Ydieresis ; B 78 0 633 818 ; C -1 ; WX 675 ; N divide ; B 86 -11 590 517 ; C -1 ; WX 556 ; N Yacute ; B 78 0 633 876 ; C -1 ; WX 611 ; N Acircumflex ; B -51 0 564 873 ; C -1 ; WX 500 ; N aacute ; B 17 -11 487 664 ; C -1 ; WX 722 ; N Ucircumflex ; B 102 -18 765 873 ; C -1 ; WX 444 ; N yacute ; B -24 -206 459 664 ; C -1 ; WX 389 ; N scommaaccent ; B 16 -217 366 442 ; C -1 ; WX 444 ; N ecircumflex ; B 31 -11 441 661 ; C -1 ; WX 722 ; N Uring ; B 102 -18 765 883 ; C -1 ; WX 722 ; N Udieresis ; B 102 -18 765 818 ; C -1 ; WX 500 ; N aogonek ; B 17 -169 476 441 ; C -1 ; WX 722 ; N Uacute ; B 102 -18 765 876 ; C -1 ; WX 500 ; N uogonek ; B 42 -169 477 441 ; C -1 ; WX 611 ; N Edieresis ; B -1 0 634 818 ; C -1 ; WX 722 ; N Dcroat ; B -8 0 700 653 ; C -1 ; WX 250 ; N commaaccent ; B 8 -217 133 -50 ; C -1 ; WX 760 ; N copyright ; B 41 -18 719 666 ; C -1 ; WX 611 ; N Emacron ; B -1 0 634 795 ; C -1 ; WX 444 ; N ccaron ; B 30 -11 482 661 ; C -1 ; WX 500 ; N aring ; B 17 -11 476 691 ; C -1 ; WX 667 ; N Ncommaaccent ; B -20 -187 727 653 ; C -1 ; WX 278 ; N lacute ; B 41 -11 395 876 ; C -1 ; WX 500 ; N agrave ; B 17 -11 476 664 ; C -1 ; WX 556 ; N Tcommaaccent ; B 59 -217 633 653 ; C -1 ; WX 667 ; N Cacute ; B 66 -18 690 876 ; C -1 ; WX 500 ; N atilde ; B 17 -11 511 624 ; C -1 ; WX 611 ; N Edotaccent ; B -1 0 634 818 ; C -1 ; WX 389 ; N scaron ; B 16 -13 454 661 ; C -1 ; WX 389 ; N scedilla ; B 16 -217 366 442 ; C -1 ; WX 278 ; N iacute ; B 49 -11 355 664 ; C -1 ; WX 471 ; N lozenge ; B 13 0 459 724 ; C -1 ; WX 611 ; N Rcaron ; B -13 0 588 873 ; C -1 ; WX 722 ; N Gcommaaccent ; B 52 -217 722 666 ; C -1 ; WX 500 ; N ucircumflex ; B 42 -11 475 661 ; C -1 ; WX 500 ; N acircumflex ; B 17 -11 476 661 ; C -1 ; WX 611 ; N Amacron ; B -51 0 564 795 ; C -1 ; WX 389 ; N rcaron ; B 45 0 434 661 ; C -1 ; WX 444 ; N ccedilla ; B 30 -217 425 441 ; C -1 ; WX 556 ; N Zdotaccent ; B -6 0 606 818 ; C -1 ; WX 611 ; N Thorn ; B 0 0 569 653 ; C -1 ; WX 722 ; N Omacron ; B 60 -18 699 795 ; C -1 ; WX 611 ; N Racute ; B -13 0 588 876 ; C -1 ; WX 500 ; N Sacute ; B 17 -18 508 876 ; C -1 ; WX 544 ; N dcaron ; B 15 -13 658 683 ; C -1 ; WX 722 ; N Umacron ; B 102 -18 765 795 ; C -1 ; WX 500 ; N uring ; B 42 -11 475 691 ; C -1 ; WX 300 ; N threesuperior ; B 43 268 339 676 ; C -1 ; WX 722 ; N Ograve ; B 60 -18 699 876 ; C -1 ; WX 611 ; N Agrave ; B -51 0 564 876 ; C -1 ; WX 611 ; N Abreve ; B -51 0 564 862 ; C -1 ; WX 675 ; N multiply ; B 93 8 582 497 ; C -1 ; WX 500 ; N uacute ; B 42 -11 477 664 ; C -1 ; WX 556 ; N Tcaron ; B 59 0 633 873 ; C -1 ; WX 476 ; N partialdiff ; B 17 -38 459 710 ; C -1 ; WX 444 ; N ydieresis ; B -24 -206 441 606 ; C -1 ; WX 667 ; N Nacute ; B -20 -15 727 876 ; C -1 ; WX 278 ; N icircumflex ; B 33 -11 327 661 ; C -1 ; WX 611 ; N Ecircumflex ; B -1 0 634 873 ; C -1 ; WX 500 ; N adieresis ; B 17 -11 489 606 ; C -1 ; WX 444 ; N edieresis ; B 31 -11 451 606 ; C -1 ; WX 444 ; N cacute ; B 30 -11 459 664 ; C -1 ; WX 500 ; N nacute ; B 14 -9 477 664 ; C -1 ; WX 500 ; N umacron ; B 42 -11 485 583 ; C -1 ; WX 667 ; N Ncaron ; B -20 -15 727 873 ; C -1 ; WX 333 ; N Iacute ; B -8 0 433 876 ; C -1 ; WX 675 ; N plusminus ; B 86 0 590 506 ; C -1 ; WX 275 ; N brokenbar ; B 105 -142 171 708 ; C -1 ; WX 760 ; N registered ; B 41 -18 719 666 ; C -1 ; WX 722 ; N Gbreve ; B 52 -18 722 862 ; C -1 ; WX 333 ; N Idotaccent ; B -8 0 384 818 ; C -1 ; WX 600 ; N summation ; B 15 -10 585 706 ; C -1 ; WX 611 ; N Egrave ; B -1 0 634 876 ; C -1 ; WX 389 ; N racute ; B 45 0 431 664 ; C -1 ; WX 500 ; N omacron ; B 27 -11 495 583 ; C -1 ; WX 556 ; N Zacute ; B -6 0 606 876 ; C -1 ; WX 556 ; N Zcaron ; B -6 0 606 873 ; C -1 ; WX 549 ; N greaterequal ; B 26 0 523 658 ; C -1 ; WX 722 ; N Eth ; B -8 0 700 653 ; C -1 ; WX 667 ; N Ccedilla ; B 66 -217 689 666 ; C -1 ; WX 278 ; N lcommaaccent ; B 22 -217 279 683 ; C -1 ; WX 300 ; N tcaron ; B 37 -11 407 681 ; C -1 ; WX 444 ; N eogonek ; B 31 -169 412 441 ; C -1 ; WX 722 ; N Uogonek ; B 102 -184 765 653 ; C -1 ; WX 611 ; N Aacute ; B -51 0 564 876 ; C -1 ; WX 611 ; N Adieresis ; B -51 0 564 818 ; C -1 ; WX 444 ; N egrave ; B 31 -11 412 664 ; C -1 ; WX 389 ; N zacute ; B -2 -81 431 664 ; C -1 ; WX 278 ; N iogonek ; B 49 -169 264 654 ; C -1 ; WX 722 ; N Oacute ; B 60 -18 699 876 ; C -1 ; WX 500 ; N oacute ; B 27 -11 487 664 ; C -1 ; WX 500 ; N amacron ; B 17 -11 495 583 ; C -1 ; WX 389 ; N sacute ; B 16 -13 431 664 ; C -1 ; WX 278 ; N idieresis ; B 49 -11 352 606 ; C -1 ; WX 722 ; N Ocircumflex ; B 60 -18 699 873 ; C -1 ; WX 722 ; N Ugrave ; B 102 -18 765 876 ; C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; C -1 ; WX 500 ; N thorn ; B -75 -205 469 683 ; C -1 ; WX 300 ; N twosuperior ; B 33 271 324 676 ; C -1 ; WX 722 ; N Odieresis ; B 60 -18 699 818 ; C -1 ; WX 500 ; N mu ; B -30 -209 497 428 ; C -1 ; WX 278 ; N igrave ; B 49 -11 284 664 ; C -1 ; WX 500 ; N ohungarumlaut ; B 27 -11 590 664 ; C -1 ; WX 611 ; N Eogonek ; B -1 -169 634 653 ; C -1 ; WX 500 ; N dcroat ; B 15 -13 572 683 ; C -1 ; WX 750 ; N threequarters ; B 23 -10 736 676 ; C -1 ; WX 500 ; N Scedilla ; B 17 -217 508 667 ; C -1 ; WX 300 ; N lcaron ; B 41 -11 407 683 ; C -1 ; WX 667 ; N Kcommaaccent ; B 7 -217 722 653 ; C -1 ; WX 556 ; N Lacute ; B -8 0 559 876 ; C -1 ; WX 980 ; N trademark ; B 30 247 957 653 ; C -1 ; WX 444 ; N edotaccent ; B 31 -11 412 606 ; C -1 ; WX 333 ; N Igrave ; B -8 0 384 876 ; C -1 ; WX 333 ; N Imacron ; B -8 0 441 795 ; C -1 ; WX 611 ; N Lcaron ; B -8 0 586 653 ; C -1 ; WX 750 ; N onehalf ; B 34 -10 749 676 ; C -1 ; WX 549 ; N lessequal ; B 26 0 523 658 ; C -1 ; WX 500 ; N ocircumflex ; B 27 -11 468 661 ; C -1 ; WX 500 ; N ntilde ; B 14 -9 476 624 ; C -1 ; WX 722 ; N Uhungarumlaut ; B 102 -18 765 876 ; C -1 ; WX 611 ; N Eacute ; B -1 0 634 876 ; C -1 ; WX 444 ; N emacron ; B 31 -11 457 583 ; C -1 ; WX 500 ; N gbreve ; B 8 -206 487 650 ; C -1 ; WX 750 ; N onequarter ; B 33 -10 736 676 ; C -1 ; WX 500 ; N Scaron ; B 17 -18 520 873 ; C -1 ; WX 500 ; N Scommaaccent ; B 17 -217 508 667 ; C -1 ; WX 722 ; N Ohungarumlaut ; B 60 -18 699 876 ; C -1 ; WX 400 ; N degree ; B 101 390 387 676 ; C -1 ; WX 500 ; N ograve ; B 27 -11 468 664 ; C -1 ; WX 667 ; N Ccaron ; B 66 -18 689 873 ; C -1 ; WX 500 ; N ugrave ; B 42 -11 475 664 ; C -1 ; WX 453 ; N radical ; B 2 -60 452 768 ; C -1 ; WX 722 ; N Dcaron ; B -8 0 700 873 ; C -1 ; WX 389 ; N rcommaaccent ; B -3 -217 412 441 ; C -1 ; WX 667 ; N Ntilde ; B -20 -15 727 836 ; C -1 ; WX 500 ; N otilde ; B 27 -11 496 624 ; C -1 ; WX 611 ; N Rcommaaccent ; B -13 -187 588 653 ; C -1 ; WX 556 ; N Lcommaaccent ; B -8 -217 559 653 ; C -1 ; WX 611 ; N Atilde ; B -51 0 566 836 ; C -1 ; WX 611 ; N Aogonek ; B -51 -169 566 668 ; C -1 ; WX 611 ; N Aring ; B -51 0 564 883 ; C -1 ; WX 722 ; N Otilde ; B 60 -18 699 836 ; C -1 ; WX 389 ; N zdotaccent ; B -2 -81 380 606 ; C -1 ; WX 611 ; N Ecaron ; B -1 0 634 873 ; C -1 ; WX 333 ; N Iogonek ; B -8 -169 384 653 ; C -1 ; WX 444 ; N kcommaaccent ; B 14 -187 461 683 ; C -1 ; WX 675 ; N minus ; B 86 220 590 286 ; C -1 ; WX 333 ; N Icircumflex ; B -8 0 425 873 ; C -1 ; WX 500 ; N ncaron ; B 14 -9 510 661 ; C -1 ; WX 278 ; N tcommaaccent ; B 2 -217 296 546 ; C -1 ; WX 675 ; N logicalnot ; B 86 108 590 386 ; C -1 ; WX 500 ; N odieresis ; B 27 -11 489 606 ; C -1 ; WX 500 ; N udieresis ; B 42 -11 479 606 ; C -1 ; WX 549 ; N notequal ; B 12 -29 537 541 ; C -1 ; WX 500 ; N gcommaaccent ; B 8 -206 472 706 ; C -1 ; WX 500 ; N eth ; B 27 -11 482 683 ; C -1 ; WX 389 ; N zcaron ; B -2 -81 434 661 ; C -1 ; WX 500 ; N ncommaaccent ; B 14 -187 474 441 ; C -1 ; WX 300 ; N onesuperior ; B 43 271 284 676 ; C -1 ; WX 278 ; N imacron ; B 46 -11 311 583 ; C -1 ; WX 500 ; N Euro ; B 0 0 0 0 ; EndCharMetrics StartKernData StartKernPairs 2321 KPX A C -30 KPX A Cacute -30 KPX A Ccaron -30 KPX A Ccedilla -30 KPX A G -35 KPX A Gbreve -35 KPX A Gcommaaccent -35 KPX A O -40 KPX A Oacute -40 KPX A Ocircumflex -40 KPX A Odieresis -40 KPX A Ograve -40 KPX A Ohungarumlaut -40 KPX A Omacron -40 KPX A Oslash -40 KPX A Otilde -40 KPX A Q -40 KPX A T -37 KPX A Tcaron -37 KPX A Tcommaaccent -37 KPX A U -50 KPX A Uacute -50 KPX A Ucircumflex -50 KPX A Udieresis -50 KPX A Ugrave -50 KPX A Uhungarumlaut -50 KPX A Umacron -50 KPX A Uogonek -50 KPX A Uring -50 KPX A V -105 KPX A W -95 KPX A Y -55 KPX A Yacute -55 KPX A Ydieresis -55 KPX A quoteright -37 KPX A u -20 KPX A uacute -20 KPX A ucircumflex -20 KPX A udieresis -20 KPX A ugrave -20 KPX A uhungarumlaut -20 KPX A umacron -20 KPX A uogonek -20 KPX A uring -20 KPX A v -55 KPX A w -55 KPX A y -55 KPX A yacute -55 KPX A ydieresis -55 KPX Aacute C -30 KPX Aacute Cacute -30 KPX Aacute Ccaron -30 KPX Aacute Ccedilla -30 KPX Aacute G -35 KPX Aacute Gbreve -35 KPX Aacute Gcommaaccent -35 KPX Aacute O -40 KPX Aacute Oacute -40 KPX Aacute Ocircumflex -40 KPX Aacute Odieresis -40 KPX Aacute Ograve -40 KPX Aacute Ohungarumlaut -40 KPX Aacute Omacron -40 KPX Aacute Oslash -40 KPX Aacute Otilde -40 KPX Aacute Q -40 KPX Aacute T -37 KPX Aacute Tcaron -37 KPX Aacute Tcommaaccent -37 KPX Aacute U -50 KPX Aacute Uacute -50 KPX Aacute Ucircumflex -50 KPX Aacute Udieresis -50 KPX Aacute Ugrave -50 KPX Aacute Uhungarumlaut -50 KPX Aacute Umacron -50 KPX Aacute Uogonek -50 KPX Aacute Uring -50 KPX Aacute V -105 KPX Aacute W -95 KPX Aacute Y -55 KPX Aacute Yacute -55 KPX Aacute Ydieresis -55 KPX Aacute quoteright -37 KPX Aacute u -20 KPX Aacute uacute -20 KPX Aacute ucircumflex -20 KPX Aacute udieresis -20 KPX Aacute ugrave -20 KPX Aacute uhungarumlaut -20 KPX Aacute umacron -20 KPX Aacute uogonek -20 KPX Aacute uring -20 KPX Aacute v -55 KPX Aacute w -55 KPX Aacute y -55 KPX Aacute yacute -55 KPX Aacute ydieresis -55 KPX Abreve C -30 KPX Abreve Cacute -30 KPX Abreve Ccaron -30 KPX Abreve Ccedilla -30 KPX Abreve G -35 KPX Abreve Gbreve -35 KPX Abreve Gcommaaccent -35 KPX Abreve O -40 KPX Abreve Oacute -40 KPX Abreve Ocircumflex -40 KPX Abreve Odieresis -40 KPX Abreve Ograve -40 KPX Abreve Ohungarumlaut -40 KPX Abreve Omacron -40 KPX Abreve Oslash -40 KPX Abreve Otilde -40 KPX Abreve Q -40 KPX Abreve T -37 KPX Abreve Tcaron -37 KPX Abreve Tcommaaccent -37 KPX Abreve U -50 KPX Abreve Uacute -50 KPX Abreve Ucircumflex -50 KPX Abreve Udieresis -50 KPX Abreve Ugrave -50 KPX Abreve Uhungarumlaut -50 KPX Abreve Umacron -50 KPX Abreve Uogonek -50 KPX Abreve Uring -50 KPX Abreve V -105 KPX Abreve W -95 KPX Abreve Y -55 KPX Abreve Yacute -55 KPX Abreve Ydieresis -55 KPX Abreve quoteright -37 KPX Abreve u -20 KPX Abreve uacute -20 KPX Abreve ucircumflex -20 KPX Abreve udieresis -20 KPX Abreve ugrave -20 KPX Abreve uhungarumlaut -20 KPX Abreve umacron -20 KPX Abreve uogonek -20 KPX Abreve uring -20 KPX Abreve v -55 KPX Abreve w -55 KPX Abreve y -55 KPX Abreve yacute -55 KPX Abreve ydieresis -55 KPX Acircumflex C -30 KPX Acircumflex Cacute -30 KPX Acircumflex Ccaron -30 KPX Acircumflex Ccedilla -30 KPX Acircumflex G -35 KPX Acircumflex Gbreve -35 KPX Acircumflex Gcommaaccent -35 KPX Acircumflex O -40 KPX Acircumflex Oacute -40 KPX Acircumflex Ocircumflex -40 KPX Acircumflex Odieresis -40 KPX Acircumflex Ograve -40 KPX Acircumflex Ohungarumlaut -40 KPX Acircumflex Omacron -40 KPX Acircumflex Oslash -40 KPX Acircumflex Otilde -40 KPX Acircumflex Q -40 KPX Acircumflex T -37 KPX Acircumflex Tcaron -37 KPX Acircumflex Tcommaaccent -37 KPX Acircumflex U -50 KPX Acircumflex Uacute -50 KPX Acircumflex Ucircumflex -50 KPX Acircumflex Udieresis -50 KPX Acircumflex Ugrave -50 KPX Acircumflex Uhungarumlaut -50 KPX Acircumflex Umacron -50 KPX Acircumflex Uogonek -50 KPX Acircumflex Uring -50 KPX Acircumflex V -105 KPX Acircumflex W -95 KPX Acircumflex Y -55 KPX Acircumflex Yacute -55 KPX Acircumflex Ydieresis -55 KPX Acircumflex quoteright -37 KPX Acircumflex u -20 KPX Acircumflex uacute -20 KPX Acircumflex ucircumflex -20 KPX Acircumflex udieresis -20 KPX Acircumflex ugrave -20 KPX Acircumflex uhungarumlaut -20 KPX Acircumflex umacron -20 KPX Acircumflex uogonek -20 KPX Acircumflex uring -20 KPX Acircumflex v -55 KPX Acircumflex w -55 KPX Acircumflex y -55 KPX Acircumflex yacute -55 KPX Acircumflex ydieresis -55 KPX Adieresis C -30 KPX Adieresis Cacute -30 KPX Adieresis Ccaron -30 KPX Adieresis Ccedilla -30 KPX Adieresis G -35 KPX Adieresis Gbreve -35 KPX Adieresis Gcommaaccent -35 KPX Adieresis O -40 KPX Adieresis Oacute -40 KPX Adieresis Ocircumflex -40 KPX Adieresis Odieresis -40 KPX Adieresis Ograve -40 KPX Adieresis Ohungarumlaut -40 KPX Adieresis Omacron -40 KPX Adieresis Oslash -40 KPX Adieresis Otilde -40 KPX Adieresis Q -40 KPX Adieresis T -37 KPX Adieresis Tcaron -37 KPX Adieresis Tcommaaccent -37 KPX Adieresis U -50 KPX Adieresis Uacute -50 KPX Adieresis Ucircumflex -50 KPX Adieresis Udieresis -50 KPX Adieresis Ugrave -50 KPX Adieresis Uhungarumlaut -50 KPX Adieresis Umacron -50 KPX Adieresis Uogonek -50 KPX Adieresis Uring -50 KPX Adieresis V -105 KPX Adieresis W -95 KPX Adieresis Y -55 KPX Adieresis Yacute -55 KPX Adieresis Ydieresis -55 KPX Adieresis quoteright -37 KPX Adieresis u -20 KPX Adieresis uacute -20 KPX Adieresis ucircumflex -20 KPX Adieresis udieresis -20 KPX Adieresis ugrave -20 KPX Adieresis uhungarumlaut -20 KPX Adieresis umacron -20 KPX Adieresis uogonek -20 KPX Adieresis uring -20 KPX Adieresis v -55 KPX Adieresis w -55 KPX Adieresis y -55 KPX Adieresis yacute -55 KPX Adieresis ydieresis -55 KPX Agrave C -30 KPX Agrave Cacute -30 KPX Agrave Ccaron -30 KPX Agrave Ccedilla -30 KPX Agrave G -35 KPX Agrave Gbreve -35 KPX Agrave Gcommaaccent -35 KPX Agrave O -40 KPX Agrave Oacute -40 KPX Agrave Ocircumflex -40 KPX Agrave Odieresis -40 KPX Agrave Ograve -40 KPX Agrave Ohungarumlaut -40 KPX Agrave Omacron -40 KPX Agrave Oslash -40 KPX Agrave Otilde -40 KPX Agrave Q -40 KPX Agrave T -37 KPX Agrave Tcaron -37 KPX Agrave Tcommaaccent -37 KPX Agrave U -50 KPX Agrave Uacute -50 KPX Agrave Ucircumflex -50 KPX Agrave Udieresis -50 KPX Agrave Ugrave -50 KPX Agrave Uhungarumlaut -50 KPX Agrave Umacron -50 KPX Agrave Uogonek -50 KPX Agrave Uring -50 KPX Agrave V -105 KPX Agrave W -95 KPX Agrave Y -55 KPX Agrave Yacute -55 KPX Agrave Ydieresis -55 KPX Agrave quoteright -37 KPX Agrave u -20 KPX Agrave uacute -20 KPX Agrave ucircumflex -20 KPX Agrave udieresis -20 KPX Agrave ugrave -20 KPX Agrave uhungarumlaut -20 KPX Agrave umacron -20 KPX Agrave uogonek -20 KPX Agrave uring -20 KPX Agrave v -55 KPX Agrave w -55 KPX Agrave y -55 KPX Agrave yacute -55 KPX Agrave ydieresis -55 KPX Amacron C -30 KPX Amacron Cacute -30 KPX Amacron Ccaron -30 KPX Amacron Ccedilla -30 KPX Amacron G -35 KPX Amacron Gbreve -35 KPX Amacron Gcommaaccent -35 KPX Amacron O -40 KPX Amacron Oacute -40 KPX Amacron Ocircumflex -40 KPX Amacron Odieresis -40 KPX Amacron Ograve -40 KPX Amacron Ohungarumlaut -40 KPX Amacron Omacron -40 KPX Amacron Oslash -40 KPX Amacron Otilde -40 KPX Amacron Q -40 KPX Amacron T -37 KPX Amacron Tcaron -37 KPX Amacron Tcommaaccent -37 KPX Amacron U -50 KPX Amacron Uacute -50 KPX Amacron Ucircumflex -50 KPX Amacron Udieresis -50 KPX Amacron Ugrave -50 KPX Amacron Uhungarumlaut -50 KPX Amacron Umacron -50 KPX Amacron Uogonek -50 KPX Amacron Uring -50 KPX Amacron V -105 KPX Amacron W -95 KPX Amacron Y -55 KPX Amacron Yacute -55 KPX Amacron Ydieresis -55 KPX Amacron quoteright -37 KPX Amacron u -20 KPX Amacron uacute -20 KPX Amacron ucircumflex -20 KPX Amacron udieresis -20 KPX Amacron ugrave -20 KPX Amacron uhungarumlaut -20 KPX Amacron umacron -20 KPX Amacron uogonek -20 KPX Amacron uring -20 KPX Amacron v -55 KPX Amacron w -55 KPX Amacron y -55 KPX Amacron yacute -55 KPX Amacron ydieresis -55 KPX Aogonek C -30 KPX Aogonek Cacute -30 KPX Aogonek Ccaron -30 KPX Aogonek Ccedilla -30 KPX Aogonek G -35 KPX Aogonek Gbreve -35 KPX Aogonek Gcommaaccent -35 KPX Aogonek O -40 KPX Aogonek Oacute -40 KPX Aogonek Ocircumflex -40 KPX Aogonek Odieresis -40 KPX Aogonek Ograve -40 KPX Aogonek Ohungarumlaut -40 KPX Aogonek Omacron -40 KPX Aogonek Oslash -40 KPX Aogonek Otilde -40 KPX Aogonek Q -40 KPX Aogonek T -37 KPX Aogonek Tcaron -37 KPX Aogonek Tcommaaccent -37 KPX Aogonek U -50 KPX Aogonek Uacute -50 KPX Aogonek Ucircumflex -50 KPX Aogonek Udieresis -50 KPX Aogonek Ugrave -50 KPX Aogonek Uhungarumlaut -50 KPX Aogonek Umacron -50 KPX Aogonek Uogonek -50 KPX Aogonek Uring -50 KPX Aogonek V -105 KPX Aogonek W -95 KPX Aogonek Y -55 KPX Aogonek Yacute -55 KPX Aogonek Ydieresis -55 KPX Aogonek quoteright -37 KPX Aogonek u -20 KPX Aogonek uacute -20 KPX Aogonek ucircumflex -20 KPX Aogonek udieresis -20 KPX Aogonek ugrave -20 KPX Aogonek uhungarumlaut -20 KPX Aogonek umacron -20 KPX Aogonek uogonek -20 KPX Aogonek uring -20 KPX Aogonek v -55 KPX Aogonek w -55 KPX Aogonek y -55 KPX Aogonek yacute -55 KPX Aogonek ydieresis -55 KPX Aring C -30 KPX Aring Cacute -30 KPX Aring Ccaron -30 KPX Aring Ccedilla -30 KPX Aring G -35 KPX Aring Gbreve -35 KPX Aring Gcommaaccent -35 KPX Aring O -40 KPX Aring Oacute -40 KPX Aring Ocircumflex -40 KPX Aring Odieresis -40 KPX Aring Ograve -40 KPX Aring Ohungarumlaut -40 KPX Aring Omacron -40 KPX Aring Oslash -40 KPX Aring Otilde -40 KPX Aring Q -40 KPX Aring T -37 KPX Aring Tcaron -37 KPX Aring Tcommaaccent -37 KPX Aring U -50 KPX Aring Uacute -50 KPX Aring Ucircumflex -50 KPX Aring Udieresis -50 KPX Aring Ugrave -50 KPX Aring Uhungarumlaut -50 KPX Aring Umacron -50 KPX Aring Uogonek -50 KPX Aring Uring -50 KPX Aring V -105 KPX Aring W -95 KPX Aring Y -55 KPX Aring Yacute -55 KPX Aring Ydieresis -55 KPX Aring quoteright -37 KPX Aring u -20 KPX Aring uacute -20 KPX Aring ucircumflex -20 KPX Aring udieresis -20 KPX Aring ugrave -20 KPX Aring uhungarumlaut -20 KPX Aring umacron -20 KPX Aring uogonek -20 KPX Aring uring -20 KPX Aring v -55 KPX Aring w -55 KPX Aring y -55 KPX Aring yacute -55 KPX Aring ydieresis -55 KPX Atilde C -30 KPX Atilde Cacute -30 KPX Atilde Ccaron -30 KPX Atilde Ccedilla -30 KPX Atilde G -35 KPX Atilde Gbreve -35 KPX Atilde Gcommaaccent -35 KPX Atilde O -40 KPX Atilde Oacute -40 KPX Atilde Ocircumflex -40 KPX Atilde Odieresis -40 KPX Atilde Ograve -40 KPX Atilde Ohungarumlaut -40 KPX Atilde Omacron -40 KPX Atilde Oslash -40 KPX Atilde Otilde -40 KPX Atilde Q -40 KPX Atilde T -37 KPX Atilde Tcaron -37 KPX Atilde Tcommaaccent -37 KPX Atilde U -50 KPX Atilde Uacute -50 KPX Atilde Ucircumflex -50 KPX Atilde Udieresis -50 KPX Atilde Ugrave -50 KPX Atilde Uhungarumlaut -50 KPX Atilde Umacron -50 KPX Atilde Uogonek -50 KPX Atilde Uring -50 KPX Atilde V -105 KPX Atilde W -95 KPX Atilde Y -55 KPX Atilde Yacute -55 KPX Atilde Ydieresis -55 KPX Atilde quoteright -37 KPX Atilde u -20 KPX Atilde uacute -20 KPX Atilde ucircumflex -20 KPX Atilde udieresis -20 KPX Atilde ugrave -20 KPX Atilde uhungarumlaut -20 KPX Atilde umacron -20 KPX Atilde uogonek -20 KPX Atilde uring -20 KPX Atilde v -55 KPX Atilde w -55 KPX Atilde y -55 KPX Atilde yacute -55 KPX Atilde ydieresis -55 KPX B A -25 KPX B Aacute -25 KPX B Abreve -25 KPX B Acircumflex -25 KPX B Adieresis -25 KPX B Agrave -25 KPX B Amacron -25 KPX B Aogonek -25 KPX B Aring -25 KPX B Atilde -25 KPX B U -10 KPX B Uacute -10 KPX B Ucircumflex -10 KPX B Udieresis -10 KPX B Ugrave -10 KPX B Uhungarumlaut -10 KPX B Umacron -10 KPX B Uogonek -10 KPX B Uring -10 KPX D A -35 KPX D Aacute -35 KPX D Abreve -35 KPX D Acircumflex -35 KPX D Adieresis -35 KPX D Agrave -35 KPX D Amacron -35 KPX D Aogonek -35 KPX D Aring -35 KPX D Atilde -35 KPX D V -40 KPX D W -40 KPX D Y -40 KPX D Yacute -40 KPX D Ydieresis -40 KPX Dcaron A -35 KPX Dcaron Aacute -35 KPX Dcaron Abreve -35 KPX Dcaron Acircumflex -35 KPX Dcaron Adieresis -35 KPX Dcaron Agrave -35 KPX Dcaron Amacron -35 KPX Dcaron Aogonek -35 KPX Dcaron Aring -35 KPX Dcaron Atilde -35 KPX Dcaron V -40 KPX Dcaron W -40 KPX Dcaron Y -40 KPX Dcaron Yacute -40 KPX Dcaron Ydieresis -40 KPX Dcroat A -35 KPX Dcroat Aacute -35 KPX Dcroat Abreve -35 KPX Dcroat Acircumflex -35 KPX Dcroat Adieresis -35 KPX Dcroat Agrave -35 KPX Dcroat Amacron -35 KPX Dcroat Aogonek -35 KPX Dcroat Aring -35 KPX Dcroat Atilde -35 KPX Dcroat V -40 KPX Dcroat W -40 KPX Dcroat Y -40 KPX Dcroat Yacute -40 KPX Dcroat Ydieresis -40 KPX F A -115 KPX F Aacute -115 KPX F Abreve -115 KPX F Acircumflex -115 KPX F Adieresis -115 KPX F Agrave -115 KPX F Amacron -115 KPX F Aogonek -115 KPX F Aring -115 KPX F Atilde -115 KPX F a -75 KPX F aacute -75 KPX F abreve -75 KPX F acircumflex -75 KPX F adieresis -75 KPX F agrave -75 KPX F amacron -75 KPX F aogonek -75 KPX F aring -75 KPX F atilde -75 KPX F comma -135 KPX F e -75 KPX F eacute -75 KPX F ecaron -75 KPX F ecircumflex -75 KPX F edieresis -75 KPX F edotaccent -75 KPX F egrave -75 KPX F emacron -75 KPX F eogonek -75 KPX F i -45 KPX F iacute -45 KPX F icircumflex -45 KPX F idieresis -45 KPX F igrave -45 KPX F imacron -45 KPX F iogonek -45 KPX F o -105 KPX F oacute -105 KPX F ocircumflex -105 KPX F odieresis -105 KPX F ograve -105 KPX F ohungarumlaut -105 KPX F omacron -105 KPX F oslash -105 KPX F otilde -105 KPX F period -135 KPX F r -55 KPX F racute -55 KPX F rcaron -55 KPX F rcommaaccent -55 KPX J A -40 KPX J Aacute -40 KPX J Abreve -40 KPX J Acircumflex -40 KPX J Adieresis -40 KPX J Agrave -40 KPX J Amacron -40 KPX J Aogonek -40 KPX J Aring -40 KPX J Atilde -40 KPX J a -35 KPX J aacute -35 KPX J abreve -35 KPX J acircumflex -35 KPX J adieresis -35 KPX J agrave -35 KPX J amacron -35 KPX J aogonek -35 KPX J aring -35 KPX J atilde -35 KPX J comma -25 KPX J e -25 KPX J eacute -25 KPX J ecaron -25 KPX J ecircumflex -25 KPX J edieresis -25 KPX J edotaccent -25 KPX J egrave -25 KPX J emacron -25 KPX J eogonek -25 KPX J o -25 KPX J oacute -25 KPX J ocircumflex -25 KPX J odieresis -25 KPX J ograve -25 KPX J ohungarumlaut -25 KPX J omacron -25 KPX J oslash -25 KPX J otilde -25 KPX J period -25 KPX J u -35 KPX J uacute -35 KPX J ucircumflex -35 KPX J udieresis -35 KPX J ugrave -35 KPX J uhungarumlaut -35 KPX J umacron -35 KPX J uogonek -35 KPX J uring -35 KPX K O -50 KPX K Oacute -50 KPX K Ocircumflex -50 KPX K Odieresis -50 KPX K Ograve -50 KPX K Ohungarumlaut -50 KPX K Omacron -50 KPX K Oslash -50 KPX K Otilde -50 KPX K e -35 KPX K eacute -35 KPX K ecaron -35 KPX K ecircumflex -35 KPX K edieresis -35 KPX K edotaccent -35 KPX K egrave -35 KPX K emacron -35 KPX K eogonek -35 KPX K o -40 KPX K oacute -40 KPX K ocircumflex -40 KPX K odieresis -40 KPX K ograve -40 KPX K ohungarumlaut -40 KPX K omacron -40 KPX K oslash -40 KPX K otilde -40 KPX K u -40 KPX K uacute -40 KPX K ucircumflex -40 KPX K udieresis -40 KPX K ugrave -40 KPX K uhungarumlaut -40 KPX K umacron -40 KPX K uogonek -40 KPX K uring -40 KPX K y -40 KPX K yacute -40 KPX K ydieresis -40 KPX Kcommaaccent O -50 KPX Kcommaaccent Oacute -50 KPX Kcommaaccent Ocircumflex -50 KPX Kcommaaccent Odieresis -50 KPX Kcommaaccent Ograve -50 KPX Kcommaaccent Ohungarumlaut -50 KPX Kcommaaccent Omacron -50 KPX Kcommaaccent Oslash -50 KPX Kcommaaccent Otilde -50 KPX Kcommaaccent e -35 KPX Kcommaaccent eacute -35 KPX Kcommaaccent ecaron -35 KPX Kcommaaccent ecircumflex -35 KPX Kcommaaccent edieresis -35 KPX Kcommaaccent edotaccent -35 KPX Kcommaaccent egrave -35 KPX Kcommaaccent emacron -35 KPX Kcommaaccent eogonek -35 KPX Kcommaaccent o -40 KPX Kcommaaccent oacute -40 KPX Kcommaaccent ocircumflex -40 KPX Kcommaaccent odieresis -40 KPX Kcommaaccent ograve -40 KPX Kcommaaccent ohungarumlaut -40 KPX Kcommaaccent omacron -40 KPX Kcommaaccent oslash -40 KPX Kcommaaccent otilde -40 KPX Kcommaaccent u -40 KPX Kcommaaccent uacute -40 KPX Kcommaaccent ucircumflex -40 KPX Kcommaaccent udieresis -40 KPX Kcommaaccent ugrave -40 KPX Kcommaaccent uhungarumlaut -40 KPX Kcommaaccent umacron -40 KPX Kcommaaccent uogonek -40 KPX Kcommaaccent uring -40 KPX Kcommaaccent y -40 KPX Kcommaaccent yacute -40 KPX Kcommaaccent ydieresis -40 KPX L T -20 KPX L Tcaron -20 KPX L Tcommaaccent -20 KPX L V -55 KPX L W -55 KPX L Y -20 KPX L Yacute -20 KPX L Ydieresis -20 KPX L quoteright -37 KPX L y -30 KPX L yacute -30 KPX L ydieresis -30 KPX Lacute T -20 KPX Lacute Tcaron -20 KPX Lacute Tcommaaccent -20 KPX Lacute V -55 KPX Lacute W -55 KPX Lacute Y -20 KPX Lacute Yacute -20 KPX Lacute Ydieresis -20 KPX Lacute quoteright -37 KPX Lacute y -30 KPX Lacute yacute -30 KPX Lacute ydieresis -30 KPX Lcommaaccent T -20 KPX Lcommaaccent Tcaron -20 KPX Lcommaaccent Tcommaaccent -20 KPX Lcommaaccent V -55 KPX Lcommaaccent W -55 KPX Lcommaaccent Y -20 KPX Lcommaaccent Yacute -20 KPX Lcommaaccent Ydieresis -20 KPX Lcommaaccent quoteright -37 KPX Lcommaaccent y -30 KPX Lcommaaccent yacute -30 KPX Lcommaaccent ydieresis -30 KPX Lslash T -20 KPX Lslash Tcaron -20 KPX Lslash Tcommaaccent -20 KPX Lslash V -55 KPX Lslash W -55 KPX Lslash Y -20 KPX Lslash Yacute -20 KPX Lslash Ydieresis -20 KPX Lslash quoteright -37 KPX Lslash y -30 KPX Lslash yacute -30 KPX Lslash ydieresis -30 KPX N A -27 KPX N Aacute -27 KPX N Abreve -27 KPX N Acircumflex -27 KPX N Adieresis -27 KPX N Agrave -27 KPX N Amacron -27 KPX N Aogonek -27 KPX N Aring -27 KPX N Atilde -27 KPX Nacute A -27 KPX Nacute Aacute -27 KPX Nacute Abreve -27 KPX Nacute Acircumflex -27 KPX Nacute Adieresis -27 KPX Nacute Agrave -27 KPX Nacute Amacron -27 KPX Nacute Aogonek -27 KPX Nacute Aring -27 KPX Nacute Atilde -27 KPX Ncaron A -27 KPX Ncaron Aacute -27 KPX Ncaron Abreve -27 KPX Ncaron Acircumflex -27 KPX Ncaron Adieresis -27 KPX Ncaron Agrave -27 KPX Ncaron Amacron -27 KPX Ncaron Aogonek -27 KPX Ncaron Aring -27 KPX Ncaron Atilde -27 KPX Ncommaaccent A -27 KPX Ncommaaccent Aacute -27 KPX Ncommaaccent Abreve -27 KPX Ncommaaccent Acircumflex -27 KPX Ncommaaccent Adieresis -27 KPX Ncommaaccent Agrave -27 KPX Ncommaaccent Amacron -27 KPX Ncommaaccent Aogonek -27 KPX Ncommaaccent Aring -27 KPX Ncommaaccent Atilde -27 KPX Ntilde A -27 KPX Ntilde Aacute -27 KPX Ntilde Abreve -27 KPX Ntilde Acircumflex -27 KPX Ntilde Adieresis -27 KPX Ntilde Agrave -27 KPX Ntilde Amacron -27 KPX Ntilde Aogonek -27 KPX Ntilde Aring -27 KPX Ntilde Atilde -27 KPX O A -55 KPX O Aacute -55 KPX O Abreve -55 KPX O Acircumflex -55 KPX O Adieresis -55 KPX O Agrave -55 KPX O Amacron -55 KPX O Aogonek -55 KPX O Aring -55 KPX O Atilde -55 KPX O T -40 KPX O Tcaron -40 KPX O Tcommaaccent -40 KPX O V -50 KPX O W -50 KPX O X -40 KPX O Y -50 KPX O Yacute -50 KPX O Ydieresis -50 KPX Oacute A -55 KPX Oacute Aacute -55 KPX Oacute Abreve -55 KPX Oacute Acircumflex -55 KPX Oacute Adieresis -55 KPX Oacute Agrave -55 KPX Oacute Amacron -55 KPX Oacute Aogonek -55 KPX Oacute Aring -55 KPX Oacute Atilde -55 KPX Oacute T -40 KPX Oacute Tcaron -40 KPX Oacute Tcommaaccent -40 KPX Oacute V -50 KPX Oacute W -50 KPX Oacute X -40 KPX Oacute Y -50 KPX Oacute Yacute -50 KPX Oacute Ydieresis -50 KPX Ocircumflex A -55 KPX Ocircumflex Aacute -55 KPX Ocircumflex Abreve -55 KPX Ocircumflex Acircumflex -55 KPX Ocircumflex Adieresis -55 KPX Ocircumflex Agrave -55 KPX Ocircumflex Amacron -55 KPX Ocircumflex Aogonek -55 KPX Ocircumflex Aring -55 KPX Ocircumflex Atilde -55 KPX Ocircumflex T -40 KPX Ocircumflex Tcaron -40 KPX Ocircumflex Tcommaaccent -40 KPX Ocircumflex V -50 KPX Ocircumflex W -50 KPX Ocircumflex X -40 KPX Ocircumflex Y -50 KPX Ocircumflex Yacute -50 KPX Ocircumflex Ydieresis -50 KPX Odieresis A -55 KPX Odieresis Aacute -55 KPX Odieresis Abreve -55 KPX Odieresis Acircumflex -55 KPX Odieresis Adieresis -55 KPX Odieresis Agrave -55 KPX Odieresis Amacron -55 KPX Odieresis Aogonek -55 KPX Odieresis Aring -55 KPX Odieresis Atilde -55 KPX Odieresis T -40 KPX Odieresis Tcaron -40 KPX Odieresis Tcommaaccent -40 KPX Odieresis V -50 KPX Odieresis W -50 KPX Odieresis X -40 KPX Odieresis Y -50 KPX Odieresis Yacute -50 KPX Odieresis Ydieresis -50 KPX Ograve A -55 KPX Ograve Aacute -55 KPX Ograve Abreve -55 KPX Ograve Acircumflex -55 KPX Ograve Adieresis -55 KPX Ograve Agrave -55 KPX Ograve Amacron -55 KPX Ograve Aogonek -55 KPX Ograve Aring -55 KPX Ograve Atilde -55 KPX Ograve T -40 KPX Ograve Tcaron -40 KPX Ograve Tcommaaccent -40 KPX Ograve V -50 KPX Ograve W -50 KPX Ograve X -40 KPX Ograve Y -50 KPX Ograve Yacute -50 KPX Ograve Ydieresis -50 KPX Ohungarumlaut A -55 KPX Ohungarumlaut Aacute -55 KPX Ohungarumlaut Abreve -55 KPX Ohungarumlaut Acircumflex -55 KPX Ohungarumlaut Adieresis -55 KPX Ohungarumlaut Agrave -55 KPX Ohungarumlaut Amacron -55 KPX Ohungarumlaut Aogonek -55 KPX Ohungarumlaut Aring -55 KPX Ohungarumlaut Atilde -55 KPX Ohungarumlaut T -40 KPX Ohungarumlaut Tcaron -40 KPX Ohungarumlaut Tcommaaccent -40 KPX Ohungarumlaut V -50 KPX Ohungarumlaut W -50 KPX Ohungarumlaut X -40 KPX Ohungarumlaut Y -50 KPX Ohungarumlaut Yacute -50 KPX Ohungarumlaut Ydieresis -50 KPX Omacron A -55 KPX Omacron Aacute -55 KPX Omacron Abreve -55 KPX Omacron Acircumflex -55 KPX Omacron Adieresis -55 KPX Omacron Agrave -55 KPX Omacron Amacron -55 KPX Omacron Aogonek -55 KPX Omacron Aring -55 KPX Omacron Atilde -55 KPX Omacron T -40 KPX Omacron Tcaron -40 KPX Omacron Tcommaaccent -40 KPX Omacron V -50 KPX Omacron W -50 KPX Omacron X -40 KPX Omacron Y -50 KPX Omacron Yacute -50 KPX Omacron Ydieresis -50 KPX Oslash A -55 KPX Oslash Aacute -55 KPX Oslash Abreve -55 KPX Oslash Acircumflex -55 KPX Oslash Adieresis -55 KPX Oslash Agrave -55 KPX Oslash Amacron -55 KPX Oslash Aogonek -55 KPX Oslash Aring -55 KPX Oslash Atilde -55 KPX Oslash T -40 KPX Oslash Tcaron -40 KPX Oslash Tcommaaccent -40 KPX Oslash V -50 KPX Oslash W -50 KPX Oslash X -40 KPX Oslash Y -50 KPX Oslash Yacute -50 KPX Oslash Ydieresis -50 KPX Otilde A -55 KPX Otilde Aacute -55 KPX Otilde Abreve -55 KPX Otilde Acircumflex -55 KPX Otilde Adieresis -55 KPX Otilde Agrave -55 KPX Otilde Amacron -55 KPX Otilde Aogonek -55 KPX Otilde Aring -55 KPX Otilde Atilde -55 KPX Otilde T -40 KPX Otilde Tcaron -40 KPX Otilde Tcommaaccent -40 KPX Otilde V -50 KPX Otilde W -50 KPX Otilde X -40 KPX Otilde Y -50 KPX Otilde Yacute -50 KPX Otilde Ydieresis -50 KPX P A -90 KPX P Aacute -90 KPX P Abreve -90 KPX P Acircumflex -90 KPX P Adieresis -90 KPX P Agrave -90 KPX P Amacron -90 KPX P Aogonek -90 KPX P Aring -90 KPX P Atilde -90 KPX P a -80 KPX P aacute -80 KPX P abreve -80 KPX P acircumflex -80 KPX P adieresis -80 KPX P agrave -80 KPX P amacron -80 KPX P aogonek -80 KPX P aring -80 KPX P atilde -80 KPX P comma -135 KPX P e -80 KPX P eacute -80 KPX P ecaron -80 KPX P ecircumflex -80 KPX P edieresis -80 KPX P edotaccent -80 KPX P egrave -80 KPX P emacron -80 KPX P eogonek -80 KPX P o -80 KPX P oacute -80 KPX P ocircumflex -80 KPX P odieresis -80 KPX P ograve -80 KPX P ohungarumlaut -80 KPX P omacron -80 KPX P oslash -80 KPX P otilde -80 KPX P period -135 KPX Q U -10 KPX Q Uacute -10 KPX Q Ucircumflex -10 KPX Q Udieresis -10 KPX Q Ugrave -10 KPX Q Uhungarumlaut -10 KPX Q Umacron -10 KPX Q Uogonek -10 KPX Q Uring -10 KPX R O -40 KPX R Oacute -40 KPX R Ocircumflex -40 KPX R Odieresis -40 KPX R Ograve -40 KPX R Ohungarumlaut -40 KPX R Omacron -40 KPX R Oslash -40 KPX R Otilde -40 KPX R U -40 KPX R Uacute -40 KPX R Ucircumflex -40 KPX R Udieresis -40 KPX R Ugrave -40 KPX R Uhungarumlaut -40 KPX R Umacron -40 KPX R Uogonek -40 KPX R Uring -40 KPX R V -18 KPX R W -18 KPX R Y -18 KPX R Yacute -18 KPX R Ydieresis -18 KPX Racute O -40 KPX Racute Oacute -40 KPX Racute Ocircumflex -40 KPX Racute Odieresis -40 KPX Racute Ograve -40 KPX Racute Ohungarumlaut -40 KPX Racute Omacron -40 KPX Racute Oslash -40 KPX Racute Otilde -40 KPX Racute U -40 KPX Racute Uacute -40 KPX Racute Ucircumflex -40 KPX Racute Udieresis -40 KPX Racute Ugrave -40 KPX Racute Uhungarumlaut -40 KPX Racute Umacron -40 KPX Racute Uogonek -40 KPX Racute Uring -40 KPX Racute V -18 KPX Racute W -18 KPX Racute Y -18 KPX Racute Yacute -18 KPX Racute Ydieresis -18 KPX Rcaron O -40 KPX Rcaron Oacute -40 KPX Rcaron Ocircumflex -40 KPX Rcaron Odieresis -40 KPX Rcaron Ograve -40 KPX Rcaron Ohungarumlaut -40 KPX Rcaron Omacron -40 KPX Rcaron Oslash -40 KPX Rcaron Otilde -40 KPX Rcaron U -40 KPX Rcaron Uacute -40 KPX Rcaron Ucircumflex -40 KPX Rcaron Udieresis -40 KPX Rcaron Ugrave -40 KPX Rcaron Uhungarumlaut -40 KPX Rcaron Umacron -40 KPX Rcaron Uogonek -40 KPX Rcaron Uring -40 KPX Rcaron V -18 KPX Rcaron W -18 KPX Rcaron Y -18 KPX Rcaron Yacute -18 KPX Rcaron Ydieresis -18 KPX Rcommaaccent O -40 KPX Rcommaaccent Oacute -40 KPX Rcommaaccent Ocircumflex -40 KPX Rcommaaccent Odieresis -40 KPX Rcommaaccent Ograve -40 KPX Rcommaaccent Ohungarumlaut -40 KPX Rcommaaccent Omacron -40 KPX Rcommaaccent Oslash -40 KPX Rcommaaccent Otilde -40 KPX Rcommaaccent U -40 KPX Rcommaaccent Uacute -40 KPX Rcommaaccent Ucircumflex -40 KPX Rcommaaccent Udieresis -40 KPX Rcommaaccent Ugrave -40 KPX Rcommaaccent Uhungarumlaut -40 KPX Rcommaaccent Umacron -40 KPX Rcommaaccent Uogonek -40 KPX Rcommaaccent Uring -40 KPX Rcommaaccent V -18 KPX Rcommaaccent W -18 KPX Rcommaaccent Y -18 KPX Rcommaaccent Yacute -18 KPX Rcommaaccent Ydieresis -18 KPX T A -50 KPX T Aacute -50 KPX T Abreve -50 KPX T Acircumflex -50 KPX T Adieresis -50 KPX T Agrave -50 KPX T Amacron -50 KPX T Aogonek -50 KPX T Aring -50 KPX T Atilde -50 KPX T O -18 KPX T Oacute -18 KPX T Ocircumflex -18 KPX T Odieresis -18 KPX T Ograve -18 KPX T Ohungarumlaut -18 KPX T Omacron -18 KPX T Oslash -18 KPX T Otilde -18 KPX T a -92 KPX T aacute -92 KPX T abreve -92 KPX T acircumflex -92 KPX T adieresis -92 KPX T agrave -92 KPX T amacron -92 KPX T aogonek -92 KPX T aring -92 KPX T atilde -92 KPX T colon -55 KPX T comma -74 KPX T e -92 KPX T eacute -92 KPX T ecaron -92 KPX T ecircumflex -52 KPX T edieresis -52 KPX T edotaccent -92 KPX T egrave -52 KPX T emacron -52 KPX T eogonek -92 KPX T hyphen -74 KPX T i -55 KPX T iacute -55 KPX T iogonek -55 KPX T o -92 KPX T oacute -92 KPX T ocircumflex -92 KPX T odieresis -92 KPX T ograve -92 KPX T ohungarumlaut -92 KPX T omacron -92 KPX T oslash -92 KPX T otilde -92 KPX T period -74 KPX T r -55 KPX T racute -55 KPX T rcaron -55 KPX T rcommaaccent -55 KPX T semicolon -65 KPX T u -55 KPX T uacute -55 KPX T ucircumflex -55 KPX T udieresis -55 KPX T ugrave -55 KPX T uhungarumlaut -55 KPX T umacron -55 KPX T uogonek -55 KPX T uring -55 KPX T w -74 KPX T y -74 KPX T yacute -74 KPX T ydieresis -34 KPX Tcaron A -50 KPX Tcaron Aacute -50 KPX Tcaron Abreve -50 KPX Tcaron Acircumflex -50 KPX Tcaron Adieresis -50 KPX Tcaron Agrave -50 KPX Tcaron Amacron -50 KPX Tcaron Aogonek -50 KPX Tcaron Aring -50 KPX Tcaron Atilde -50 KPX Tcaron O -18 KPX Tcaron Oacute -18 KPX Tcaron Ocircumflex -18 KPX Tcaron Odieresis -18 KPX Tcaron Ograve -18 KPX Tcaron Ohungarumlaut -18 KPX Tcaron Omacron -18 KPX Tcaron Oslash -18 KPX Tcaron Otilde -18 KPX Tcaron a -92 KPX Tcaron aacute -92 KPX Tcaron abreve -92 KPX Tcaron acircumflex -92 KPX Tcaron adieresis -92 KPX Tcaron agrave -92 KPX Tcaron amacron -92 KPX Tcaron aogonek -92 KPX Tcaron aring -92 KPX Tcaron atilde -92 KPX Tcaron colon -55 KPX Tcaron comma -74 KPX Tcaron e -92 KPX Tcaron eacute -92 KPX Tcaron ecaron -92 KPX Tcaron ecircumflex -52 KPX Tcaron edieresis -52 KPX Tcaron edotaccent -92 KPX Tcaron egrave -52 KPX Tcaron emacron -52 KPX Tcaron eogonek -92 KPX Tcaron hyphen -74 KPX Tcaron i -55 KPX Tcaron iacute -55 KPX Tcaron iogonek -55 KPX Tcaron o -92 KPX Tcaron oacute -92 KPX Tcaron ocircumflex -92 KPX Tcaron odieresis -92 KPX Tcaron ograve -92 KPX Tcaron ohungarumlaut -92 KPX Tcaron omacron -92 KPX Tcaron oslash -92 KPX Tcaron otilde -92 KPX Tcaron period -74 KPX Tcaron r -55 KPX Tcaron racute -55 KPX Tcaron rcaron -55 KPX Tcaron rcommaaccent -55 KPX Tcaron semicolon -65 KPX Tcaron u -55 KPX Tcaron uacute -55 KPX Tcaron ucircumflex -55 KPX Tcaron udieresis -55 KPX Tcaron ugrave -55 KPX Tcaron uhungarumlaut -55 KPX Tcaron umacron -55 KPX Tcaron uogonek -55 KPX Tcaron uring -55 KPX Tcaron w -74 KPX Tcaron y -74 KPX Tcaron yacute -74 KPX Tcaron ydieresis -34 KPX Tcommaaccent A -50 KPX Tcommaaccent Aacute -50 KPX Tcommaaccent Abreve -50 KPX Tcommaaccent Acircumflex -50 KPX Tcommaaccent Adieresis -50 KPX Tcommaaccent Agrave -50 KPX Tcommaaccent Amacron -50 KPX Tcommaaccent Aogonek -50 KPX Tcommaaccent Aring -50 KPX Tcommaaccent Atilde -50 KPX Tcommaaccent O -18 KPX Tcommaaccent Oacute -18 KPX Tcommaaccent Ocircumflex -18 KPX Tcommaaccent Odieresis -18 KPX Tcommaaccent Ograve -18 KPX Tcommaaccent Ohungarumlaut -18 KPX Tcommaaccent Omacron -18 KPX Tcommaaccent Oslash -18 KPX Tcommaaccent Otilde -18 KPX Tcommaaccent a -92 KPX Tcommaaccent aacute -92 KPX Tcommaaccent abreve -92 KPX Tcommaaccent acircumflex -92 KPX Tcommaaccent adieresis -92 KPX Tcommaaccent agrave -92 KPX Tcommaaccent amacron -92 KPX Tcommaaccent aogonek -92 KPX Tcommaaccent aring -92 KPX Tcommaaccent atilde -92 KPX Tcommaaccent colon -55 KPX Tcommaaccent comma -74 KPX Tcommaaccent e -92 KPX Tcommaaccent eacute -92 KPX Tcommaaccent ecaron -92 KPX Tcommaaccent ecircumflex -52 KPX Tcommaaccent edieresis -52 KPX Tcommaaccent edotaccent -92 KPX Tcommaaccent egrave -52 KPX Tcommaaccent emacron -52 KPX Tcommaaccent eogonek -92 KPX Tcommaaccent hyphen -74 KPX Tcommaaccent i -55 KPX Tcommaaccent iacute -55 KPX Tcommaaccent iogonek -55 KPX Tcommaaccent o -92 KPX Tcommaaccent oacute -92 KPX Tcommaaccent ocircumflex -92 KPX Tcommaaccent odieresis -92 KPX Tcommaaccent ograve -92 KPX Tcommaaccent ohungarumlaut -92 KPX Tcommaaccent omacron -92 KPX Tcommaaccent oslash -92 KPX Tcommaaccent otilde -92 KPX Tcommaaccent period -74 KPX Tcommaaccent r -55 KPX Tcommaaccent racute -55 KPX Tcommaaccent rcaron -55 KPX Tcommaaccent rcommaaccent -55 KPX Tcommaaccent semicolon -65 KPX Tcommaaccent u -55 KPX Tcommaaccent uacute -55 KPX Tcommaaccent ucircumflex -55 KPX Tcommaaccent udieresis -55 KPX Tcommaaccent ugrave -55 KPX Tcommaaccent uhungarumlaut -55 KPX Tcommaaccent umacron -55 KPX Tcommaaccent uogonek -55 KPX Tcommaaccent uring -55 KPX Tcommaaccent w -74 KPX Tcommaaccent y -74 KPX Tcommaaccent yacute -74 KPX Tcommaaccent ydieresis -34 KPX U A -40 KPX U Aacute -40 KPX U Abreve -40 KPX U Acircumflex -40 KPX U Adieresis -40 KPX U Agrave -40 KPX U Amacron -40 KPX U Aogonek -40 KPX U Aring -40 KPX U Atilde -40 KPX U comma -25 KPX U period -25 KPX Uacute A -40 KPX Uacute Aacute -40 KPX Uacute Abreve -40 KPX Uacute Acircumflex -40 KPX Uacute Adieresis -40 KPX Uacute Agrave -40 KPX Uacute Amacron -40 KPX Uacute Aogonek -40 KPX Uacute Aring -40 KPX Uacute Atilde -40 KPX Uacute comma -25 KPX Uacute period -25 KPX Ucircumflex A -40 KPX Ucircumflex Aacute -40 KPX Ucircumflex Abreve -40 KPX Ucircumflex Acircumflex -40 KPX Ucircumflex Adieresis -40 KPX Ucircumflex Agrave -40 KPX Ucircumflex Amacron -40 KPX Ucircumflex Aogonek -40 KPX Ucircumflex Aring -40 KPX Ucircumflex Atilde -40 KPX Ucircumflex comma -25 KPX Ucircumflex period -25 KPX Udieresis A -40 KPX Udieresis Aacute -40 KPX Udieresis Abreve -40 KPX Udieresis Acircumflex -40 KPX Udieresis Adieresis -40 KPX Udieresis Agrave -40 KPX Udieresis Amacron -40 KPX Udieresis Aogonek -40 KPX Udieresis Aring -40 KPX Udieresis Atilde -40 KPX Udieresis comma -25 KPX Udieresis period -25 KPX Ugrave A -40 KPX Ugrave Aacute -40 KPX Ugrave Abreve -40 KPX Ugrave Acircumflex -40 KPX Ugrave Adieresis -40 KPX Ugrave Agrave -40 KPX Ugrave Amacron -40 KPX Ugrave Aogonek -40 KPX Ugrave Aring -40 KPX Ugrave Atilde -40 KPX Ugrave comma -25 KPX Ugrave period -25 KPX Uhungarumlaut A -40 KPX Uhungarumlaut Aacute -40 KPX Uhungarumlaut Abreve -40 KPX Uhungarumlaut Acircumflex -40 KPX Uhungarumlaut Adieresis -40 KPX Uhungarumlaut Agrave -40 KPX Uhungarumlaut Amacron -40 KPX Uhungarumlaut Aogonek -40 KPX Uhungarumlaut Aring -40 KPX Uhungarumlaut Atilde -40 KPX Uhungarumlaut comma -25 KPX Uhungarumlaut period -25 KPX Umacron A -40 KPX Umacron Aacute -40 KPX Umacron Abreve -40 KPX Umacron Acircumflex -40 KPX Umacron Adieresis -40 KPX Umacron Agrave -40 KPX Umacron Amacron -40 KPX Umacron Aogonek -40 KPX Umacron Aring -40 KPX Umacron Atilde -40 KPX Umacron comma -25 KPX Umacron period -25 KPX Uogonek A -40 KPX Uogonek Aacute -40 KPX Uogonek Abreve -40 KPX Uogonek Acircumflex -40 KPX Uogonek Adieresis -40 KPX Uogonek Agrave -40 KPX Uogonek Amacron -40 KPX Uogonek Aogonek -40 KPX Uogonek Aring -40 KPX Uogonek Atilde -40 KPX Uogonek comma -25 KPX Uogonek period -25 KPX Uring A -40 KPX Uring Aacute -40 KPX Uring Abreve -40 KPX Uring Acircumflex -40 KPX Uring Adieresis -40 KPX Uring Agrave -40 KPX Uring Amacron -40 KPX Uring Aogonek -40 KPX Uring Aring -40 KPX Uring Atilde -40 KPX Uring comma -25 KPX Uring period -25 KPX V A -60 KPX V Aacute -60 KPX V Abreve -60 KPX V Acircumflex -60 KPX V Adieresis -60 KPX V Agrave -60 KPX V Amacron -60 KPX V Aogonek -60 KPX V Aring -60 KPX V Atilde -60 KPX V O -30 KPX V Oacute -30 KPX V Ocircumflex -30 KPX V Odieresis -30 KPX V Ograve -30 KPX V Ohungarumlaut -30 KPX V Omacron -30 KPX V Oslash -30 KPX V Otilde -30 KPX V a -111 KPX V aacute -111 KPX V abreve -111 KPX V acircumflex -111 KPX V adieresis -111 KPX V agrave -111 KPX V amacron -111 KPX V aogonek -111 KPX V aring -111 KPX V atilde -111 KPX V colon -65 KPX V comma -129 KPX V e -111 KPX V eacute -111 KPX V ecaron -111 KPX V ecircumflex -111 KPX V edieresis -71 KPX V edotaccent -111 KPX V egrave -71 KPX V emacron -71 KPX V eogonek -111 KPX V hyphen -55 KPX V i -74 KPX V iacute -74 KPX V icircumflex -34 KPX V idieresis -34 KPX V igrave -34 KPX V imacron -34 KPX V iogonek -74 KPX V o -111 KPX V oacute -111 KPX V ocircumflex -111 KPX V odieresis -111 KPX V ograve -111 KPX V ohungarumlaut -111 KPX V omacron -111 KPX V oslash -111 KPX V otilde -111 KPX V period -129 KPX V semicolon -74 KPX V u -74 KPX V uacute -74 KPX V ucircumflex -74 KPX V udieresis -74 KPX V ugrave -74 KPX V uhungarumlaut -74 KPX V umacron -74 KPX V uogonek -74 KPX V uring -74 KPX W A -60 KPX W Aacute -60 KPX W Abreve -60 KPX W Acircumflex -60 KPX W Adieresis -60 KPX W Agrave -60 KPX W Amacron -60 KPX W Aogonek -60 KPX W Aring -60 KPX W Atilde -60 KPX W O -25 KPX W Oacute -25 KPX W Ocircumflex -25 KPX W Odieresis -25 KPX W Ograve -25 KPX W Ohungarumlaut -25 KPX W Omacron -25 KPX W Oslash -25 KPX W Otilde -25 KPX W a -92 KPX W aacute -92 KPX W abreve -92 KPX W acircumflex -92 KPX W adieresis -92 KPX W agrave -92 KPX W amacron -92 KPX W aogonek -92 KPX W aring -92 KPX W atilde -92 KPX W colon -65 KPX W comma -92 KPX W e -92 KPX W eacute -92 KPX W ecaron -92 KPX W ecircumflex -92 KPX W edieresis -52 KPX W edotaccent -92 KPX W egrave -52 KPX W emacron -52 KPX W eogonek -92 KPX W hyphen -37 KPX W i -55 KPX W iacute -55 KPX W iogonek -55 KPX W o -92 KPX W oacute -92 KPX W ocircumflex -92 KPX W odieresis -92 KPX W ograve -92 KPX W ohungarumlaut -92 KPX W omacron -92 KPX W oslash -92 KPX W otilde -92 KPX W period -92 KPX W semicolon -65 KPX W u -55 KPX W uacute -55 KPX W ucircumflex -55 KPX W udieresis -55 KPX W ugrave -55 KPX W uhungarumlaut -55 KPX W umacron -55 KPX W uogonek -55 KPX W uring -55 KPX W y -70 KPX W yacute -70 KPX W ydieresis -70 KPX Y A -50 KPX Y Aacute -50 KPX Y Abreve -50 KPX Y Acircumflex -50 KPX Y Adieresis -50 KPX Y Agrave -50 KPX Y Amacron -50 KPX Y Aogonek -50 KPX Y Aring -50 KPX Y Atilde -50 KPX Y O -15 KPX Y Oacute -15 KPX Y Ocircumflex -15 KPX Y Odieresis -15 KPX Y Ograve -15 KPX Y Ohungarumlaut -15 KPX Y Omacron -15 KPX Y Oslash -15 KPX Y Otilde -15 KPX Y a -92 KPX Y aacute -92 KPX Y abreve -92 KPX Y acircumflex -92 KPX Y adieresis -92 KPX Y agrave -92 KPX Y amacron -92 KPX Y aogonek -92 KPX Y aring -92 KPX Y atilde -92 KPX Y colon -65 KPX Y comma -92 KPX Y e -92 KPX Y eacute -92 KPX Y ecaron -92 KPX Y ecircumflex -92 KPX Y edieresis -52 KPX Y edotaccent -92 KPX Y egrave -52 KPX Y emacron -52 KPX Y eogonek -92 KPX Y hyphen -74 KPX Y i -74 KPX Y iacute -74 KPX Y icircumflex -34 KPX Y idieresis -34 KPX Y igrave -34 KPX Y imacron -34 KPX Y iogonek -74 KPX Y o -92 KPX Y oacute -92 KPX Y ocircumflex -92 KPX Y odieresis -92 KPX Y ograve -92 KPX Y ohungarumlaut -92 KPX Y omacron -92 KPX Y oslash -92 KPX Y otilde -92 KPX Y period -92 KPX Y semicolon -65 KPX Y u -92 KPX Y uacute -92 KPX Y ucircumflex -92 KPX Y udieresis -92 KPX Y ugrave -92 KPX Y uhungarumlaut -92 KPX Y umacron -92 KPX Y uogonek -92 KPX Y uring -92 KPX Yacute A -50 KPX Yacute Aacute -50 KPX Yacute Abreve -50 KPX Yacute Acircumflex -50 KPX Yacute Adieresis -50 KPX Yacute Agrave -50 KPX Yacute Amacron -50 KPX Yacute Aogonek -50 KPX Yacute Aring -50 KPX Yacute Atilde -50 KPX Yacute O -15 KPX Yacute Oacute -15 KPX Yacute Ocircumflex -15 KPX Yacute Odieresis -15 KPX Yacute Ograve -15 KPX Yacute Ohungarumlaut -15 KPX Yacute Omacron -15 KPX Yacute Oslash -15 KPX Yacute Otilde -15 KPX Yacute a -92 KPX Yacute aacute -92 KPX Yacute abreve -92 KPX Yacute acircumflex -92 KPX Yacute adieresis -92 KPX Yacute agrave -92 KPX Yacute amacron -92 KPX Yacute aogonek -92 KPX Yacute aring -92 KPX Yacute atilde -92 KPX Yacute colon -65 KPX Yacute comma -92 KPX Yacute e -92 KPX Yacute eacute -92 KPX Yacute ecaron -92 KPX Yacute ecircumflex -92 KPX Yacute edieresis -52 KPX Yacute edotaccent -92 KPX Yacute egrave -52 KPX Yacute emacron -52 KPX Yacute eogonek -92 KPX Yacute hyphen -74 KPX Yacute i -74 KPX Yacute iacute -74 KPX Yacute icircumflex -34 KPX Yacute idieresis -34 KPX Yacute igrave -34 KPX Yacute imacron -34 KPX Yacute iogonek -74 KPX Yacute o -92 KPX Yacute oacute -92 KPX Yacute ocircumflex -92 KPX Yacute odieresis -92 KPX Yacute ograve -92 KPX Yacute ohungarumlaut -92 KPX Yacute omacron -92 KPX Yacute oslash -92 KPX Yacute otilde -92 KPX Yacute period -92 KPX Yacute semicolon -65 KPX Yacute u -92 KPX Yacute uacute -92 KPX Yacute ucircumflex -92 KPX Yacute udieresis -92 KPX Yacute ugrave -92 KPX Yacute uhungarumlaut -92 KPX Yacute umacron -92 KPX Yacute uogonek -92 KPX Yacute uring -92 KPX Ydieresis A -50 KPX Ydieresis Aacute -50 KPX Ydieresis Abreve -50 KPX Ydieresis Acircumflex -50 KPX Ydieresis Adieresis -50 KPX Ydieresis Agrave -50 KPX Ydieresis Amacron -50 KPX Ydieresis Aogonek -50 KPX Ydieresis Aring -50 KPX Ydieresis Atilde -50 KPX Ydieresis O -15 KPX Ydieresis Oacute -15 KPX Ydieresis Ocircumflex -15 KPX Ydieresis Odieresis -15 KPX Ydieresis Ograve -15 KPX Ydieresis Ohungarumlaut -15 KPX Ydieresis Omacron -15 KPX Ydieresis Oslash -15 KPX Ydieresis Otilde -15 KPX Ydieresis a -92 KPX Ydieresis aacute -92 KPX Ydieresis abreve -92 KPX Ydieresis acircumflex -92 KPX Ydieresis adieresis -92 KPX Ydieresis agrave -92 KPX Ydieresis amacron -92 KPX Ydieresis aogonek -92 KPX Ydieresis aring -92 KPX Ydieresis atilde -92 KPX Ydieresis colon -65 KPX Ydieresis comma -92 KPX Ydieresis e -92 KPX Ydieresis eacute -92 KPX Ydieresis ecaron -92 KPX Ydieresis ecircumflex -92 KPX Ydieresis edieresis -52 KPX Ydieresis edotaccent -92 KPX Ydieresis egrave -52 KPX Ydieresis emacron -52 KPX Ydieresis eogonek -92 KPX Ydieresis hyphen -74 KPX Ydieresis i -74 KPX Ydieresis iacute -74 KPX Ydieresis icircumflex -34 KPX Ydieresis idieresis -34 KPX Ydieresis igrave -34 KPX Ydieresis imacron -34 KPX Ydieresis iogonek -74 KPX Ydieresis o -92 KPX Ydieresis oacute -92 KPX Ydieresis ocircumflex -92 KPX Ydieresis odieresis -92 KPX Ydieresis ograve -92 KPX Ydieresis ohungarumlaut -92 KPX Ydieresis omacron -92 KPX Ydieresis oslash -92 KPX Ydieresis otilde -92 KPX Ydieresis period -92 KPX Ydieresis semicolon -65 KPX Ydieresis u -92 KPX Ydieresis uacute -92 KPX Ydieresis ucircumflex -92 KPX Ydieresis udieresis -92 KPX Ydieresis ugrave -92 KPX Ydieresis uhungarumlaut -92 KPX Ydieresis umacron -92 KPX Ydieresis uogonek -92 KPX Ydieresis uring -92 KPX a g -10 KPX a gbreve -10 KPX a gcommaaccent -10 KPX aacute g -10 KPX aacute gbreve -10 KPX aacute gcommaaccent -10 KPX abreve g -10 KPX abreve gbreve -10 KPX abreve gcommaaccent -10 KPX acircumflex g -10 KPX acircumflex gbreve -10 KPX acircumflex gcommaaccent -10 KPX adieresis g -10 KPX adieresis gbreve -10 KPX adieresis gcommaaccent -10 KPX agrave g -10 KPX agrave gbreve -10 KPX agrave gcommaaccent -10 KPX amacron g -10 KPX amacron gbreve -10 KPX amacron gcommaaccent -10 KPX aogonek g -10 KPX aogonek gbreve -10 KPX aogonek gcommaaccent -10 KPX aring g -10 KPX aring gbreve -10 KPX aring gcommaaccent -10 KPX atilde g -10 KPX atilde gbreve -10 KPX atilde gcommaaccent -10 KPX b period -40 KPX b u -20 KPX b uacute -20 KPX b ucircumflex -20 KPX b udieresis -20 KPX b ugrave -20 KPX b uhungarumlaut -20 KPX b umacron -20 KPX b uogonek -20 KPX b uring -20 KPX c h -15 KPX c k -20 KPX c kcommaaccent -20 KPX cacute h -15 KPX cacute k -20 KPX cacute kcommaaccent -20 KPX ccaron h -15 KPX ccaron k -20 KPX ccaron kcommaaccent -20 KPX ccedilla h -15 KPX ccedilla k -20 KPX ccedilla kcommaaccent -20 KPX comma quotedblright -140 KPX comma quoteright -140 KPX e comma -10 KPX e g -40 KPX e gbreve -40 KPX e gcommaaccent -40 KPX e period -15 KPX e v -15 KPX e w -15 KPX e x -20 KPX e y -30 KPX e yacute -30 KPX e ydieresis -30 KPX eacute comma -10 KPX eacute g -40 KPX eacute gbreve -40 KPX eacute gcommaaccent -40 KPX eacute period -15 KPX eacute v -15 KPX eacute w -15 KPX eacute x -20 KPX eacute y -30 KPX eacute yacute -30 KPX eacute ydieresis -30 KPX ecaron comma -10 KPX ecaron g -40 KPX ecaron gbreve -40 KPX ecaron gcommaaccent -40 KPX ecaron period -15 KPX ecaron v -15 KPX ecaron w -15 KPX ecaron x -20 KPX ecaron y -30 KPX ecaron yacute -30 KPX ecaron ydieresis -30 KPX ecircumflex comma -10 KPX ecircumflex g -40 KPX ecircumflex gbreve -40 KPX ecircumflex gcommaaccent -40 KPX ecircumflex period -15 KPX ecircumflex v -15 KPX ecircumflex w -15 KPX ecircumflex x -20 KPX ecircumflex y -30 KPX ecircumflex yacute -30 KPX ecircumflex ydieresis -30 KPX edieresis comma -10 KPX edieresis g -40 KPX edieresis gbreve -40 KPX edieresis gcommaaccent -40 KPX edieresis period -15 KPX edieresis v -15 KPX edieresis w -15 KPX edieresis x -20 KPX edieresis y -30 KPX edieresis yacute -30 KPX edieresis ydieresis -30 KPX edotaccent comma -10 KPX edotaccent g -40 KPX edotaccent gbreve -40 KPX edotaccent gcommaaccent -40 KPX edotaccent period -15 KPX edotaccent v -15 KPX edotaccent w -15 KPX edotaccent x -20 KPX edotaccent y -30 KPX edotaccent yacute -30 KPX edotaccent ydieresis -30 KPX egrave comma -10 KPX egrave g -40 KPX egrave gbreve -40 KPX egrave gcommaaccent -40 KPX egrave period -15 KPX egrave v -15 KPX egrave w -15 KPX egrave x -20 KPX egrave y -30 KPX egrave yacute -30 KPX egrave ydieresis -30 KPX emacron comma -10 KPX emacron g -40 KPX emacron gbreve -40 KPX emacron gcommaaccent -40 KPX emacron period -15 KPX emacron v -15 KPX emacron w -15 KPX emacron x -20 KPX emacron y -30 KPX emacron yacute -30 KPX emacron ydieresis -30 KPX eogonek comma -10 KPX eogonek g -40 KPX eogonek gbreve -40 KPX eogonek gcommaaccent -40 KPX eogonek period -15 KPX eogonek v -15 KPX eogonek w -15 KPX eogonek x -20 KPX eogonek y -30 KPX eogonek yacute -30 KPX eogonek ydieresis -30 KPX f comma -10 KPX f dotlessi -60 KPX f f -18 KPX f i -20 KPX f iogonek -20 KPX f period -15 KPX f quoteright 92 KPX g comma -10 KPX g e -10 KPX g eacute -10 KPX g ecaron -10 KPX g ecircumflex -10 KPX g edieresis -10 KPX g edotaccent -10 KPX g egrave -10 KPX g emacron -10 KPX g eogonek -10 KPX g g -10 KPX g gbreve -10 KPX g gcommaaccent -10 KPX g period -15 KPX gbreve comma -10 KPX gbreve e -10 KPX gbreve eacute -10 KPX gbreve ecaron -10 KPX gbreve ecircumflex -10 KPX gbreve edieresis -10 KPX gbreve edotaccent -10 KPX gbreve egrave -10 KPX gbreve emacron -10 KPX gbreve eogonek -10 KPX gbreve g -10 KPX gbreve gbreve -10 KPX gbreve gcommaaccent -10 KPX gbreve period -15 KPX gcommaaccent comma -10 KPX gcommaaccent e -10 KPX gcommaaccent eacute -10 KPX gcommaaccent ecaron -10 KPX gcommaaccent ecircumflex -10 KPX gcommaaccent edieresis -10 KPX gcommaaccent edotaccent -10 KPX gcommaaccent egrave -10 KPX gcommaaccent emacron -10 KPX gcommaaccent eogonek -10 KPX gcommaaccent g -10 KPX gcommaaccent gbreve -10 KPX gcommaaccent gcommaaccent -10 KPX gcommaaccent period -15 KPX k e -10 KPX k eacute -10 KPX k ecaron -10 KPX k ecircumflex -10 KPX k edieresis -10 KPX k edotaccent -10 KPX k egrave -10 KPX k emacron -10 KPX k eogonek -10 KPX k o -10 KPX k oacute -10 KPX k ocircumflex -10 KPX k odieresis -10 KPX k ograve -10 KPX k ohungarumlaut -10 KPX k omacron -10 KPX k oslash -10 KPX k otilde -10 KPX k y -10 KPX k yacute -10 KPX k ydieresis -10 KPX kcommaaccent e -10 KPX kcommaaccent eacute -10 KPX kcommaaccent ecaron -10 KPX kcommaaccent ecircumflex -10 KPX kcommaaccent edieresis -10 KPX kcommaaccent edotaccent -10 KPX kcommaaccent egrave -10 KPX kcommaaccent emacron -10 KPX kcommaaccent eogonek -10 KPX kcommaaccent o -10 KPX kcommaaccent oacute -10 KPX kcommaaccent ocircumflex -10 KPX kcommaaccent odieresis -10 KPX kcommaaccent ograve -10 KPX kcommaaccent ohungarumlaut -10 KPX kcommaaccent omacron -10 KPX kcommaaccent oslash -10 KPX kcommaaccent otilde -10 KPX kcommaaccent y -10 KPX kcommaaccent yacute -10 KPX kcommaaccent ydieresis -10 KPX n v -40 KPX nacute v -40 KPX ncaron v -40 KPX ncommaaccent v -40 KPX ntilde v -40 KPX o g -10 KPX o gbreve -10 KPX o gcommaaccent -10 KPX o v -10 KPX oacute g -10 KPX oacute gbreve -10 KPX oacute gcommaaccent -10 KPX oacute v -10 KPX ocircumflex g -10 KPX ocircumflex gbreve -10 KPX ocircumflex gcommaaccent -10 KPX ocircumflex v -10 KPX odieresis g -10 KPX odieresis gbreve -10 KPX odieresis gcommaaccent -10 KPX odieresis v -10 KPX ograve g -10 KPX ograve gbreve -10 KPX ograve gcommaaccent -10 KPX ograve v -10 KPX ohungarumlaut g -10 KPX ohungarumlaut gbreve -10 KPX ohungarumlaut gcommaaccent -10 KPX ohungarumlaut v -10 KPX omacron g -10 KPX omacron gbreve -10 KPX omacron gcommaaccent -10 KPX omacron v -10 KPX oslash g -10 KPX oslash gbreve -10 KPX oslash gcommaaccent -10 KPX oslash v -10 KPX otilde g -10 KPX otilde gbreve -10 KPX otilde gcommaaccent -10 KPX otilde v -10 KPX period quotedblright -140 KPX period quoteright -140 KPX quoteleft quoteleft -111 KPX quoteright d -25 KPX quoteright dcroat -25 KPX quoteright quoteright -111 KPX quoteright r -25 KPX quoteright racute -25 KPX quoteright rcaron -25 KPX quoteright rcommaaccent -25 KPX quoteright s -40 KPX quoteright sacute -40 KPX quoteright scaron -40 KPX quoteright scedilla -40 KPX quoteright scommaaccent -40 KPX quoteright space -111 KPX quoteright t -30 KPX quoteright tcommaaccent -30 KPX quoteright v -10 KPX r a -15 KPX r aacute -15 KPX r abreve -15 KPX r acircumflex -15 KPX r adieresis -15 KPX r agrave -15 KPX r amacron -15 KPX r aogonek -15 KPX r aring -15 KPX r atilde -15 KPX r c -37 KPX r cacute -37 KPX r ccaron -37 KPX r ccedilla -37 KPX r comma -111 KPX r d -37 KPX r dcroat -37 KPX r e -37 KPX r eacute -37 KPX r ecaron -37 KPX r ecircumflex -37 KPX r edieresis -37 KPX r edotaccent -37 KPX r egrave -37 KPX r emacron -37 KPX r eogonek -37 KPX r g -37 KPX r gbreve -37 KPX r gcommaaccent -37 KPX r hyphen -20 KPX r o -45 KPX r oacute -45 KPX r ocircumflex -45 KPX r odieresis -45 KPX r ograve -45 KPX r ohungarumlaut -45 KPX r omacron -45 KPX r oslash -45 KPX r otilde -45 KPX r period -111 KPX r q -37 KPX r s -10 KPX r sacute -10 KPX r scaron -10 KPX r scedilla -10 KPX r scommaaccent -10 KPX racute a -15 KPX racute aacute -15 KPX racute abreve -15 KPX racute acircumflex -15 KPX racute adieresis -15 KPX racute agrave -15 KPX racute amacron -15 KPX racute aogonek -15 KPX racute aring -15 KPX racute atilde -15 KPX racute c -37 KPX racute cacute -37 KPX racute ccaron -37 KPX racute ccedilla -37 KPX racute comma -111 KPX racute d -37 KPX racute dcroat -37 KPX racute e -37 KPX racute eacute -37 KPX racute ecaron -37 KPX racute ecircumflex -37 KPX racute edieresis -37 KPX racute edotaccent -37 KPX racute egrave -37 KPX racute emacron -37 KPX racute eogonek -37 KPX racute g -37 KPX racute gbreve -37 KPX racute gcommaaccent -37 KPX racute hyphen -20 KPX racute o -45 KPX racute oacute -45 KPX racute ocircumflex -45 KPX racute odieresis -45 KPX racute ograve -45 KPX racute ohungarumlaut -45 KPX racute omacron -45 KPX racute oslash -45 KPX racute otilde -45 KPX racute period -111 KPX racute q -37 KPX racute s -10 KPX racute sacute -10 KPX racute scaron -10 KPX racute scedilla -10 KPX racute scommaaccent -10 KPX rcaron a -15 KPX rcaron aacute -15 KPX rcaron abreve -15 KPX rcaron acircumflex -15 KPX rcaron adieresis -15 KPX rcaron agrave -15 KPX rcaron amacron -15 KPX rcaron aogonek -15 KPX rcaron aring -15 KPX rcaron atilde -15 KPX rcaron c -37 KPX rcaron cacute -37 KPX rcaron ccaron -37 KPX rcaron ccedilla -37 KPX rcaron comma -111 KPX rcaron d -37 KPX rcaron dcroat -37 KPX rcaron e -37 KPX rcaron eacute -37 KPX rcaron ecaron -37 KPX rcaron ecircumflex -37 KPX rcaron edieresis -37 KPX rcaron edotaccent -37 KPX rcaron egrave -37 KPX rcaron emacron -37 KPX rcaron eogonek -37 KPX rcaron g -37 KPX rcaron gbreve -37 KPX rcaron gcommaaccent -37 KPX rcaron hyphen -20 KPX rcaron o -45 KPX rcaron oacute -45 KPX rcaron ocircumflex -45 KPX rcaron odieresis -45 KPX rcaron ograve -45 KPX rcaron ohungarumlaut -45 KPX rcaron omacron -45 KPX rcaron oslash -45 KPX rcaron otilde -45 KPX rcaron period -111 KPX rcaron q -37 KPX rcaron s -10 KPX rcaron sacute -10 KPX rcaron scaron -10 KPX rcaron scedilla -10 KPX rcaron scommaaccent -10 KPX rcommaaccent a -15 KPX rcommaaccent aacute -15 KPX rcommaaccent abreve -15 KPX rcommaaccent acircumflex -15 KPX rcommaaccent adieresis -15 KPX rcommaaccent agrave -15 KPX rcommaaccent amacron -15 KPX rcommaaccent aogonek -15 KPX rcommaaccent aring -15 KPX rcommaaccent atilde -15 KPX rcommaaccent c -37 KPX rcommaaccent cacute -37 KPX rcommaaccent ccaron -37 KPX rcommaaccent ccedilla -37 KPX rcommaaccent comma -111 KPX rcommaaccent d -37 KPX rcommaaccent dcroat -37 KPX rcommaaccent e -37 KPX rcommaaccent eacute -37 KPX rcommaaccent ecaron -37 KPX rcommaaccent ecircumflex -37 KPX rcommaaccent edieresis -37 KPX rcommaaccent edotaccent -37 KPX rcommaaccent egrave -37 KPX rcommaaccent emacron -37 KPX rcommaaccent eogonek -37 KPX rcommaaccent g -37 KPX rcommaaccent gbreve -37 KPX rcommaaccent gcommaaccent -37 KPX rcommaaccent hyphen -20 KPX rcommaaccent o -45 KPX rcommaaccent oacute -45 KPX rcommaaccent ocircumflex -45 KPX rcommaaccent odieresis -45 KPX rcommaaccent ograve -45 KPX rcommaaccent ohungarumlaut -45 KPX rcommaaccent omacron -45 KPX rcommaaccent oslash -45 KPX rcommaaccent otilde -45 KPX rcommaaccent period -111 KPX rcommaaccent q -37 KPX rcommaaccent s -10 KPX rcommaaccent sacute -10 KPX rcommaaccent scaron -10 KPX rcommaaccent scedilla -10 KPX rcommaaccent scommaaccent -10 KPX space A -18 KPX space Aacute -18 KPX space Abreve -18 KPX space Acircumflex -18 KPX space Adieresis -18 KPX space Agrave -18 KPX space Amacron -18 KPX space Aogonek -18 KPX space Aring -18 KPX space Atilde -18 KPX space T -18 KPX space Tcaron -18 KPX space Tcommaaccent -18 KPX space V -35 KPX space W -40 KPX space Y -75 KPX space Yacute -75 KPX space Ydieresis -75 KPX v comma -74 KPX v period -74 KPX w comma -74 KPX w period -74 KPX y comma -55 KPX y period -55 KPX yacute comma -55 KPX yacute period -55 KPX ydieresis comma -55 KPX ydieresis period -55 EndKernPairs EndKernData EndFontMetrics ruby-prawn-2.1.0.orig/data/fonts/Helvetica.afm0000644000000000000000000022106412665203156017723 0ustar rootrootStartFontMetrics 4.1 Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved. Comment Creation Date: Thu May 1 12:38:23 1997 Comment UniqueID 43054 Comment VMusage 37069 48094 FontName Helvetica FullName Helvetica FamilyName Helvetica Weight Medium ItalicAngle 0 IsFixedPitch false CharacterSet ExtendedRoman FontBBox -166 -225 1000 931 UnderlinePosition -100 UnderlineThickness 50 Version 002.000 Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. EncodingScheme AdobeStandardEncoding CapHeight 718 XHeight 523 Ascender 718 Descender -207 StdHW 76 StdVW 88 StartCharMetrics 315 C 32 ; WX 278 ; N space ; B 0 0 0 0 ; C 33 ; WX 278 ; N exclam ; B 90 0 187 718 ; C 34 ; WX 355 ; N quotedbl ; B 70 463 285 718 ; C 35 ; WX 556 ; N numbersign ; B 28 0 529 688 ; C 36 ; WX 556 ; N dollar ; B 32 -115 520 775 ; C 37 ; WX 889 ; N percent ; B 39 -19 850 703 ; C 38 ; WX 667 ; N ampersand ; B 44 -15 645 718 ; C 39 ; WX 222 ; N quoteright ; B 53 463 157 718 ; C 40 ; WX 333 ; N parenleft ; B 68 -207 299 733 ; C 41 ; WX 333 ; N parenright ; B 34 -207 265 733 ; C 42 ; WX 389 ; N asterisk ; B 39 431 349 718 ; C 43 ; WX 584 ; N plus ; B 39 0 545 505 ; C 44 ; WX 278 ; N comma ; B 87 -147 191 106 ; C 45 ; WX 333 ; N hyphen ; B 44 232 289 322 ; C 46 ; WX 278 ; N period ; B 87 0 191 106 ; C 47 ; WX 278 ; N slash ; B -17 -19 295 737 ; C 48 ; WX 556 ; N zero ; B 37 -19 519 703 ; C 49 ; WX 556 ; N one ; B 101 0 359 703 ; C 50 ; WX 556 ; N two ; B 26 0 507 703 ; C 51 ; WX 556 ; N three ; B 34 -19 522 703 ; C 52 ; WX 556 ; N four ; B 25 0 523 703 ; C 53 ; WX 556 ; N five ; B 32 -19 514 688 ; C 54 ; WX 556 ; N six ; B 38 -19 518 703 ; C 55 ; WX 556 ; N seven ; B 37 0 523 688 ; C 56 ; WX 556 ; N eight ; B 38 -19 517 703 ; C 57 ; WX 556 ; N nine ; B 42 -19 514 703 ; C 58 ; WX 278 ; N colon ; B 87 0 191 516 ; C 59 ; WX 278 ; N semicolon ; B 87 -147 191 516 ; C 60 ; WX 584 ; N less ; B 48 11 536 495 ; C 61 ; WX 584 ; N equal ; B 39 115 545 390 ; C 62 ; WX 584 ; N greater ; B 48 11 536 495 ; C 63 ; WX 556 ; N question ; B 56 0 492 727 ; C 64 ; WX 1015 ; N at ; B 147 -19 868 737 ; C 65 ; WX 667 ; N A ; B 14 0 654 718 ; C 66 ; WX 667 ; N B ; B 74 0 627 718 ; C 67 ; WX 722 ; N C ; B 44 -19 681 737 ; C 68 ; WX 722 ; N D ; B 81 0 674 718 ; C 69 ; WX 667 ; N E ; B 86 0 616 718 ; C 70 ; WX 611 ; N F ; B 86 0 583 718 ; C 71 ; WX 778 ; N G ; B 48 -19 704 737 ; C 72 ; WX 722 ; N H ; B 77 0 646 718 ; C 73 ; WX 278 ; N I ; B 91 0 188 718 ; C 74 ; WX 500 ; N J ; B 17 -19 428 718 ; C 75 ; WX 667 ; N K ; B 76 0 663 718 ; C 76 ; WX 556 ; N L ; B 76 0 537 718 ; C 77 ; WX 833 ; N M ; B 73 0 761 718 ; C 78 ; WX 722 ; N N ; B 76 0 646 718 ; C 79 ; WX 778 ; N O ; B 39 -19 739 737 ; C 80 ; WX 667 ; N P ; B 86 0 622 718 ; C 81 ; WX 778 ; N Q ; B 39 -56 739 737 ; C 82 ; WX 722 ; N R ; B 88 0 684 718 ; C 83 ; WX 667 ; N S ; B 49 -19 620 737 ; C 84 ; WX 611 ; N T ; B 14 0 597 718 ; C 85 ; WX 722 ; N U ; B 79 -19 644 718 ; C 86 ; WX 667 ; N V ; B 20 0 647 718 ; C 87 ; WX 944 ; N W ; B 16 0 928 718 ; C 88 ; WX 667 ; N X ; B 19 0 648 718 ; C 89 ; WX 667 ; N Y ; B 14 0 653 718 ; C 90 ; WX 611 ; N Z ; B 23 0 588 718 ; C 91 ; WX 278 ; N bracketleft ; B 63 -196 250 722 ; C 92 ; WX 278 ; N backslash ; B -17 -19 295 737 ; C 93 ; WX 278 ; N bracketright ; B 28 -196 215 722 ; C 94 ; WX 469 ; N asciicircum ; B -14 264 483 688 ; C 95 ; WX 556 ; N underscore ; B 0 -125 556 -75 ; C 96 ; WX 222 ; N quoteleft ; B 65 470 169 725 ; C 97 ; WX 556 ; N a ; B 36 -15 530 538 ; C 98 ; WX 556 ; N b ; B 58 -15 517 718 ; C 99 ; WX 500 ; N c ; B 30 -15 477 538 ; C 100 ; WX 556 ; N d ; B 35 -15 499 718 ; C 101 ; WX 556 ; N e ; B 40 -15 516 538 ; C 102 ; WX 278 ; N f ; B 14 0 262 728 ; L i fi ; L l fl ; C 103 ; WX 556 ; N g ; B 40 -220 499 538 ; C 104 ; WX 556 ; N h ; B 65 0 491 718 ; C 105 ; WX 222 ; N i ; B 67 0 155 718 ; C 106 ; WX 222 ; N j ; B -16 -210 155 718 ; C 107 ; WX 500 ; N k ; B 67 0 501 718 ; C 108 ; WX 222 ; N l ; B 67 0 155 718 ; C 109 ; WX 833 ; N m ; B 65 0 769 538 ; C 110 ; WX 556 ; N n ; B 65 0 491 538 ; C 111 ; WX 556 ; N o ; B 35 -14 521 538 ; C 112 ; WX 556 ; N p ; B 58 -207 517 538 ; C 113 ; WX 556 ; N q ; B 35 -207 494 538 ; C 114 ; WX 333 ; N r ; B 77 0 332 538 ; C 115 ; WX 500 ; N s ; B 32 -15 464 538 ; C 116 ; WX 278 ; N t ; B 14 -7 257 669 ; C 117 ; WX 556 ; N u ; B 68 -15 489 523 ; C 118 ; WX 500 ; N v ; B 8 0 492 523 ; C 119 ; WX 722 ; N w ; B 14 0 709 523 ; C 120 ; WX 500 ; N x ; B 11 0 490 523 ; C 121 ; WX 500 ; N y ; B 11 -214 489 523 ; C 122 ; WX 500 ; N z ; B 31 0 469 523 ; C 123 ; WX 334 ; N braceleft ; B 42 -196 292 722 ; C 124 ; WX 260 ; N bar ; B 94 -225 167 775 ; C 125 ; WX 334 ; N braceright ; B 42 -196 292 722 ; C 126 ; WX 584 ; N asciitilde ; B 61 180 523 326 ; C 161 ; WX 333 ; N exclamdown ; B 118 -195 215 523 ; C 162 ; WX 556 ; N cent ; B 51 -115 513 623 ; C 163 ; WX 556 ; N sterling ; B 33 -16 539 718 ; C 164 ; WX 167 ; N fraction ; B -166 -19 333 703 ; C 165 ; WX 556 ; N yen ; B 3 0 553 688 ; C 166 ; WX 556 ; N florin ; B -11 -207 501 737 ; C 167 ; WX 556 ; N section ; B 43 -191 512 737 ; C 168 ; WX 556 ; N currency ; B 28 99 528 603 ; C 169 ; WX 191 ; N quotesingle ; B 59 463 132 718 ; C 170 ; WX 333 ; N quotedblleft ; B 38 470 307 725 ; C 171 ; WX 556 ; N guillemotleft ; B 97 108 459 446 ; C 172 ; WX 333 ; N guilsinglleft ; B 88 108 245 446 ; C 173 ; WX 333 ; N guilsinglright ; B 88 108 245 446 ; C 174 ; WX 500 ; N fi ; B 14 0 434 728 ; C 175 ; WX 500 ; N fl ; B 14 0 432 728 ; C 177 ; WX 556 ; N endash ; B 0 240 556 313 ; C 178 ; WX 556 ; N dagger ; B 43 -159 514 718 ; C 179 ; WX 556 ; N daggerdbl ; B 43 -159 514 718 ; C 180 ; WX 278 ; N periodcentered ; B 77 190 202 315 ; C 182 ; WX 537 ; N paragraph ; B 18 -173 497 718 ; C 183 ; WX 350 ; N bullet ; B 18 202 333 517 ; C 184 ; WX 222 ; N quotesinglbase ; B 53 -149 157 106 ; C 185 ; WX 333 ; N quotedblbase ; B 26 -149 295 106 ; C 186 ; WX 333 ; N quotedblright ; B 26 463 295 718 ; C 187 ; WX 556 ; N guillemotright ; B 97 108 459 446 ; C 188 ; WX 1000 ; N ellipsis ; B 115 0 885 106 ; C 189 ; WX 1000 ; N perthousand ; B 7 -19 994 703 ; C 191 ; WX 611 ; N questiondown ; B 91 -201 527 525 ; C 193 ; WX 333 ; N grave ; B 14 593 211 734 ; C 194 ; WX 333 ; N acute ; B 122 593 319 734 ; C 195 ; WX 333 ; N circumflex ; B 21 593 312 734 ; C 196 ; WX 333 ; N tilde ; B -4 606 337 722 ; C 197 ; WX 333 ; N macron ; B 10 627 323 684 ; C 198 ; WX 333 ; N breve ; B 13 595 321 731 ; C 199 ; WX 333 ; N dotaccent ; B 121 604 212 706 ; C 200 ; WX 333 ; N dieresis ; B 40 604 293 706 ; C 202 ; WX 333 ; N ring ; B 75 572 259 756 ; C 203 ; WX 333 ; N cedilla ; B 45 -225 259 0 ; C 205 ; WX 333 ; N hungarumlaut ; B 31 593 409 734 ; C 206 ; WX 333 ; N ogonek ; B 73 -225 287 0 ; C 207 ; WX 333 ; N caron ; B 21 593 312 734 ; C 208 ; WX 1000 ; N emdash ; B 0 240 1000 313 ; C 225 ; WX 1000 ; N AE ; B 8 0 951 718 ; C 227 ; WX 370 ; N ordfeminine ; B 24 405 346 737 ; C 232 ; WX 556 ; N Lslash ; B -20 0 537 718 ; C 233 ; WX 778 ; N Oslash ; B 39 -19 740 737 ; C 234 ; WX 1000 ; N OE ; B 36 -19 965 737 ; C 235 ; WX 365 ; N ordmasculine ; B 25 405 341 737 ; C 241 ; WX 889 ; N ae ; B 36 -15 847 538 ; C 245 ; WX 278 ; N dotlessi ; B 95 0 183 523 ; C 248 ; WX 222 ; N lslash ; B -20 0 242 718 ; C 249 ; WX 611 ; N oslash ; B 28 -22 537 545 ; C 250 ; WX 944 ; N oe ; B 35 -15 902 538 ; C 251 ; WX 611 ; N germandbls ; B 67 -15 571 728 ; C -1 ; WX 278 ; N Idieresis ; B 13 0 266 901 ; C -1 ; WX 556 ; N eacute ; B 40 -15 516 734 ; C -1 ; WX 556 ; N abreve ; B 36 -15 530 731 ; C -1 ; WX 556 ; N uhungarumlaut ; B 68 -15 521 734 ; C -1 ; WX 556 ; N ecaron ; B 40 -15 516 734 ; C -1 ; WX 667 ; N Ydieresis ; B 14 0 653 901 ; C -1 ; WX 584 ; N divide ; B 39 -19 545 524 ; C -1 ; WX 667 ; N Yacute ; B 14 0 653 929 ; C -1 ; WX 667 ; N Acircumflex ; B 14 0 654 929 ; C -1 ; WX 556 ; N aacute ; B 36 -15 530 734 ; C -1 ; WX 722 ; N Ucircumflex ; B 79 -19 644 929 ; C -1 ; WX 500 ; N yacute ; B 11 -214 489 734 ; C -1 ; WX 500 ; N scommaaccent ; B 32 -225 464 538 ; C -1 ; WX 556 ; N ecircumflex ; B 40 -15 516 734 ; C -1 ; WX 722 ; N Uring ; B 79 -19 644 931 ; C -1 ; WX 722 ; N Udieresis ; B 79 -19 644 901 ; C -1 ; WX 556 ; N aogonek ; B 36 -220 547 538 ; C -1 ; WX 722 ; N Uacute ; B 79 -19 644 929 ; C -1 ; WX 556 ; N uogonek ; B 68 -225 519 523 ; C -1 ; WX 667 ; N Edieresis ; B 86 0 616 901 ; C -1 ; WX 722 ; N Dcroat ; B 0 0 674 718 ; C -1 ; WX 250 ; N commaaccent ; B 87 -225 181 -40 ; C -1 ; WX 737 ; N copyright ; B -14 -19 752 737 ; C -1 ; WX 667 ; N Emacron ; B 86 0 616 879 ; C -1 ; WX 500 ; N ccaron ; B 30 -15 477 734 ; C -1 ; WX 556 ; N aring ; B 36 -15 530 756 ; C -1 ; WX 722 ; N Ncommaaccent ; B 76 -225 646 718 ; C -1 ; WX 222 ; N lacute ; B 67 0 264 929 ; C -1 ; WX 556 ; N agrave ; B 36 -15 530 734 ; C -1 ; WX 611 ; N Tcommaaccent ; B 14 -225 597 718 ; C -1 ; WX 722 ; N Cacute ; B 44 -19 681 929 ; C -1 ; WX 556 ; N atilde ; B 36 -15 530 722 ; C -1 ; WX 667 ; N Edotaccent ; B 86 0 616 901 ; C -1 ; WX 500 ; N scaron ; B 32 -15 464 734 ; C -1 ; WX 500 ; N scedilla ; B 32 -225 464 538 ; C -1 ; WX 278 ; N iacute ; B 95 0 292 734 ; C -1 ; WX 471 ; N lozenge ; B 10 0 462 728 ; C -1 ; WX 722 ; N Rcaron ; B 88 0 684 929 ; C -1 ; WX 778 ; N Gcommaaccent ; B 48 -225 704 737 ; C -1 ; WX 556 ; N ucircumflex ; B 68 -15 489 734 ; C -1 ; WX 556 ; N acircumflex ; B 36 -15 530 734 ; C -1 ; WX 667 ; N Amacron ; B 14 0 654 879 ; C -1 ; WX 333 ; N rcaron ; B 61 0 352 734 ; C -1 ; WX 500 ; N ccedilla ; B 30 -225 477 538 ; C -1 ; WX 611 ; N Zdotaccent ; B 23 0 588 901 ; C -1 ; WX 667 ; N Thorn ; B 86 0 622 718 ; C -1 ; WX 778 ; N Omacron ; B 39 -19 739 879 ; C -1 ; WX 722 ; N Racute ; B 88 0 684 929 ; C -1 ; WX 667 ; N Sacute ; B 49 -19 620 929 ; C -1 ; WX 643 ; N dcaron ; B 35 -15 655 718 ; C -1 ; WX 722 ; N Umacron ; B 79 -19 644 879 ; C -1 ; WX 556 ; N uring ; B 68 -15 489 756 ; C -1 ; WX 333 ; N threesuperior ; B 5 270 325 703 ; C -1 ; WX 778 ; N Ograve ; B 39 -19 739 929 ; C -1 ; WX 667 ; N Agrave ; B 14 0 654 929 ; C -1 ; WX 667 ; N Abreve ; B 14 0 654 926 ; C -1 ; WX 584 ; N multiply ; B 39 0 545 506 ; C -1 ; WX 556 ; N uacute ; B 68 -15 489 734 ; C -1 ; WX 611 ; N Tcaron ; B 14 0 597 929 ; C -1 ; WX 476 ; N partialdiff ; B 13 -38 463 714 ; C -1 ; WX 500 ; N ydieresis ; B 11 -214 489 706 ; C -1 ; WX 722 ; N Nacute ; B 76 0 646 929 ; C -1 ; WX 278 ; N icircumflex ; B -6 0 285 734 ; C -1 ; WX 667 ; N Ecircumflex ; B 86 0 616 929 ; C -1 ; WX 556 ; N adieresis ; B 36 -15 530 706 ; C -1 ; WX 556 ; N edieresis ; B 40 -15 516 706 ; C -1 ; WX 500 ; N cacute ; B 30 -15 477 734 ; C -1 ; WX 556 ; N nacute ; B 65 0 491 734 ; C -1 ; WX 556 ; N umacron ; B 68 -15 489 684 ; C -1 ; WX 722 ; N Ncaron ; B 76 0 646 929 ; C -1 ; WX 278 ; N Iacute ; B 91 0 292 929 ; C -1 ; WX 584 ; N plusminus ; B 39 0 545 506 ; C -1 ; WX 260 ; N brokenbar ; B 94 -150 167 700 ; C -1 ; WX 737 ; N registered ; B -14 -19 752 737 ; C -1 ; WX 778 ; N Gbreve ; B 48 -19 704 926 ; C -1 ; WX 278 ; N Idotaccent ; B 91 0 188 901 ; C -1 ; WX 600 ; N summation ; B 15 -10 586 706 ; C -1 ; WX 667 ; N Egrave ; B 86 0 616 929 ; C -1 ; WX 333 ; N racute ; B 77 0 332 734 ; C -1 ; WX 556 ; N omacron ; B 35 -14 521 684 ; C -1 ; WX 611 ; N Zacute ; B 23 0 588 929 ; C -1 ; WX 611 ; N Zcaron ; B 23 0 588 929 ; C -1 ; WX 549 ; N greaterequal ; B 26 0 523 674 ; C -1 ; WX 722 ; N Eth ; B 0 0 674 718 ; C -1 ; WX 722 ; N Ccedilla ; B 44 -225 681 737 ; C -1 ; WX 222 ; N lcommaaccent ; B 67 -225 167 718 ; C -1 ; WX 317 ; N tcaron ; B 14 -7 329 808 ; C -1 ; WX 556 ; N eogonek ; B 40 -225 516 538 ; C -1 ; WX 722 ; N Uogonek ; B 79 -225 644 718 ; C -1 ; WX 667 ; N Aacute ; B 14 0 654 929 ; C -1 ; WX 667 ; N Adieresis ; B 14 0 654 901 ; C -1 ; WX 556 ; N egrave ; B 40 -15 516 734 ; C -1 ; WX 500 ; N zacute ; B 31 0 469 734 ; C -1 ; WX 222 ; N iogonek ; B -31 -225 183 718 ; C -1 ; WX 778 ; N Oacute ; B 39 -19 739 929 ; C -1 ; WX 556 ; N oacute ; B 35 -14 521 734 ; C -1 ; WX 556 ; N amacron ; B 36 -15 530 684 ; C -1 ; WX 500 ; N sacute ; B 32 -15 464 734 ; C -1 ; WX 278 ; N idieresis ; B 13 0 266 706 ; C -1 ; WX 778 ; N Ocircumflex ; B 39 -19 739 929 ; C -1 ; WX 722 ; N Ugrave ; B 79 -19 644 929 ; C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; C -1 ; WX 556 ; N thorn ; B 58 -207 517 718 ; C -1 ; WX 333 ; N twosuperior ; B 4 281 323 703 ; C -1 ; WX 778 ; N Odieresis ; B 39 -19 739 901 ; C -1 ; WX 556 ; N mu ; B 68 -207 489 523 ; C -1 ; WX 278 ; N igrave ; B -13 0 184 734 ; C -1 ; WX 556 ; N ohungarumlaut ; B 35 -14 521 734 ; C -1 ; WX 667 ; N Eogonek ; B 86 -220 633 718 ; C -1 ; WX 556 ; N dcroat ; B 35 -15 550 718 ; C -1 ; WX 834 ; N threequarters ; B 45 -19 810 703 ; C -1 ; WX 667 ; N Scedilla ; B 49 -225 620 737 ; C -1 ; WX 299 ; N lcaron ; B 67 0 311 718 ; C -1 ; WX 667 ; N Kcommaaccent ; B 76 -225 663 718 ; C -1 ; WX 556 ; N Lacute ; B 76 0 537 929 ; C -1 ; WX 1000 ; N trademark ; B 46 306 903 718 ; C -1 ; WX 556 ; N edotaccent ; B 40 -15 516 706 ; C -1 ; WX 278 ; N Igrave ; B -13 0 188 929 ; C -1 ; WX 278 ; N Imacron ; B -17 0 296 879 ; C -1 ; WX 556 ; N Lcaron ; B 76 0 537 718 ; C -1 ; WX 834 ; N onehalf ; B 43 -19 773 703 ; C -1 ; WX 549 ; N lessequal ; B 26 0 523 674 ; C -1 ; WX 556 ; N ocircumflex ; B 35 -14 521 734 ; C -1 ; WX 556 ; N ntilde ; B 65 0 491 722 ; C -1 ; WX 722 ; N Uhungarumlaut ; B 79 -19 644 929 ; C -1 ; WX 667 ; N Eacute ; B 86 0 616 929 ; C -1 ; WX 556 ; N emacron ; B 40 -15 516 684 ; C -1 ; WX 556 ; N gbreve ; B 40 -220 499 731 ; C -1 ; WX 834 ; N onequarter ; B 73 -19 756 703 ; C -1 ; WX 667 ; N Scaron ; B 49 -19 620 929 ; C -1 ; WX 667 ; N Scommaaccent ; B 49 -225 620 737 ; C -1 ; WX 778 ; N Ohungarumlaut ; B 39 -19 739 929 ; C -1 ; WX 400 ; N degree ; B 54 411 346 703 ; C -1 ; WX 556 ; N ograve ; B 35 -14 521 734 ; C -1 ; WX 722 ; N Ccaron ; B 44 -19 681 929 ; C -1 ; WX 556 ; N ugrave ; B 68 -15 489 734 ; C -1 ; WX 453 ; N radical ; B -4 -80 458 762 ; C -1 ; WX 722 ; N Dcaron ; B 81 0 674 929 ; C -1 ; WX 333 ; N rcommaaccent ; B 77 -225 332 538 ; C -1 ; WX 722 ; N Ntilde ; B 76 0 646 917 ; C -1 ; WX 556 ; N otilde ; B 35 -14 521 722 ; C -1 ; WX 722 ; N Rcommaaccent ; B 88 -225 684 718 ; C -1 ; WX 556 ; N Lcommaaccent ; B 76 -225 537 718 ; C -1 ; WX 667 ; N Atilde ; B 14 0 654 917 ; C -1 ; WX 667 ; N Aogonek ; B 14 -225 654 718 ; C -1 ; WX 667 ; N Aring ; B 14 0 654 931 ; C -1 ; WX 778 ; N Otilde ; B 39 -19 739 917 ; C -1 ; WX 500 ; N zdotaccent ; B 31 0 469 706 ; C -1 ; WX 667 ; N Ecaron ; B 86 0 616 929 ; C -1 ; WX 278 ; N Iogonek ; B -3 -225 211 718 ; C -1 ; WX 500 ; N kcommaaccent ; B 67 -225 501 718 ; C -1 ; WX 584 ; N minus ; B 39 216 545 289 ; C -1 ; WX 278 ; N Icircumflex ; B -6 0 285 929 ; C -1 ; WX 556 ; N ncaron ; B 65 0 491 734 ; C -1 ; WX 278 ; N tcommaaccent ; B 14 -225 257 669 ; C -1 ; WX 584 ; N logicalnot ; B 39 108 545 390 ; C -1 ; WX 556 ; N odieresis ; B 35 -14 521 706 ; C -1 ; WX 556 ; N udieresis ; B 68 -15 489 706 ; C -1 ; WX 549 ; N notequal ; B 12 -35 537 551 ; C -1 ; WX 556 ; N gcommaaccent ; B 40 -220 499 822 ; C -1 ; WX 556 ; N eth ; B 35 -15 522 737 ; C -1 ; WX 500 ; N zcaron ; B 31 0 469 734 ; C -1 ; WX 556 ; N ncommaaccent ; B 65 -225 491 538 ; C -1 ; WX 333 ; N onesuperior ; B 43 281 222 703 ; C -1 ; WX 278 ; N imacron ; B 5 0 272 684 ; C -1 ; WX 556 ; N Euro ; B 0 0 0 0 ; EndCharMetrics StartKernData StartKernPairs 2705 KPX A C -30 KPX A Cacute -30 KPX A Ccaron -30 KPX A Ccedilla -30 KPX A G -30 KPX A Gbreve -30 KPX A Gcommaaccent -30 KPX A O -30 KPX A Oacute -30 KPX A Ocircumflex -30 KPX A Odieresis -30 KPX A Ograve -30 KPX A Ohungarumlaut -30 KPX A Omacron -30 KPX A Oslash -30 KPX A Otilde -30 KPX A Q -30 KPX A T -120 KPX A Tcaron -120 KPX A Tcommaaccent -120 KPX A U -50 KPX A Uacute -50 KPX A Ucircumflex -50 KPX A Udieresis -50 KPX A Ugrave -50 KPX A Uhungarumlaut -50 KPX A Umacron -50 KPX A Uogonek -50 KPX A Uring -50 KPX A V -70 KPX A W -50 KPX A Y -100 KPX A Yacute -100 KPX A Ydieresis -100 KPX A u -30 KPX A uacute -30 KPX A ucircumflex -30 KPX A udieresis -30 KPX A ugrave -30 KPX A uhungarumlaut -30 KPX A umacron -30 KPX A uogonek -30 KPX A uring -30 KPX A v -40 KPX A w -40 KPX A y -40 KPX A yacute -40 KPX A ydieresis -40 KPX Aacute C -30 KPX Aacute Cacute -30 KPX Aacute Ccaron -30 KPX Aacute Ccedilla -30 KPX Aacute G -30 KPX Aacute Gbreve -30 KPX Aacute Gcommaaccent -30 KPX Aacute O -30 KPX Aacute Oacute -30 KPX Aacute Ocircumflex -30 KPX Aacute Odieresis -30 KPX Aacute Ograve -30 KPX Aacute Ohungarumlaut -30 KPX Aacute Omacron -30 KPX Aacute Oslash -30 KPX Aacute Otilde -30 KPX Aacute Q -30 KPX Aacute T -120 KPX Aacute Tcaron -120 KPX Aacute Tcommaaccent -120 KPX Aacute U -50 KPX Aacute Uacute -50 KPX Aacute Ucircumflex -50 KPX Aacute Udieresis -50 KPX Aacute Ugrave -50 KPX Aacute Uhungarumlaut -50 KPX Aacute Umacron -50 KPX Aacute Uogonek -50 KPX Aacute Uring -50 KPX Aacute V -70 KPX Aacute W -50 KPX Aacute Y -100 KPX Aacute Yacute -100 KPX Aacute Ydieresis -100 KPX Aacute u -30 KPX Aacute uacute -30 KPX Aacute ucircumflex -30 KPX Aacute udieresis -30 KPX Aacute ugrave -30 KPX Aacute uhungarumlaut -30 KPX Aacute umacron -30 KPX Aacute uogonek -30 KPX Aacute uring -30 KPX Aacute v -40 KPX Aacute w -40 KPX Aacute y -40 KPX Aacute yacute -40 KPX Aacute ydieresis -40 KPX Abreve C -30 KPX Abreve Cacute -30 KPX Abreve Ccaron -30 KPX Abreve Ccedilla -30 KPX Abreve G -30 KPX Abreve Gbreve -30 KPX Abreve Gcommaaccent -30 KPX Abreve O -30 KPX Abreve Oacute -30 KPX Abreve Ocircumflex -30 KPX Abreve Odieresis -30 KPX Abreve Ograve -30 KPX Abreve Ohungarumlaut -30 KPX Abreve Omacron -30 KPX Abreve Oslash -30 KPX Abreve Otilde -30 KPX Abreve Q -30 KPX Abreve T -120 KPX Abreve Tcaron -120 KPX Abreve Tcommaaccent -120 KPX Abreve U -50 KPX Abreve Uacute -50 KPX Abreve Ucircumflex -50 KPX Abreve Udieresis -50 KPX Abreve Ugrave -50 KPX Abreve Uhungarumlaut -50 KPX Abreve Umacron -50 KPX Abreve Uogonek -50 KPX Abreve Uring -50 KPX Abreve V -70 KPX Abreve W -50 KPX Abreve Y -100 KPX Abreve Yacute -100 KPX Abreve Ydieresis -100 KPX Abreve u -30 KPX Abreve uacute -30 KPX Abreve ucircumflex -30 KPX Abreve udieresis -30 KPX Abreve ugrave -30 KPX Abreve uhungarumlaut -30 KPX Abreve umacron -30 KPX Abreve uogonek -30 KPX Abreve uring -30 KPX Abreve v -40 KPX Abreve w -40 KPX Abreve y -40 KPX Abreve yacute -40 KPX Abreve ydieresis -40 KPX Acircumflex C -30 KPX Acircumflex Cacute -30 KPX Acircumflex Ccaron -30 KPX Acircumflex Ccedilla -30 KPX Acircumflex G -30 KPX Acircumflex Gbreve -30 KPX Acircumflex Gcommaaccent -30 KPX Acircumflex O -30 KPX Acircumflex Oacute -30 KPX Acircumflex Ocircumflex -30 KPX Acircumflex Odieresis -30 KPX Acircumflex Ograve -30 KPX Acircumflex Ohungarumlaut -30 KPX Acircumflex Omacron -30 KPX Acircumflex Oslash -30 KPX Acircumflex Otilde -30 KPX Acircumflex Q -30 KPX Acircumflex T -120 KPX Acircumflex Tcaron -120 KPX Acircumflex Tcommaaccent -120 KPX Acircumflex U -50 KPX Acircumflex Uacute -50 KPX Acircumflex Ucircumflex -50 KPX Acircumflex Udieresis -50 KPX Acircumflex Ugrave -50 KPX Acircumflex Uhungarumlaut -50 KPX Acircumflex Umacron -50 KPX Acircumflex Uogonek -50 KPX Acircumflex Uring -50 KPX Acircumflex V -70 KPX Acircumflex W -50 KPX Acircumflex Y -100 KPX Acircumflex Yacute -100 KPX Acircumflex Ydieresis -100 KPX Acircumflex u -30 KPX Acircumflex uacute -30 KPX Acircumflex ucircumflex -30 KPX Acircumflex udieresis -30 KPX Acircumflex ugrave -30 KPX Acircumflex uhungarumlaut -30 KPX Acircumflex umacron -30 KPX Acircumflex uogonek -30 KPX Acircumflex uring -30 KPX Acircumflex v -40 KPX Acircumflex w -40 KPX Acircumflex y -40 KPX Acircumflex yacute -40 KPX Acircumflex ydieresis -40 KPX Adieresis C -30 KPX Adieresis Cacute -30 KPX Adieresis Ccaron -30 KPX Adieresis Ccedilla -30 KPX Adieresis G -30 KPX Adieresis Gbreve -30 KPX Adieresis Gcommaaccent -30 KPX Adieresis O -30 KPX Adieresis Oacute -30 KPX Adieresis Ocircumflex -30 KPX Adieresis Odieresis -30 KPX Adieresis Ograve -30 KPX Adieresis Ohungarumlaut -30 KPX Adieresis Omacron -30 KPX Adieresis Oslash -30 KPX Adieresis Otilde -30 KPX Adieresis Q -30 KPX Adieresis T -120 KPX Adieresis Tcaron -120 KPX Adieresis Tcommaaccent -120 KPX Adieresis U -50 KPX Adieresis Uacute -50 KPX Adieresis Ucircumflex -50 KPX Adieresis Udieresis -50 KPX Adieresis Ugrave -50 KPX Adieresis Uhungarumlaut -50 KPX Adieresis Umacron -50 KPX Adieresis Uogonek -50 KPX Adieresis Uring -50 KPX Adieresis V -70 KPX Adieresis W -50 KPX Adieresis Y -100 KPX Adieresis Yacute -100 KPX Adieresis Ydieresis -100 KPX Adieresis u -30 KPX Adieresis uacute -30 KPX Adieresis ucircumflex -30 KPX Adieresis udieresis -30 KPX Adieresis ugrave -30 KPX Adieresis uhungarumlaut -30 KPX Adieresis umacron -30 KPX Adieresis uogonek -30 KPX Adieresis uring -30 KPX Adieresis v -40 KPX Adieresis w -40 KPX Adieresis y -40 KPX Adieresis yacute -40 KPX Adieresis ydieresis -40 KPX Agrave C -30 KPX Agrave Cacute -30 KPX Agrave Ccaron -30 KPX Agrave Ccedilla -30 KPX Agrave G -30 KPX Agrave Gbreve -30 KPX Agrave Gcommaaccent -30 KPX Agrave O -30 KPX Agrave Oacute -30 KPX Agrave Ocircumflex -30 KPX Agrave Odieresis -30 KPX Agrave Ograve -30 KPX Agrave Ohungarumlaut -30 KPX Agrave Omacron -30 KPX Agrave Oslash -30 KPX Agrave Otilde -30 KPX Agrave Q -30 KPX Agrave T -120 KPX Agrave Tcaron -120 KPX Agrave Tcommaaccent -120 KPX Agrave U -50 KPX Agrave Uacute -50 KPX Agrave Ucircumflex -50 KPX Agrave Udieresis -50 KPX Agrave Ugrave -50 KPX Agrave Uhungarumlaut -50 KPX Agrave Umacron -50 KPX Agrave Uogonek -50 KPX Agrave Uring -50 KPX Agrave V -70 KPX Agrave W -50 KPX Agrave Y -100 KPX Agrave Yacute -100 KPX Agrave Ydieresis -100 KPX Agrave u -30 KPX Agrave uacute -30 KPX Agrave ucircumflex -30 KPX Agrave udieresis -30 KPX Agrave ugrave -30 KPX Agrave uhungarumlaut -30 KPX Agrave umacron -30 KPX Agrave uogonek -30 KPX Agrave uring -30 KPX Agrave v -40 KPX Agrave w -40 KPX Agrave y -40 KPX Agrave yacute -40 KPX Agrave ydieresis -40 KPX Amacron C -30 KPX Amacron Cacute -30 KPX Amacron Ccaron -30 KPX Amacron Ccedilla -30 KPX Amacron G -30 KPX Amacron Gbreve -30 KPX Amacron Gcommaaccent -30 KPX Amacron O -30 KPX Amacron Oacute -30 KPX Amacron Ocircumflex -30 KPX Amacron Odieresis -30 KPX Amacron Ograve -30 KPX Amacron Ohungarumlaut -30 KPX Amacron Omacron -30 KPX Amacron Oslash -30 KPX Amacron Otilde -30 KPX Amacron Q -30 KPX Amacron T -120 KPX Amacron Tcaron -120 KPX Amacron Tcommaaccent -120 KPX Amacron U -50 KPX Amacron Uacute -50 KPX Amacron Ucircumflex -50 KPX Amacron Udieresis -50 KPX Amacron Ugrave -50 KPX Amacron Uhungarumlaut -50 KPX Amacron Umacron -50 KPX Amacron Uogonek -50 KPX Amacron Uring -50 KPX Amacron V -70 KPX Amacron W -50 KPX Amacron Y -100 KPX Amacron Yacute -100 KPX Amacron Ydieresis -100 KPX Amacron u -30 KPX Amacron uacute -30 KPX Amacron ucircumflex -30 KPX Amacron udieresis -30 KPX Amacron ugrave -30 KPX Amacron uhungarumlaut -30 KPX Amacron umacron -30 KPX Amacron uogonek -30 KPX Amacron uring -30 KPX Amacron v -40 KPX Amacron w -40 KPX Amacron y -40 KPX Amacron yacute -40 KPX Amacron ydieresis -40 KPX Aogonek C -30 KPX Aogonek Cacute -30 KPX Aogonek Ccaron -30 KPX Aogonek Ccedilla -30 KPX Aogonek G -30 KPX Aogonek Gbreve -30 KPX Aogonek Gcommaaccent -30 KPX Aogonek O -30 KPX Aogonek Oacute -30 KPX Aogonek Ocircumflex -30 KPX Aogonek Odieresis -30 KPX Aogonek Ograve -30 KPX Aogonek Ohungarumlaut -30 KPX Aogonek Omacron -30 KPX Aogonek Oslash -30 KPX Aogonek Otilde -30 KPX Aogonek Q -30 KPX Aogonek T -120 KPX Aogonek Tcaron -120 KPX Aogonek Tcommaaccent -120 KPX Aogonek U -50 KPX Aogonek Uacute -50 KPX Aogonek Ucircumflex -50 KPX Aogonek Udieresis -50 KPX Aogonek Ugrave -50 KPX Aogonek Uhungarumlaut -50 KPX Aogonek Umacron -50 KPX Aogonek Uogonek -50 KPX Aogonek Uring -50 KPX Aogonek V -70 KPX Aogonek W -50 KPX Aogonek Y -100 KPX Aogonek Yacute -100 KPX Aogonek Ydieresis -100 KPX Aogonek u -30 KPX Aogonek uacute -30 KPX Aogonek ucircumflex -30 KPX Aogonek udieresis -30 KPX Aogonek ugrave -30 KPX Aogonek uhungarumlaut -30 KPX Aogonek umacron -30 KPX Aogonek uogonek -30 KPX Aogonek uring -30 KPX Aogonek v -40 KPX Aogonek w -40 KPX Aogonek y -40 KPX Aogonek yacute -40 KPX Aogonek ydieresis -40 KPX Aring C -30 KPX Aring Cacute -30 KPX Aring Ccaron -30 KPX Aring Ccedilla -30 KPX Aring G -30 KPX Aring Gbreve -30 KPX Aring Gcommaaccent -30 KPX Aring O -30 KPX Aring Oacute -30 KPX Aring Ocircumflex -30 KPX Aring Odieresis -30 KPX Aring Ograve -30 KPX Aring Ohungarumlaut -30 KPX Aring Omacron -30 KPX Aring Oslash -30 KPX Aring Otilde -30 KPX Aring Q -30 KPX Aring T -120 KPX Aring Tcaron -120 KPX Aring Tcommaaccent -120 KPX Aring U -50 KPX Aring Uacute -50 KPX Aring Ucircumflex -50 KPX Aring Udieresis -50 KPX Aring Ugrave -50 KPX Aring Uhungarumlaut -50 KPX Aring Umacron -50 KPX Aring Uogonek -50 KPX Aring Uring -50 KPX Aring V -70 KPX Aring W -50 KPX Aring Y -100 KPX Aring Yacute -100 KPX Aring Ydieresis -100 KPX Aring u -30 KPX Aring uacute -30 KPX Aring ucircumflex -30 KPX Aring udieresis -30 KPX Aring ugrave -30 KPX Aring uhungarumlaut -30 KPX Aring umacron -30 KPX Aring uogonek -30 KPX Aring uring -30 KPX Aring v -40 KPX Aring w -40 KPX Aring y -40 KPX Aring yacute -40 KPX Aring ydieresis -40 KPX Atilde C -30 KPX Atilde Cacute -30 KPX Atilde Ccaron -30 KPX Atilde Ccedilla -30 KPX Atilde G -30 KPX Atilde Gbreve -30 KPX Atilde Gcommaaccent -30 KPX Atilde O -30 KPX Atilde Oacute -30 KPX Atilde Ocircumflex -30 KPX Atilde Odieresis -30 KPX Atilde Ograve -30 KPX Atilde Ohungarumlaut -30 KPX Atilde Omacron -30 KPX Atilde Oslash -30 KPX Atilde Otilde -30 KPX Atilde Q -30 KPX Atilde T -120 KPX Atilde Tcaron -120 KPX Atilde Tcommaaccent -120 KPX Atilde U -50 KPX Atilde Uacute -50 KPX Atilde Ucircumflex -50 KPX Atilde Udieresis -50 KPX Atilde Ugrave -50 KPX Atilde Uhungarumlaut -50 KPX Atilde Umacron -50 KPX Atilde Uogonek -50 KPX Atilde Uring -50 KPX Atilde V -70 KPX Atilde W -50 KPX Atilde Y -100 KPX Atilde Yacute -100 KPX Atilde Ydieresis -100 KPX Atilde u -30 KPX Atilde uacute -30 KPX Atilde ucircumflex -30 KPX Atilde udieresis -30 KPX Atilde ugrave -30 KPX Atilde uhungarumlaut -30 KPX Atilde umacron -30 KPX Atilde uogonek -30 KPX Atilde uring -30 KPX Atilde v -40 KPX Atilde w -40 KPX Atilde y -40 KPX Atilde yacute -40 KPX Atilde ydieresis -40 KPX B U -10 KPX B Uacute -10 KPX B Ucircumflex -10 KPX B Udieresis -10 KPX B Ugrave -10 KPX B Uhungarumlaut -10 KPX B Umacron -10 KPX B Uogonek -10 KPX B Uring -10 KPX B comma -20 KPX B period -20 KPX C comma -30 KPX C period -30 KPX Cacute comma -30 KPX Cacute period -30 KPX Ccaron comma -30 KPX Ccaron period -30 KPX Ccedilla comma -30 KPX Ccedilla period -30 KPX D A -40 KPX D Aacute -40 KPX D Abreve -40 KPX D Acircumflex -40 KPX D Adieresis -40 KPX D Agrave -40 KPX D Amacron -40 KPX D Aogonek -40 KPX D Aring -40 KPX D Atilde -40 KPX D V -70 KPX D W -40 KPX D Y -90 KPX D Yacute -90 KPX D Ydieresis -90 KPX D comma -70 KPX D period -70 KPX Dcaron A -40 KPX Dcaron Aacute -40 KPX Dcaron Abreve -40 KPX Dcaron Acircumflex -40 KPX Dcaron Adieresis -40 KPX Dcaron Agrave -40 KPX Dcaron Amacron -40 KPX Dcaron Aogonek -40 KPX Dcaron Aring -40 KPX Dcaron Atilde -40 KPX Dcaron V -70 KPX Dcaron W -40 KPX Dcaron Y -90 KPX Dcaron Yacute -90 KPX Dcaron Ydieresis -90 KPX Dcaron comma -70 KPX Dcaron period -70 KPX Dcroat A -40 KPX Dcroat Aacute -40 KPX Dcroat Abreve -40 KPX Dcroat Acircumflex -40 KPX Dcroat Adieresis -40 KPX Dcroat Agrave -40 KPX Dcroat Amacron -40 KPX Dcroat Aogonek -40 KPX Dcroat Aring -40 KPX Dcroat Atilde -40 KPX Dcroat V -70 KPX Dcroat W -40 KPX Dcroat Y -90 KPX Dcroat Yacute -90 KPX Dcroat Ydieresis -90 KPX Dcroat comma -70 KPX Dcroat period -70 KPX F A -80 KPX F Aacute -80 KPX F Abreve -80 KPX F Acircumflex -80 KPX F Adieresis -80 KPX F Agrave -80 KPX F Amacron -80 KPX F Aogonek -80 KPX F Aring -80 KPX F Atilde -80 KPX F a -50 KPX F aacute -50 KPX F abreve -50 KPX F acircumflex -50 KPX F adieresis -50 KPX F agrave -50 KPX F amacron -50 KPX F aogonek -50 KPX F aring -50 KPX F atilde -50 KPX F comma -150 KPX F e -30 KPX F eacute -30 KPX F ecaron -30 KPX F ecircumflex -30 KPX F edieresis -30 KPX F edotaccent -30 KPX F egrave -30 KPX F emacron -30 KPX F eogonek -30 KPX F o -30 KPX F oacute -30 KPX F ocircumflex -30 KPX F odieresis -30 KPX F ograve -30 KPX F ohungarumlaut -30 KPX F omacron -30 KPX F oslash -30 KPX F otilde -30 KPX F period -150 KPX F r -45 KPX F racute -45 KPX F rcaron -45 KPX F rcommaaccent -45 KPX J A -20 KPX J Aacute -20 KPX J Abreve -20 KPX J Acircumflex -20 KPX J Adieresis -20 KPX J Agrave -20 KPX J Amacron -20 KPX J Aogonek -20 KPX J Aring -20 KPX J Atilde -20 KPX J a -20 KPX J aacute -20 KPX J abreve -20 KPX J acircumflex -20 KPX J adieresis -20 KPX J agrave -20 KPX J amacron -20 KPX J aogonek -20 KPX J aring -20 KPX J atilde -20 KPX J comma -30 KPX J period -30 KPX J u -20 KPX J uacute -20 KPX J ucircumflex -20 KPX J udieresis -20 KPX J ugrave -20 KPX J uhungarumlaut -20 KPX J umacron -20 KPX J uogonek -20 KPX J uring -20 KPX K O -50 KPX K Oacute -50 KPX K Ocircumflex -50 KPX K Odieresis -50 KPX K Ograve -50 KPX K Ohungarumlaut -50 KPX K Omacron -50 KPX K Oslash -50 KPX K Otilde -50 KPX K e -40 KPX K eacute -40 KPX K ecaron -40 KPX K ecircumflex -40 KPX K edieresis -40 KPX K edotaccent -40 KPX K egrave -40 KPX K emacron -40 KPX K eogonek -40 KPX K o -40 KPX K oacute -40 KPX K ocircumflex -40 KPX K odieresis -40 KPX K ograve -40 KPX K ohungarumlaut -40 KPX K omacron -40 KPX K oslash -40 KPX K otilde -40 KPX K u -30 KPX K uacute -30 KPX K ucircumflex -30 KPX K udieresis -30 KPX K ugrave -30 KPX K uhungarumlaut -30 KPX K umacron -30 KPX K uogonek -30 KPX K uring -30 KPX K y -50 KPX K yacute -50 KPX K ydieresis -50 KPX Kcommaaccent O -50 KPX Kcommaaccent Oacute -50 KPX Kcommaaccent Ocircumflex -50 KPX Kcommaaccent Odieresis -50 KPX Kcommaaccent Ograve -50 KPX Kcommaaccent Ohungarumlaut -50 KPX Kcommaaccent Omacron -50 KPX Kcommaaccent Oslash -50 KPX Kcommaaccent Otilde -50 KPX Kcommaaccent e -40 KPX Kcommaaccent eacute -40 KPX Kcommaaccent ecaron -40 KPX Kcommaaccent ecircumflex -40 KPX Kcommaaccent edieresis -40 KPX Kcommaaccent edotaccent -40 KPX Kcommaaccent egrave -40 KPX Kcommaaccent emacron -40 KPX Kcommaaccent eogonek -40 KPX Kcommaaccent o -40 KPX Kcommaaccent oacute -40 KPX Kcommaaccent ocircumflex -40 KPX Kcommaaccent odieresis -40 KPX Kcommaaccent ograve -40 KPX Kcommaaccent ohungarumlaut -40 KPX Kcommaaccent omacron -40 KPX Kcommaaccent oslash -40 KPX Kcommaaccent otilde -40 KPX Kcommaaccent u -30 KPX Kcommaaccent uacute -30 KPX Kcommaaccent ucircumflex -30 KPX Kcommaaccent udieresis -30 KPX Kcommaaccent ugrave -30 KPX Kcommaaccent uhungarumlaut -30 KPX Kcommaaccent umacron -30 KPX Kcommaaccent uogonek -30 KPX Kcommaaccent uring -30 KPX Kcommaaccent y -50 KPX Kcommaaccent yacute -50 KPX Kcommaaccent ydieresis -50 KPX L T -110 KPX L Tcaron -110 KPX L Tcommaaccent -110 KPX L V -110 KPX L W -70 KPX L Y -140 KPX L Yacute -140 KPX L Ydieresis -140 KPX L quotedblright -140 KPX L quoteright -160 KPX L y -30 KPX L yacute -30 KPX L ydieresis -30 KPX Lacute T -110 KPX Lacute Tcaron -110 KPX Lacute Tcommaaccent -110 KPX Lacute V -110 KPX Lacute W -70 KPX Lacute Y -140 KPX Lacute Yacute -140 KPX Lacute Ydieresis -140 KPX Lacute quotedblright -140 KPX Lacute quoteright -160 KPX Lacute y -30 KPX Lacute yacute -30 KPX Lacute ydieresis -30 KPX Lcaron T -110 KPX Lcaron Tcaron -110 KPX Lcaron Tcommaaccent -110 KPX Lcaron V -110 KPX Lcaron W -70 KPX Lcaron Y -140 KPX Lcaron Yacute -140 KPX Lcaron Ydieresis -140 KPX Lcaron quotedblright -140 KPX Lcaron quoteright -160 KPX Lcaron y -30 KPX Lcaron yacute -30 KPX Lcaron ydieresis -30 KPX Lcommaaccent T -110 KPX Lcommaaccent Tcaron -110 KPX Lcommaaccent Tcommaaccent -110 KPX Lcommaaccent V -110 KPX Lcommaaccent W -70 KPX Lcommaaccent Y -140 KPX Lcommaaccent Yacute -140 KPX Lcommaaccent Ydieresis -140 KPX Lcommaaccent quotedblright -140 KPX Lcommaaccent quoteright -160 KPX Lcommaaccent y -30 KPX Lcommaaccent yacute -30 KPX Lcommaaccent ydieresis -30 KPX Lslash T -110 KPX Lslash Tcaron -110 KPX Lslash Tcommaaccent -110 KPX Lslash V -110 KPX Lslash W -70 KPX Lslash Y -140 KPX Lslash Yacute -140 KPX Lslash Ydieresis -140 KPX Lslash quotedblright -140 KPX Lslash quoteright -160 KPX Lslash y -30 KPX Lslash yacute -30 KPX Lslash ydieresis -30 KPX O A -20 KPX O Aacute -20 KPX O Abreve -20 KPX O Acircumflex -20 KPX O Adieresis -20 KPX O Agrave -20 KPX O Amacron -20 KPX O Aogonek -20 KPX O Aring -20 KPX O Atilde -20 KPX O T -40 KPX O Tcaron -40 KPX O Tcommaaccent -40 KPX O V -50 KPX O W -30 KPX O X -60 KPX O Y -70 KPX O Yacute -70 KPX O Ydieresis -70 KPX O comma -40 KPX O period -40 KPX Oacute A -20 KPX Oacute Aacute -20 KPX Oacute Abreve -20 KPX Oacute Acircumflex -20 KPX Oacute Adieresis -20 KPX Oacute Agrave -20 KPX Oacute Amacron -20 KPX Oacute Aogonek -20 KPX Oacute Aring -20 KPX Oacute Atilde -20 KPX Oacute T -40 KPX Oacute Tcaron -40 KPX Oacute Tcommaaccent -40 KPX Oacute V -50 KPX Oacute W -30 KPX Oacute X -60 KPX Oacute Y -70 KPX Oacute Yacute -70 KPX Oacute Ydieresis -70 KPX Oacute comma -40 KPX Oacute period -40 KPX Ocircumflex A -20 KPX Ocircumflex Aacute -20 KPX Ocircumflex Abreve -20 KPX Ocircumflex Acircumflex -20 KPX Ocircumflex Adieresis -20 KPX Ocircumflex Agrave -20 KPX Ocircumflex Amacron -20 KPX Ocircumflex Aogonek -20 KPX Ocircumflex Aring -20 KPX Ocircumflex Atilde -20 KPX Ocircumflex T -40 KPX Ocircumflex Tcaron -40 KPX Ocircumflex Tcommaaccent -40 KPX Ocircumflex V -50 KPX Ocircumflex W -30 KPX Ocircumflex X -60 KPX Ocircumflex Y -70 KPX Ocircumflex Yacute -70 KPX Ocircumflex Ydieresis -70 KPX Ocircumflex comma -40 KPX Ocircumflex period -40 KPX Odieresis A -20 KPX Odieresis Aacute -20 KPX Odieresis Abreve -20 KPX Odieresis Acircumflex -20 KPX Odieresis Adieresis -20 KPX Odieresis Agrave -20 KPX Odieresis Amacron -20 KPX Odieresis Aogonek -20 KPX Odieresis Aring -20 KPX Odieresis Atilde -20 KPX Odieresis T -40 KPX Odieresis Tcaron -40 KPX Odieresis Tcommaaccent -40 KPX Odieresis V -50 KPX Odieresis W -30 KPX Odieresis X -60 KPX Odieresis Y -70 KPX Odieresis Yacute -70 KPX Odieresis Ydieresis -70 KPX Odieresis comma -40 KPX Odieresis period -40 KPX Ograve A -20 KPX Ograve Aacute -20 KPX Ograve Abreve -20 KPX Ograve Acircumflex -20 KPX Ograve Adieresis -20 KPX Ograve Agrave -20 KPX Ograve Amacron -20 KPX Ograve Aogonek -20 KPX Ograve Aring -20 KPX Ograve Atilde -20 KPX Ograve T -40 KPX Ograve Tcaron -40 KPX Ograve Tcommaaccent -40 KPX Ograve V -50 KPX Ograve W -30 KPX Ograve X -60 KPX Ograve Y -70 KPX Ograve Yacute -70 KPX Ograve Ydieresis -70 KPX Ograve comma -40 KPX Ograve period -40 KPX Ohungarumlaut A -20 KPX Ohungarumlaut Aacute -20 KPX Ohungarumlaut Abreve -20 KPX Ohungarumlaut Acircumflex -20 KPX Ohungarumlaut Adieresis -20 KPX Ohungarumlaut Agrave -20 KPX Ohungarumlaut Amacron -20 KPX Ohungarumlaut Aogonek -20 KPX Ohungarumlaut Aring -20 KPX Ohungarumlaut Atilde -20 KPX Ohungarumlaut T -40 KPX Ohungarumlaut Tcaron -40 KPX Ohungarumlaut Tcommaaccent -40 KPX Ohungarumlaut V -50 KPX Ohungarumlaut W -30 KPX Ohungarumlaut X -60 KPX Ohungarumlaut Y -70 KPX Ohungarumlaut Yacute -70 KPX Ohungarumlaut Ydieresis -70 KPX Ohungarumlaut comma -40 KPX Ohungarumlaut period -40 KPX Omacron A -20 KPX Omacron Aacute -20 KPX Omacron Abreve -20 KPX Omacron Acircumflex -20 KPX Omacron Adieresis -20 KPX Omacron Agrave -20 KPX Omacron Amacron -20 KPX Omacron Aogonek -20 KPX Omacron Aring -20 KPX Omacron Atilde -20 KPX Omacron T -40 KPX Omacron Tcaron -40 KPX Omacron Tcommaaccent -40 KPX Omacron V -50 KPX Omacron W -30 KPX Omacron X -60 KPX Omacron Y -70 KPX Omacron Yacute -70 KPX Omacron Ydieresis -70 KPX Omacron comma -40 KPX Omacron period -40 KPX Oslash A -20 KPX Oslash Aacute -20 KPX Oslash Abreve -20 KPX Oslash Acircumflex -20 KPX Oslash Adieresis -20 KPX Oslash Agrave -20 KPX Oslash Amacron -20 KPX Oslash Aogonek -20 KPX Oslash Aring -20 KPX Oslash Atilde -20 KPX Oslash T -40 KPX Oslash Tcaron -40 KPX Oslash Tcommaaccent -40 KPX Oslash V -50 KPX Oslash W -30 KPX Oslash X -60 KPX Oslash Y -70 KPX Oslash Yacute -70 KPX Oslash Ydieresis -70 KPX Oslash comma -40 KPX Oslash period -40 KPX Otilde A -20 KPX Otilde Aacute -20 KPX Otilde Abreve -20 KPX Otilde Acircumflex -20 KPX Otilde Adieresis -20 KPX Otilde Agrave -20 KPX Otilde Amacron -20 KPX Otilde Aogonek -20 KPX Otilde Aring -20 KPX Otilde Atilde -20 KPX Otilde T -40 KPX Otilde Tcaron -40 KPX Otilde Tcommaaccent -40 KPX Otilde V -50 KPX Otilde W -30 KPX Otilde X -60 KPX Otilde Y -70 KPX Otilde Yacute -70 KPX Otilde Ydieresis -70 KPX Otilde comma -40 KPX Otilde period -40 KPX P A -120 KPX P Aacute -120 KPX P Abreve -120 KPX P Acircumflex -120 KPX P Adieresis -120 KPX P Agrave -120 KPX P Amacron -120 KPX P Aogonek -120 KPX P Aring -120 KPX P Atilde -120 KPX P a -40 KPX P aacute -40 KPX P abreve -40 KPX P acircumflex -40 KPX P adieresis -40 KPX P agrave -40 KPX P amacron -40 KPX P aogonek -40 KPX P aring -40 KPX P atilde -40 KPX P comma -180 KPX P e -50 KPX P eacute -50 KPX P ecaron -50 KPX P ecircumflex -50 KPX P edieresis -50 KPX P edotaccent -50 KPX P egrave -50 KPX P emacron -50 KPX P eogonek -50 KPX P o -50 KPX P oacute -50 KPX P ocircumflex -50 KPX P odieresis -50 KPX P ograve -50 KPX P ohungarumlaut -50 KPX P omacron -50 KPX P oslash -50 KPX P otilde -50 KPX P period -180 KPX Q U -10 KPX Q Uacute -10 KPX Q Ucircumflex -10 KPX Q Udieresis -10 KPX Q Ugrave -10 KPX Q Uhungarumlaut -10 KPX Q Umacron -10 KPX Q Uogonek -10 KPX Q Uring -10 KPX R O -20 KPX R Oacute -20 KPX R Ocircumflex -20 KPX R Odieresis -20 KPX R Ograve -20 KPX R Ohungarumlaut -20 KPX R Omacron -20 KPX R Oslash -20 KPX R Otilde -20 KPX R T -30 KPX R Tcaron -30 KPX R Tcommaaccent -30 KPX R U -40 KPX R Uacute -40 KPX R Ucircumflex -40 KPX R Udieresis -40 KPX R Ugrave -40 KPX R Uhungarumlaut -40 KPX R Umacron -40 KPX R Uogonek -40 KPX R Uring -40 KPX R V -50 KPX R W -30 KPX R Y -50 KPX R Yacute -50 KPX R Ydieresis -50 KPX Racute O -20 KPX Racute Oacute -20 KPX Racute Ocircumflex -20 KPX Racute Odieresis -20 KPX Racute Ograve -20 KPX Racute Ohungarumlaut -20 KPX Racute Omacron -20 KPX Racute Oslash -20 KPX Racute Otilde -20 KPX Racute T -30 KPX Racute Tcaron -30 KPX Racute Tcommaaccent -30 KPX Racute U -40 KPX Racute Uacute -40 KPX Racute Ucircumflex -40 KPX Racute Udieresis -40 KPX Racute Ugrave -40 KPX Racute Uhungarumlaut -40 KPX Racute Umacron -40 KPX Racute Uogonek -40 KPX Racute Uring -40 KPX Racute V -50 KPX Racute W -30 KPX Racute Y -50 KPX Racute Yacute -50 KPX Racute Ydieresis -50 KPX Rcaron O -20 KPX Rcaron Oacute -20 KPX Rcaron Ocircumflex -20 KPX Rcaron Odieresis -20 KPX Rcaron Ograve -20 KPX Rcaron Ohungarumlaut -20 KPX Rcaron Omacron -20 KPX Rcaron Oslash -20 KPX Rcaron Otilde -20 KPX Rcaron T -30 KPX Rcaron Tcaron -30 KPX Rcaron Tcommaaccent -30 KPX Rcaron U -40 KPX Rcaron Uacute -40 KPX Rcaron Ucircumflex -40 KPX Rcaron Udieresis -40 KPX Rcaron Ugrave -40 KPX Rcaron Uhungarumlaut -40 KPX Rcaron Umacron -40 KPX Rcaron Uogonek -40 KPX Rcaron Uring -40 KPX Rcaron V -50 KPX Rcaron W -30 KPX Rcaron Y -50 KPX Rcaron Yacute -50 KPX Rcaron Ydieresis -50 KPX Rcommaaccent O -20 KPX Rcommaaccent Oacute -20 KPX Rcommaaccent Ocircumflex -20 KPX Rcommaaccent Odieresis -20 KPX Rcommaaccent Ograve -20 KPX Rcommaaccent Ohungarumlaut -20 KPX Rcommaaccent Omacron -20 KPX Rcommaaccent Oslash -20 KPX Rcommaaccent Otilde -20 KPX Rcommaaccent T -30 KPX Rcommaaccent Tcaron -30 KPX Rcommaaccent Tcommaaccent -30 KPX Rcommaaccent U -40 KPX Rcommaaccent Uacute -40 KPX Rcommaaccent Ucircumflex -40 KPX Rcommaaccent Udieresis -40 KPX Rcommaaccent Ugrave -40 KPX Rcommaaccent Uhungarumlaut -40 KPX Rcommaaccent Umacron -40 KPX Rcommaaccent Uogonek -40 KPX Rcommaaccent Uring -40 KPX Rcommaaccent V -50 KPX Rcommaaccent W -30 KPX Rcommaaccent Y -50 KPX Rcommaaccent Yacute -50 KPX Rcommaaccent Ydieresis -50 KPX S comma -20 KPX S period -20 KPX Sacute comma -20 KPX Sacute period -20 KPX Scaron comma -20 KPX Scaron period -20 KPX Scedilla comma -20 KPX Scedilla period -20 KPX Scommaaccent comma -20 KPX Scommaaccent period -20 KPX T A -120 KPX T Aacute -120 KPX T Abreve -120 KPX T Acircumflex -120 KPX T Adieresis -120 KPX T Agrave -120 KPX T Amacron -120 KPX T Aogonek -120 KPX T Aring -120 KPX T Atilde -120 KPX T O -40 KPX T Oacute -40 KPX T Ocircumflex -40 KPX T Odieresis -40 KPX T Ograve -40 KPX T Ohungarumlaut -40 KPX T Omacron -40 KPX T Oslash -40 KPX T Otilde -40 KPX T a -120 KPX T aacute -120 KPX T abreve -60 KPX T acircumflex -120 KPX T adieresis -120 KPX T agrave -120 KPX T amacron -60 KPX T aogonek -120 KPX T aring -120 KPX T atilde -60 KPX T colon -20 KPX T comma -120 KPX T e -120 KPX T eacute -120 KPX T ecaron -120 KPX T ecircumflex -120 KPX T edieresis -120 KPX T edotaccent -120 KPX T egrave -60 KPX T emacron -60 KPX T eogonek -120 KPX T hyphen -140 KPX T o -120 KPX T oacute -120 KPX T ocircumflex -120 KPX T odieresis -120 KPX T ograve -120 KPX T ohungarumlaut -120 KPX T omacron -60 KPX T oslash -120 KPX T otilde -60 KPX T period -120 KPX T r -120 KPX T racute -120 KPX T rcaron -120 KPX T rcommaaccent -120 KPX T semicolon -20 KPX T u -120 KPX T uacute -120 KPX T ucircumflex -120 KPX T udieresis -120 KPX T ugrave -120 KPX T uhungarumlaut -120 KPX T umacron -60 KPX T uogonek -120 KPX T uring -120 KPX T w -120 KPX T y -120 KPX T yacute -120 KPX T ydieresis -60 KPX Tcaron A -120 KPX Tcaron Aacute -120 KPX Tcaron Abreve -120 KPX Tcaron Acircumflex -120 KPX Tcaron Adieresis -120 KPX Tcaron Agrave -120 KPX Tcaron Amacron -120 KPX Tcaron Aogonek -120 KPX Tcaron Aring -120 KPX Tcaron Atilde -120 KPX Tcaron O -40 KPX Tcaron Oacute -40 KPX Tcaron Ocircumflex -40 KPX Tcaron Odieresis -40 KPX Tcaron Ograve -40 KPX Tcaron Ohungarumlaut -40 KPX Tcaron Omacron -40 KPX Tcaron Oslash -40 KPX Tcaron Otilde -40 KPX Tcaron a -120 KPX Tcaron aacute -120 KPX Tcaron abreve -60 KPX Tcaron acircumflex -120 KPX Tcaron adieresis -120 KPX Tcaron agrave -120 KPX Tcaron amacron -60 KPX Tcaron aogonek -120 KPX Tcaron aring -120 KPX Tcaron atilde -60 KPX Tcaron colon -20 KPX Tcaron comma -120 KPX Tcaron e -120 KPX Tcaron eacute -120 KPX Tcaron ecaron -120 KPX Tcaron ecircumflex -120 KPX Tcaron edieresis -120 KPX Tcaron edotaccent -120 KPX Tcaron egrave -60 KPX Tcaron emacron -60 KPX Tcaron eogonek -120 KPX Tcaron hyphen -140 KPX Tcaron o -120 KPX Tcaron oacute -120 KPX Tcaron ocircumflex -120 KPX Tcaron odieresis -120 KPX Tcaron ograve -120 KPX Tcaron ohungarumlaut -120 KPX Tcaron omacron -60 KPX Tcaron oslash -120 KPX Tcaron otilde -60 KPX Tcaron period -120 KPX Tcaron r -120 KPX Tcaron racute -120 KPX Tcaron rcaron -120 KPX Tcaron rcommaaccent -120 KPX Tcaron semicolon -20 KPX Tcaron u -120 KPX Tcaron uacute -120 KPX Tcaron ucircumflex -120 KPX Tcaron udieresis -120 KPX Tcaron ugrave -120 KPX Tcaron uhungarumlaut -120 KPX Tcaron umacron -60 KPX Tcaron uogonek -120 KPX Tcaron uring -120 KPX Tcaron w -120 KPX Tcaron y -120 KPX Tcaron yacute -120 KPX Tcaron ydieresis -60 KPX Tcommaaccent A -120 KPX Tcommaaccent Aacute -120 KPX Tcommaaccent Abreve -120 KPX Tcommaaccent Acircumflex -120 KPX Tcommaaccent Adieresis -120 KPX Tcommaaccent Agrave -120 KPX Tcommaaccent Amacron -120 KPX Tcommaaccent Aogonek -120 KPX Tcommaaccent Aring -120 KPX Tcommaaccent Atilde -120 KPX Tcommaaccent O -40 KPX Tcommaaccent Oacute -40 KPX Tcommaaccent Ocircumflex -40 KPX Tcommaaccent Odieresis -40 KPX Tcommaaccent Ograve -40 KPX Tcommaaccent Ohungarumlaut -40 KPX Tcommaaccent Omacron -40 KPX Tcommaaccent Oslash -40 KPX Tcommaaccent Otilde -40 KPX Tcommaaccent a -120 KPX Tcommaaccent aacute -120 KPX Tcommaaccent abreve -60 KPX Tcommaaccent acircumflex -120 KPX Tcommaaccent adieresis -120 KPX Tcommaaccent agrave -120 KPX Tcommaaccent amacron -60 KPX Tcommaaccent aogonek -120 KPX Tcommaaccent aring -120 KPX Tcommaaccent atilde -60 KPX Tcommaaccent colon -20 KPX Tcommaaccent comma -120 KPX Tcommaaccent e -120 KPX Tcommaaccent eacute -120 KPX Tcommaaccent ecaron -120 KPX Tcommaaccent ecircumflex -120 KPX Tcommaaccent edieresis -120 KPX Tcommaaccent edotaccent -120 KPX Tcommaaccent egrave -60 KPX Tcommaaccent emacron -60 KPX Tcommaaccent eogonek -120 KPX Tcommaaccent hyphen -140 KPX Tcommaaccent o -120 KPX Tcommaaccent oacute -120 KPX Tcommaaccent ocircumflex -120 KPX Tcommaaccent odieresis -120 KPX Tcommaaccent ograve -120 KPX Tcommaaccent ohungarumlaut -120 KPX Tcommaaccent omacron -60 KPX Tcommaaccent oslash -120 KPX Tcommaaccent otilde -60 KPX Tcommaaccent period -120 KPX Tcommaaccent r -120 KPX Tcommaaccent racute -120 KPX Tcommaaccent rcaron -120 KPX Tcommaaccent rcommaaccent -120 KPX Tcommaaccent semicolon -20 KPX Tcommaaccent u -120 KPX Tcommaaccent uacute -120 KPX Tcommaaccent ucircumflex -120 KPX Tcommaaccent udieresis -120 KPX Tcommaaccent ugrave -120 KPX Tcommaaccent uhungarumlaut -120 KPX Tcommaaccent umacron -60 KPX Tcommaaccent uogonek -120 KPX Tcommaaccent uring -120 KPX Tcommaaccent w -120 KPX Tcommaaccent y -120 KPX Tcommaaccent yacute -120 KPX Tcommaaccent ydieresis -60 KPX U A -40 KPX U Aacute -40 KPX U Abreve -40 KPX U Acircumflex -40 KPX U Adieresis -40 KPX U Agrave -40 KPX U Amacron -40 KPX U Aogonek -40 KPX U Aring -40 KPX U Atilde -40 KPX U comma -40 KPX U period -40 KPX Uacute A -40 KPX Uacute Aacute -40 KPX Uacute Abreve -40 KPX Uacute Acircumflex -40 KPX Uacute Adieresis -40 KPX Uacute Agrave -40 KPX Uacute Amacron -40 KPX Uacute Aogonek -40 KPX Uacute Aring -40 KPX Uacute Atilde -40 KPX Uacute comma -40 KPX Uacute period -40 KPX Ucircumflex A -40 KPX Ucircumflex Aacute -40 KPX Ucircumflex Abreve -40 KPX Ucircumflex Acircumflex -40 KPX Ucircumflex Adieresis -40 KPX Ucircumflex Agrave -40 KPX Ucircumflex Amacron -40 KPX Ucircumflex Aogonek -40 KPX Ucircumflex Aring -40 KPX Ucircumflex Atilde -40 KPX Ucircumflex comma -40 KPX Ucircumflex period -40 KPX Udieresis A -40 KPX Udieresis Aacute -40 KPX Udieresis Abreve -40 KPX Udieresis Acircumflex -40 KPX Udieresis Adieresis -40 KPX Udieresis Agrave -40 KPX Udieresis Amacron -40 KPX Udieresis Aogonek -40 KPX Udieresis Aring -40 KPX Udieresis Atilde -40 KPX Udieresis comma -40 KPX Udieresis period -40 KPX Ugrave A -40 KPX Ugrave Aacute -40 KPX Ugrave Abreve -40 KPX Ugrave Acircumflex -40 KPX Ugrave Adieresis -40 KPX Ugrave Agrave -40 KPX Ugrave Amacron -40 KPX Ugrave Aogonek -40 KPX Ugrave Aring -40 KPX Ugrave Atilde -40 KPX Ugrave comma -40 KPX Ugrave period -40 KPX Uhungarumlaut A -40 KPX Uhungarumlaut Aacute -40 KPX Uhungarumlaut Abreve -40 KPX Uhungarumlaut Acircumflex -40 KPX Uhungarumlaut Adieresis -40 KPX Uhungarumlaut Agrave -40 KPX Uhungarumlaut Amacron -40 KPX Uhungarumlaut Aogonek -40 KPX Uhungarumlaut Aring -40 KPX Uhungarumlaut Atilde -40 KPX Uhungarumlaut comma -40 KPX Uhungarumlaut period -40 KPX Umacron A -40 KPX Umacron Aacute -40 KPX Umacron Abreve -40 KPX Umacron Acircumflex -40 KPX Umacron Adieresis -40 KPX Umacron Agrave -40 KPX Umacron Amacron -40 KPX Umacron Aogonek -40 KPX Umacron Aring -40 KPX Umacron Atilde -40 KPX Umacron comma -40 KPX Umacron period -40 KPX Uogonek A -40 KPX Uogonek Aacute -40 KPX Uogonek Abreve -40 KPX Uogonek Acircumflex -40 KPX Uogonek Adieresis -40 KPX Uogonek Agrave -40 KPX Uogonek Amacron -40 KPX Uogonek Aogonek -40 KPX Uogonek Aring -40 KPX Uogonek Atilde -40 KPX Uogonek comma -40 KPX Uogonek period -40 KPX Uring A -40 KPX Uring Aacute -40 KPX Uring Abreve -40 KPX Uring Acircumflex -40 KPX Uring Adieresis -40 KPX Uring Agrave -40 KPX Uring Amacron -40 KPX Uring Aogonek -40 KPX Uring Aring -40 KPX Uring Atilde -40 KPX Uring comma -40 KPX Uring period -40 KPX V A -80 KPX V Aacute -80 KPX V Abreve -80 KPX V Acircumflex -80 KPX V Adieresis -80 KPX V Agrave -80 KPX V Amacron -80 KPX V Aogonek -80 KPX V Aring -80 KPX V Atilde -80 KPX V G -40 KPX V Gbreve -40 KPX V Gcommaaccent -40 KPX V O -40 KPX V Oacute -40 KPX V Ocircumflex -40 KPX V Odieresis -40 KPX V Ograve -40 KPX V Ohungarumlaut -40 KPX V Omacron -40 KPX V Oslash -40 KPX V Otilde -40 KPX V a -70 KPX V aacute -70 KPX V abreve -70 KPX V acircumflex -70 KPX V adieresis -70 KPX V agrave -70 KPX V amacron -70 KPX V aogonek -70 KPX V aring -70 KPX V atilde -70 KPX V colon -40 KPX V comma -125 KPX V e -80 KPX V eacute -80 KPX V ecaron -80 KPX V ecircumflex -80 KPX V edieresis -80 KPX V edotaccent -80 KPX V egrave -80 KPX V emacron -80 KPX V eogonek -80 KPX V hyphen -80 KPX V o -80 KPX V oacute -80 KPX V ocircumflex -80 KPX V odieresis -80 KPX V ograve -80 KPX V ohungarumlaut -80 KPX V omacron -80 KPX V oslash -80 KPX V otilde -80 KPX V period -125 KPX V semicolon -40 KPX V u -70 KPX V uacute -70 KPX V ucircumflex -70 KPX V udieresis -70 KPX V ugrave -70 KPX V uhungarumlaut -70 KPX V umacron -70 KPX V uogonek -70 KPX V uring -70 KPX W A -50 KPX W Aacute -50 KPX W Abreve -50 KPX W Acircumflex -50 KPX W Adieresis -50 KPX W Agrave -50 KPX W Amacron -50 KPX W Aogonek -50 KPX W Aring -50 KPX W Atilde -50 KPX W O -20 KPX W Oacute -20 KPX W Ocircumflex -20 KPX W Odieresis -20 KPX W Ograve -20 KPX W Ohungarumlaut -20 KPX W Omacron -20 KPX W Oslash -20 KPX W Otilde -20 KPX W a -40 KPX W aacute -40 KPX W abreve -40 KPX W acircumflex -40 KPX W adieresis -40 KPX W agrave -40 KPX W amacron -40 KPX W aogonek -40 KPX W aring -40 KPX W atilde -40 KPX W comma -80 KPX W e -30 KPX W eacute -30 KPX W ecaron -30 KPX W ecircumflex -30 KPX W edieresis -30 KPX W edotaccent -30 KPX W egrave -30 KPX W emacron -30 KPX W eogonek -30 KPX W hyphen -40 KPX W o -30 KPX W oacute -30 KPX W ocircumflex -30 KPX W odieresis -30 KPX W ograve -30 KPX W ohungarumlaut -30 KPX W omacron -30 KPX W oslash -30 KPX W otilde -30 KPX W period -80 KPX W u -30 KPX W uacute -30 KPX W ucircumflex -30 KPX W udieresis -30 KPX W ugrave -30 KPX W uhungarumlaut -30 KPX W umacron -30 KPX W uogonek -30 KPX W uring -30 KPX W y -20 KPX W yacute -20 KPX W ydieresis -20 KPX Y A -110 KPX Y Aacute -110 KPX Y Abreve -110 KPX Y Acircumflex -110 KPX Y Adieresis -110 KPX Y Agrave -110 KPX Y Amacron -110 KPX Y Aogonek -110 KPX Y Aring -110 KPX Y Atilde -110 KPX Y O -85 KPX Y Oacute -85 KPX Y Ocircumflex -85 KPX Y Odieresis -85 KPX Y Ograve -85 KPX Y Ohungarumlaut -85 KPX Y Omacron -85 KPX Y Oslash -85 KPX Y Otilde -85 KPX Y a -140 KPX Y aacute -140 KPX Y abreve -70 KPX Y acircumflex -140 KPX Y adieresis -140 KPX Y agrave -140 KPX Y amacron -70 KPX Y aogonek -140 KPX Y aring -140 KPX Y atilde -140 KPX Y colon -60 KPX Y comma -140 KPX Y e -140 KPX Y eacute -140 KPX Y ecaron -140 KPX Y ecircumflex -140 KPX Y edieresis -140 KPX Y edotaccent -140 KPX Y egrave -140 KPX Y emacron -70 KPX Y eogonek -140 KPX Y hyphen -140 KPX Y i -20 KPX Y iacute -20 KPX Y iogonek -20 KPX Y o -140 KPX Y oacute -140 KPX Y ocircumflex -140 KPX Y odieresis -140 KPX Y ograve -140 KPX Y ohungarumlaut -140 KPX Y omacron -140 KPX Y oslash -140 KPX Y otilde -140 KPX Y period -140 KPX Y semicolon -60 KPX Y u -110 KPX Y uacute -110 KPX Y ucircumflex -110 KPX Y udieresis -110 KPX Y ugrave -110 KPX Y uhungarumlaut -110 KPX Y umacron -110 KPX Y uogonek -110 KPX Y uring -110 KPX Yacute A -110 KPX Yacute Aacute -110 KPX Yacute Abreve -110 KPX Yacute Acircumflex -110 KPX Yacute Adieresis -110 KPX Yacute Agrave -110 KPX Yacute Amacron -110 KPX Yacute Aogonek -110 KPX Yacute Aring -110 KPX Yacute Atilde -110 KPX Yacute O -85 KPX Yacute Oacute -85 KPX Yacute Ocircumflex -85 KPX Yacute Odieresis -85 KPX Yacute Ograve -85 KPX Yacute Ohungarumlaut -85 KPX Yacute Omacron -85 KPX Yacute Oslash -85 KPX Yacute Otilde -85 KPX Yacute a -140 KPX Yacute aacute -140 KPX Yacute abreve -70 KPX Yacute acircumflex -140 KPX Yacute adieresis -140 KPX Yacute agrave -140 KPX Yacute amacron -70 KPX Yacute aogonek -140 KPX Yacute aring -140 KPX Yacute atilde -70 KPX Yacute colon -60 KPX Yacute comma -140 KPX Yacute e -140 KPX Yacute eacute -140 KPX Yacute ecaron -140 KPX Yacute ecircumflex -140 KPX Yacute edieresis -140 KPX Yacute edotaccent -140 KPX Yacute egrave -140 KPX Yacute emacron -70 KPX Yacute eogonek -140 KPX Yacute hyphen -140 KPX Yacute i -20 KPX Yacute iacute -20 KPX Yacute iogonek -20 KPX Yacute o -140 KPX Yacute oacute -140 KPX Yacute ocircumflex -140 KPX Yacute odieresis -140 KPX Yacute ograve -140 KPX Yacute ohungarumlaut -140 KPX Yacute omacron -70 KPX Yacute oslash -140 KPX Yacute otilde -140 KPX Yacute period -140 KPX Yacute semicolon -60 KPX Yacute u -110 KPX Yacute uacute -110 KPX Yacute ucircumflex -110 KPX Yacute udieresis -110 KPX Yacute ugrave -110 KPX Yacute uhungarumlaut -110 KPX Yacute umacron -110 KPX Yacute uogonek -110 KPX Yacute uring -110 KPX Ydieresis A -110 KPX Ydieresis Aacute -110 KPX Ydieresis Abreve -110 KPX Ydieresis Acircumflex -110 KPX Ydieresis Adieresis -110 KPX Ydieresis Agrave -110 KPX Ydieresis Amacron -110 KPX Ydieresis Aogonek -110 KPX Ydieresis Aring -110 KPX Ydieresis Atilde -110 KPX Ydieresis O -85 KPX Ydieresis Oacute -85 KPX Ydieresis Ocircumflex -85 KPX Ydieresis Odieresis -85 KPX Ydieresis Ograve -85 KPX Ydieresis Ohungarumlaut -85 KPX Ydieresis Omacron -85 KPX Ydieresis Oslash -85 KPX Ydieresis Otilde -85 KPX Ydieresis a -140 KPX Ydieresis aacute -140 KPX Ydieresis abreve -70 KPX Ydieresis acircumflex -140 KPX Ydieresis adieresis -140 KPX Ydieresis agrave -140 KPX Ydieresis amacron -70 KPX Ydieresis aogonek -140 KPX Ydieresis aring -140 KPX Ydieresis atilde -70 KPX Ydieresis colon -60 KPX Ydieresis comma -140 KPX Ydieresis e -140 KPX Ydieresis eacute -140 KPX Ydieresis ecaron -140 KPX Ydieresis ecircumflex -140 KPX Ydieresis edieresis -140 KPX Ydieresis edotaccent -140 KPX Ydieresis egrave -140 KPX Ydieresis emacron -70 KPX Ydieresis eogonek -140 KPX Ydieresis hyphen -140 KPX Ydieresis i -20 KPX Ydieresis iacute -20 KPX Ydieresis iogonek -20 KPX Ydieresis o -140 KPX Ydieresis oacute -140 KPX Ydieresis ocircumflex -140 KPX Ydieresis odieresis -140 KPX Ydieresis ograve -140 KPX Ydieresis ohungarumlaut -140 KPX Ydieresis omacron -140 KPX Ydieresis oslash -140 KPX Ydieresis otilde -140 KPX Ydieresis period -140 KPX Ydieresis semicolon -60 KPX Ydieresis u -110 KPX Ydieresis uacute -110 KPX Ydieresis ucircumflex -110 KPX Ydieresis udieresis -110 KPX Ydieresis ugrave -110 KPX Ydieresis uhungarumlaut -110 KPX Ydieresis umacron -110 KPX Ydieresis uogonek -110 KPX Ydieresis uring -110 KPX a v -20 KPX a w -20 KPX a y -30 KPX a yacute -30 KPX a ydieresis -30 KPX aacute v -20 KPX aacute w -20 KPX aacute y -30 KPX aacute yacute -30 KPX aacute ydieresis -30 KPX abreve v -20 KPX abreve w -20 KPX abreve y -30 KPX abreve yacute -30 KPX abreve ydieresis -30 KPX acircumflex v -20 KPX acircumflex w -20 KPX acircumflex y -30 KPX acircumflex yacute -30 KPX acircumflex ydieresis -30 KPX adieresis v -20 KPX adieresis w -20 KPX adieresis y -30 KPX adieresis yacute -30 KPX adieresis ydieresis -30 KPX agrave v -20 KPX agrave w -20 KPX agrave y -30 KPX agrave yacute -30 KPX agrave ydieresis -30 KPX amacron v -20 KPX amacron w -20 KPX amacron y -30 KPX amacron yacute -30 KPX amacron ydieresis -30 KPX aogonek v -20 KPX aogonek w -20 KPX aogonek y -30 KPX aogonek yacute -30 KPX aogonek ydieresis -30 KPX aring v -20 KPX aring w -20 KPX aring y -30 KPX aring yacute -30 KPX aring ydieresis -30 KPX atilde v -20 KPX atilde w -20 KPX atilde y -30 KPX atilde yacute -30 KPX atilde ydieresis -30 KPX b b -10 KPX b comma -40 KPX b l -20 KPX b lacute -20 KPX b lcommaaccent -20 KPX b lslash -20 KPX b period -40 KPX b u -20 KPX b uacute -20 KPX b ucircumflex -20 KPX b udieresis -20 KPX b ugrave -20 KPX b uhungarumlaut -20 KPX b umacron -20 KPX b uogonek -20 KPX b uring -20 KPX b v -20 KPX b y -20 KPX b yacute -20 KPX b ydieresis -20 KPX c comma -15 KPX c k -20 KPX c kcommaaccent -20 KPX cacute comma -15 KPX cacute k -20 KPX cacute kcommaaccent -20 KPX ccaron comma -15 KPX ccaron k -20 KPX ccaron kcommaaccent -20 KPX ccedilla comma -15 KPX ccedilla k -20 KPX ccedilla kcommaaccent -20 KPX colon space -50 KPX comma quotedblright -100 KPX comma quoteright -100 KPX e comma -15 KPX e period -15 KPX e v -30 KPX e w -20 KPX e x -30 KPX e y -20 KPX e yacute -20 KPX e ydieresis -20 KPX eacute comma -15 KPX eacute period -15 KPX eacute v -30 KPX eacute w -20 KPX eacute x -30 KPX eacute y -20 KPX eacute yacute -20 KPX eacute ydieresis -20 KPX ecaron comma -15 KPX ecaron period -15 KPX ecaron v -30 KPX ecaron w -20 KPX ecaron x -30 KPX ecaron y -20 KPX ecaron yacute -20 KPX ecaron ydieresis -20 KPX ecircumflex comma -15 KPX ecircumflex period -15 KPX ecircumflex v -30 KPX ecircumflex w -20 KPX ecircumflex x -30 KPX ecircumflex y -20 KPX ecircumflex yacute -20 KPX ecircumflex ydieresis -20 KPX edieresis comma -15 KPX edieresis period -15 KPX edieresis v -30 KPX edieresis w -20 KPX edieresis x -30 KPX edieresis y -20 KPX edieresis yacute -20 KPX edieresis ydieresis -20 KPX edotaccent comma -15 KPX edotaccent period -15 KPX edotaccent v -30 KPX edotaccent w -20 KPX edotaccent x -30 KPX edotaccent y -20 KPX edotaccent yacute -20 KPX edotaccent ydieresis -20 KPX egrave comma -15 KPX egrave period -15 KPX egrave v -30 KPX egrave w -20 KPX egrave x -30 KPX egrave y -20 KPX egrave yacute -20 KPX egrave ydieresis -20 KPX emacron comma -15 KPX emacron period -15 KPX emacron v -30 KPX emacron w -20 KPX emacron x -30 KPX emacron y -20 KPX emacron yacute -20 KPX emacron ydieresis -20 KPX eogonek comma -15 KPX eogonek period -15 KPX eogonek v -30 KPX eogonek w -20 KPX eogonek x -30 KPX eogonek y -20 KPX eogonek yacute -20 KPX eogonek ydieresis -20 KPX f a -30 KPX f aacute -30 KPX f abreve -30 KPX f acircumflex -30 KPX f adieresis -30 KPX f agrave -30 KPX f amacron -30 KPX f aogonek -30 KPX f aring -30 KPX f atilde -30 KPX f comma -30 KPX f dotlessi -28 KPX f e -30 KPX f eacute -30 KPX f ecaron -30 KPX f ecircumflex -30 KPX f edieresis -30 KPX f edotaccent -30 KPX f egrave -30 KPX f emacron -30 KPX f eogonek -30 KPX f o -30 KPX f oacute -30 KPX f ocircumflex -30 KPX f odieresis -30 KPX f ograve -30 KPX f ohungarumlaut -30 KPX f omacron -30 KPX f oslash -30 KPX f otilde -30 KPX f period -30 KPX f quotedblright 60 KPX f quoteright 50 KPX g r -10 KPX g racute -10 KPX g rcaron -10 KPX g rcommaaccent -10 KPX gbreve r -10 KPX gbreve racute -10 KPX gbreve rcaron -10 KPX gbreve rcommaaccent -10 KPX gcommaaccent r -10 KPX gcommaaccent racute -10 KPX gcommaaccent rcaron -10 KPX gcommaaccent rcommaaccent -10 KPX h y -30 KPX h yacute -30 KPX h ydieresis -30 KPX k e -20 KPX k eacute -20 KPX k ecaron -20 KPX k ecircumflex -20 KPX k edieresis -20 KPX k edotaccent -20 KPX k egrave -20 KPX k emacron -20 KPX k eogonek -20 KPX k o -20 KPX k oacute -20 KPX k ocircumflex -20 KPX k odieresis -20 KPX k ograve -20 KPX k ohungarumlaut -20 KPX k omacron -20 KPX k oslash -20 KPX k otilde -20 KPX kcommaaccent e -20 KPX kcommaaccent eacute -20 KPX kcommaaccent ecaron -20 KPX kcommaaccent ecircumflex -20 KPX kcommaaccent edieresis -20 KPX kcommaaccent edotaccent -20 KPX kcommaaccent egrave -20 KPX kcommaaccent emacron -20 KPX kcommaaccent eogonek -20 KPX kcommaaccent o -20 KPX kcommaaccent oacute -20 KPX kcommaaccent ocircumflex -20 KPX kcommaaccent odieresis -20 KPX kcommaaccent ograve -20 KPX kcommaaccent ohungarumlaut -20 KPX kcommaaccent omacron -20 KPX kcommaaccent oslash -20 KPX kcommaaccent otilde -20 KPX m u -10 KPX m uacute -10 KPX m ucircumflex -10 KPX m udieresis -10 KPX m ugrave -10 KPX m uhungarumlaut -10 KPX m umacron -10 KPX m uogonek -10 KPX m uring -10 KPX m y -15 KPX m yacute -15 KPX m ydieresis -15 KPX n u -10 KPX n uacute -10 KPX n ucircumflex -10 KPX n udieresis -10 KPX n ugrave -10 KPX n uhungarumlaut -10 KPX n umacron -10 KPX n uogonek -10 KPX n uring -10 KPX n v -20 KPX n y -15 KPX n yacute -15 KPX n ydieresis -15 KPX nacute u -10 KPX nacute uacute -10 KPX nacute ucircumflex -10 KPX nacute udieresis -10 KPX nacute ugrave -10 KPX nacute uhungarumlaut -10 KPX nacute umacron -10 KPX nacute uogonek -10 KPX nacute uring -10 KPX nacute v -20 KPX nacute y -15 KPX nacute yacute -15 KPX nacute ydieresis -15 KPX ncaron u -10 KPX ncaron uacute -10 KPX ncaron ucircumflex -10 KPX ncaron udieresis -10 KPX ncaron ugrave -10 KPX ncaron uhungarumlaut -10 KPX ncaron umacron -10 KPX ncaron uogonek -10 KPX ncaron uring -10 KPX ncaron v -20 KPX ncaron y -15 KPX ncaron yacute -15 KPX ncaron ydieresis -15 KPX ncommaaccent u -10 KPX ncommaaccent uacute -10 KPX ncommaaccent ucircumflex -10 KPX ncommaaccent udieresis -10 KPX ncommaaccent ugrave -10 KPX ncommaaccent uhungarumlaut -10 KPX ncommaaccent umacron -10 KPX ncommaaccent uogonek -10 KPX ncommaaccent uring -10 KPX ncommaaccent v -20 KPX ncommaaccent y -15 KPX ncommaaccent yacute -15 KPX ncommaaccent ydieresis -15 KPX ntilde u -10 KPX ntilde uacute -10 KPX ntilde ucircumflex -10 KPX ntilde udieresis -10 KPX ntilde ugrave -10 KPX ntilde uhungarumlaut -10 KPX ntilde umacron -10 KPX ntilde uogonek -10 KPX ntilde uring -10 KPX ntilde v -20 KPX ntilde y -15 KPX ntilde yacute -15 KPX ntilde ydieresis -15 KPX o comma -40 KPX o period -40 KPX o v -15 KPX o w -15 KPX o x -30 KPX o y -30 KPX o yacute -30 KPX o ydieresis -30 KPX oacute comma -40 KPX oacute period -40 KPX oacute v -15 KPX oacute w -15 KPX oacute x -30 KPX oacute y -30 KPX oacute yacute -30 KPX oacute ydieresis -30 KPX ocircumflex comma -40 KPX ocircumflex period -40 KPX ocircumflex v -15 KPX ocircumflex w -15 KPX ocircumflex x -30 KPX ocircumflex y -30 KPX ocircumflex yacute -30 KPX ocircumflex ydieresis -30 KPX odieresis comma -40 KPX odieresis period -40 KPX odieresis v -15 KPX odieresis w -15 KPX odieresis x -30 KPX odieresis y -30 KPX odieresis yacute -30 KPX odieresis ydieresis -30 KPX ograve comma -40 KPX ograve period -40 KPX ograve v -15 KPX ograve w -15 KPX ograve x -30 KPX ograve y -30 KPX ograve yacute -30 KPX ograve ydieresis -30 KPX ohungarumlaut comma -40 KPX ohungarumlaut period -40 KPX ohungarumlaut v -15 KPX ohungarumlaut w -15 KPX ohungarumlaut x -30 KPX ohungarumlaut y -30 KPX ohungarumlaut yacute -30 KPX ohungarumlaut ydieresis -30 KPX omacron comma -40 KPX omacron period -40 KPX omacron v -15 KPX omacron w -15 KPX omacron x -30 KPX omacron y -30 KPX omacron yacute -30 KPX omacron ydieresis -30 KPX oslash a -55 KPX oslash aacute -55 KPX oslash abreve -55 KPX oslash acircumflex -55 KPX oslash adieresis -55 KPX oslash agrave -55 KPX oslash amacron -55 KPX oslash aogonek -55 KPX oslash aring -55 KPX oslash atilde -55 KPX oslash b -55 KPX oslash c -55 KPX oslash cacute -55 KPX oslash ccaron -55 KPX oslash ccedilla -55 KPX oslash comma -95 KPX oslash d -55 KPX oslash dcroat -55 KPX oslash e -55 KPX oslash eacute -55 KPX oslash ecaron -55 KPX oslash ecircumflex -55 KPX oslash edieresis -55 KPX oslash edotaccent -55 KPX oslash egrave -55 KPX oslash emacron -55 KPX oslash eogonek -55 KPX oslash f -55 KPX oslash g -55 KPX oslash gbreve -55 KPX oslash gcommaaccent -55 KPX oslash h -55 KPX oslash i -55 KPX oslash iacute -55 KPX oslash icircumflex -55 KPX oslash idieresis -55 KPX oslash igrave -55 KPX oslash imacron -55 KPX oslash iogonek -55 KPX oslash j -55 KPX oslash k -55 KPX oslash kcommaaccent -55 KPX oslash l -55 KPX oslash lacute -55 KPX oslash lcommaaccent -55 KPX oslash lslash -55 KPX oslash m -55 KPX oslash n -55 KPX oslash nacute -55 KPX oslash ncaron -55 KPX oslash ncommaaccent -55 KPX oslash ntilde -55 KPX oslash o -55 KPX oslash oacute -55 KPX oslash ocircumflex -55 KPX oslash odieresis -55 KPX oslash ograve -55 KPX oslash ohungarumlaut -55 KPX oslash omacron -55 KPX oslash oslash -55 KPX oslash otilde -55 KPX oslash p -55 KPX oslash period -95 KPX oslash q -55 KPX oslash r -55 KPX oslash racute -55 KPX oslash rcaron -55 KPX oslash rcommaaccent -55 KPX oslash s -55 KPX oslash sacute -55 KPX oslash scaron -55 KPX oslash scedilla -55 KPX oslash scommaaccent -55 KPX oslash t -55 KPX oslash tcommaaccent -55 KPX oslash u -55 KPX oslash uacute -55 KPX oslash ucircumflex -55 KPX oslash udieresis -55 KPX oslash ugrave -55 KPX oslash uhungarumlaut -55 KPX oslash umacron -55 KPX oslash uogonek -55 KPX oslash uring -55 KPX oslash v -70 KPX oslash w -70 KPX oslash x -85 KPX oslash y -70 KPX oslash yacute -70 KPX oslash ydieresis -70 KPX oslash z -55 KPX oslash zacute -55 KPX oslash zcaron -55 KPX oslash zdotaccent -55 KPX otilde comma -40 KPX otilde period -40 KPX otilde v -15 KPX otilde w -15 KPX otilde x -30 KPX otilde y -30 KPX otilde yacute -30 KPX otilde ydieresis -30 KPX p comma -35 KPX p period -35 KPX p y -30 KPX p yacute -30 KPX p ydieresis -30 KPX period quotedblright -100 KPX period quoteright -100 KPX period space -60 KPX quotedblright space -40 KPX quoteleft quoteleft -57 KPX quoteright d -50 KPX quoteright dcroat -50 KPX quoteright quoteright -57 KPX quoteright r -50 KPX quoteright racute -50 KPX quoteright rcaron -50 KPX quoteright rcommaaccent -50 KPX quoteright s -50 KPX quoteright sacute -50 KPX quoteright scaron -50 KPX quoteright scedilla -50 KPX quoteright scommaaccent -50 KPX quoteright space -70 KPX r a -10 KPX r aacute -10 KPX r abreve -10 KPX r acircumflex -10 KPX r adieresis -10 KPX r agrave -10 KPX r amacron -10 KPX r aogonek -10 KPX r aring -10 KPX r atilde -10 KPX r colon 30 KPX r comma -50 KPX r i 15 KPX r iacute 15 KPX r icircumflex 15 KPX r idieresis 15 KPX r igrave 15 KPX r imacron 15 KPX r iogonek 15 KPX r k 15 KPX r kcommaaccent 15 KPX r l 15 KPX r lacute 15 KPX r lcommaaccent 15 KPX r lslash 15 KPX r m 25 KPX r n 25 KPX r nacute 25 KPX r ncaron 25 KPX r ncommaaccent 25 KPX r ntilde 25 KPX r p 30 KPX r period -50 KPX r semicolon 30 KPX r t 40 KPX r tcommaaccent 40 KPX r u 15 KPX r uacute 15 KPX r ucircumflex 15 KPX r udieresis 15 KPX r ugrave 15 KPX r uhungarumlaut 15 KPX r umacron 15 KPX r uogonek 15 KPX r uring 15 KPX r v 30 KPX r y 30 KPX r yacute 30 KPX r ydieresis 30 KPX racute a -10 KPX racute aacute -10 KPX racute abreve -10 KPX racute acircumflex -10 KPX racute adieresis -10 KPX racute agrave -10 KPX racute amacron -10 KPX racute aogonek -10 KPX racute aring -10 KPX racute atilde -10 KPX racute colon 30 KPX racute comma -50 KPX racute i 15 KPX racute iacute 15 KPX racute icircumflex 15 KPX racute idieresis 15 KPX racute igrave 15 KPX racute imacron 15 KPX racute iogonek 15 KPX racute k 15 KPX racute kcommaaccent 15 KPX racute l 15 KPX racute lacute 15 KPX racute lcommaaccent 15 KPX racute lslash 15 KPX racute m 25 KPX racute n 25 KPX racute nacute 25 KPX racute ncaron 25 KPX racute ncommaaccent 25 KPX racute ntilde 25 KPX racute p 30 KPX racute period -50 KPX racute semicolon 30 KPX racute t 40 KPX racute tcommaaccent 40 KPX racute u 15 KPX racute uacute 15 KPX racute ucircumflex 15 KPX racute udieresis 15 KPX racute ugrave 15 KPX racute uhungarumlaut 15 KPX racute umacron 15 KPX racute uogonek 15 KPX racute uring 15 KPX racute v 30 KPX racute y 30 KPX racute yacute 30 KPX racute ydieresis 30 KPX rcaron a -10 KPX rcaron aacute -10 KPX rcaron abreve -10 KPX rcaron acircumflex -10 KPX rcaron adieresis -10 KPX rcaron agrave -10 KPX rcaron amacron -10 KPX rcaron aogonek -10 KPX rcaron aring -10 KPX rcaron atilde -10 KPX rcaron colon 30 KPX rcaron comma -50 KPX rcaron i 15 KPX rcaron iacute 15 KPX rcaron icircumflex 15 KPX rcaron idieresis 15 KPX rcaron igrave 15 KPX rcaron imacron 15 KPX rcaron iogonek 15 KPX rcaron k 15 KPX rcaron kcommaaccent 15 KPX rcaron l 15 KPX rcaron lacute 15 KPX rcaron lcommaaccent 15 KPX rcaron lslash 15 KPX rcaron m 25 KPX rcaron n 25 KPX rcaron nacute 25 KPX rcaron ncaron 25 KPX rcaron ncommaaccent 25 KPX rcaron ntilde 25 KPX rcaron p 30 KPX rcaron period -50 KPX rcaron semicolon 30 KPX rcaron t 40 KPX rcaron tcommaaccent 40 KPX rcaron u 15 KPX rcaron uacute 15 KPX rcaron ucircumflex 15 KPX rcaron udieresis 15 KPX rcaron ugrave 15 KPX rcaron uhungarumlaut 15 KPX rcaron umacron 15 KPX rcaron uogonek 15 KPX rcaron uring 15 KPX rcaron v 30 KPX rcaron y 30 KPX rcaron yacute 30 KPX rcaron ydieresis 30 KPX rcommaaccent a -10 KPX rcommaaccent aacute -10 KPX rcommaaccent abreve -10 KPX rcommaaccent acircumflex -10 KPX rcommaaccent adieresis -10 KPX rcommaaccent agrave -10 KPX rcommaaccent amacron -10 KPX rcommaaccent aogonek -10 KPX rcommaaccent aring -10 KPX rcommaaccent atilde -10 KPX rcommaaccent colon 30 KPX rcommaaccent comma -50 KPX rcommaaccent i 15 KPX rcommaaccent iacute 15 KPX rcommaaccent icircumflex 15 KPX rcommaaccent idieresis 15 KPX rcommaaccent igrave 15 KPX rcommaaccent imacron 15 KPX rcommaaccent iogonek 15 KPX rcommaaccent k 15 KPX rcommaaccent kcommaaccent 15 KPX rcommaaccent l 15 KPX rcommaaccent lacute 15 KPX rcommaaccent lcommaaccent 15 KPX rcommaaccent lslash 15 KPX rcommaaccent m 25 KPX rcommaaccent n 25 KPX rcommaaccent nacute 25 KPX rcommaaccent ncaron 25 KPX rcommaaccent ncommaaccent 25 KPX rcommaaccent ntilde 25 KPX rcommaaccent p 30 KPX rcommaaccent period -50 KPX rcommaaccent semicolon 30 KPX rcommaaccent t 40 KPX rcommaaccent tcommaaccent 40 KPX rcommaaccent u 15 KPX rcommaaccent uacute 15 KPX rcommaaccent ucircumflex 15 KPX rcommaaccent udieresis 15 KPX rcommaaccent ugrave 15 KPX rcommaaccent uhungarumlaut 15 KPX rcommaaccent umacron 15 KPX rcommaaccent uogonek 15 KPX rcommaaccent uring 15 KPX rcommaaccent v 30 KPX rcommaaccent y 30 KPX rcommaaccent yacute 30 KPX rcommaaccent ydieresis 30 KPX s comma -15 KPX s period -15 KPX s w -30 KPX sacute comma -15 KPX sacute period -15 KPX sacute w -30 KPX scaron comma -15 KPX scaron period -15 KPX scaron w -30 KPX scedilla comma -15 KPX scedilla period -15 KPX scedilla w -30 KPX scommaaccent comma -15 KPX scommaaccent period -15 KPX scommaaccent w -30 KPX semicolon space -50 KPX space T -50 KPX space Tcaron -50 KPX space Tcommaaccent -50 KPX space V -50 KPX space W -40 KPX space Y -90 KPX space Yacute -90 KPX space Ydieresis -90 KPX space quotedblleft -30 KPX space quoteleft -60 KPX v a -25 KPX v aacute -25 KPX v abreve -25 KPX v acircumflex -25 KPX v adieresis -25 KPX v agrave -25 KPX v amacron -25 KPX v aogonek -25 KPX v aring -25 KPX v atilde -25 KPX v comma -80 KPX v e -25 KPX v eacute -25 KPX v ecaron -25 KPX v ecircumflex -25 KPX v edieresis -25 KPX v edotaccent -25 KPX v egrave -25 KPX v emacron -25 KPX v eogonek -25 KPX v o -25 KPX v oacute -25 KPX v ocircumflex -25 KPX v odieresis -25 KPX v ograve -25 KPX v ohungarumlaut -25 KPX v omacron -25 KPX v oslash -25 KPX v otilde -25 KPX v period -80 KPX w a -15 KPX w aacute -15 KPX w abreve -15 KPX w acircumflex -15 KPX w adieresis -15 KPX w agrave -15 KPX w amacron -15 KPX w aogonek -15 KPX w aring -15 KPX w atilde -15 KPX w comma -60 KPX w e -10 KPX w eacute -10 KPX w ecaron -10 KPX w ecircumflex -10 KPX w edieresis -10 KPX w edotaccent -10 KPX w egrave -10 KPX w emacron -10 KPX w eogonek -10 KPX w o -10 KPX w oacute -10 KPX w ocircumflex -10 KPX w odieresis -10 KPX w ograve -10 KPX w ohungarumlaut -10 KPX w omacron -10 KPX w oslash -10 KPX w otilde -10 KPX w period -60 KPX x e -30 KPX x eacute -30 KPX x ecaron -30 KPX x ecircumflex -30 KPX x edieresis -30 KPX x edotaccent -30 KPX x egrave -30 KPX x emacron -30 KPX x eogonek -30 KPX y a -20 KPX y aacute -20 KPX y abreve -20 KPX y acircumflex -20 KPX y adieresis -20 KPX y agrave -20 KPX y amacron -20 KPX y aogonek -20 KPX y aring -20 KPX y atilde -20 KPX y comma -100 KPX y e -20 KPX y eacute -20 KPX y ecaron -20 KPX y ecircumflex -20 KPX y edieresis -20 KPX y edotaccent -20 KPX y egrave -20 KPX y emacron -20 KPX y eogonek -20 KPX y o -20 KPX y oacute -20 KPX y ocircumflex -20 KPX y odieresis -20 KPX y ograve -20 KPX y ohungarumlaut -20 KPX y omacron -20 KPX y oslash -20 KPX y otilde -20 KPX y period -100 KPX yacute a -20 KPX yacute aacute -20 KPX yacute abreve -20 KPX yacute acircumflex -20 KPX yacute adieresis -20 KPX yacute agrave -20 KPX yacute amacron -20 KPX yacute aogonek -20 KPX yacute aring -20 KPX yacute atilde -20 KPX yacute comma -100 KPX yacute e -20 KPX yacute eacute -20 KPX yacute ecaron -20 KPX yacute ecircumflex -20 KPX yacute edieresis -20 KPX yacute edotaccent -20 KPX yacute egrave -20 KPX yacute emacron -20 KPX yacute eogonek -20 KPX yacute o -20 KPX yacute oacute -20 KPX yacute ocircumflex -20 KPX yacute odieresis -20 KPX yacute ograve -20 KPX yacute ohungarumlaut -20 KPX yacute omacron -20 KPX yacute oslash -20 KPX yacute otilde -20 KPX yacute period -100 KPX ydieresis a -20 KPX ydieresis aacute -20 KPX ydieresis abreve -20 KPX ydieresis acircumflex -20 KPX ydieresis adieresis -20 KPX ydieresis agrave -20 KPX ydieresis amacron -20 KPX ydieresis aogonek -20 KPX ydieresis aring -20 KPX ydieresis atilde -20 KPX ydieresis comma -100 KPX ydieresis e -20 KPX ydieresis eacute -20 KPX ydieresis ecaron -20 KPX ydieresis ecircumflex -20 KPX ydieresis edieresis -20 KPX ydieresis edotaccent -20 KPX ydieresis egrave -20 KPX ydieresis emacron -20 KPX ydieresis eogonek -20 KPX ydieresis o -20 KPX ydieresis oacute -20 KPX ydieresis ocircumflex -20 KPX ydieresis odieresis -20 KPX ydieresis ograve -20 KPX ydieresis ohungarumlaut -20 KPX ydieresis omacron -20 KPX ydieresis oslash -20 KPX ydieresis otilde -20 KPX ydieresis period -100 KPX z e -15 KPX z eacute -15 KPX z ecaron -15 KPX z ecircumflex -15 KPX z edieresis -15 KPX z edotaccent -15 KPX z egrave -15 KPX z emacron -15 KPX z eogonek -15 KPX z o -15 KPX z oacute -15 KPX z ocircumflex -15 KPX z odieresis -15 KPX z ograve -15 KPX z ohungarumlaut -15 KPX z omacron -15 KPX z oslash -15 KPX z otilde -15 KPX zacute e -15 KPX zacute eacute -15 KPX zacute ecaron -15 KPX zacute ecircumflex -15 KPX zacute edieresis -15 KPX zacute edotaccent -15 KPX zacute egrave -15 KPX zacute emacron -15 KPX zacute eogonek -15 KPX zacute o -15 KPX zacute oacute -15 KPX zacute ocircumflex -15 KPX zacute odieresis -15 KPX zacute ograve -15 KPX zacute ohungarumlaut -15 KPX zacute omacron -15 KPX zacute oslash -15 KPX zacute otilde -15 KPX zcaron e -15 KPX zcaron eacute -15 KPX zcaron ecaron -15 KPX zcaron ecircumflex -15 KPX zcaron edieresis -15 KPX zcaron edotaccent -15 KPX zcaron egrave -15 KPX zcaron emacron -15 KPX zcaron eogonek -15 KPX zcaron o -15 KPX zcaron oacute -15 KPX zcaron ocircumflex -15 KPX zcaron odieresis -15 KPX zcaron ograve -15 KPX zcaron ohungarumlaut -15 KPX zcaron omacron -15 KPX zcaron oslash -15 KPX zcaron otilde -15 KPX zdotaccent e -15 KPX zdotaccent eacute -15 KPX zdotaccent ecaron -15 KPX zdotaccent ecircumflex -15 KPX zdotaccent edieresis -15 KPX zdotaccent edotaccent -15 KPX zdotaccent egrave -15 KPX zdotaccent emacron -15 KPX zdotaccent eogonek -15 KPX zdotaccent o -15 KPX zdotaccent oacute -15 KPX zdotaccent ocircumflex -15 KPX zdotaccent odieresis -15 KPX zdotaccent ograve -15 KPX zdotaccent ohungarumlaut -15 KPX zdotaccent omacron -15 KPX zdotaccent oslash -15 KPX zdotaccent otilde -15 EndKernPairs EndKernData EndFontMetrics ruby-prawn-2.1.0.orig/data/fonts/Symbol.afm0000644000000000000000000002301412665203156017257 0ustar rootrootStartFontMetrics 4.1 Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All rights reserved. Comment Creation Date: Thu May 1 15:12:25 1997 Comment UniqueID 43064 Comment VMusage 30820 39997 FontName Symbol FullName Symbol FamilyName Symbol Weight Medium ItalicAngle 0 IsFixedPitch false CharacterSet Special FontBBox -180 -293 1090 1010 UnderlinePosition -100 UnderlineThickness 50 Version 001.008 Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All rights reserved. EncodingScheme FontSpecific StdHW 92 StdVW 85 StartCharMetrics 190 C 32 ; WX 250 ; N space ; B 0 0 0 0 ; C 33 ; WX 333 ; N exclam ; B 128 -17 240 672 ; C 34 ; WX 713 ; N universal ; B 31 0 681 705 ; C 35 ; WX 500 ; N numbersign ; B 20 -16 481 673 ; C 36 ; WX 549 ; N existential ; B 25 0 478 707 ; C 37 ; WX 833 ; N percent ; B 63 -36 771 655 ; C 38 ; WX 778 ; N ampersand ; B 41 -18 750 661 ; C 39 ; WX 439 ; N suchthat ; B 48 -17 414 500 ; C 40 ; WX 333 ; N parenleft ; B 53 -191 300 673 ; C 41 ; WX 333 ; N parenright ; B 30 -191 277 673 ; C 42 ; WX 500 ; N asteriskmath ; B 65 134 427 551 ; C 43 ; WX 549 ; N plus ; B 10 0 539 533 ; C 44 ; WX 250 ; N comma ; B 56 -152 194 104 ; C 45 ; WX 549 ; N minus ; B 11 233 535 288 ; C 46 ; WX 250 ; N period ; B 69 -17 181 95 ; C 47 ; WX 278 ; N slash ; B 0 -18 254 646 ; C 48 ; WX 500 ; N zero ; B 24 -14 476 685 ; C 49 ; WX 500 ; N one ; B 117 0 390 673 ; C 50 ; WX 500 ; N two ; B 25 0 475 685 ; C 51 ; WX 500 ; N three ; B 43 -14 435 685 ; C 52 ; WX 500 ; N four ; B 15 0 469 685 ; C 53 ; WX 500 ; N five ; B 32 -14 445 690 ; C 54 ; WX 500 ; N six ; B 34 -14 468 685 ; C 55 ; WX 500 ; N seven ; B 24 -16 448 673 ; C 56 ; WX 500 ; N eight ; B 56 -14 445 685 ; C 57 ; WX 500 ; N nine ; B 30 -18 459 685 ; C 58 ; WX 278 ; N colon ; B 81 -17 193 460 ; C 59 ; WX 278 ; N semicolon ; B 83 -152 221 460 ; C 60 ; WX 549 ; N less ; B 26 0 523 522 ; C 61 ; WX 549 ; N equal ; B 11 141 537 390 ; C 62 ; WX 549 ; N greater ; B 26 0 523 522 ; C 63 ; WX 444 ; N question ; B 70 -17 412 686 ; C 64 ; WX 549 ; N congruent ; B 11 0 537 475 ; C 65 ; WX 722 ; N Alpha ; B 4 0 684 673 ; C 66 ; WX 667 ; N Beta ; B 29 0 592 673 ; C 67 ; WX 722 ; N Chi ; B -9 0 704 673 ; C 68 ; WX 612 ; N Delta ; B 6 0 608 688 ; C 69 ; WX 611 ; N Epsilon ; B 32 0 617 673 ; C 70 ; WX 763 ; N Phi ; B 26 0 741 673 ; C 71 ; WX 603 ; N Gamma ; B 24 0 609 673 ; C 72 ; WX 722 ; N Eta ; B 39 0 729 673 ; C 73 ; WX 333 ; N Iota ; B 32 0 316 673 ; C 74 ; WX 631 ; N theta1 ; B 18 -18 623 689 ; C 75 ; WX 722 ; N Kappa ; B 35 0 722 673 ; C 76 ; WX 686 ; N Lambda ; B 6 0 680 688 ; C 77 ; WX 889 ; N Mu ; B 28 0 887 673 ; C 78 ; WX 722 ; N Nu ; B 29 -8 720 673 ; C 79 ; WX 722 ; N Omicron ; B 41 -17 715 685 ; C 80 ; WX 768 ; N Pi ; B 25 0 745 673 ; C 81 ; WX 741 ; N Theta ; B 41 -17 715 685 ; C 82 ; WX 556 ; N Rho ; B 28 0 563 673 ; C 83 ; WX 592 ; N Sigma ; B 5 0 589 673 ; C 84 ; WX 611 ; N Tau ; B 33 0 607 673 ; C 85 ; WX 690 ; N Upsilon ; B -8 0 694 673 ; C 86 ; WX 439 ; N sigma1 ; B 40 -233 436 500 ; C 87 ; WX 768 ; N Omega ; B 34 0 736 688 ; C 88 ; WX 645 ; N Xi ; B 40 0 599 673 ; C 89 ; WX 795 ; N Psi ; B 15 0 781 684 ; C 90 ; WX 611 ; N Zeta ; B 44 0 636 673 ; C 91 ; WX 333 ; N bracketleft ; B 86 -155 299 674 ; C 92 ; WX 863 ; N therefore ; B 163 0 701 487 ; C 93 ; WX 333 ; N bracketright ; B 33 -155 246 674 ; C 94 ; WX 658 ; N perpendicular ; B 15 0 652 674 ; C 95 ; WX 500 ; N underscore ; B -2 -125 502 -75 ; C 96 ; WX 500 ; N radicalex ; B 480 881 1090 917 ; C 97 ; WX 631 ; N alpha ; B 41 -18 622 500 ; C 98 ; WX 549 ; N beta ; B 61 -223 515 741 ; C 99 ; WX 549 ; N chi ; B 12 -231 522 499 ; C 100 ; WX 494 ; N delta ; B 40 -19 481 740 ; C 101 ; WX 439 ; N epsilon ; B 22 -19 427 502 ; C 102 ; WX 521 ; N phi ; B 28 -224 492 673 ; C 103 ; WX 411 ; N gamma ; B 5 -225 484 499 ; C 104 ; WX 603 ; N eta ; B 0 -202 527 514 ; C 105 ; WX 329 ; N iota ; B 0 -17 301 503 ; C 106 ; WX 603 ; N phi1 ; B 36 -224 587 499 ; C 107 ; WX 549 ; N kappa ; B 33 0 558 501 ; C 108 ; WX 549 ; N lambda ; B 24 -17 548 739 ; C 109 ; WX 576 ; N mu ; B 33 -223 567 500 ; C 110 ; WX 521 ; N nu ; B -9 -16 475 507 ; C 111 ; WX 549 ; N omicron ; B 35 -19 501 499 ; C 112 ; WX 549 ; N pi ; B 10 -19 530 487 ; C 113 ; WX 521 ; N theta ; B 43 -17 485 690 ; C 114 ; WX 549 ; N rho ; B 50 -230 490 499 ; C 115 ; WX 603 ; N sigma ; B 30 -21 588 500 ; C 116 ; WX 439 ; N tau ; B 10 -19 418 500 ; C 117 ; WX 576 ; N upsilon ; B 7 -18 535 507 ; C 118 ; WX 713 ; N omega1 ; B 12 -18 671 583 ; C 119 ; WX 686 ; N omega ; B 42 -17 684 500 ; C 120 ; WX 493 ; N xi ; B 27 -224 469 766 ; C 121 ; WX 686 ; N psi ; B 12 -228 701 500 ; C 122 ; WX 494 ; N zeta ; B 60 -225 467 756 ; C 123 ; WX 480 ; N braceleft ; B 58 -183 397 673 ; C 124 ; WX 200 ; N bar ; B 65 -293 135 707 ; C 125 ; WX 480 ; N braceright ; B 79 -183 418 673 ; C 126 ; WX 549 ; N similar ; B 17 203 529 307 ; C 160 ; WX 750 ; N Euro ; B 20 -12 714 685 ; C 161 ; WX 620 ; N Upsilon1 ; B -2 0 610 685 ; C 162 ; WX 247 ; N minute ; B 27 459 228 735 ; C 163 ; WX 549 ; N lessequal ; B 29 0 526 639 ; C 164 ; WX 167 ; N fraction ; B -180 -12 340 677 ; C 165 ; WX 713 ; N infinity ; B 26 124 688 404 ; C 166 ; WX 500 ; N florin ; B 2 -193 494 686 ; C 167 ; WX 753 ; N club ; B 86 -26 660 533 ; C 168 ; WX 753 ; N diamond ; B 142 -36 600 550 ; C 169 ; WX 753 ; N heart ; B 117 -33 631 532 ; C 170 ; WX 753 ; N spade ; B 113 -36 629 548 ; C 171 ; WX 1042 ; N arrowboth ; B 24 -15 1024 511 ; C 172 ; WX 987 ; N arrowleft ; B 32 -15 942 511 ; C 173 ; WX 603 ; N arrowup ; B 45 0 571 910 ; C 174 ; WX 987 ; N arrowright ; B 49 -15 959 511 ; C 175 ; WX 603 ; N arrowdown ; B 45 -22 571 888 ; C 176 ; WX 400 ; N degree ; B 50 385 350 685 ; C 177 ; WX 549 ; N plusminus ; B 10 0 539 645 ; C 178 ; WX 411 ; N second ; B 20 459 413 737 ; C 179 ; WX 549 ; N greaterequal ; B 29 0 526 639 ; C 180 ; WX 549 ; N multiply ; B 17 8 533 524 ; C 181 ; WX 713 ; N proportional ; B 27 123 639 404 ; C 182 ; WX 494 ; N partialdiff ; B 26 -20 462 746 ; C 183 ; WX 460 ; N bullet ; B 50 113 410 473 ; C 184 ; WX 549 ; N divide ; B 10 71 536 456 ; C 185 ; WX 549 ; N notequal ; B 15 -25 540 549 ; C 186 ; WX 549 ; N equivalence ; B 14 82 538 443 ; C 187 ; WX 549 ; N approxequal ; B 14 135 527 394 ; C 188 ; WX 1000 ; N ellipsis ; B 111 -17 889 95 ; C 189 ; WX 603 ; N arrowvertex ; B 280 -120 336 1010 ; C 190 ; WX 1000 ; N arrowhorizex ; B -60 220 1050 276 ; C 191 ; WX 658 ; N carriagereturn ; B 15 -16 602 629 ; C 192 ; WX 823 ; N aleph ; B 175 -18 661 658 ; C 193 ; WX 686 ; N Ifraktur ; B 10 -53 578 740 ; C 194 ; WX 795 ; N Rfraktur ; B 26 -15 759 734 ; C 195 ; WX 987 ; N weierstrass ; B 159 -211 870 573 ; C 196 ; WX 768 ; N circlemultiply ; B 43 -17 733 673 ; C 197 ; WX 768 ; N circleplus ; B 43 -15 733 675 ; C 198 ; WX 823 ; N emptyset ; B 39 -24 781 719 ; C 199 ; WX 768 ; N intersection ; B 40 0 732 509 ; C 200 ; WX 768 ; N union ; B 40 -17 732 492 ; C 201 ; WX 713 ; N propersuperset ; B 20 0 673 470 ; C 202 ; WX 713 ; N reflexsuperset ; B 20 -125 673 470 ; C 203 ; WX 713 ; N notsubset ; B 36 -70 690 540 ; C 204 ; WX 713 ; N propersubset ; B 37 0 690 470 ; C 205 ; WX 713 ; N reflexsubset ; B 37 -125 690 470 ; C 206 ; WX 713 ; N element ; B 45 0 505 468 ; C 207 ; WX 713 ; N notelement ; B 45 -58 505 555 ; C 208 ; WX 768 ; N angle ; B 26 0 738 673 ; C 209 ; WX 713 ; N gradient ; B 36 -19 681 718 ; C 210 ; WX 790 ; N registerserif ; B 50 -17 740 673 ; C 211 ; WX 790 ; N copyrightserif ; B 51 -15 741 675 ; C 212 ; WX 890 ; N trademarkserif ; B 18 293 855 673 ; C 213 ; WX 823 ; N product ; B 25 -101 803 751 ; C 214 ; WX 549 ; N radical ; B 10 -38 515 917 ; C 215 ; WX 250 ; N dotmath ; B 69 210 169 310 ; C 216 ; WX 713 ; N logicalnot ; B 15 0 680 288 ; C 217 ; WX 603 ; N logicaland ; B 23 0 583 454 ; C 218 ; WX 603 ; N logicalor ; B 30 0 578 477 ; C 219 ; WX 1042 ; N arrowdblboth ; B 27 -20 1023 510 ; C 220 ; WX 987 ; N arrowdblleft ; B 30 -15 939 513 ; C 221 ; WX 603 ; N arrowdblup ; B 39 2 567 911 ; C 222 ; WX 987 ; N arrowdblright ; B 45 -20 954 508 ; C 223 ; WX 603 ; N arrowdbldown ; B 44 -19 572 890 ; C 224 ; WX 494 ; N lozenge ; B 18 0 466 745 ; C 225 ; WX 329 ; N angleleft ; B 25 -198 306 746 ; C 226 ; WX 790 ; N registersans ; B 50 -20 740 670 ; C 227 ; WX 790 ; N copyrightsans ; B 49 -15 739 675 ; C 228 ; WX 786 ; N trademarksans ; B 5 293 725 673 ; C 229 ; WX 713 ; N summation ; B 14 -108 695 752 ; C 230 ; WX 384 ; N parenlefttp ; B 24 -293 436 926 ; C 231 ; WX 384 ; N parenleftex ; B 24 -85 108 925 ; C 232 ; WX 384 ; N parenleftbt ; B 24 -293 436 926 ; C 233 ; WX 384 ; N bracketlefttp ; B 0 -80 349 926 ; C 234 ; WX 384 ; N bracketleftex ; B 0 -79 77 925 ; C 235 ; WX 384 ; N bracketleftbt ; B 0 -80 349 926 ; C 236 ; WX 494 ; N bracelefttp ; B 209 -85 445 925 ; C 237 ; WX 494 ; N braceleftmid ; B 20 -85 284 935 ; C 238 ; WX 494 ; N braceleftbt ; B 209 -75 445 935 ; C 239 ; WX 494 ; N braceex ; B 209 -85 284 935 ; C 241 ; WX 329 ; N angleright ; B 21 -198 302 746 ; C 242 ; WX 274 ; N integral ; B 2 -107 291 916 ; C 243 ; WX 686 ; N integraltp ; B 308 -88 675 920 ; C 244 ; WX 686 ; N integralex ; B 308 -88 378 975 ; C 245 ; WX 686 ; N integralbt ; B 11 -87 378 921 ; C 246 ; WX 384 ; N parenrighttp ; B 54 -293 466 926 ; C 247 ; WX 384 ; N parenrightex ; B 382 -85 466 925 ; C 248 ; WX 384 ; N parenrightbt ; B 54 -293 466 926 ; C 249 ; WX 384 ; N bracketrighttp ; B 22 -80 371 926 ; C 250 ; WX 384 ; N bracketrightex ; B 294 -79 371 925 ; C 251 ; WX 384 ; N bracketrightbt ; B 22 -80 371 926 ; C 252 ; WX 494 ; N bracerighttp ; B 48 -85 284 925 ; C 253 ; WX 494 ; N bracerightmid ; B 209 -85 473 935 ; C 254 ; WX 494 ; N bracerightbt ; B 48 -75 284 935 ; C -1 ; WX 790 ; N apple ; B 56 -3 733 808 ; EndCharMetrics EndFontMetrics ruby-prawn-2.1.0.orig/data/fonts/Times-BoldItalic.afm0000644000000000000000000016437212665203156021114 0ustar rootrootStartFontMetrics 4.1 Comment Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved. Comment Creation Date: Thu May 1 13:04:06 1997 Comment UniqueID 43066 Comment VMusage 45874 56899 FontName Times-BoldItalic FullName Times Bold Italic FamilyName Times Weight Bold ItalicAngle -15 IsFixedPitch false CharacterSet ExtendedRoman FontBBox -200 -218 996 921 UnderlinePosition -100 UnderlineThickness 50 Version 002.000 Notice Copyright (c) 1985, 1987, 1989, 1990, 1993, 1997 Adobe Systems Incorporated. All Rights Reserved.Times is a trademark of Linotype-Hell AG and/or its subsidiaries. EncodingScheme AdobeStandardEncoding CapHeight 669 XHeight 462 Ascender 683 Descender -217 StdHW 42 StdVW 121 StartCharMetrics 315 C 32 ; WX 250 ; N space ; B 0 0 0 0 ; C 33 ; WX 389 ; N exclam ; B 67 -13 370 684 ; C 34 ; WX 555 ; N quotedbl ; B 136 398 536 685 ; C 35 ; WX 500 ; N numbersign ; B -33 0 533 700 ; C 36 ; WX 500 ; N dollar ; B -20 -100 497 733 ; C 37 ; WX 833 ; N percent ; B 39 -10 793 692 ; C 38 ; WX 778 ; N ampersand ; B 5 -19 699 682 ; C 39 ; WX 333 ; N quoteright ; B 98 369 302 685 ; C 40 ; WX 333 ; N parenleft ; B 28 -179 344 685 ; C 41 ; WX 333 ; N parenright ; B -44 -179 271 685 ; C 42 ; WX 500 ; N asterisk ; B 65 249 456 685 ; C 43 ; WX 570 ; N plus ; B 33 0 537 506 ; C 44 ; WX 250 ; N comma ; B -60 -182 144 134 ; C 45 ; WX 333 ; N hyphen ; B 2 166 271 282 ; C 46 ; WX 250 ; N period ; B -9 -13 139 135 ; C 47 ; WX 278 ; N slash ; B -64 -18 342 685 ; C 48 ; WX 500 ; N zero ; B 17 -14 477 683 ; C 49 ; WX 500 ; N one ; B 5 0 419 683 ; C 50 ; WX 500 ; N two ; B -27 0 446 683 ; C 51 ; WX 500 ; N three ; B -15 -13 450 683 ; C 52 ; WX 500 ; N four ; B -15 0 503 683 ; C 53 ; WX 500 ; N five ; B -11 -13 487 669 ; C 54 ; WX 500 ; N six ; B 23 -15 509 679 ; C 55 ; WX 500 ; N seven ; B 52 0 525 669 ; C 56 ; WX 500 ; N eight ; B 3 -13 476 683 ; C 57 ; WX 500 ; N nine ; B -12 -10 475 683 ; C 58 ; WX 333 ; N colon ; B 23 -13 264 459 ; C 59 ; WX 333 ; N semicolon ; B -25 -183 264 459 ; C 60 ; WX 570 ; N less ; B 31 -8 539 514 ; C 61 ; WX 570 ; N equal ; B 33 107 537 399 ; C 62 ; WX 570 ; N greater ; B 31 -8 539 514 ; C 63 ; WX 500 ; N question ; B 79 -13 470 684 ; C 64 ; WX 832 ; N at ; B 63 -18 770 685 ; C 65 ; WX 667 ; N A ; B -67 0 593 683 ; C 66 ; WX 667 ; N B ; B -24 0 624 669 ; C 67 ; WX 667 ; N C ; B 32 -18 677 685 ; C 68 ; WX 722 ; N D ; B -46 0 685 669 ; C 69 ; WX 667 ; N E ; B -27 0 653 669 ; C 70 ; WX 667 ; N F ; B -13 0 660 669 ; C 71 ; WX 722 ; N G ; B 21 -18 706 685 ; C 72 ; WX 778 ; N H ; B -24 0 799 669 ; C 73 ; WX 389 ; N I ; B -32 0 406 669 ; C 74 ; WX 500 ; N J ; B -46 -99 524 669 ; C 75 ; WX 667 ; N K ; B -21 0 702 669 ; C 76 ; WX 611 ; N L ; B -22 0 590 669 ; C 77 ; WX 889 ; N M ; B -29 -12 917 669 ; C 78 ; WX 722 ; N N ; B -27 -15 748 669 ; C 79 ; WX 722 ; N O ; B 27 -18 691 685 ; C 80 ; WX 611 ; N P ; B -27 0 613 669 ; C 81 ; WX 722 ; N Q ; B 27 -208 691 685 ; C 82 ; WX 667 ; N R ; B -29 0 623 669 ; C 83 ; WX 556 ; N S ; B 2 -18 526 685 ; C 84 ; WX 611 ; N T ; B 50 0 650 669 ; C 85 ; WX 722 ; N U ; B 67 -18 744 669 ; C 86 ; WX 667 ; N V ; B 65 -18 715 669 ; C 87 ; WX 889 ; N W ; B 65 -18 940 669 ; C 88 ; WX 667 ; N X ; B -24 0 694 669 ; C 89 ; WX 611 ; N Y ; B 73 0 659 669 ; C 90 ; WX 611 ; N Z ; B -11 0 590 669 ; C 91 ; WX 333 ; N bracketleft ; B -37 -159 362 674 ; C 92 ; WX 278 ; N backslash ; B -1 -18 279 685 ; C 93 ; WX 333 ; N bracketright ; B -56 -157 343 674 ; C 94 ; WX 570 ; N asciicircum ; B 67 304 503 669 ; C 95 ; WX 500 ; N underscore ; B 0 -125 500 -75 ; C 96 ; WX 333 ; N quoteleft ; B 128 369 332 685 ; C 97 ; WX 500 ; N a ; B -21 -14 455 462 ; C 98 ; WX 500 ; N b ; B -14 -13 444 699 ; C 99 ; WX 444 ; N c ; B -5 -13 392 462 ; C 100 ; WX 500 ; N d ; B -21 -13 517 699 ; C 101 ; WX 444 ; N e ; B 5 -13 398 462 ; C 102 ; WX 333 ; N f ; B -169 -205 446 698 ; L i fi ; L l fl ; C 103 ; WX 500 ; N g ; B -52 -203 478 462 ; C 104 ; WX 556 ; N h ; B -13 -9 498 699 ; C 105 ; WX 278 ; N i ; B 2 -9 263 684 ; C 106 ; WX 278 ; N j ; B -189 -207 279 684 ; C 107 ; WX 500 ; N k ; B -23 -8 483 699 ; C 108 ; WX 278 ; N l ; B 2 -9 290 699 ; C 109 ; WX 778 ; N m ; B -14 -9 722 462 ; C 110 ; WX 556 ; N n ; B -6 -9 493 462 ; C 111 ; WX 500 ; N o ; B -3 -13 441 462 ; C 112 ; WX 500 ; N p ; B -120 -205 446 462 ; C 113 ; WX 500 ; N q ; B 1 -205 471 462 ; C 114 ; WX 389 ; N r ; B -21 0 389 462 ; C 115 ; WX 389 ; N s ; B -19 -13 333 462 ; C 116 ; WX 278 ; N t ; B -11 -9 281 594 ; C 117 ; WX 556 ; N u ; B 15 -9 492 462 ; C 118 ; WX 444 ; N v ; B 16 -13 401 462 ; C 119 ; WX 667 ; N w ; B 16 -13 614 462 ; C 120 ; WX 500 ; N x ; B -46 -13 469 462 ; C 121 ; WX 444 ; N y ; B -94 -205 392 462 ; C 122 ; WX 389 ; N z ; B -43 -78 368 449 ; C 123 ; WX 348 ; N braceleft ; B 5 -187 436 686 ; C 124 ; WX 220 ; N bar ; B 66 -218 154 782 ; C 125 ; WX 348 ; N braceright ; B -129 -187 302 686 ; C 126 ; WX 570 ; N asciitilde ; B 54 173 516 333 ; C 161 ; WX 389 ; N exclamdown ; B 19 -205 322 492 ; C 162 ; WX 500 ; N cent ; B 42 -143 439 576 ; C 163 ; WX 500 ; N sterling ; B -32 -12 510 683 ; C 164 ; WX 167 ; N fraction ; B -169 -14 324 683 ; C 165 ; WX 500 ; N yen ; B 33 0 628 669 ; C 166 ; WX 500 ; N florin ; B -87 -156 537 707 ; C 167 ; WX 500 ; N section ; B 36 -143 459 685 ; C 168 ; WX 500 ; N currency ; B -26 34 526 586 ; C 169 ; WX 278 ; N quotesingle ; B 128 398 268 685 ; C 170 ; WX 500 ; N quotedblleft ; B 53 369 513 685 ; C 171 ; WX 500 ; N guillemotleft ; B 12 32 468 415 ; C 172 ; WX 333 ; N guilsinglleft ; B 32 32 303 415 ; C 173 ; WX 333 ; N guilsinglright ; B 10 32 281 415 ; C 174 ; WX 556 ; N fi ; B -188 -205 514 703 ; C 175 ; WX 556 ; N fl ; B -186 -205 553 704 ; C 177 ; WX 500 ; N endash ; B -40 178 477 269 ; C 178 ; WX 500 ; N dagger ; B 91 -145 494 685 ; C 179 ; WX 500 ; N daggerdbl ; B 10 -139 493 685 ; C 180 ; WX 250 ; N periodcentered ; B 51 257 199 405 ; C 182 ; WX 500 ; N paragraph ; B -57 -193 562 669 ; C 183 ; WX 350 ; N bullet ; B 0 175 350 525 ; C 184 ; WX 333 ; N quotesinglbase ; B -5 -182 199 134 ; C 185 ; WX 500 ; N quotedblbase ; B -57 -182 403 134 ; C 186 ; WX 500 ; N quotedblright ; B 53 369 513 685 ; C 187 ; WX 500 ; N guillemotright ; B 12 32 468 415 ; C 188 ; WX 1000 ; N ellipsis ; B 40 -13 852 135 ; C 189 ; WX 1000 ; N perthousand ; B 7 -29 996 706 ; C 191 ; WX 500 ; N questiondown ; B 30 -205 421 492 ; C 193 ; WX 333 ; N grave ; B 85 516 297 697 ; C 194 ; WX 333 ; N acute ; B 139 516 379 697 ; C 195 ; WX 333 ; N circumflex ; B 40 516 367 690 ; C 196 ; WX 333 ; N tilde ; B 48 536 407 655 ; C 197 ; WX 333 ; N macron ; B 51 553 393 623 ; C 198 ; WX 333 ; N breve ; B 71 516 387 678 ; C 199 ; WX 333 ; N dotaccent ; B 163 550 298 684 ; C 200 ; WX 333 ; N dieresis ; B 55 550 402 684 ; C 202 ; WX 333 ; N ring ; B 127 516 340 729 ; C 203 ; WX 333 ; N cedilla ; B -80 -218 156 5 ; C 205 ; WX 333 ; N hungarumlaut ; B 69 516 498 697 ; C 206 ; WX 333 ; N ogonek ; B 15 -183 244 34 ; C 207 ; WX 333 ; N caron ; B 79 516 411 690 ; C 208 ; WX 1000 ; N emdash ; B -40 178 977 269 ; C 225 ; WX 944 ; N AE ; B -64 0 918 669 ; C 227 ; WX 266 ; N ordfeminine ; B 16 399 330 685 ; C 232 ; WX 611 ; N Lslash ; B -22 0 590 669 ; C 233 ; WX 722 ; N Oslash ; B 27 -125 691 764 ; C 234 ; WX 944 ; N OE ; B 23 -8 946 677 ; C 235 ; WX 300 ; N ordmasculine ; B 56 400 347 685 ; C 241 ; WX 722 ; N ae ; B -5 -13 673 462 ; C 245 ; WX 278 ; N dotlessi ; B 2 -9 238 462 ; C 248 ; WX 278 ; N lslash ; B -7 -9 307 699 ; C 249 ; WX 500 ; N oslash ; B -3 -119 441 560 ; C 250 ; WX 722 ; N oe ; B 6 -13 674 462 ; C 251 ; WX 500 ; N germandbls ; B -200 -200 473 705 ; C -1 ; WX 389 ; N Idieresis ; B -32 0 450 862 ; C -1 ; WX 444 ; N eacute ; B 5 -13 435 697 ; C -1 ; WX 500 ; N abreve ; B -21 -14 471 678 ; C -1 ; WX 556 ; N uhungarumlaut ; B 15 -9 610 697 ; C -1 ; WX 444 ; N ecaron ; B 5 -13 467 690 ; C -1 ; WX 611 ; N Ydieresis ; B 73 0 659 862 ; C -1 ; WX 570 ; N divide ; B 33 -29 537 535 ; C -1 ; WX 611 ; N Yacute ; B 73 0 659 904 ; C -1 ; WX 667 ; N Acircumflex ; B -67 0 593 897 ; C -1 ; WX 500 ; N aacute ; B -21 -14 463 697 ; C -1 ; WX 722 ; N Ucircumflex ; B 67 -18 744 897 ; C -1 ; WX 444 ; N yacute ; B -94 -205 435 697 ; C -1 ; WX 389 ; N scommaaccent ; B -19 -218 333 462 ; C -1 ; WX 444 ; N ecircumflex ; B 5 -13 423 690 ; C -1 ; WX 722 ; N Uring ; B 67 -18 744 921 ; C -1 ; WX 722 ; N Udieresis ; B 67 -18 744 862 ; C -1 ; WX 500 ; N aogonek ; B -21 -183 455 462 ; C -1 ; WX 722 ; N Uacute ; B 67 -18 744 904 ; C -1 ; WX 556 ; N uogonek ; B 15 -183 492 462 ; C -1 ; WX 667 ; N Edieresis ; B -27 0 653 862 ; C -1 ; WX 722 ; N Dcroat ; B -31 0 700 669 ; C -1 ; WX 250 ; N commaaccent ; B -36 -218 131 -50 ; C -1 ; WX 747 ; N copyright ; B 30 -18 718 685 ; C -1 ; WX 667 ; N Emacron ; B -27 0 653 830 ; C -1 ; WX 444 ; N ccaron ; B -5 -13 467 690 ; C -1 ; WX 500 ; N aring ; B -21 -14 455 729 ; C -1 ; WX 722 ; N Ncommaaccent ; B -27 -218 748 669 ; C -1 ; WX 278 ; N lacute ; B 2 -9 392 904 ; C -1 ; WX 500 ; N agrave ; B -21 -14 455 697 ; C -1 ; WX 611 ; N Tcommaaccent ; B 50 -218 650 669 ; C -1 ; WX 667 ; N Cacute ; B 32 -18 677 904 ; C -1 ; WX 500 ; N atilde ; B -21 -14 491 655 ; C -1 ; WX 667 ; N Edotaccent ; B -27 0 653 862 ; C -1 ; WX 389 ; N scaron ; B -19 -13 424 690 ; C -1 ; WX 389 ; N scedilla ; B -19 -218 333 462 ; C -1 ; WX 278 ; N iacute ; B 2 -9 352 697 ; C -1 ; WX 494 ; N lozenge ; B 10 0 484 745 ; C -1 ; WX 667 ; N Rcaron ; B -29 0 623 897 ; C -1 ; WX 722 ; N Gcommaaccent ; B 21 -218 706 685 ; C -1 ; WX 556 ; N ucircumflex ; B 15 -9 492 690 ; C -1 ; WX 500 ; N acircumflex ; B -21 -14 455 690 ; C -1 ; WX 667 ; N Amacron ; B -67 0 593 830 ; C -1 ; WX 389 ; N rcaron ; B -21 0 424 690 ; C -1 ; WX 444 ; N ccedilla ; B -5 -218 392 462 ; C -1 ; WX 611 ; N Zdotaccent ; B -11 0 590 862 ; C -1 ; WX 611 ; N Thorn ; B -27 0 573 669 ; C -1 ; WX 722 ; N Omacron ; B 27 -18 691 830 ; C -1 ; WX 667 ; N Racute ; B -29 0 623 904 ; C -1 ; WX 556 ; N Sacute ; B 2 -18 531 904 ; C -1 ; WX 608 ; N dcaron ; B -21 -13 675 708 ; C -1 ; WX 722 ; N Umacron ; B 67 -18 744 830 ; C -1 ; WX 556 ; N uring ; B 15 -9 492 729 ; C -1 ; WX 300 ; N threesuperior ; B 17 265 321 683 ; C -1 ; WX 722 ; N Ograve ; B 27 -18 691 904 ; C -1 ; WX 667 ; N Agrave ; B -67 0 593 904 ; C -1 ; WX 667 ; N Abreve ; B -67 0 593 885 ; C -1 ; WX 570 ; N multiply ; B 48 16 522 490 ; C -1 ; WX 556 ; N uacute ; B 15 -9 492 697 ; C -1 ; WX 611 ; N Tcaron ; B 50 0 650 897 ; C -1 ; WX 494 ; N partialdiff ; B 11 -21 494 750 ; C -1 ; WX 444 ; N ydieresis ; B -94 -205 443 655 ; C -1 ; WX 722 ; N Nacute ; B -27 -15 748 904 ; C -1 ; WX 278 ; N icircumflex ; B -3 -9 324 690 ; C -1 ; WX 667 ; N Ecircumflex ; B -27 0 653 897 ; C -1 ; WX 500 ; N adieresis ; B -21 -14 476 655 ; C -1 ; WX 444 ; N edieresis ; B 5 -13 448 655 ; C -1 ; WX 444 ; N cacute ; B -5 -13 435 697 ; C -1 ; WX 556 ; N nacute ; B -6 -9 493 697 ; C -1 ; WX 556 ; N umacron ; B 15 -9 492 623 ; C -1 ; WX 722 ; N Ncaron ; B -27 -15 748 897 ; C -1 ; WX 389 ; N Iacute ; B -32 0 432 904 ; C -1 ; WX 570 ; N plusminus ; B 33 0 537 506 ; C -1 ; WX 220 ; N brokenbar ; B 66 -143 154 707 ; C -1 ; WX 747 ; N registered ; B 30 -18 718 685 ; C -1 ; WX 722 ; N Gbreve ; B 21 -18 706 885 ; C -1 ; WX 389 ; N Idotaccent ; B -32 0 406 862 ; C -1 ; WX 600 ; N summation ; B 14 -10 585 706 ; C -1 ; WX 667 ; N Egrave ; B -27 0 653 904 ; C -1 ; WX 389 ; N racute ; B -21 0 407 697 ; C -1 ; WX 500 ; N omacron ; B -3 -13 462 623 ; C -1 ; WX 611 ; N Zacute ; B -11 0 590 904 ; C -1 ; WX 611 ; N Zcaron ; B -11 0 590 897 ; C -1 ; WX 549 ; N greaterequal ; B 26 0 523 704 ; C -1 ; WX 722 ; N Eth ; B -31 0 700 669 ; C -1 ; WX 667 ; N Ccedilla ; B 32 -218 677 685 ; C -1 ; WX 278 ; N lcommaaccent ; B -42 -218 290 699 ; C -1 ; WX 366 ; N tcaron ; B -11 -9 434 754 ; C -1 ; WX 444 ; N eogonek ; B 5 -183 398 462 ; C -1 ; WX 722 ; N Uogonek ; B 67 -183 744 669 ; C -1 ; WX 667 ; N Aacute ; B -67 0 593 904 ; C -1 ; WX 667 ; N Adieresis ; B -67 0 593 862 ; C -1 ; WX 444 ; N egrave ; B 5 -13 398 697 ; C -1 ; WX 389 ; N zacute ; B -43 -78 407 697 ; C -1 ; WX 278 ; N iogonek ; B -20 -183 263 684 ; C -1 ; WX 722 ; N Oacute ; B 27 -18 691 904 ; C -1 ; WX 500 ; N oacute ; B -3 -13 463 697 ; C -1 ; WX 500 ; N amacron ; B -21 -14 467 623 ; C -1 ; WX 389 ; N sacute ; B -19 -13 407 697 ; C -1 ; WX 278 ; N idieresis ; B 2 -9 364 655 ; C -1 ; WX 722 ; N Ocircumflex ; B 27 -18 691 897 ; C -1 ; WX 722 ; N Ugrave ; B 67 -18 744 904 ; C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; C -1 ; WX 500 ; N thorn ; B -120 -205 446 699 ; C -1 ; WX 300 ; N twosuperior ; B 2 274 313 683 ; C -1 ; WX 722 ; N Odieresis ; B 27 -18 691 862 ; C -1 ; WX 576 ; N mu ; B -60 -207 516 449 ; C -1 ; WX 278 ; N igrave ; B 2 -9 259 697 ; C -1 ; WX 500 ; N ohungarumlaut ; B -3 -13 582 697 ; C -1 ; WX 667 ; N Eogonek ; B -27 -183 653 669 ; C -1 ; WX 500 ; N dcroat ; B -21 -13 552 699 ; C -1 ; WX 750 ; N threequarters ; B 7 -14 726 683 ; C -1 ; WX 556 ; N Scedilla ; B 2 -218 526 685 ; C -1 ; WX 382 ; N lcaron ; B 2 -9 448 708 ; C -1 ; WX 667 ; N Kcommaaccent ; B -21 -218 702 669 ; C -1 ; WX 611 ; N Lacute ; B -22 0 590 904 ; C -1 ; WX 1000 ; N trademark ; B 32 263 968 669 ; C -1 ; WX 444 ; N edotaccent ; B 5 -13 398 655 ; C -1 ; WX 389 ; N Igrave ; B -32 0 406 904 ; C -1 ; WX 389 ; N Imacron ; B -32 0 461 830 ; C -1 ; WX 611 ; N Lcaron ; B -22 0 671 718 ; C -1 ; WX 750 ; N onehalf ; B -9 -14 723 683 ; C -1 ; WX 549 ; N lessequal ; B 29 0 526 704 ; C -1 ; WX 500 ; N ocircumflex ; B -3 -13 451 690 ; C -1 ; WX 556 ; N ntilde ; B -6 -9 504 655 ; C -1 ; WX 722 ; N Uhungarumlaut ; B 67 -18 744 904 ; C -1 ; WX 667 ; N Eacute ; B -27 0 653 904 ; C -1 ; WX 444 ; N emacron ; B 5 -13 439 623 ; C -1 ; WX 500 ; N gbreve ; B -52 -203 478 678 ; C -1 ; WX 750 ; N onequarter ; B 7 -14 721 683 ; C -1 ; WX 556 ; N Scaron ; B 2 -18 553 897 ; C -1 ; WX 556 ; N Scommaaccent ; B 2 -218 526 685 ; C -1 ; WX 722 ; N Ohungarumlaut ; B 27 -18 723 904 ; C -1 ; WX 400 ; N degree ; B 83 397 369 683 ; C -1 ; WX 500 ; N ograve ; B -3 -13 441 697 ; C -1 ; WX 667 ; N Ccaron ; B 32 -18 677 897 ; C -1 ; WX 556 ; N ugrave ; B 15 -9 492 697 ; C -1 ; WX 549 ; N radical ; B 10 -46 512 850 ; C -1 ; WX 722 ; N Dcaron ; B -46 0 685 897 ; C -1 ; WX 389 ; N rcommaaccent ; B -67 -218 389 462 ; C -1 ; WX 722 ; N Ntilde ; B -27 -15 748 862 ; C -1 ; WX 500 ; N otilde ; B -3 -13 491 655 ; C -1 ; WX 667 ; N Rcommaaccent ; B -29 -218 623 669 ; C -1 ; WX 611 ; N Lcommaaccent ; B -22 -218 590 669 ; C -1 ; WX 667 ; N Atilde ; B -67 0 593 862 ; C -1 ; WX 667 ; N Aogonek ; B -67 -183 604 683 ; C -1 ; WX 667 ; N Aring ; B -67 0 593 921 ; C -1 ; WX 722 ; N Otilde ; B 27 -18 691 862 ; C -1 ; WX 389 ; N zdotaccent ; B -43 -78 368 655 ; C -1 ; WX 667 ; N Ecaron ; B -27 0 653 897 ; C -1 ; WX 389 ; N Iogonek ; B -32 -183 406 669 ; C -1 ; WX 500 ; N kcommaaccent ; B -23 -218 483 699 ; C -1 ; WX 606 ; N minus ; B 51 209 555 297 ; C -1 ; WX 389 ; N Icircumflex ; B -32 0 450 897 ; C -1 ; WX 556 ; N ncaron ; B -6 -9 523 690 ; C -1 ; WX 278 ; N tcommaaccent ; B -62 -218 281 594 ; C -1 ; WX 606 ; N logicalnot ; B 51 108 555 399 ; C -1 ; WX 500 ; N odieresis ; B -3 -13 471 655 ; C -1 ; WX 556 ; N udieresis ; B 15 -9 499 655 ; C -1 ; WX 549 ; N notequal ; B 15 -49 540 570 ; C -1 ; WX 500 ; N gcommaaccent ; B -52 -203 478 767 ; C -1 ; WX 500 ; N eth ; B -3 -13 454 699 ; C -1 ; WX 389 ; N zcaron ; B -43 -78 424 690 ; C -1 ; WX 556 ; N ncommaaccent ; B -6 -218 493 462 ; C -1 ; WX 300 ; N onesuperior ; B 30 274 301 683 ; C -1 ; WX 278 ; N imacron ; B 2 -9 294 623 ; C -1 ; WX 500 ; N Euro ; B 0 0 0 0 ; EndCharMetrics StartKernData StartKernPairs 2038 KPX A C -65 KPX A Cacute -65 KPX A Ccaron -65 KPX A Ccedilla -65 KPX A G -60 KPX A Gbreve -60 KPX A Gcommaaccent -60 KPX A O -50 KPX A Oacute -50 KPX A Ocircumflex -50 KPX A Odieresis -50 KPX A Ograve -50 KPX A Ohungarumlaut -50 KPX A Omacron -50 KPX A Oslash -50 KPX A Otilde -50 KPX A Q -55 KPX A T -55 KPX A Tcaron -55 KPX A Tcommaaccent -55 KPX A U -50 KPX A Uacute -50 KPX A Ucircumflex -50 KPX A Udieresis -50 KPX A Ugrave -50 KPX A Uhungarumlaut -50 KPX A Umacron -50 KPX A Uogonek -50 KPX A Uring -50 KPX A V -95 KPX A W -100 KPX A Y -70 KPX A Yacute -70 KPX A Ydieresis -70 KPX A quoteright -74 KPX A u -30 KPX A uacute -30 KPX A ucircumflex -30 KPX A udieresis -30 KPX A ugrave -30 KPX A uhungarumlaut -30 KPX A umacron -30 KPX A uogonek -30 KPX A uring -30 KPX A v -74 KPX A w -74 KPX A y -74 KPX A yacute -74 KPX A ydieresis -74 KPX Aacute C -65 KPX Aacute Cacute -65 KPX Aacute Ccaron -65 KPX Aacute Ccedilla -65 KPX Aacute G -60 KPX Aacute Gbreve -60 KPX Aacute Gcommaaccent -60 KPX Aacute O -50 KPX Aacute Oacute -50 KPX Aacute Ocircumflex -50 KPX Aacute Odieresis -50 KPX Aacute Ograve -50 KPX Aacute Ohungarumlaut -50 KPX Aacute Omacron -50 KPX Aacute Oslash -50 KPX Aacute Otilde -50 KPX Aacute Q -55 KPX Aacute T -55 KPX Aacute Tcaron -55 KPX Aacute Tcommaaccent -55 KPX Aacute U -50 KPX Aacute Uacute -50 KPX Aacute Ucircumflex -50 KPX Aacute Udieresis -50 KPX Aacute Ugrave -50 KPX Aacute Uhungarumlaut -50 KPX Aacute Umacron -50 KPX Aacute Uogonek -50 KPX Aacute Uring -50 KPX Aacute V -95 KPX Aacute W -100 KPX Aacute Y -70 KPX Aacute Yacute -70 KPX Aacute Ydieresis -70 KPX Aacute quoteright -74 KPX Aacute u -30 KPX Aacute uacute -30 KPX Aacute ucircumflex -30 KPX Aacute udieresis -30 KPX Aacute ugrave -30 KPX Aacute uhungarumlaut -30 KPX Aacute umacron -30 KPX Aacute uogonek -30 KPX Aacute uring -30 KPX Aacute v -74 KPX Aacute w -74 KPX Aacute y -74 KPX Aacute yacute -74 KPX Aacute ydieresis -74 KPX Abreve C -65 KPX Abreve Cacute -65 KPX Abreve Ccaron -65 KPX Abreve Ccedilla -65 KPX Abreve G -60 KPX Abreve Gbreve -60 KPX Abreve Gcommaaccent -60 KPX Abreve O -50 KPX Abreve Oacute -50 KPX Abreve Ocircumflex -50 KPX Abreve Odieresis -50 KPX Abreve Ograve -50 KPX Abreve Ohungarumlaut -50 KPX Abreve Omacron -50 KPX Abreve Oslash -50 KPX Abreve Otilde -50 KPX Abreve Q -55 KPX Abreve T -55 KPX Abreve Tcaron -55 KPX Abreve Tcommaaccent -55 KPX Abreve U -50 KPX Abreve Uacute -50 KPX Abreve Ucircumflex -50 KPX Abreve Udieresis -50 KPX Abreve Ugrave -50 KPX Abreve Uhungarumlaut -50 KPX Abreve Umacron -50 KPX Abreve Uogonek -50 KPX Abreve Uring -50 KPX Abreve V -95 KPX Abreve W -100 KPX Abreve Y -70 KPX Abreve Yacute -70 KPX Abreve Ydieresis -70 KPX Abreve quoteright -74 KPX Abreve u -30 KPX Abreve uacute -30 KPX Abreve ucircumflex -30 KPX Abreve udieresis -30 KPX Abreve ugrave -30 KPX Abreve uhungarumlaut -30 KPX Abreve umacron -30 KPX Abreve uogonek -30 KPX Abreve uring -30 KPX Abreve v -74 KPX Abreve w -74 KPX Abreve y -74 KPX Abreve yacute -74 KPX Abreve ydieresis -74 KPX Acircumflex C -65 KPX Acircumflex Cacute -65 KPX Acircumflex Ccaron -65 KPX Acircumflex Ccedilla -65 KPX Acircumflex G -60 KPX Acircumflex Gbreve -60 KPX Acircumflex Gcommaaccent -60 KPX Acircumflex O -50 KPX Acircumflex Oacute -50 KPX Acircumflex Ocircumflex -50 KPX Acircumflex Odieresis -50 KPX Acircumflex Ograve -50 KPX Acircumflex Ohungarumlaut -50 KPX Acircumflex Omacron -50 KPX Acircumflex Oslash -50 KPX Acircumflex Otilde -50 KPX Acircumflex Q -55 KPX Acircumflex T -55 KPX Acircumflex Tcaron -55 KPX Acircumflex Tcommaaccent -55 KPX Acircumflex U -50 KPX Acircumflex Uacute -50 KPX Acircumflex Ucircumflex -50 KPX Acircumflex Udieresis -50 KPX Acircumflex Ugrave -50 KPX Acircumflex Uhungarumlaut -50 KPX Acircumflex Umacron -50 KPX Acircumflex Uogonek -50 KPX Acircumflex Uring -50 KPX Acircumflex V -95 KPX Acircumflex W -100 KPX Acircumflex Y -70 KPX Acircumflex Yacute -70 KPX Acircumflex Ydieresis -70 KPX Acircumflex quoteright -74 KPX Acircumflex u -30 KPX Acircumflex uacute -30 KPX Acircumflex ucircumflex -30 KPX Acircumflex udieresis -30 KPX Acircumflex ugrave -30 KPX Acircumflex uhungarumlaut -30 KPX Acircumflex umacron -30 KPX Acircumflex uogonek -30 KPX Acircumflex uring -30 KPX Acircumflex v -74 KPX Acircumflex w -74 KPX Acircumflex y -74 KPX Acircumflex yacute -74 KPX Acircumflex ydieresis -74 KPX Adieresis C -65 KPX Adieresis Cacute -65 KPX Adieresis Ccaron -65 KPX Adieresis Ccedilla -65 KPX Adieresis G -60 KPX Adieresis Gbreve -60 KPX Adieresis Gcommaaccent -60 KPX Adieresis O -50 KPX Adieresis Oacute -50 KPX Adieresis Ocircumflex -50 KPX Adieresis Odieresis -50 KPX Adieresis Ograve -50 KPX Adieresis Ohungarumlaut -50 KPX Adieresis Omacron -50 KPX Adieresis Oslash -50 KPX Adieresis Otilde -50 KPX Adieresis Q -55 KPX Adieresis T -55 KPX Adieresis Tcaron -55 KPX Adieresis Tcommaaccent -55 KPX Adieresis U -50 KPX Adieresis Uacute -50 KPX Adieresis Ucircumflex -50 KPX Adieresis Udieresis -50 KPX Adieresis Ugrave -50 KPX Adieresis Uhungarumlaut -50 KPX Adieresis Umacron -50 KPX Adieresis Uogonek -50 KPX Adieresis Uring -50 KPX Adieresis V -95 KPX Adieresis W -100 KPX Adieresis Y -70 KPX Adieresis Yacute -70 KPX Adieresis Ydieresis -70 KPX Adieresis quoteright -74 KPX Adieresis u -30 KPX Adieresis uacute -30 KPX Adieresis ucircumflex -30 KPX Adieresis udieresis -30 KPX Adieresis ugrave -30 KPX Adieresis uhungarumlaut -30 KPX Adieresis umacron -30 KPX Adieresis uogonek -30 KPX Adieresis uring -30 KPX Adieresis v -74 KPX Adieresis w -74 KPX Adieresis y -74 KPX Adieresis yacute -74 KPX Adieresis ydieresis -74 KPX Agrave C -65 KPX Agrave Cacute -65 KPX Agrave Ccaron -65 KPX Agrave Ccedilla -65 KPX Agrave G -60 KPX Agrave Gbreve -60 KPX Agrave Gcommaaccent -60 KPX Agrave O -50 KPX Agrave Oacute -50 KPX Agrave Ocircumflex -50 KPX Agrave Odieresis -50 KPX Agrave Ograve -50 KPX Agrave Ohungarumlaut -50 KPX Agrave Omacron -50 KPX Agrave Oslash -50 KPX Agrave Otilde -50 KPX Agrave Q -55 KPX Agrave T -55 KPX Agrave Tcaron -55 KPX Agrave Tcommaaccent -55 KPX Agrave U -50 KPX Agrave Uacute -50 KPX Agrave Ucircumflex -50 KPX Agrave Udieresis -50 KPX Agrave Ugrave -50 KPX Agrave Uhungarumlaut -50 KPX Agrave Umacron -50 KPX Agrave Uogonek -50 KPX Agrave Uring -50 KPX Agrave V -95 KPX Agrave W -100 KPX Agrave Y -70 KPX Agrave Yacute -70 KPX Agrave Ydieresis -70 KPX Agrave quoteright -74 KPX Agrave u -30 KPX Agrave uacute -30 KPX Agrave ucircumflex -30 KPX Agrave udieresis -30 KPX Agrave ugrave -30 KPX Agrave uhungarumlaut -30 KPX Agrave umacron -30 KPX Agrave uogonek -30 KPX Agrave uring -30 KPX Agrave v -74 KPX Agrave w -74 KPX Agrave y -74 KPX Agrave yacute -74 KPX Agrave ydieresis -74 KPX Amacron C -65 KPX Amacron Cacute -65 KPX Amacron Ccaron -65 KPX Amacron Ccedilla -65 KPX Amacron G -60 KPX Amacron Gbreve -60 KPX Amacron Gcommaaccent -60 KPX Amacron O -50 KPX Amacron Oacute -50 KPX Amacron Ocircumflex -50 KPX Amacron Odieresis -50 KPX Amacron Ograve -50 KPX Amacron Ohungarumlaut -50 KPX Amacron Omacron -50 KPX Amacron Oslash -50 KPX Amacron Otilde -50 KPX Amacron Q -55 KPX Amacron T -55 KPX Amacron Tcaron -55 KPX Amacron Tcommaaccent -55 KPX Amacron U -50 KPX Amacron Uacute -50 KPX Amacron Ucircumflex -50 KPX Amacron Udieresis -50 KPX Amacron Ugrave -50 KPX Amacron Uhungarumlaut -50 KPX Amacron Umacron -50 KPX Amacron Uogonek -50 KPX Amacron Uring -50 KPX Amacron V -95 KPX Amacron W -100 KPX Amacron Y -70 KPX Amacron Yacute -70 KPX Amacron Ydieresis -70 KPX Amacron quoteright -74 KPX Amacron u -30 KPX Amacron uacute -30 KPX Amacron ucircumflex -30 KPX Amacron udieresis -30 KPX Amacron ugrave -30 KPX Amacron uhungarumlaut -30 KPX Amacron umacron -30 KPX Amacron uogonek -30 KPX Amacron uring -30 KPX Amacron v -74 KPX Amacron w -74 KPX Amacron y -74 KPX Amacron yacute -74 KPX Amacron ydieresis -74 KPX Aogonek C -65 KPX Aogonek Cacute -65 KPX Aogonek Ccaron -65 KPX Aogonek Ccedilla -65 KPX Aogonek G -60 KPX Aogonek Gbreve -60 KPX Aogonek Gcommaaccent -60 KPX Aogonek O -50 KPX Aogonek Oacute -50 KPX Aogonek Ocircumflex -50 KPX Aogonek Odieresis -50 KPX Aogonek Ograve -50 KPX Aogonek Ohungarumlaut -50 KPX Aogonek Omacron -50 KPX Aogonek Oslash -50 KPX Aogonek Otilde -50 KPX Aogonek Q -55 KPX Aogonek T -55 KPX Aogonek Tcaron -55 KPX Aogonek Tcommaaccent -55 KPX Aogonek U -50 KPX Aogonek Uacute -50 KPX Aogonek Ucircumflex -50 KPX Aogonek Udieresis -50 KPX Aogonek Ugrave -50 KPX Aogonek Uhungarumlaut -50 KPX Aogonek Umacron -50 KPX Aogonek Uogonek -50 KPX Aogonek Uring -50 KPX Aogonek V -95 KPX Aogonek W -100 KPX Aogonek Y -70 KPX Aogonek Yacute -70 KPX Aogonek Ydieresis -70 KPX Aogonek quoteright -74 KPX Aogonek u -30 KPX Aogonek uacute -30 KPX Aogonek ucircumflex -30 KPX Aogonek udieresis -30 KPX Aogonek ugrave -30 KPX Aogonek uhungarumlaut -30 KPX Aogonek umacron -30 KPX Aogonek uogonek -30 KPX Aogonek uring -30 KPX Aogonek v -74 KPX Aogonek w -74 KPX Aogonek y -34 KPX Aogonek yacute -34 KPX Aogonek ydieresis -34 KPX Aring C -65 KPX Aring Cacute -65 KPX Aring Ccaron -65 KPX Aring Ccedilla -65 KPX Aring G -60 KPX Aring Gbreve -60 KPX Aring Gcommaaccent -60 KPX Aring O -50 KPX Aring Oacute -50 KPX Aring Ocircumflex -50 KPX Aring Odieresis -50 KPX Aring Ograve -50 KPX Aring Ohungarumlaut -50 KPX Aring Omacron -50 KPX Aring Oslash -50 KPX Aring Otilde -50 KPX Aring Q -55 KPX Aring T -55 KPX Aring Tcaron -55 KPX Aring Tcommaaccent -55 KPX Aring U -50 KPX Aring Uacute -50 KPX Aring Ucircumflex -50 KPX Aring Udieresis -50 KPX Aring Ugrave -50 KPX Aring Uhungarumlaut -50 KPX Aring Umacron -50 KPX Aring Uogonek -50 KPX Aring Uring -50 KPX Aring V -95 KPX Aring W -100 KPX Aring Y -70 KPX Aring Yacute -70 KPX Aring Ydieresis -70 KPX Aring quoteright -74 KPX Aring u -30 KPX Aring uacute -30 KPX Aring ucircumflex -30 KPX Aring udieresis -30 KPX Aring ugrave -30 KPX Aring uhungarumlaut -30 KPX Aring umacron -30 KPX Aring uogonek -30 KPX Aring uring -30 KPX Aring v -74 KPX Aring w -74 KPX Aring y -74 KPX Aring yacute -74 KPX Aring ydieresis -74 KPX Atilde C -65 KPX Atilde Cacute -65 KPX Atilde Ccaron -65 KPX Atilde Ccedilla -65 KPX Atilde G -60 KPX Atilde Gbreve -60 KPX Atilde Gcommaaccent -60 KPX Atilde O -50 KPX Atilde Oacute -50 KPX Atilde Ocircumflex -50 KPX Atilde Odieresis -50 KPX Atilde Ograve -50 KPX Atilde Ohungarumlaut -50 KPX Atilde Omacron -50 KPX Atilde Oslash -50 KPX Atilde Otilde -50 KPX Atilde Q -55 KPX Atilde T -55 KPX Atilde Tcaron -55 KPX Atilde Tcommaaccent -55 KPX Atilde U -50 KPX Atilde Uacute -50 KPX Atilde Ucircumflex -50 KPX Atilde Udieresis -50 KPX Atilde Ugrave -50 KPX Atilde Uhungarumlaut -50 KPX Atilde Umacron -50 KPX Atilde Uogonek -50 KPX Atilde Uring -50 KPX Atilde V -95 KPX Atilde W -100 KPX Atilde Y -70 KPX Atilde Yacute -70 KPX Atilde Ydieresis -70 KPX Atilde quoteright -74 KPX Atilde u -30 KPX Atilde uacute -30 KPX Atilde ucircumflex -30 KPX Atilde udieresis -30 KPX Atilde ugrave -30 KPX Atilde uhungarumlaut -30 KPX Atilde umacron -30 KPX Atilde uogonek -30 KPX Atilde uring -30 KPX Atilde v -74 KPX Atilde w -74 KPX Atilde y -74 KPX Atilde yacute -74 KPX Atilde ydieresis -74 KPX B A -25 KPX B Aacute -25 KPX B Abreve -25 KPX B Acircumflex -25 KPX B Adieresis -25 KPX B Agrave -25 KPX B Amacron -25 KPX B Aogonek -25 KPX B Aring -25 KPX B Atilde -25 KPX B U -10 KPX B Uacute -10 KPX B Ucircumflex -10 KPX B Udieresis -10 KPX B Ugrave -10 KPX B Uhungarumlaut -10 KPX B Umacron -10 KPX B Uogonek -10 KPX B Uring -10 KPX D A -25 KPX D Aacute -25 KPX D Abreve -25 KPX D Acircumflex -25 KPX D Adieresis -25 KPX D Agrave -25 KPX D Amacron -25 KPX D Aogonek -25 KPX D Aring -25 KPX D Atilde -25 KPX D V -50 KPX D W -40 KPX D Y -50 KPX D Yacute -50 KPX D Ydieresis -50 KPX Dcaron A -25 KPX Dcaron Aacute -25 KPX Dcaron Abreve -25 KPX Dcaron Acircumflex -25 KPX Dcaron Adieresis -25 KPX Dcaron Agrave -25 KPX Dcaron Amacron -25 KPX Dcaron Aogonek -25 KPX Dcaron Aring -25 KPX Dcaron Atilde -25 KPX Dcaron V -50 KPX Dcaron W -40 KPX Dcaron Y -50 KPX Dcaron Yacute -50 KPX Dcaron Ydieresis -50 KPX Dcroat A -25 KPX Dcroat Aacute -25 KPX Dcroat Abreve -25 KPX Dcroat Acircumflex -25 KPX Dcroat Adieresis -25 KPX Dcroat Agrave -25 KPX Dcroat Amacron -25 KPX Dcroat Aogonek -25 KPX Dcroat Aring -25 KPX Dcroat Atilde -25 KPX Dcroat V -50 KPX Dcroat W -40 KPX Dcroat Y -50 KPX Dcroat Yacute -50 KPX Dcroat Ydieresis -50 KPX F A -100 KPX F Aacute -100 KPX F Abreve -100 KPX F Acircumflex -100 KPX F Adieresis -100 KPX F Agrave -100 KPX F Amacron -100 KPX F Aogonek -100 KPX F Aring -100 KPX F Atilde -100 KPX F a -95 KPX F aacute -95 KPX F abreve -95 KPX F acircumflex -95 KPX F adieresis -95 KPX F agrave -95 KPX F amacron -95 KPX F aogonek -95 KPX F aring -95 KPX F atilde -95 KPX F comma -129 KPX F e -100 KPX F eacute -100 KPX F ecaron -100 KPX F ecircumflex -100 KPX F edieresis -100 KPX F edotaccent -100 KPX F egrave -100 KPX F emacron -100 KPX F eogonek -100 KPX F i -40 KPX F iacute -40 KPX F icircumflex -40 KPX F idieresis -40 KPX F igrave -40 KPX F imacron -40 KPX F iogonek -40 KPX F o -70 KPX F oacute -70 KPX F ocircumflex -70 KPX F odieresis -70 KPX F ograve -70 KPX F ohungarumlaut -70 KPX F omacron -70 KPX F oslash -70 KPX F otilde -70 KPX F period -129 KPX F r -50 KPX F racute -50 KPX F rcaron -50 KPX F rcommaaccent -50 KPX J A -25 KPX J Aacute -25 KPX J Abreve -25 KPX J Acircumflex -25 KPX J Adieresis -25 KPX J Agrave -25 KPX J Amacron -25 KPX J Aogonek -25 KPX J Aring -25 KPX J Atilde -25 KPX J a -40 KPX J aacute -40 KPX J abreve -40 KPX J acircumflex -40 KPX J adieresis -40 KPX J agrave -40 KPX J amacron -40 KPX J aogonek -40 KPX J aring -40 KPX J atilde -40 KPX J comma -10 KPX J e -40 KPX J eacute -40 KPX J ecaron -40 KPX J ecircumflex -40 KPX J edieresis -40 KPX J edotaccent -40 KPX J egrave -40 KPX J emacron -40 KPX J eogonek -40 KPX J o -40 KPX J oacute -40 KPX J ocircumflex -40 KPX J odieresis -40 KPX J ograve -40 KPX J ohungarumlaut -40 KPX J omacron -40 KPX J oslash -40 KPX J otilde -40 KPX J period -10 KPX J u -40 KPX J uacute -40 KPX J ucircumflex -40 KPX J udieresis -40 KPX J ugrave -40 KPX J uhungarumlaut -40 KPX J umacron -40 KPX J uogonek -40 KPX J uring -40 KPX K O -30 KPX K Oacute -30 KPX K Ocircumflex -30 KPX K Odieresis -30 KPX K Ograve -30 KPX K Ohungarumlaut -30 KPX K Omacron -30 KPX K Oslash -30 KPX K Otilde -30 KPX K e -25 KPX K eacute -25 KPX K ecaron -25 KPX K ecircumflex -25 KPX K edieresis -25 KPX K edotaccent -25 KPX K egrave -25 KPX K emacron -25 KPX K eogonek -25 KPX K o -25 KPX K oacute -25 KPX K ocircumflex -25 KPX K odieresis -25 KPX K ograve -25 KPX K ohungarumlaut -25 KPX K omacron -25 KPX K oslash -25 KPX K otilde -25 KPX K u -20 KPX K uacute -20 KPX K ucircumflex -20 KPX K udieresis -20 KPX K ugrave -20 KPX K uhungarumlaut -20 KPX K umacron -20 KPX K uogonek -20 KPX K uring -20 KPX K y -20 KPX K yacute -20 KPX K ydieresis -20 KPX Kcommaaccent O -30 KPX Kcommaaccent Oacute -30 KPX Kcommaaccent Ocircumflex -30 KPX Kcommaaccent Odieresis -30 KPX Kcommaaccent Ograve -30 KPX Kcommaaccent Ohungarumlaut -30 KPX Kcommaaccent Omacron -30 KPX Kcommaaccent Oslash -30 KPX Kcommaaccent Otilde -30 KPX Kcommaaccent e -25 KPX Kcommaaccent eacute -25 KPX Kcommaaccent ecaron -25 KPX Kcommaaccent ecircumflex -25 KPX Kcommaaccent edieresis -25 KPX Kcommaaccent edotaccent -25 KPX Kcommaaccent egrave -25 KPX Kcommaaccent emacron -25 KPX Kcommaaccent eogonek -25 KPX Kcommaaccent o -25 KPX Kcommaaccent oacute -25 KPX Kcommaaccent ocircumflex -25 KPX Kcommaaccent odieresis -25 KPX Kcommaaccent ograve -25 KPX Kcommaaccent ohungarumlaut -25 KPX Kcommaaccent omacron -25 KPX Kcommaaccent oslash -25 KPX Kcommaaccent otilde -25 KPX Kcommaaccent u -20 KPX Kcommaaccent uacute -20 KPX Kcommaaccent ucircumflex -20 KPX Kcommaaccent udieresis -20 KPX Kcommaaccent ugrave -20 KPX Kcommaaccent uhungarumlaut -20 KPX Kcommaaccent umacron -20 KPX Kcommaaccent uogonek -20 KPX Kcommaaccent uring -20 KPX Kcommaaccent y -20 KPX Kcommaaccent yacute -20 KPX Kcommaaccent ydieresis -20 KPX L T -18 KPX L Tcaron -18 KPX L Tcommaaccent -18 KPX L V -37 KPX L W -37 KPX L Y -37 KPX L Yacute -37 KPX L Ydieresis -37 KPX L quoteright -55 KPX L y -37 KPX L yacute -37 KPX L ydieresis -37 KPX Lacute T -18 KPX Lacute Tcaron -18 KPX Lacute Tcommaaccent -18 KPX Lacute V -37 KPX Lacute W -37 KPX Lacute Y -37 KPX Lacute Yacute -37 KPX Lacute Ydieresis -37 KPX Lacute quoteright -55 KPX Lacute y -37 KPX Lacute yacute -37 KPX Lacute ydieresis -37 KPX Lcommaaccent T -18 KPX Lcommaaccent Tcaron -18 KPX Lcommaaccent Tcommaaccent -18 KPX Lcommaaccent V -37 KPX Lcommaaccent W -37 KPX Lcommaaccent Y -37 KPX Lcommaaccent Yacute -37 KPX Lcommaaccent Ydieresis -37 KPX Lcommaaccent quoteright -55 KPX Lcommaaccent y -37 KPX Lcommaaccent yacute -37 KPX Lcommaaccent ydieresis -37 KPX Lslash T -18 KPX Lslash Tcaron -18 KPX Lslash Tcommaaccent -18 KPX Lslash V -37 KPX Lslash W -37 KPX Lslash Y -37 KPX Lslash Yacute -37 KPX Lslash Ydieresis -37 KPX Lslash quoteright -55 KPX Lslash y -37 KPX Lslash yacute -37 KPX Lslash ydieresis -37 KPX N A -30 KPX N Aacute -30 KPX N Abreve -30 KPX N Acircumflex -30 KPX N Adieresis -30 KPX N Agrave -30 KPX N Amacron -30 KPX N Aogonek -30 KPX N Aring -30 KPX N Atilde -30 KPX Nacute A -30 KPX Nacute Aacute -30 KPX Nacute Abreve -30 KPX Nacute Acircumflex -30 KPX Nacute Adieresis -30 KPX Nacute Agrave -30 KPX Nacute Amacron -30 KPX Nacute Aogonek -30 KPX Nacute Aring -30 KPX Nacute Atilde -30 KPX Ncaron A -30 KPX Ncaron Aacute -30 KPX Ncaron Abreve -30 KPX Ncaron Acircumflex -30 KPX Ncaron Adieresis -30 KPX Ncaron Agrave -30 KPX Ncaron Amacron -30 KPX Ncaron Aogonek -30 KPX Ncaron Aring -30 KPX Ncaron Atilde -30 KPX Ncommaaccent A -30 KPX Ncommaaccent Aacute -30 KPX Ncommaaccent Abreve -30 KPX Ncommaaccent Acircumflex -30 KPX Ncommaaccent Adieresis -30 KPX Ncommaaccent Agrave -30 KPX Ncommaaccent Amacron -30 KPX Ncommaaccent Aogonek -30 KPX Ncommaaccent Aring -30 KPX Ncommaaccent Atilde -30 KPX Ntilde A -30 KPX Ntilde Aacute -30 KPX Ntilde Abreve -30 KPX Ntilde Acircumflex -30 KPX Ntilde Adieresis -30 KPX Ntilde Agrave -30 KPX Ntilde Amacron -30 KPX Ntilde Aogonek -30 KPX Ntilde Aring -30 KPX Ntilde Atilde -30 KPX O A -40 KPX O Aacute -40 KPX O Abreve -40 KPX O Acircumflex -40 KPX O Adieresis -40 KPX O Agrave -40 KPX O Amacron -40 KPX O Aogonek -40 KPX O Aring -40 KPX O Atilde -40 KPX O T -40 KPX O Tcaron -40 KPX O Tcommaaccent -40 KPX O V -50 KPX O W -50 KPX O X -40 KPX O Y -50 KPX O Yacute -50 KPX O Ydieresis -50 KPX Oacute A -40 KPX Oacute Aacute -40 KPX Oacute Abreve -40 KPX Oacute Acircumflex -40 KPX Oacute Adieresis -40 KPX Oacute Agrave -40 KPX Oacute Amacron -40 KPX Oacute Aogonek -40 KPX Oacute Aring -40 KPX Oacute Atilde -40 KPX Oacute T -40 KPX Oacute Tcaron -40 KPX Oacute Tcommaaccent -40 KPX Oacute V -50 KPX Oacute W -50 KPX Oacute X -40 KPX Oacute Y -50 KPX Oacute Yacute -50 KPX Oacute Ydieresis -50 KPX Ocircumflex A -40 KPX Ocircumflex Aacute -40 KPX Ocircumflex Abreve -40 KPX Ocircumflex Acircumflex -40 KPX Ocircumflex Adieresis -40 KPX Ocircumflex Agrave -40 KPX Ocircumflex Amacron -40 KPX Ocircumflex Aogonek -40 KPX Ocircumflex Aring -40 KPX Ocircumflex Atilde -40 KPX Ocircumflex T -40 KPX Ocircumflex Tcaron -40 KPX Ocircumflex Tcommaaccent -40 KPX Ocircumflex V -50 KPX Ocircumflex W -50 KPX Ocircumflex X -40 KPX Ocircumflex Y -50 KPX Ocircumflex Yacute -50 KPX Ocircumflex Ydieresis -50 KPX Odieresis A -40 KPX Odieresis Aacute -40 KPX Odieresis Abreve -40 KPX Odieresis Acircumflex -40 KPX Odieresis Adieresis -40 KPX Odieresis Agrave -40 KPX Odieresis Amacron -40 KPX Odieresis Aogonek -40 KPX Odieresis Aring -40 KPX Odieresis Atilde -40 KPX Odieresis T -40 KPX Odieresis Tcaron -40 KPX Odieresis Tcommaaccent -40 KPX Odieresis V -50 KPX Odieresis W -50 KPX Odieresis X -40 KPX Odieresis Y -50 KPX Odieresis Yacute -50 KPX Odieresis Ydieresis -50 KPX Ograve A -40 KPX Ograve Aacute -40 KPX Ograve Abreve -40 KPX Ograve Acircumflex -40 KPX Ograve Adieresis -40 KPX Ograve Agrave -40 KPX Ograve Amacron -40 KPX Ograve Aogonek -40 KPX Ograve Aring -40 KPX Ograve Atilde -40 KPX Ograve T -40 KPX Ograve Tcaron -40 KPX Ograve Tcommaaccent -40 KPX Ograve V -50 KPX Ograve W -50 KPX Ograve X -40 KPX Ograve Y -50 KPX Ograve Yacute -50 KPX Ograve Ydieresis -50 KPX Ohungarumlaut A -40 KPX Ohungarumlaut Aacute -40 KPX Ohungarumlaut Abreve -40 KPX Ohungarumlaut Acircumflex -40 KPX Ohungarumlaut Adieresis -40 KPX Ohungarumlaut Agrave -40 KPX Ohungarumlaut Amacron -40 KPX Ohungarumlaut Aogonek -40 KPX Ohungarumlaut Aring -40 KPX Ohungarumlaut Atilde -40 KPX Ohungarumlaut T -40 KPX Ohungarumlaut Tcaron -40 KPX Ohungarumlaut Tcommaaccent -40 KPX Ohungarumlaut V -50 KPX Ohungarumlaut W -50 KPX Ohungarumlaut X -40 KPX Ohungarumlaut Y -50 KPX Ohungarumlaut Yacute -50 KPX Ohungarumlaut Ydieresis -50 KPX Omacron A -40 KPX Omacron Aacute -40 KPX Omacron Abreve -40 KPX Omacron Acircumflex -40 KPX Omacron Adieresis -40 KPX Omacron Agrave -40 KPX Omacron Amacron -40 KPX Omacron Aogonek -40 KPX Omacron Aring -40 KPX Omacron Atilde -40 KPX Omacron T -40 KPX Omacron Tcaron -40 KPX Omacron Tcommaaccent -40 KPX Omacron V -50 KPX Omacron W -50 KPX Omacron X -40 KPX Omacron Y -50 KPX Omacron Yacute -50 KPX Omacron Ydieresis -50 KPX Oslash A -40 KPX Oslash Aacute -40 KPX Oslash Abreve -40 KPX Oslash Acircumflex -40 KPX Oslash Adieresis -40 KPX Oslash Agrave -40 KPX Oslash Amacron -40 KPX Oslash Aogonek -40 KPX Oslash Aring -40 KPX Oslash Atilde -40 KPX Oslash T -40 KPX Oslash Tcaron -40 KPX Oslash Tcommaaccent -40 KPX Oslash V -50 KPX Oslash W -50 KPX Oslash X -40 KPX Oslash Y -50 KPX Oslash Yacute -50 KPX Oslash Ydieresis -50 KPX Otilde A -40 KPX Otilde Aacute -40 KPX Otilde Abreve -40 KPX Otilde Acircumflex -40 KPX Otilde Adieresis -40 KPX Otilde Agrave -40 KPX Otilde Amacron -40 KPX Otilde Aogonek -40 KPX Otilde Aring -40 KPX Otilde Atilde -40 KPX Otilde T -40 KPX Otilde Tcaron -40 KPX Otilde Tcommaaccent -40 KPX Otilde V -50 KPX Otilde W -50 KPX Otilde X -40 KPX Otilde Y -50 KPX Otilde Yacute -50 KPX Otilde Ydieresis -50 KPX P A -85 KPX P Aacute -85 KPX P Abreve -85 KPX P Acircumflex -85 KPX P Adieresis -85 KPX P Agrave -85 KPX P Amacron -85 KPX P Aogonek -85 KPX P Aring -85 KPX P Atilde -85 KPX P a -40 KPX P aacute -40 KPX P abreve -40 KPX P acircumflex -40 KPX P adieresis -40 KPX P agrave -40 KPX P amacron -40 KPX P aogonek -40 KPX P aring -40 KPX P atilde -40 KPX P comma -129 KPX P e -50 KPX P eacute -50 KPX P ecaron -50 KPX P ecircumflex -50 KPX P edieresis -50 KPX P edotaccent -50 KPX P egrave -50 KPX P emacron -50 KPX P eogonek -50 KPX P o -55 KPX P oacute -55 KPX P ocircumflex -55 KPX P odieresis -55 KPX P ograve -55 KPX P ohungarumlaut -55 KPX P omacron -55 KPX P oslash -55 KPX P otilde -55 KPX P period -129 KPX Q U -10 KPX Q Uacute -10 KPX Q Ucircumflex -10 KPX Q Udieresis -10 KPX Q Ugrave -10 KPX Q Uhungarumlaut -10 KPX Q Umacron -10 KPX Q Uogonek -10 KPX Q Uring -10 KPX R O -40 KPX R Oacute -40 KPX R Ocircumflex -40 KPX R Odieresis -40 KPX R Ograve -40 KPX R Ohungarumlaut -40 KPX R Omacron -40 KPX R Oslash -40 KPX R Otilde -40 KPX R T -30 KPX R Tcaron -30 KPX R Tcommaaccent -30 KPX R U -40 KPX R Uacute -40 KPX R Ucircumflex -40 KPX R Udieresis -40 KPX R Ugrave -40 KPX R Uhungarumlaut -40 KPX R Umacron -40 KPX R Uogonek -40 KPX R Uring -40 KPX R V -18 KPX R W -18 KPX R Y -18 KPX R Yacute -18 KPX R Ydieresis -18 KPX Racute O -40 KPX Racute Oacute -40 KPX Racute Ocircumflex -40 KPX Racute Odieresis -40 KPX Racute Ograve -40 KPX Racute Ohungarumlaut -40 KPX Racute Omacron -40 KPX Racute Oslash -40 KPX Racute Otilde -40 KPX Racute T -30 KPX Racute Tcaron -30 KPX Racute Tcommaaccent -30 KPX Racute U -40 KPX Racute Uacute -40 KPX Racute Ucircumflex -40 KPX Racute Udieresis -40 KPX Racute Ugrave -40 KPX Racute Uhungarumlaut -40 KPX Racute Umacron -40 KPX Racute Uogonek -40 KPX Racute Uring -40 KPX Racute V -18 KPX Racute W -18 KPX Racute Y -18 KPX Racute Yacute -18 KPX Racute Ydieresis -18 KPX Rcaron O -40 KPX Rcaron Oacute -40 KPX Rcaron Ocircumflex -40 KPX Rcaron Odieresis -40 KPX Rcaron Ograve -40 KPX Rcaron Ohungarumlaut -40 KPX Rcaron Omacron -40 KPX Rcaron Oslash -40 KPX Rcaron Otilde -40 KPX Rcaron T -30 KPX Rcaron Tcaron -30 KPX Rcaron Tcommaaccent -30 KPX Rcaron U -40 KPX Rcaron Uacute -40 KPX Rcaron Ucircumflex -40 KPX Rcaron Udieresis -40 KPX Rcaron Ugrave -40 KPX Rcaron Uhungarumlaut -40 KPX Rcaron Umacron -40 KPX Rcaron Uogonek -40 KPX Rcaron Uring -40 KPX Rcaron V -18 KPX Rcaron W -18 KPX Rcaron Y -18 KPX Rcaron Yacute -18 KPX Rcaron Ydieresis -18 KPX Rcommaaccent O -40 KPX Rcommaaccent Oacute -40 KPX Rcommaaccent Ocircumflex -40 KPX Rcommaaccent Odieresis -40 KPX Rcommaaccent Ograve -40 KPX Rcommaaccent Ohungarumlaut -40 KPX Rcommaaccent Omacron -40 KPX Rcommaaccent Oslash -40 KPX Rcommaaccent Otilde -40 KPX Rcommaaccent T -30 KPX Rcommaaccent Tcaron -30 KPX Rcommaaccent Tcommaaccent -30 KPX Rcommaaccent U -40 KPX Rcommaaccent Uacute -40 KPX Rcommaaccent Ucircumflex -40 KPX Rcommaaccent Udieresis -40 KPX Rcommaaccent Ugrave -40 KPX Rcommaaccent Uhungarumlaut -40 KPX Rcommaaccent Umacron -40 KPX Rcommaaccent Uogonek -40 KPX Rcommaaccent Uring -40 KPX Rcommaaccent V -18 KPX Rcommaaccent W -18 KPX Rcommaaccent Y -18 KPX Rcommaaccent Yacute -18 KPX Rcommaaccent Ydieresis -18 KPX T A -55 KPX T Aacute -55 KPX T Abreve -55 KPX T Acircumflex -55 KPX T Adieresis -55 KPX T Agrave -55 KPX T Amacron -55 KPX T Aogonek -55 KPX T Aring -55 KPX T Atilde -55 KPX T O -18 KPX T Oacute -18 KPX T Ocircumflex -18 KPX T Odieresis -18 KPX T Ograve -18 KPX T Ohungarumlaut -18 KPX T Omacron -18 KPX T Oslash -18 KPX T Otilde -18 KPX T a -92 KPX T aacute -92 KPX T abreve -92 KPX T acircumflex -92 KPX T adieresis -92 KPX T agrave -92 KPX T amacron -92 KPX T aogonek -92 KPX T aring -92 KPX T atilde -92 KPX T colon -74 KPX T comma -92 KPX T e -92 KPX T eacute -92 KPX T ecaron -92 KPX T ecircumflex -92 KPX T edieresis -52 KPX T edotaccent -92 KPX T egrave -52 KPX T emacron -52 KPX T eogonek -92 KPX T hyphen -92 KPX T i -37 KPX T iacute -37 KPX T iogonek -37 KPX T o -95 KPX T oacute -95 KPX T ocircumflex -95 KPX T odieresis -95 KPX T ograve -95 KPX T ohungarumlaut -95 KPX T omacron -95 KPX T oslash -95 KPX T otilde -95 KPX T period -92 KPX T r -37 KPX T racute -37 KPX T rcaron -37 KPX T rcommaaccent -37 KPX T semicolon -74 KPX T u -37 KPX T uacute -37 KPX T ucircumflex -37 KPX T udieresis -37 KPX T ugrave -37 KPX T uhungarumlaut -37 KPX T umacron -37 KPX T uogonek -37 KPX T uring -37 KPX T w -37 KPX T y -37 KPX T yacute -37 KPX T ydieresis -37 KPX Tcaron A -55 KPX Tcaron Aacute -55 KPX Tcaron Abreve -55 KPX Tcaron Acircumflex -55 KPX Tcaron Adieresis -55 KPX Tcaron Agrave -55 KPX Tcaron Amacron -55 KPX Tcaron Aogonek -55 KPX Tcaron Aring -55 KPX Tcaron Atilde -55 KPX Tcaron O -18 KPX Tcaron Oacute -18 KPX Tcaron Ocircumflex -18 KPX Tcaron Odieresis -18 KPX Tcaron Ograve -18 KPX Tcaron Ohungarumlaut -18 KPX Tcaron Omacron -18 KPX Tcaron Oslash -18 KPX Tcaron Otilde -18 KPX Tcaron a -92 KPX Tcaron aacute -92 KPX Tcaron abreve -92 KPX Tcaron acircumflex -92 KPX Tcaron adieresis -92 KPX Tcaron agrave -92 KPX Tcaron amacron -92 KPX Tcaron aogonek -92 KPX Tcaron aring -92 KPX Tcaron atilde -92 KPX Tcaron colon -74 KPX Tcaron comma -92 KPX Tcaron e -92 KPX Tcaron eacute -92 KPX Tcaron ecaron -92 KPX Tcaron ecircumflex -92 KPX Tcaron edieresis -52 KPX Tcaron edotaccent -92 KPX Tcaron egrave -52 KPX Tcaron emacron -52 KPX Tcaron eogonek -92 KPX Tcaron hyphen -92 KPX Tcaron i -37 KPX Tcaron iacute -37 KPX Tcaron iogonek -37 KPX Tcaron o -95 KPX Tcaron oacute -95 KPX Tcaron ocircumflex -95 KPX Tcaron odieresis -95 KPX Tcaron ograve -95 KPX Tcaron ohungarumlaut -95 KPX Tcaron omacron -95 KPX Tcaron oslash -95 KPX Tcaron otilde -95 KPX Tcaron period -92 KPX Tcaron r -37 KPX Tcaron racute -37 KPX Tcaron rcaron -37 KPX Tcaron rcommaaccent -37 KPX Tcaron semicolon -74 KPX Tcaron u -37 KPX Tcaron uacute -37 KPX Tcaron ucircumflex -37 KPX Tcaron udieresis -37 KPX Tcaron ugrave -37 KPX Tcaron uhungarumlaut -37 KPX Tcaron umacron -37 KPX Tcaron uogonek -37 KPX Tcaron uring -37 KPX Tcaron w -37 KPX Tcaron y -37 KPX Tcaron yacute -37 KPX Tcaron ydieresis -37 KPX Tcommaaccent A -55 KPX Tcommaaccent Aacute -55 KPX Tcommaaccent Abreve -55 KPX Tcommaaccent Acircumflex -55 KPX Tcommaaccent Adieresis -55 KPX Tcommaaccent Agrave -55 KPX Tcommaaccent Amacron -55 KPX Tcommaaccent Aogonek -55 KPX Tcommaaccent Aring -55 KPX Tcommaaccent Atilde -55 KPX Tcommaaccent O -18 KPX Tcommaaccent Oacute -18 KPX Tcommaaccent Ocircumflex -18 KPX Tcommaaccent Odieresis -18 KPX Tcommaaccent Ograve -18 KPX Tcommaaccent Ohungarumlaut -18 KPX Tcommaaccent Omacron -18 KPX Tcommaaccent Oslash -18 KPX Tcommaaccent Otilde -18 KPX Tcommaaccent a -92 KPX Tcommaaccent aacute -92 KPX Tcommaaccent abreve -92 KPX Tcommaaccent acircumflex -92 KPX Tcommaaccent adieresis -92 KPX Tcommaaccent agrave -92 KPX Tcommaaccent amacron -92 KPX Tcommaaccent aogonek -92 KPX Tcommaaccent aring -92 KPX Tcommaaccent atilde -92 KPX Tcommaaccent colon -74 KPX Tcommaaccent comma -92 KPX Tcommaaccent e -92 KPX Tcommaaccent eacute -92 KPX Tcommaaccent ecaron -92 KPX Tcommaaccent ecircumflex -92 KPX Tcommaaccent edieresis -52 KPX Tcommaaccent edotaccent -92 KPX Tcommaaccent egrave -52 KPX Tcommaaccent emacron -52 KPX Tcommaaccent eogonek -92 KPX Tcommaaccent hyphen -92 KPX Tcommaaccent i -37 KPX Tcommaaccent iacute -37 KPX Tcommaaccent iogonek -37 KPX Tcommaaccent o -95 KPX Tcommaaccent oacute -95 KPX Tcommaaccent ocircumflex -95 KPX Tcommaaccent odieresis -95 KPX Tcommaaccent ograve -95 KPX Tcommaaccent ohungarumlaut -95 KPX Tcommaaccent omacron -95 KPX Tcommaaccent oslash -95 KPX Tcommaaccent otilde -95 KPX Tcommaaccent period -92 KPX Tcommaaccent r -37 KPX Tcommaaccent racute -37 KPX Tcommaaccent rcaron -37 KPX Tcommaaccent rcommaaccent -37 KPX Tcommaaccent semicolon -74 KPX Tcommaaccent u -37 KPX Tcommaaccent uacute -37 KPX Tcommaaccent ucircumflex -37 KPX Tcommaaccent udieresis -37 KPX Tcommaaccent ugrave -37 KPX Tcommaaccent uhungarumlaut -37 KPX Tcommaaccent umacron -37 KPX Tcommaaccent uogonek -37 KPX Tcommaaccent uring -37 KPX Tcommaaccent w -37 KPX Tcommaaccent y -37 KPX Tcommaaccent yacute -37 KPX Tcommaaccent ydieresis -37 KPX U A -45 KPX U Aacute -45 KPX U Abreve -45 KPX U Acircumflex -45 KPX U Adieresis -45 KPX U Agrave -45 KPX U Amacron -45 KPX U Aogonek -45 KPX U Aring -45 KPX U Atilde -45 KPX Uacute A -45 KPX Uacute Aacute -45 KPX Uacute Abreve -45 KPX Uacute Acircumflex -45 KPX Uacute Adieresis -45 KPX Uacute Agrave -45 KPX Uacute Amacron -45 KPX Uacute Aogonek -45 KPX Uacute Aring -45 KPX Uacute Atilde -45 KPX Ucircumflex A -45 KPX Ucircumflex Aacute -45 KPX Ucircumflex Abreve -45 KPX Ucircumflex Acircumflex -45 KPX Ucircumflex Adieresis -45 KPX Ucircumflex Agrave -45 KPX Ucircumflex Amacron -45 KPX Ucircumflex Aogonek -45 KPX Ucircumflex Aring -45 KPX Ucircumflex Atilde -45 KPX Udieresis A -45 KPX Udieresis Aacute -45 KPX Udieresis Abreve -45 KPX Udieresis Acircumflex -45 KPX Udieresis Adieresis -45 KPX Udieresis Agrave -45 KPX Udieresis Amacron -45 KPX Udieresis Aogonek -45 KPX Udieresis Aring -45 KPX Udieresis Atilde -45 KPX Ugrave A -45 KPX Ugrave Aacute -45 KPX Ugrave Abreve -45 KPX Ugrave Acircumflex -45 KPX Ugrave Adieresis -45 KPX Ugrave Agrave -45 KPX Ugrave Amacron -45 KPX Ugrave Aogonek -45 KPX Ugrave Aring -45 KPX Ugrave Atilde -45 KPX Uhungarumlaut A -45 KPX Uhungarumlaut Aacute -45 KPX Uhungarumlaut Abreve -45 KPX Uhungarumlaut Acircumflex -45 KPX Uhungarumlaut Adieresis -45 KPX Uhungarumlaut Agrave -45 KPX Uhungarumlaut Amacron -45 KPX Uhungarumlaut Aogonek -45 KPX Uhungarumlaut Aring -45 KPX Uhungarumlaut Atilde -45 KPX Umacron A -45 KPX Umacron Aacute -45 KPX Umacron Abreve -45 KPX Umacron Acircumflex -45 KPX Umacron Adieresis -45 KPX Umacron Agrave -45 KPX Umacron Amacron -45 KPX Umacron Aogonek -45 KPX Umacron Aring -45 KPX Umacron Atilde -45 KPX Uogonek A -45 KPX Uogonek Aacute -45 KPX Uogonek Abreve -45 KPX Uogonek Acircumflex -45 KPX Uogonek Adieresis -45 KPX Uogonek Agrave -45 KPX Uogonek Amacron -45 KPX Uogonek Aogonek -45 KPX Uogonek Aring -45 KPX Uogonek Atilde -45 KPX Uring A -45 KPX Uring Aacute -45 KPX Uring Abreve -45 KPX Uring Acircumflex -45 KPX Uring Adieresis -45 KPX Uring Agrave -45 KPX Uring Amacron -45 KPX Uring Aogonek -45 KPX Uring Aring -45 KPX Uring Atilde -45 KPX V A -85 KPX V Aacute -85 KPX V Abreve -85 KPX V Acircumflex -85 KPX V Adieresis -85 KPX V Agrave -85 KPX V Amacron -85 KPX V Aogonek -85 KPX V Aring -85 KPX V Atilde -85 KPX V G -10 KPX V Gbreve -10 KPX V Gcommaaccent -10 KPX V O -30 KPX V Oacute -30 KPX V Ocircumflex -30 KPX V Odieresis -30 KPX V Ograve -30 KPX V Ohungarumlaut -30 KPX V Omacron -30 KPX V Oslash -30 KPX V Otilde -30 KPX V a -111 KPX V aacute -111 KPX V abreve -111 KPX V acircumflex -111 KPX V adieresis -111 KPX V agrave -111 KPX V amacron -111 KPX V aogonek -111 KPX V aring -111 KPX V atilde -111 KPX V colon -74 KPX V comma -129 KPX V e -111 KPX V eacute -111 KPX V ecaron -111 KPX V ecircumflex -111 KPX V edieresis -71 KPX V edotaccent -111 KPX V egrave -71 KPX V emacron -71 KPX V eogonek -111 KPX V hyphen -70 KPX V i -55 KPX V iacute -55 KPX V iogonek -55 KPX V o -111 KPX V oacute -111 KPX V ocircumflex -111 KPX V odieresis -111 KPX V ograve -111 KPX V ohungarumlaut -111 KPX V omacron -111 KPX V oslash -111 KPX V otilde -111 KPX V period -129 KPX V semicolon -74 KPX V u -55 KPX V uacute -55 KPX V ucircumflex -55 KPX V udieresis -55 KPX V ugrave -55 KPX V uhungarumlaut -55 KPX V umacron -55 KPX V uogonek -55 KPX V uring -55 KPX W A -74 KPX W Aacute -74 KPX W Abreve -74 KPX W Acircumflex -74 KPX W Adieresis -74 KPX W Agrave -74 KPX W Amacron -74 KPX W Aogonek -74 KPX W Aring -74 KPX W Atilde -74 KPX W O -15 KPX W Oacute -15 KPX W Ocircumflex -15 KPX W Odieresis -15 KPX W Ograve -15 KPX W Ohungarumlaut -15 KPX W Omacron -15 KPX W Oslash -15 KPX W Otilde -15 KPX W a -85 KPX W aacute -85 KPX W abreve -85 KPX W acircumflex -85 KPX W adieresis -85 KPX W agrave -85 KPX W amacron -85 KPX W aogonek -85 KPX W aring -85 KPX W atilde -85 KPX W colon -55 KPX W comma -74 KPX W e -90 KPX W eacute -90 KPX W ecaron -90 KPX W ecircumflex -90 KPX W edieresis -50 KPX W edotaccent -90 KPX W egrave -50 KPX W emacron -50 KPX W eogonek -90 KPX W hyphen -50 KPX W i -37 KPX W iacute -37 KPX W iogonek -37 KPX W o -80 KPX W oacute -80 KPX W ocircumflex -80 KPX W odieresis -80 KPX W ograve -80 KPX W ohungarumlaut -80 KPX W omacron -80 KPX W oslash -80 KPX W otilde -80 KPX W period -74 KPX W semicolon -55 KPX W u -55 KPX W uacute -55 KPX W ucircumflex -55 KPX W udieresis -55 KPX W ugrave -55 KPX W uhungarumlaut -55 KPX W umacron -55 KPX W uogonek -55 KPX W uring -55 KPX W y -55 KPX W yacute -55 KPX W ydieresis -55 KPX Y A -74 KPX Y Aacute -74 KPX Y Abreve -74 KPX Y Acircumflex -74 KPX Y Adieresis -74 KPX Y Agrave -74 KPX Y Amacron -74 KPX Y Aogonek -74 KPX Y Aring -74 KPX Y Atilde -74 KPX Y O -25 KPX Y Oacute -25 KPX Y Ocircumflex -25 KPX Y Odieresis -25 KPX Y Ograve -25 KPX Y Ohungarumlaut -25 KPX Y Omacron -25 KPX Y Oslash -25 KPX Y Otilde -25 KPX Y a -92 KPX Y aacute -92 KPX Y abreve -92 KPX Y acircumflex -92 KPX Y adieresis -92 KPX Y agrave -92 KPX Y amacron -92 KPX Y aogonek -92 KPX Y aring -92 KPX Y atilde -92 KPX Y colon -92 KPX Y comma -92 KPX Y e -111 KPX Y eacute -111 KPX Y ecaron -111 KPX Y ecircumflex -71 KPX Y edieresis -71 KPX Y edotaccent -111 KPX Y egrave -71 KPX Y emacron -71 KPX Y eogonek -111 KPX Y hyphen -92 KPX Y i -55 KPX Y iacute -55 KPX Y iogonek -55 KPX Y o -111 KPX Y oacute -111 KPX Y ocircumflex -111 KPX Y odieresis -111 KPX Y ograve -111 KPX Y ohungarumlaut -111 KPX Y omacron -111 KPX Y oslash -111 KPX Y otilde -111 KPX Y period -74 KPX Y semicolon -92 KPX Y u -92 KPX Y uacute -92 KPX Y ucircumflex -92 KPX Y udieresis -92 KPX Y ugrave -92 KPX Y uhungarumlaut -92 KPX Y umacron -92 KPX Y uogonek -92 KPX Y uring -92 KPX Yacute A -74 KPX Yacute Aacute -74 KPX Yacute Abreve -74 KPX Yacute Acircumflex -74 KPX Yacute Adieresis -74 KPX Yacute Agrave -74 KPX Yacute Amacron -74 KPX Yacute Aogonek -74 KPX Yacute Aring -74 KPX Yacute Atilde -74 KPX Yacute O -25 KPX Yacute Oacute -25 KPX Yacute Ocircumflex -25 KPX Yacute Odieresis -25 KPX Yacute Ograve -25 KPX Yacute Ohungarumlaut -25 KPX Yacute Omacron -25 KPX Yacute Oslash -25 KPX Yacute Otilde -25 KPX Yacute a -92 KPX Yacute aacute -92 KPX Yacute abreve -92 KPX Yacute acircumflex -92 KPX Yacute adieresis -92 KPX Yacute agrave -92 KPX Yacute amacron -92 KPX Yacute aogonek -92 KPX Yacute aring -92 KPX Yacute atilde -92 KPX Yacute colon -92 KPX Yacute comma -92 KPX Yacute e -111 KPX Yacute eacute -111 KPX Yacute ecaron -111 KPX Yacute ecircumflex -71 KPX Yacute edieresis -71 KPX Yacute edotaccent -111 KPX Yacute egrave -71 KPX Yacute emacron -71 KPX Yacute eogonek -111 KPX Yacute hyphen -92 KPX Yacute i -55 KPX Yacute iacute -55 KPX Yacute iogonek -55 KPX Yacute o -111 KPX Yacute oacute -111 KPX Yacute ocircumflex -111 KPX Yacute odieresis -111 KPX Yacute ograve -111 KPX Yacute ohungarumlaut -111 KPX Yacute omacron -111 KPX Yacute oslash -111 KPX Yacute otilde -111 KPX Yacute period -74 KPX Yacute semicolon -92 KPX Yacute u -92 KPX Yacute uacute -92 KPX Yacute ucircumflex -92 KPX Yacute udieresis -92 KPX Yacute ugrave -92 KPX Yacute uhungarumlaut -92 KPX Yacute umacron -92 KPX Yacute uogonek -92 KPX Yacute uring -92 KPX Ydieresis A -74 KPX Ydieresis Aacute -74 KPX Ydieresis Abreve -74 KPX Ydieresis Acircumflex -74 KPX Ydieresis Adieresis -74 KPX Ydieresis Agrave -74 KPX Ydieresis Amacron -74 KPX Ydieresis Aogonek -74 KPX Ydieresis Aring -74 KPX Ydieresis Atilde -74 KPX Ydieresis O -25 KPX Ydieresis Oacute -25 KPX Ydieresis Ocircumflex -25 KPX Ydieresis Odieresis -25 KPX Ydieresis Ograve -25 KPX Ydieresis Ohungarumlaut -25 KPX Ydieresis Omacron -25 KPX Ydieresis Oslash -25 KPX Ydieresis Otilde -25 KPX Ydieresis a -92 KPX Ydieresis aacute -92 KPX Ydieresis abreve -92 KPX Ydieresis acircumflex -92 KPX Ydieresis adieresis -92 KPX Ydieresis agrave -92 KPX Ydieresis amacron -92 KPX Ydieresis aogonek -92 KPX Ydieresis aring -92 KPX Ydieresis atilde -92 KPX Ydieresis colon -92 KPX Ydieresis comma -92 KPX Ydieresis e -111 KPX Ydieresis eacute -111 KPX Ydieresis ecaron -111 KPX Ydieresis ecircumflex -71 KPX Ydieresis edieresis -71 KPX Ydieresis edotaccent -111 KPX Ydieresis egrave -71 KPX Ydieresis emacron -71 KPX Ydieresis eogonek -111 KPX Ydieresis hyphen -92 KPX Ydieresis i -55 KPX Ydieresis iacute -55 KPX Ydieresis iogonek -55 KPX Ydieresis o -111 KPX Ydieresis oacute -111 KPX Ydieresis ocircumflex -111 KPX Ydieresis odieresis -111 KPX Ydieresis ograve -111 KPX Ydieresis ohungarumlaut -111 KPX Ydieresis omacron -111 KPX Ydieresis oslash -111 KPX Ydieresis otilde -111 KPX Ydieresis period -74 KPX Ydieresis semicolon -92 KPX Ydieresis u -92 KPX Ydieresis uacute -92 KPX Ydieresis ucircumflex -92 KPX Ydieresis udieresis -92 KPX Ydieresis ugrave -92 KPX Ydieresis uhungarumlaut -92 KPX Ydieresis umacron -92 KPX Ydieresis uogonek -92 KPX Ydieresis uring -92 KPX b b -10 KPX b period -40 KPX b u -20 KPX b uacute -20 KPX b ucircumflex -20 KPX b udieresis -20 KPX b ugrave -20 KPX b uhungarumlaut -20 KPX b umacron -20 KPX b uogonek -20 KPX b uring -20 KPX c h -10 KPX c k -10 KPX c kcommaaccent -10 KPX cacute h -10 KPX cacute k -10 KPX cacute kcommaaccent -10 KPX ccaron h -10 KPX ccaron k -10 KPX ccaron kcommaaccent -10 KPX ccedilla h -10 KPX ccedilla k -10 KPX ccedilla kcommaaccent -10 KPX comma quotedblright -95 KPX comma quoteright -95 KPX e b -10 KPX eacute b -10 KPX ecaron b -10 KPX ecircumflex b -10 KPX edieresis b -10 KPX edotaccent b -10 KPX egrave b -10 KPX emacron b -10 KPX eogonek b -10 KPX f comma -10 KPX f dotlessi -30 KPX f e -10 KPX f eacute -10 KPX f edotaccent -10 KPX f eogonek -10 KPX f f -18 KPX f o -10 KPX f oacute -10 KPX f ocircumflex -10 KPX f ograve -10 KPX f ohungarumlaut -10 KPX f oslash -10 KPX f otilde -10 KPX f period -10 KPX f quoteright 55 KPX k e -30 KPX k eacute -30 KPX k ecaron -30 KPX k ecircumflex -30 KPX k edieresis -30 KPX k edotaccent -30 KPX k egrave -30 KPX k emacron -30 KPX k eogonek -30 KPX k o -10 KPX k oacute -10 KPX k ocircumflex -10 KPX k odieresis -10 KPX k ograve -10 KPX k ohungarumlaut -10 KPX k omacron -10 KPX k oslash -10 KPX k otilde -10 KPX kcommaaccent e -30 KPX kcommaaccent eacute -30 KPX kcommaaccent ecaron -30 KPX kcommaaccent ecircumflex -30 KPX kcommaaccent edieresis -30 KPX kcommaaccent edotaccent -30 KPX kcommaaccent egrave -30 KPX kcommaaccent emacron -30 KPX kcommaaccent eogonek -30 KPX kcommaaccent o -10 KPX kcommaaccent oacute -10 KPX kcommaaccent ocircumflex -10 KPX kcommaaccent odieresis -10 KPX kcommaaccent ograve -10 KPX kcommaaccent ohungarumlaut -10 KPX kcommaaccent omacron -10 KPX kcommaaccent oslash -10 KPX kcommaaccent otilde -10 KPX n v -40 KPX nacute v -40 KPX ncaron v -40 KPX ncommaaccent v -40 KPX ntilde v -40 KPX o v -15 KPX o w -25 KPX o x -10 KPX o y -10 KPX o yacute -10 KPX o ydieresis -10 KPX oacute v -15 KPX oacute w -25 KPX oacute x -10 KPX oacute y -10 KPX oacute yacute -10 KPX oacute ydieresis -10 KPX ocircumflex v -15 KPX ocircumflex w -25 KPX ocircumflex x -10 KPX ocircumflex y -10 KPX ocircumflex yacute -10 KPX ocircumflex ydieresis -10 KPX odieresis v -15 KPX odieresis w -25 KPX odieresis x -10 KPX odieresis y -10 KPX odieresis yacute -10 KPX odieresis ydieresis -10 KPX ograve v -15 KPX ograve w -25 KPX ograve x -10 KPX ograve y -10 KPX ograve yacute -10 KPX ograve ydieresis -10 KPX ohungarumlaut v -15 KPX ohungarumlaut w -25 KPX ohungarumlaut x -10 KPX ohungarumlaut y -10 KPX ohungarumlaut yacute -10 KPX ohungarumlaut ydieresis -10 KPX omacron v -15 KPX omacron w -25 KPX omacron x -10 KPX omacron y -10 KPX omacron yacute -10 KPX omacron ydieresis -10 KPX oslash v -15 KPX oslash w -25 KPX oslash x -10 KPX oslash y -10 KPX oslash yacute -10 KPX oslash ydieresis -10 KPX otilde v -15 KPX otilde w -25 KPX otilde x -10 KPX otilde y -10 KPX otilde yacute -10 KPX otilde ydieresis -10 KPX period quotedblright -95 KPX period quoteright -95 KPX quoteleft quoteleft -74 KPX quoteright d -15 KPX quoteright dcroat -15 KPX quoteright quoteright -74 KPX quoteright r -15 KPX quoteright racute -15 KPX quoteright rcaron -15 KPX quoteright rcommaaccent -15 KPX quoteright s -74 KPX quoteright sacute -74 KPX quoteright scaron -74 KPX quoteright scedilla -74 KPX quoteright scommaaccent -74 KPX quoteright space -74 KPX quoteright t -37 KPX quoteright tcommaaccent -37 KPX quoteright v -15 KPX r comma -65 KPX r period -65 KPX racute comma -65 KPX racute period -65 KPX rcaron comma -65 KPX rcaron period -65 KPX rcommaaccent comma -65 KPX rcommaaccent period -65 KPX space A -37 KPX space Aacute -37 KPX space Abreve -37 KPX space Acircumflex -37 KPX space Adieresis -37 KPX space Agrave -37 KPX space Amacron -37 KPX space Aogonek -37 KPX space Aring -37 KPX space Atilde -37 KPX space V -70 KPX space W -70 KPX space Y -70 KPX space Yacute -70 KPX space Ydieresis -70 KPX v comma -37 KPX v e -15 KPX v eacute -15 KPX v ecaron -15 KPX v ecircumflex -15 KPX v edieresis -15 KPX v edotaccent -15 KPX v egrave -15 KPX v emacron -15 KPX v eogonek -15 KPX v o -15 KPX v oacute -15 KPX v ocircumflex -15 KPX v odieresis -15 KPX v ograve -15 KPX v ohungarumlaut -15 KPX v omacron -15 KPX v oslash -15 KPX v otilde -15 KPX v period -37 KPX w a -10 KPX w aacute -10 KPX w abreve -10 KPX w acircumflex -10 KPX w adieresis -10 KPX w agrave -10 KPX w amacron -10 KPX w aogonek -10 KPX w aring -10 KPX w atilde -10 KPX w comma -37 KPX w e -10 KPX w eacute -10 KPX w ecaron -10 KPX w ecircumflex -10 KPX w edieresis -10 KPX w edotaccent -10 KPX w egrave -10 KPX w emacron -10 KPX w eogonek -10 KPX w o -15 KPX w oacute -15 KPX w ocircumflex -15 KPX w odieresis -15 KPX w ograve -15 KPX w ohungarumlaut -15 KPX w omacron -15 KPX w oslash -15 KPX w otilde -15 KPX w period -37 KPX x e -10 KPX x eacute -10 KPX x ecaron -10 KPX x ecircumflex -10 KPX x edieresis -10 KPX x edotaccent -10 KPX x egrave -10 KPX x emacron -10 KPX x eogonek -10 KPX y comma -37 KPX y period -37 KPX yacute comma -37 KPX yacute period -37 KPX ydieresis comma -37 KPX ydieresis period -37 EndKernPairs EndKernData EndFontMetrics ruby-prawn-2.1.0.orig/data/fonts/Helvetica-BoldOblique.afm0000644000000000000000000020736512665203156022132 0ustar rootrootStartFontMetrics 4.1 Comment Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved. Comment Creation Date: Thu May 1 12:45:12 1997 Comment UniqueID 43053 Comment VMusage 14482 68586 FontName Helvetica-BoldOblique FullName Helvetica Bold Oblique FamilyName Helvetica Weight Bold ItalicAngle -12 IsFixedPitch false CharacterSet ExtendedRoman FontBBox -174 -228 1114 962 UnderlinePosition -100 UnderlineThickness 50 Version 002.000 Notice Copyright (c) 1985, 1987, 1989, 1990, 1997 Adobe Systems Incorporated. All Rights Reserved.Helvetica is a trademark of Linotype-Hell AG and/or its subsidiaries. EncodingScheme AdobeStandardEncoding CapHeight 718 XHeight 532 Ascender 718 Descender -207 StdHW 118 StdVW 140 StartCharMetrics 315 C 32 ; WX 278 ; N space ; B 0 0 0 0 ; C 33 ; WX 333 ; N exclam ; B 94 0 397 718 ; C 34 ; WX 474 ; N quotedbl ; B 193 447 529 718 ; C 35 ; WX 556 ; N numbersign ; B 60 0 644 698 ; C 36 ; WX 556 ; N dollar ; B 67 -115 622 775 ; C 37 ; WX 889 ; N percent ; B 136 -19 901 710 ; C 38 ; WX 722 ; N ampersand ; B 89 -19 732 718 ; C 39 ; WX 278 ; N quoteright ; B 167 445 362 718 ; C 40 ; WX 333 ; N parenleft ; B 76 -208 470 734 ; C 41 ; WX 333 ; N parenright ; B -25 -208 369 734 ; C 42 ; WX 389 ; N asterisk ; B 146 387 481 718 ; C 43 ; WX 584 ; N plus ; B 82 0 610 506 ; C 44 ; WX 278 ; N comma ; B 28 -168 245 146 ; C 45 ; WX 333 ; N hyphen ; B 73 215 379 345 ; C 46 ; WX 278 ; N period ; B 64 0 245 146 ; C 47 ; WX 278 ; N slash ; B -37 -19 468 737 ; C 48 ; WX 556 ; N zero ; B 86 -19 617 710 ; C 49 ; WX 556 ; N one ; B 173 0 529 710 ; C 50 ; WX 556 ; N two ; B 26 0 619 710 ; C 51 ; WX 556 ; N three ; B 65 -19 608 710 ; C 52 ; WX 556 ; N four ; B 60 0 598 710 ; C 53 ; WX 556 ; N five ; B 64 -19 636 698 ; C 54 ; WX 556 ; N six ; B 85 -19 619 710 ; C 55 ; WX 556 ; N seven ; B 125 0 676 698 ; C 56 ; WX 556 ; N eight ; B 69 -19 616 710 ; C 57 ; WX 556 ; N nine ; B 78 -19 615 710 ; C 58 ; WX 333 ; N colon ; B 92 0 351 512 ; C 59 ; WX 333 ; N semicolon ; B 56 -168 351 512 ; C 60 ; WX 584 ; N less ; B 82 -8 655 514 ; C 61 ; WX 584 ; N equal ; B 58 87 633 419 ; C 62 ; WX 584 ; N greater ; B 36 -8 609 514 ; C 63 ; WX 611 ; N question ; B 165 0 671 727 ; C 64 ; WX 975 ; N at ; B 186 -19 954 737 ; C 65 ; WX 722 ; N A ; B 20 0 702 718 ; C 66 ; WX 722 ; N B ; B 76 0 764 718 ; C 67 ; WX 722 ; N C ; B 107 -19 789 737 ; C 68 ; WX 722 ; N D ; B 76 0 777 718 ; C 69 ; WX 667 ; N E ; B 76 0 757 718 ; C 70 ; WX 611 ; N F ; B 76 0 740 718 ; C 71 ; WX 778 ; N G ; B 108 -19 817 737 ; C 72 ; WX 722 ; N H ; B 71 0 804 718 ; C 73 ; WX 278 ; N I ; B 64 0 367 718 ; C 74 ; WX 556 ; N J ; B 60 -18 637 718 ; C 75 ; WX 722 ; N K ; B 87 0 858 718 ; C 76 ; WX 611 ; N L ; B 76 0 611 718 ; C 77 ; WX 833 ; N M ; B 69 0 918 718 ; C 78 ; WX 722 ; N N ; B 69 0 807 718 ; C 79 ; WX 778 ; N O ; B 107 -19 823 737 ; C 80 ; WX 667 ; N P ; B 76 0 738 718 ; C 81 ; WX 778 ; N Q ; B 107 -52 823 737 ; C 82 ; WX 722 ; N R ; B 76 0 778 718 ; C 83 ; WX 667 ; N S ; B 81 -19 718 737 ; C 84 ; WX 611 ; N T ; B 140 0 751 718 ; C 85 ; WX 722 ; N U ; B 116 -19 804 718 ; C 86 ; WX 667 ; N V ; B 172 0 801 718 ; C 87 ; WX 944 ; N W ; B 169 0 1082 718 ; C 88 ; WX 667 ; N X ; B 14 0 791 718 ; C 89 ; WX 667 ; N Y ; B 168 0 806 718 ; C 90 ; WX 611 ; N Z ; B 25 0 737 718 ; C 91 ; WX 333 ; N bracketleft ; B 21 -196 462 722 ; C 92 ; WX 278 ; N backslash ; B 124 -19 307 737 ; C 93 ; WX 333 ; N bracketright ; B -18 -196 423 722 ; C 94 ; WX 584 ; N asciicircum ; B 131 323 591 698 ; C 95 ; WX 556 ; N underscore ; B -27 -125 540 -75 ; C 96 ; WX 278 ; N quoteleft ; B 165 454 361 727 ; C 97 ; WX 556 ; N a ; B 55 -14 583 546 ; C 98 ; WX 611 ; N b ; B 61 -14 645 718 ; C 99 ; WX 556 ; N c ; B 79 -14 599 546 ; C 100 ; WX 611 ; N d ; B 82 -14 704 718 ; C 101 ; WX 556 ; N e ; B 70 -14 593 546 ; C 102 ; WX 333 ; N f ; B 87 0 469 727 ; L i fi ; L l fl ; C 103 ; WX 611 ; N g ; B 38 -217 666 546 ; C 104 ; WX 611 ; N h ; B 65 0 629 718 ; C 105 ; WX 278 ; N i ; B 69 0 363 725 ; C 106 ; WX 278 ; N j ; B -42 -214 363 725 ; C 107 ; WX 556 ; N k ; B 69 0 670 718 ; C 108 ; WX 278 ; N l ; B 69 0 362 718 ; C 109 ; WX 889 ; N m ; B 64 0 909 546 ; C 110 ; WX 611 ; N n ; B 65 0 629 546 ; C 111 ; WX 611 ; N o ; B 82 -14 643 546 ; C 112 ; WX 611 ; N p ; B 18 -207 645 546 ; C 113 ; WX 611 ; N q ; B 80 -207 665 546 ; C 114 ; WX 389 ; N r ; B 64 0 489 546 ; C 115 ; WX 556 ; N s ; B 63 -14 584 546 ; C 116 ; WX 333 ; N t ; B 100 -6 422 676 ; C 117 ; WX 611 ; N u ; B 98 -14 658 532 ; C 118 ; WX 556 ; N v ; B 126 0 656 532 ; C 119 ; WX 778 ; N w ; B 123 0 882 532 ; C 120 ; WX 556 ; N x ; B 15 0 648 532 ; C 121 ; WX 556 ; N y ; B 42 -214 652 532 ; C 122 ; WX 500 ; N z ; B 20 0 583 532 ; C 123 ; WX 389 ; N braceleft ; B 94 -196 518 722 ; C 124 ; WX 280 ; N bar ; B 36 -225 361 775 ; C 125 ; WX 389 ; N braceright ; B -18 -196 407 722 ; C 126 ; WX 584 ; N asciitilde ; B 115 163 577 343 ; C 161 ; WX 333 ; N exclamdown ; B 50 -186 353 532 ; C 162 ; WX 556 ; N cent ; B 79 -118 599 628 ; C 163 ; WX 556 ; N sterling ; B 50 -16 635 718 ; C 164 ; WX 167 ; N fraction ; B -174 -19 487 710 ; C 165 ; WX 556 ; N yen ; B 60 0 713 698 ; C 166 ; WX 556 ; N florin ; B -50 -210 669 737 ; C 167 ; WX 556 ; N section ; B 61 -184 598 727 ; C 168 ; WX 556 ; N currency ; B 27 76 680 636 ; C 169 ; WX 238 ; N quotesingle ; B 165 447 321 718 ; C 170 ; WX 500 ; N quotedblleft ; B 160 454 588 727 ; C 171 ; WX 556 ; N guillemotleft ; B 135 76 571 484 ; C 172 ; WX 333 ; N guilsinglleft ; B 130 76 353 484 ; C 173 ; WX 333 ; N guilsinglright ; B 99 76 322 484 ; C 174 ; WX 611 ; N fi ; B 87 0 696 727 ; C 175 ; WX 611 ; N fl ; B 87 0 695 727 ; C 177 ; WX 556 ; N endash ; B 48 227 627 333 ; C 178 ; WX 556 ; N dagger ; B 118 -171 626 718 ; C 179 ; WX 556 ; N daggerdbl ; B 46 -171 628 718 ; C 180 ; WX 278 ; N periodcentered ; B 110 172 276 334 ; C 182 ; WX 556 ; N paragraph ; B 98 -191 688 700 ; C 183 ; WX 350 ; N bullet ; B 83 194 420 524 ; C 184 ; WX 278 ; N quotesinglbase ; B 41 -146 236 127 ; C 185 ; WX 500 ; N quotedblbase ; B 36 -146 463 127 ; C 186 ; WX 500 ; N quotedblright ; B 162 445 589 718 ; C 187 ; WX 556 ; N guillemotright ; B 104 76 540 484 ; C 188 ; WX 1000 ; N ellipsis ; B 92 0 939 146 ; C 189 ; WX 1000 ; N perthousand ; B 76 -19 1038 710 ; C 191 ; WX 611 ; N questiondown ; B 53 -195 559 532 ; C 193 ; WX 333 ; N grave ; B 136 604 353 750 ; C 194 ; WX 333 ; N acute ; B 236 604 515 750 ; C 195 ; WX 333 ; N circumflex ; B 118 604 471 750 ; C 196 ; WX 333 ; N tilde ; B 113 610 507 737 ; C 197 ; WX 333 ; N macron ; B 122 604 483 678 ; C 198 ; WX 333 ; N breve ; B 156 604 494 750 ; C 199 ; WX 333 ; N dotaccent ; B 235 614 385 729 ; C 200 ; WX 333 ; N dieresis ; B 137 614 482 729 ; C 202 ; WX 333 ; N ring ; B 200 568 420 776 ; C 203 ; WX 333 ; N cedilla ; B -37 -228 220 0 ; C 205 ; WX 333 ; N hungarumlaut ; B 137 604 645 750 ; C 206 ; WX 333 ; N ogonek ; B 41 -228 264 0 ; C 207 ; WX 333 ; N caron ; B 149 604 502 750 ; C 208 ; WX 1000 ; N emdash ; B 48 227 1071 333 ; C 225 ; WX 1000 ; N AE ; B 5 0 1100 718 ; C 227 ; WX 370 ; N ordfeminine ; B 125 401 465 737 ; C 232 ; WX 611 ; N Lslash ; B 34 0 611 718 ; C 233 ; WX 778 ; N Oslash ; B 35 -27 894 745 ; C 234 ; WX 1000 ; N OE ; B 99 -19 1114 737 ; C 235 ; WX 365 ; N ordmasculine ; B 123 401 485 737 ; C 241 ; WX 889 ; N ae ; B 56 -14 923 546 ; C 245 ; WX 278 ; N dotlessi ; B 69 0 322 532 ; C 248 ; WX 278 ; N lslash ; B 40 0 407 718 ; C 249 ; WX 611 ; N oslash ; B 22 -29 701 560 ; C 250 ; WX 944 ; N oe ; B 82 -14 977 546 ; C 251 ; WX 611 ; N germandbls ; B 69 -14 657 731 ; C -1 ; WX 278 ; N Idieresis ; B 64 0 494 915 ; C -1 ; WX 556 ; N eacute ; B 70 -14 627 750 ; C -1 ; WX 556 ; N abreve ; B 55 -14 606 750 ; C -1 ; WX 611 ; N uhungarumlaut ; B 98 -14 784 750 ; C -1 ; WX 556 ; N ecaron ; B 70 -14 614 750 ; C -1 ; WX 667 ; N Ydieresis ; B 168 0 806 915 ; C -1 ; WX 584 ; N divide ; B 82 -42 610 548 ; C -1 ; WX 667 ; N Yacute ; B 168 0 806 936 ; C -1 ; WX 722 ; N Acircumflex ; B 20 0 706 936 ; C -1 ; WX 556 ; N aacute ; B 55 -14 627 750 ; C -1 ; WX 722 ; N Ucircumflex ; B 116 -19 804 936 ; C -1 ; WX 556 ; N yacute ; B 42 -214 652 750 ; C -1 ; WX 556 ; N scommaaccent ; B 63 -228 584 546 ; C -1 ; WX 556 ; N ecircumflex ; B 70 -14 593 750 ; C -1 ; WX 722 ; N Uring ; B 116 -19 804 962 ; C -1 ; WX 722 ; N Udieresis ; B 116 -19 804 915 ; C -1 ; WX 556 ; N aogonek ; B 55 -224 583 546 ; C -1 ; WX 722 ; N Uacute ; B 116 -19 804 936 ; C -1 ; WX 611 ; N uogonek ; B 98 -228 658 532 ; C -1 ; WX 667 ; N Edieresis ; B 76 0 757 915 ; C -1 ; WX 722 ; N Dcroat ; B 62 0 777 718 ; C -1 ; WX 250 ; N commaaccent ; B 16 -228 188 -50 ; C -1 ; WX 737 ; N copyright ; B 56 -19 835 737 ; C -1 ; WX 667 ; N Emacron ; B 76 0 757 864 ; C -1 ; WX 556 ; N ccaron ; B 79 -14 614 750 ; C -1 ; WX 556 ; N aring ; B 55 -14 583 776 ; C -1 ; WX 722 ; N Ncommaaccent ; B 69 -228 807 718 ; C -1 ; WX 278 ; N lacute ; B 69 0 528 936 ; C -1 ; WX 556 ; N agrave ; B 55 -14 583 750 ; C -1 ; WX 611 ; N Tcommaaccent ; B 140 -228 751 718 ; C -1 ; WX 722 ; N Cacute ; B 107 -19 789 936 ; C -1 ; WX 556 ; N atilde ; B 55 -14 619 737 ; C -1 ; WX 667 ; N Edotaccent ; B 76 0 757 915 ; C -1 ; WX 556 ; N scaron ; B 63 -14 614 750 ; C -1 ; WX 556 ; N scedilla ; B 63 -228 584 546 ; C -1 ; WX 278 ; N iacute ; B 69 0 488 750 ; C -1 ; WX 494 ; N lozenge ; B 90 0 564 745 ; C -1 ; WX 722 ; N Rcaron ; B 76 0 778 936 ; C -1 ; WX 778 ; N Gcommaaccent ; B 108 -228 817 737 ; C -1 ; WX 611 ; N ucircumflex ; B 98 -14 658 750 ; C -1 ; WX 556 ; N acircumflex ; B 55 -14 583 750 ; C -1 ; WX 722 ; N Amacron ; B 20 0 718 864 ; C -1 ; WX 389 ; N rcaron ; B 64 0 530 750 ; C -1 ; WX 556 ; N ccedilla ; B 79 -228 599 546 ; C -1 ; WX 611 ; N Zdotaccent ; B 25 0 737 915 ; C -1 ; WX 667 ; N Thorn ; B 76 0 716 718 ; C -1 ; WX 778 ; N Omacron ; B 107 -19 823 864 ; C -1 ; WX 722 ; N Racute ; B 76 0 778 936 ; C -1 ; WX 667 ; N Sacute ; B 81 -19 722 936 ; C -1 ; WX 743 ; N dcaron ; B 82 -14 903 718 ; C -1 ; WX 722 ; N Umacron ; B 116 -19 804 864 ; C -1 ; WX 611 ; N uring ; B 98 -14 658 776 ; C -1 ; WX 333 ; N threesuperior ; B 91 271 441 710 ; C -1 ; WX 778 ; N Ograve ; B 107 -19 823 936 ; C -1 ; WX 722 ; N Agrave ; B 20 0 702 936 ; C -1 ; WX 722 ; N Abreve ; B 20 0 729 936 ; C -1 ; WX 584 ; N multiply ; B 57 1 635 505 ; C -1 ; WX 611 ; N uacute ; B 98 -14 658 750 ; C -1 ; WX 611 ; N Tcaron ; B 140 0 751 936 ; C -1 ; WX 494 ; N partialdiff ; B 43 -21 585 750 ; C -1 ; WX 556 ; N ydieresis ; B 42 -214 652 729 ; C -1 ; WX 722 ; N Nacute ; B 69 0 807 936 ; C -1 ; WX 278 ; N icircumflex ; B 69 0 444 750 ; C -1 ; WX 667 ; N Ecircumflex ; B 76 0 757 936 ; C -1 ; WX 556 ; N adieresis ; B 55 -14 594 729 ; C -1 ; WX 556 ; N edieresis ; B 70 -14 594 729 ; C -1 ; WX 556 ; N cacute ; B 79 -14 627 750 ; C -1 ; WX 611 ; N nacute ; B 65 0 654 750 ; C -1 ; WX 611 ; N umacron ; B 98 -14 658 678 ; C -1 ; WX 722 ; N Ncaron ; B 69 0 807 936 ; C -1 ; WX 278 ; N Iacute ; B 64 0 528 936 ; C -1 ; WX 584 ; N plusminus ; B 40 0 625 506 ; C -1 ; WX 280 ; N brokenbar ; B 52 -150 345 700 ; C -1 ; WX 737 ; N registered ; B 55 -19 834 737 ; C -1 ; WX 778 ; N Gbreve ; B 108 -19 817 936 ; C -1 ; WX 278 ; N Idotaccent ; B 64 0 397 915 ; C -1 ; WX 600 ; N summation ; B 14 -10 670 706 ; C -1 ; WX 667 ; N Egrave ; B 76 0 757 936 ; C -1 ; WX 389 ; N racute ; B 64 0 543 750 ; C -1 ; WX 611 ; N omacron ; B 82 -14 643 678 ; C -1 ; WX 611 ; N Zacute ; B 25 0 737 936 ; C -1 ; WX 611 ; N Zcaron ; B 25 0 737 936 ; C -1 ; WX 549 ; N greaterequal ; B 26 0 629 704 ; C -1 ; WX 722 ; N Eth ; B 62 0 777 718 ; C -1 ; WX 722 ; N Ccedilla ; B 107 -228 789 737 ; C -1 ; WX 278 ; N lcommaaccent ; B 30 -228 362 718 ; C -1 ; WX 389 ; N tcaron ; B 100 -6 608 878 ; C -1 ; WX 556 ; N eogonek ; B 70 -228 593 546 ; C -1 ; WX 722 ; N Uogonek ; B 116 -228 804 718 ; C -1 ; WX 722 ; N Aacute ; B 20 0 750 936 ; C -1 ; WX 722 ; N Adieresis ; B 20 0 716 915 ; C -1 ; WX 556 ; N egrave ; B 70 -14 593 750 ; C -1 ; WX 500 ; N zacute ; B 20 0 599 750 ; C -1 ; WX 278 ; N iogonek ; B -14 -224 363 725 ; C -1 ; WX 778 ; N Oacute ; B 107 -19 823 936 ; C -1 ; WX 611 ; N oacute ; B 82 -14 654 750 ; C -1 ; WX 556 ; N amacron ; B 55 -14 595 678 ; C -1 ; WX 556 ; N sacute ; B 63 -14 627 750 ; C -1 ; WX 278 ; N idieresis ; B 69 0 455 729 ; C -1 ; WX 778 ; N Ocircumflex ; B 107 -19 823 936 ; C -1 ; WX 722 ; N Ugrave ; B 116 -19 804 936 ; C -1 ; WX 612 ; N Delta ; B 6 0 608 688 ; C -1 ; WX 611 ; N thorn ; B 18 -208 645 718 ; C -1 ; WX 333 ; N twosuperior ; B 69 283 449 710 ; C -1 ; WX 778 ; N Odieresis ; B 107 -19 823 915 ; C -1 ; WX 611 ; N mu ; B 22 -207 658 532 ; C -1 ; WX 278 ; N igrave ; B 69 0 326 750 ; C -1 ; WX 611 ; N ohungarumlaut ; B 82 -14 784 750 ; C -1 ; WX 667 ; N Eogonek ; B 76 -224 757 718 ; C -1 ; WX 611 ; N dcroat ; B 82 -14 789 718 ; C -1 ; WX 834 ; N threequarters ; B 99 -19 839 710 ; C -1 ; WX 667 ; N Scedilla ; B 81 -228 718 737 ; C -1 ; WX 400 ; N lcaron ; B 69 0 561 718 ; C -1 ; WX 722 ; N Kcommaaccent ; B 87 -228 858 718 ; C -1 ; WX 611 ; N Lacute ; B 76 0 611 936 ; C -1 ; WX 1000 ; N trademark ; B 179 306 1109 718 ; C -1 ; WX 556 ; N edotaccent ; B 70 -14 593 729 ; C -1 ; WX 278 ; N Igrave ; B 64 0 367 936 ; C -1 ; WX 278 ; N Imacron ; B 64 0 496 864 ; C -1 ; WX 611 ; N Lcaron ; B 76 0 643 718 ; C -1 ; WX 834 ; N onehalf ; B 132 -19 858 710 ; C -1 ; WX 549 ; N lessequal ; B 29 0 676 704 ; C -1 ; WX 611 ; N ocircumflex ; B 82 -14 643 750 ; C -1 ; WX 611 ; N ntilde ; B 65 0 646 737 ; C -1 ; WX 722 ; N Uhungarumlaut ; B 116 -19 880 936 ; C -1 ; WX 667 ; N Eacute ; B 76 0 757 936 ; C -1 ; WX 556 ; N emacron ; B 70 -14 595 678 ; C -1 ; WX 611 ; N gbreve ; B 38 -217 666 750 ; C -1 ; WX 834 ; N onequarter ; B 132 -19 806 710 ; C -1 ; WX 667 ; N Scaron ; B 81 -19 718 936 ; C -1 ; WX 667 ; N Scommaaccent ; B 81 -228 718 737 ; C -1 ; WX 778 ; N Ohungarumlaut ; B 107 -19 908 936 ; C -1 ; WX 400 ; N degree ; B 175 426 467 712 ; C -1 ; WX 611 ; N ograve ; B 82 -14 643 750 ; C -1 ; WX 722 ; N Ccaron ; B 107 -19 789 936 ; C -1 ; WX 611 ; N ugrave ; B 98 -14 658 750 ; C -1 ; WX 549 ; N radical ; B 112 -46 689 850 ; C -1 ; WX 722 ; N Dcaron ; B 76 0 777 936 ; C -1 ; WX 389 ; N rcommaaccent ; B 26 -228 489 546 ; C -1 ; WX 722 ; N Ntilde ; B 69 0 807 923 ; C -1 ; WX 611 ; N otilde ; B 82 -14 646 737 ; C -1 ; WX 722 ; N Rcommaaccent ; B 76 -228 778 718 ; C -1 ; WX 611 ; N Lcommaaccent ; B 76 -228 611 718 ; C -1 ; WX 722 ; N Atilde ; B 20 0 741 923 ; C -1 ; WX 722 ; N Aogonek ; B 20 -224 702 718 ; C -1 ; WX 722 ; N Aring ; B 20 0 702 962 ; C -1 ; WX 778 ; N Otilde ; B 107 -19 823 923 ; C -1 ; WX 500 ; N zdotaccent ; B 20 0 583 729 ; C -1 ; WX 667 ; N Ecaron ; B 76 0 757 936 ; C -1 ; WX 278 ; N Iogonek ; B -41 -228 367 718 ; C -1 ; WX 556 ; N kcommaaccent ; B 69 -228 670 718 ; C -1 ; WX 584 ; N minus ; B 82 197 610 309 ; C -1 ; WX 278 ; N Icircumflex ; B 64 0 484 936 ; C -1 ; WX 611 ; N ncaron ; B 65 0 641 750 ; C -1 ; WX 333 ; N tcommaaccent ; B 58 -228 422 676 ; C -1 ; WX 584 ; N logicalnot ; B 105 108 633 419 ; C -1 ; WX 611 ; N odieresis ; B 82 -14 643 729 ; C -1 ; WX 611 ; N udieresis ; B 98 -14 658 729 ; C -1 ; WX 549 ; N notequal ; B 32 -49 630 570 ; C -1 ; WX 611 ; N gcommaaccent ; B 38 -217 666 850 ; C -1 ; WX 611 ; N eth ; B 82 -14 670 737 ; C -1 ; WX 500 ; N zcaron ; B 20 0 586 750 ; C -1 ; WX 611 ; N ncommaaccent ; B 65 -228 629 546 ; C -1 ; WX 333 ; N onesuperior ; B 148 283 388 710 ; C -1 ; WX 278 ; N imacron ; B 69 0 429 678 ; C -1 ; WX 556 ; N Euro ; B 0 0 0 0 ; EndCharMetrics StartKernData StartKernPairs 2481 KPX A C -40 KPX A Cacute -40 KPX A Ccaron -40 KPX A Ccedilla -40 KPX A G -50 KPX A Gbreve -50 KPX A Gcommaaccent -50 KPX A O -40 KPX A Oacute -40 KPX A Ocircumflex -40 KPX A Odieresis -40 KPX A Ograve -40 KPX A Ohungarumlaut -40 KPX A Omacron -40 KPX A Oslash -40 KPX A Otilde -40 KPX A Q -40 KPX A T -90 KPX A Tcaron -90 KPX A Tcommaaccent -90 KPX A U -50 KPX A Uacute -50 KPX A Ucircumflex -50 KPX A Udieresis -50 KPX A Ugrave -50 KPX A Uhungarumlaut -50 KPX A Umacron -50 KPX A Uogonek -50 KPX A Uring -50 KPX A V -80 KPX A W -60 KPX A Y -110 KPX A Yacute -110 KPX A Ydieresis -110 KPX A u -30 KPX A uacute -30 KPX A ucircumflex -30 KPX A udieresis -30 KPX A ugrave -30 KPX A uhungarumlaut -30 KPX A umacron -30 KPX A uogonek -30 KPX A uring -30 KPX A v -40 KPX A w -30 KPX A y -30 KPX A yacute -30 KPX A ydieresis -30 KPX Aacute C -40 KPX Aacute Cacute -40 KPX Aacute Ccaron -40 KPX Aacute Ccedilla -40 KPX Aacute G -50 KPX Aacute Gbreve -50 KPX Aacute Gcommaaccent -50 KPX Aacute O -40 KPX Aacute Oacute -40 KPX Aacute Ocircumflex -40 KPX Aacute Odieresis -40 KPX Aacute Ograve -40 KPX Aacute Ohungarumlaut -40 KPX Aacute Omacron -40 KPX Aacute Oslash -40 KPX Aacute Otilde -40 KPX Aacute Q -40 KPX Aacute T -90 KPX Aacute Tcaron -90 KPX Aacute Tcommaaccent -90 KPX Aacute U -50 KPX Aacute Uacute -50 KPX Aacute Ucircumflex -50 KPX Aacute Udieresis -50 KPX Aacute Ugrave -50 KPX Aacute Uhungarumlaut -50 KPX Aacute Umacron -50 KPX Aacute Uogonek -50 KPX Aacute Uring -50 KPX Aacute V -80 KPX Aacute W -60 KPX Aacute Y -110 KPX Aacute Yacute -110 KPX Aacute Ydieresis -110 KPX Aacute u -30 KPX Aacute uacute -30 KPX Aacute ucircumflex -30 KPX Aacute udieresis -30 KPX Aacute ugrave -30 KPX Aacute uhungarumlaut -30 KPX Aacute umacron -30 KPX Aacute uogonek -30 KPX Aacute uring -30 KPX Aacute v -40 KPX Aacute w -30 KPX Aacute y -30 KPX Aacute yacute -30 KPX Aacute ydieresis -30 KPX Abreve C -40 KPX Abreve Cacute -40 KPX Abreve Ccaron -40 KPX Abreve Ccedilla -40 KPX Abreve G -50 KPX Abreve Gbreve -50 KPX Abreve Gcommaaccent -50 KPX Abreve O -40 KPX Abreve Oacute -40 KPX Abreve Ocircumflex -40 KPX Abreve Odieresis -40 KPX Abreve Ograve -40 KPX Abreve Ohungarumlaut -40 KPX Abreve Omacron -40 KPX Abreve Oslash -40 KPX Abreve Otilde -40 KPX Abreve Q -40 KPX Abreve T -90 KPX Abreve Tcaron -90 KPX Abreve Tcommaaccent -90 KPX Abreve U -50 KPX Abreve Uacute -50 KPX Abreve Ucircumflex -50 KPX Abreve Udieresis -50 KPX Abreve Ugrave -50 KPX Abreve Uhungarumlaut -50 KPX Abreve Umacron -50 KPX Abreve Uogonek -50 KPX Abreve Uring -50 KPX Abreve V -80 KPX Abreve W -60 KPX Abreve Y -110 KPX Abreve Yacute -110 KPX Abreve Ydieresis -110 KPX Abreve u -30 KPX Abreve uacute -30 KPX Abreve ucircumflex -30 KPX Abreve udieresis -30 KPX Abreve ugrave -30 KPX Abreve uhungarumlaut -30 KPX Abreve umacron -30 KPX Abreve uogonek -30 KPX Abreve uring -30 KPX Abreve v -40 KPX Abreve w -30 KPX Abreve y -30 KPX Abreve yacute -30 KPX Abreve ydieresis -30 KPX Acircumflex C -40 KPX Acircumflex Cacute -40 KPX Acircumflex Ccaron -40 KPX Acircumflex Ccedilla -40 KPX Acircumflex G -50 KPX Acircumflex Gbreve -50 KPX Acircumflex Gcommaaccent -50 KPX Acircumflex O -40 KPX Acircumflex Oacute -40 KPX Acircumflex Ocircumflex -40 KPX Acircumflex Odieresis -40 KPX Acircumflex Ograve -40 KPX Acircumflex Ohungarumlaut -40 KPX Acircumflex Omacron -40 KPX Acircumflex Oslash -40 KPX Acircumflex Otilde -40 KPX Acircumflex Q -40 KPX Acircumflex T -90 KPX Acircumflex Tcaron -90 KPX Acircumflex Tcommaaccent -90 KPX Acircumflex U -50 KPX Acircumflex Uacute -50 KPX Acircumflex Ucircumflex -50 KPX Acircumflex Udieresis -50 KPX Acircumflex Ugrave -50 KPX Acircumflex Uhungarumlaut -50 KPX Acircumflex Umacron -50 KPX Acircumflex Uogonek -50 KPX Acircumflex Uring -50 KPX Acircumflex V -80 KPX Acircumflex W -60 KPX Acircumflex Y -110 KPX Acircumflex Yacute -110 KPX Acircumflex Ydieresis -110 KPX Acircumflex u -30 KPX Acircumflex uacute -30 KPX Acircumflex ucircumflex -30 KPX Acircumflex udieresis -30 KPX Acircumflex ugrave -30 KPX Acircumflex uhungarumlaut -30 KPX Acircumflex umacron -30 KPX Acircumflex uogonek -30 KPX Acircumflex uring -30 KPX Acircumflex v -40 KPX Acircumflex w -30 KPX Acircumflex y -30 KPX Acircumflex yacute -30 KPX Acircumflex ydieresis -30 KPX Adieresis C -40 KPX Adieresis Cacute -40 KPX Adieresis Ccaron -40 KPX Adieresis Ccedilla -40 KPX Adieresis G -50 KPX Adieresis Gbreve -50 KPX Adieresis Gcommaaccent -50 KPX Adieresis O -40 KPX Adieresis Oacute -40 KPX Adieresis Ocircumflex -40 KPX Adieresis Odieresis -40 KPX Adieresis Ograve -40 KPX Adieresis Ohungarumlaut -40 KPX Adieresis Omacron -40 KPX Adieresis Oslash -40 KPX Adieresis Otilde -40 KPX Adieresis Q -40 KPX Adieresis T -90 KPX Adieresis Tcaron -90 KPX Adieresis Tcommaaccent -90 KPX Adieresis U -50 KPX Adieresis Uacute -50 KPX Adieresis Ucircumflex -50 KPX Adieresis Udieresis -50 KPX Adieresis Ugrave -50 KPX Adieresis Uhungarumlaut -50 KPX Adieresis Umacron -50 KPX Adieresis Uogonek -50 KPX Adieresis Uring -50 KPX Adieresis V -80 KPX Adieresis W -60 KPX Adieresis Y -110 KPX Adieresis Yacute -110 KPX Adieresis Ydieresis -110 KPX Adieresis u -30 KPX Adieresis uacute -30 KPX Adieresis ucircumflex -30 KPX Adieresis udieresis -30 KPX Adieresis ugrave -30 KPX Adieresis uhungarumlaut -30 KPX Adieresis umacron -30 KPX Adieresis uogonek -30 KPX Adieresis uring -30 KPX Adieresis v -40 KPX Adieresis w -30 KPX Adieresis y -30 KPX Adieresis yacute -30 KPX Adieresis ydieresis -30 KPX Agrave C -40 KPX Agrave Cacute -40 KPX Agrave Ccaron -40 KPX Agrave Ccedilla -40 KPX Agrave G -50 KPX Agrave Gbreve -50 KPX Agrave Gcommaaccent -50 KPX Agrave O -40 KPX Agrave Oacute -40 KPX Agrave Ocircumflex -40 KPX Agrave Odieresis -40 KPX Agrave Ograve -40 KPX Agrave Ohungarumlaut -40 KPX Agrave Omacron -40 KPX Agrave Oslash -40 KPX Agrave Otilde -40 KPX Agrave Q -40 KPX Agrave T -90 KPX Agrave Tcaron -90 KPX Agrave Tcommaaccent -90 KPX Agrave U -50 KPX Agrave Uacute -50 KPX Agrave Ucircumflex -50 KPX Agrave Udieresis -50 KPX Agrave Ugrave -50 KPX Agrave Uhungarumlaut -50 KPX Agrave Umacron -50 KPX Agrave Uogonek -50 KPX Agrave Uring -50 KPX Agrave V -80 KPX Agrave W -60 KPX Agrave Y -110 KPX Agrave Yacute -110 KPX Agrave Ydieresis -110 KPX Agrave u -30 KPX Agrave uacute -30 KPX Agrave ucircumflex -30 KPX Agrave udieresis -30 KPX Agrave ugrave -30 KPX Agrave uhungarumlaut -30 KPX Agrave umacron -30 KPX Agrave uogonek -30 KPX Agrave uring -30 KPX Agrave v -40 KPX Agrave w -30 KPX Agrave y -30 KPX Agrave yacute -30 KPX Agrave ydieresis -30 KPX Amacron C -40 KPX Amacron Cacute -40 KPX Amacron Ccaron -40 KPX Amacron Ccedilla -40 KPX Amacron G -50 KPX Amacron Gbreve -50 KPX Amacron Gcommaaccent -50 KPX Amacron O -40 KPX Amacron Oacute -40 KPX Amacron Ocircumflex -40 KPX Amacron Odieresis -40 KPX Amacron Ograve -40 KPX Amacron Ohungarumlaut -40 KPX Amacron Omacron -40 KPX Amacron Oslash -40 KPX Amacron Otilde -40 KPX Amacron Q -40 KPX Amacron T -90 KPX Amacron Tcaron -90 KPX Amacron Tcommaaccent -90 KPX Amacron U -50 KPX Amacron Uacute -50 KPX Amacron Ucircumflex -50 KPX Amacron Udieresis -50 KPX Amacron Ugrave -50 KPX Amacron Uhungarumlaut -50 KPX Amacron Umacron -50 KPX Amacron Uogonek -50 KPX Amacron Uring -50 KPX Amacron V -80 KPX Amacron W -60 KPX Amacron Y -110 KPX Amacron Yacute -110 KPX Amacron Ydieresis -110 KPX Amacron u -30 KPX Amacron uacute -30 KPX Amacron ucircumflex -30 KPX Amacron udieresis -30 KPX Amacron ugrave -30 KPX Amacron uhungarumlaut -30 KPX Amacron umacron -30 KPX Amacron uogonek -30 KPX Amacron uring -30 KPX Amacron v -40 KPX Amacron w -30 KPX Amacron y -30 KPX Amacron yacute -30 KPX Amacron ydieresis -30 KPX Aogonek C -40 KPX Aogonek Cacute -40 KPX Aogonek Ccaron -40 KPX Aogonek Ccedilla -40 KPX Aogonek G -50 KPX Aogonek Gbreve -50 KPX Aogonek Gcommaaccent -50 KPX Aogonek O -40 KPX Aogonek Oacute -40 KPX Aogonek Ocircumflex -40 KPX Aogonek Odieresis -40 KPX Aogonek Ograve -40 KPX Aogonek Ohungarumlaut -40 KPX Aogonek Omacron -40 KPX Aogonek Oslash -40 KPX Aogonek Otilde -40 KPX Aogonek Q -40 KPX Aogonek T -90 KPX Aogonek Tcaron -90 KPX Aogonek Tcommaaccent -90 KPX Aogonek U -50 KPX Aogonek Uacute -50 KPX Aogonek Ucircumflex -50 KPX Aogonek Udieresis -50 KPX Aogonek Ugrave -50 KPX Aogonek Uhungarumlaut -50 KPX Aogonek Umacron -50 KPX Aogonek Uogonek -50 KPX Aogonek Uring -50 KPX Aogonek V -80 KPX Aogonek W -60 KPX Aogonek Y -110 KPX Aogonek Yacute -110 KPX Aogonek Ydieresis -110 KPX Aogonek u -30 KPX Aogonek uacute -30 KPX Aogonek ucircumflex -30 KPX Aogonek udieresis -30 KPX Aogonek ugrave -30 KPX Aogonek uhungarumlaut -30 KPX Aogonek umacron -30 KPX Aogonek uogonek -30 KPX Aogonek uring -30 KPX Aogonek v -40 KPX Aogonek w -30 KPX Aogonek y -30 KPX Aogonek yacute -30 KPX Aogonek ydieresis -30 KPX Aring C -40 KPX Aring Cacute -40 KPX Aring Ccaron -40 KPX Aring Ccedilla -40 KPX Aring G -50 KPX Aring Gbreve -50 KPX Aring Gcommaaccent -50 KPX Aring O -40 KPX Aring Oacute -40 KPX Aring Ocircumflex -40 KPX Aring Odieresis -40 KPX Aring Ograve -40 KPX Aring Ohungarumlaut -40 KPX Aring Omacron -40 KPX Aring Oslash -40 KPX Aring Otilde -40 KPX Aring Q -40 KPX Aring T -90 KPX Aring Tcaron -90 KPX Aring Tcommaaccent -90 KPX Aring U -50 KPX Aring Uacute -50 KPX Aring Ucircumflex -50 KPX Aring Udieresis -50 KPX Aring Ugrave -50 KPX Aring Uhungarumlaut -50 KPX Aring Umacron -50 KPX Aring Uogonek -50 KPX Aring Uring -50 KPX Aring V -80 KPX Aring W -60 KPX Aring Y -110 KPX Aring Yacute -110 KPX Aring Ydieresis -110 KPX Aring u -30 KPX Aring uacute -30 KPX Aring ucircumflex -30 KPX Aring udieresis -30 KPX Aring ugrave -30 KPX Aring uhungarumlaut -30 KPX Aring umacron -30 KPX Aring uogonek -30 KPX Aring uring -30 KPX Aring v -40 KPX Aring w -30 KPX Aring y -30 KPX Aring yacute -30 KPX Aring ydieresis -30 KPX Atilde C -40 KPX Atilde Cacute -40 KPX Atilde Ccaron -40 KPX Atilde Ccedilla -40 KPX Atilde G -50 KPX Atilde Gbreve -50 KPX Atilde Gcommaaccent -50 KPX Atilde O -40 KPX Atilde Oacute -40 KPX Atilde Ocircumflex -40 KPX Atilde Odieresis -40 KPX Atilde Ograve -40 KPX Atilde Ohungarumlaut -40 KPX Atilde Omacron -40 KPX Atilde Oslash -40 KPX Atilde Otilde -40 KPX Atilde Q -40 KPX Atilde T -90 KPX Atilde Tcaron -90 KPX Atilde Tcommaaccent -90 KPX Atilde U -50 KPX Atilde Uacute -50 KPX Atilde Ucircumflex -50 KPX Atilde Udieresis -50 KPX Atilde Ugrave -50 KPX Atilde Uhungarumlaut -50 KPX Atilde Umacron -50 KPX Atilde Uogonek -50 KPX Atilde Uring -50 KPX Atilde V -80 KPX Atilde W -60 KPX Atilde Y -110 KPX Atilde Yacute -110 KPX Atilde Ydieresis -110 KPX Atilde u -30 KPX Atilde uacute -30 KPX Atilde ucircumflex -30 KPX Atilde udieresis -30 KPX Atilde ugrave -30 KPX Atilde uhungarumlaut -30 KPX Atilde umacron -30 KPX Atilde uogonek -30 KPX Atilde uring -30 KPX Atilde v -40 KPX Atilde w -30 KPX Atilde y -30 KPX Atilde yacute -30 KPX Atilde ydieresis -30 KPX B A -30 KPX B Aacute -30 KPX B Abreve -30 KPX B Acircumflex -30 KPX B Adieresis -30 KPX B Agrave -30 KPX B Amacron -30 KPX B Aogonek -30 KPX B Aring -30 KPX B Atilde -30 KPX B U -10 KPX B Uacute -10 KPX B Ucircumflex -10 KPX B Udieresis -10 KPX B Ugrave -10 KPX B Uhungarumlaut -10 KPX B Umacron -10 KPX B Uogonek -10 KPX B Uring -10 KPX D A -40 KPX D Aacute -40 KPX D Abreve -40 KPX D Acircumflex -40 KPX D Adieresis -40 KPX D Agrave -40 KPX D Amacron -40 KPX D Aogonek -40 KPX D Aring -40 KPX D Atilde -40 KPX D V -40 KPX D W -40 KPX D Y -70 KPX D Yacute -70 KPX D Ydieresis -70 KPX D comma -30 KPX D period -30 KPX Dcaron A -40 KPX Dcaron Aacute -40 KPX Dcaron Abreve -40 KPX Dcaron Acircumflex -40 KPX Dcaron Adieresis -40 KPX Dcaron Agrave -40 KPX Dcaron Amacron -40 KPX Dcaron Aogonek -40 KPX Dcaron Aring -40 KPX Dcaron Atilde -40 KPX Dcaron V -40 KPX Dcaron W -40 KPX Dcaron Y -70 KPX Dcaron Yacute -70 KPX Dcaron Ydieresis -70 KPX Dcaron comma -30 KPX Dcaron period -30 KPX Dcroat A -40 KPX Dcroat Aacute -40 KPX Dcroat Abreve -40 KPX Dcroat Acircumflex -40 KPX Dcroat Adieresis -40 KPX Dcroat Agrave -40 KPX Dcroat Amacron -40 KPX Dcroat Aogonek -40 KPX Dcroat Aring -40 KPX Dcroat Atilde -40 KPX Dcroat V -40 KPX Dcroat W -40 KPX Dcroat Y -70 KPX Dcroat Yacute -70 KPX Dcroat Ydieresis -70 KPX Dcroat comma -30 KPX Dcroat period -30 KPX F A -80 KPX F Aacute -80 KPX F Abreve -80 KPX F Acircumflex -80 KPX F Adieresis -80 KPX F Agrave -80 KPX F Amacron -80 KPX F Aogonek -80 KPX F Aring -80 KPX F Atilde -80 KPX F a -20 KPX F aacute -20 KPX F abreve -20 KPX F acircumflex -20 KPX F adieresis -20 KPX F agrave -20 KPX F amacron -20 KPX F aogonek -20 KPX F aring -20 KPX F atilde -20 KPX F comma -100 KPX F period -100 KPX J A -20 KPX J Aacute -20 KPX J Abreve -20 KPX J Acircumflex -20 KPX J Adieresis -20 KPX J Agrave -20 KPX J Amacron -20 KPX J Aogonek -20 KPX J Aring -20 KPX J Atilde -20 KPX J comma -20 KPX J period -20 KPX J u -20 KPX J uacute -20 KPX J ucircumflex -20 KPX J udieresis -20 KPX J ugrave -20 KPX J uhungarumlaut -20 KPX J umacron -20 KPX J uogonek -20 KPX J uring -20 KPX K O -30 KPX K Oacute -30 KPX K Ocircumflex -30 KPX K Odieresis -30 KPX K Ograve -30 KPX K Ohungarumlaut -30 KPX K Omacron -30 KPX K Oslash -30 KPX K Otilde -30 KPX K e -15 KPX K eacute -15 KPX K ecaron -15 KPX K ecircumflex -15 KPX K edieresis -15 KPX K edotaccent -15 KPX K egrave -15 KPX K emacron -15 KPX K eogonek -15 KPX K o -35 KPX K oacute -35 KPX K ocircumflex -35 KPX K odieresis -35 KPX K ograve -35 KPX K ohungarumlaut -35 KPX K omacron -35 KPX K oslash -35 KPX K otilde -35 KPX K u -30 KPX K uacute -30 KPX K ucircumflex -30 KPX K udieresis -30 KPX K ugrave -30 KPX K uhungarumlaut -30 KPX K umacron -30 KPX K uogonek -30 KPX K uring -30 KPX K y -40 KPX K yacute -40 KPX K ydieresis -40 KPX Kcommaaccent O -30 KPX Kcommaaccent Oacute -30 KPX Kcommaaccent Ocircumflex -30 KPX Kcommaaccent Odieresis -30 KPX Kcommaaccent Ograve -30 KPX Kcommaaccent Ohungarumlaut -30 KPX Kcommaaccent Omacron -30 KPX Kcommaaccent Oslash -30 KPX Kcommaaccent Otilde -30 KPX Kcommaaccent e -15 KPX Kcommaaccent eacute -15 KPX Kcommaaccent ecaron -15 KPX Kcommaaccent ecircumflex -15 KPX Kcommaaccent edieresis -15 KPX Kcommaaccent edotaccent -15 KPX Kcommaaccent egrave -15 KPX Kcommaaccent emacron -15 KPX Kcommaaccent eogonek -15 KPX Kcommaaccent o -35 KPX Kcommaaccent oacute -35 KPX Kcommaaccent ocircumflex -35 KPX Kcommaaccent odieresis -35 KPX Kcommaaccent ograve -35 KPX Kcommaaccent ohungarumlaut -35 KPX Kcommaaccent omacron -35 KPX Kcommaaccent oslash -35 KPX Kcommaaccent otilde -35 KPX Kcommaaccent u -30 KPX Kcommaaccent uacute -30 KPX Kcommaaccent ucircumflex -30 KPX Kcommaaccent udieresis -30 KPX Kcommaaccent ugrave -30 KPX Kcommaaccent uhungarumlaut -30 KPX Kcommaaccent umacron -30 KPX Kcommaaccent uogonek -30 KPX Kcommaaccent uring -30 KPX Kcommaaccent y -40 KPX Kcommaaccent yacute -40 KPX Kcommaaccent ydieresis -40 KPX L T -90 KPX L Tcaron -90 KPX L Tcommaaccent -90 KPX L V -110 KPX L W -80 KPX L Y -120 KPX L Yacute -120 KPX L Ydieresis -120 KPX L quotedblright -140 KPX L quoteright -140 KPX L y -30 KPX L yacute -30 KPX L ydieresis -30 KPX Lacute T -90 KPX Lacute Tcaron -90 KPX Lacute Tcommaaccent -90 KPX Lacute V -110 KPX Lacute W -80 KPX Lacute Y -120 KPX Lacute Yacute -120 KPX Lacute Ydieresis -120 KPX Lacute quotedblright -140 KPX Lacute quoteright -140 KPX Lacute y -30 KPX Lacute yacute -30 KPX Lacute ydieresis -30 KPX Lcommaaccent T -90 KPX Lcommaaccent Tcaron -90 KPX Lcommaaccent Tcommaaccent -90 KPX Lcommaaccent V -110 KPX Lcommaaccent W -80 KPX Lcommaaccent Y -120 KPX Lcommaaccent Yacute -120 KPX Lcommaaccent Ydieresis -120 KPX Lcommaaccent quotedblright -140 KPX Lcommaaccent quoteright -140 KPX Lcommaaccent y -30 KPX Lcommaaccent yacute -30 KPX Lcommaaccent ydieresis -30 KPX Lslash T -90 KPX Lslash Tcaron -90 KPX Lslash Tcommaaccent -90 KPX Lslash V -110 KPX Lslash W -80 KPX Lslash Y -120 KPX Lslash Yacute -120 KPX Lslash Ydieresis -120 KPX Lslash quotedblright -140 KPX Lslash quoteright -140 KPX Lslash y -30 KPX Lslash yacute -30 KPX Lslash ydieresis -30 KPX O A -50 KPX O Aacute -50 KPX O Abreve -50 KPX O Acircumflex -50 KPX O Adieresis -50 KPX O Agrave -50 KPX O Amacron -50 KPX O Aogonek -50 KPX O Aring -50 KPX O Atilde -50 KPX O T -40 KPX O Tcaron -40 KPX O Tcommaaccent -40 KPX O V -50 KPX O W -50 KPX O X -50 KPX O Y -70 KPX O Yacute -70 KPX O Ydieresis -70 KPX O comma -40 KPX O period -40 KPX Oacute A -50 KPX Oacute Aacute -50 KPX Oacute Abreve -50 KPX Oacute Acircumflex -50 KPX Oacute Adieresis -50 KPX Oacute Agrave -50 KPX Oacute Amacron -50 KPX Oacute Aogonek -50 KPX Oacute Aring -50 KPX Oacute Atilde -50 KPX Oacute T -40 KPX Oacute Tcaron -40 KPX Oacute Tcommaaccent -40 KPX Oacute V -50 KPX Oacute W -50 KPX Oacute X -50 KPX Oacute Y -70 KPX Oacute Yacute -70 KPX Oacute Ydieresis -70 KPX Oacute comma -40 KPX Oacute period -40 KPX Ocircumflex A -50 KPX Ocircumflex Aacute -50 KPX Ocircumflex Abreve -50 KPX Ocircumflex Acircumflex -50 KPX Ocircumflex Adieresis -50 KPX Ocircumflex Agrave -50 KPX Ocircumflex Amacron -50 KPX Ocircumflex Aogonek -50 KPX Ocircumflex Aring -50 KPX Ocircumflex Atilde -50 KPX Ocircumflex T -40 KPX Ocircumflex Tcaron -40 KPX Ocircumflex Tcommaaccent -40 KPX Ocircumflex V -50 KPX Ocircumflex W -50 KPX Ocircumflex X -50 KPX Ocircumflex Y -70 KPX Ocircumflex Yacute -70 KPX Ocircumflex Ydieresis -70 KPX Ocircumflex comma -40 KPX Ocircumflex period -40 KPX Odieresis A -50 KPX Odieresis Aacute -50 KPX Odieresis Abreve -50 KPX Odieresis Acircumflex -50 KPX Odieresis Adieresis -50 KPX Odieresis Agrave -50 KPX Odieresis Amacron -50 KPX Odieresis Aogonek -50 KPX Odieresis Aring -50 KPX Odieresis Atilde -50 KPX Odieresis T -40 KPX Odieresis Tcaron -40 KPX Odieresis Tcommaaccent -40 KPX Odieresis V -50 KPX Odieresis W -50 KPX Odieresis X -50 KPX Odieresis Y -70 KPX Odieresis Yacute -70 KPX Odieresis Ydieresis -70 KPX Odieresis comma -40 KPX Odieresis period -40 KPX Ograve A -50 KPX Ograve Aacute -50 KPX Ograve Abreve -50 KPX Ograve Acircumflex -50 KPX Ograve Adieresis -50 KPX Ograve Agrave -50 KPX Ograve Amacron -50 KPX Ograve Aogonek -50 KPX Ograve Aring -50 KPX Ograve Atilde -50 KPX Ograve T -40 KPX Ograve Tcaron -40 KPX Ograve Tcommaaccent -40 KPX Ograve V -50 KPX Ograve W -50 KPX Ograve X -50 KPX Ograve Y -70 KPX Ograve Yacute -70 KPX Ograve Ydieresis -70 KPX Ograve comma -40 KPX Ograve period -40 KPX Ohungarumlaut A -50 KPX Ohungarumlaut Aacute -50 KPX Ohungarumlaut Abreve -50 KPX Ohungarumlaut Acircumflex -50 KPX Ohungarumlaut Adieresis -50 KPX Ohungarumlaut Agrave -50 KPX Ohungarumlaut Amacron -50 KPX Ohungarumlaut Aogonek -50 KPX Ohungarumlaut Aring -50 KPX Ohungarumlaut Atilde -50 KPX Ohungarumlaut T -40 KPX Ohungarumlaut Tcaron -40 KPX Ohungarumlaut Tcommaaccent -40 KPX Ohungarumlaut V -50 KPX Ohungarumlaut W -50 KPX Ohungarumlaut X -50 KPX Ohungarumlaut Y -70 KPX Ohungarumlaut Yacute -70 KPX Ohungarumlaut Ydieresis -70 KPX Ohungarumlaut comma -40 KPX Ohungarumlaut period -40 KPX Omacron A -50 KPX Omacron Aacute -50 KPX Omacron Abreve -50 KPX Omacron Acircumflex -50 KPX Omacron Adieresis -50 KPX Omacron Agrave -50 KPX Omacron Amacron -50 KPX Omacron Aogonek -50 KPX Omacron Aring -50 KPX Omacron Atilde -50 KPX Omacron T -40 KPX Omacron Tcaron -40 KPX Omacron Tcommaaccent -40 KPX Omacron V -50 KPX Omacron W -50 KPX Omacron X -50 KPX Omacron Y -70 KPX Omacron Yacute -70 KPX Omacron Ydieresis -70 KPX Omacron comma -40 KPX Omacron period -40 KPX Oslash A -50 KPX Oslash Aacute -50 KPX Oslash Abreve -50 KPX Oslash Acircumflex -50 KPX Oslash Adieresis -50 KPX Oslash Agrave -50 KPX Oslash Amacron -50 KPX Oslash Aogonek -50 KPX Oslash Aring -50 KPX Oslash Atilde -50 KPX Oslash T -40 KPX Oslash Tcaron -40 KPX Oslash Tcommaaccent -40 KPX Oslash V -50 KPX Oslash W -50 KPX Oslash X -50 KPX Oslash Y -70 KPX Oslash Yacute -70 KPX Oslash Ydieresis -70 KPX Oslash comma -40 KPX Oslash period -40 KPX Otilde A -50 KPX Otilde Aacute -50 KPX Otilde Abreve -50 KPX Otilde Acircumflex -50 KPX Otilde Adieresis -50 KPX Otilde Agrave -50 KPX Otilde Amacron -50 KPX Otilde Aogonek -50 KPX Otilde Aring -50 KPX Otilde Atilde -50 KPX Otilde T -40 KPX Otilde Tcaron -40 KPX Otilde Tcommaaccent -40 KPX Otilde V -50 KPX Otilde W -50 KPX Otilde X -50 KPX Otilde Y -70 KPX Otilde Yacute -70 KPX Otilde Ydieresis -70 KPX Otilde comma -40 KPX Otilde period -40 KPX P A -100 KPX P Aacute -100 KPX P Abreve -100 KPX P Acircumflex -100 KPX P Adieresis -100 KPX P Agrave -100 KPX P Amacron -100 KPX P Aogonek -100 KPX P Aring -100 KPX P Atilde -100 KPX P a -30 KPX P aacute -30 KPX P abreve -30 KPX P acircumflex -30 KPX P adieresis -30 KPX P agrave -30 KPX P amacron -30 KPX P aogonek -30 KPX P aring -30 KPX P atilde -30 KPX P comma -120 KPX P e -30 KPX P eacute -30 KPX P ecaron -30 KPX P ecircumflex -30 KPX P edieresis -30 KPX P edotaccent -30 KPX P egrave -30 KPX P emacron -30 KPX P eogonek -30 KPX P o -40 KPX P oacute -40 KPX P ocircumflex -40 KPX P odieresis -40 KPX P ograve -40 KPX P ohungarumlaut -40 KPX P omacron -40 KPX P oslash -40 KPX P otilde -40 KPX P period -120 KPX Q U -10 KPX Q Uacute -10 KPX Q Ucircumflex -10 KPX Q Udieresis -10 KPX Q Ugrave -10 KPX Q Uhungarumlaut -10 KPX Q Umacron -10 KPX Q Uogonek -10 KPX Q Uring -10 KPX Q comma 20 KPX Q period 20 KPX R O -20 KPX R Oacute -20 KPX R Ocircumflex -20 KPX R Odieresis -20 KPX R Ograve -20 KPX R Ohungarumlaut -20 KPX R Omacron -20 KPX R Oslash -20 KPX R Otilde -20 KPX R T -20 KPX R Tcaron -20 KPX R Tcommaaccent -20 KPX R U -20 KPX R Uacute -20 KPX R Ucircumflex -20 KPX R Udieresis -20 KPX R Ugrave -20 KPX R Uhungarumlaut -20 KPX R Umacron -20 KPX R Uogonek -20 KPX R Uring -20 KPX R V -50 KPX R W -40 KPX R Y -50 KPX R Yacute -50 KPX R Ydieresis -50 KPX Racute O -20 KPX Racute Oacute -20 KPX Racute Ocircumflex -20 KPX Racute Odieresis -20 KPX Racute Ograve -20 KPX Racute Ohungarumlaut -20 KPX Racute Omacron -20 KPX Racute Oslash -20 KPX Racute Otilde -20 KPX Racute T -20 KPX Racute Tcaron -20 KPX Racute Tcommaaccent -20 KPX Racute U -20 KPX Racute Uacute -20 KPX Racute Ucircumflex -20 KPX Racute Udieresis -20 KPX Racute Ugrave -20 KPX Racute Uhungarumlaut -20 KPX Racute Umacron -20 KPX Racute Uogonek -20 KPX Racute Uring -20 KPX Racute V -50 KPX Racute W -40 KPX Racute Y -50 KPX Racute Yacute -50 KPX Racute Ydieresis -50 KPX Rcaron O -20 KPX Rcaron Oacute -20 KPX Rcaron Ocircumflex -20 KPX Rcaron Odieresis -20 KPX Rcaron Ograve -20 KPX Rcaron Ohungarumlaut -20 KPX Rcaron Omacron -20 KPX Rcaron Oslash -20 KPX Rcaron Otilde -20 KPX Rcaron T -20 KPX Rcaron Tcaron -20 KPX Rcaron Tcommaaccent -20 KPX Rcaron U -20 KPX Rcaron Uacute -20 KPX Rcaron Ucircumflex -20 KPX Rcaron Udieresis -20 KPX Rcaron Ugrave -20 KPX Rcaron Uhungarumlaut -20 KPX Rcaron Umacron -20 KPX Rcaron Uogonek -20 KPX Rcaron Uring -20 KPX Rcaron V -50 KPX Rcaron W -40 KPX Rcaron Y -50 KPX Rcaron Yacute -50 KPX Rcaron Ydieresis -50 KPX Rcommaaccent O -20 KPX Rcommaaccent Oacute -20 KPX Rcommaaccent Ocircumflex -20 KPX Rcommaaccent Odieresis -20 KPX Rcommaaccent Ograve -20 KPX Rcommaaccent Ohungarumlaut -20 KPX Rcommaaccent Omacron -20 KPX Rcommaaccent Oslash -20 KPX Rcommaaccent Otilde -20 KPX Rcommaaccent T -20 KPX Rcommaaccent Tcaron -20 KPX Rcommaaccent Tcommaaccent -20 KPX Rcommaaccent U -20 KPX Rcommaaccent Uacute -20 KPX Rcommaaccent Ucircumflex -20 KPX Rcommaaccent Udieresis -20 KPX Rcommaaccent Ugrave -20 KPX Rcommaaccent Uhungarumlaut -20 KPX Rcommaaccent Umacron -20 KPX Rcommaaccent Uogonek -20 KPX Rcommaaccent Uring -20 KPX Rcommaaccent V -50 KPX Rcommaaccent W -40 KPX Rcommaaccent Y -50 KPX Rcommaaccent Yacute -50 KPX Rcommaaccent Ydieresis -50 KPX T A -90 KPX T Aacute -90 KPX T Abreve -90 KPX T Acircumflex -90 KPX T Adieresis -90 KPX T Agrave -90 KPX T Amacron -90 KPX T Aogonek -90 KPX T Aring -90 KPX T Atilde -90 KPX T O -40 KPX T Oacute -40 KPX T Ocircumflex -40 KPX T Odieresis -40 KPX T Ograve -40 KPX T Ohungarumlaut -40 KPX T Omacron -40 KPX T Oslash -40 KPX T Otilde -40 KPX T a -80 KPX T aacute -80 KPX T abreve -80 KPX T acircumflex -80 KPX T adieresis -80 KPX T agrave -80 KPX T amacron -80 KPX T aogonek -80 KPX T aring -80 KPX T atilde -80 KPX T colon -40 KPX T comma -80 KPX T e -60 KPX T eacute -60 KPX T ecaron -60 KPX T ecircumflex -60 KPX T edieresis -60 KPX T edotaccent -60 KPX T egrave -60 KPX T emacron -60 KPX T eogonek -60 KPX T hyphen -120 KPX T o -80 KPX T oacute -80 KPX T ocircumflex -80 KPX T odieresis -80 KPX T ograve -80 KPX T ohungarumlaut -80 KPX T omacron -80 KPX T oslash -80 KPX T otilde -80 KPX T period -80 KPX T r -80 KPX T racute -80 KPX T rcommaaccent -80 KPX T semicolon -40 KPX T u -90 KPX T uacute -90 KPX T ucircumflex -90 KPX T udieresis -90 KPX T ugrave -90 KPX T uhungarumlaut -90 KPX T umacron -90 KPX T uogonek -90 KPX T uring -90 KPX T w -60 KPX T y -60 KPX T yacute -60 KPX T ydieresis -60 KPX Tcaron A -90 KPX Tcaron Aacute -90 KPX Tcaron Abreve -90 KPX Tcaron Acircumflex -90 KPX Tcaron Adieresis -90 KPX Tcaron Agrave -90 KPX Tcaron Amacron -90 KPX Tcaron Aogonek -90 KPX Tcaron Aring -90 KPX Tcaron Atilde -90 KPX Tcaron O -40 KPX Tcaron Oacute -40 KPX Tcaron Ocircumflex -40 KPX Tcaron Odieresis -40 KPX Tcaron Ograve -40 KPX Tcaron Ohungarumlaut -40 KPX Tcaron Omacron -40 KPX Tcaron Oslash -40 KPX Tcaron Otilde -40 KPX Tcaron a -80 KPX Tcaron aacute -80 KPX Tcaron abreve -80 KPX Tcaron acircumflex -80 KPX Tcaron adieresis -80 KPX Tcaron agrave -80 KPX Tcaron amacron -80 KPX Tcaron aogonek -80 KPX Tcaron aring -80 KPX Tcaron atilde -80 KPX Tcaron colon -40 KPX Tcaron comma -80 KPX Tcaron e -60 KPX Tcaron eacute -60 KPX Tcaron ecaron -60 KPX Tcaron ecircumflex -60 KPX Tcaron edieresis -60 KPX Tcaron edotaccent -60 KPX Tcaron egrave -60 KPX Tcaron emacron -60 KPX Tcaron eogonek -60 KPX Tcaron hyphen -120 KPX Tcaron o -80 KPX Tcaron oacute -80 KPX Tcaron ocircumflex -80 KPX Tcaron odieresis -80 KPX Tcaron ograve -80 KPX Tcaron ohungarumlaut -80 KPX Tcaron omacron -80 KPX Tcaron oslash -80 KPX Tcaron otilde -80 KPX Tcaron period -80 KPX Tcaron r -80 KPX Tcaron racute -80 KPX Tcaron rcommaaccent -80 KPX Tcaron semicolon -40 KPX Tcaron u -90 KPX Tcaron uacute -90 KPX Tcaron ucircumflex -90 KPX Tcaron udieresis -90 KPX Tcaron ugrave -90 KPX Tcaron uhungarumlaut -90 KPX Tcaron umacron -90 KPX Tcaron uogonek -90 KPX Tcaron uring -90 KPX Tcaron w -60 KPX Tcaron y -60 KPX Tcaron yacute -60 KPX Tcaron ydieresis -60 KPX Tcommaaccent A -90 KPX Tcommaaccent Aacute -90 KPX Tcommaaccent Abreve -90 KPX Tcommaaccent Acircumflex -90 KPX Tcommaaccent Adieresis -90 KPX Tcommaaccent Agrave -90 KPX Tcommaaccent Amacron -90 KPX Tcommaaccent Aogonek -90 KPX Tcommaaccent Aring -90 KPX Tcommaaccent Atilde -90 KPX Tcommaaccent O -40 KPX Tcommaaccent Oacute -40 KPX Tcommaaccent Ocircumflex -40 KPX Tcommaaccent Odieresis -40 KPX Tcommaaccent Ograve -40 KPX Tcommaaccent Ohungarumlaut -40 KPX Tcommaaccent Omacron -40 KPX Tcommaaccent Oslash -40 KPX Tcommaaccent Otilde -40 KPX Tcommaaccent a -80 KPX Tcommaaccent aacute -80 KPX Tcommaaccent abreve -80 KPX Tcommaaccent acircumflex -80 KPX Tcommaaccent adieresis -80 KPX Tcommaaccent agrave -80 KPX Tcommaaccent amacron -80 KPX Tcommaaccent aogonek -80 KPX Tcommaaccent aring -80 KPX Tcommaaccent atilde -80 KPX Tcommaaccent colon -40 KPX Tcommaaccent comma -80 KPX Tcommaaccent e -60 KPX Tcommaaccent eacute -60 KPX Tcommaaccent ecaron -60 KPX Tcommaaccent ecircumflex -60 KPX Tcommaaccent edieresis -60 KPX Tcommaaccent edotaccent -60 KPX Tcommaaccent egrave -60 KPX Tcommaaccent emacron -60 KPX Tcommaaccent eogonek -60 KPX Tcommaaccent hyphen -120 KPX Tcommaaccent o -80 KPX Tcommaaccent oacute -80 KPX Tcommaaccent ocircumflex -80 KPX Tcommaaccent odieresis -80 KPX Tcommaaccent ograve -80 KPX Tcommaaccent ohungarumlaut -80 KPX Tcommaaccent omacron -80 KPX Tcommaaccent oslash -80 KPX Tcommaaccent otilde -80 KPX Tcommaaccent period -80 KPX Tcommaaccent r -80 KPX Tcommaaccent racute -80 KPX Tcommaaccent rcommaaccent -80 KPX Tcommaaccent semicolon -40 KPX Tcommaaccent u -90 KPX Tcommaaccent uacute -90 KPX Tcommaaccent ucircumflex -90 KPX Tcommaaccent udieresis -90 KPX Tcommaaccent ugrave -90 KPX Tcommaaccent uhungarumlaut -90 KPX Tcommaaccent umacron -90 KPX Tcommaaccent uogonek -90 KPX Tcommaaccent uring -90 KPX Tcommaaccent w -60 KPX Tcommaaccent y -60 KPX Tcommaaccent yacute -60 KPX Tcommaaccent ydieresis -60 KPX U A -50 KPX U Aacute -50 KPX U Abreve -50 KPX U Acircumflex -50 KPX U Adieresis -50 KPX U Agrave -50 KPX U Amacron -50 KPX U Aogonek -50 KPX U Aring -50 KPX U Atilde -50 KPX U comma -30 KPX U period -30 KPX Uacute A -50 KPX Uacute Aacute -50 KPX Uacute Abreve -50 KPX Uacute Acircumflex -50 KPX Uacute Adieresis -50 KPX Uacute Agrave -50 KPX Uacute Amacron -50 KPX Uacute Aogonek -50 KPX Uacute Aring -50 KPX Uacute Atilde -50 KPX Uacute comma -30 KPX Uacute period -30 KPX Ucircumflex A -50 KPX Ucircumflex Aacute -50 KPX Ucircumflex Abreve -50 KPX Ucircumflex Acircumflex -50 KPX Ucircumflex Adieresis -50 KPX Ucircumflex Agrave -50 KPX Ucircumflex Amacron -50 KPX Ucircumflex Aogonek -50 KPX Ucircumflex Aring -50 KPX Ucircumflex Atilde -50 KPX Ucircumflex comma -30 KPX Ucircumflex period -30 KPX Udieresis A -50 KPX Udieresis Aacute -50 KPX Udieresis Abreve -50 KPX Udieresis Acircumflex -50 KPX Udieresis Adieresis -50 KPX Udieresis Agrave -50 KPX Udieresis Amacron -50 KPX Udieresis Aogonek -50 KPX Udieresis Aring -50 KPX Udieresis Atilde -50 KPX Udieresis comma -30 KPX Udieresis period -30 KPX Ugrave A -50 KPX Ugrave Aacute -50 KPX Ugrave Abreve -50 KPX Ugrave Acircumflex -50 KPX Ugrave Adieresis -50 KPX Ugrave Agrave -50 KPX Ugrave Amacron -50 KPX Ugrave Aogonek -50 KPX Ugrave Aring -50 KPX Ugrave Atilde -50 KPX Ugrave comma -30 KPX Ugrave period -30 KPX Uhungarumlaut A -50 KPX Uhungarumlaut Aacute -50 KPX Uhungarumlaut Abreve -50 KPX Uhungarumlaut Acircumflex -50 KPX Uhungarumlaut Adieresis -50 KPX Uhungarumlaut Agrave -50 KPX Uhungarumlaut Amacron -50 KPX Uhungarumlaut Aogonek -50 KPX Uhungarumlaut Aring -50 KPX Uhungarumlaut Atilde -50 KPX Uhungarumlaut comma -30 KPX Uhungarumlaut period -30 KPX Umacron A -50 KPX Umacron Aacute -50 KPX Umacron Abreve -50 KPX Umacron Acircumflex -50 KPX Umacron Adieresis -50 KPX Umacron Agrave -50 KPX Umacron Amacron -50 KPX Umacron Aogonek -50 KPX Umacron Aring -50 KPX Umacron Atilde -50 KPX Umacron comma -30 KPX Umacron period -30 KPX Uogonek A -50 KPX Uogonek Aacute -50 KPX Uogonek Abreve -50 KPX Uogonek Acircumflex -50 KPX Uogonek Adieresis -50 KPX Uogonek Agrave -50 KPX Uogonek Amacron -50 KPX Uogonek Aogonek -50 KPX Uogonek Aring -50 KPX Uogonek Atilde -50 KPX Uogonek comma -30 KPX Uogonek period -30 KPX Uring A -50 KPX Uring Aacute -50 KPX Uring Abreve -50 KPX Uring Acircumflex -50 KPX Uring Adieresis -50 KPX Uring Agrave -50 KPX Uring Amacron -50 KPX Uring Aogonek -50 KPX Uring Aring -50 KPX Uring Atilde -50 KPX Uring comma -30 KPX Uring period -30 KPX V A -80 KPX V Aacute -80 KPX V Abreve -80 KPX V Acircumflex -80 KPX V Adieresis -80 KPX V Agrave -80 KPX V Amacron -80 KPX V Aogonek -80 KPX V Aring -80 KPX V Atilde -80 KPX V G -50 KPX V Gbreve -50 KPX V Gcommaaccent -50 KPX V O -50 KPX V Oacute -50 KPX V Ocircumflex -50 KPX V Odieresis -50 KPX V Ograve -50 KPX V Ohungarumlaut -50 KPX V Omacron -50 KPX V Oslash -50 KPX V Otilde -50 KPX V a -60 KPX V aacute -60 KPX V abreve -60 KPX V acircumflex -60 KPX V adieresis -60 KPX V agrave -60 KPX V amacron -60 KPX V aogonek -60 KPX V aring -60 KPX V atilde -60 KPX V colon -40 KPX V comma -120 KPX V e -50 KPX V eacute -50 KPX V ecaron -50 KPX V ecircumflex -50 KPX V edieresis -50 KPX V edotaccent -50 KPX V egrave -50 KPX V emacron -50 KPX V eogonek -50 KPX V hyphen -80 KPX V o -90 KPX V oacute -90 KPX V ocircumflex -90 KPX V odieresis -90 KPX V ograve -90 KPX V ohungarumlaut -90 KPX V omacron -90 KPX V oslash -90 KPX V otilde -90 KPX V period -120 KPX V semicolon -40 KPX V u -60 KPX V uacute -60 KPX V ucircumflex -60 KPX V udieresis -60 KPX V ugrave -60 KPX V uhungarumlaut -60 KPX V umacron -60 KPX V uogonek -60 KPX V uring -60 KPX W A -60 KPX W Aacute -60 KPX W Abreve -60 KPX W Acircumflex -60 KPX W Adieresis -60 KPX W Agrave -60 KPX W Amacron -60 KPX W Aogonek -60 KPX W Aring -60 KPX W Atilde -60 KPX W O -20 KPX W Oacute -20 KPX W Ocircumflex -20 KPX W Odieresis -20 KPX W Ograve -20 KPX W Ohungarumlaut -20 KPX W Omacron -20 KPX W Oslash -20 KPX W Otilde -20 KPX W a -40 KPX W aacute -40 KPX W abreve -40 KPX W acircumflex -40 KPX W adieresis -40 KPX W agrave -40 KPX W amacron -40 KPX W aogonek -40 KPX W aring -40 KPX W atilde -40 KPX W colon -10 KPX W comma -80 KPX W e -35 KPX W eacute -35 KPX W ecaron -35 KPX W ecircumflex -35 KPX W edieresis -35 KPX W edotaccent -35 KPX W egrave -35 KPX W emacron -35 KPX W eogonek -35 KPX W hyphen -40 KPX W o -60 KPX W oacute -60 KPX W ocircumflex -60 KPX W odieresis -60 KPX W ograve -60 KPX W ohungarumlaut -60 KPX W omacron -60 KPX W oslash -60 KPX W otilde -60 KPX W period -80 KPX W semicolon -10 KPX W u -45 KPX W uacute -45 KPX W ucircumflex -45 KPX W udieresis -45 KPX W ugrave -45 KPX W uhungarumlaut -45 KPX W umacron -45 KPX W uogonek -45 KPX W uring -45 KPX W y -20 KPX W yacute -20 KPX W ydieresis -20 KPX Y A -110 KPX Y Aacute -110 KPX Y Abreve -110 KPX Y Acircumflex -110 KPX Y Adieresis -110 KPX Y Agrave -110 KPX Y Amacron -110 KPX Y Aogonek -110 KPX Y Aring -110 KPX Y Atilde -110 KPX Y O -70 KPX Y Oacute -70 KPX Y Ocircumflex -70 KPX Y Odieresis -70 KPX Y Ograve -70 KPX Y Ohungarumlaut -70 KPX Y Omacron -70 KPX Y Oslash -70 KPX Y Otilde -70 KPX Y a -90 KPX Y aacute -90 KPX Y abreve -90 KPX Y acircumflex -90 KPX Y adieresis -90 KPX Y agrave -90 KPX Y amacron -90 KPX Y aogonek -90 KPX Y aring -90 KPX Y atilde -90 KPX Y colon -50 KPX Y comma -100 KPX Y e -80 KPX Y eacute -80 KPX Y ecaron -80 KPX Y ecircumflex -80 KPX Y edieresis -80 KPX Y edotaccent -80 KPX Y egrave -80 KPX Y emacron -80 KPX Y eogonek -80 KPX Y o -100 KPX Y oacute -100 KPX Y ocircumflex -100 KPX Y odieresis -100 KPX Y ograve -100 KPX Y ohungarumlaut -100 KPX Y omacron -100 KPX Y oslash -100 KPX Y otilde -100 KPX Y period -100 KPX Y semicolon -50 KPX Y u -100 KPX Y uacute -100 KPX Y ucircumflex -100 KPX Y udieresis -100 KPX Y ugrave -100 KPX Y uhungarumlaut -100 KPX Y umacron -100 KPX Y uogonek -100 KPX Y uring -100 KPX Yacute A -110 KPX Yacute Aacute -110 KPX Yacute Abreve -110 KPX Yacute Acircumflex -110 KPX Yacute Adieresis -110 KPX Yacute Agrave -110 KPX Yacute Amacron -110 KPX Yacute Aogonek -110 KPX Yacute Aring -110 KPX Yacute Atilde -110 KPX Yacute O -70 KPX Yacute Oacute -70 KPX Yacute Ocircumflex -70 KPX Yacute Odieresis -70 KPX Yacute Ograve -70 KPX Yacute Ohungarumlaut -70 KPX Yacute Omacron -70 KPX Yacute Oslash -70 KPX Yacute Otilde -70 KPX Yacute a -90 KPX Yacute aacute -90 KPX Yacute abreve -90 KPX Yacute acircumflex -90 KPX Yacute adieresis -90 KPX Yacute agrave -90 KPX Yacute amacron -90 KPX Yacute aogonek -90 KPX Yacute aring -90 KPX Yacute atilde -90 KPX Yacute colon -50 KPX Yacute comma -100 KPX Yacute e -80 KPX Yacute eacute -80 KPX Yacute ecaron -80 KPX Yacute ecircumflex -80 KPX Yacute edieresis -80 KPX Yacute edotaccent -80 KPX Yacute egrave -80 KPX Yacute emacron -80 KPX Yacute eogonek -80 KPX Yacute o -100 KPX Yacute oacute -100 KPX Yacute ocircumflex -100 KPX Yacute odieresis -100 KPX Yacute ograve -100 KPX Yacute ohungarumlaut -100 KPX Yacute omacron -100 KPX Yacute oslash -100 KPX Yacute otilde -100 KPX Yacute period -100 KPX Yacute semicolon -50 KPX Yacute u -100 KPX Yacute uacute -100 KPX Yacute ucircumflex -100 KPX Yacute udieresis -100 KPX Yacute ugrave -100 KPX Yacute uhungarumlaut -100 KPX Yacute umacron -100 KPX Yacute uogonek -100 KPX Yacute uring -100 KPX Ydieresis A -110 KPX Ydieresis Aacute -110 KPX Ydieresis Abreve -110 KPX Ydieresis Acircumflex -110 KPX Ydieresis Adieresis -110 KPX Ydieresis Agrave -110 KPX Ydieresis Amacron -110 KPX Ydieresis Aogonek -110 KPX Ydieresis Aring -110 KPX Ydieresis Atilde -110 KPX Ydieresis O -70 KPX Ydieresis Oacute -70 KPX Ydieresis Ocircumflex -70 KPX Ydieresis Odieresis -70 KPX Ydieresis Ograve -70 KPX Ydieresis Ohungarumlaut -70 KPX Ydieresis Omacron -70 KPX Ydieresis Oslash -70 KPX Ydieresis Otilde -70 KPX Ydieresis a -90 KPX Ydieresis aacute -90 KPX Ydieresis abreve -90 KPX Ydieresis acircumflex -90 KPX Ydieresis adieresis -90 KPX Ydieresis agrave -90 KPX Ydieresis amacron -90 KPX Ydieresis aogonek -90 KPX Ydieresis aring -90 KPX Ydieresis atilde -90 KPX Ydieresis colon -50 KPX Ydieresis comma -100 KPX Ydieresis e -80 KPX Ydieresis eacute -80 KPX Ydieresis ecaron -80 KPX Ydieresis ecircumflex -80 KPX Ydieresis edieresis -80 KPX Ydieresis edotaccent -80 KPX Ydieresis egrave -80 KPX Ydieresis emacron -80 KPX Ydieresis eogonek -80 KPX Ydieresis o -100 KPX Ydieresis oacute -100 KPX Ydieresis ocircumflex -100 KPX Ydieresis odieresis -100 KPX Ydieresis ograve -100 KPX Ydieresis ohungarumlaut -100 KPX Ydieresis omacron -100 KPX Ydieresis oslash -100 KPX Ydieresis otilde -100 KPX Ydieresis period -100 KPX Ydieresis semicolon -50 KPX Ydieresis u -100 KPX Ydieresis uacute -100 KPX Ydieresis ucircumflex -100 KPX Ydieresis udieresis -100 KPX Ydieresis ugrave -100 KPX Ydieresis uhungarumlaut -100 KPX Ydieresis umacron -100 KPX Ydieresis uogonek -100 KPX Ydieresis uring -100 KPX a g -10 KPX a gbreve -10 KPX a gcommaaccent -10 KPX a v -15 KPX a w -15 KPX a y -20 KPX a yacute -20 KPX a ydieresis -20 KPX aacute g -10 KPX aacute gbreve -10 KPX aacute gcommaaccent -10 KPX aacute v -15 KPX aacute w -15 KPX aacute y -20 KPX aacute yacute -20 KPX aacute ydieresis -20 KPX abreve g -10 KPX abreve gbreve -10 KPX abreve gcommaaccent -10 KPX abreve v -15 KPX abreve w -15 KPX abreve y -20 KPX abreve yacute -20 KPX abreve ydieresis -20 KPX acircumflex g -10 KPX acircumflex gbreve -10 KPX acircumflex gcommaaccent -10 KPX acircumflex v -15 KPX acircumflex w -15 KPX acircumflex y -20 KPX acircumflex yacute -20 KPX acircumflex ydieresis -20 KPX adieresis g -10 KPX adieresis gbreve -10 KPX adieresis gcommaaccent -10 KPX adieresis v -15 KPX adieresis w -15 KPX adieresis y -20 KPX adieresis yacute -20 KPX adieresis ydieresis -20 KPX agrave g -10 KPX agrave gbreve -10 KPX agrave gcommaaccent -10 KPX agrave v -15 KPX agrave w -15 KPX agrave y -20 KPX agrave yacute -20 KPX agrave ydieresis -20 KPX amacron g -10 KPX amacron gbreve -10 KPX amacron gcommaaccent -10 KPX amacron v -15 KPX amacron w -15 KPX amacron y -20 KPX amacron yacute -20 KPX amacron ydieresis -20 KPX aogonek g -10 KPX aogonek gbreve -10 KPX aogonek gcommaaccent -10 KPX aogonek v -15 KPX aogonek w -15 KPX aogonek y -20 KPX aogonek yacute -20 KPX aogonek ydieresis -20 KPX aring g -10 KPX aring gbreve -10 KPX aring gcommaaccent -10 KPX aring v -15 KPX aring w -15 KPX aring y -20 KPX aring yacute -20 KPX aring ydieresis -20 KPX atilde g -10 KPX atilde gbreve -10 KPX atilde gcommaaccent -10 KPX atilde v -15 KPX atilde w -15 KPX atilde y -20 KPX atilde yacute -20 KPX atilde ydieresis -20 KPX b l -10 KPX b lacute -10 KPX b lcommaaccent -10 KPX b lslash -10 KPX b u -20 KPX b uacute -20 KPX b ucircumflex -20 KPX b udieresis -20 KPX b ugrave -20 KPX b uhungarumlaut -20 KPX b umacron -20 KPX b uogonek -20 KPX b uring -20 KPX b v -20 KPX b y -20 KPX b yacute -20 KPX b ydieresis -20 KPX c h -10 KPX c k -20 KPX c kcommaaccent -20 KPX c l -20 KPX c lacute -20 KPX c lcommaaccent -20 KPX c lslash -20 KPX c y -10 KPX c yacute -10 KPX c ydieresis -10 KPX cacute h -10 KPX cacute k -20 KPX cacute kcommaaccent -20 KPX cacute l -20 KPX cacute lacute -20 KPX cacute lcommaaccent -20 KPX cacute lslash -20 KPX cacute y -10 KPX cacute yacute -10 KPX cacute ydieresis -10 KPX ccaron h -10 KPX ccaron k -20 KPX ccaron kcommaaccent -20 KPX ccaron l -20 KPX ccaron lacute -20 KPX ccaron lcommaaccent -20 KPX ccaron lslash -20 KPX ccaron y -10 KPX ccaron yacute -10 KPX ccaron ydieresis -10 KPX ccedilla h -10 KPX ccedilla k -20 KPX ccedilla kcommaaccent -20 KPX ccedilla l -20 KPX ccedilla lacute -20 KPX ccedilla lcommaaccent -20 KPX ccedilla lslash -20 KPX ccedilla y -10 KPX ccedilla yacute -10 KPX ccedilla ydieresis -10 KPX colon space -40 KPX comma quotedblright -120 KPX comma quoteright -120 KPX comma space -40 KPX d d -10 KPX d dcroat -10 KPX d v -15 KPX d w -15 KPX d y -15 KPX d yacute -15 KPX d ydieresis -15 KPX dcroat d -10 KPX dcroat dcroat -10 KPX dcroat v -15 KPX dcroat w -15 KPX dcroat y -15 KPX dcroat yacute -15 KPX dcroat ydieresis -15 KPX e comma 10 KPX e period 20 KPX e v -15 KPX e w -15 KPX e x -15 KPX e y -15 KPX e yacute -15 KPX e ydieresis -15 KPX eacute comma 10 KPX eacute period 20 KPX eacute v -15 KPX eacute w -15 KPX eacute x -15 KPX eacute y -15 KPX eacute yacute -15 KPX eacute ydieresis -15 KPX ecaron comma 10 KPX ecaron period 20 KPX ecaron v -15 KPX ecaron w -15 KPX ecaron x -15 KPX ecaron y -15 KPX ecaron yacute -15 KPX ecaron ydieresis -15 KPX ecircumflex comma 10 KPX ecircumflex period 20 KPX ecircumflex v -15 KPX ecircumflex w -15 KPX ecircumflex x -15 KPX ecircumflex y -15 KPX ecircumflex yacute -15 KPX ecircumflex ydieresis -15 KPX edieresis comma 10 KPX edieresis period 20 KPX edieresis v -15 KPX edieresis w -15 KPX edieresis x -15 KPX edieresis y -15 KPX edieresis yacute -15 KPX edieresis ydieresis -15 KPX edotaccent comma 10 KPX edotaccent period 20 KPX edotaccent v -15 KPX edotaccent w -15 KPX edotaccent x -15 KPX edotaccent y -15 KPX edotaccent yacute -15 KPX edotaccent ydieresis -15 KPX egrave comma 10 KPX egrave period 20 KPX egrave v -15 KPX egrave w -15 KPX egrave x -15 KPX egrave y -15 KPX egrave yacute -15 KPX egrave ydieresis -15 KPX emacron comma 10 KPX emacron period 20 KPX emacron v -15 KPX emacron w -15 KPX emacron x -15 KPX emacron y -15 KPX emacron yacute -15 KPX emacron ydieresis -15 KPX eogonek comma 10 KPX eogonek period 20 KPX eogonek v -15 KPX eogonek w -15 KPX eogonek x -15 KPX eogonek y -15 KPX eogonek yacute -15 KPX eogonek ydieresis -15 KPX f comma -10 KPX f e -10 KPX f eacute -10 KPX f ecaron -10 KPX f ecircumflex -10 KPX f edieresis -10 KPX f edotaccent -10 KPX f egrave -10 KPX f emacron -10 KPX f eogonek -10 KPX f o -20 KPX f oacute -20 KPX f ocircumflex -20 KPX f odieresis -20 KPX f ograve -20 KPX f ohungarumlaut -20 KPX f omacron -20 KPX f oslash -20 KPX f otilde -20 KPX f period -10 KPX f quotedblright 30 KPX f quoteright 30 KPX g e 10 KPX g eacute 10 KPX g ecaron 10 KPX g ecircumflex 10 KPX g edieresis 10 KPX g edotaccent 10 KPX g egrave 10 KPX g emacron 10 KPX g eogonek 10 KPX g g -10 KPX g gbreve -10 KPX g gcommaaccent -10 KPX gbreve e 10 KPX gbreve eacute 10 KPX gbreve ecaron 10 KPX gbreve ecircumflex 10 KPX gbreve edieresis 10 KPX gbreve edotaccent 10 KPX gbreve egrave 10 KPX gbreve emacron 10 KPX gbreve eogonek 10 KPX gbreve g -10 KPX gbreve gbreve -10 KPX gbreve gcommaaccent -10 KPX gcommaaccent e 10 KPX gcommaaccent eacute 10 KPX gcommaaccent ecaron 10 KPX gcommaaccent ecircumflex 10 KPX gcommaaccent edieresis 10 KPX gcommaaccent edotaccent 10 KPX gcommaaccent egrave 10 KPX gcommaaccent emacron 10 KPX gcommaaccent eogonek 10 KPX gcommaaccent g -10 KPX gcommaaccent gbreve -10 KPX gcommaaccent gcommaaccent -10 KPX h y -20 KPX h yacute -20 KPX h ydieresis -20 KPX k o -15 KPX k oacute -15 KPX k ocircumflex -15 KPX k odieresis -15 KPX k ograve -15 KPX k ohungarumlaut -15 KPX k omacron -15 KPX k oslash -15 KPX k otilde -15 KPX kcommaaccent o -15 KPX kcommaaccent oacute -15 KPX kcommaaccent ocircumflex -15 KPX kcommaaccent odieresis -15 KPX kcommaaccent ograve -15 KPX kcommaaccent ohungarumlaut -15 KPX kcommaaccent omacron -15 KPX kcommaaccent oslash -15 KPX kcommaaccent otilde -15 KPX l w -15 KPX l y -15 KPX l yacute -15 KPX l ydieresis -15 KPX lacute w -15 KPX lacute y -15 KPX lacute yacute -15 KPX lacute ydieresis -15 KPX lcommaaccent w -15 KPX lcommaaccent y -15 KPX lcommaaccent yacute -15 KPX lcommaaccent ydieresis -15 KPX lslash w -15 KPX lslash y -15 KPX lslash yacute -15 KPX lslash ydieresis -15 KPX m u -20 KPX m uacute -20 KPX m ucircumflex -20 KPX m udieresis -20 KPX m ugrave -20 KPX m uhungarumlaut -20 KPX m umacron -20 KPX m uogonek -20 KPX m uring -20 KPX m y -30 KPX m yacute -30 KPX m ydieresis -30 KPX n u -10 KPX n uacute -10 KPX n ucircumflex -10 KPX n udieresis -10 KPX n ugrave -10 KPX n uhungarumlaut -10 KPX n umacron -10 KPX n uogonek -10 KPX n uring -10 KPX n v -40 KPX n y -20 KPX n yacute -20 KPX n ydieresis -20 KPX nacute u -10 KPX nacute uacute -10 KPX nacute ucircumflex -10 KPX nacute udieresis -10 KPX nacute ugrave -10 KPX nacute uhungarumlaut -10 KPX nacute umacron -10 KPX nacute uogonek -10 KPX nacute uring -10 KPX nacute v -40 KPX nacute y -20 KPX nacute yacute -20 KPX nacute ydieresis -20 KPX ncaron u -10 KPX ncaron uacute -10 KPX ncaron ucircumflex -10 KPX ncaron udieresis -10 KPX ncaron ugrave -10 KPX ncaron uhungarumlaut -10 KPX ncaron umacron -10 KPX ncaron uogonek -10 KPX ncaron uring -10 KPX ncaron v -40 KPX ncaron y -20 KPX ncaron yacute -20 KPX ncaron ydieresis -20 KPX ncommaaccent u -10 KPX ncommaaccent uacute -10 KPX ncommaaccent ucircumflex -10 KPX ncommaaccent udieresis -10 KPX ncommaaccent ugrave -10 KPX ncommaaccent uhungarumlaut -10 KPX ncommaaccent umacron -10 KPX ncommaaccent uogonek -10 KPX ncommaaccent uring -10 KPX ncommaaccent v -40 KPX ncommaaccent y -20 KPX ncommaaccent yacute -20 KPX ncommaaccent ydieresis -20 KPX ntilde u -10 KPX ntilde uacute -10 KPX ntilde ucircumflex -10 KPX ntilde udieresis -10 KPX ntilde ugrave -10 KPX ntilde uhungarumlaut -10 KPX ntilde umacron -10 KPX ntilde uogonek -10 KPX ntilde uring -10 KPX ntilde v -40 KPX ntilde y -20 KPX ntilde yacute -20 KPX ntilde ydieresis -20 KPX o v -20 KPX o w -15 KPX o x -30 KPX o y -20 KPX o yacute -20 KPX o ydieresis -20 KPX oacute v -20 KPX oacute w -15 KPX oacute x -30 KPX oacute y -20 KPX oacute yacute -20 KPX oacute ydieresis -20 KPX ocircumflex v -20 KPX ocircumflex w -15 KPX ocircumflex x -30 KPX ocircumflex y -20 KPX ocircumflex yacute -20 KPX ocircumflex ydieresis -20 KPX odieresis v -20 KPX odieresis w -15 KPX odieresis x -30 KPX odieresis y -20 KPX odieresis yacute -20 KPX odieresis ydieresis -20 KPX ograve v -20 KPX ograve w -15 KPX ograve x -30 KPX ograve y -20 KPX ograve yacute -20 KPX ograve ydieresis -20 KPX ohungarumlaut v -20 KPX ohungarumlaut w -15 KPX ohungarumlaut x -30 KPX ohungarumlaut y -20 KPX ohungarumlaut yacute -20 KPX ohungarumlaut ydieresis -20 KPX omacron v -20 KPX omacron w -15 KPX omacron x -30 KPX omacron y -20 KPX omacron yacute -20 KPX omacron ydieresis -20 KPX oslash v -20 KPX oslash w -15 KPX oslash x -30 KPX oslash y -20 KPX oslash yacute -20 KPX oslash ydieresis -20 KPX otilde v -20 KPX otilde w -15 KPX otilde x -30 KPX otilde y -20 KPX otilde yacute -20 KPX otilde ydieresis -20 KPX p y -15 KPX p yacute -15 KPX p ydieresis -15 KPX period quotedblright -120 KPX period quoteright -120 KPX period space -40 KPX quotedblright space -80 KPX quoteleft quoteleft -46 KPX quoteright d -80 KPX quoteright dcroat -80 KPX quoteright l -20 KPX quoteright lacute -20 KPX quoteright lcommaaccent -20 KPX quoteright lslash -20 KPX quoteright quoteright -46 KPX quoteright r -40 KPX quoteright racute -40 KPX quoteright rcaron -40 KPX quoteright rcommaaccent -40 KPX quoteright s -60 KPX quoteright sacute -60 KPX quoteright scaron -60 KPX quoteright scedilla -60 KPX quoteright scommaaccent -60 KPX quoteright space -80 KPX quoteright v -20 KPX r c -20 KPX r cacute -20 KPX r ccaron -20 KPX r ccedilla -20 KPX r comma -60 KPX r d -20 KPX r dcroat -20 KPX r g -15 KPX r gbreve -15 KPX r gcommaaccent -15 KPX r hyphen -20 KPX r o -20 KPX r oacute -20 KPX r ocircumflex -20 KPX r odieresis -20 KPX r ograve -20 KPX r ohungarumlaut -20 KPX r omacron -20 KPX r oslash -20 KPX r otilde -20 KPX r period -60 KPX r q -20 KPX r s -15 KPX r sacute -15 KPX r scaron -15 KPX r scedilla -15 KPX r scommaaccent -15 KPX r t 20 KPX r tcommaaccent 20 KPX r v 10 KPX r y 10 KPX r yacute 10 KPX r ydieresis 10 KPX racute c -20 KPX racute cacute -20 KPX racute ccaron -20 KPX racute ccedilla -20 KPX racute comma -60 KPX racute d -20 KPX racute dcroat -20 KPX racute g -15 KPX racute gbreve -15 KPX racute gcommaaccent -15 KPX racute hyphen -20 KPX racute o -20 KPX racute oacute -20 KPX racute ocircumflex -20 KPX racute odieresis -20 KPX racute ograve -20 KPX racute ohungarumlaut -20 KPX racute omacron -20 KPX racute oslash -20 KPX racute otilde -20 KPX racute period -60 KPX racute q -20 KPX racute s -15 KPX racute sacute -15 KPX racute scaron -15 KPX racute scedilla -15 KPX racute scommaaccent -15 KPX racute t 20 KPX racute tcommaaccent 20 KPX racute v 10 KPX racute y 10 KPX racute yacute 10 KPX racute ydieresis 10 KPX rcaron c -20 KPX rcaron cacute -20 KPX rcaron ccaron -20 KPX rcaron ccedilla -20 KPX rcaron comma -60 KPX rcaron d -20 KPX rcaron dcroat -20 KPX rcaron g -15 KPX rcaron gbreve -15 KPX rcaron gcommaaccent -15 KPX rcaron hyphen -20 KPX rcaron o -20 KPX rcaron oacute -20 KPX rcaron ocircumflex -20 KPX rcaron odieresis -20 KPX rcaron ograve -20 KPX rcaron ohungarumlaut -20 KPX rcaron omacron -20 KPX rcaron oslash -20 KPX rcaron otilde -20 KPX rcaron period -60 KPX rcaron q -20 KPX rcaron s -15 KPX rcaron sacute -15 KPX rcaron scaron -15 KPX rcaron scedilla -15 KPX rcaron scommaaccent -15 KPX rcaron t 20 KPX rcaron tcommaaccent 20 KPX rcaron v 10 KPX rcaron y 10 KPX rcaron yacute 10 KPX rcaron ydieresis 10 KPX rcommaaccent c -20 KPX rcommaaccent cacute -20 KPX rcommaaccent ccaron -20 KPX rcommaaccent ccedilla -20 KPX rcommaaccent comma -60 KPX rcommaaccent d -20 KPX rcommaaccent dcroat -20 KPX rcommaaccent g -15 KPX rcommaaccent gbreve -15 KPX rcommaaccent gcommaaccent -15 KPX rcommaaccent hyphen -20 KPX rcommaaccent o -20 KPX rcommaaccent oacute -20 KPX rcommaaccent ocircumflex -20 KPX rcommaaccent odieresis -20 KPX rcommaaccent ograve -20 KPX rcommaaccent ohungarumlaut -20 KPX rcommaaccent omacron -20 KPX rcommaaccent oslash -20 KPX rcommaaccent otilde -20 KPX rcommaaccent period -60 KPX rcommaaccent q -20 KPX rcommaaccent s -15 KPX rcommaaccent sacute -15 KPX rcommaaccent scaron -15 KPX rcommaaccent scedilla -15 KPX rcommaaccent scommaaccent -15 KPX rcommaaccent t 20 KPX rcommaaccent tcommaaccent 20 KPX rcommaaccent v 10 KPX rcommaaccent y 10 KPX rcommaaccent yacute 10 KPX rcommaaccent ydieresis 10 KPX s w -15 KPX sacute w -15 KPX scaron w -15 KPX scedilla w -15 KPX scommaaccent w -15 KPX semicolon space -40 KPX space T -100 KPX space Tcaron -100 KPX space Tcommaaccent -100 KPX space V -80 KPX space W -80 KPX space Y -120 KPX space Yacute -120 KPX space Ydieresis -120 KPX space quotedblleft -80 KPX space quoteleft -60 KPX v a -20 KPX v aacute -20 KPX v abreve -20 KPX v acircumflex -20 KPX v adieresis -20 KPX v agrave -20 KPX v amacron -20 KPX v aogonek -20 KPX v aring -20 KPX v atilde -20 KPX v comma -80 KPX v o -30 KPX v oacute -30 KPX v ocircumflex -30 KPX v odieresis -30 KPX v ograve -30 KPX v ohungarumlaut -30 KPX v omacron -30 KPX v oslash -30 KPX v otilde -30 KPX v period -80 KPX w comma -40 KPX w o -20 KPX w oacute -20 KPX w ocircumflex -20 KPX w odieresis -20 KPX w ograve -20 KPX w ohungarumlaut -20 KPX w omacron -20 KPX w oslash -20 KPX w otilde -20 KPX w period -40 KPX x e -10 KPX x eacute -10 KPX x ecaron -10 KPX x ecircumflex -10 KPX x edieresis -10 KPX x edotaccent -10 KPX x egrave -10 KPX x emacron -10 KPX x eogonek -10 KPX y a -30 KPX y aacute -30 KPX y abreve -30 KPX y acircumflex -30 KPX y adieresis -30 KPX y agrave -30 KPX y amacron -30 KPX y aogonek -30 KPX y aring -30 KPX y atilde -30 KPX y comma -80 KPX y e -10 KPX y eacute -10 KPX y ecaron -10 KPX y ecircumflex -10 KPX y edieresis -10 KPX y edotaccent -10 KPX y egrave -10 KPX y emacron -10 KPX y eogonek -10 KPX y o -25 KPX y oacute -25 KPX y ocircumflex -25 KPX y odieresis -25 KPX y ograve -25 KPX y ohungarumlaut -25 KPX y omacron -25 KPX y oslash -25 KPX y otilde -25 KPX y period -80 KPX yacute a -30 KPX yacute aacute -30 KPX yacute abreve -30 KPX yacute acircumflex -30 KPX yacute adieresis -30 KPX yacute agrave -30 KPX yacute amacron -30 KPX yacute aogonek -30 KPX yacute aring -30 KPX yacute atilde -30 KPX yacute comma -80 KPX yacute e -10 KPX yacute eacute -10 KPX yacute ecaron -10 KPX yacute ecircumflex -10 KPX yacute edieresis -10 KPX yacute edotaccent -10 KPX yacute egrave -10 KPX yacute emacron -10 KPX yacute eogonek -10 KPX yacute o -25 KPX yacute oacute -25 KPX yacute ocircumflex -25 KPX yacute odieresis -25 KPX yacute ograve -25 KPX yacute ohungarumlaut -25 KPX yacute omacron -25 KPX yacute oslash -25 KPX yacute otilde -25 KPX yacute period -80 KPX ydieresis a -30 KPX ydieresis aacute -30 KPX ydieresis abreve -30 KPX ydieresis acircumflex -30 KPX ydieresis adieresis -30 KPX ydieresis agrave -30 KPX ydieresis amacron -30 KPX ydieresis aogonek -30 KPX ydieresis aring -30 KPX ydieresis atilde -30 KPX ydieresis comma -80 KPX ydieresis e -10 KPX ydieresis eacute -10 KPX ydieresis ecaron -10 KPX ydieresis ecircumflex -10 KPX ydieresis edieresis -10 KPX ydieresis edotaccent -10 KPX ydieresis egrave -10 KPX ydieresis emacron -10 KPX ydieresis eogonek -10 KPX ydieresis o -25 KPX ydieresis oacute -25 KPX ydieresis ocircumflex -25 KPX ydieresis odieresis -25 KPX ydieresis ograve -25 KPX ydieresis ohungarumlaut -25 KPX ydieresis omacron -25 KPX ydieresis oslash -25 KPX ydieresis otilde -25 KPX ydieresis period -80 KPX z e 10 KPX z eacute 10 KPX z ecaron 10 KPX z ecircumflex 10 KPX z edieresis 10 KPX z edotaccent 10 KPX z egrave 10 KPX z emacron 10 KPX z eogonek 10 KPX zacute e 10 KPX zacute eacute 10 KPX zacute ecaron 10 KPX zacute ecircumflex 10 KPX zacute edieresis 10 KPX zacute edotaccent 10 KPX zacute egrave 10 KPX zacute emacron 10 KPX zacute eogonek 10 KPX zcaron e 10 KPX zcaron eacute 10 KPX zcaron ecaron 10 KPX zcaron ecircumflex 10 KPX zcaron edieresis 10 KPX zcaron edotaccent 10 KPX zcaron egrave 10 KPX zcaron emacron 10 KPX zcaron eogonek 10 KPX zdotaccent e 10 KPX zdotaccent eacute 10 KPX zdotaccent ecaron 10 KPX zdotaccent ecircumflex 10 KPX zdotaccent edieresis 10 KPX zdotaccent edotaccent 10 KPX zdotaccent egrave 10 KPX zdotaccent emacron 10 KPX zdotaccent eogonek 10 EndKernPairs EndKernData EndFontMetrics ruby-prawn-2.1.0.orig/data/pdfs/0000755000000000000000000000000012665203156015130 5ustar rootrootruby-prawn-2.1.0.orig/data/pdfs/resources_as_indirect_object.pdf0000644000000000000000000000201212665203156023522 0ustar rootroot%PDF-1.3 % 1 0 obj << /Creator (Prawn) /Producer (Prawn) >> endobj 2 0 obj << /Type /Pages /Count 1 /Kids [5 0 R] >> endobj 3 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 4 0 obj << /Length 275 >> stream 0.000 0.000 0.000 rg 0.000 0.000 0.000 RG q 0.000 0.000 1.000 rg BT 36 733.024 Td /F1.0 32 Tf [<412073616d706c65205044462074686174206861732074686520706167650a>] TJ ET BT 36 696.032 Td /F1.0 32 Tf [<7265736f757263657320617320616e20696e646972656374206f626a656374>] TJ ET Q endstream endobj 5 0 obj << /Resources 6 0 R /Type /Page /Contents 4 0 R /MediaBox [0 0 612.0 792.0] /Parent 2 0 R >> endobj 6 0 obj << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F1.0 7 0 R >> >> endobj 7 0 obj << /Subtype /Type1 /Type /Font /Encoding /WinAnsiEncoding /BaseFont /Helvetica >> endobj xref 0 8 0000000000 65535 f 0000000015 00000 n 0000000071 00000 n 0000000128 00000 n 0000000177 00000 n 0000000503 00000 n 0000000611 00000 n 0000000702 00000 n trailer << /Size 8 /Info 1 0 R /Root 3 0 R >> startxref 799 %%EOF ruby-prawn-2.1.0.orig/data/pdfs/hexagon.pdf0000644000000000000000000000130512665203156017253 0ustar rootroot%PDF-1.3 % 1 0 obj << /Creator (Prawn) /Producer (Prawn) >> endobj 2 0 obj << /Kids [5 0 R] /Type /Pages /Count 1 >> endobj 3 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 4 0 obj << /Length 195 >> stream 0.000 0.000 0.000 rg 0.000 0.000 0.000 RG q 1.000 0.000 0.000 rg 136.000 286.000 m 236.000 336.000 l 336.000 286.000 l 336.000 186.000 l 236.000 136.000 l 136.000 186.000 l 136.000 286.000 l f Q endstream endobj 5 0 obj << /Contents 4 0 R /Type /Page /MediaBox [0 0 612.0 792.0] /Parent 2 0 R >> endobj xref 0 6 0000000000 65535 f 0000000015 00000 n 0000000071 00000 n 0000000128 00000 n 0000000177 00000 n 0000000423 00000 n trailer << /Info 1 0 R /Size 6 /Root 3 0 R >> startxref 514 %%EOF ruby-prawn-2.1.0.orig/data/pdfs/form.pdf0000644000000000000000000026566012665203156016605 0ustar rootroot%PDF-1.3 % 1 0 obj << /CreationDate /GTS_PDFXVersion /Creator /Producer /GTS_PDFXConformance /ModDate /Title /Trapped /False >> endobj 2 0 obj << /Metadata 3 0 R /Pages 4 0 R /Type /Catalog >> endobj 3 0 obj << /Subtype /XML /Length 16724 /Type /Metadata >> stream application/pdf slip Adobe Illustrator CS3 2010-04-23T21:02:21-07:00 2010-04-23T21:02:21-07:00 2010-04-23T21:02:21-07:00 220 256 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADcAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYqw Dzp+dnkzyvLJZmR9S1OMlWtLQBgjDtJKaIu+xAqR4ZnYNBkyb8h5uFm1+OBrmXn11/zkvrrXckdp oFvFHGGNJZnlYhRWtVWIb/LM+PZEesi66XbJoEAI7Rv+cm4TxOuaG8MJbibizlEhrTf91IE6f6+V 5OyD/DL5tuPtcXUh8nqWkec9K8w6RJqHlmSPU5IwC1qzmCQEioVg6kqT2qKHxzWz05hKp+n7XPGp 44GWP1EdLpht3+eP1O4ktrrQJYbiJuMkTzhWUjsQY8zo9mWLEvs/a6OXtEYmjjII8/2Ic/n/AGw/ 6Ur/APSQP+qeS/ko/wA77P2o/wBEg/mf7L9i0/8AOQNsP+lI/wD0kD/qnj/JR/nfZ+1P+iMfzP8A ZfsWn/nIW1H/AEo3/wCkgf8AVPH+ST/O+z9rL/REP5n+y/YtP/ORFqP+lG//AEkj/qnj/JJ/nfZ+ 1P8Aog/of7L9i0/85F2o/wClE/8A0kj/AKp4f5JP877P2p/l/wDofb+xYf8AnI61H/Shk/6SR/1T x/kk/wA77P2p/l7+h9v7Fp/5yStB/wBKGT/pJH/VLH+ST/O+z9rL+Xf6H2/sWn/nJW0H/Sgk/wCk lf8Aqlj/ACSf532ftT/Lf9D7f2LD/wA5MWg/6Z+T/pKX/qlj/JB/nfZ+1P8ALX9D7f2LT/zk5Zj/ AKZ+T/pKX/qlj/JB/nfZ+1l/LP8AR+39iw/85P2Y/wCmek/6Sl/6pY/yQf532ftT/K/9H7f2ND/n KKx5Dl5elC13IulJp8vSGH+SD/O+z9rIdrf0ft/Yyzyv+fXkHXJktpZ5NJu3ICx3wCRsx7LKpZP+ CK5i5uzssN/qHk5WLtDHPY7e96MCCAQag7gjMBznYq7FXYq7FXYq7FXYq7FXiX51fmneR6ivkzy7 O8d1KRHqV7Af3itJ8K28Z7NuC5Br+z45uOz9GK8SfLp+t0/aGsI9GM79f1Jt5h/KDyNqOq3V7LHc wSTzNPJFbyIsRkb7bBWR2XmdzRs038v5cQ4KBpycnZOOc+OyL7v7EXD+Vn5bt10puZX0zL9Yn5ca U6epxr9GQh2/mJ5/YEnsfT1Vfaf1vOPzH/KJPLsEF/p8z3WhKxEpkAM0TtSnqFAqlWI2ag8PCvS6 DtEZ9jtL73Qdo6CWn9cTcTt7mBaXq2teXNUXXNOuWtL0GkaL0df5JF6FNuhzPy4ozjUhs42m1MoE cB5dXtGuDTPzF8jp5v0uIQ61Ypx1K1X7REY+NT48R8aN3Xbr01GEy0+Tw5fSeTsO0tPHU4vGh9ce fu/Z08nlTZtnlUbqXl3XtOtkur/T7i1tpGCRzSxsiszAsACR3AJyEMsJGgQS5M9PkgLlEgeYS+1s 7u9uY7Wzhe4uZTSOGNSzsaV2A3ycpACzyRCBkaAsq2reXtd0lI31OwnsllJERnjZORHWnICtK5GG WMvpILbPBPH9UTH3hKmyxiFJsWQUmwtgUmxZBRbCzCm2LMJtN5H84xzWsD6LeLNe8haRmFw0pRC7 cBT4qIOW3bKRqMe54hs5HgT29J38ko1XS9S0u8ey1G2ktLuMAvBMpRwGAYVU77g1yyMxIWDYUxMT RFFL2yaQ9X/Jn85bzy/fwaDrtwZfL87COGaQ1Nmx6EE/7qJ+0P2eo7g63XaETHFH6vvdlo9WYHhl 9P3PqIEEVHTOdd47FXYq7FXYq7FXYql/mLV49G0HUdWkAZbC2luOJ/aMaFgu3iRTLMUOOQj3lryz 4YmXcHy9+VQuNQ/MbTLrUJEuxc3jXM7sQT65DSB6GhDepQ50usHDgkB3PK6ecZaiPFzt9FXYPqtX qDnmef6i9oGDeedT/MOOb6v5VtVjt7eOOa81B4/WdvVk9P07eLfm0agyPt0oBv1lhA6t2MR/iY/5 ludQ8y6Do1p5otpLbULeIzXdvG7Qj1pNo2aNSaMEVWoenIigPSvL2mcGQAC686+52um7IjmxSPFX FsNgfvYzN5TtJHLmQluxZQ1PkNhmyj7a5+sIfa6o+wOH+HLMD3BNNAjl8u294LK9niS8Cm8cycQw jBArTiAByOafX9v6rVEWeGukdvt5vQ9nezul0kSAOL+tv9nJLtdjsYogioqXFQQqgA8WFamnYggj N77LnWyzcUjM4SP4rryq/wBDyPtpHs6GDgxjGM4lygBY7+Kv09eXV6p+dYJ8h6UAKk3kAAH/ADDy 50XZ396fcfvDoO2/8Wh/WH+5LXkXytpvkTy9N5n8wkR6g8dSjAcoUb7MKDvK/f7vEl1WeWefBDl+ PsXQaWOkxHNl+r7vL3n8dXnesQedfzEvL3XbWz9eztCY0hWWICCNRyChXZWY03JA3P3Zn4zi04EC dz9rqsgz6uRyAWB5jZjGgeWNc8xXklno1t9auY4zM6c446IGCk8pGRerDauZOXNHGLkaDi6fTzyy 4YCyoeYfLms+X776hq9sbW6KCURlkeqMSAQ0bMvY98OLLHILibDLNgnilwzFFMNR/LTzzY3FnbXO lOLjUCy2kKPFK7lAGb4Y3YqFB3LUAyuGrxSBIPJyJ6HNAgGO8uSPP5H/AJlFOX6LStK8PrNvX5f3 lPxyv+UcPf8AYXIHZef+b9o/WxOfyt5ih1xdBk0+ZdXZgi2fGrkkVqKbFab8q0pvmSM0DHiv0uP4 MxLgr1dyf3n5KfmVbWj3T6QXVF5PHFNDJJSldkVyzH2WuUDX4Sa4nLPZ+YC+H7nrv5oHzSp8mHys obXg8/1NW9Kn+8Z9T++Ij/u+XX9earScHr4/p2+922r4/wB3wfVv93mwfy5+Xvmrzd+Yt7N5+sTK lvGqam8csMfGQwg24pbvvVKfZ+nMzLqYYsQ8I+79PNxcWmnkynxB7+XdtySjzj+QvnNfMl8vlrRj JoYdfqTtdW9SvBa/3sof7VeoyzB2jj4Bxy9XuK5dBPiPCPT7w8kmRkdkYUZSVYe42zZBww+u/wAi fNE3mD8vLNrlzJd6a7WE7salvSAMZP8AzydRXuc5ntDFwZTXI7u/0WTixjy2ehZguW7FXYq7FXYq 7FWG/nEsjflnr4j6i3Bb/UWRC/Y/sg5l6H++i4utvwpU+Y/KGoQ6frFhqMNvIXsp4p9mrX02DU/Y G9M6XJATiY94ePlkljmJWNjb6suvRkImgbnDKA8bjoVYVBzzTV4uGZD32OQkARyKTeZbzUrHSmns ErJyAkkpyMaUNWpmBqJThC4ux7Nw48mXhyHb7z3PLrzUZGuWkufVlkk+JpgjSVPgeIYj6Rmmoy3J 3exiIwAiBQ8kM95PIONrEw8Z5lKItO5VuLt9Ap7jCIDr8gssm23zPJT8vSaRqXnLStEYtqM91OFm cn4I0QF3KgUUHip3UV8TnSaH2fzzgcmQeHjHT+KX6a9/wDzGu9o8EZDHhPi5D1/hj+gn3fEoj81l iXz7qiRACNPQUBeg428YpnoPZ4rDEfjm+SdsyvVTPu+4PaPNXmjTfLfl/Tb/AFC0N3C00ESqoUsj GNnEg5d1CHNNgwyyTIBrm9Vq9VHBijKQ4hY+7mxv82dDvPNXlmz1nQ7o3dnaq05s491lRhvIoG5d KU4n3pQ7HJ0OQYpmMxRLh9rYTqMQyYzcRvX6feGN/wDOP2piPV9V0xjtcwJOoPjC3EgfMS/hmR2r D0iXcXE7AyVOUe8X8v7Uw/LzS/8AC1p551ZgB+jZJ7W2c/8ALqHkoP8AW5R5DVz8U449+/z/AAW7 s/F4Ec0/5tgfD8Bv8wtHTzHrnkPV405Raq0MVzTcCMlLgD/gGkwaXJ4cckf5v9n6meuxeLPDP+fV /f8ApLPIbqK6/MK5grybS9NjA/yWvJiz/etvHmCY1hB/nS+7+12glxagj+bH7z+wPP7rSvMh8zSa l/ysa0hgF2Zv0f8AXWEaxiSvpGLmEoF+GhXM4ThwV4R5c6daYZOPi8aPPlxfoZdHL5f1T80LG/sr q3vZ7fR7lS8EiSlSLiEL9gmm0zjfxzFInHAQQR6h9xc4GE9QJAg1A/f+14p59/MjzvZ+f9V+qaxc wQ2N28Vvao5EASJuKhovsNXjvUb5ttNpcZxC4jcOo1OryjLKpHY/c9v8wzet5x8iTU4+pNevx605 afIaZp8QrHkHu/3Tu8pvJjPv+5itlqeoR/8AORN/p8dzIljcWiST2wYiN3S1TizL0JHbMmUB+UBr e/0uNGRGrIvb9jzX82fPnnTTvzD1qysNbvbW0hlQRQRTuiKDEhoqg0G5zP0enxyxRJiCXE1WeYyk CR+byiRmZizGrMaknuTmxcQPo3/nFf1f8Pa5WvpfW4+Phy9L4qfRTNF2v9Ufc7js3kXuGah2bsVd irsVdirsVQes6ZBqukXumT7Q30ElvIaVosqFCaHwrk8c+GQkOjDJDiiY9741mtb7StRudO1OUwzW UrwSQody0bFTQL+ztsc6+ExIAjkXidRi4ZEAbvpryDcm+8h6JctUn0DEOVa0hkaJfwQZxHbOIDPK nreypE6eN+75GmR28NSK5rsUHYEvKvzM8yaFb3kum6TZwLcxEi9vlUAhx1RANqj9onvm/wBF7PYJ jjyQG/Tl83Sdo+0+pxnwsMztzPP4C3lOq6i8nwTTSJXeNwxK/cM32n7P0+D+7hGJ7wN/nzedzdoa nUf3k5THcT+jkzf/AJx/0Oe680XfmK9YfUNFgcR3DEcfWmUqaN4LFz5eFRlHamWoCA5ydr2ThiJH JyER+PsSDzJqn6W16/1LcLdTvIgPUIW+AfQtBmXhhwQEe4PNanN4mSU/5xJelfm35l0DUvJenWmn 6hBdXMd1C8kMThmCrBKpJA8CwGazQYZxykkUK/SHoe1tViyaeMYyBII+4sc/Kz8xm8u3o0zUpCdE uW+0d/q8h/bH+Qf2h9PzyddpPEHFH6h9ridldo+DLhl/dn7PP9bIbiXyXov5had5l0TVrT6jdSPF qdokq0iMyFfVUA/Y5EFh+yfbpjAZZ4TCQNjk5sjgxamOXHIcJO47r6+5Ffmf5u8qL5L1Kz0O/t7m 61a5Rp44ZA7CpVpHoOxEQB+eR0eDJ4gMgQIhu7R1WHwZRxkEzlv+Pgq/lv5y8ot5O0WHWtSt7a/0 iWQxRzSBWBAkjRqHt6U1Mjq9Pk8SRiCRL8foZ9n6vF4MROQEoH9f6CxzQPzO0my/NjXdRv5/9xOo 1tYrpAXRRblUhkotTwZUO4HevjmRl0cjgjEfUN3Hwa+MdTKUj6ZbfLkuu/IX5T3WtSa0fOFslhLP 9Yk08yQcvifm0YqwbjvT7HTBHU5xHh4DfezOk05lxeIOG+X4/U63/MP8udF/Mmyn0K3itNE+qy2e oX0EJRWeVldWCU5lUaJRWnc9uqdLmnhIkbldgMo6vDDODAVCqJb82eVfyb1HV7jzNcea40guZPrF 1YW8kUsjt+2EReUq8z/k4MObURiIcHLqzz4NPKRnx7HoyTXPzB8l3Xmjybexatarb20t3JdVlT9w JbF0USUJA+JgvzzHx6bIITFHevvcrJqsZnAg7C/hswe+8/eXNP8Az7bzB9bS40WWJIJLyD94qhrZ U5fDWoVx8VMzI6actNwV6v2uIdREanjv0/sZnFqX5S6L5u1Lz9/ia3mub+D0/qccqSldkDFYo+Uv JvSGxG2/0YZjnnAYuHk5olhjM5OLm+Y9cv11DWL+/RDGl5cSzqh3KiVy4BPtXOgxx4YgdzpybJL6 x/IrytN5e/LyyS5Upd6k7ahOh6r6wURg/wDPJEJ8DnNdoZuPKa5DZ32ix8OMX13eg5hOW7FXYq7F XYq7FXYq8l/Of8pZNfceZNDhEmtQIFurPZfrSIKKQf8AfiDbf7S7dhm00GtGP0S+n7nV9o6I5BxR +r8fayf8vNOvLP8AL/RILyMx3PoerLGy8GUzO0tGU0oRz3zWdqETykhyuz8Xh4YxRXm/V30Lynqm qptLbwn0T4SSERofoZgcr7PwceWMSy1+Y48MpDnX37PlmbVyVindi/Mss1dyTtv89652weEGEkkI zyr5R1/zdqp0nTIjJaghpr5wfSgQ7h2bxI6L1P45Tn1EcUbk7DSaOWUjh59XrHnLUdG8neVYvIfl 1uUhX/cpcj7Z5UL8yP25e/gvw/LWaXHLLPxZ/Bye1dZHFj/L4+f8R/Hf92zy1s2rzKm2FmFJsWYU 2xZBSbCzCk2LIKTYWwKTYsgothZhTbFmFJsWYUXxZhRbCzD1n8mPyavdev7fX9etzDoEDCWCGQUa 7cbqAp/3T/Mf2ug7kazXa4QHDH6vu/a7LR6QzPFL6fvfUAAAoOmc87x2KuxV2KuxV2KuxV2KuxVa yBuuAxtUg87+UV80eXLjRTdGzE5Q/WAnqEcGBpx5J1+eX6XL4M+KrcfVafxocJNMI0b/AJxw8m2j K2pXd3qYVgxhZlhiNPERjn9z5mz7VyHkAHEh2VjBsklnk3lkW2ijSfLksWg2+4LW8AZhXqV+JAGP djU5hxzXLimOL4uRm08jDgxy8P4ftYLJ+Q8Mjs8muSO7ks7tACSTuSSZMzx2p/R+39joz7N3v4n+ x/apn8gLY/8AS6f/AKRx/wBVMP8AKp/m/b+xf9DY/n/7H9q0/wDOP1sf+l2//SOP+qmP8qn+b9v7 E/6HB/P/ANj+1af+cerU/wDS8f8A6Rx/1Ux/lY/zft/Yy/0Oj+f/ALH9q0/8472p/wCl4/8A0jD/ AKqY/wArH+b9v7E/6H/6f+x/atP/ADjpan/pev8A9Iw/6qYf5WP837f2J/kD+n9n7Vh/5xxtT/0v pP8ApGH/AFUx/lY/zft/Yn+Qf6f2ftWn/nG20P8A0vpP+kYf9Vcf5WP837f2Mv5C/p/Z+1af+car Q/8AS/k/6Rl/6q4/ysf5v2/sT/In9P7P2rD/AM4z2h/6aCT/AKRV/wCquP8AK5/m/b+xP8i/0/s/ atP/ADjHZn/poJP+kVf+quP8rn+b9v7GX8jf0vs/asP/ADjBZn/poZP+kVf+quP8rn+b9v7E/wAk f0vs/a0v/OLthyHPzDKV7gWyg/eZDj/K5/m/ayHZP9L7P2st8t/kL+X2iv60ltJqlyAQJb1wwUkd VRAiA+BIJHY5jZe0cs/L3OVi7Pxx8/enPlXyXrWias95d+ZbzVbVrYQCwuSzRrL+75TKXkkap9Nt u3I0ynNnjMUIgbt2LCYmzIllmYzkOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVDajqVhptlJe 386WtpDT1Z5TxRQzBQWJ6bkYoJAFlUtbu1u4EuLWZLi3kFY5omDow8Qykg4qDaril2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KpB+jPOn/V9tf+4ef+ynA18Mu/7Hfozzp/1fbX/uHn/spx Xhl3/Y79GedP+r7a/wDcPP8A2U4rwy7/ALHfozzp/wBX21/7h5/7KcV4Zd/2O/RnnT/q+2v/AHDz /wBlOK8Mu/7Hfozzp/1fbX/uHn/spxXhl3/Y79GedP8Aq+2v/cPP/ZTivDLv+x36M86f9X21/wC4 ef8AspxXhl3/AGMR/NrTvNS/l3rJutVguoPTjD28dkY3esyAAP6703/yTiWrOJcB3eTfl1+Xn5xe ul3ojT6BbuQzXFy7QRuP8qAhmkHhWMjIgFxMOLJzGz6W0G21q20yKHWb2PUL9f7y6ih+rq2w/Y5O K17inyGTdlEEDdMMWTsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir//2Q== uuid:13528DD4AD50DF11A0AE9F14AB4BE47F uuid:cf4bb206-1326-d74d-bcf6-c7318f4a6bf4 uuid:2fbdcaaa-a095-1547-b943-336f0e642cc3 uuid:EDE785FDC44FDF119846FECADDC9E06B False Adobe PDF library 8.00 PDF/X-3:2002 PDF/X-3:2002 1 False False 612.000000 792.000000 Points Cyan Magenta Yellow Black Default Swatch Group 0 endstream endobj 4 0 obj << /Count 2 /Type /Pages /Kids [5 0 R 34 0 R] >> endobj 5 0 obj << /CropBox [0.0 0.0 612.0 792.0] /Parent 4 0 R /Contents [6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R 32 0 R] /Rotate 0 /BleedBox [0.0 0.0 612.0 792.0] /PieceInfo << /Illustrator 14 0 R >> /ArtBox [169.333 395.725 392.999 656.252] /MediaBox [0.0 0.0 612.0 792.0] /TrimBox [0.0 0.0 612.0 792.0] /Resources << /Shading << /Sh0 21 0 R /Sh1 26 0 R /Sh2 27 0 R /Sh3 30 0 R >> /ColorSpace << /CS0 22 0 R /CS1 22 0 R >> /Properties << /MC0 << /Color [20224 32768 65535] /Visible true /Editable true /Dimmed false /Preview true /Printed true /Title >> >> /ExtGState << /GS0 31 0 R >> >> /Type /Page /LastModified >> endobj 6 0 obj << /Length 464 /Filter /FlateDecode >> stream H|Tn0 +kޚ͵0 ߗ%qIzo?|qen\l^9Fe r ,挬;BCJ0:ZBIgsFV٢OH B QegdݑetlNgsFVs3?MF0%ױF^3\盅 >Óy*'9g9Ĥ fEgRL0@yn* < Fw qY*UUم:_Έ1 Ō"q߽M C+b;>N7=7 73>eA5P5z!Q˪[7>}g8{V6NX!K=ŀeꃆfg|i,_ZYt P@u!TW"{O}y;Б2Iӥ_B]1JFR˿`= endstream endobj 7 0 obj << /Length 461 /Filter /FlateDecode >> stream HTSq,1 ˯ 5/^Q$:fr S(Ըh'Q_dϽ&y3mBU\@p[uAAw.I,$)K}bԳ{faNH dSvooy'Xt9+eS।!wCNZQ|ǩu'ػ~ -{\džx_o5(̭^˜65r`+~Qq$*2{`aJ%<= eNY* pMdƼ> stream H\SKSA ܿSނQ>BdAb"!q{NSj %Eg dbL8 ^IsLp& 1ʢ-Ҫ- W⨺]St0-Lbr޾/|!w r8$e}zkYܾ5hh2j XG.*uHm:|!vil@ӶGԯӀJYcrI}fG V0ʨg$, =w10! |\l @׆'Jp/ zBv{[R w+e~z0MGs8 5CӆP#>#LߊhPLx"XH`# endstream endobj 9 0 obj << /Length 547 /Filter /FlateDecode >> stream HLSQ$9 S/vl'3t㬍;ͫH iWULmYV1h#`[Y, $-ƉnfYGy6>0E6<o  b0q61gɽå<3lr64L[8EK|4)HX0{x0ռD( va; SK<K6Y 8 |=7vh*"\@xf䝯dTU_Jo+cZ*?)Q)S6rͪަ$DQh4"L7ʣ ͖)mYwk%:,~֔[cY6(CDdW Q,C2ip{qh> stream HlTѪ0 }WYm}l0 1` zGNڦM%H>cłؼ)w]趘q*{m5^s ҹjpm  X5H; T½))G4Z U(f u|\.W*\/w %^>/hw􉄾_`AjPG{mɥeu\T+d#`` .WTpAgWʇ~o?p1ܿ,;ҖfRΆ+\0%'[NbeUrceh`l^_Jy~wrV֛=)3#c cD{aDEYZr3O_v\#QY@ZL(/95緿18[NÅ8Z(3؛ Xsx+rF<ΆM @'|Oퟍ=yۇ0d#`-mqd/awB{C endstream endobj 11 0 obj << /Length 516 /Filter /FlateDecode >> stream H\TK1)C \z& v6c5F(<΋V}\iYsܻ{Ikyự/=Ek6΂<(GM2ͮ^Y%GfGUPCw |_ëxUNY0TnB |5bůFZ!}0 6r;V?ցa~g#[NxqZ'N~y|_ǟ,a|!sq Ş< ' e :ع8IpU h GsiJG@ Vi"X$Nh|70RD 1m[J?7|a_-\VALcV/LzWGohlfOޫ.5ByG `7% EQRWZLKt6uQra#/Pom+ ؾq`Jq-4#)F#]Co8ο #ߺ endstream endobj 12 0 obj << /Length 533 /Filter /FlateDecode >> stream HlT[0 )t"E1z~d?萊gLQN!nv2i髝夵=`Hl3}X;֔)y um:>܆*G>4y 3rrb> stream HlSAn0 HIyc 萶7̡ %]GK\7sk+tOGF8w_C9#ުϱs++LE^OKլPmd;.B*=xv]XTsn>fg4j>Pu|*A%+M >> endobj 15 0 obj << /RoundtripVersion 13 /CreatorVersion 13 /ContainerVersion 9 /AIMetaData 16 0 R /AIPDFPrivateData1 17 0 R /AIPDFPrivateData2 18 0 R /AIPDFPrivateData3 19 0 R /AIPDFPrivateData4 20 0 R /NumBlock 4 >> endobj 16 0 obj << /Length 870 >> stream %!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 13.0 %%AI8_CreatorVersion: 13.0.2 %%For: (Capps) () %%Title: (slipz.pdf) %%CreationDate: 4/23/10 9:02 PM %%BoundingBox: 169 395 393 657 %%HiResBoundingBox: 169.3335 395.7251 392.999 656.252 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 9.0 %AI12_BuildNumber: 434 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_TemplateBox: 306.5 395.5 306.5 395.5 %AI3_TileBox: 18 40 594 774 %AI3_DocumentPreview: None %AI5_ArtSize: 612 792 %AI5_RulerUnits: 2 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -607 918 1 1829 1055 26 0 0 50 75 0 0 1 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 17 0 obj << /Length 6351 >> stream %%BoundingBox: 169 395 393 657 %%HiResBoundingBox: 169.3335 395.7251 392.999 656.252 %AI7_Thumbnail: 112 128 8 %%BeginData: 6202 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD92FF848484A9A9FD05FFA9FFFFFFAFFFFFFFAFFFFFFFAFFFFFFF %AFFFFFFFAFFFFFFFAFFFFFFFAFFFFFFFAFFFFFFFAFFFFFFFAFFFFFFFAFFF %FFFFAFFFFFFFAFFD2EFF5A36070D0D0D07303684FFFFAF60143C363C363C %3636363CFD0636353636363536363635363636353635362F3635362F362F %362F362F362F362F362F362F302F7E84FD29FF5A0707070D060EFD040D06 %2F7EFFFF3C0D1413140D140D140D140D140D140D130D140D0D0D14FD0E0D %070D0D0D070D070D070D070D060D0707060D0D84FD25FFA9840D0E070E14 %36360E0D360D300D0D5AFFFF611436143614361336143613361336133613 %360D360D360D360D360D360D360D360D300D360D300D300D2F0D300D2F0D %2F0D2F072F0D0D075AAFFD22FFA80D5AFF5A8484CFA8FF845AFD040D070D %2FFFFF3C1314133613140D360D140D360D140D360D140D360D130D360D0D %0D360D0D0D2FFD0A0D070D0D0D070D070D070D070D062FA8FD21FF2F0785 %CFCFCECFCECFCAFFFF850D360D360D0D5AFFA93614361336131413361336 %0D140D140D360D360D360D360D360D360D360D300D360D2F0D300D2F0D2F %0D0D072F070D072F0D2F072F072F062FFD20FF5A060D84CFA7CEA7CEA7CF %A7FFFF600D360D0D060D84FF361413140D85845A0D140D135A8584360D14 %0D130D140D0D0D13FD0E0D0736845A2FA95A0D060D070D060D070D065AFD %1EFFAF0D1436FFCFCFA7CEA7CFADCFCFCF4B2F14140D360D36CAC97C7C13 %36FFFF841414145AFFFFAF0D3613360D360D360D360D360D360D360D360D %300D360D2F0D0D5AFFA884FFAF072F0D2F072F072F072F07A9FD1DFF5307 %0760CFCFA7CEA7CEA0514AA7A79A52592E352E7675BBBAC1BA7C13AFFF84 %0D1436FFFFAF0D130D360D130D140D0D0D14FD0E0D075AFFA90D2F0D0D59 %FF5A07060D070D06072FFD1DFF300D0D5AFFA7CFA7CEA7754B4B75C8BBC1 %BAC1BBC1BAC1BBC1BAC17614AFFF601436FFFFFF133635360D360D360D36 %0D360D360D0D0D363536FD050D362F0D2FFFA92F072F0D84FFA9072F072F %072F072FA9FD1BFFA9070D0D60CFCFA7CEA7A7A0CF7CA798C198C198C198 %C198C198A0521413AFFF600DAFFFFF130D35FFA8360D5AFFFF5A0D0D84FF %605AFD05FF350D2FAFFFFFAF84FFA959FF7E84FD06FF060D06070684FD1B %FF840D0D3036FFC9CFA7CEA7CFCFCFC1C1BBC1BBC1BBC1999998C1A81514 %36AFFFAFAFFFFF36140D36FFFF361484FFFFFF0D36A9FF60FFFF855A85FF %FF0DAFFFFF8485FFFF845AFFAF36FFFFFF84A97E2F072F070D5AFD1BFF84 %070E0D36A8CFA7CEA7CEA7C998BB98C1BBC1BAC1989998C1C9FF0D1413AF %FD04FFA8140D140DAFFF600DAFAFAFFF360DFFA885FFA9070D0DA9FF5AA9 %FF2F0D075AFFA95AFF840D5AFF7E070607060D0707065AFD1BFF7E0D0D30 %0D85CFCFA7CFCECFBBC1BB9999C1999974C1BB9F2EFFFF361336AFFF8460 %FFFF84360D1460FF8436FFAF60FF365AFFAF5AFFAFAFA8AFFFFF5AFFFF36 %0D0D36FF845AFFAF0784FF84072F070D072F07072FFD1BFF84060D0D1436 %FFA7CEA7CFA7C998BB9899989998C19958070DCBAF131413AFFF600D60FF %FF84140D5AFFA936FF5A36FF605AFF5A60FFAFFD04845A5AA8FF2F0D065A %FFA959FF84075AFF7E07062F0707060D065AFD1BFFA9300D360D36AECFA7 %CFCECFCFCFC8C8C1A07C7D2F360E0E2FFF84141336AFFF60141385FFFF84 %1436FFAF85FF6013FFA8AFFF5A5AFF840D0D0D365A2FFFFF36070D5AFF84 %60FFAF0784FF850685FF5A072F07077EFD1CFF2F0D070D0DAFCFCFA7CFA8 %CFAEFFAF60131414140D0D077EFF600D1413FFFF840D140D85FFFF5A0DA8 %FFAFFF350DA8FFAFFF0D36FFFF363535FFFF5A84FF84362FAFFFA959FFA8 %075AFFA836A8FF2F07060D07A9FD1CFF840736141484FFCFCFA7CFCFFFAF %611436143614360D2FA9FF36361436AFFF8414133613AFFFFF5A85FFFFAF %360D85FFFFA9360DAFFD05FFAF0D5AFD04FFA8FFA85AFFAF0730AFFFFFFF %A82F072F065AFD1DFFA92F070D0784CFCFA7CFA8CFCF600D360D14FD040D %35FF84140D1413605A360D140D1413605A6035605A5A0D0D0D605A5A0D0D %0D365A845A360D0D0D365A842F2F355A2F5A2F0D072F59842F0D060D0607 %84FD1EFF840D0D1484FFCFCFCFFFFFAF143614360D360D0D0DFFFF3C1336 %143613141336133613360D140D140D140D360D360D0E0D360D360D0E0D0D %0D360D2FFD080D070D0D2F070D070D072F07072FFD20FF590D0D84CFCFA8 %CFA8FF36140D360D0D0D0E07A9FF851314133613140D360D140D360D140D %360D140D360D130D360D0D0D360D0D0D2FFD0A0D070D0D0D070D070D070D %070D06070DFD22FF5A0DA8FFCFFFCFFFA8360D360D360D0D07A9FFAF1336 %143613361436133613360D3613360D360D360D360D360D360D360D360D30 %0D360D2F0D300D2F0D2F0D2F0D2F0D2F072F0D2F072F07070DFD24FF5AFF %CFCFA8FFCF85070D0D0D060D0DA9FFAF13140D1413140D140D140D140D14 %0D140D140D140D130D140D0D0D13FD0E0D070D0D0D070D070D070D070D06 %0753FD28FFCFFFFFFF5A0D070D07305AFFFFAF1414133614141336141413 %3613140D3613140D360D140D360D140D360D140D360D0E0D300D0D0D300D %0D0D2F0D0D0D2F0D0D072F070D075A5A857EFD28FFCFFFFF840D5A5A84A9 %FFFF851336363613363636133636361336363613363536133635360D3635 %360D362F360D362F360D362F360D362F350D362F2F0D362F2F0D5A5AA9FF %FF532F7EFD32FFAFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD %FCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD %FCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD %FCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD %FCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD13FFA858A8FD6DFFA80B0558 %83FD48FF7D837D847D837D847D837D847D837D847D837D847D837D847D83 %7D847D837D847D837D7D052D0505057DA8FD46FFAFFFA8FFFFFFA8FFFFFF %A8FFAFFFA8FFAFFFA8FFAFFFA8FFFFFFA8FFAFFFA8FFFFFF832D052E52A8 %AEFD69FFA82D83A8FD48FFFF %%EndData endstream endobj 18 0 obj << /Length 15844 /Filter [/FlateDecode] >> stream HnHށs 2 p$F`8%AKO?9U\Ȏ й?jgSgygl}&q$<)7tڜF\X,݆9BEvn& ~ZNI%ݢEv1_9Yޟtg5ݡN$OIXFg/Q_|y]ੋ3(5iLRL4 ^9DZ[ߴfunjlOt^f],VGbz_O5|n/yY٫ͻbu#b(JTl/_ܠXG{y1^ i؜a/ڛtҌCKoG82NGֆ _~FVbٝĢDFI_fh7oEլ]`ow1p .vy+K*l/O- !^ˋկgil#/I9EIlL$Sđ5ag ˡ{7.if~=_UlQoI6WeX1T|9mLgsToM;Cщ\FL&. ӓX1.d@]4ESƄ(F2ьaR` 2~@ AR%7Y)) y eUU5hZպ6 -Ȁ LRt5M$@6эicL5c))] Ă HXH4".#tuJR PbNF 9.4&1haIMfr'BPgSb,᱕V[cu5,Ͳ, jK\JQ6wy7E%(㝑cgt. OƏh3p\+-% `=JIYYR\$X)0K!?9/IICU E^N'_݉ΒeH4t4 IC I T:9YPFnk@SY 8ĸ %.Pg^,&oP hВ,~ 糰94&t m8mGd1S&r)OC$42Pߙ, `!I,o@l=?IlKʐ!H: 1(FԂ>\'dGB$ɐ9bgt#F)q>($q$ V>T#se>I3jO:[E]-~c z׹y(9P凧~x<_mJoNtVZc{YB=km&YM,AJd;1t^B5yp2rU]ج&8DdaqR/p '|N!"ı8F:6CWoՑ#{aRf +)$AGj`@4RdVhBT@{xv0D%B 1PP9]1khxX3nq}W ]]1:V:)`&ɇNCeCeA?E_\KmuQCN:=8EdJpXf8P>`C1֌? zxd<"z|7"}djLfؗ ٻU܅JE_/B<)H1Chz%p 1$#8} ]Iv6[wHJشkǽsGiei5F"dB vF:Fޯ!P+b.q07Fw;>`h3g,N}*QIO!"!dOR!yCa ">1zQIb݀c\;8\Klh$FB՜{P(pC%|R(zד#1} uyJP)秔`Rc 9b'쐷9kt٪c!cr$D}[תkbL6>MEHkV rFzӌ;D\Q^nDv +8Hoa>CA џ#qU x8;'kE[!єAxF?D-m` ; Z!Xڐ 8ILBE.~}8s$Q&nR )M 1ɿQgDQMI=)s„9qVO zBfQ`8$fQ+>ȠJKK"qi. 9$2OqH@g"DI^ 9BD/K\<%jI*u6f#}]s1mߴLAщB`aaln6؎ؚha[fߵp|ʡ:Hedp|d qqhxze|t`s2]^qY3ĝ Ѐ2a[E$sXq'#sNN,iZRDeFX`e^ȽyxC>ωi,wsdtӂq6X^.hEyʗ˿5i#/ =qVyO4"UN@lnff:ReݱHAkJ)e Ucjc ՠ;F4;bk?q2σA b"H.1|Z. @N*<,=UrW] Y|YuX7rH;V;{t[6Vɟ.,֖Jt{$V7(hyDXmե};e6$-))><-crK6U{FYUip"3) ɽ)Obކrz%%uCX]/ՏQ ~ CSda7čPB63 Vw IfW:M_DJeoq>$ SL3LF"R#%P W\= civpRi>ͅբZ?P/J[QKrYKwonw{J+ƁEң:;澱һUN7(/Wt7?|,W힞,U5I|;% XZUhh(⮫tXFޔWeJR u8su~o~Pwi1 ׼io*3,Q;yl.Fj<vuquY?X unϚdڝeZjǠOԲP_ЫUvXN) eQgmk~{ӷn^Sqfнᧃa#V㝆f ͖*1-Y'-1\^[ .ad$6*pRml 1LޣEU8yo,t=Z}:ZVs_Fh}!өJ;%>6R-sݣbk*ٵ;zN.=vEŽ`SߒOOu?tG̜P {1ж%=fإ`Wt'kɍy-{}e۩F(KeW;/UږD!\G'l" 3.:j'@Kt:x?V&iA$'յ:QZ֞#'[߽{I5ZqRx)5:y/LCi>ަVS/mjրJ{S|nw6k:ǣ\zx|ѿ\ܥΛkwg};/`tJ?SU鷕_n~!?:yhm"ufga^HMS~/Y[+vyէ-v>?&GRl?S5+=sj>UOU顓z85[ՕFtNMaJCݽ᝵u*YEEYn oq僆^[o]}|:m~y1;CcH%ϗZ}i=ڨS9+]㗛{<=lc򇵑۰.6r=KdVI*LJv>{ٮ5mNX[|\}WEX cv*;iI{2z௮yBU:1TAj!~˽"X_~˭oPހ-iX'SRmomrF c'c̑BNY9_ xհnKƇcu6U 0 XCDgٱ9b2%+X?5Iy*b"L<#OA,  YN*N =7h0لE1Ml c^YF8*ن])FQH @P^;D( ʨnqY3RJx²t#+}lBJ-N-1ȩԴGX 8g4̰3q|)J73FKk 2F58Gpuv^c  i Zj,BȲ8R&Us8m)KwXq ^yw[륤׼#0c,_~80WOw3Ძ8ͼX`zyּVll- m7rQ3h$tC*ml:Jș`'U&TW w1框2TE*Ե4'p8(H945ApǦ\ઇ e u$P+ACGʦ"C٫'P7\6#?䦭=A =>Ά .8>q@缗Vfs:tzw"&bxy< n 1 !l%@׬Uo5ܤ.y+nm7sE3gm-6eLD1.]aHM/̓޵<عli/ bD1!_I0knיB7;n ]S1͵{=y}7R>q%N%a0&M2!iTuMSxxS ,u-I#m- 5- Yg[ sYʾam,+QnIJg)67 LHE9Ŏ/{{ڼopx(Z YTTdH򻢼2ւty vH+jJdn %sëq);(QAx1qrX<ۍptV 99&L:3NWb%ևׂ R͎-!~6=o̞ŷWhdI҈xN"ҭ:nr(JXYwxiYvKP^3+/X婈#hUbBF} z)qA#X]a/ DUxYP}Y,y{RPR&,f@&,P]4墥uBr{ >Cl4y#Pv0F0aR[Tu<(B,7->Jv3Y * p˖DS5XOW_Q\GKϬ:ŪA<`J mj+1B@xi.#^c WaVs -u X(48t)f3|ǿfA+@gC,xoф 9jrXc(|IB& ^ RYٻ}`mtaiQAy?rOPV ]lwio=kb{YMK铎fכ!/xۇA}pP8imsU|3L ߏ_3DxtH<%=r"7[cדU8|^(bXR%=K1 zgCsW?<3;󛲳Q ɍ:+q56sM<~RK%_OгM9vmYYyRVEfת*ð}eV+r^# (5}@5TEɨTHLMAlݐ욌YeƪY1K祲 GԔO3_=8Se֜vP)9KWa(tk5< kAuC_Qv8KCXXb!ͿXP(.—ZXYqXA@^P,Ϭ}[P + TuA~,'h\rZZ\ ΜA%b g5< Ʒg4ϊHg?XP RI|S  U3bx 5U*I*0r|~2AY^-(8{(84>LA#E5Cl"Csl!bMxB)Q]ǧA3y"O&&wk#YM<46*L7#ҧۘw0Pqy&7nBǺMZyGB ENCEաZ sB ښʵ MQ *0^W:hDHh_H:C@bW@@|\B aaxggj~*Y ]/~uEwCۅ2)ePtJ Nذ6 ?HΦ+$AgMft)XӮd;x섆ՠ! (cSoBЂz6 { K^():;ky`F`#磰 %G7TyNt7T2C|Сň;QVenݓЭhl:+w?HpY3yoLkPqe4x@X)>T;^d@d0hV؄W߉jQ~+LsYˇC*?%oWI ]Wk^n3{b*G a餓Ԛj=ENQ\έ <šae5kOy/!ޖE98[E#pkNu!Fb~ڼ-CƻfĬ4Şub Ѕ!wμ!˾}zsl^͒fLc*! ^X?bIe,T_]hIxPy9L}S:::'kb*6<\םsn*xuBˎok?y/ڗqYzoS4!$K6[7YXXt<;4T †M}8JNgvhg[٠kZP@|[%Vm;84>:҉(M ]"6.idFjH%/cAkte5ʀ]C:o]}/vwq!lBٜϵuی?Xڪ-_em(kvg@~s&u{eCHM'p4w5L|)R!@Ϛ/?J.}ڏ8y=dm׵C~r bBhh,>aP,GXqcZ^Vco3enϟ bX>6@-?~tkeYue*fmt_)=bU_+R/$ko`F=j6BT .T'OK+ip}3ck4W ځN uFwe yROץ&B9¾,}+*{9 zT1:fvcJ@ #L+aDŽ1QK'L:wu{xie aOSk cÓ>:aUl%wNhKF`)WoxY8NmSr&T{`ěQdmD޶/{g}t_ɔ-̝=!?7>~ڹR+gG%"k;גsڎ%nRoOίbiEt_8+-nX͋rp[3\NCvq. ^[nϟbUO%R엇c2'1T>HksNڿT9~iZ4WYk۱+JßerZ{뵇8[Ể͋ӕrlv,կx| !OXh'unmN:R%)5PrC.]\ԕkSGܻZ8يV\zDF͍ A2C3y9UZ՜+JhW*y~1> a8%+*_K[iWڊG DEb)-}]cɽ]}R FFrE;W+W;;iR\d00,2߮/zl,w'ε=K:ЬNwԁCӻ{b>О,/$|?Z%vt#!Ά-s^MԊ)7i>}u]noS\2./zD~6 u=̮*eV^ny]L+@A=ɩU֞W:F^&27ƅ<;/&cY[c-"tsW&AKi}Ŵ5],D qL.9\6h嬼 Jh}H 설;gFqJZoO9Rзߵ$f/Љ8Y l,}.̎Wĉq f^%Y7-ej*z,`p%9.`z`<.нl8%Fs|aclG.;h"ņb}/b(bqa$=+#ņb.fDaC +Ӟr A KBSŅ.W@לϣX ~s(Jte|ҵ1:H BRZcIIhuD#;7qy-?<lJ>Rs%΋""\Z"} 1ͷ53``7 Rǥ$+RT0wњl.X29vK۱F&Ĩ<$q$FXsͷ F;QH Jqr@gDވbW5O|S׷{5__^3NtU;UM!#R \-꧟KhC T^p߽H7_RIO֌P6Pe֌5!w[hi6PTkt9) -ɤ'3:'Op.m}$Er{e0;F>M`$Dǵte-lVkǗxWRz,{ͲN 1K/%Bpc#'O\01٫4G;vD-P%Yic(!@Skݫ;iNO[bJy}vTd荧\.=ʅ(HIz@GV"#(ju$o2L bM )%%.޽w1nvs[JRZIJOl:t|2%TR/H Rc1A(CKI}ah}]-7D5qtĎ}[wL7bԎ9S%1]0iCe09lnY\##;%:ȶ4OsA3;?,` cmOq+X'"9eyeMƅ K$AYs?. $$P{m70coRd! Nm(dz2G8d ػm.Y 3TAɢXaq3;C0bTWۓ۝]1'Xd5g8^QGzqDg(^QgGG(bq3dDQU|nZ%j0_~N?cRtq #GA0!NN,CWa "s&sd]MQ #,v(q"&ŎtQb's)~OrݼutgdJqC]lZ?%EGjyΰ #*mN?6!lsL-Rԁb ᘄƄ_`$V|0f[iRjʍP n|?@2T҅"#//t}0Gi^ev{[할ʺWb\S/Ni?f NDa1 !~51zep"&(TE^lyJ$k: TF(X+ҴFl2S_ ;abcpMRMlNT'C9FEEz)7B \/lDJΡ+eu9^V5SޛӻO7ƳƉzSi2Vhd7,[luk8 o> stream HWZH}<KK`EA]YGFAݝtt7NR+ YZƧ=0d3|^fgLOd$(Z~]Kkoi#~Scjd~|JRz =VT}| U9(o^JƸ[Aj+XZbCWۚz%:Er\ >Cp:!;܍iOl4/2Ŏm61௝bd"Ajf%EV{s1XؠMF#IMEMwe&C?*YFP`}H{ c{X0M hl< cO r: cD /+X]%B% $tVY5ri4;` Gc=M αT/g=^ݍq;bݕSpze.u'^o R] R9^[<cA`,,q=a`ەE.cS迂. +_u@9'.xʗzmQ\#x s[A1APF RO4H j: OZ`4.ȋ({7ɕЦ?.Bl}?826t n;/ @Fg,"mʾI|VX$bLv.g4!믆G+ ΫHf:;-LJ#ܳ qvcGO? VgDqzq5 `w5=e1Hl˽ubMZǁ+PTj+bXHDzzH z[ۘ.{7b}(XFFNv}Z^{9'_}Œ?,Ȼrc}Ҕ[ rƕdH̱1|ЬJf/ጄt࿱$ :mЛ^$,;nݝzeo1P~zn;nAEϧƲ(@JVV+ j"+LKwL 1B2 S9F#f M*n>sʅR|h# j6*u ИT͒*YyIZLabU`v/$Iw뮤tbO%A3%U#F ѳW{ߜؕT5x@VR 9 ƾ+)vڇ&㹒jsNu^l?@meAYiC6M"؆S1˃!0E6c`lCq5܋"?TI>N\ΗbN Qe +vBP#c91)I&-xIGFFHI|d )\ zńFa#Id#-l9{K;W 4NI;`-ƷS?,o:哂[̞*kxն$2;[g2"{i#J e!!-Flnsk[ GT WAƐ),/qr\oqK>T+\g XkL;JH>s aj "Ąa5}K5%p1r J5(v[Ms"18#V^o">N,uL3*ߚwx`Wn.λ1FNLPӚDuì=_nf3͟ѬZsef{I=ڣ85j%R-GKi*E1]=1Oߡ4>e3$Va:a4J͓b/* @Hg޴~{M>]Uag; קlW9d8"iiB/>NSTQ"ӕYTMh4I 볭S/<ǝ%9!޻NHxDwZ Nr1;ʧ($?(Bh;HF4S^ 1R7uJwXӞ7 $3x*,zֺFN_hO8WUGܨ ^ dZɿ-jijI+nUZK!w1Hb{_-X5=8$nz-<*81Nρ}\>kBK'Ж(Ol%䏉Nif2W"B3BOOYXc̖vXNaJ2 1z =' rt:h=$X~6̥&AoI{lP0s8ə[ uӵ'(9)K[OIXO?'Cڳd,#˾Ʋd,w8ƴC2?$c1mjW}% _}裄Y&NOI7eǷa?1cQWe vG PVk@(FiLG(dn3sKh|1rR24&,Jڈo^n@+a@S JME1\Xxvgs&ӕz5fx6?B"-,\D,@ .vI"V hG u\<] @Ó0uJBUx.]H]w?Uޗ,E?BQY\J}]r)2S!;3 ?d]ν:g&+dT^*rM \\յ.)7U%Ӕb w:Oif$ɔdvz:$+»ZK2M1],$4Cm/b}CoB{s5`Rl#V=qQ: {mQ:mvqz+K靻@+8SmnNBkP0f0 0L oX5jq8!(U[Qx趗ԻhsJ%gB"R2҅xV,&anPKim_2eKf^I@ (ڀr 3 4z[09GZxU7b?* b10> db!gOQZE%B4]CC@R; yӰ89`$l蹖= a?OCl iC$Tu84bqi^0,L+1ΫD<8 ]z!?d{ccL:WʜޅD~9mJ54;#N P,gci8pՖNHm-eŪjޟH68ak4TNrWhh']ػuV=ۊI +ua4TkL`k81 +Ԏc4WX S05M}AFleςpTK0lCk(ZC9ӑ7LjuЗFczlz `=X,. YÀ 3`\~ ̙YHt_RtPAF +-Ms}jPÜÌľPtCqr"֌;ξ˰X45ձ=hOntq 1.S8[ѕSw!P=?KKY]|`x7"HVf{]̗c#CG3|ƱN;ub\xSOoׯz\ՖX9){nW{>8ENyF>[6xѣ̏wHBC۳]nV jT1AئD1o}OBZ_t%aKl:ŖKpmBŏt@_DCr&\iiG-~n0? /\/gZykfYER {|?UoR>72˳'/.C,W*\9~s.1g>{F_뷺ܫo' V*FBrB3Wh ?/V@#,\ci׶wÕu2WhŎ ׀` Y2\ D r/zU`_Fc),3,L~SѸ),ݱW/cs&0}J)T4aNJ !r̍tOwb4 7O&jqp%c>֥lߟiS_ _('FNNK+a~5TrhҖ#{뾚a]qp[WB{9y BfU\!!D ] Еz+ s$F(HOf #l8XjJbyOsپK[7>H<%AĊ쥴 ¹2CUZT1GUsnZw F\Rr~ξŸ)q -e ]g6C*П تU&f^ÑDtڻ,;mIZК'={{#] ciy̓aHhIE.$> :d إ'J:*ip%(TNJD M9Ă[Yˢ5 {AyIH"߸?d I@POPxjCjʅ2}$DDVƷMf[X\Р7c\nM.{TJnܠ `KK[X|v6V͗N= u RNN8[F'zun'k'{w0  %!4 _ٯ$˶ e-霽O]'p>]W Iv8 t>vpsgX m{4?; ֦z><ж<=B.ZNX;= ׼!H'wD!# pCA@\@^CAH^!z eRcK*Y >B`nyh3 86 H\C:"za00SwP?&J*A9 B=•J2|k-W/+e]^Wоs .G8Fc9&K'G]c!S8& i|=v cTHTBYOQ<P~\Ѭ  o9r+1V?MNI~p i02WR'$zr a}/ZsG:]`;&4,05xm?T3\AiO;WdT-&_NiƄ$k8l@+uجW ;Teڐ@+)LY56]Uk(~6vPkM+~|+=;xQIXӭ`-y0Zco>urw7p饱A`,vkjѾ0{ d ij ߚ^/B4 &C lZ\/ 3YyHhpGXwToS(M@y |WYHXfYɐ=lk{#W ݗ(^Xp~,CVX@C Oo~:XlPFr"PU2pJj(ssZi ;iO$ _rs>]Wϯ_'sښOtz3oSXW6ϣtLrEm48vyB OGG7)JȝLHm=N S]d+u:j&Ң-J[ܔRg9BCi ")_kS8]%OiJ_SXIz5FeB\|8#BxhCǽ%@eo?*"<_W'B'O` 6&<^8)(!AG/޶Mx{etqL&n! ¦`פ2մm*IaچqThYrrG.{84\8 A} xmi(Q)p Kƹ4[[* kT@g_,\$֮U(`CMM;u 8'%\ߣgQ(@ϰv\vwx-Pe+7r-b`D*Mn~Ԥ{\0*D]nt^2l+ Q%Ak= .(nlA=--3}ov{bk>~كdvXjߤ6s}U%=?c?JZou݄#uy@>"cd>X@\|~qj@|v|kMߢ[k] v;4sʄVԂ#&PVx]ngl .uPh>`kUO$HviwOz:CYP|2T# mh8 V𝕝`xS.{ 5ƒ"dzc`f ܯ1تpS/t\%{Ĭݠj@]:..О P.p vBVwIj` (..CG ln;0Rt\7E.!!]R\ ol0leK }kNĽh% 1ʏE"~dG& K1x`Ō501IhNTD⫽+dc~w`k*O6~z$LMMuկ~Uս5HS >Ӷol;<7_Ԟ^ȉ6xw[;4o[pY^EpКe,WH,,l)lqR{wmr12˗rmk5{-Nl"kKsW>}Y/ {c/^xD3 Q: :ň}s`\#: ZuA$01IF;a_Cb Nd! ȎM EW =LzOÁ{7 F_.`FX A4|*]* TyJir,}k|B{P.2#bY/"J' Wڰ+dT"gq8@Up'l?ΞW!mJͰ[nȧŷD.^ 0oS3`l܋F,1 )Y=s@\0"EQR7h츩2* K@kE 9X$iUS:f0K {O*^Qe:%BH7#ET9&Ug!8WQ Su+Z'/6nrt0/A+m8C'.4u 0 NЪf_Fw#MqxIUHH0XLs-zvw/{++Gtu|ܡd=ObL6St>ɗՓ&ۨge8#?dl7Q^^]ꍛv}l>7ه֢{{53]{|a-{Pf˦>})=lM*N['ܨFOz@>U?a{h7OҖw9_*3أwux|6rmV{|m^dGb6V}`z{4oݎG叝\\z mL V%nXF-7ЃJQZp?^3ۧA+V^Z/GJ^[[YaN~~{V罳o*lYUmOC SPD;@lo:׮s䯑/XHhjDY*/R7ӿݪ!IEorHRZ*j'yxq c7-}VC)ZorUagd{&rcPt\ŒEbR94B֋q֛017v̡o%HGUI_=?=MIa! 'BUͻh@5FT2ʌYaSrпW7ō 5g 1tUEIkYsU@ܲQ̒llí@쑏E2NLDLrZj0gC70_hF;E 6 GD۝^8ouDho|\*R&qJ#UUm,~%A 0R ЏAxyCi'VE:U _] HMU1PnBb%gQLۂh:w3hR+)` 3R#K@`b u`՞]UaEb._DvX{[9!.}/h8C;H*Rޛ:~MpTsSAJ[jIhZ2ͪ}SHX]fȯ[Z/9 ?0^/:$Yl25Zà~4enUScG@G`g8T<[a0Ρx<6O^HBY +fÖϜjycK'zN",(3ʯ2Xw\[:6냋PJr-[X?\_;!6e)2H;p d }ᤰyCԿ]W7$̄"a0 ﳍ>)A!>R-{ qSy+X5E&|i"˵$mI=&\Pڽ"#y߾7mJDl Ld[%7i ۶R0oI?<,3>}A[zç mF}Y޽ 0}+ "YC_+}Anv ;;]M3NU:zCp#25& ~w.*VkV-rXk|x?|&; D{dMڌ9aE;h&b۔?:=<~ԼwWlX&j6 B5N[l WH7Gp  RhID€DfHofR\^lqƟLXbV ;XgepZ[ 1V6!85jRáuX [lD#ED %HPBK6_cmJLKkS#>j>jWlnj..^;/^)ع[(pGSN.vms1y-Ll@gm1$Dw87N-p˼{~&KtR!$rօ7mS0piE.Tax9n PxkW,pѰk (æ܌ Yi=WUwuw4r%]872]5%{qKx3S|OipqdwQFه jprzj(%\/1h$Q*0n.6YGvqKImHud,M0[?{Apj}EF3rrތ.S^4=Ϧ_=*.GB:]QQZnS.SՋj5Vvd\[515׸yV*yO39S/~HmB-G{OꦌR9'ۇ]@r~+vL.-zC.kt*mxZF *PTautA:`꒜ɍ9W * {b%y݁y}vs hWh3' Ƀ!H8#p3lp7F<fHVۤ>R:@j3{;iagZt"k$F VtIF3[P#G"ci8}IԈcxK n'O `? oGИ[൝.Am5/ݹiɃ{q/"`K]$QFlTIe4_:ޮ3oPen{ӝoFYlE*ϗɤ(Op:͐[$+YV ̈́'(w>dL l{I+N1,wbk7/]y)1$`D|"02ҴE X:6GXx$V:c˞Psr [ ,F[]|\}/[l e+*E "ɌӢnf&)H}S$ͭJ֗wI %"eh9b}?6zV6i. ¹\+Lc-bp!B}k"Dwm[v=e~FhH'p $Z+B׶b% tИ)rN=%=-%[ZWn ³CI,_+d~a "# 1S0/R +MkWoKbV֝Qpp+(5ü3ޖe!ٕN'?ƙC~H"qc/اvKse5;N6Ql H5+nY_n@'yfq 䡝~V`raEIDr2Ěn$jY^=2z[ _IڅEOTR.鮨tJ7)"-}F|A8ʼ8u?S hc8; Es0l@/<,7]>,M7kޕ Fyᬷ γgQTGt jĭ6rm}nxUf<邢@fmUȺe-7.3>}PM!qxz/Kc&ËkR$r)uت.֫pa}|"<7a'4,"eih7;()I JݗTh&n@ el\w18hL@Pz̺pZ͞M"̔\'Ͼ]+^-me}6d4kH̤|֝dUycZzAgZ=̘?8zTPrm9QI ?؛M+=XO^2J&/\lyEd| ֝tѰy7KV7*acj̺ٞS%[/56'f{~j^S彼^6o#|hxUyN_so՚O q}pz͉.Zlj2E7)a12Ey~ug xB^̀}MM-gi;=އqAfm4P/ ng70KOpٗLV)C.0ekpJo<v?P*4  ^;c*km Ϋ=&EXeSlَ9cvyYq`v~P:WDx(3̑ڈ`%e˾:+5u{&:QX1JyetH>R5{ED1n`FvBD b APnU,Vyu "G-a|5gsL ͥ.[8YQZv8*npnG%x[{/\oysUhCQXj P,Zl4;\=kJMq"cƨvg{^꜊7F#K+h-Ǐ)Q*tMczU4HOvW'6_>,=[-ڿH=ww,8Y<;@]Cjj\q?i:s yGt~p뉨Q.z"H#t{o)^ RE.J䟻*{@7klOHͣklX6 CmzUu[56 G0)iC(Di'I;Ug1Zc<n{aEW 6/p 7XU{#r}pl?>b)W{ J tl0ahydW@U1']7,q ݮsT} 5}Y,տߍef0Bټu( ).ɖָ͝> {j& RCghO=7* {$V|\T4js ;cТy.gBu`YIvYz(,agħKiVnIߖcd{\cƄf%PȕZ9Y@0kYݥ:حv.R /WZ =y]s:-Pe͑}u!¹0z%z5Y/WhHqvrzrʐO_hzq/ľ4\^p?^\lիw5 뵃TeulmA8}_K}~ŭ45^%d Nb~Yr|<]O5f'nbUo ̱ccY>Rr[fh*t>wy6zӥG#E{1'UW~k"APjzxW:r$[NȜA~gքLhѣsX12rK'j<ܠ+D}/N~Qqe縵r~=uhuNoJNxƸ)&FYx8bUhߙ\)V#ْ VLjEPLѰ?u kx F5܏Ac*K>Qa `0zCeR:EP18#3 ˨G], 餋:H> gwSLyR]=±z|9یvb0*c3,5arֵ#W)xwRXPFyTYB 0j]!^NQqE7FK!2_`%ܦYRӈ^ i7z^o'NY9\݌ jm3&`#_Wh0&Y mX!V9҇G/Mx\h ~CҨ_!+WJk=uXV ::H_i+5̟"D>q,\ ׬C#T(/\7dryg3&l1K8a4p2} 3vV^pil<̗ۆVf=Ya`Æ9kYijH6rؽ@/ߛoqw ,hyڂY4Mh0c}`uQ/x@`WH:e9*;!$APf 님tC+*-+͜X('1c?v[QBs:c2=e59FcUU(!AH0 Y "$HXku]xe":W"€ `kc-==EX8ͮfT3,QAʵ͑IpuV$̩:Y.Np+sw#>4Np:w|'zPYWZQ#\:?p-r:g#/|8ph0ZvOΝvN&ۓQVy ӝ43 Ё. 6}Lc d.9?S"ڻsuZݕD ,l͍֕8qX U!yA=홄RÞN&s[^uο,x*:թ|6Nf3MMmœM0윒b-)tqv#JYIdPBwjMHo\} O\ o~x5pd5Wt8|(GpTCa-݄YV'D8Hw5e qv S ޞ>$ؘ.tURMl,aZ#e`.RەC@.dfk\k g$ aۭ0#qI-nlK5\ݵ=v%w\pcuRmPTUO+T )Jt%WB ^0qJ7֊,"бd>x/kNj oU+Ξ0զowMvZLkp9ƚc,>՚`+8?(~N2|u:/GsUKklbC~c`YT")@`+sɫJrx="V4 Q4zf ȸҞ\iA4FC0v*jw.3ƚIJλ=b}m< aCsnCUϞs\Ӕ&7gŴF{mp_MNJBZ\!9_]i=_DZ~1H˴f_qJ,<8&[RJ)q/ %]ҔF6!Cnrƿ$e'>/vPnTo0vɭ¬[/|*ca~0ºhQa.WR)F+rgUw?c)-SkVocJ_ߚy<l4~gY\Un_jti<7">ir^_D\VԞbhSһU!ۏPmyJ"wgseIRw=?& ^0*+"I,B0 Ex+x)6z@h9idO E:Ռ0KDF.nHow5`` )T^Yʹ{k`mv#8լ NL!OM5, xAQ=HxU񯜽E\+VEf|^['5FeVocbm6]!u-.L,Q*nlϒ91UYnj.' ֹ'#CxmWX|uK#cUU0!$"YE1*(41%\go*F: Hnfz() *ru q2Zf\+L0+ګyoz\3WeGoܧmFӡğ ~[^ޞ|K\Y R[-fiV/,M![3Z9T-dLmڠc |T"%G^M~{]ZppS.ǃdNι; ^ݠ0u!%^}e(QaOnLotowݩWd'\-ų^r05[)eV(gb7! ޻0b0H0\ԁMg]ƛݘ 0{E9AGعPFu ԔLr`UȘgm;ʾWzߏKL轹;X%t3=,V[{|_ՃqiaAZcX0>vs=*NαKNWY(.H766*4ߤX` S 1B|blC\~S_[YGC͠ݭ<(-r=ðB'WF:5${w sUcFP+8HŻb}=\ܻ®4Tm9S$.@q˶׫DyYWsg*.)N#UY&Cޕ3M* 41s ;T?wP >@sgo)~$y﯊dhlP.`7?sBn:]} HF&H}>%;`Ao~( :MΠXqXLی,/2&gvQTkX8=I /``0?_Ab&(ad m%yTA~yInlimğS,i^:cd?o?A/2!!kr(PW1zlN rbTTV*b(z{1+6cBUZLCOuAM^sS}rHVP9kk~&!"-~mCŘ/)6Djr(bUGk9!ZFE0$5Pv>Ց'X=5[rP諒il9 >ܬ?u w+: 5PegY OW ӭWZ OydLxb!- xQ,(yf`zp>Jޒ,A/Ce~>OUpieo ˎI3z h FOiDvk_fNu5z'h1ۍ,[gY]o0Z9׫o^SVlK:n2HRlHXD=nC%M(: ;ox%iI<@oS@1f@J4ICA9рO%! Zsd`P^~Ы80pM3 @(thQ%3Ԛ!vP>."}b) ׬rc7_]蠀&o\2Z owQzmԺWa1-ǩch= Nu޳럯a0A쿸^@|ُг=vp/e'rW>c{~dՖcb[r)aeBtfKqrrij^a>j}C' t9Dd7`d ^\slJ;+Osk*q'}0*1oÇYLa W5q|e"AgTIWŭs.X}¡j{:2tAk5˯ uFi(59o֌[0 C(afߚ io_ȍm.ǀ[ zѳժFf/|K.V{RsOju}^fv6&ԧۡA҅8veV?LŜKsh7;tQ離TLN}sj2ZGbk7*Rڕ oH+ AÁV&6nIsl!;z5˹?? lL54?, k0 FJS3Di"({+rgj$rz1* %J&Wa7ב{vm%,/(-sAEQEP u_̲: +kgDdĎ].Y} /.TU<(Q,DM_جHx~TcIg훇H\lJq[-v~Zaps Jo85xظ)Uhzp74l&of @*lvW?3f=7@?LH$n"(wUA.CL{M=/@{&I3*4RAcFcDeTZps~T*n=>u%'z>6)FdvAohsQ9 3& z~1j~ ,0Tcu5\J-&w6L=5%\¬F1=/ Գfm[}.Xbs0-a(_tc"S7]?ov|;'CDBGC.vH:!y&&9Dit̢HfO$1> =?6@Ŵc[|boccG֡l0+EkzJ-5/d1 Ʈ+=Xm,Y5\z.v2 } r27 Mk`dn`A? zLZ0VX01®řz ; v4p#w}ݿퟛGuō沉D9l`X 0$?tk;xAжrϜ 7Aʧ#U[ee.3wTD#XvE:tDQth:<,vv`;~ I/0zq1 smLѓ+~US[g|l?~ޜ1Ftv%]v" UqwWb \hЉ@0VmL  N]/KwQ?%؎a> stream HM7 OPw HQql @/vGnPR҆j] HIE*@rGfR9ˀX%78*`m$3çt٭:1;Q.2ڋ'$dH5uF ʪ5`ToxKO8U<C-D} %\#`.9a.T93y" ہ`yxvG뚖\Fd=XY"A͋ʰ\ 3=YNJӓ_'M2*~ͨ2tfE6i:V"d ^?飯LYva[kG}JKjdoMLuJ;r߭"ECJDd1࣓+zJS_SsŮ)εĪ^J xo1[W {-8M \W d{* 'h0AI=4Ĭ}O+{_0wW.N#Bf++#}I.&[䬲MRhO0;8v #dRey*vdQٌPܲlֶȶ~t2-LbW'F 'uDN}OZ(.fY*tb>@{ 2]_Ygn,y\?xfS]B+ocGNW6_ld ;,eHQuic}t\gʾưԈA;U4NU;3dg ߑyީ3f?~3UVqV+6mOY.>R )"3݊61]GuԱ܆0B_۔'֎g A#>[Jy^cN mIegqe62'X;t{3ܦji !kvPuFca.khg־8NWbݮm>XEAE!3”eZ `n@{<,\-ۜA"ꖹ-9GI_X&q8nU;$^C?cb}@6A{%K(v( f ;-A2Gqe靖i}_ ?b!gHWY`p:j8AI@T0Q8C5{Gb9i>. @mdx.KQ^KatnM}g$ Gnvv+9}0^O_}=߾#z/ݭ/x>EQgĎ0D څO8+|][q__P銅t>nn?az|O2}݇d]~s?2 endstream endobj 21 0 obj << /ColorSpace 22 0 R /AntiAlias false /Coords [0.0 0.0 1.0 0.0] /Function 24 0 R /Extend [true true] /Domain [0.0 1.0] /ShadingType 2 >> endobj 22 0 obj [/ICCBased 23 0 R] endobj 23 0 obj << /Length 2574 /Filter /FlateDecode /N 3 >> stream HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 N')].uJr  wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 24 0 obj << /FunctionType 3 /Encode [0.0 1.0] /Domain [0.0 1.0] /Functions [25 0 R] /Bounds [] >> endobj 25 0 obj << /C0 [0.0 0.733333 0.831373] /C1 [0.0 0.341176 0.631373] /FunctionType 2 /N 1.36471 /Domain [0.0 1.0] >> endobj 26 0 obj << /ColorSpace 22 0 R /AntiAlias false /Coords [0.0 0.0 0.0 0.0 0.0 1.0] /Function 24 0 R /Extend [true true] /Domain [0.0 1.0] /ShadingType 3 >> endobj 27 0 obj << /ColorSpace 22 0 R /AntiAlias false /Coords [0.0 0.0 0.0 0.0 0.0 1.0] /Function 28 0 R /Extend [true true] /Domain [0.0 1.0] /ShadingType 3 >> endobj 28 0 obj << /FunctionType 3 /Encode [1.0 0.0] /Domain [0.0 1.0] /Functions [29 0 R] /Bounds [] >> endobj 29 0 obj << /C0 [0.0 0.619608 0.811765] /C1 [0.635294 0.862745 0.913725] /FunctionType 2 /N 2.54334 /Domain [0.0 1.0] >> endobj 30 0 obj << /Length 12690 /BitsPerCoordinate 32 /BitsPerComponent 8 /ColorSpace 22 0 R /AntiAlias false /BitsPerFlag 8 /ShadingType 7 /Decode [-1262.06 487.27 -1262.06 487.274 0.0 1.0 0.0 1.0 0.0 1.0] >> stream  V dLk  | } ~\ 2^ AM^ ) m8  V dA sAI-_[ x] ao) m^ 2^ AM\ 5 ^s2] ^ 1 Eu _y R A   Հ C(I GD  U) X;Y : 1 E_ˑyGOw)iUo!bL%*W(n8-R]#fx9V| |pD՟])R Ay u _ 1 E e/[ 6e)(5 \+l i  cB!  )qz Ƭ`H UM 1INrHW =O% Gvw N!   cB i (5 \+lݽ ^F 6h^ O= *  {Q $Te! #w H<, w]{ Q_ VQ n 1 E_ˑyGOw)iUo ;79-߶ZE2ur/N' OKK(5 \+le/[ 6e) ˂'o߶ c J[ %(5 \+lN' OKKr/ZE2usP\3u S_5 MIh^ OF 6ݽ ^? yc-UErx\ 5 $T}  W LX) ~"Q3jU j]M oat .d) {h^ O= *  {Qѡ {O ~m?7 EV9ں ٠h^ Od) {at .]M o5 7v~Rt9cyXW~W 7 S_5 MIy J* (n8fTвr1OS`;Y Mj@J=_~b1!k[n 0I,Q)qRYǠ>NƱ1i;n 0Ik[b1!_~v6t9Bt>"iUoo#oOlȷfb V iUo>"tt9BƩ_W_'4aJ9.eZE2u9-߶ ;7C-- Yu,g~ZE2ueJ9.4adx8k l@כdXxa HRvЈRzD usP\3)qz)iEYFD0 ~W 7yXWt9ctWWO V_8.f`F4Y)el:pe=@כdXxa HRvЈRzD*SUKUb@UkZASS`;uZxWW>xUQHY:_~Mj@J=Y |(>xUZhV|@_~:Yt?Tto|}Yn"Qt9B6v{etXc`F<33sCl޷t9Bn"Q}Y|BC̽x#Ğ?#P90t*K4aW_'Ʃ_dQ5Cu,SQm-N4a0t*K#P9#Ğ?[.hb5r# 5n:I#>@כdXxx8k ld:'qi(6r,*2@כdXx:pe=4Y)el.f`F' %q"Su"/Mr"(H.z5r# 5n:I#>3B$-W$}) 䀚/'5VuWoO; c;aU'"~19Mh'UQH>xP ;Smf޷ULh'9M~1rbUA yiBpcA(|Tz|tot?Ttmc(mOϴ||TzpcA(yiB֎cy@&'<y#U`q#Ğ?̽xBCV z 6{D#Ğ?#U`q<y&' vN?<(W!4R$5r# hb[.ht&XchZ*c̣5r# .z(H"/Mr"!S(Ɍ;V1B$H\ N?<(W!4R$.]R~(GRy/CN5 ~ cB N9ZPQPW<@Pf[XZJ~1U'";a;B<DWHoWzW~1XZJ[@Pft-g6|#~s|M⺀it9iyiB rbUA|Bt@}?Wtٽ<yiBit9i|M⺀|#~s S>׬NB5On5HI R&'y@֎cc7qC›D;2Xl&'I R5H5On{Q;SXz SOux?"N?v nM{KjɓwM`N?H\ B$;V1eArr,RkxQ~ePSOux?"r[@llnu@ӆy^QW LBO _-s -U ԇB sA ׇ/ r wM eʨ }L Y Zz k6 1) Tʫ Aʨ }L er wM/ 0 O k @([^: 5; |B ee/ dO J~ x ] 3U ԇ} X?J7hksӴ[B X?/ A ׇB s< UƏF C / B X?[[3t[zQvhzp Kk @( 0 O d9yG\d QB e1 9$K YAl n lfh D5 MQd( N;] >.1 k @([^: 5; | qJ}E R D@ 5k @(1 ] >.( N; O* }rM{>O3t[zQvhzp KB+ C- RRK9[>dwcl n f. `OG Zp xZp x>?J 1sVՅ%`EqiɽSrMQx :lb ft +:`OG Gd 4GQ 7~EzQ9#t9c'M@戊ERkqRxr[sӴ7hk3-N;fj&il[RxrkqERxiKSKk$XS_)h/1u{3t[['y$~6Pw3/Y,3t[1u{)h/$XS_bu"=mn%pšŤXr=ˤYrM{>O=F_V20)C (rMiɽS`EqVՅ%VՅ%U rdQe[B7dKmn%pšŤXr=ˤYiK_`Eq^zgL)Î~t9ctWWO V_8.f`FO{~9}GO=Ks H_i(cnHXkER戊'M@E`eX'kymAdERnHXk_i(c=Ks H ThQS9J`)9*s $XS_KSKkxiSMC͝XC [W7$XS_*s `)99Jr7QA9Ϊ4$ZuZf];T gCjww2CriZfuZ4$KbQj̭ \[!*+mn%eΤZoJ (~{>x$E&Dtu"_mn%dK[B7Qe=+|J-@CO4Hڀj̭ \[!*+R+_PF ~C;tz.f`F{̓S5;V1Ї~|8 up0L*XA÷=Ks H~9}GOO{@ٔhQGYGBl? =Ks H*XA÷p0L8 u6Mr=`dh`tBq9JQS Th2HdH}t9Jqh`tB`dp+<`R97g:Ipts~0;q4$QA9Ϊr7XojM< 3,5x#MG4$0;qts~:Ip"x"VZ"+7]]j̭QKb_.&>R*79wj̭ڀ4HCOR)1+BVSw VZ"+7]] .خ)%+8;V1eArr,Rk^hheEeR$e:UYe{;@8 u|Ї~^gSCjc_N8 ue{;@e:UYeR$!͞@b̙p(gXd/`dr=6M#): VYN]~Wx `dd/(gX̙pav yD sz:IpR97gp+<`v0BD3˗:IpszyD  nkcd9mRbYL)RBO91kVZ"""x]<YLgnM\4K,=lVZ"w BVS1Y?0Xy7N/CQMMMhYL)RBO91k-g1#}19<*FqҎ9ZPQPW<@PfY. FYэ:VDg;by/W Vi &y;bVDgYэ: kާ =ZRSxF|vOeosU5/\T y7du9l@Pft-g6|#~s|NWx%tO2po_Yэ:FY. t$dNa(pK:HjmrTeYэ:o_ptO2oӱizc>F e$=Zާ kl6L|niF ҘvOF|RSx=Zأ25Xi ݅ՇvO4]> 50U%WQl PZ3J& O4]>ՇvөT]Q#3+hN0ӂpAoN9(N=#iR=Zn} LY҇v3+hVf; @WӞH>J`V2c>F e$^QjVZC !}։RcI|#~s S>׬NB5On5&ԏ1X+-9ӹ tO2x%|NW,_}A&vTPO8 tO2ӹ 9+-%ax+biodo]D `pc>F izoӱ[)3nwU5On{Q;SXz SOu.-$+0;,4b-ѲP +-1X5&ԏZ'27.0-pޓF~ +-ѲP 4b-}4y7wunr^Mf}bix+%am6tY K-\c>F `podo]Dbi D>iO XP+ QyV4^]mZy$L29g;8_;>@Qy+ XP 0z+ ,ILXGƒnH>I|NLSR7r9Mei;6bi^Mf}runqNl2EiW 6lf Y iO D>DxRr 5#EK%c f YliW 6eG&c1k b"BNb"BNG I,0z+ )g3#ӣc1k SOu~ePxQr,Rkq'oDl*هsJ(ly}׸4b-0;,.-$+~&"xi&vX|}4b-y}׸sJ(ll*هinne#ca qMh0p3Mnqo!uny7w}4vp7b)l,vpr>unnqo!h0p3Ma qM]RRbY(6Uy\(Nba`#iW 6l2EqNjSPMncP_H5`&f)4&iW 6ba`#\(NUyQO.`N/T[fTb"BNc1k eG&_+$X=UĘJ\vRr,Rk^hheEeR$fI'RcN^=eO;Fl*هoDq'/>:c:AB./l*ه;F=eO^YًhS[RL2u:__ZVa qMe#cinnW?{Uȗ>neR$!͞@b̙p%K9: |]xD?n^cNfI'R"v3hM@#Z^D?n]x |MV`*m3wgR=bL2u:S[RYًh.d9\8}5[za qM_ZV_L2u:FDX+?N>Y9)W<7=UyY(6]RRbn9khQnYFDX+/DfͲ ~9+cD9)WmmƤ٦/Tօֻn/0+ 4T9 `TfXf̙pav ]j1|^ +=V |9:%KH1`@~զSn6} |=V+|^ x.(q[{8jG0xa!fЁwgm3MV`*g/'JRPm Y nkcd9mRbYL)\(n\Z4czlE|^ j1]q> endobj 32 0 obj << /Length 96 >> stream q /DeviceRGB cs 0.000 0.000 0.000 scn /DeviceRGB CS 0.000 0.000 0.000 SCN 1 w 0 J 0 j [ ] 0 d Q endstream endobj 33 0 obj << /Length 540 >> stream q BT 36 741.64 Td /F1.0 20 Tf [<506c656173652066696c6c20696e207468652066> 30 <6f72> -25 <6d2062656c6f> 15 <7720736f2077> 10 <652063616e20636f6e746163742079> 20 <6f753a>] TJ ET BT 36 674.264 Td /F1.0 12 Tf [<4e616d65>] TJ ET 106.000 667.880 200.000 20.000 re S BT 36 644.264 Td /F1.0 12 Tf [<456d61696c>] TJ ET 106.000 637.880 200.000 20.000 re S BT 36 614.264 Td /F1.0 12 Tf [<436f6d70616e> 15 <79>] TJ ET 106.000 607.880 200.000 20.000 re S BT 36 584.264 Td /F1.0 12 Tf [<50686f6e65>] TJ ET 106.000 577.880 200.000 20.000 re S Q endstream endobj 34 0 obj << /Type /Page /Parent 4 0 R /MediaBox [0 0 612.0 792.0] /Contents 33 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F1.0 35 0 R >> >> >> endobj 35 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj xref 0 36 0000000000 65535 f 0000000015 00000 n 0000000656 00000 n 0000000721 00000 n 0000017528 00000 n 0000017592 00000 n 0000018358 00000 n 0000018894 00000 n 0000019427 00000 n 0000020050 00000 n 0000020669 00000 n 0000021283 00000 n 0000021872 00000 n 0000022478 00000 n 0000022963 00000 n 0000023114 00000 n 0000023331 00000 n 0000024253 00000 n 0000030657 00000 n 0000046578 00000 n 0000073069 00000 n 0000074614 00000 n 0000074768 00000 n 0000074803 00000 n 0000077456 00000 n 0000077561 00000 n 0000077684 00000 n 0000077846 00000 n 0000078008 00000 n 0000078113 00000 n 0000078241 00000 n 0000091160 00000 n 0000091287 00000 n 0000091434 00000 n 0000092026 00000 n 0000092207 00000 n trailer << /Size 36 /Root 2 0 R /Info 1 0 R >> startxref 92305 %%EOF ruby-prawn-2.1.0.orig/data/pdfs/two_hexagons.pdf0000644000000000000000000000210412665203156020325 0ustar rootroot%PDF-1.3 % 1 0 obj << /Creator (Prawn) /Producer (Prawn) >> endobj 2 0 obj << /Count 2 /Kids [5 0 R 7 0 R] /Type /Pages >> endobj 3 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 4 0 obj << /Length 195 >> stream 0.000 0.000 0.000 rg 0.000 0.000 0.000 RG q 1.000 0.000 0.000 rg 136.000 286.000 m 236.000 336.000 l 336.000 286.000 l 336.000 186.000 l 236.000 136.000 l 136.000 186.000 l 136.000 286.000 l f Q endstream endobj 5 0 obj << /Contents 4 0 R /Parent 2 0 R /MediaBox [0 0 612.0 792.0] /Type /Page >> endobj 6 0 obj << /Length 195 >> stream 1.000 0.000 0.000 rg 0.000 0.000 0.000 RG q 1.000 0.000 0.000 rg 136.000 286.000 m 236.000 336.000 l 336.000 286.000 l 336.000 186.000 l 236.000 136.000 l 136.000 186.000 l 136.000 286.000 l f Q endstream endobj 7 0 obj << /Contents 6 0 R /Parent 2 0 R /MediaBox [0 0 612.0 792.0] /Type /Page >> endobj xref 0 8 0000000000 65535 f 0000000015 00000 n 0000000071 00000 n 0000000134 00000 n 0000000183 00000 n 0000000429 00000 n 0000000520 00000 n 0000000766 00000 n trailer << /Info 1 0 R /Root 3 0 R /Size 8 >> startxref 857 %%EOF ruby-prawn-2.1.0.orig/data/pdfs/encrypted.pdf0000644000000000000000000000264212665203156017624 0ustar rootroot%PDF-1.3 % 1 0 obj << /Outlines 2 0 R /Pages 3 0 R /Type /Catalog >> endobj 2 0 obj << /Type /Outlines >> endobj 3 0 obj << /MediaBox [0 0 595.28 841.89] /Resources << /Font << /F1 4 0 R >> /ProcSet 5 0 R >> /Kids [6 0 R] /Count 1 /Type /Pages >> endobj 5 0 obj [/PDF /Text] endobj 6 0 obj << /Parent 3 0 R /MediaBox [0 0 595.28 841.89] /Resources << /Font << /F1 4 0 R >> /ProcSet 5 0 R >> /Contents 7 0 R /Type /Page >> endobj 7 0 obj << /Length 94 >> stream (CQ.[VZY/r|k ]Wۢ+I qJ)"%EZm*w<){ЮuhK endstream endobj 8 0 obj << /Differences [240 /aacute] /Type /Encoding /BaseEncoding /WinAnsiEncoding >> endobj 4 0 obj << /BaseFont /Times-Roman /Subtype /Type1 /Name /F1 /Encoding 8 0 R /Type /Font >> endobj 9 0 obj << /R 3 /P -3904 /O (ש[DFe'r\bP/_~\n\\x) /Filter /Standard /Length 128 /V 2 /U (ط|.) >> endobj 10 0 obj << /Creator (?ND3_) /Producer (\rxc`d;y\)m3c\n ) /CreationDate (j UhY`}:) >> endobj xref 0 11 0000000000 65535 f 0000000015 00000 n 0000000082 00000 n 0000000121 00000 n 0000000690 00000 n 0000000266 00000 n 0000000295 00000 n 0000000446 00000 n 0000000593 00000 n 0000000790 00000 n 0000000941 00000 n trailer << /Encrypt 9 0 R /Info 10 0 R /Root 1 0 R /Size 11 /ID [<9a50a636927ba6d5161926c05a44de9a>] >> startxref 1052 %%EOF ruby-prawn-2.1.0.orig/data/pdfs/multipage_template.pdf0000644000000000000000000000306012665203156021504 0ustar rootroot%PDF-1.3 % 1 0 obj << /Creator /Producer >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 3 0 obj << /Type /Pages /Count 3 /Kids [5 0 R 8 0 R 10 0 R] >> endobj 4 0 obj << /Length 92 >> stream q BT 36 747.384 Td /F1.0 12 Tf [<546869732069732074656d706c61746520706167652031>] TJ ET Q endstream endobj 5 0 obj << /Type /Page /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F1.0 6 0 R >> >> /Parent 3 0 R /Contents 4 0 R /MediaBox [0 0 612.0 792.0] >> endobj 6 0 obj << /BaseFont /Helvetica /Type /Font /Encoding /WinAnsiEncoding /Subtype /Type1 >> endobj 7 0 obj << /Length 92 >> stream q BT 36 747.384 Td /F1.0 12 Tf [<546869732069732074656d706c61746520706167652032>] TJ ET Q endstream endobj 8 0 obj << /Type /Page /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F1.0 6 0 R >> >> /Parent 3 0 R /Contents 7 0 R /MediaBox [0 0 612.0 792.0] >> endobj 9 0 obj << /Length 92 >> stream q BT 36 747.384 Td /F1.0 12 Tf [<546869732069732074656d706c61746520706167652033>] TJ ET Q endstream endobj 10 0 obj << /Type /Page /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F1.0 6 0 R >> >> /Parent 3 0 R /Contents 9 0 R /MediaBox [0 0 612.0 792.0] >> endobj xref 0 11 0000000000 65535 f 0000000015 00000 n 0000000109 00000 n 0000000158 00000 n 0000000228 00000 n 0000000370 00000 n 0000000548 00000 n 0000000645 00000 n 0000000787 00000 n 0000000965 00000 n 0000001107 00000 n trailer << /Size 11 /Info 1 0 R /Root 2 0 R >> startxref 1286 %%EOF ruby-prawn-2.1.0.orig/data/pdfs/version_1_6.pdf0000644000000000000000000000130512665203156017754 0ustar rootroot%PDF-1.6 %???? 1 0 obj << /Creator (Prawn) /Producer (Prawn) >> endobj 2 0 obj << /Kids [5 0 R] /Type /Pages /Count 1 >> endobj 3 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 4 0 obj << /Length 195 >> stream 0.000 0.000 0.000 rg 0.000 0.000 0.000 RG q 1.000 0.000 0.000 rg 136.000 286.000 m 236.000 336.000 l 336.000 286.000 l 336.000 186.000 l 236.000 136.000 l 136.000 186.000 l 136.000 286.000 l f Q endstream endobj 5 0 obj << /Contents 4 0 R /Type /Page /MediaBox [0 0 612.0 792.0] /Parent 2 0 R >> endobj xref 0 6 0000000000 65535 f 0000000015 00000 n 0000000071 00000 n 0000000128 00000 n 0000000177 00000 n 0000000423 00000 n trailer << /Info 1 0 R /Size 6 /Root 3 0 R >> startxref 514 %%EOF ruby-prawn-2.1.0.orig/data/pdfs/contains_ttf_font.pdf0000644000000000000000000001040512665203156021344 0ustar rootroot%PDF-1.3 % 1 0 obj << /Creator (Prawn) /Producer (Prawn) >> endobj 2 0 obj << /Pages 3 0 R /Type /Catalog >> endobj 3 0 obj << /Count 1 /Kids [5 0 R] /Type /Pages >> endobj 4 0 obj << /Length 135 >> stream 0.000 0.000 0.000 rg 0.000 0.000 0.000 RG q BT 36 746.352 Td /F1.0 12 Tf [<48656c6c6f> 18.0 <20> 125.0 <57> 78.0 <6f726c64>] TJ ET Q endstream endobj 5 0 obj << /Parent 3 0 R /ProcSet 6 0 R /Resources << /Font << /F1.0 7 0 R >> >> /Contents 4 0 R /MediaBox [0 0 612.0 792.0] /Type /Page >> endobj 6 0 obj [/PDF /Text] endobj 7 0 obj << /Subtype /TrueType /BaseFont /AAAAAA+Activa /FontDescriptor 9 0 R /FirstChar 32 /Type /Font /LastChar 255 /Widths 11 0 R /ToUnicode 10 0 R >> endobj 8 0 obj << /Length1 3312 /Filter /FlateDecode /Length 1846 >> stream xV}l[W?g?ql~qMi$vlQ+K+LHNѴ"iBeTmB!`Ӫm@Ѥ}EӐ@cV1TMT9gi>{;9ad (>W_)T^X\?w,έ,?#G<_G٥ t!+^Y_JOx_R-/yykqy.O@_ț>d/2f][w_D>t#?>H '/= !nw^t@ghƤPn;r2 "8~ u\st?:zוSPCWN!AbP&IW.BvF/^_]έ./Yώ:Y?[ Z3VQe`Va 9a GaP(qTq^ $h Q{ֱq4jnSܪVg.\fq\_xb <PUwan:'ݹ8ֱncz;k__^G3/e*!dffHz<3M33[Mo=U razO>\Bwڴk'0Ș\$//f3f+N~3?ѣ'~?\c_> ۏM_{7h4S)٨.*WJP( >hX<GL3Qӡ }#T* f>AQ39:TV%@mJ#$w MbLNJF $.q-k!M&!=G&QL% _Q9LaHAw,(IRWL3F0x+G6;M"@=Pxѻ;@-t#mM,nvQ$JhI!&Dr:p:CRTT2`z@ 0ߢ`4TJSY{Dzs3)!a iALv-]N$$ٝ8Ѓ0#ؒ.#! J8P^}\ob}GFb$ZnK,YnrUBQPv%qۺ99i؆mwJ$%gJ]ŽhdT\՜{67S T8uΒGB7/C'xސw9Ko@ߠⷮ`ARh}TdtAA7Hkk_=/~sS_ zśA> endobj 10 0 obj << /Filter /FlateDecode /Length 214 >> stream x]Pˎ >(ҪЇ `R  $J{b43^Zr䃽0ud'?Fqp$'0N GLn"-Yu-3Sv_sp7)B% MI!yK@8|\FV4mGUXdҼg=3q́sCv Rk endstream endobj 11 0 obj [986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 836 986 986 986 986 986 986 986 986 986 986 986 986 986 986 994 986 986 986 986 986 986 986 986 986 986 986 986 545 469 986 986 986 986 986 986 295 986 986 531 986 986 377 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986 986] endobj xref 0 12 0000000000 65535 f 0000000015 00000 n 0000000071 00000 n 0000000120 00000 n 0000000177 00000 n 0000000363 00000 n 0000000510 00000 n 0000000538 00000 n 0000000698 00000 n 0000002631 00000 n 0000002838 00000 n 0000003125 00000 n trailer << /Info 1 0 R /Root 2 0 R /Size 12 >> startxref 4039 %%EOF ruby-prawn-2.1.0.orig/data/pdfs/nested_pages.pdf0000644000000000000000000000302412665203156020263 0ustar rootroot%PDF-1.3 % 1 0 obj << /Creator (Prawn) /Producer (Prawn) >> endobj 2 0 obj << /Pages 4 0 R /Type /Catalog >> endobj 3 0 obj << /Count 2 /Type /Pages /Kids [6 0 R 9 0 R] >> endobj 4 0 obj << /Count 2 /Type /Pages /Kids [3 0 R] >> endobj 5 0 obj << /Length 203 >> stream 0.000 0.000 0.000 rg 0.000 0.000 0.000 RG q 0.000 0.000 1.000 rg BT 36 747.384 Td /F1.0 12 Tf [<5468697320697320612073616d706c652066696c6520746861742075736573206e65737465642050> 40 <61676573>] TJ ET Q endstream endobj 6 0 obj << /Contents 5 0 R /MediaBox [0 0 612.0 792.0] /Type /Page /Resources << /Font << /F1.0 7 0 R >> /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] >> /Parent 3 0 R >> endobj 7 0 obj << /Encoding /WinAnsiEncoding /Type /Font /Subtype /Type1 /BaseFont /Helvetica >> endobj 8 0 obj << /Length 174 >> stream 0.000 0.000 1.000 rg 0.000 0.000 0.000 RG q BT 36 748.452 Td /F3.0 12 Tf <5468697320697320612073616d706c652066696c6520746861742075736573206e6573746564205061676573> Tj ET Q endstream endobj 9 0 obj << /Contents 8 0 R /MediaBox [0 0 612.0 792.0] /Type /Page /Resources << /Font << /F3.0 10 0 R >> /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] >> /Parent 3 0 R >> endobj 10 0 obj << /Encoding /WinAnsiEncoding /Type /Font /Subtype /Type1 /BaseFont /Courier >> endobj xref 0 11 0000000000 65535 f 0000000015 00000 n 0000000071 00000 n 0000000120 00000 n 0000000183 00000 n 0000000240 00000 n 0000000494 00000 n 0000000672 00000 n 0000000769 00000 n 0000000994 00000 n 0000001173 00000 n trailer << /Root 2 0 R /Size 11 /Info 1 0 R >> startxref 1269 %%EOF ruby-prawn-2.1.0.orig/data/pdfs/complex_template.pdf0000644000000000000000000026301712665203156021176 0ustar rootroot%PDF-1.3 % 4 0 obj <> endobj xref 4 30 0000000016 00000 n 0000001082 00000 n 0000001142 00000 n 0000001746 00000 n 0000001780 00000 n 0000002312 00000 n 0000002841 00000 n 0000003461 00000 n 0000004077 00000 n 0000004687 00000 n 0000005272 00000 n 0000005874 00000 n 0000006355 00000 n 0000009003 00000 n 0000009117 00000 n 0000009212 00000 n 0000009354 00000 n 0000009504 00000 n 0000009623 00000 n 0000009718 00000 n 0000009868 00000 n 0000022776 00000 n 0000022889 00000 n 0000022963 00000 n 0000023170 00000 n 0000024090 00000 n 0000030492 00000 n 0000046409 00000 n 0000072896 00000 n 0000000896 00000 n trailer <<4E18BE5C8D344B8396B2B07B6C4C9940>]>> startxref 0 %%EOF 33 0 obj <>stream xb``f``(π YLYJ'}tبR'p+i+P*ƋX>2h;xP#>7D_j 3c}_ y` endstream endobj 5 0 obj <> endobj 6 0 obj <>/ArtBox[169.333 395.725 392.999 656.252]/MediaBox[0.0 0.0 612.0 792.0]/TrimBox[0.0 0.0 612.0 792.0]/Resources<>/ColorSpace<>/Properties<>>>/ExtGState<>>>/Type/Page/LastModified(D:20100423210221-07'00')>> endobj 7 0 obj [/ICCBased 16 0 R] endobj 8 0 obj <>stream H|Tn0 +kޚ͵0 ߗ%qIzo?|qen\l^9Fe r ,挬;BCJ0:ZBIgsFV٢OH B QegdݑetlNgsFVs3?MF0%ױF^3\盅 >Óy*'9g9Ĥ fEgRL0@yn* < Fw qY*UUم:_Έ1 Ō"q߽M C+b;>N7=7 73>eA5P5z!Q˪[7>}g8{V6NX!K=ŀeꃆfg|i,_ZYt P@u!TW"{O}y;Б2Iӥ_B]1JFR˿`= endstream endobj 9 0 obj <>stream HTSq,1 ˯ 5/^Q$:fr S(Ըh'Q_dϽ&y3mBU\@p[uAAw.I,$)K}bԳ{faNH dSvooy'Xt9+eS।!wCNZQ|ǩu'ػ~ -{\džx_o5(̭^˜65r`+~Qq$*2{`aJ%<= eNY* pMdƼ>stream H\SKSA ܿSނQ>BdAb"!q{NSj %Eg dbL8 ^IsLp& 1ʢ-Ҫ- W⨺]St0-Lbr޾/|!w r8$e}zkYܾ5hh2j XG.*uHm:|!vil@ӶGԯӀJYcrI}fG V0ʨg$, =w10! |\l @׆'Jp/ zBv{[R w+e~z0MGs8 5CӆP#>#LߊhPLx"XH`# endstream endobj 11 0 obj <>stream HLSQ$9 S/vl'3t㬍;ͫH iWULmYV1h#`[Y, $-ƉnfYGy6>0E6<o  b0q61gɽå<3lr64L[8EK|4)HX0{x0ռD( va; SK<K6Y 8 |=7vh*"\@xf䝯dTU_Jo+cZ*?)Q)S6rͪަ$DQh4"L7ʣ ͖)mYwk%:,~֔[cY6(CDdW Q,C2ip{qh>stream HlTѪ0 }WYm}l0 1` zGNڦM%H>cłؼ)w]趘q*{m5^s ҹjpm  X5H; T½))G4Z U(f u|\.W*\/w %^>/hw􉄾_`AjPG{mɥeu\T+d#`` .WTpAgWʇ~o?p1ܿ,;ҖfRΆ+\0%'[NbeUrceh`l^_Jy~wrV֛=)3#c cD{aDEYZr3O_v\#QY@ZL(/95緿18[NÅ8Z(3؛ Xsx+rF<ΆM @'|Oퟍ=yۇ0d#`-mqd/awB{C endstream endobj 13 0 obj <>stream H\TK1)C \z& v6c5F(<΋V}\iYsܻ{Ikyự/=Ek6΂<(GM2ͮ^Y%GfGUPCw |_ëxUNY0TnB |5bůFZ!}0 6r;V?ցa~g#[NxqZ'N~y|_ǟ,a|!sq Ş< ' e :ع8IpU h GsiJG@ Vi"X$Nh|70RD 1m[J?7|a_-\VALcV/LzWGohlfOޫ.5ByG `7% EQRWZLKt6uQra#/Pom+ ؾq`Jq-4#)F#]Co8ο #ߺ endstream endobj 14 0 obj <>stream HlT[0 )t"E1z~d?萊gLQN!nv2i髝夵=`Hl3}X;֔)y um:>܆*G>4y 3rrb>stream HlSAn0 HIyc 萶7̡ %]GK\7sk+tOGF8w_C9#ުϱs++LE^OKլPmd;.B*=xv]XTsn>fg4j>Pu|*A%+M>stream HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 N')].uJr  wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 17 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <> endobj 20 0 obj <> endobj 21 0 obj <> endobj 22 0 obj <> endobj 23 0 obj <> endobj 24 0 obj <>stream  V dLk  | } ~\ 2^ AM^ ) m8  V dA sAI-_[ x] ao) m^ 2^ AM\ 5 ^s2] ^ 1 Eu _y R A   Հ C(I GD  U) X;Y : 1 E_ˑyGOw)iUo!bL%*W(n8-R]#fx9V| |pD՟])R Ay u _ 1 E e/[ 6e)(5 \+l i  cB!  )qz Ƭ`H UM 1INrHW =O% Gvw N!   cB i (5 \+lݽ ^F 6h^ O= *  {Q $Te! #w H<, w]{ Q_ VQ n 1 E_ˑyGOw)iUo ;79-߶ZE2ur/N' OKK(5 \+le/[ 6e) ˂'o߶ c J[ %(5 \+lN' OKKr/ZE2usP\3u S_5 MIh^ OF 6ݽ ^? yc-UErx\ 5 $T}  W LX) ~"Q3jU j]M oat .d) {h^ O= *  {Qѡ {O ~m?7 EV9ں ٠h^ Od) {at .]M o5 7v~Rt9cyXW~W 7 S_5 MIy J* (n8fTвr1OS`;Y Mj@J=_~b1!k[n 0I,Q)qRYǠ>NƱ1i;n 0Ik[b1!_~v6t9Bt>"iUoo#oOlȷfb V iUo>"tt9BƩ_W_'4aJ9.eZE2u9-߶ ;7C-- Yu,g~ZE2ueJ9.4adx8k l@כdXxa HRvЈRzD usP\3)qz)iEYFD0 ~W 7yXWt9ctWWO V_8.f`F4Y)el:pe=@כdXxa HRvЈRzD*SUKUb@UkZASS`;uZxWW>xUQHY:_~Mj@J=Y |(>xUZhV|@_~:Yt?Tto|}Yn"Qt9B6v{etXc`F<33sCl޷t9Bn"Q}Y|BC̽x#Ğ?#P90t*K4aW_'Ʃ_dQ5Cu,SQm-N4a0t*K#P9#Ğ?[.hb5r# 5n:I#>@כdXxx8k ld:'qi(6r,*2@כdXx:pe=4Y)el.f`F' %q"Su"/Mr"(H.z5r# 5n:I#>3B$-W$}) 䀚/'5VuWoO; c;aU'"~19Mh'UQH>xP ;Smf޷ULh'9M~1rbUA yiBpcA(|Tz|tot?Ttmc(mOϴ||TzpcA(yiB֎cy@&'<y#U`q#Ğ?̽xBCV z 6{D#Ğ?#U`q<y&' vN?<(W!4R$5r# hb[.ht&XchZ*c̣5r# .z(H"/Mr"!S(Ɍ;V1B$H\ N?<(W!4R$.]R~(GRy/CN5 ~ cB N9ZPQPW<@Pf[XZJ~1U'";a;B<DWHoWzW~1XZJ[@Pft-g6|#~s|M⺀it9iyiB rbUA|Bt@}?Wtٽ<yiBit9i|M⺀|#~s S>׬NB5On5HI R&'y@֎cc7qC›D;2Xl&'I R5H5On{Q;SXz SOux?"N?v nM{KjɓwM`N?H\ B$;V1eArr,RkxQ~ePSOux?"r[@llnu@ӆy^QW LBO _-s -U ԇB sA ׇ/ r wM eʨ }L Y Zz k6 1) Tʫ Aʨ }L er wM/ 0 O k @([^: 5; |B ee/ dO J~ x ] 3U ԇ} X?J7hksӴ[B X?/ A ׇB s< UƏF C / B X?[[3t[zQvhzp Kk @( 0 O d9yG\d QB e1 9$K YAl n lfh D5 MQd( N;] >.1 k @([^: 5; | qJ}E R D@ 5k @(1 ] >.( N; O* }rM{>O3t[zQvhzp KB+ C- RRK9[>dwcl n f. `OG Zp xZp x>?J 1sVՅ%`EqiɽSrMQx :lb ft +:`OG Gd 4GQ 7~EzQ9#t9c'M@戊ERkqRxr[sӴ7hk3-N;fj&il[RxrkqERxiKSKk$XS_)h/1u{3t[['y$~6Pw3/Y,3t[1u{)h/$XS_bu"=mn%pšŤXr=ˤYrM{>O=F_V20)C (rMiɽS`EqVՅ%VՅ%U rdQe[B7dKmn%pšŤXr=ˤYiK_`Eq^zgL)Î~t9ctWWO V_8.f`FO{~9}GO=Ks H_i(cnHXkER戊'M@E`eX'kymAdERnHXk_i(c=Ks H ThQS9J`)9*s $XS_KSKkxiSMC͝XC [W7$XS_*s `)99Jr7QA9Ϊ4$ZuZf];T gCjww2CriZfuZ4$KbQj̭ \[!*+mn%eΤZoJ (~{>x$E&Dtu"_mn%dK[B7Qe=+|J-@CO4Hڀj̭ \[!*+R+_PF ~C;tz.f`F{̓S5;V1Ї~|8 up0L*XA÷=Ks H~9}GOO{@ٔhQGYGBl? =Ks H*XA÷p0L8 u6Mr=`dh`tBq9JQS Th2HdH}t9Jqh`tB`dp+<`R97g:Ipts~0;q4$QA9Ϊr7XojM< 3,5x#MG4$0;qts~:Ip"x"VZ"+7]]j̭QKb_.&>R*79wj̭ڀ4HCOR)1+BVSw VZ"+7]] .خ)%+8;V1eArr,Rk^hheEeR$e:UYe{;@8 u|Ї~^gSCjc_N8 ue{;@e:UYeR$!͞@b̙p(gXd/`dr=6M#): VYN]~Wx `dd/(gX̙pav yD sz:IpR97gp+<`v0BD3˗:IpszyD  nkcd9mRbYL)RBO91kVZ"""x]<YLgnM\4K,=lVZ"w BVS1Y?0Xy7N/CQMMMhYL)RBO91k-g1#}19<*FqҎ9ZPQPW<@PfY. FYэ:VDg;by/W Vi &y;bVDgYэ: kާ =ZRSxF|vOeosU5/\T y7du9l@Pft-g6|#~s|NWx%tO2po_Yэ:FY. t$dNa(pK:HjmrTeYэ:o_ptO2oӱizc>F e$=Zާ kl6L|niF ҘvOF|RSx=Zأ25Xi ݅ՇvO4]> 50U%WQl PZ3J& O4]>ՇvөT]Q#3+hN0ӂpAoN9(N=#iR=Zn} LY҇v3+hVf; @WӞH>J`V2c>F e$^QjVZC !}։RcI|#~s S>׬NB5On5&ԏ1X+-9ӹ tO2x%|NW,_}A&vTPO8 tO2ӹ 9+-%ax+biodo]D `pc>F izoӱ[)3nwU5On{Q;SXz SOu.-$+0;,4b-ѲP +-1X5&ԏZ'27.0-pޓF~ +-ѲP 4b-}4y7wunr^Mf}bix+%am6tY K-\c>F `podo]Dbi D>iO XP+ QyV4^]mZy$L29g;8_;>@Qy+ XP 0z+ ,ILXGƒnH>I|NLSR7r9Mei;6bi^Mf}runqNl2EiW 6lf Y iO D>DxRr 5#EK%c f YliW 6eG&c1k b"BNb"BNG I,0z+ )g3#ӣc1k SOu~ePxQr,Rkq'oDl*هsJ(ly}׸4b-0;,.-$+~&"xi&vX|}4b-y}׸sJ(ll*هinne#ca qMh0p3Mnqo!uny7w}4vp7b)l,vpr>unnqo!h0p3Ma qM]RRbY(6Uy\(Nba`#iW 6l2EqNjSPMncP_H5`&f)4&iW 6ba`#\(NUyQO.`N/T[fTb"BNc1k eG&_+$X=UĘJ\vRr,Rk^hheEeR$fI'RcN^=eO;Fl*هoDq'/>:c:AB./l*ه;F=eO^YًhS[RL2u:__ZVa qMe#cinnW?{Uȗ>neR$!͞@b̙p%K9: |]xD?n^cNfI'R"v3hM@#Z^D?n]x |MV`*m3wgR=bL2u:S[RYًh.d9\8}5[za qM_ZV_L2u:FDX+?N>Y9)W<7=UyY(6]RRbn9khQnYFDX+/DfͲ ~9+cD9)WmmƤ٦/Tօֻn/0+ 4T9 `TfXf̙pav ]j1|^ +=V |9:%KH1`@~զSn6} |=V+|^ x.(q[{8jG0xa!fЁwgm3MV`*g/'JRPm Y nkcd9mRbYL)\(n\Z4czlE|^ j1]q> endobj 26 0 obj <> endobj 27 0 obj <> endobj 28 0 obj <>stream %!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 13.0 %%AI8_CreatorVersion: 13.0.2 %%For: (Capps) () %%Title: (slipz.pdf) %%CreationDate: 4/23/10 9:02 PM %%BoundingBox: 169 395 393 657 %%HiResBoundingBox: 169.3335 395.7251 392.999 656.252 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 9.0 %AI12_BuildNumber: 434 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_TemplateBox: 306.5 395.5 306.5 395.5 %AI3_TileBox: 18 40 594 774 %AI3_DocumentPreview: None %AI5_ArtSize: 612 792 %AI5_RulerUnits: 2 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -607 918 1 1829 1055 26 0 0 50 75 0 0 1 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:0 0 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 29 0 obj <>stream %%BoundingBox: 169 395 393 657 %%HiResBoundingBox: 169.3335 395.7251 392.999 656.252 %AI7_Thumbnail: 112 128 8 %%BeginData: 6202 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD92FF848484A9A9FD05FFA9FFFFFFAFFFFFFFAFFFFFFFAFFFFFFF %AFFFFFFFAFFFFFFFAFFFFFFFAFFFFFFFAFFFFFFFAFFFFFFFAFFFFFFFAFFF %FFFFAFFFFFFFAFFD2EFF5A36070D0D0D07303684FFFFAF60143C363C363C %3636363CFD0636353636363536363635363636353635362F3635362F362F %362F362F362F362F362F362F302F7E84FD29FF5A0707070D060EFD040D06 %2F7EFFFF3C0D1413140D140D140D140D140D140D130D140D0D0D14FD0E0D %070D0D0D070D070D070D070D060D0707060D0D84FD25FFA9840D0E070E14 %36360E0D360D300D0D5AFFFF611436143614361336143613361336133613 %360D360D360D360D360D360D360D360D300D360D300D300D2F0D300D2F0D %2F0D2F072F0D0D075AAFFD22FFA80D5AFF5A8484CFA8FF845AFD040D070D %2FFFFF3C1314133613140D360D140D360D140D360D140D360D130D360D0D %0D360D0D0D2FFD0A0D070D0D0D070D070D070D070D062FA8FD21FF2F0785 %CFCFCECFCECFCAFFFF850D360D360D0D5AFFA93614361336131413361336 %0D140D140D360D360D360D360D360D360D360D300D360D2F0D300D2F0D2F %0D0D072F070D072F0D2F072F072F062FFD20FF5A060D84CFA7CEA7CEA7CF %A7FFFF600D360D0D060D84FF361413140D85845A0D140D135A8584360D14 %0D130D140D0D0D13FD0E0D0736845A2FA95A0D060D070D060D070D065AFD %1EFFAF0D1436FFCFCFA7CEA7CFADCFCFCF4B2F14140D360D36CAC97C7C13 %36FFFF841414145AFFFFAF0D3613360D360D360D360D360D360D360D360D %300D360D2F0D0D5AFFA884FFAF072F0D2F072F072F072F07A9FD1DFF5307 %0760CFCFA7CEA7CEA0514AA7A79A52592E352E7675BBBAC1BA7C13AFFF84 %0D1436FFFFAF0D130D360D130D140D0D0D14FD0E0D075AFFA90D2F0D0D59 %FF5A07060D070D06072FFD1DFF300D0D5AFFA7CFA7CEA7754B4B75C8BBC1 %BAC1BBC1BAC1BBC1BAC17614AFFF601436FFFFFF133635360D360D360D36 %0D360D360D0D0D363536FD050D362F0D2FFFA92F072F0D84FFA9072F072F %072F072FA9FD1BFFA9070D0D60CFCFA7CEA7A7A0CF7CA798C198C198C198 %C198C198A0521413AFFF600DAFFFFF130D35FFA8360D5AFFFF5A0D0D84FF %605AFD05FF350D2FAFFFFFAF84FFA959FF7E84FD06FF060D06070684FD1B %FF840D0D3036FFC9CFA7CEA7CFCFCFC1C1BBC1BBC1BBC1999998C1A81514 %36AFFFAFAFFFFF36140D36FFFF361484FFFFFF0D36A9FF60FFFF855A85FF %FF0DAFFFFF8485FFFF845AFFAF36FFFFFF84A97E2F072F070D5AFD1BFF84 %070E0D36A8CFA7CEA7CEA7C998BB98C1BBC1BAC1989998C1C9FF0D1413AF %FD04FFA8140D140DAFFF600DAFAFAFFF360DFFA885FFA9070D0DA9FF5AA9 %FF2F0D075AFFA95AFF840D5AFF7E070607060D0707065AFD1BFF7E0D0D30 %0D85CFCFA7CFCECFBBC1BB9999C1999974C1BB9F2EFFFF361336AFFF8460 %FFFF84360D1460FF8436FFAF60FF365AFFAF5AFFAFAFA8AFFFFF5AFFFF36 %0D0D36FF845AFFAF0784FF84072F070D072F07072FFD1BFF84060D0D1436 %FFA7CEA7CFA7C998BB9899989998C19958070DCBAF131413AFFF600D60FF %FF84140D5AFFA936FF5A36FF605AFF5A60FFAFFD04845A5AA8FF2F0D065A %FFA959FF84075AFF7E07062F0707060D065AFD1BFFA9300D360D36AECFA7 %CFCECFCFCFC8C8C1A07C7D2F360E0E2FFF84141336AFFF60141385FFFF84 %1436FFAF85FF6013FFA8AFFF5A5AFF840D0D0D365A2FFFFF36070D5AFF84 %60FFAF0784FF850685FF5A072F07077EFD1CFF2F0D070D0DAFCFCFA7CFA8 %CFAEFFAF60131414140D0D077EFF600D1413FFFF840D140D85FFFF5A0DA8 %FFAFFF350DA8FFAFFF0D36FFFF363535FFFF5A84FF84362FAFFFA959FFA8 %075AFFA836A8FF2F07060D07A9FD1CFF840736141484FFCFCFA7CFCFFFAF %611436143614360D2FA9FF36361436AFFF8414133613AFFFFF5A85FFFFAF %360D85FFFFA9360DAFFD05FFAF0D5AFD04FFA8FFA85AFFAF0730AFFFFFFF %A82F072F065AFD1DFFA92F070D0784CFCFA7CFA8CFCF600D360D14FD040D %35FF84140D1413605A360D140D1413605A6035605A5A0D0D0D605A5A0D0D %0D365A845A360D0D0D365A842F2F355A2F5A2F0D072F59842F0D060D0607 %84FD1EFF840D0D1484FFCFCFCFFFFFAF143614360D360D0D0DFFFF3C1336 %143613141336133613360D140D140D140D360D360D0E0D360D360D0E0D0D %0D360D2FFD080D070D0D2F070D070D072F07072FFD20FF590D0D84CFCFA8 %CFA8FF36140D360D0D0D0E07A9FF851314133613140D360D140D360D140D %360D140D360D130D360D0D0D360D0D0D2FFD0A0D070D0D0D070D070D070D %070D06070DFD22FF5A0DA8FFCFFFCFFFA8360D360D360D0D07A9FFAF1336 %143613361436133613360D3613360D360D360D360D360D360D360D360D30 %0D360D2F0D300D2F0D2F0D2F0D2F0D2F072F0D2F072F07070DFD24FF5AFF %CFCFA8FFCF85070D0D0D060D0DA9FFAF13140D1413140D140D140D140D14 %0D140D140D140D130D140D0D0D13FD0E0D070D0D0D070D070D070D070D06 %0753FD28FFCFFFFFFF5A0D070D07305AFFFFAF1414133614141336141413 %3613140D3613140D360D140D360D140D360D140D360D0E0D300D0D0D300D %0D0D2F0D0D0D2F0D0D072F070D075A5A857EFD28FFCFFFFF840D5A5A84A9 %FFFF851336363613363636133636361336363613363536133635360D3635 %360D362F360D362F360D362F360D362F350D362F2F0D362F2F0D5A5AA9FF %FF532F7EFD32FFAFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD %FCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD %FCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD %FCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD %FCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD13FFA858A8FD6DFFA80B0558 %83FD48FF7D837D847D837D847D837D847D837D847D837D847D837D847D83 %7D847D837D847D837D7D052D0505057DA8FD46FFAFFFA8FFFFFFA8FFFFFF %A8FFAFFFA8FFAFFFA8FFAFFFA8FFFFFFA8FFAFFFA8FFFFFF832D052E52A8 %AEFD69FFA82D83A8FD48FFFF %%EndData endstream endobj 30 0 obj <>stream HnHށs 2 p$F`8%AKO?9U\Ȏ й?jgSgygl}&q$<)7tڜF\X,݆9BEvn& ~ZNI%ݢEv1_9Yޟtg5ݡN$OIXFg/Q_|y]ੋ3(5iLRL4 ^9DZ[ߴfunjlOt^f],VGbz_O5|n/yY٫ͻbu#b(JTl/_ܠXG{y1^ i؜a/ڛtҌCKoG82NGֆ _~FVbٝĢDFI_fh7oEլ]`ow1p .vy+K*l/O- !^ˋկgil#/I9EIlL$Sđ5ag ˡ{7.if~=_UlQoI6WeX1T|9mLgsToM;Cщ\FL&. ӓX1.d@]4ESƄ(F2ьaR` 2~@ AR%7Y)) y eUU5hZպ6 -Ȁ LRt5M$@6эicL5c))] Ă HXH4".#tuJR PbNF 9.4&1haIMfr'BPgSb,᱕V[cu5,Ͳ, jK\JQ6wy7E%(㝑cgt. OƏh3p\+-% `=JIYYR\$X)0K!?9/IICU E^N'_݉ΒeH4t4 IC I T:9YPFnk@SY 8ĸ %.Pg^,&oP hВ,~ 糰94&t m8mGd1S&r)OC$42Pߙ, `!I,o@l=?IlKʐ!H: 1(FԂ>\'dGB$ɐ9bgt#F)q>($q$ V>T#se>I3jO:[E]-~c z׹y(9P凧~x<_mJoNtVZc{YB=km&YM,AJd;1t^B5yp2rU]ج&8DdaqR/p '|N!"ı8F:6CWoՑ#{aRf +)$AGj`@4RdVhBT@{xv0D%B 1PP9]1khxX3nq}W ]]1:V:)`&ɇNCeCeA?E_\KmuQCN:=8EdJpXf8P>`C1֌? zxd<"z|7"}djLfؗ ٻU܅JE_/B<)H1Chz%p 1$#8} ]Iv6[wHJشkǽsGiei5F"dB vF:Fޯ!P+b.q07Fw;>`h3g,N}*QIO!"!dOR!yCa ">1zQIb݀c\;8\Klh$FB՜{P(pC%|R(zד#1} uyJP)秔`Rc 9b'쐷9kt٪c!cr$D}[תkbL6>MEHkV rFzӌ;D\Q^nDv +8Hoa>CA џ#qU x8;'kE[!єAxF?D-m` ; Z!Xڐ 8ILBE.~}8s$Q&nR )M 1ɿQgDQMI=)s„9qVO zBfQ`8$fQ+>ȠJKK"qi. 9$2OqH@g"DI^ 9BD/K\<%jI*u6f#}]s1mߴLAщB`aaln6؎ؚha[fߵp|ʡ:Hedp|d qqhxze|t`s2]^qY3ĝ Ѐ2a[E$sXq'#sNN,iZRDeFX`e^ȽyxC>ωi,wsdtӂq6X^.hEyʗ˿5i#/ =qVyO4"UN@lnff:ReݱHAkJ)e Ucjc ՠ;F4;bk?q2σA b"H.1|Z. @N*<,=UrW] Y|YuX7rH;V;{t[6Vɟ.,֖Jt{$V7(hyDXmե};e6$-))><-crK6U{FYUip"3) ɽ)Obކrz%%uCX]/ՏQ ~ CSda7čPB63 Vw IfW:M_DJeoq>$ SL3LF"R#%P W\= civpRi>ͅբZ?P/J[QKrYKwonw{J+ƁEң:;澱һUN7(/Wt7?|,W힞,U5I|;% XZUhh(⮫tXFޔWeJR u8su~o~Pwi1 ׼io*3,Q;yl.Fj<vuquY?X unϚdڝeZjǠOԲP_ЫUvXN) eQgmk~{ӷn^Sqfнᧃa#V㝆f ͖*1-Y'-1\^[ .ad$6*pRml 1LޣEU8yo,t=Z}:ZVs_Fh}!өJ;%>6R-sݣbk*ٵ;zN.=vEŽ`SߒOOu?tG̜P {1ж%=fإ`Wt'kɍy-{}e۩F(KeW;/UږD!\G'l" 3.:j'@Kt:x?V&iA$'յ:QZ֞#'[߽{I5ZqRx)5:y/LCi>ަVS/mjրJ{S|nw6k:ǣ\zx|ѿ\ܥΛkwg};/`tJ?SU鷕_n~!?:yhm"ufga^HMS~/Y[+vyէ-v>?&GRl?S5+=sj>UOU顓z85[ՕFtNMaJCݽ᝵u*YEEYn oq僆^[o]}|:m~y1;CcH%ϗZ}i=ڨS9+]㗛{<=lc򇵑۰.6r=KdVI*LJv>{ٮ5mNX[|\}WEX cv*;iI{2z௮yBU:1TAj!~˽"X_~˭oPހ-iX'SRmomrF c'c̑BNY9_ xհnKƇcu6U 0 XCDgٱ9b2%+X?5Iy*b"L<#OA,  YN*N =7h0لE1Ml c^YF8*ن])FQH @P^;D( ʨnqY3RJx²t#+}lBJ-N-1ȩԴGX 8g4̰3q|)J73FKk 2F58Gpuv^c  i Zj,BȲ8R&Us8m)KwXq ^yw[륤׼#0c,_~80WOw3Ძ8ͼX`zyּVll- m7rQ3h$tC*ml:Jș`'U&TW w1框2TE*Ե4'p8(H945ApǦ\ઇ e u$P+ACGʦ"C٫'P7\6#?䦭=A =>Ά .8>q@缗Vfs:tzw"&bxy< n 1 !l%@׬Uo5ܤ.y+nm7sE3gm-6eLD1.]aHM/̓޵<عli/ bD1!_I0knיB7;n ]S1͵{=y}7R>q%N%a0&M2!iTuMSxxS ,u-I#m- 5- Yg[ sYʾam,+QnIJg)67 LHE9Ŏ/{{ڼopx(Z YTTdH򻢼2ւty vH+jJdn %sëq);(QAx1qrX<ۍptV 99&L:3NWb%ևׂ R͎-!~6=o̞ŷWhdI҈xN"ҭ:nr(JXYwxiYvKP^3+/X婈#hUbBF} z)qA#X]a/ DUxYP}Y,y{RPR&,f@&,P]4墥uBr{ >Cl4y#Pv0F0aR[Tu<(B,7->Jv3Y * p˖DS5XOW_Q\GKϬ:ŪA<`J mj+1B@xi.#^c WaVs -u X(48t)f3|ǿfA+@gC,xoф 9jrXc(|IB& ^ RYٻ}`mtaiQAy?rOPV ]lwio=kb{YMK铎fכ!/xۇA}pP8imsU|3L ߏ_3DxtH<%=r"7[cדU8|^(bXR%=K1 zgCsW?<3;󛲳Q ɍ:+q56sM<~RK%_OгM9vmYYyRVEfת*ð}eV+r^# (5}@5TEɨTHLMAlݐ욌YeƪY1K祲 GԔO3_=8Se֜vP)9KWa(tk5< kAuC_Qv8KCXXb!ͿXP(.—ZXYqXA@^P,Ϭ}[P + TuA~,'h\rZZ\ ΜA%b g5< Ʒg4ϊHg?XP RI|S  U3bx 5U*I*0r|~2AY^-(8{(84>LA#E5Cl"Csl!bMxB)Q]ǧA3y"O&&wk#YM<46*L7#ҧۘw0Pqy&7nBǺMZyGB ENCEաZ sB ښʵ MQ *0^W:hDHh_H:C@bW@@|\B aaxggj~*Y ]/~uEwCۅ2)ePtJ Nذ6 ?HΦ+$AgMft)XӮd;x섆ՠ! (cSoBЂz6 { K^():;ky`F`#磰 %G7TyNt7T2C|Сň;QVenݓЭhl:+w?HpY3yoLkPqe4x@X)>T;^d@d0hV؄W߉jQ~+LsYˇC*?%oWI ]Wk^n3{b*G a餓Ԛj=ENQ\έ <šae5kOy/!ޖE98[E#pkNu!Fb~ڼ-CƻfĬ4Şub Ѕ!wμ!˾}zsl^͒fLc*! ^X?bIe,T_]hIxPy9L}S:::'kb*6<\םsn*xuBˎok?y/ڗqYzoS4!$K6[7YXXt<;4T †M}8JNgvhg[٠kZP@|[%Vm;84>:҉(M ]"6.idFjH%/cAkte5ʀ]C:o]}/vwq!lBٜϵuی?Xڪ-_em(kvg@~s&u{eCHM'p4w5L|)R!@Ϛ/?J.}ڏ8y=dm׵C~r bBhh,>aP,GXqcZ^Vco3enϟ bX>6@-?~tkeYue*fmt_)=bU_+R/$ko`F=j6BT .T'OK+ip}3ck4W ځN uFwe yROץ&B9¾,}+*{9 zT1:fvcJ@ #L+aDŽ1QK'L:wu{xie aOSk cÓ>:aUl%wNhKF`)WoxY8NmSr&T{`ěQdmD޶/{g}t_ɔ-̝=!?7>~ڹR+gG%"k;גsڎ%nRoOίbiEt_8+-nX͋rp[3\NCvq. ^[nϟbUO%R엇c2'1T>HksNڿT9~iZ4WYk۱+JßerZ{뵇8[Ể͋ӕrlv,կx| !OXh'unmN:R%)5PrC.]\ԕkSGܻZ8يV\zDF͍ A2C3y9UZ՜+JhW*y~1> a8%+*_K[iWڊG DEb)-}]cɽ]}R FFrE;W+W;;iR\d00,2߮/zl,w'ε=K:ЬNwԁCӻ{b>О,/$|?Z%vt#!Ά-s^MԊ)7i>}u]noS\2./zD~6 u=̮*eV^ny]L+@A=ɩU֞W:F^&27ƅ<;/&cY[c-"tsW&AKi}Ŵ5],D qL.9\6h嬼 Jh}H 설;gFqJZoO9Rзߵ$f/Љ8Y l,}.̎Wĉq f^%Y7-ej*z,`p%9.`z`<.нl8%Fs|aclG.;h"ņb}/b(bqa$=+#ņb.fDaC +Ӟr A KBSŅ.W@לϣX ~s(Jte|ҵ1:H BRZcIIhuD#;7qy-?<lJ>Rs%΋""\Z"} 1ͷ53``7 Rǥ$+RT0wњl.X29vK۱F&Ĩ<$q$FXsͷ F;QH Jqr@gDވbW5O|S׷{5__^3NtU;UM!#R \-꧟KhC T^p߽H7_RIO֌P6Pe֌5!w[hi6PTkt9) -ɤ'3:'Op.m}$Er{e0;F>M`$Dǵte-lVkǗxWRz,{ͲN 1K/%Bpc#'O\01٫4G;vD-P%Yic(!@Skݫ;iNO[bJy}vTd荧\.=ʅ(HIz@GV"#(ju$o2L bM )%%.޽w1nvs[JRZIJOl:t|2%TR/H Rc1A(CKI}ah}]-7D5qtĎ}[wL7bԎ9S%1]0iCe09lnY\##;%:ȶ4OsA3;?,` cmOq+X'"9eyeMƅ K$AYs?. $$P{m70coRd! Nm(dz2G8d ػm.Y 3TAɢXaq3;C0bTWۓ۝]1'Xd5g8^QGzqDg(^QgGG(bq3dDQU|nZ%j0_~N?cRtq #GA0!NN,CWa "s&sd]MQ #,v(q"&ŎtQb's)~OrݼutgdJqC]lZ?%EGjyΰ #*mN?6!lsL-Rԁb ᘄƄ_`$V|0f[iRjʍP n|?@2T҅"#//t}0Gi^ev{[할ʺWb\S/Ni?f NDa1 !~51zep"&(TE^lyJ$k: TF(X+ҴFl2S_ ;abcpMRMlNT'C9FEEz)7B \/lDJΡ+eu9^V5SޛӻO7ƳƉzSi2Vhd7,[luk8 o>stream HWZH}<KK`EA]YGFAݝtt7NR+ YZƧ=0d3|^fgLOd$(Z~]Kkoi#~Scjd~|JRz =VT}| U9(o^JƸ[Aj+XZbCWۚz%:Er\ >Cp:!;܍iOl4/2Ŏm61௝bd"Ajf%EV{s1XؠMF#IMEMwe&C?*YFP`}H{ c{X0M hl< cO r: cD /+X]%B% $tVY5ri4;` Gc=M αT/g=^ݍq;bݕSpze.u'^o R] R9^[<cA`,,q=a`ەE.cS迂. +_u@9'.xʗzmQ\#x s[A1APF RO4H j: OZ`4.ȋ({7ɕЦ?.Bl}?826t n;/ @Fg,"mʾI|VX$bLv.g4!믆G+ ΫHf:;-LJ#ܳ qvcGO? VgDqzq5 `w5=e1Hl˽ubMZǁ+PTj+bXHDzzH z[ۘ.{7b}(XFFNv}Z^{9'_}Œ?,Ȼrc}Ҕ[ rƕdH̱1|ЬJf/ጄt࿱$ :mЛ^$,;nݝzeo1P~zn;nAEϧƲ(@JVV+ j"+LKwL 1B2 S9F#f M*n>sʅR|h# j6*u ИT͒*YyIZLabU`v/$Iw뮤tbO%A3%U#F ѳW{ߜؕT5x@VR 9 ƾ+)vڇ&㹒jsNu^l?@meAYiC6M"؆S1˃!0E6c`lCq5܋"?TI>N\ΗbN Qe +vBP#c91)I&-xIGFFHI|d )\ zńFa#Id#-l9{K;W 4NI;`-ƷS?,o:哂[̞*kxն$2;[g2"{i#J e!!-Flnsk[ GT WAƐ),/qr\oqK>T+\g XkL;JH>s aj "Ąa5}K5%p1r J5(v[Ms"18#V^o">N,uL3*ߚwx`Wn.λ1FNLPӚDuì=_nf3͟ѬZsef{I=ڣ85j%R-GKi*E1]=1Oߡ4>e3$Va:a4J͓b/* @Hg޴~{M>]Uag; קlW9d8"iiB/>NSTQ"ӕYTMh4I 볭S/<ǝ%9!޻NHxDwZ Nr1;ʧ($?(Bh;HF4S^ 1R7uJwXӞ7 $3x*,zֺFN_hO8WUGܨ ^ dZɿ-jijI+nUZK!w1Hb{_-X5=8$nz-<*81Nρ}\>kBK'Ж(Ol%䏉Nif2W"B3BOOYXc̖vXNaJ2 1z =' rt:h=$X~6̥&AoI{lP0s8ə[ uӵ'(9)K[OIXO?'Cڳd,#˾Ʋd,w8ƴC2?$c1mjW}% _}裄Y&NOI7eǷa?1cQWe vG PVk@(FiLG(dn3sKh|1rR24&,Jڈo^n@+a@S JME1\Xxvgs&ӕz5fx6?B"-,\D,@ .vI"V hG u\<] @Ó0uJBUx.]H]w?Uޗ,E?BQY\J}]r)2S!;3 ?d]ν:g&+dT^*rM \\յ.)7U%Ӕb w:Oif$ɔdvz:$+»ZK2M1],$4Cm/b}CoB{s5`Rl#V=qQ: {mQ:mvqz+K靻@+8SmnNBkP0f0 0L oX5jq8!(U[Qx趗ԻhsJ%gB"R2҅xV,&anPKim_2eKf^I@ (ڀr 3 4z[09GZxU7b?* b10> db!gOQZE%B4]CC@R; yӰ89`$l蹖= a?OCl iC$Tu84bqi^0,L+1ΫD<8 ]z!?d{ccL:WʜޅD~9mJ54;#N P,gci8pՖNHm-eŪjޟH68ak4TNrWhh']ػuV=ۊI +ua4TkL`k81 +Ԏc4WX S05M}AFleςpTK0lCk(ZC9ӑ7LjuЗFczlz `=X,. YÀ 3`\~ ̙YHt_RtPAF +-Ms}jPÜÌľPtCqr"֌;ξ˰X45ձ=hOntq 1.S8[ѕSw!P=?KKY]|`x7"HVf{]̗c#CG3|ƱN;ub\xSOoׯz\ՖX9){nW{>8ENyF>[6xѣ̏wHBC۳]nV jT1AئD1o}OBZ_t%aKl:ŖKpmBŏt@_DCr&\iiG-~n0? /\/gZykfYER {|?UoR>72˳'/.C,W*\9~s.1g>{F_뷺ܫo' V*FBrB3Wh ?/V@#,\ci׶wÕu2WhŎ ׀` Y2\ D r/zU`_Fc),3,L~SѸ),ݱW/cs&0}J)T4aNJ !r̍tOwb4 7O&jqp%c>֥lߟiS_ _('FNNK+a~5TrhҖ#{뾚a]qp[WB{9y BfU\!!D ] Еz+ s$F(HOf #l8XjJbyOsپK[7>H<%AĊ쥴 ¹2CUZT1GUsnZw F\Rr~ξŸ)q -e ]g6C*П تU&f^ÑDtڻ,;mIZК'={{#] ciy̓aHhIE.$> :d إ'J:*ip%(TNJD M9Ă[Yˢ5 {AyIH"߸?d I@POPxjCjʅ2}$DDVƷMf[X\Р7c\nM.{TJnܠ `KK[X|v6V͗N= u RNN8[F'zun'k'{w0  %!4 _ٯ$˶ e-霽O]'p>]W Iv8 t>vpsgX m{4?; ֦z><ж<=B.ZNX;= ׼!H'wD!# pCA@\@^CAH^!z eRcK*Y >B`nyh3 86 H\C:"za00SwP?&J*A9 B=•J2|k-W/+e]^Wоs .G8Fc9&K'G]c!S8& i|=v cTHTBYOQ<P~\Ѭ  o9r+1V?MNI~p i02WR'$zr a}/ZsG:]`;&4,05xm?T3\AiO;WdT-&_NiƄ$k8l@+uجW ;Teڐ@+)LY56]Uk(~6vPkM+~|+=;xQIXӭ`-y0Zco>urw7p饱A`,vkjѾ0{ d ij ߚ^/B4 &C lZ\/ 3YyHhpGXwToS(M@y |WYHXfYɐ=lk{#W ݗ(^Xp~,CVX@C Oo~:XlPFr"PU2pJj(ssZi ;iO$ _rs>]Wϯ_'sښOtz3oSXW6ϣtLrEm48vyB OGG7)JȝLHm=N S]d+u:j&Ң-J[ܔRg9BCi ")_kS8]%OiJ_SXIz5FeB\|8#BxhCǽ%@eo?*"<_W'B'O` 6&<^8)(!AG/޶Mx{etqL&n! ¦`פ2մm*IaچqThYrrG.{84\8 A} xmi(Q)p Kƹ4[[* kT@g_,\$֮U(`CMM;u 8'%\ߣgQ(@ϰv\vwx-Pe+7r-b`D*Mn~Ԥ{\0*D]nt^2l+ Q%Ak= .(nlA=--3}ov{bk>~كdvXjߤ6s}U%=?c?JZou݄#uy@>"cd>X@\|~qj@|v|kMߢ[k] v;4sʄVԂ#&PVx]ngl .uPh>`kUO$HviwOz:CYP|2T# mh8 V𝕝`xS.{ 5ƒ"dzc`f ܯ1تpS/t\%{Ĭݠj@]:..О P.p vBVwIj` (..CG ln;0Rt\7E.!!]R\ ol0leK }kNĽh% 1ʏE"~dG& K1x`Ō501IhNTD⫽+dc~w`k*O6~z$LMMuկ~Uս5HS >Ӷol;<7_Ԟ^ȉ6xw[;4o[pY^EpКe,WH,,l)lqR{wmr12˗rmk5{-Nl"kKsW>}Y/ {c/^xD3 Q: :ň}s`\#: ZuA$01IF;a_Cb Nd! ȎM EW =LzOÁ{7 F_.`FX A4|*]* TyJir,}k|B{P.2#bY/"J' Wڰ+dT"gq8@Up'l?ΞW!mJͰ[nȧŷD.^ 0oS3`l܋F,1 )Y=s@\0"EQR7h츩2* K@kE 9X$iUS:f0K {O*^Qe:%BH7#ET9&Ug!8WQ Su+Z'/6nrt0/A+m8C'.4u 0 NЪf_Fw#MqxIUHH0XLs-zvw/{++Gtu|ܡd=ObL6St>ɗՓ&ۨge8#?dl7Q^^]ꍛv}l>7ه֢{{53]{|a-{Pf˦>})=lM*N['ܨFOz@>U?a{h7OҖw9_*3أwux|6rmV{|m^dGb6V}`z{4oݎG叝\\z mL V%nXF-7ЃJQZp?^3ۧA+V^Z/GJ^[[YaN~~{V罳o*lYUmOC SPD;@lo:׮s䯑/XHhjDY*/R7ӿݪ!IEorHRZ*j'yxq c7-}VC)ZorUagd{&rcPt\ŒEbR94B֋q֛017v̡o%HGUI_=?=MIa! 'BUͻh@5FT2ʌYaSrпW7ō 5g 1tUEIkYsU@ܲQ̒llí@쑏E2NLDLrZj0gC70_hF;E 6 GD۝^8ouDho|\*R&qJ#UUm,~%A 0R ЏAxyCi'VE:U _] HMU1PnBb%gQLۂh:w3hR+)` 3R#K@`b u`՞]UaEb._DvX{[9!.}/h8C;H*Rޛ:~MpTsSAJ[jIhZ2ͪ}SHX]fȯ[Z/9 ?0^/:$Yl25Zà~4enUScG@G`g8T<[a0Ρx<6O^HBY +fÖϜjycK'zN",(3ʯ2Xw\[:6냋PJr-[X?\_;!6e)2H;p d }ᤰyCԿ]W7$̄"a0 ﳍ>)A!>R-{ qSy+X5E&|i"˵$mI=&\Pڽ"#y߾7mJDl Ld[%7i ۶R0oI?<,3>}A[zç mF}Y޽ 0}+ "YC_+}Anv ;;]M3NU:zCp#25& ~w.*VkV-rXk|x?|&; D{dMڌ9aE;h&b۔?:=<~ԼwWlX&j6 B5N[l WH7Gp  RhID€DfHofR\^lqƟLXbV ;XgepZ[ 1V6!85jRáuX [lD#ED %HPBK6_cmJLKkS#>j>jWlnj..^;/^)ع[(pGSN.vms1y-Ll@gm1$Dw87N-p˼{~&KtR!$rօ7mS0piE.Tax9n PxkW,pѰk (æ܌ Yi=WUwuw4r%]872]5%{qKx3S|OipqdwQFه jprzj(%\/1h$Q*0n.6YGvqKImHud,M0[?{Apj}EF3rrތ.S^4=Ϧ_=*.GB:]QQZnS.SՋj5Vvd\[515׸yV*yO39S/~HmB-G{OꦌR9'ۇ]@r~+vL.-zC.kt*mxZF *PTautA:`꒜ɍ9W * {b%y݁y}vs hWh3' Ƀ!H8#p3lp7F<fHVۤ>R:@j3{;iagZt"k$F VtIF3[P#G"ci8}IԈcxK n'O `? oGИ[൝.Am5/ݹiɃ{q/"`K]$QFlTIe4_:ޮ3oPen{ӝoFYlE*ϗɤ(Op:͐[$+YV ̈́'(w>dL l{I+N1,wbk7/]y)1$`D|"02ҴE X:6GXx$V:c˞Psr [ ,F[]|\}/[l e+*E "ɌӢnf&)H}S$ͭJ֗wI %"eh9b}?6zV6i. ¹\+Lc-bp!B}k"Dwm[v=e~FhH'p $Z+B׶b% tИ)rN=%=-%[ZWn ³CI,_+d~a "# 1S0/R +MkWoKbV֝Qpp+(5ü3ޖe!ٕN'?ƙC~H"qc/اvKse5;N6Ql H5+nY_n@'yfq 䡝~V`raEIDr2Ěn$jY^=2z[ _IڅEOTR.鮨tJ7)"-}F|A8ʼ8u?S hc8; Es0l@/<,7]>,M7kޕ Fyᬷ γgQTGt jĭ6rm}nxUf<邢@fmUȺe-7.3>}PM!qxz/Kc&ËkR$r)uت.֫pa}|"<7a'4,"eih7;()I JݗTh&n@ el\w18hL@Pz̺pZ͞M"̔\'Ͼ]+^-me}6d4kH̤|֝dUycZzAgZ=̘?8zTPrm9QI ?؛M+=XO^2J&/\lyEd| ֝tѰy7KV7*acj̺ٞS%[/56'f{~j^S彼^6o#|hxUyN_so՚O q}pz͉.Zlj2E7)a12Ey~ug xB^̀}MM-gi;=އqAfm4P/ ng70KOpٗLV)C.0ekpJo<v?P*4  ^;c*km Ϋ=&EXeSlَ9cvyYq`v~P:WDx(3̑ڈ`%e˾:+5u{&:QX1JyetH>R5{ED1n`FvBD b APnU,Vyu "G-a|5gsL ͥ.[8YQZv8*npnG%x[{/\oysUhCQXj P,Zl4;\=kJMq"cƨvg{^꜊7F#K+h-Ǐ)Q*tMczU4HOvW'6_>,=[-ڿH=ww,8Y<;@]Cjj\q?i:s yGt~p뉨Q.z"H#t{o)^ RE.J䟻*{@7klOHͣklX6 CmzUu[56 G0)iC(Di'I;Ug1Zc<n{aEW 6/p 7XU{#r}pl?>b)W{ J tl0ahydW@U1']7,q ݮsT} 5}Y,տߍef0Bټu( ).ɖָ͝> {j& RCghO=7* {$V|\T4js ;cТy.gBu`YIvYz(,agħKiVnIߖcd{\cƄf%PȕZ9Y@0kYݥ:حv.R /WZ =y]s:-Pe͑}u!¹0z%z5Y/WhHqvrzrʐO_hzq/ľ4\^p?^\lիw5 뵃TeulmA8}_K}~ŭ45^%d Nb~Yr|<]O5f'nbUo ̱ccY>Rr[fh*t>wy6zӥG#E{1'UW~k"APjzxW:r$[NȜA~gքLhѣsX12rK'j<ܠ+D}/N~Qqe縵r~=uhuNoJNxƸ)&FYx8bUhߙ\)V#ْ VLjEPLѰ?u kx F5܏Ac*K>Qa `0zCeR:EP18#3 ˨G], 餋:H> gwSLyR]=±z|9یvb0*c3,5arֵ#W)xwRXPFyTYB 0j]!^NQqE7FK!2_`%ܦYRӈ^ i7z^o'NY9\݌ jm3&`#_Wh0&Y mX!V9҇G/Mx\h ~CҨ_!+WJk=uXV ::H_i+5̟"D>q,\ ׬C#T(/\7dryg3&l1K8a4p2} 3vV^pil<̗ۆVf=Ya`Æ9kYijH6rؽ@/ߛoqw ,hyڂY4Mh0c}`uQ/x@`WH:e9*;!$APf 님tC+*-+͜X('1c?v[QBs:c2=e59FcUU(!AH0 Y "$HXku]xe":W"€ `kc-==EX8ͮfT3,QAʵ͑IpuV$̩:Y.Np+sw#>4Np:w|'zPYWZQ#\:?p-r:g#/|8ph0ZvOΝvN&ۓQVy ӝ43 Ё. 6}Lc d.9?S"ڻsuZݕD ,l͍֕8qX U!yA=홄RÞN&s[^uο,x*:թ|6Nf3MMmœM0윒b-)tqv#JYIdPBwjMHo\} O\ o~x5pd5Wt8|(GpTCa-݄YV'D8Hw5e qv S ޞ>$ؘ.tURMl,aZ#e`.RەC@.dfk\k g$ aۭ0#qI-nlK5\ݵ=v%w\pcuRmPTUO+T )Jt%WB ^0qJ7֊,"бd>x/kNj oU+Ξ0զowMvZLkp9ƚc,>՚`+8?(~N2|u:/GsUKklbC~c`YT")@`+sɫJrx="V4 Q4zf ȸҞ\iA4FC0v*jw.3ƚIJλ=b}m< aCsnCUϞs\Ӕ&7gŴF{mp_MNJBZ\!9_]i=_DZ~1H˴f_qJ,<8&[RJ)q/ %]ҔF6!Cnrƿ$e'>/vPnTo0vɭ¬[/|*ca~0ºhQa.WR)F+rgUw?c)-SkVocJ_ߚy<l4~gY\Un_jti<7">ir^_D\VԞbhSһU!ۏPmyJ"wgseIRw=?& ^0*+"I,B0 Ex+x)6z@h9idO E:Ռ0KDF.nHow5`` )T^Yʹ{k`mv#8լ NL!OM5, xAQ=HxU񯜽E\+VEf|^['5FeVocbm6]!u-.L,Q*nlϒ91UYnj.' ֹ'#CxmWX|uK#cUU0!$"YE1*(41%\go*F: Hnfz() *ru q2Zf\+L0+ګyoz\3WeGoܧmFӡğ ~[^ޞ|K\Y R[-fiV/,M![3Z9T-dLmڠc |T"%G^M~{]ZppS.ǃdNι; ^ݠ0u!%^}e(QaOnLotowݩWd'\-ų^r05[)eV(gb7! ޻0b0H0\ԁMg]ƛݘ 0{E9AGعPFu ԔLr`UȘgm;ʾWzߏKL轹;X%t3=,V[{|_ՃqiaAZcX0>vs=*NαKNWY(.H766*4ߤX` S 1B|blC\~S_[YGC͠ݭ<(-r=ðB'WF:5${w sUcFP+8HŻb}=\ܻ®4Tm9S$.@q˶׫DyYWsg*.)N#UY&Cޕ3M* 41s ;T?wP >@sgo)~$y﯊dhlP.`7?sBn:]} HF&H}>%;`Ao~( :MΠXqXLی,/2&gvQTkX8=I /``0?_Ab&(ad m%yTA~yInlimğS,i^:cd?o?A/2!!kr(PW1zlN rbTTV*b(z{1+6cBUZLCOuAM^sS}rHVP9kk~&!"-~mCŘ/)6Djr(bUGk9!ZFE0$5Pv>Ց'X=5[rP諒il9 >ܬ?u w+: 5PegY OW ӭWZ OydLxb!- xQ,(yf`zp>Jޒ,A/Ce~>OUpieo ˎI3z h FOiDvk_fNu5z'h1ۍ,[gY]o0Z9׫o^SVlK:n2HRlHXD=nC%M(: ;ox%iI<@oS@1f@J4ICA9рO%! Zsd`P^~Ы80pM3 @(thQ%3Ԛ!vP>."}b) ׬rc7_]蠀&o\2Z owQzmԺWa1-ǩch= Nu޳럯a0A쿸^@|ُг=vp/e'rW>c{~dՖcb[r)aeBtfKqrrij^a>j}C' t9Dd7`d ^\slJ;+Osk*q'}0*1oÇYLa W5q|e"AgTIWŭs.X}¡j{:2tAk5˯ uFi(59o֌[0 C(afߚ io_ȍm.ǀ[ zѳժFf/|K.V{RsOju}^fv6&ԧۡA҅8veV?LŜKsh7;tQ離TLN}sj2ZGbk7*Rڕ oH+ AÁV&6nIsl!;z5˹?? lL54?, k0 FJS3Di"({+rgj$rz1* %J&Wa7ב{vm%,/(-sAEQEP u_̲: +kgDdĎ].Y} /.TU<(Q,DM_جHx~TcIg훇H\lJq[-v~Zaps Jo85xظ)Uhzp74l&of @*lvW?3f=7@?LH$n"(wUA.CL{M=/@{&I3*4RAcFcDeTZps~T*n=>u%'z>6)FdvAohsQ9 3& z~1j~ ,0Tcu5\J-&w6L=5%\¬F1=/ Գfm[}.Xbs0-a(_tc"S7]?ov|;'CDBGC.vH:!y&&9Dit̢HfO$1> =?6@Ŵc[|boccG֡l0+EkzJ-5/d1 Ʈ+=Xm,Y5\z.v2 } r27 Mk`dn`A? zLZ0VX01®řz ; v4p#w}ݿퟛGuō沉D9l`X 0$?tk;xAжrϜ 7Aʧ#U[ee.3wTD#XvE:tDQth:<,vv`;~ I/0zq1 smLѓ+~US[g|l?~ޜ1Ftv%]v" UqwWb \hЉ@0VmL  N]/KwQ?%؎a>stream HM7 OPw HQql @/vGnPR҆j] HIE*@rGfR9ˀX%78*`m$3çt٭:1;Q.2ڋ'$dH5uF ʪ5`ToxKO8U<C-D} %\#`.9a.T93y" ہ`yxvG뚖\Fd=XY"A͋ʰ\ 3=YNJӓ_'M2*~ͨ2tfE6i:V"d ^?飯LYva[kG}JKjdoMLuJ;r߭"ECJDd1࣓+zJS_SsŮ)εĪ^J xo1[W {-8M \W d{* 'h0AI=4Ĭ}O+{_0wW.N#Bf++#}I.&[䬲MRhO0;8v #dRey*vdQٌPܲlֶȶ~t2-LbW'F 'uDN}OZ(.fY*tb>@{ 2]_Ygn,y\?xfS]B+ocGNW6_ld ;,eHQuic}t\gʾưԈA;U4NU;3dg ߑyީ3f?~3UVqV+6mOY.>R )"3݊61]GuԱ܆0B_۔'֎g A#>[Jy^cN mIegqe62'X;t{3ܦji !kvPuFca.khg־8NWbݮm>XEAE!3”eZ `n@{<,\-ۜA"ꖹ-9GI_X&q8nU;$^C?cb}@6A{%K(v( f ;-A2Gqe靖i}_ ?b!gHWY`p:j8AI@T0Q8C5{Gb9i>. @mdx.KQ^KatnM}g$ Gnvv+9}0^O_}=߾#z/ݭ/x>EQgĎ0D څO8+|][q__P銅t>nn?az|O2}݇d]~s?2 endstream endobj 1 0 obj <> endobj 2 0 obj <>stream application/pdf slip Adobe Illustrator CS3 2010-04-23T21:02:21-07:00 2010-04-23T21:02:21-07:00 2010-04-23T21:02:21-07:00 220 256 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADcAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYqw Dzp+dnkzyvLJZmR9S1OMlWtLQBgjDtJKaIu+xAqR4ZnYNBkyb8h5uFm1+OBrmXn11/zkvrrXckdp oFvFHGGNJZnlYhRWtVWIb/LM+PZEesi66XbJoEAI7Rv+cm4TxOuaG8MJbibizlEhrTf91IE6f6+V 5OyD/DL5tuPtcXUh8nqWkec9K8w6RJqHlmSPU5IwC1qzmCQEioVg6kqT2qKHxzWz05hKp+n7XPGp 44GWP1EdLpht3+eP1O4ktrrQJYbiJuMkTzhWUjsQY8zo9mWLEvs/a6OXtEYmjjII8/2Ic/n/AGw/ 6Ur/APSQP+qeS/ko/wA77P2o/wBEg/mf7L9i0/8AOQNsP+lI/wD0kD/qnj/JR/nfZ+1P+iMfzP8A ZfsWn/nIW1H/AEo3/wCkgf8AVPH+ST/O+z9rL/REP5n+y/YtP/ORFqP+lG//AEkj/qnj/JJ/nfZ+ 1P8Aog/of7L9i0/85F2o/wClE/8A0kj/AKp4f5JP877P2p/l/wDofb+xYf8AnI61H/Shk/6SR/1T x/kk/wA77P2p/l7+h9v7Fp/5yStB/wBKGT/pJH/VLH+ST/O+z9rL+Xf6H2/sWn/nJW0H/Sgk/wCk lf8Aqlj/ACSf532ftT/Lf9D7f2LD/wA5MWg/6Z+T/pKX/qlj/JB/nfZ+1P8ALX9D7f2LT/zk5Zj/ AKZ+T/pKX/qlj/JB/nfZ+1l/LP8AR+39iw/85P2Y/wCmek/6Sl/6pY/yQf532ftT/K/9H7f2ND/n KKx5Dl5elC13IulJp8vSGH+SD/O+z9rIdrf0ft/Yyzyv+fXkHXJktpZ5NJu3ICx3wCRsx7LKpZP+ CK5i5uzssN/qHk5WLtDHPY7e96MCCAQag7gjMBznYq7FXYq7FXYq7FXYq7FXiX51fmneR6ivkzy7 O8d1KRHqV7Af3itJ8K28Z7NuC5Br+z45uOz9GK8SfLp+t0/aGsI9GM79f1Jt5h/KDyNqOq3V7LHc wSTzNPJFbyIsRkb7bBWR2XmdzRs038v5cQ4KBpycnZOOc+OyL7v7EXD+Vn5bt10puZX0zL9Yn5ca U6epxr9GQh2/mJ5/YEnsfT1Vfaf1vOPzH/KJPLsEF/p8z3WhKxEpkAM0TtSnqFAqlWI2ag8PCvS6 DtEZ9jtL73Qdo6CWn9cTcTt7mBaXq2teXNUXXNOuWtL0GkaL0df5JF6FNuhzPy4ozjUhs42m1MoE cB5dXtGuDTPzF8jp5v0uIQ61Ypx1K1X7REY+NT48R8aN3Xbr01GEy0+Tw5fSeTsO0tPHU4vGh9ce fu/Z08nlTZtnlUbqXl3XtOtkur/T7i1tpGCRzSxsiszAsACR3AJyEMsJGgQS5M9PkgLlEgeYS+1s 7u9uY7Wzhe4uZTSOGNSzsaV2A3ycpACzyRCBkaAsq2reXtd0lI31OwnsllJERnjZORHWnICtK5GG WMvpILbPBPH9UTH3hKmyxiFJsWQUmwtgUmxZBRbCzCm2LMJtN5H84xzWsD6LeLNe8haRmFw0pRC7 cBT4qIOW3bKRqMe54hs5HgT29J38ko1XS9S0u8ey1G2ktLuMAvBMpRwGAYVU77g1yyMxIWDYUxMT RFFL2yaQ9X/Jn85bzy/fwaDrtwZfL87COGaQ1Nmx6EE/7qJ+0P2eo7g63XaETHFH6vvdlo9WYHhl 9P3PqIEEVHTOdd47FXYq7FXYq7FXYql/mLV49G0HUdWkAZbC2luOJ/aMaFgu3iRTLMUOOQj3lryz 4YmXcHy9+VQuNQ/MbTLrUJEuxc3jXM7sQT65DSB6GhDepQ50usHDgkB3PK6ecZaiPFzt9FXYPqtX qDnmef6i9oGDeedT/MOOb6v5VtVjt7eOOa81B4/WdvVk9P07eLfm0agyPt0oBv1lhA6t2MR/iY/5 ludQ8y6Do1p5otpLbULeIzXdvG7Qj1pNo2aNSaMEVWoenIigPSvL2mcGQAC686+52um7IjmxSPFX FsNgfvYzN5TtJHLmQluxZQ1PkNhmyj7a5+sIfa6o+wOH+HLMD3BNNAjl8u294LK9niS8Cm8cycQw jBArTiAByOafX9v6rVEWeGukdvt5vQ9nezul0kSAOL+tv9nJLtdjsYogioqXFQQqgA8WFamnYggj N77LnWyzcUjM4SP4rryq/wBDyPtpHs6GDgxjGM4lygBY7+Kv09eXV6p+dYJ8h6UAKk3kAAH/ADDy 50XZ396fcfvDoO2/8Wh/WH+5LXkXytpvkTy9N5n8wkR6g8dSjAcoUb7MKDvK/f7vEl1WeWefBDl+ PsXQaWOkxHNl+r7vL3n8dXnesQedfzEvL3XbWz9eztCY0hWWICCNRyChXZWY03JA3P3Zn4zi04EC dz9rqsgz6uRyAWB5jZjGgeWNc8xXklno1t9auY4zM6c446IGCk8pGRerDauZOXNHGLkaDi6fTzyy 4YCyoeYfLms+X776hq9sbW6KCURlkeqMSAQ0bMvY98OLLHILibDLNgnilwzFFMNR/LTzzY3FnbXO lOLjUCy2kKPFK7lAGb4Y3YqFB3LUAyuGrxSBIPJyJ6HNAgGO8uSPP5H/AJlFOX6LStK8PrNvX5f3 lPxyv+UcPf8AYXIHZef+b9o/WxOfyt5ih1xdBk0+ZdXZgi2fGrkkVqKbFab8q0pvmSM0DHiv0uP4 MxLgr1dyf3n5KfmVbWj3T6QXVF5PHFNDJJSldkVyzH2WuUDX4Sa4nLPZ+YC+H7nrv5oHzSp8mHys obXg8/1NW9Kn+8Z9T++Ij/u+XX9earScHr4/p2+922r4/wB3wfVv93mwfy5+Xvmrzd+Yt7N5+sTK lvGqam8csMfGQwg24pbvvVKfZ+nMzLqYYsQ8I+79PNxcWmnkynxB7+XdtySjzj+QvnNfMl8vlrRj JoYdfqTtdW9SvBa/3sof7VeoyzB2jj4Bxy9XuK5dBPiPCPT7w8kmRkdkYUZSVYe42zZBww+u/wAi fNE3mD8vLNrlzJd6a7WE7salvSAMZP8AzydRXuc5ntDFwZTXI7u/0WTixjy2ehZguW7FXYq7FXYq 7FWG/nEsjflnr4j6i3Bb/UWRC/Y/sg5l6H++i4utvwpU+Y/KGoQ6frFhqMNvIXsp4p9mrX02DU/Y G9M6XJATiY94ePlkljmJWNjb6suvRkImgbnDKA8bjoVYVBzzTV4uGZD32OQkARyKTeZbzUrHSmns ErJyAkkpyMaUNWpmBqJThC4ux7Nw48mXhyHb7z3PLrzUZGuWkufVlkk+JpgjSVPgeIYj6Rmmoy3J 3exiIwAiBQ8kM95PIONrEw8Z5lKItO5VuLt9Ap7jCIDr8gssm23zPJT8vSaRqXnLStEYtqM91OFm cn4I0QF3KgUUHip3UV8TnSaH2fzzgcmQeHjHT+KX6a9/wDzGu9o8EZDHhPi5D1/hj+gn3fEoj81l iXz7qiRACNPQUBeg428YpnoPZ4rDEfjm+SdsyvVTPu+4PaPNXmjTfLfl/Tb/AFC0N3C00ESqoUsj GNnEg5d1CHNNgwyyTIBrm9Vq9VHBijKQ4hY+7mxv82dDvPNXlmz1nQ7o3dnaq05s491lRhvIoG5d KU4n3pQ7HJ0OQYpmMxRLh9rYTqMQyYzcRvX6feGN/wDOP2piPV9V0xjtcwJOoPjC3EgfMS/hmR2r D0iXcXE7AyVOUe8X8v7Uw/LzS/8AC1p551ZgB+jZJ7W2c/8ALqHkoP8AW5R5DVz8U449+/z/AAW7 s/F4Ec0/5tgfD8Bv8wtHTzHrnkPV405Raq0MVzTcCMlLgD/gGkwaXJ4cckf5v9n6meuxeLPDP+fV /f8ApLPIbqK6/MK5grybS9NjA/yWvJiz/etvHmCY1hB/nS+7+12glxagj+bH7z+wPP7rSvMh8zSa l/ysa0hgF2Zv0f8AXWEaxiSvpGLmEoF+GhXM4ThwV4R5c6daYZOPi8aPPlxfoZdHL5f1T80LG/sr q3vZ7fR7lS8EiSlSLiEL9gmm0zjfxzFInHAQQR6h9xc4GE9QJAg1A/f+14p59/MjzvZ+f9V+qaxc wQ2N28Vvao5EASJuKhovsNXjvUb5ttNpcZxC4jcOo1OryjLKpHY/c9v8wzet5x8iTU4+pNevx605 afIaZp8QrHkHu/3Tu8pvJjPv+5itlqeoR/8AORN/p8dzIljcWiST2wYiN3S1TizL0JHbMmUB+UBr e/0uNGRGrIvb9jzX82fPnnTTvzD1qysNbvbW0hlQRQRTuiKDEhoqg0G5zP0enxyxRJiCXE1WeYyk CR+byiRmZizGrMaknuTmxcQPo3/nFf1f8Pa5WvpfW4+Phy9L4qfRTNF2v9Ufc7js3kXuGah2bsVd irsVdirsVQes6ZBqukXumT7Q30ElvIaVosqFCaHwrk8c+GQkOjDJDiiY9741mtb7StRudO1OUwzW UrwSQody0bFTQL+ztsc6+ExIAjkXidRi4ZEAbvpryDcm+8h6JctUn0DEOVa0hkaJfwQZxHbOIDPK nreypE6eN+75GmR28NSK5rsUHYEvKvzM8yaFb3kum6TZwLcxEi9vlUAhx1RANqj9onvm/wBF7PYJ jjyQG/Tl83Sdo+0+pxnwsMztzPP4C3lOq6i8nwTTSJXeNwxK/cM32n7P0+D+7hGJ7wN/nzedzdoa nUf3k5THcT+jkzf/AJx/0Oe680XfmK9YfUNFgcR3DEcfWmUqaN4LFz5eFRlHamWoCA5ydr2ThiJH JyER+PsSDzJqn6W16/1LcLdTvIgPUIW+AfQtBmXhhwQEe4PNanN4mSU/5xJelfm35l0DUvJenWmn 6hBdXMd1C8kMThmCrBKpJA8CwGazQYZxykkUK/SHoe1tViyaeMYyBII+4sc/Kz8xm8u3o0zUpCdE uW+0d/q8h/bH+Qf2h9PzyddpPEHFH6h9ridldo+DLhl/dn7PP9bIbiXyXov5had5l0TVrT6jdSPF qdokq0iMyFfVUA/Y5EFh+yfbpjAZZ4TCQNjk5sjgxamOXHIcJO47r6+5Ffmf5u8qL5L1Kz0O/t7m 61a5Rp44ZA7CpVpHoOxEQB+eR0eDJ4gMgQIhu7R1WHwZRxkEzlv+Pgq/lv5y8ot5O0WHWtSt7a/0 iWQxRzSBWBAkjRqHt6U1Mjq9Pk8SRiCRL8foZ9n6vF4MROQEoH9f6CxzQPzO0my/NjXdRv5/9xOo 1tYrpAXRRblUhkotTwZUO4HevjmRl0cjgjEfUN3Hwa+MdTKUj6ZbfLkuu/IX5T3WtSa0fOFslhLP 9Yk08yQcvifm0YqwbjvT7HTBHU5xHh4DfezOk05lxeIOG+X4/U63/MP8udF/Mmyn0K3itNE+qy2e oX0EJRWeVldWCU5lUaJRWnc9uqdLmnhIkbldgMo6vDDODAVCqJb82eVfyb1HV7jzNcea40guZPrF 1YW8kUsjt+2EReUq8z/k4MObURiIcHLqzz4NPKRnx7HoyTXPzB8l3Xmjybexatarb20t3JdVlT9w JbF0USUJA+JgvzzHx6bIITFHevvcrJqsZnAg7C/hswe+8/eXNP8Az7bzB9bS40WWJIJLyD94qhrZ U5fDWoVx8VMzI6actNwV6v2uIdREanjv0/sZnFqX5S6L5u1Lz9/ia3mub+D0/qccqSldkDFYo+Uv JvSGxG2/0YZjnnAYuHk5olhjM5OLm+Y9cv11DWL+/RDGl5cSzqh3KiVy4BPtXOgxx4YgdzpybJL6 x/IrytN5e/LyyS5Upd6k7ahOh6r6wURg/wDPJEJ8DnNdoZuPKa5DZ32ix8OMX13eg5hOW7FXYq7F XYq7FXYq8l/Of8pZNfceZNDhEmtQIFurPZfrSIKKQf8AfiDbf7S7dhm00GtGP0S+n7nV9o6I5BxR +r8fayf8vNOvLP8AL/RILyMx3PoerLGy8GUzO0tGU0oRz3zWdqETykhyuz8Xh4YxRXm/V30Lynqm qptLbwn0T4SSERofoZgcr7PwceWMSy1+Y48MpDnX37PlmbVyVindi/Mss1dyTtv89652weEGEkkI zyr5R1/zdqp0nTIjJaghpr5wfSgQ7h2bxI6L1P45Tn1EcUbk7DSaOWUjh59XrHnLUdG8neVYvIfl 1uUhX/cpcj7Z5UL8yP25e/gvw/LWaXHLLPxZ/Bye1dZHFj/L4+f8R/Hf92zy1s2rzKm2FmFJsWYU 2xZBSbCzCk2LIKTYWwKTYsgothZhTbFmFJsWYUXxZhRbCzD1n8mPyavdev7fX9etzDoEDCWCGQUa 7cbqAp/3T/Mf2ug7kazXa4QHDH6vu/a7LR6QzPFL6fvfUAAAoOmc87x2KuxV2KuxV2KuxV2KuxVa yBuuAxtUg87+UV80eXLjRTdGzE5Q/WAnqEcGBpx5J1+eX6XL4M+KrcfVafxocJNMI0b/AJxw8m2j K2pXd3qYVgxhZlhiNPERjn9z5mz7VyHkAHEh2VjBsklnk3lkW2ijSfLksWg2+4LW8AZhXqV+JAGP djU5hxzXLimOL4uRm08jDgxy8P4ftYLJ+Q8Mjs8muSO7ks7tACSTuSSZMzx2p/R+39joz7N3v4n+ x/apn8gLY/8AS6f/AKRx/wBVMP8AKp/m/b+xf9DY/n/7H9q0/wDOP1sf+l2//SOP+qmP8qn+b9v7 E/6HB/P/ANj+1af+cerU/wDS8f8A6Rx/1Ux/lY/zft/Yy/0Oj+f/ALH9q0/8472p/wCl4/8A0jD/ AKqY/wArH+b9v7E/6H/6f+x/atP/ADjpan/pev8A9Iw/6qYf5WP837f2J/kD+n9n7Vh/5xxtT/0v pP8ApGH/AFUx/lY/zft/Yn+Qf6f2ftWn/nG20P8A0vpP+kYf9Vcf5WP837f2Mv5C/p/Z+1af+car Q/8AS/k/6Rl/6q4/ysf5v2/sT/In9P7P2rD/AM4z2h/6aCT/AKRV/wCquP8AK5/m/b+xP8i/0/s/ atP/ADjHZn/poJP+kVf+quP8rn+b9v7GX8jf0vs/asP/ADjBZn/poZP+kVf+quP8rn+b9v7E/wAk f0vs/a0v/OLthyHPzDKV7gWyg/eZDj/K5/m/ayHZP9L7P2st8t/kL+X2iv60ltJqlyAQJb1wwUkd VRAiA+BIJHY5jZe0cs/L3OVi7Pxx8/enPlXyXrWias95d+ZbzVbVrYQCwuSzRrL+75TKXkkap9Nt u3I0ynNnjMUIgbt2LCYmzIllmYzkOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVDajqVhptlJe 386WtpDT1Z5TxRQzBQWJ6bkYoJAFlUtbu1u4EuLWZLi3kFY5omDow8Qykg4qDaril2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KpB+jPOn/V9tf+4ef+ynA18Mu/7Hfozzp/1fbX/uHn/spx Xhl3/Y79GedP+r7a/wDcPP8A2U4rwy7/ALHfozzp/wBX21/7h5/7KcV4Zd/2O/RnnT/q+2v/AHDz /wBlOK8Mu/7Hfozzp/1fbX/uHn/spxXhl3/Y79GedP8Aq+2v/cPP/ZTivDLv+x36M86f9X21/wC4 ef8AspxXhl3/AGMR/NrTvNS/l3rJutVguoPTjD28dkY3esyAAP6703/yTiWrOJcB3eTfl1+Xn5xe ul3ojT6BbuQzXFy7QRuP8qAhmkHhWMjIgFxMOLJzGz6W0G21q20yKHWb2PUL9f7y6ih+rq2w/Y5O K17inyGTdlEEDdMMWTsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir//2Q== uuid:13528DD4AD50DF11A0AE9F14AB4BE47F uuid:cf4bb206-1326-d74d-bcf6-c7318f4a6bf4 uuid:2fbdcaaa-a095-1547-b943-336f0e642cc3 uuid:EDE785FDC44FDF119846FECADDC9E06B False Adobe PDF library 8.00 PDF/X-3:2002 PDF/X-3:2002 1 False False 612.000000 792.000000 Points Cyan Magenta Yellow Black Default Swatch Group 0 endstream endobj 3 0 obj <> endobj xref 0 4 0000000000 65535 f 0000074437 00000 n 0000074488 00000 n 0000091289 00000 n trailer <> startxref 116 %%EOF ruby-prawn-2.1.0.orig/data/pdfs/page_without_mediabox.pdf0000644000000000000000000000740312665203156022176 0ustar rootroot%PDF-1.2 1 0 obj % page object - page 1 << /Type /Page /Parent 7 0 R % back pointer /Resources 3 0 R % font to use /Contents 2 0 R % page image >> endobj 2 0 obj % contents object << /Length 1335 % # of bytes between stream and endstream >> stream % draw three lines of text BT /F1 24 Tf % setfont 1 0 0 1 72 648 Tm % moveto (Hello World) Tj % show 1 0 0 1 72 612 Tm <4D53835383568362834E3234837C834383938367> Tj % shift-jis string 1 0 0 1 72 576 Tm 0.5 g % setgray <82BB82EA82F08A44904682C982B582BD82E082CC> Tj ET % draw filled, dark blue, shougi koma q % gsave 12 0 0 12 72 360 cm % concat - translate and scale 0 0 0.5 rg % setcolor for fill 0 0 m % moveto 12 0 l % lineto 10 11 l 6 12 l 2 11 l f % close path and fill Q % grestore % draw stroked brown egg upright q .5 w % setlinewidth 12 0 0 12 360 360 cm 0.5 0 0 RG % setcolor for stroking 0 0 m 8 0 4 12 0 12 c % curveto -4 12 -8 0 0 0 c S % stroke Q % draw bitmap - dark green steps 0 0.5 0 rg % fill color 144 0 0 144 72 144 cm % scale 16x16 bits to two-inch square BI /W 16 % pixcel width /H 16 % height /BPC 1 % bits per component /F /AHx % filter = ASCII Hex /IM true % imagemask (0 - paint, 1 - transparent) ID 0FFF 0FFF 0FFF 0FFF 00FF 00FF 00FF 00FF 000F 000F 000F 000F 0000 0000 0000 0000> EI endstream endobj % end of page stream 3 0 obj % resource object << /ProcSet [ /PDF /Text ] % operators to use /Font << /F1 4 0 R >> % name the font /F1 >> endobj % Font definition taken from Acrobat 4 PDFWriter (some comments added) 4 0 obj % base font << /Type /Font /Subtype /Type0 % Adobe composite font /BaseFont /#82l#82r#83S#83V#83b#83N % MS-Gothic /DescendantFonts [ 5 0 R ] % points to actual font /Encoding /90ms-RKSJ-H % Shift-JIS encoding >> endobj 5 0 obj % descendent font << /Type /Font /Subtype /CIDFontType2 % TrueType /BaseFont /#82l#82r#83S#83V#83b#83N % MS-Gothic /WinCharSet 128 /FontDescriptor 6 0 R % points to metric info /CIDSystemInfo << /Registry(Adobe) /Ordering(Japan1) /Supplement 2 >> /DW 1000 /W [ 231 389 500 631 631 500 ] >> endobj 6 0 obj % font metric information << /Type /FontDescriptor /FontName /#82l#82r#83S#83V#83b#83N /Flags 39 /FontBBox [ -150 -147 1100 853 ] /MissingWidth 507 /StemV 92 /StemH 92 /ItalicAngle 0 /CapHeight 853 /XHeight 597 /Ascent 853 /Descent -147 /Leading 0 /MaxWidth 1000 /AvgWidth 507 /Style << /Panose <0805020B0609000000000000> >> >> endobj % End of font defintion from PDFWriter 7 0 obj % pages object << /Type /Pages /Kids [ 1 0 R ] % list of pages (only one in this case) /Count 1 % # of pages - one /MediaBox [ 0 0 595 842 ] % A4 portrait >> endobj 8 0 obj % catalog object << /Type /Catalog /Pages 7 0 R % points to pages object >> endobj 9 0 obj % info object << /CreationDate (D:19991115) /Title (Hand-written sample PDF) /Author (ARAI Bunkichi, Yokohama Koubunsha) >> endobj xref 0 10 0000000000 65535 f 0000000012 00000 n 0000000184 00000 n 0000001672 00000 n 0000001888 00000 n 0000002185 00000 n 0000002569 00000 n 0000002992 00000 n 0000003218 00000 n 0000003324 00000 n trailer << /Root 8 0 R % points to catalog object /Info 9 0 R % info object /Size 10 % # of entries in xref >> startxref 3475 %%EOF ruby-prawn-2.1.0.orig/data/pdfs/indirect_reference.pdf0000644000000000000000000000216012665203156021441 0ustar rootroot%PDF-1.3 % 1 0 obj << /Producer (Prawn) /Creator (Prawn) >> endobj 2 0 obj << /Type /Pages /Count 1 /Kids [5 0 R] >> endobj 3 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 4 0 obj << /Length 8 0 R >> stream 0.000 0.000 0.000 rg 0.000 0.000 0.000 RG q BT 36 747.384 Td /F1.0 12 Tf [<5468697320504446206973207573656420696e206f757220756e697420746573747320617320616e2065> 30 <78616d706c65206f6620612066696c6520746861742068617320616e20696e64697265637420726566> 30 <6572656e636520696e20612073747265616d0a>] TJ ET BT 36 733.512 Td /F1.0 12 Tf [<6f626a6563742e>] TJ ET Q endstream endobj 5 0 obj << /MediaBox [0 0 612.0 792.0] /Type /Page /Resources << /Font << /F1.0 7 0 R >> >> /ProcSet 6 0 R /Parent 2 0 R /Contents 4 0 R >> endobj 6 0 obj [/PDF /Text] endobj 7 0 obj << /Type /Font /Encoding /WinAnsiEncoding /Subtype /Type1 /BaseFont /Helvetica >> endobj 8 0 obj 360 endobj xref 0 9 0000000000 65535 f 0000000015 00000 n 0000000071 00000 n 0000000128 00000 n 0000000177 00000 n 0000000590 00000 n 0000000737 00000 n 0000000765 00000 n 0000000862 00000 n trailer << /Info 1 0 R /Root 3 0 R /Size 9 >> startxref 881 %%EOF ruby-prawn-2.1.0.orig/data/images/0000755000000000000000000000000012725515642015444 5ustar rootrootruby-prawn-2.1.0.orig/data/images/blend_modes_bottom_layer.jpg0000644000000000000000000014106612665203156023206 0ustar rootrootJFIFddDuckyPAdobed          !1AaQ"q2#BVRbu7r3C$%' S&Fvs4DTdEct5U6!1AQaq"2#BR3br$c4D ?ltS#=k]mԟEdևc4:#৹Mޯw|Q6d.O4?mK?* mcG*_ƼgvȻ.0{d$eG7{>ݦk^F*Z%kVno{n%ȃdr=eĉ ZCCpJrqP 26~Bux*zϵorTqʌDG4sG ȫX "ܛ6{9+TGljQDժR2ai>.[+zUk* Ų0IXs&b*W ۣ~RPk#*JY|w&DZQ>OgSWڣ}ޜfIQ'q6+voʶڪc]#jM+Xe(nr+v}Z~C2QZu'KuMueGݞ_(D|xb d"SFUO妴(̧BkWȩo/@h=3.5+x4fwsG Z;K_*:ɾf˶yP1|߁(Hޅr=sQ:ʺ[q)SjX3g嗓B3=K#rLzȊ]%DRj[0 Eƹl6e8$sjoEҩY5 Ԩu96F7خ]*ՙF/$C=P:FLSŰy($83KT5Wu'd2X4+ MoX E8K}6P\O"HIc>%FlVJ2pfEqρ °"1+c#TJR/mn+:n?|d\*=k*V*ŚNEֵh#:3J{Y 9ds+}{SEEJ-n>Y5Tfy%mt ]AB]QmuDJv7uJN#p.ȨrQӘQ5Dk}t:tKY<($sQNI֚\YN' #ɫ0mTo cED;Tާrj,+PSSI5=[,/2&~B{$LjΝ>K*˾ECo_Δ8y|R=6TYXq?E:Np2Z9ޥ}N/Z-➭RMKxbY, %g12؉C"tVFQUt[5tV)iͽi]}EH,,_'Ou]#6PPPPPPPPPPPPPPD@6|2HGzWYRkՃNGY}s r'1,acG+XڦҊzhjz;09\RJ7U¾6?8&f7m9m<O)lǔm3NFUsZZ};JsƵwg$78T8wA{&%OjZ l񱱜#]ԫǣn ů=K[k=EK㿑A?7nV3ѻȶ]~LQZ ^*=oSVAn:}yB9 #H^+Vڭr[k?~CَD>g^S Gz8rVRZmGE]X އ9~Sn;Y#)<kd(ǪGW*UwW5ij[J\/Fs{%\6(cs#kR)FV9{Wc.,b +P)T(ES DzlIkvܔiEk:֗*W_|poXf dߦ'e}#ghXQ뚔;=7zŞ2z9?vl&O0c(HzVt5od]tNE+Ģc|B煐&XbrZ**#I׉CavoS wkܺWoݖ8&D1M"`AN*RRr)P{]cqGqnMUpt*O9^w8$l2+SG9GTNZH.)&ҽwn%Ji_ѪF?i9rR7,n+6[U?3<2:?ơf1ݼ6B+ W#E*'m7FߚK<"3Aǔr *.ԺCbzS n1 yS!~.yP\8%rh*WŝYV*car1YU#r bqWcLtV1T(\Pmn/Qp-BT&WxG(dFNEUq.t[SyDRa pY꼨ܷ!xW+rY/: qd~G/EiUF7R8}\l]}hph/ݣX|FrX)p>j;wiO:VmB<^A,}B ΦeMe,{g eҵkeJ]diB*/ܵGk&o'FhKw#$4{ 歶UK,ڥڛ^[tbx(ebc$x񰓑!JДFK9wֶ7mWT\mBV xIy16&k'CW"/XסO0L;d3^Ȗ[jrJ>Tm[w5,{KċPerpQZqikFHNR dTu8q\Olw.f崖ik 棷g:| ?%\faT8Խ)f.J*ըx,O-pJ~W^UpOl#br4$Npj9U%x"67sCq̱*BAOW(Ɛ{R]utw):mhv'h^oW N)28y5MnVW}㥙p<p㹶Z3 R*6zkke'BLh8xB);ltk\i ?ܷB['<29\O{Tk%K>ո67^Wvq9(S)oMUjTRp?_q$X.9CÕ5 U (X9գ̫M{gn[IJ}Z/&^.66jM E#Es:jFo; [;{PUh̝A2G%v."QVYI|BGQmЪ5|&MU r^R8ls"#FZMp6OܬbEy22Gh]~9j?MZtްfqbJ8q玪*zo[ELsUr|8庭ڵdK(o&H֬[^dC7g87r~[D4@T@T@T@T@T@T@T@T@T@T@T@T@T@{+]fuҬ$O#(=Uy\$.r>{9~j}yh?Iq-zF+&[-DޫtRܗ9K{^VFJ(_µrVUDu=UR U⏿o{V`rZˀ'4sNkFz*/ZzhUTY=~gY8˺uPܧ;.2llL\QYA""C6jzEnWGV#r2K'Noo&G:gO_9UQb 7Ŭ8S(2XQ lEV$6PVr{k|xΆcGDMa-j 6z{R)}w}B˰l!+ʒnvP)eRb$dƉZֵdZSMFF MDc#Wb*UK%MRHmlEMrr# s !2drPgJپں**)Y4f祱Euͭ/fܣ<$y5"OƒHeƎP#Ν-"J#UJrģ,QNۛ갖4kyx6>prX,?; \4s@KJf˵z.xQynv{f)EKim{sQ v#?VԒ-]]ԛXwef8Po%^ k|z/E|M%xlqqq9,vMQnFG59tKNң\tZŕTųW/:#fǙ$čHlk-dK+{#CUvizUQ=Dtoi`'^#Jml9M([]-q{XISX\#=7rnw_H~= pYDƈзJڪjKi<~G')\s+"E!/IZr*n_ i.8|JKjve^`t{iܾRr0 ~RIhs}+P)AjNdZ.EȂVm|s|s Kgr"$+5k1UWt{UYeFBZ5:\W %8Qs[FsUmlۭbu6 䢕Nތxp438d%kwK.,SMTM8c6t~_ZS75PPPPPPPPPPPPPP\,f7DRF !GEcVyt5GY+Юjݪ%W*v-Y$8ZD#EU[+uJ=YN)kgV30"#G"jU߹]-^# K#B2!]-Z"_וgTEDo3&*(.aex|>WǹIN6kQZ]znu 76 I,l^lha.7q,Vb*&c_ZurK,`zKINh,/TAEKr+T ]!mһ_kiS2!Y$UG5:$RV*cK?^؎u1|.DVkI52c8!kdL*.ʾfÉ-,\{ ņ\"s~(R#֫T~*9-g7*w:Vjw^LSfY6O!.M2w~4fm/\V){pSUɆ %lEۤ+krFuL;C|)lJ+ J)ؚW6̻EwKrw5[#5=]I#Do^29=yc܎j'[lC^oc9b9mQkXxx[gpt o"{ks{)t̤k_f؊#5]kZl֛\@ 7z=-pTrmRav̏dԏ?xj8xDj/{mDg1Lk]RDr^ŋ%kj$=^/N 2soҬdsWtTm#>Gb5~Oa |ed'/A >!QjV5U5ڹƼ󜒤ywVV f**************(DWir:!3U^Qѣed!1ЍT #^st5VecCdY6?]v^^2Z^FV!6mnyu߸vh%1R'Ng+UTlO*{e}\VSEɰg_NDEo~Us=MbhCv/Ѹgx>EƔ%3{Ds]YU^[}Aq0'*RWʯ˙$\n܉yfDh+V(jN/x.a>H2gEAbXT*EToP~T5-Lhp2JN3eڽCбokt5JY]Ckк}˔>WnSœ ˣ@N[4*{V>ҍNonTLJj0IOht{؋췂ԝd1#s\\\e[(: ~B;}HʝS#ūoJ]py/b8y ]Cy]k`hԾW*,>"&Kua ڌܯUq娮Xj]JI+:.-!0z eP9FʪrykMǴ>ߣJ4{<L u 7J\tb?MwEe77mdGT22TTTG n7b3xq|Gs}]dޝ~ZH6G|lTqc7*}+Ja:7wj?u9Tr_1VbLWtM."iVwYGg.|o =c*H jq18’O|e ֣d0Q]B6w71k/q!TOY{iI1NV`{MR&hSѹa9SPj$U-3>f~9%c vcߏqp0@tXbiz&ՌqZ^'}xk-`n*************=[pPtcH{Gslsm8l\="zbz rţ{S+40dfW<&)4!oR2IˏG@XI UArnEI&7v@yMQzU#-=]M&] A{@UMQ}j0Ujg'#au#r]>G}XJǴEoUZ飪1)s0+Ir 7/RnE"UnJ'Jv-O+MY{{|WŁbpGhX{UH'cn%OJx[XaGxy>^|+c,{'2f96s]t[-tm^RUYSwi egR$P"'c$Pj=TwxeCjJ$)NX\7'{]bFǦkUU [jx:ʭ+Y_*r~jcw>Gʻjrgk>[YdS 9wÑ b*.k\5nVndSKtEd4W4K]z-ZRpu;{IiDzb9ԗ[Ȩp흼OEgp`7d'nH A?04j.ܶۯOf4d~[6W&Њ3DŢFi$3ixUWbMJ~ÚT(1Ň~'e2-&aI%wzk+/fʼnA*o1peb;1Ǖ&$7TX4ERݹ=Ŧ : `UVtDlsP<&j0ۿotMwE5&RxS^=QԲu+JټM ֛P][&Z%Gq?g&/ʰ3/k?_MS}fP|ezvdݿmowZ%ywVV **************ڜc]UFUhr_ %Uc_&UUQ.V3c5_٠+Q^{ "Dc:m)77*Gf4fcC. ޽FGSz`|M-U\jlK~.Q8v"6Jܞ5s`U*nݍ H;ѰxKWGk[jlOIXXRzdQD53! 3룽ֻ6(O9OKx7e0=n\+`J!8EK^E9#IuI?#9N?6Uʷ*ds'qUUVNhY,S8fF1Ʌ˱zq&;W*}F߂hmjߨ yNih6ON3 ArEdzgVk{6ˢ/rJ e)3|b*;Ld{Ut{Wtn ><tyVd/_toSǚ*pf9c9&7s|`YEXs .z\ ?uKM̸>Oq齾9TNB;e5BF5ׯK[*U6ۮ(wr+vߊ?`8vֽXrhg{+?21LV%G7O94I3%,1T+|/4b#۴to5ir䳓,\;"Mz1EA9O}ܩNVV2%svוb9D฼CN`⑭ X7Bj9Fv~%iMQʔ^)ڔ/ U64jf4qQ"9vsumQ;QEej55./q\< F ZndVٽC{sUmvkSg叾C0.!ۤV+Tq,_װ/_WFp7Zmm"WGe&s&4]䱓 '[9O/[L4@T@T@T@T@T@T@T@T@T@T@T@T@T@zYIp,S {GԑʦZkl,l֫nƘarN\kzQ3JE3B-3\s$Dp\G*%$/OxDf,N0\d-&/A+ UȮhG+QU(R [X6ǐdw fH@ |ZxU4^%h\w'J i6_խWD ϛx\g/$,0\Mc `Ejm{ZH[xk@r&}h&IFG,wq~^a;Ѥu9Pܚ++xߙcf r13S&6cҫgE#GB DcmTsz{ZꊵRRf9>}Q8(} /6YWaC\91-қ .F4#PBTUVjݸ뤧{hG8riNk$IsnfYU,=qFْR\B2H'F5j;K^-N~ӹcq 8QZۯu iI)FtUK&ȏܯt yH0\Uҳwx-?@51OdW9Й cdHi:;;J]J/nw֓iLO~zϥtnjpJVm\XD{}~ɥD1ˤ8"؟ٞǯ-Y}OƂ~g+3= ѝMhȗΗM^0om4޲uv#Ed 7Ɍ7#c?F%T0שxuE.mba~G$q̦#J~*P%q 1k 3 g"Uf1xSts: ݎk/vǕ!T8c&<6PꍿjmԛK29_j4I31J6%d* }S ˫ oZ6~sg>+GM:HS򨞛g)%-nvXTU).])sunϲGбPKX=ǻvA_j>ADsx0SE"œ#WEMcOjIE1XA 뮈k/elc.O2j6kɪN.QR?&orFC,6nG9zt[Q݄e8&վ=PdD-+cϬ]-Cg=FM>-Hӿn3kI*+T;IX\=;0'\wǒƔbUKk7֖[p*::Md}K!~Kr5'^e]Kc\+#֬z? ?WCv}ȩWqg忨gECLBVꐂ^)]tB+We 6屵fǃ|f(.r.?9:bBLWd25qͰG]ꊪ[nbo\ #ׇgOalNśruzQ%%\jq3ZG (W5j";OkTPZ%j<5ƐhC[}nvNX׃zkDaO;7B )eXi=7O-}}3wggod>Ձ_[>K7Zm TyʮE;͍ǹXֈúƒj(hbۥTZN z)sN ǍƹN;~XaxjܠyZj"K8Ks|5s|ȎVi +_CP|jX5QssB{ND,reDG&O'ݭSZ:`(ɌwّE#)M[=K*.J1|ƒ.O;2M$s)2od\SnZrm4;\&\7ȴ9Tu.4]Ǣ.JSMz]7Phrz,|Nb5ZZk0J#}F=[ m0Vikx+o&j4Bo0<p;Y{UtkmAySTƞ VePbE }F"鵕-R]jKʝ [THd?$szYEMv+~UVbq^Ӏw×ykV)~1%1DHqDnխ]Q}ǖ=xk-9**************џ xOz,Qd(bXtE5e.BHoC-TRQJVf"1ΰfYθ "L=eMʉd]5jyК(gk;8yl836!q8 sFD#UQQؕ^O1i1ꈣm5TҳC'G~m^ \džY-1%,V@)"+vͷNF{n74Wb|-']xAWa{BWc_ZncJTFgӛb?DdHy4"IҸNkޫ}jU23w֢+89ps8.QG$L,8+}b5+c]^RҲXI5W\}E9([#7Vᑗǹ B"\W f~/߿WkMۚXgu7wgv= >F٩%icB :y 6kDQvWV2Mg-/'U=ɝ 66EQ{҄j=z[nK{kRNvqm4ԻzF;7[Pg 0JX%''Olaڎ}|W3qx\89 ǩ" ײ9o⊚W'M-뿣SXy|ede$&[%4MjO }2+SouMlը^Rg a\gLy?%2]v9|Pv{5.a2x&2GR*bLUX]+U" k#GG*~#{6r~JH%hY_[k 䵕jJkwWR}+4#Y_k{z17-DD/^xt^.S)!^wA`F}=BEdUM}!)UεUBk֧ Fs r92[reg>8\lKVf[O$mß "1LVJ"yc3q&N*n/,umR@z]P&-o/,wwfq: ipn5xs\܋N¦<38UT͘[{uruEMZm:Mͽ'$\qnG_ysp|c`Jh+U,Ad;eнq߹O .f\9:Tؽ<7ؔY0' ̬L<2p̦j#JXIv {o޺=FsҰ=}.z˔3^|{s%C{Rn7a${\3m/iZuE'TV΅zRNhySy8yD@d3zYCUl5_G^ߎDo)|]w y/O)8\nPc*ROݕ]W؍bm>ydz6%vRzbU̱}߽^+no)0/+63^>W9N%ɪݺkgFߩf#^mN/o|!Q5{>Cj*%[W'y&EQaĞxF MTQ%~zQDEKRe(TN~(Ѯ9@Xtlc.lHE(D?OR! mܯDj*WKU1xcC-𣪥}ܻ7渋"Ht5AgVzm&R∖ =UWq_yU7Nk*-n7DWz|Sxz+cw0]oھ~yUVqh%Yʟ[kE9xyTwG*4פO#vr~BUl~j;q!˛##ˎ%cČ5Աkw*WJޜVG(Qc>cb˕ 6I"!+FCwKHKϷ&T=QTjt8a>.NS#MX*4J3]jnq:=Qv"(Ǖ&zJA6]-I=-$q!É t I օG#Qz_ҮU+6 uuO?o度( M~xcGqժ"jdmR[X>71<=F:er5r*/մrB:ͣ]ݟ<@@<" K9 5UE\%)*#2W&_q'U$CjerzQE޶l%:e;p4jZWD(f&F|~LҤ"0ž;Vtis%wRIeS<13|t:9E6 L|W&k9\T7Qk?@a #\XlFFḎs4JA'Jr.¶)r;pXةsR* 5#j'5Xwҷ$KĹ:T&BS,=HfY3}j\p9Bm׽0y4^fTZh8kXg)5^jd3xc,tľ6T=܃IW?TK#WE;iR׾sC^chr9LbBfKIjV=QmaTGmZxfx}äqߘcŐ/3qHCcR5z7ke⻦Qx6k;z,=Kcq#rN='DK[qq7#bl = 5fU]\6G/ZڄKǟ̩ '%V"sz|Qr՛;"ۂ6WF\ njJ=Ny_E]+m[ʱ1nK$l^Z؎̏@fWiuȫYY%%s7cv^WҸbbx!nc$º+HeGbkX;Y]4髃|Gc2cʟ+1kQiMuG+'5W]bvͤɽ.6zrU㰦H~O+{FሖUvUhWG];߼wߒ?,q4F@D*7ֹrU[ x/.GKoSj^udc\'Y+ph191/RiEQMQ`p' :0Όg(eEG%_ޫ:bB[XI;D;UǸ" 發TT)ryD;#FETmæڔU:`GoF3!j&9}X繮mЩk:tFb_6xvzY˱ϒp+3rɸ9cfUHad2FܣJ)MEJ~G%z'm5BrՏ% %G8d y B+(+=箛֟CJK{ɵycVn0;[n ah¦DN3&@:"}1y~QZҝƭUS˜\8Xq&(R%TEiRXʘ" k5#W6qLUV*kҷJyV\ lی*'wb2wrv*rAq<1 'ڝ[_toMe*=sNKE1zҽ?=ƻi/$jܟ9.8`f~Q |Y5"Drhu-]>֌4]u}s;C_s,Bi?SGJ_oG7(yf0Qϖ%h+R+zUM+>#~qu;&jo>j^? 3#c$BooYD9.rk +Ŭ|| {ģZXWq^'Q'3=1d4*#hy;ܞa0<-,SО;)'\*.<\Z? D"D^#{U4.R3NjpOr;7qGGhK2:r+څB+>u-%)5W#ޡ>gj1R4U:ldcg/mwo{ST\;Y'đ*O<FBVL$G}ُhvu܉nlK[Mr[<ގ)'csV˜̩9l\GT"#[+[ڴn)ZvרiWgh n LLO%8IlwΏ YQRVcyVTUk/fFW>8t:r DEs…dۣZrxmXVח럩i˱rFp0\a@S'"SZرu𮏤:ܼ:YaKH=G&TN),lC6[4ns "[t.JFbVt/yW(ȕA+ʱ9(N=y4;yjNz9]gunuPzwv9*Tyeb?9y[e.H{UN;7~V[ ,߄XgS~W,= ټ[r[78QW4o>rgq=yЕWUG/RlO պ]gs qTI/gx)_VZ= z]\[x֟oU+v6Z5jͽmv־'la[ x yWsӏ7my&F/0I+ݓQmYX䒥i{r| lu'*jʘ`e; 8{MZ,S|{;_36bcAqAȟ5g൨5EJ ՟=O>K1],} Dw܏Nmƒ1%!5u7DkG/S+q J9qUC#Qnϸ~#1ο(& HCPUbkuTOmʝ'Ku™|Nk{LbcSZxyY`dC <sh+^>#ߪ׾j\֘}bfqO؞e 3{!D$V<2u3Fk/WV#\v{ 斨r98~ZyTq<r5DIDhIszidQMuO=eZZ֥^s?Lcཪv]=w CTko]h֊9m֩\)m9gL+zUHG64㘘$~ px*Haۏc߳Vu2#kv[Ue^'{w+3S\93wgvOs^kpߢ1NRI1m"Y,_jVu_n=ξvnM:{;Y#x"&.K'9dƄGXețȉ^XXOUqMx[e-kZT/nbqSfy+^>(NBBaFru9URݩ/RǑ̝u|1dwG̦! GYJ O%\1G( kv_V _2r=Vϣn70#psNaJ % qfBt6 d;9|TVst.Klvj._}\kq2nDM'zɹ g[{D-XӔs~o_5 nr|9[2TQ޷"tڵuQi$tpo8'`ZuJP7 PPPPPPPPPPPPPP#g, )3rVH HcwW%.ʤF>eP׹̃",Ef-HM#Jk5cyfk\bxkREyK&v|bgA < ޅG= =Q/彟NiZi:KG*,yq6Hm#%I#,=Ni\֨ډՍ͍~t(szWR{{SnRR 7SHy^A,-bQ%Q.{V4TF=5ur7_ooSO:ހ-Ƚ:luxL*_ܣ㼕ra.R4D`2t'6 F:CBr*RonpS>}txϙ\/bSYnpt^Sz+ݠ܍[+WK,WiZnMSx|Pp)9 u3V 2̄kkM.TwVwQ#龏e}9ACJ嬫*֜rl82#(8ńw3)kƪ/K=řB拭TǑ 3J؊/,тJ]kxgDZis&fFawC{Ph}[iW7۽'p)'*yV^r8 9^x"5"AdiZm\Ъ쫻Nrב7Gy}O1w[E[tiˌ{Z8^9ƈ3@Wi; NP'EfD'P$N'y9)U7\1{\bL|\K%lC?$4NI=Ow}79ln+ *yڮnr6nWjSpK ѝ*C9GIlLLHi5UFGD;bUֿv=9۶1i4q༯#_ r ;? F4+ 5Yyо5!i+_4\~pԹTW㖓)"b!X=@fM{U*\65˭Mo] *=EްQ$8kw0beNJF+ea)g#k"Z]Co+E5+N_B 4:A%)^ wUGZNzon][.Txxwr{I ) - C,A_tTҬ˦ٍqΔjro֭QY w|NqNO G?7 dԱe!fATOnnvwU:-*dti*vk-RV_F֝B>8Q2>3,靌ױ\܇RgCjծAꫨm_GzhqOLK4v&o 30 ٔ "Dǧ$Կ%WJV4YT:{hZlQ;wRo*g1aSȘ_?,'VAS;u~t #""m4!~JyUk?孋xvq:ɳY!2y(fIOkXF"mZZ/37ࡂ݁xk-t囆 !"(Ǟd~Ud,4B IE2E#ƪfc.һOMFr߬Zw,$;\n6C79 cW=k hU^ mW2QKv>hŜRx4+2YqƻKZuVn(cFh(~N]yLi ,Dl$ }LNZNۂÉr=rU<X,WssrqnFcEBIsG*nZBq?i)OO f-Fd`9]VDjAzrY?ڷ TUs6rB`{#z0VEZ9*J;Nqy&6FgOs\t@3צ=w.ݖʹ?q,'In ce4Al8h'<%|kty7JS[X^\<ɼAd&aF!)W|THFkkڄ|+g'vˑqQIp1%a>k&3t;'3uMZXj֜r^^yGFTҸ$%?̿`q,gzU65ܥ㏽KTےN/=!7|e ܬ AtwV*"i:w]|l[:$A,R1惎ظ%k(QޛEY\Gn5c_jK/16%^[iYwzTҩŽũMu'/h[arPoE ǔ+ _XbDW}[SnY۔g?4b^:R[㉵?)iqst1!Ob5W֢5/\U%i 6k/՝_pcxw7rA܉"E^%؞+Z$A ޥuի}:L.ct+zZ5Zvuweܜ1P`Hks%Ʒ :r(^ܫ9=vAɣ"ծA LYYb ;=WoU|Asy,Dv7()ֲJVz[/MSUnƜu/6k*7w`ZuNFn*************4;>s|~_2#92)F*97H`WK]].yMt6V,_9<8.eN_6)c CynnY<8 p`e"΁VWCjZ[Ƭ}̮Zz1ji?yǏۨXpʹnJIjB?/hi༎Ys>lFs3#-ux\DUҹ2} j3ͫG. G$xrPE3y&qws#0-]ڏ#3ZbYt+-,nW'讯qXQTTğ8M[_-HfcՍkLkUoX)v! o^mv''tG vӐD|xCd7'\6߆MxBUw?e.J==N\"*LXÞp]&?кd#ǀ?|"<*ݽMEvS[XWe/3s!w3s|Yp z;NqCPn$v"QR"1DUcmݽ,x.n=Bu[ɼ9t{Eee9xlܢ+ƹ*{4U&^RSZ7FH3Gzu\*-Jr|OxW9O˧ǏWʮUi;Xo 㝾hqR O6bkN1&)UF `j-/\ZQr t y Y N9q|Zg,En;ں׫?zXU'o~nmnbT8}nj]!jn&dk*įUkiwKyc"/Wڮ*LcQ=$VˤY䗷sגϷm9|{gNJ7]O(o[T_\kkZ==7~[/2OY&`% rRPdWOg%sRZԽ4٬PܪF$(^(ZڷxN^p#gv5~0|u;*BJ*ZUDr~}6鷵"YFEi_ϒE%~Omk]_d0\wH0tDW-UҺ jɧrv]JT(Ur^LYlpknjUSݻRȕ,>r<_?c9{BMaE%d)1XXsY*zgGq'8ګ~õ/ZuT%UZwWv&?d8ۮט+ls\zz>k(W{{wnݔkoE? i_q%)3JIj*6z:S* Ϫ_qyiw;/h"fD["Zo{JuWfu4mC< a@u& QX֥STzz/Oin}=;0@QB }+w^onn܌xrsjc|v.C]0wGlmku.fiٌ)._a1%Dp@\zq)A{H'x;j'8rI7UUVDCݜ]\FފKpdbTk1q/vבzV_ѼӛL)x0'צʍDDJN*Rg[u]9ݓOɎ_,F꣕_uKu6φqb,Kt}v{HFJ_{oW=rkEܰ|*9ѺͲ.ޭ];{_4JQ]IL0}%:#ڷNlJi\ڭ$\/CR9Gd$CihԒz\"󾧾[Į}ZxAF?|ICYRGl,$bDlOz b[61uTEݰ%ѵD=Bݭ NS YhEOsyM#b\cUQ"g_ROevܝj!Kdr%FL#§k_䉢- Nɿ4Y`R|؃MgG qU]XUέ08 )&}.?"ap/!*"hָK'׭p#g/$ q#oqU_$ 3;E xN|h9pOuQ޷ n6`ZuJNn*************<k:{C\3khkRG^_T_j%fJdr;ɤ`΄|1( DU݆Ϊ_XRMbqv\@_kF,{ %v^4giJHP zQԪ]~ƞts&;q\kEDUQUoҳ<Ѓ{i<2G8eO龶[J9܏;I &X'5U׽IQVɽvsr/cq3IW=QUͽD3\ؑGF[ڍ+ʪs޺;JLqAD J"/K^q,#Fl9%&I+tpcK#\佗ª'5=I{?`+Ȕhzk5SU-\Yϴf^1ov,0Ka3`c6sQurX]~CE:3`>o2?gZ79r#H Ғh_EExƞ6+ʉXčɜ;N~ɛ"yՌ#βTUUʳwVR @T@T@T@T@T@T@T@T@T@T@T@T@T@TaI:IJK4%8Tb]F+!" QK*kV)3(||>1U:H鿚-gASWd[#{ԉj84?P0NKdgڎҾ;*V<#qc(9AL{ruG9UlKZxn-ٹn1o$%+T hֹuTslJlHG)V#esW~'`w:Rnj{ϓ$Gvqjtjjo:>bgu@c73DeĊ7Kլn՚YyS+UG%_Ug:oe*g~i,B1 βxȻ[Ffi6c王][UmINO6e[qה}6OfZrBjn޶vs2.Y2[}7[Rx]qј1?R{Ͻԍucf^d?)dR0L eK14W1tJ]iN ΆRƘWhFԵF8*[v/`VX>|~.1"+5z/Y<Ԋ秶pwW6ֳ _\C Rؑ\)WuDy=bTVoOO#b.5kGac91+]TEMՋ3ZU}LM,WXAs]ګd^9U<*˚X'Xv6bp晉H$@Q4^GTߩUsmF1C k% <.Kq*F[d]vj̗O Y].8=4qT}7!;m2XMltAdF)&WrSݵQ~ jF''rx NI omsY=DNWwVS @T@T@T@T@T@T@T@T@T@T@T@T@T@T C,9|LYgsG#TcVJҭ5 ^_ZYdqBrfN|pP\Q[پ/jWKgvޟt}[?">49ƌ".%t6rUw~ϸye3{oFʪWȺUKl>OlK nU\ukM'&>`vO؎cW*[/sʭ%\~Tb۠jЄpG9ĩCSn?9g.a Җj_7x}F<״?.Jo'SUmz˷B6w zѿx[hojE%fH߯9,}ڢSo4*K/S&|ʻt7/O%{M~l47 ^5?!-5a+ifo71Է-Ŷmf7&ךBck\ѨnRd\(Ɵ U?UWJ37{iM&}|RGsfnUDc]WgKc&67SnsOz;IgMdH3l ksZ5M~k=Ź"խʵp>Y.wDz]^Zjk\T%Rw-Kiir={$OU4WQA)<]|w&S$J`ȗ#պ.rMb"k!T+rk:{0Nx UY*UAY7ԚUMV;ʣ=z},Mo$JU0{;~ \+(|9%-OStVEc #`mk7w茑T'QuMvޤH92,ᝋS+ޘGFLT}+4Yijeg;$EELV<sz.ӧeEBQl|=NN 6spȨR/F1KԶEOM.J?; 0q<|eWuN[-ژlg_q͠/g_q͠/g_q͠/g_q͠/g_q͠/g_q}@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_@_~6o}36o}36o}m~߻;gm~߻;gm&WVemL̗K2#[=SUTUZPWW]WT #)oPM|e˞h+)Qȕ:QJl/oVu3#1>E\UQ,;{6Uҙ>A[_ E ΦcB3G̮oV51en\+g/]ZYƄf3#=2/™-w{Wc?63%wV[?6cJ]L_U҄u1/!ma+B?͠f0G&wTQ J 6vb-iCfd^h`n:,F@gO701kbس+ P8,B"a^k@Lw Ԏ qi@.?[_ ~i@*9UE\4 i@gfDZt0Vhy \i[H湱ިhFi DkNF6j9Q?~au)O_2S؋2ie3Zz}3FU@g W Š(]؟zx mq5~P ?AAc.ƿJ!c_'PPDXKk7(Aŷ(È oP ["&62"oP [_~(pkb/YxEPTP ;i@۷MĠ<˄k@"11 [i@"!mBBbP >TaP ;i@*CP ;i@,@,AP i@.CC?z'0?_Hu>11TB@( CC@(CC@,CP ;i@,P ;i@,mA{i@ ۷MK1(¾ {i@g ~Tx@g T@"!m@$!m@$!m@&!m@&mCP >TCCP ;i@,CCP ;i@,yP 0><̏w~8|:8c3=3* m(D---vҀP!J@j@ʀX!ڀT!JPm(vҀ\!J`m(|*pm(vҀ uqRPx_ ~Tp@ 1PPT"bCP ;i@*CP ;i@*C@,CP i@,mCC?hϾdw:GǶx@ 1P ^T"BP ^TbaP ;i@(CCP ;i@,AAAP i@,C8mێz?褠??ءupcJc@ !P[P [P ^TBP >TaP >TP ;i@*@,CP ;i@,CP ;i@,C@.CCP^.Ea||UE@ 1PT"BJ! L"J0j0m(B|Bv|BvҀX!ڀX!J`m(vҀ\!J`j`m(vҀX!J6v (.Un0GP3--|*@m(vҀP!J`ʀT!J`m(6ҀX!ڀX vҀ\ J`m( vҀX!J`m(8sCnw }o)!(D![i@"!m@$!P [i@& >TP >TP ;P ;i@*CP ;i@.AP ;i@,@,yP ;i@,mCl?zdG/OM{D^T""P [P [P ;i@&CCP ;i@,CP i@,AP ;i@,CP ;i@,CP[l;یq} Ʉ/* HB/*1j0ʀP!JPm(v6ҀX!J`m(6ҀX vҀX 6ҀX!J`m(vvҀT J6v @~vrBZ8 B/* j1j@m(Pm(`m(BvvvҀX!Jpm( vvv|*Pj`m(B+ ᜷22;hT!m@$!P [P ;P ;i@(CCCP 4P i@,mC@,mAP ;i@,C@,P >TP ;i@*;Zb;'suGJ2u^TA@&@&CCP ;i@*CP ;i@,.P ;i@,m@.m@,AP >TP ;P ;i@*CPGgrq|@~wx-~BJ1HBJ@L!ڀP!vҀT!JPm(B|BvҀ\ J`m( 6ҀX!Jpm(*`ʀX!|BvҀT!JPm(qx-(dY4_KC,҆-vҀP"J@m(BB*Pm(vҀX!J`m(vҀX!J`m( vҀX!ڀT!J`m(Pm(hB*wd6?rۊqߏ9abP ;i@(CP ;i@*CP ;i@,CP i@,mCCP ;i@*@,C@*@* 0>㾅?8T+W@̱ m(@m(v|B*Pj`m(vvҀXJ`ʀ\ J`m(|vҀX!JPjPjPm(BvҀ&nW1[o'̈́/*0j@ʀP!ڀP!v|Bv6vvҀX!Jpm( `m(vҀX!J`m(vҀT!JPʀT!vҀT!Jv @~qH$WTP ;i@*CP ;i@*P ;i@,CP ;i@,mCP ;P ;i@*P ;P >TP ;P ;i@& >篳f?aߌa9CaC@*CP ;i@*CP ;i@.mCP i@.CP ;i@,CP ;P >TP ;P>Z󂃹* m(`PAJPm(vҀT!J`m(vҀ\!J`m( vҀX!6ҀX!ڀX!J`j`m(BvҀT!vҀT!J@j@L!JVtWij?Ѝ@~t8mt9CP ;i@(CP ;i@,C A@,C@,C@*AP ;i@*CCCaP^ZEQWTֆ^bAPCCP ;i@,CA@,AP >TP ;P ;i@,CP ;i@*CP ;P ;i@(!m@pn wKfvWրaCP ;i@,CP ;i@.ACP ;i@.CP ;P ;i@,@*CCBP^Z)w*m@ CCP ;P ;i@,CP ;i@,mACP ;i@,m@*CP >TP ;i@(CbbPg#T&?:W 팟hvҀX!JPj`m(vҀX!ڀX6Ҁ\!ڀX J`jpʀT!ڀX!vҀT!JPm(BvҀT!vҀL!ڀLBҀh} @~q 9QevҀP!J`m(BvҀX!vҀX!J`m(*`m(vҀX!J`m(vvҀT!JPm(*@j0m(*1 j! jw_sC5CB튟|BvҀX!JPm(vҀX!vҀX!J`m(vvҀX!JPm(BBvҀT!J@m(*0LBڀLBJ jv @~r%#&KDBvҀT!J`ʀX!J`m(vҀ\ J`ʀX!vҀX!Jpm(BvҀT!vҀT!JPm(vҀPBҀHBJ! j! =T3_M@~t;Z+>2؉K@mm(BvҀX!ڀT!Jpm(vҀX J`ʀ\!J`j`m(|BvҀT!JPm(*@j@j1 ʀPBJ! HBJ ʀh} @~r%u_DeiCP ;i@*AP ;i@,C@,P ;i@,yP ;i@,CCP ;i@*CbP ;i@&!m"P[i@kݙ8~m?:]Wm'-BB6vҀX!ڀX vҀ\J`m(vҀXJ`m(*`m(BBvҀP!JPʀP!J1m(! ʀHB wд20njVCP ;P i@,AP ;i@,CP ;i@,CP ;i@*P ;i@(mE@& @$!yP ^TB@kݗׇ@5w ?)h CP >TP ;i@,mCCP i@,CP ;i@,C C@("P [i@"!mӊ. Φ6K{CP ;i@.CP ;i@,P ;i@*CP ;i@(C@(C@$!yP [i@"!yP [P [P÷ejٱuv߉-o;i@,CP i@,C@.P ;i@,CP ;i@*CP ;i@( @$!m@$!m@"!m@ 1yP TkGloޠvҀ\!JPm( vҀ\ J`m(vҀX!J`m(BvҀT!JPm(vҀPAh/*1 ʀHBڀDBڀDBJm(:TP ;P ;P ;i@( [i@$!yP ^T"P[P{i@ 1P-.jtEAP 4P ;i@.@*@.CCP ;i@*C@&!m@$!m@ !m@ !m@g~Tp@kwwOjuv-si@*mCP ;i@.CP ;i@,CP ;i@*C@(E@&m@& @$!m@&!m@"!PTǵ1cGд ~z~ ~CP i@,P ;i@,CP ;i@*CP >TP [i@&!mBP [i@"!yP^Tx@gtxǵ1߾Lb}?<WjxJ|z~[ AP ;i@,CP >TP >TCP ;P >TbbP [P [i@"!m@ !m1P11gB81)!CP >TCP ;P 4P >TP >TCbP ;i@&!m@$!m11P׾lb]g]]mP!J`o `m(6ҀX J`ʀT!J`j`m(BvҀT!J@m(1j1 m(-* j j @CJ8cڀ юc( gEQU5Jm(-h6ҀX!vҀT!J`m(BvҀP!JPm(|-ҀDBJ DCJҀP=P L]P H]P JtҀD}:P3@gJ0}4k:h Z֝wU]x](ߧ:Fx}=(@,OJ`zP T>ҀT=P P=P J1ti@&.(@$.!ti@ >tҀ@}:P3G@fgMΚ%-ҿEruby-prawn-2.1.0.orig/data/images/indexed_color.dat0000644000000000000000000005006312665203156020755 0ustar rootrootxl%Wu.vU:9snH&w Q_?Ā$\Igz~уF& ۂVs89:Ug]^^> k0@x}w o'ק~h &n"nLQ,wR6ǡr r0YU⥄K7{?$Y~$EOA ߧc蔤AD3D#H72:q-ŤEnUxTR5q8 z \wI.χ 5|T̜qKh&{ƻ8Ԉ9>O\ҭG%P4 s2}c CgH1 %:o-KZHҾ #{Lȯ U=> Nul@G-J^~˲Jc*[W($P1y ,Hн +ˮq$P~XG8H= 2Yܙť$3l^FV_l:#^ΙApv 5~e)x gs7GRO\YcHg>#+ 5^fG ?5A ܖӳL'x>8COpc\G!x)vh+߶_Lz Hg&~QI$ O4f,8Ө\i'1mg9 $=ɓ6F:RU("AU(nAkJ/#& =d^F ]C\:-(RN'*,V|1;DQIt!ڄGʐSipG:?@ O'fSS1CiR{)OvUg:DZt&p6̆/"νf%t:B\zQ7a|d0ٻG2I0 b<8PH<|g&"M_Ӡ3y+>#aV]((3e |]BW㺵Cd (ZŻznz_<`% YHz=0beieMa[}ɬI [AJyngK.G7CT)H.N%eAMiFuU`5UZ)M+~ۿ9|Tz# }NGNŷނ7 Q256Y0?2 y(>)d.HPy..>zGcMnt qSSCNρSro^\`=Mme-rٍ `E1=IAU( 5ӓg Uv,?g>R/d-#V7s#Ų"=< @3aTK 9}Y7NVY?#pki'>W4ɕ9}-e Q"34WwPz%l 6x?2WZ:P$40P0\["0#QXGG6>-<]/Lz۠Dzfi*JF $5 U(ݣ qG)u쓇C%(&A%&)b3%2izzD  ʛ빈h'nau5QeP%{Ă^0XkzV33֬! "CIJC0TCPw@50CE Ȼ:P#B4QV 4 {I;HA@N18,|sjĥuj*qt)2ey:{BSI!lV ])"̊립\arf Fo؅1s7A{ЮH,:(-mHjDP@`uC6QE%n 8YycBG.5 Gi60]zMi3N#@!Dc'? X05]t!r 8]<fk!t30D1cp8.#0RT:b}gD({-0V.Mu R2Vvd+ݐPqaqQ5RnPУ Vo A4}k(MtIZw? FYdm;]uy@ץp̿ef8&zZ~=ĻDB`Y/x @wwCם}ȧm,tX ĒjJR)Ƈ # ubwgő [/N>qW0TgA~"lÈc2"V{J,zF6Y;MaQ[㿡.Gl#XG4L޳C$`~:$fvgZ f0c80KvP< U D!`*S`LqHsBB!OPct'1d%-ՠ0DjH7HL{)s5ww!UI_zUGO!cz#>X<SV K>F -)~!DTCAT]8Ȃ@ fnIuh,wN̷JZn?2śPcR}s",ܶQŠ#Y4ZE=B 5"YJtжݲ.5@]\CPCkSe"eTڭGƷq|cZ>U'+agN= a&YR1nW,b+PLHb#P R)zRj!u!PPu@ Z.vu@,b 'WwMh& #u9(aѸtmC?Gy$NQĤ+_/èݦ6)P)tAT0zHȑʚIB @)Ɇ08X8]?6$r]eQ9zIIJ#qU@)maKHLF`L'$k!݅T9s3PF&Lc;np]%Ǎ%`! $R2 BY`jQ :Eؽ*1<>dE*f(B_Q~Hхzt13BMnxSп [jtWĄ&Qy-HBi23Z !?h"ڳLL0ЇjU^JȆTwp#2((N|$]4RbOQ.EvJBX.G$Hѿ8fǶ找 Oxzxbh{$}53)d ܷvW߳FCh1='v "|f1$aT6?7Oy iy=x,]Pf{珀"%lG0/IM7hSTxj:"uf%HGbJ`zvL-e-`̫o/97*4/|[/  PH`fѳqtbVxJ&1eztё-IFF*-ć1D"뇀|7jBi> k73 4z_{G(QJؠibe4vMIaW_k*TL E1.[CRAQzusəQOMR)#xP- im |է:6[AK^UᱦM0lթSf!DqBl]ie4 R.}gO{; G~=YhyHχP9VwfmG9;T5>ٶ\֮~ZFkHmn\[?bBU0@o;t)qBr&}FH|&%sZPB``h8^85?@+9lW u}$3;L^x"|l"JX%Lp``(MC!-{(v`ATAD,JwO5!*i:UJE_]/3˟DL??Rή@U;,j!U*̵RSj٣RQa uϝFlHoh3 _8vG\ lkw'd:picsC!U !# Q|dBr?1$GѤ.Q!/L_Yt7@3'V/mR'q =QiSAZ#Q {*?,p8RxEFBTA' %Ķu+ܰxՄ(3Il.{.|g<MkZ )Og j5\. P%r ޗvW-]*9:C" Si*F(ơ͋3FP @it@xĜz !Ab;1Z!];Q{zS U509ՠoAEv9W[n"̩h'J`=8J+Ev`hz Kx^0)QT5 l$O|_7(͟8*x.+ ˩bH"$DܯPK5nkqC#@:Rft{{(XAf-jI12Ƈ:ͩO>}^wڃh}B^> b#RXCqFunKzڒRF¾8,j ؆˗kHOqYd{ԞXgR=:f4͊ѫg5g`HtU1PB]T9}QQ34*iXY^Qe U^}(ا0Ro죣 EL?F>o^r*<6"Jt8kbwV O C\.$ P :iTTWd_|.(edcI`=?\J[ӽ(8 o]y hD qHĒ/,˽>BUh T|aQ}TMQS S mhUv$5Ůg'՗ 잒P ˓ xN`h=̵չ ݳG׺Y dD\TQL-e$Pj!2elIKTo*64=-;fYqG9XjV#Dglԛ.,g!z C0qH)h$!;iqj:Foo/!܂hS>F^A5K28a0ˇ,׽+o~KTeCWt0 WX^R/ɮh6+$&xJ>ċVo nU5$C(!v7j@tx(~?*Srŝ1%\w1Pu|ೇeh^P%d{ O/͏/ni^F+%WG rgjat{򯂽~\LXBxIly˳lQ*6K0Si# S(%Yg{)F1s` bcw0Mrts –MM/S۽{H3⨰][?䓨 e(NjXq= {-lC`wJG-}M$DgB y[ I mm8L 0, B?ĝp)& 1nF rhZ!|SNM uSL)6Ч-u+ .([Gq0Qz[sA֪< SzZ9>Q 9__i$rTBb6vՙkV3M# VR>-h.)r/f˪>؄Ȗ% ^W.ZhE1[ Ckտ?|8reЌ[/M9hNc,iCEH[*.if6#)t%LœF%lvG);w#_eLf?W[D{f}~S<Ѹ1IYWh?+Y6phr' o 9a2%D͇c6B~{lM»FJ]"2u*)W 4wr)w;Ɵ v$~{تJeA70_EגsveJu\]'YѫUjM|v(άk&B Te"EG,>2%P2e`q ްl8nٖث`46c_ll@eyPLѧ Fn4? V[ޔ)1>\"jgHak')~M2i tCak ځR;x<&==tՒ VSqu3):h=.IL&SDD;/R҈t0^ֆvE&HBN W]Z\hݡXoіcltQZ썲 //1_}"~*SAë 3<6 k`*R{S fG QYK* TW}`B y%hv7>,RFkVO8|~2D )QicVföu *MCg۾䦤8;=p ˱u- ov$_ڭWnTOq9Cxdl>P۱Us_c)`ɑ-m}!2˱ R5"*` ]eWtc^l1kAk%d?%ZLod Ze[sOJ+Z#0z#rI=zM727 o/_ K~?x]>u}}]MH>I5 t9:TC}8ު'<`2|oGxh4W(**py!p&:ta5SBRY:.ّ*I*ZIC WXB訒l-^*n#U 2 _;f\r?k-cn@ 4!Ai>[-l ATQG.G5[T[aԆJFO'յ&DCb"s\R0ѴZHKq24^*?n']#rЧ#ppz`Y޻UO 4au " 65%RyZ<^GB .rnU4agK3 #b4N%TwQ]ᾶS^" U< #)'tJtLԼ9ȭj)`(r>Q%=\O/i!'<{RA8a 1xtAZ6&0 31'#?DZXA L,8V$1a@A.kz6Q|=fH$@vYG@U9d7P0.}!4:H) {$߉fRC]iqdVzݩ˕&.<&EnIf @D<ҕY\`]/ړeIW*f"bmoc#hy׮I[8*`cAA][ Z,۹?%j[ V 1- Wn I\QIqeP(s%w ;GE%a"MBq;@UᕉN@BfpEh.dG^0nuW D w.A5@{t+|"h{뻺`I$ &Uz#Kk:$8iTx&vWSe9r"H90P[\@+W5Q*$nVxXd|"Cwh#Du\RHHjO汛k>tjZMgaD}ȐMr֚x]sd8orQP ʣSoLT'WݲkA] )KCЂ@mԶQUG|P7dG/\8i2ƶ< i0e~شt4u[Rn6;#AKV-ItRj{-/\:JW&(<~]xmwwơZtR49H'_gDx4g6aFMiWH-TJē7_J5 P!ت. laGtC ǝeg 076U]؃}o)GW][67B2IMX\d'HeCf 6d(<"H#WM즺Ea`bH:ʒh)61han(qHU&DYrN4 ܄ KG*B5 kZ!V%'(Xv;ϋaMS7t[[cH"eNZ@&_R[G [R u:=e,6-`^Ln(;S]'x )lmӳ09G.Ms i'}IM7G":=LɺT],6\X\&1Fأ!3;PMKMisI/,]G"qq}x8^6 Pjy n37 av3dVU9KuL4G/ܺz_hԯ}hM,/#ȭE`KlKūug}b&Oyƨ3MNE_W_j@:w+Xn#&6dTyRQ7l9aj"XͱqQc!r 19U{TZBo#1}3pHk$w fe^Ō`?! ϔ@BtQ j*+& %X`cr_!jV$%?rITShTF)c<y]Ct_軮Mo Xԕ^XgU擎YٚZvv 6z)n A[U0bFpG¥OP[iZ$bVh Rm)C{TW_lϏh E)Čdaܚ!^&,_ j^m3j ~$ð=ude8V7aQHd䡽բUo!뛘M,یP8I-b}\EfeL<`mup4+_,c[.tl&D5 t$< ? (Q mX=502 KaGH׽=.w 5JkC8 I ~ǧ5֊e)u"}7RgOU<=G ?hUdZ)Vo!nJdR |"-Edl|ecQelE,CY9͝n_)S1?GY`nJOva,\%@gsTakScȮ+HxL 0Ekz+?8[?9߲[NxTim̀`y%ݖXY#<}: ^-qJAF 2*f Pko\1ַEΨP(]N"d꠵sx;r]{!Lr! ?Lt=VZEHGm.Χ!8n{^Q\"ބ:cyAveM g %jYt}V6=xRʵPjTAQ5"TKԷMZ$ :hDfJ "uw ;kaсKr>s*WRH\n F.M;O!^O@,_Z BעĢh4Hkekc<R(q2K7 =8rIve1RFR{֍pмFO?=\T!*44yO6 CK$bb $;jsi|C՘i.$P[ A:cp+ aW_+i8%DlmNCvMJb"K:}v ka;T$(*+Ov@k!/ϕ+|L*=+*Pt(_7aF12Hp`2?XZŅ!DLΆA(urTۜ:zjvKk KGNZL_V61!'Y*Dž;q Zc^R3$UChqڡ|Rs|”_Pf~jW-S}eL+ufm &%U zЎ9 onXvy(і}#[d#&K'qCdr⦜O}vxUFvv;(o+?ZP3ۻ |E7*96LEL1Dw!GijU<4v5!@YkdlPfSrPV|n Vsm>JQ}÷oZIxVuZT?o)*G9>4vy>Wӈ[CRJ/Y'u1[2޽~-L0TI{y񓻫÷NC}I\ӡ{S?U9Cc=~sm5xR6| t_mjK ͉Jw]|e9y9tbn6;btʑzhbNр#dW.|ǔ.xU1˾_Uӧ~7`CvY!9>tѐi[߂>:&rlWvLi뮇`̞~ /C6qy-!.&!8*pX宏a*l[8 >*\Y w}6EE{{hZr9zzG𔓯{fc`iy@ʎ0U4}!^hw4 㤾ФZ(Rw~4Ru ")7Z1-CM >:]/'$Ub%h/2ڃp9$'>EdIT- nSOd ,ʍ6Oyh6ϝ>M[^(5<~^ v ӊOk~YozM^*fiQ0訅@6g?,F][dCA*PȀa+o@h{=*߅hs ]XIalj,k˖>DB$޸M !KgşLNc^q#/ =C -BI"3DQim|-6qb͏N1?ve]T;|4BQlGҫ ŔK?o6,^8v~3r;}ӷU&6*^Tf{I,PnA(j[e9i\ Q|mEbǮ~ypѼ6dt |g_GC; PƸo$K΅OQ;껳QwRo@o~vˮVʪz}ķv>jj۽C"URRS vUO:oT-i~ .Ďm {O㗧O[+u V*RXS35bx 銳.QS-蒝ϽmUqw0m~mT'#wziգʨk;`~N_4CT YY@36A Ok!mXu9dؖ s2*74L@]D V&%mXO'u…9]9G|ބ |EJC\-^NYX7Щv#_cٻ`RH5%cgL8lid9hEjzw?%L5)Wl롕;&"49d~@#+ p>$oK˵yzs G_U>I+7Ŋܰu="m2;a{Rn)YgȺJIv6o95+p9 # \2J V x>xƒ ^qF06yvx.K ˽M[=uةY@`Yn(jHVKx.m@V a(2wo7 Y9Tt&ؗm48 7^-ٙSh3EW=vSO `0cklOPy'H(ꘓEvj?vg>ȼy`?aڏ[HMӾ3"f䦋:PmZm+M- vRڽhW!Ii[QqsXѢ-he‰${%}}'θsf>E!I_3?wNt7&KPZAZRŦP a30KmX~ `tkwնOQzgWΎD?-6pN3Û.얩*N0da]?wCV#‡7p\ Unu l5_Dƽ KyƦanZܧ+4}Z bͷQ\eY5''x0ַQ֗v7oS7`4"l,I%UTPeW>wWJ a ASݢGhGWMJiByJ^n(ҭK1kq mZRr.inS4E W7mmLw1Ϝ<4-[QuޢUo&nKa/QAgސHr4~Uޥ=bx2dZ?oO@*OK=oB&ޅ<*O'LA}H܇:OA6[)<ba);;u+jEjڴ.܌܊bз iT!u)Upxʂ3L|_F? rtFl߃̝ǨSz*0~QiW 8lf7|x@i&>?NBWVϽɽ6mSiKD[me+lc q}f A|u&(9PХlMKF_(nm7q_M?9߽|w 1"{K2R(sO9iJjMTQ.sZao;le|E=/+T@ks32FWKZL|un{jHa@چRmzhq*r#]7(ۖ嗊4ո@~Cy3waؚmB`"6 x"lYn@Fnzb>oTa+ F*4IBenw3F6%~Z"[V[!dpX,ovghEۮ9ZIbFlv}B-(ku3HueP ssS3рH]2о(a?׳ ^X.7zB͒8\W!\,xk/9+-_JRd8ŁdU)'Ea7ع-HnW$W9JJfXUo,0HtZk6ñ8r',Kjd4^q3p)ǥĝE 4]v/D[X@" 9Z>E]}22٥"$s4/ќ<%yP|e.iYYC#ExeģژJ帇6jqNB1ȅ*/h V*%ˊ/ ]Qvv j[kw_81>qX_aK|YD)+ ־l3a|MN5z@TĻZp$BéoByIy]װc>MVw ;T+|]=K_LLbXh!I.*aH`{t!7ra-uJ(ahq>A<.0yI)"[ݍK 84pݛ=<~pﯭuA*u4_ԁ$754Gbɨ"jQ }[C5 \ M`"\"2_hzѭs^FOV| 3iPJS ZJrXk&>9l04h2\L~{q{\"I^G{87? 7i7V-)טTN(myb`"aO2ID\?;ujgG6ѩFvӋǺ)$a e74nnIbrr/QjM;Öu*vG!ǠgrE4=TIڶsxZa -IEB:QZu%KyJ:AQ3-3_0{|%o h |F1PN9TDrgې$9tќL ;Z)<;MJ#qkCXhiSGVD/5:K⢨ f)QW$0pb2SOm56lH6?@@]B1nV8`"NST?X."|Msn*q(R Yq%Qm.R,4L܂M^ĺNiVkmO)A-}ʜ ǹ ruby-prawn-2.1.0.orig/data/images/prawn.png0000644000000000000000000003145112665203156017302 0ustar rootrootPNG  IHDR ʋ sRGBbKGD pHYs B(xtIME t IDATxyx]U?k;e7m:7Iǐ ,M VeЦ!-G*N(Ŷ UP@tIҴ;~$$ФTz<\NϹw}{M{ »[859 HҀ @ Q)Gt(;-SU)*<9-m43U Nx*/Rܸw4(5^5qe0m Y8QSv`J=s7h[|&G3NSYYEE9<˘9 Nu.W|1T0'RJ^j^ #n9#r1hOX䉈ωw=8 "V/4TF|H{<w=]6$c_9?[YGE8eB[ WDc@/EWc+яG3O7PmhSl4CU '*Zx$`^"z5Jf0݂'YgZM?47^>4cni1r魗-`f9gAf Vg|Z6lpŹ_(^ru" d(hb #,={$.lʅAWWy˻RY1uהTPw (oorS=< #2+~|Bi?LyGB)5榴7>7 >R;qv |'r >-*m[ ziڧjcLXZ@'%Ax]i%k* 䳎/`9~4aH6l,f.Fc+'gV=@vRJ/zvOhMA. ?6tcZ4 C &R\X~ 4Gƶf. ),,Ko5W3'fzUCEŷalR#s_j:w=hHUB+qb>dZ? ~] 80QW/¤+¾`u9" _w-hde7HϦy~Pа2kr`9ug56XXy 5 y׼Kay6]4 >YW7\x)߃Vc*ꈝtIQ{嵔[[7ہQX | Qcy<kd|N1ugzKV;JZ+ƸMBYV/ 4[5g=`4GܟVgPل6HT.0MDmcS~_)y]~;BE%7¡aeޯ+@9jNM)zrX@Ӫߡ @R[{\ǜmĜH?);5>@=bwaǗN%,Y4WFzhѻ)k!"tA+X!M+[,hF)(ы=(빩6ZX(F|ڧmg\1KYonN5k7~A>,𠃦`U:  S7r|D~WS UyQ/ oUW3w-! ,&39«qrb4u .}0'x铭1h~됟uV#O19c~ˎ;K'/pf $ Wx.TȺo?+{PO_8(f,c+@P`eh'xr,C\EפtܵboB3|cW|Ϥi 'Y]lC;?>K~#D>\SЀ~Ղ?%^zwgG O&t~xUtAښݻw񧺎j`lཋD:cۨئNS|&߷c; 8 +^C~77TԁMC%*P#œa[U ՟('e-m ~SQ.f2$'|InvwäI _d?fSآ&c~fݵDƐ7+m 0۷oG%??/=O4ۢ?Y~<)h,-w_{}HMʝ֭ʻMocK 4,^č瀱'\u}Y~NCȐgA-&I=\|t/? Y(F`].h ܘdD2K .e堿bN_efQDr߫@._77aC#y@~c=_y3q*o|yuwˇ>?Uv ƟIJŤL›3f"O{:bY~ʗܰo# 4 VG4;KHLfNwc$s>-{@'\]N7z aBEy& }OAp8yGBy,[ T~osrb[,-8M-mf8GԞ0Z߀QFhvPeK2\p3v=*9&nI&%{H!>L$ #t9o+TTTp '_L_rqId-s[䩧#’Zw5JP@rܙNQ$\@8${3 /IHJ+xǯ%pwY4L~Fd˿*҄mmU G=K߼gع erԙ]e|?T,ִF(ow`g0!!H $pI<^N0ެ\í?HtK4?xGoMT;"}}젱 {y-ihW-J{V.Vf]l6ۍ58;|?)&abgcKB|Nۦzܚx\ԩO[a9Mڠds=hV-Xro oAЬ1fy&Bcŧx )Cא5$ycp"LZ-&I bIU[wv>ծE30{iEŏ N8Ի^7T-˟s*lPk#$y GxTa<>Lj&u xbUh4|Mu-X-AD~\^4?%`-wpU®xM0!V+F/W0xx$KK<%&U}>+_p֔q8\yE<ѺhZb.QWIw; 1}K&)6H9bq؋m3*;;U PT򴢒ߴ:9 ;i@EpتMM*]9I ~miĶ4bRq''8Ʊ-=1_>?Sp't+#&LFu6ܬ_gmi$wn>gBa'W_27u\A>K848#dtd$V~1g|F+J$ ~UR lǕEӀ d_KK-3P`KllgƟJXyē ȇƋ= w2qƬJJ`f h4L|i[:r"#j-Eb`Hm#Vv?z$1'2ysMimz# D;#2n{%캧!lU[[Erj{/i=q҄$qBYN;hõg+=>k]@"#;v IӍN#/d )&yh */sQ-wg N4L|Yʤo5iv]p+ȶ=rԪs s_P0⇛pz4$^? 5nP$n)ߙ{.q+dhkXs̔߿dnj4ɽk''i/#UAv~1+&7Ԡ &岲ݰC5qw9j5|EKN@$:#4X0;È\\xQ*Flzh Df$3iz+W[׌ )؞O 2o)6X$u,۹(/dW:_H7{SaZ\tV ,{gF.rW:x)VTr߯F..ߩS֊~yNcu4Coo5mMBVZ JF+w!^4ܿC2^ La* ({|vn㗊e]>S$%s}A..Ot#E)q!5`o_<]M146IQ`:d25n{&fۻ3n0Tl e*:lŋ=Y\JGD[M ([s%?d /'&7;_4./ TV9vq>IJNiS;}gD܃=So.3o(27EQ;ƣJ&Fd؂}*W^rܑ5{˗k'o{R>_D.A@&U~w䑙k>eg$į^N=KsGnL})fڈKu V;T/|Xl}uY ru #i:IUo;f׊c<>%1#H+ YN)KA0OҌ٥kK"Ʈ@'Բ@hI}ԥ6RA5$N´Sr~o|4CJf˖`Z\=}o49v5*)q:A/sw#7'Fo^vXwŵ\(}_Um C\wA[dY~TxFYU"=*nT6PS[2/-&v X5H9$Ci+}8YT t2˗wȬhcKT _rN%zJo'|8YµX۵+'lG_$(˳ vHFkMB>$\ܩ&OuQsgm7)Yճ|RX>[~ѕ{1#nFP|%>ٵb)eI-ysB&&NщC\gtW1Kܪ_p1X5(miCifle{hṢS*ւ가&.^w[]n=!VTm뮉;o\tjѦvUwRF:ڱ+mE[,7_ FZ[;V0*/!0k#+(MOƝ6#L:9{0@;#qnm3Q4=O-#Ƽټt:.yzfޥǟzCֿZ&˓㫼6kWwZ}XDn~^pׇ$ )RZ_3GQ7̸?_jnTFMoY"#Ҭ_m~qs@|y\壙Yt/M^8d Ή7z`F^թqO0 ۊq-[Ma.[6bvr֬7̙%qv88d"Ӳ-r#!(@>[>e/h1"{[2:%$G5˄{OsVjV1CigtMـFT_{͢c~fDpgB!Ql,nYe9ASLݓpq8_WN6TPšAi6W._|?>U6]xaŴʛ=vxvd}fš|ZeSY~DI\{,0'7*#@ϡ}4驗BҎDBv]"⑤]=SU }aoeٲNۻ8cVjAv!#Kصli-;FGTj䕲{sUqhyR"zC'Tܕq48vi^&HQUR'-vq*p6Jѿ"z; ѿp?đPsϲ9_D oנ#cUk>Fs2-]Aa|LힸU]q꣖$'-&cL۟Isk W粒 WI$6Du[4^_BD~*,GN#www Fc 09ަ8e]:M[jK ="d1ƿEpϞS?稫Y=[#LNpRzu8ꢼV+5./UZJ)kJ9+ˬ/ђH2bUBڨhyt׮ARAV"f|k|쨋rU 9cmz֡;kxϸU-3´9rY v?_SycS{hQ0+&1<sE,Mn"1b|]ۺn<xtacѨwi>&'{y@(ӄ$MHb\&+m:OG:WnϲO8Z{vٲ߾YyP;$&`l$mE%TGSQLXv$ )N秪%Φa{$Xy&–xbt ǝWS.iP\VIaRҺ7] mIemcb4 ,rap8Ac`\sLy9H92>dFMWô{O$31juVen.[SܩK-˟#g?bprshON}͸?_O\af6C>^=r' !jTfOCtuZ dx7!dag}U)Gu{ٲyۊ]G匝8bhtN| &MH==E0<};"z0st~AD^%S=̛XÛQ6U%~X0.#3M1p}5XZA/Iīǽ{d`*Ep)tRq~/ ZKnJ"Nŵk M7~G=PZ_%^x$yMUY!/e1j#0hĬ.uR[hKmG:omp؎& 1V91=@V]16Utä;> c$9/oT6;qPSof^3H;eV u]bKnLLFBwo,qy߬[+T L.(SS̛Uy3.ϩ)n^6WGj&dXf3oF63{L>ڪ麁bw>,|Éù hɿ|~ 'RB#q–<+c|@ewCeBCfKMPuD\®EcNM{v\[q'xpN$zTvwuq*b% (Im2TiE>Ĝ TTEB 5>M ~oԄ\!k8mBsĬ^(uQmդJxd Qˎ(qbkDpbU^0yfacWl 0Q+d0PbV{8}{Jq"|0x\ϹoS/F%8Z'8!39Z>~>T6q$R< S/[4 Ii)a,\Hp Z8`v 0XNM @Q-AGl*ڳ,4f5,$!;tD\꣖KjD^C%jk&g__şg b.U2cl*cqThҒ=ϐ̅{^}x&lY ]JmJٶcxGokPWl / Dbj9 :t1`{zٲ9#Zo[vG}%>caBՕ^9'0i_c {o%̴T/ޞ"v0svW_y՛E%3' \}[52"ECMo.LmM8:fz&$9L x9}vimMXPb@y"ן8pLߥhtUUUm)n X)) ԉȟhFٔdž"ne F|'ڧƒ]2טV52B,?=I4渥9[ms1~Äaxcj2?; S:)pYEqVb:GUT}] X1e$|tLQqβ(``٤CkJګPVDKpRsVOi奪 3Zܪ/d/p.Y4o, Q.ZvWɈ Íe&ǭWN*-ZHUGk_y-FZpʻSmO0[ZolonI=y}i2$K qmcҎYi'gűF{쨏pL>ܥvSD䡺fg@9"\\1G@zV螒#Y9}Vg|b$n\;M|zof^jgyӺmĮ6Qivҟ E6‹/ K~zuԍk>7qyeʭr Ѷ˳C~ǜk\=.j0'3&¤芢Dtn>is`4_85F 6XX|TQbP,<|\,*ct NYJΩbe1pʂm +9) mHO3p6a?hdWj$]\*ڸcdo~V峈 8^ANRjw^Tg "9ȺU oWD. J4wO' GAĈvҔxyn w#3g:-=؆RQ0 >pb A>+Ќ&&e0]jQ`GG_0i.hv=xhƛP+HʼkG_P1-p)Pjh hBE%7z`~QWwgZڳCE>;(1ؓ_5x :8W G|c[D qHv~}m7xD?bl~S1)LCp1hb^ԩ%Q:@ S㪼Qj)˧wQn,G"ߦIo(f=xlpf }8 mG\#s"d2oc ¤Հ(X4ne_5Kw=鴓V-ZjHt#PSc,r [/Ոɑb8gް ܌$jQq0V}skdWV+|U 43tڧjG9MT]hG{Kꠍ)2}r3r~DՈinUy'CK @VpXg39S[/ƭ^_GA ,Z荠'уg}qkdKȕ}+X3W5xC,_Eـ8Wg[sm[bPMoe2Ѡi.NMGJYm(U'/K7DNG( dwz5%/Uhz\Q]rBj}^i<܄{76 8W-p-y 02ejx48ic݁oiXwO |42>DKQݎVQn {MHD={ %';I~56D_*3Uuf("7D6)7H1 >X&-|T]pNkG_bqM?GީwM$]㵧O֘'WF5l@P `-NB!]-;Lo.6IENDB`ruby-prawn-2.1.0.orig/data/images/indexed_color.png0000644000000000000000000006175012665203156020776 0ustar rootrootPNG  IHDR=[WgAMA cHRM s;U:M`(PLTEPT[(((8(88H(P`Ϫx)hUhq/ڸ4K8M*Vl(1(T5Ku鬟mTlQOQj`QRp*+1S]koyoqtxhy󐬯7MNghxVppx-+h(H(8(8(ɩhTqN3N-8i,J (Y8(H(XA 5k sWOs.(H((8j[c/ߋ;XKp:X(88H48Hl988((88((PO1pm1XsTJrmQ{ѵEUkjԬL`ӿ8(nPͯtl2O2FMX\ő(Hq68(qQMpO1o7H(Q/HXˮfHI8i7pPxC`^(M1XƍuHl7xHLo-oPo2/.X(M2xXhhHxXꡐ)8.H(X8X8hHx+H(L3,hXVK(8&8(H8H;tjulRMP 3,VKRKb[o3/qo0)1,O10rpxh8((((x(88h888(oPP(`gIDATxbd```b`/# d1032|nmf` 00|g` 31Wu; #*~Oy OT 0|x fP{/Q?aIy_W- LvL[܅j W19f S{ *?>b(vK0؈jz8 #30]#GAdFFbabf;4ؘ1` @33t12gdwov&xpC4 2rfy@2tʭע ߿r0j1?ߙ3 ? 122301A `0Zob1P_l@J;*!P(#} Ak7322Y@G o~ B1. KLL4dUaCY7@be lVi_PY RQ- =@&0.1ff6qҟq00dxl~1|bw/@1cfv߿dP@OjHSTg`xr(L~1tjog 6Lj {o}vw1ث?$ 009~10镟7 4 2&X:3eN} 4#؝*accDb{{pA{o/0 00@BX2pafH(o?.mL, HJeXFg`X0ųU rUq(vV?耤A핌LB/*a!4F2(v=)E_2l;P/vL{I/v`:A0+ H ,jpx W* 3|W.@1 jH1B<30_P(]L2p;P18߂*֮' Jn0# Z}/3P9(}h  %Phtz/ONH ῥh"xa0COHJ`ʯ b߁I?vIX +/F?,($@0q$\V}y )s2@"0r0j{/,%A VP30BIPqO/~K`к˄1(0 v7.wЀc`;u_W?A;7#Ϸ כ-`5  33 *8%5ПiL?1(bxg6Z߫Y.seTպ'Y|ʿ W ӳ.y B^s23̨ DnP Nz͸/@1 ̅D?,hlɷ ϿIe#cM~++SfہNpW Td:/0xnl@Ë <'(/N\{P;/( .`9~+'߿A MH)3BJ_l<AOU?;ﯷr@V10=2lu:bL/3<}ʏO~+7ȥ2 ؁ ?`§O+&fq!;A&8QL2r p@",&p *\ܽ37 y}TS !U$0Cʰˏ =RRk0@1oN`5@,2aA4?0f ~p@* ?(`޽&1&P /P l9Öw}n+ @L_bV|fnLEpqؐ_^6k-Ìnl7* P+{Pf. @b Щ=z 0|y 0}a&@A:pW1C0P$&jW/ӁRbx/ncRD XNaf@*@:!^O< _2g<?lJnj;:}7 mE0~}Eޟ@n+f ~0cD/O <i" i"2S*(y1a3&`U ,VB*?Y5(#@ֆVv-ڐ _>p%?.  LB*Pnp3/7{V7_/@ScP6 Eb`oTP_?DO E#+* - 5vv@[@&s? HYS\3ȃL@ȩ0?QK(տ3ӭHQ2,.e~)~gec !6u `6*;(qs02pC\ /_WX or X~{_{ ?e7o0 `VVa *a/SpM |_$A ]* < Eے2H{*_30̾7VNb4 ڎfp. ̕yp2BNdn+ȁ]Lo ; 'LUl"LL$dY0/EŏւSyPkS}@lambx HϠh&1333){/7>)7C`@,̐=#hz3d-!Պ 1JML.) =!Tu7$YId`ccKǫ?X//b@?@|Y i |H7+ 6dgs(HXYV7oi/,33U*]̍v 7߿1 96 "O_f.TdAL9S8`(^2~jI2uy0_v`V1Nޯ\\ 8zf.w0wzN YA~wUAe8 T AxvpVdL_X@u3rU%(!IS6.U@)讏 \?H_^H> ri olE<0IgAh翠'rF+!9X@Hu땘\* @:?ذ Aa?) ARdJe} A4T_]? lR%a&PG?@ 1fY4#(×c3A;. w#+,3~sBx!X~`36ͺrW6gP#! @, "pQK^'  !ŸT. Οgfo|+A[#ӻ?L?āiS# 1[< lNlٲt*t"C<ʌ? `3`%v;+P/\D߃6x(+eH޽$ǧ1< 6x~a\Lhl7~ʳ8zdadc X\,?Cށz"Bs r*<œ1 14| $t##P7Y9@ d Iρ'wTfop]AyJ %Ј{o ,<ߙY?ؠgw=A`"2cZSJJxO@xi;(+baUQΟZo9`>* Nlѽ7 o}ff3 L~3lߙ>~:lSC;3k~|/ Prʟ9ٿl(=Ĭt0=D~)6`.n`Xx2ܬ_?`>( #yPO_YչYp zFd,Rʩ,)WbeH)<}ͰN04Ā)whK9+ecx3SPI ߉| ,s?cx0=6g71\Jb:C5`&`b;; B0g6 y~ֻ~/Nxo_eF;;nz&LO` u-"$X?G.o(ـd_L]e/V?~_>G,_a~'5hyߌq0I(e,< Fg\ "*%o0#'@J_^ òd4lIrsc}@Z;z# Wf`gG lH#ó} }xCY;%}㬬> Wj e2޾sx~JzBwVvEP`_ޗ?r0[~|blf@L'ǯ_Yo\nGqEEVN~9[+ÂW BADU3&T!Q#h)WPxO/60OW^ _9^S߳?>2o_?h?2fd!!L_ [u eYPQ+[Q4GAIF`kVX Xa>44 L=|j Wys0͛Д<#01i{B,_ƭE5sDAC+ @"/~l|32-Q⃼(?i1qPȾ~ ,Da8`3]l`0L9 ga" }8@#@> ~TuhEzGـQ] B _t$~}bc֖_:[0n?.1cFhU'_Xk_x1bF+b`v>FC@KA|T嶺.!'ë]=7/s\0XH0<hhЏ51/8߾}'X}'lq2*6&Ƌ֢+2@L?3t]8 P`x)oj2X2AMF5H-aga >h020`M1fP?{11||9:@w12jٗK ۷ ~ |^;>z~OQW|?#ϸy3Ku?ӳ@MpE15V (++'݂F5~~v |agf PAg5\ w`sA#F`yY{AawR&- m5H#$oh=b}[&lih`Y2?|J#oE_g`w?_7];#YC+0r|. s3޾7<zAUEuDL$y@W89&!-Ȉ.h(#όD! s^4fr@UߧO_>SUH/?<_㔘AՒ_/12_g}+18_aY<:T|a Wb,H|@ L$(T. X@#~7[CAg(rx"?o43\*0<{O<Co`9`; 4H,@{윌;~  pzLz_dE_bx1|Z_1s#0|U`u(1peN0W rh:Ĺ-(`۟ 4A`OL_w*X_ˌ 0foLB~}ٯ܌ Lw0]cjdp o0VA::4ཕ0@3|? ^{$' 01=cd roP3@~g4Y 0W3gx l.}'`7SAQDA3 p3(0?xڀ7h.'h-h'H? ؒb}F1 ̿1|fdc T^+0$ FQd&h\*<#UPZ`zTX؞=1 e0c!j'@1}v&F^9`s#7s2Kɰ&WE u([%P4 <~AEh/ ?gK_}D?MAkp0m"7_5@TB1BM: "8illˊ`x'?L|wH" r ԊwNnVވKK3`d3 @0=rf@Q@FmyFh llĀ#Y` A@eN /e (t0Vb kFU&.6{``sH2?$铨7`՝w yȨNM`uAG eb ee{%t l4נ\\7@1f矿?r.UFU&иkJ.<БrpWIzK\ /сajc^zJL0(Bf`xr#+ wC'`1;C%ĈpvfT7o2=`|Q %XM>kWPAtynи50 ~b^p& аK^a<l_|KTh[3ev>J}J'403p x ?~e 4 @x_gh 0h!qFwp0H<bd &Rށ`M{RweC9ۿٸN\0u ࿼6(}?a'A&$.8¸&efД<6*$wLw_$\UYLЪЯ?0?&UEV`C4 ,'@T ;;5؁>mޒ}$`{wSHnM/ߒl@C=*/^='$@1Wcy_"osHO{2A oxa ?󏟮=/'??9# ^U POv`QR tl/2m~r]- \A9駻kjB-cև/ Z?K}.1 tيq{<oJ?ads?1bz_bB0hC?`pSz V&,, ,?Z>+)2O"&;Cv u(>@ {ٵiϟ Eӧ@aH!tP'?hY[=.?7r_M>zPPX?|(t%t>Ε?_OO~fP1w~1nPA[($, lu!2`a lx5!J@ HgPQw?y%,r /Xd`ag _?Vm@%`_TL/NY cSl`ɽM80<P޿ 2f{  e`4F"Э r(dyyN`j1|,dV-yZ=-o6?AiJ@A #`d`!h5(d cm~ ^AL~z3o. Ux71+6P _@ 00&J-8Umr &;ߥ#Hb`xM~P\N Ȓv=Sy9Im 27?"f_~eVĹ!"eu ĄCည j_4qs'8 R= O(_Ƀ*'O%9?}z 0N>b!T +~}ȟxgֿW'`@UFf,\\ u8#Q=* ~+PD>}3@ͮ bn3*CJ ߸( ,]y@KYG9Z<+. ,44 EP@,p - = wuH;Ai02?~zʤgBaϿa@L 3 NF_C ŋoH}f،Ph.#;'0UaL?d覻N}+1dC/5?uK;Z߃g'ߋAa׵oB]iA_Ͱ 0v M2%̠pZ ky`SsO2;C$^3˿|N0>& w wPK;@1+--pW_vЯ_ 'eoA20Zl.>;$T@5dЗ03J(H*& }S_?;h'Ea( ß?X0BfƟTjFf.mVT:b{ .c99!Qu.8ue=bzW%ŠgQO ߾~@LL>Xb{M_?|A :.4E Tf~Y߀ ɽ, '01&FנMz83~?䈉ڬ2@+~|lqqǏ? >}bf/*IEx8Fx {cW=gxS jB6΢Ҁ OHs208 v<(va v__;h6@1]6XgDgRf`x )@+81(fxB!(n+*1ª(G3.8k eEԭ*5&L ,?5*}4w@L3Tav~?ԋ 3j-] LŹOksc_?Sc*a#~w@0NVaRsL%ծa`]vy@7?_5Y{53&Hy)C NUzQuA0\W\{huAQ)(3 @vP22=uOR kR`>e ?Xp22}[EAwQt!s?d x$*}%`U2a#`[ "5A (+3?5g^]pХH}~ dG`yU@=>q#''?_¥ PA b[`S6Pz "4DnO1V O@ԁ5ʜN+y'ֻ.lCzooW`|ab @>?a5Z\C2jx-5Dw޾*/HL^A#~~~`hZZOA08Urȁ>#0XPg0XK~.+#@1[2Щ~<`X4`,۱-Xze@#4Cm* X[2{j 1XTl*S0=d`,sd0};>(@1b! ka>0rԸ07H5rܾdx( # l0@<mK,?y"- v{ lŨ,j-bo9@9~ 523/%3 W%hb ST$05iA6i`w>"d4;;u[䀮ȃjk_C:jg`SdW>22| 8X?1Ic`9Vef{r_Xs; 6ϐ:cj;wﰱ02H.C?AvxF`Y)'\E1>>ko7 [/,)X? 1 ܒ%+9%O=pv?P; L ^n4`~M{xcd w'{`=e'#QWnl;8ګMϟ?`Gt_PI!70m_fP(pZw~|iwWKP17o+* .LLYtm&ƯbAV9'@`elS>X JW>|}"$h7@|c*d!i`AvP]:oV woɃ%F ?Crb|X3q X`}Z$&SƢ?e-xݙT1Vb!yLiꆬ|←dwYgl~s@=tAϯ?L Z ~&6f_^c @,<9ayl~oQ ~ŏ ?~3*>eFЖfph2}M^wT8Y!׬l0qS 7zg&{,P̿9Z׶̓A sbL}n;vӻ7Ufg wKC6AE׿-R$sz( #U~ K%tHcջl>H _u 2n g<`hK0 ?&&xlvdx{T6x eal` P 2 Xle`bмXU陨0'Jd}~*l ɎO/ưݍp Jit|r}YP}A;@),Zbz+.{B{ >0]9c[P;bd0G@\$== ؍:,_@*Ygh=􏇏 <+ͯ3oo̜_@jn1z@l JyELNq 1|} =l;z|SV-h[*׀Nɳں c7ƛ ~:/Uw(V+@% ̡ e`D 'Trp=c~Ph*}w?Pp1?@#~4(*A&]bc`(}^f3hT2 @,2gaǟ,F'*Sgf#?]^3|oZe$1z3f(#(P/пbd t8|`pdyWo.Pg3/+FЙN#/1a/`k?o,G`!>;ر2?R bUǠY W)7N|U!, 8Y^3s^X_pkyr >|`vU]o4<|/dưݧ oeee%OAZ`Iu/КUĜ=pS/ﻀlӗ/,~02s`WH0F0O}dн݃/ _}9tSPP6v?{lGc^f097 _\|| odN|R_lhpX/ʰ7`}{0`ׂϦ S" ̆oSsgf񏍍;?oDAC0~e"𑋁3\ h?+`wW_c*: Xxo0a{<]>Y> ac߳sO~l>2MU:H#'w37t*=>{(|@1Ӏ$AMzAXJ^/#EA 8sA|'{@Nd8:$&o0HaX1\ek_1UWUj?~.5':@%f@f2__,߿f/ぉNG>v.Ҳ&v.{P-cc !mZ;U> |" `637:?6NNp h#Gd g߶)q ̠& / `Ov{, |tIA.P~;aU  B=|Bn,wl`TG@110c08! ٰ`0NJ:ht __K^ mg*_Lo%U,/| T~eJff;|0`p2h]]`}#; { )X*0W0V?0nal 2Jy!+~0psa/+wP7@A@p˰|(Ϲ^?̿8Aӗ O bWd&;5nZ}/okN k\׼*A bGG&Pe(|4]@,#@ X~~;Zp-=sm;_#_&O9ظ hp;g_ߢ|o0М4{|zw?Ae 33)br?SM AvYx\ȮzrRWdvGD_~_Z Zwe01#{_.*@1[MqOfȶct/a> \Xkݺ)oH:2h w>`{/p6[ ,_y?~d倬YS(7_bbe`iۤ?>KCSbv<*AFοWzmVOOv)&2``q#(3/~/Ql$9+7F83lm%.!NV < lX3>b vv.3淥 Mׇ?ƿr~MJ_v$ôݯ9X8_VȄ t`2d20d-tׯ@,y|Ē1#2O21{ xY#0s[ @ 8K/ 72;{f!]>{`ʞ~u_5aO`SkQF/x\ߠ *E: #W@Lx߼նZ 烖04g+oY t1ct`!q&Pz &k9[To11aaXý@%׏_Xf\q2@L " irw3SO\\@ _|JAeG9 @l?P~禍We:y/LGO?xxN]Y+ӯ?1Jb @16S^`f^'?(Q,8/kzmV . l$`E :AAHX]UO#9p>`Oq o t; ?B-tv?nV58 ԑ'; &=,v;h _lHY~O/6<S`A^oRrzy/C͌La}~srZ N  y]&PFexLXPWKe :[ސ)b8x!z-\9U 00ZeRez|f&Ɵ?ldF U ן_- rF6V_v|ze譫KWP.~ a mv6.-2P.|P3!3`V<ח+( o_?:+ 0EO~"{>3p`~#P2xԅ&Z`diWbPSc`NTF7 k}eNT=bbbOA{;3Ç_ 3_"<`zs_ӑa4eԺ9G`[`Uo4+(VOO5DS͐|VLL~N^ʷ ogyy-\q}d '1/пAS " :dwX?:g0d0|&%95[` qO "`/w9t(HŃ+-uC z6 3h{_ҾjoU@C1@Dr%}:‰'7_X3l>|?8ÒpXWn+׀yft%kkCΌSW|aQX1Q{@L_be t)U?m\OE^ ^ 0|`fuȅ7x,TY@ 3RacH/z!#WP;@i*}K;t ^Y2T /^B}c)X1]`7?2= B r9B,@*)Hz &5A@ -4z/C1@=3eb JVDžy'߯ />~a@>6R=fE{{-`T)@J`@,~ Tpa jad`m "o\wdbs x:_ނ5)MG}~-bqaۚ@70l+ ,B@lqb76`a fy)2g.>34PNAAuܬw>$O,Э %*tS?&bڠdY@_.r?59|ɃV?ul},@-z|uރfx - MY Y;쟁 ] ` T>pE;/ B2UyPwEO};< j=ځ9[ ?98~ tC9|~eb V+aHTP`8.]`0 0FDE27˞[6A /9~6{1}h5s67ف _@LPWawy@+ t$] vׇ /AKAypQ_ .Pӌ8>| r?fQH ?; w.+56jGbY'pqθdGګݲD.USؼ.r^+$8WlЬC ?XؘK p~;>A*#aa[k&G!C @cbcAc ?3|r⏋+(;~mS݌D(׵[i,Ə||3>0w1|Ŵ \ly@3 ؙ`0a Y;բi 93?>3=A28=fb߿V9(N&`[ptv 8$VIPA ZbdfC?X!]??a keK_ˣ K3![6/'H_$AM.@C K%Tt".cP4u~@,h2 3$~H<^`Ǎ3^+t 72f^P Ga&_x #;Q*tA[y](" +5ɹ[m n-p,WW`dd!qf\k3j [ȵ@J@㸁L_~9{<.Сp$.興F@;M ۡssN1Q']RLBv[|NlOL/ '&[W<,N1l$<@)9V2>,@^۰aab/A7h $#ۏ~cM?7??&Bdm @ 6E͊ 9}V`, Z J G)@P@X^(*nT+ =l @v!`pX.)&x'+#@RGp) /W`GX07V[@X@ :ZGp􃙁?1m9 ?`5Dno-|'}̠/'k (M?mH/ k4ykl~20\~f`X|ؙ32tnce&8bb9, oh/<*؍!830[\͐MoAojӉ&,3@Z;@1<ײW;ˠ~AփJF@?.E#p-[@ԂxKÁu@  'IENDB`ruby-prawn-2.1.0.orig/data/images/indexed_transparency_alpha.dat0000644000000000000000000000037512665203156023516 0ustar rootrootx @s40 MGA{iDӈM#F4h4iDӈM#F4h4iDӈM#F4h49F4h4iDӈM#F4h4iDӈM#F4h4iDӈM#߈F4h4iDӈM#F4h4iDӈM#F4h4iDӈM#kD#F4h4iDӈM#F4h4iDӈM#F4h4iDӈ Xpruby-prawn-2.1.0.orig/data/images/license.md0000644000000000000000000000060612665203156017407 0ustar rootrootAll images distributed with Prawn need to be freely distributable under a license that is compatible with our own (see LICENSE and COPYING files). It is our understanding that all files in this folder are compatible with our licensing, but if you notice any problems, please file an issue in our tracker on Github and we will promptly address it: https://github.com/prawnpdf/prawn/issues ruby-prawn-2.1.0.orig/data/images/blend_modes_top_layer.jpg0000644000000000000000000034206712665203156022510 0ustar rootrootJFIFddDuckyPAdobed         !1AQ"aq2B#Rb3$VrCu7 S4%sU&cD56'Tdte(!1AQaq"2BR#r3b$CScs4D% ?6&fP>m%3wQǮk4^&$ЏuԊW>x@d7P?ǥ5!OYQ|%5}G>PFfb Z)+̎~2CXܲWO)5LEIbJXK~k=Le_!>JT?#eM.7h.{C?wyu)Ԫձ28`Ѱ'Q5bY\rh#f_^Nz(WRB]YT@i!9taKvO KW;z׮pɩ3 %KE致#%֣ܛk-ȟкoӹOMNK6 K15Ol3Lƅ7w^|u"VB*At[k-F U'cЅZ?j |~wf Q׮ԑ뿬/,H=,d~FM\ŨT&UM7Z1D@H$P;뾣P ALHkNO rUW3fԎ5KB7l6mu־qPG%qv%juԟVToes2$NߤvWbq\+ s!c)ȑI+S>C}0ש"3gGlh!HԆ_#%S<'ށ\1Yy/V`^9fI{G@'[mnHw*{Yp|9<4ॹɍj m$M '1phӡ!p:@UۤF{(GpNyrO#ᘎf6ॱ~G4{.\tjK/ > WI7s¿JqI/ ЮQAP.Bp$r&?P,̻j+7i%x8ҝbGgv+4ܔ;TݴEU^U3(u(XSJ '̘,*AfCj7FTEPSGf("Joڭ]$8BH0iD)5X!!I]:|%^=Z&@@@F$M*6ִ`dL2SV1e Z- [EzZA=6]kJ`+c9B. zᖩ( hOQIkHJ {{]T)(OŖtJYٹOK[!;2T=KaY g×b5~7SPsXo 1A};NDJۍBR~y랝d,7RT7NF1Oycq'Fws0 î\SPo.B|"҈ }Hcw/]>zhHJ :r5W%x.,[Z}{ F45ڋ3W4.fNRS ,m}(U%6AG$;bvh0dwwOl20 L5 dƵ2x+x~NEfMI`7|ti2Pfq.P\MW/5vY8VjٻP ?M )$nwGۿ W uhIE5Ohh2[X2r>Z+VF$1~m5 @ ͱu s\ 41i\J|raR#Z'ɇKP0FYInFfH=Ni#ŕkAuOG>*~mg;,<^,LV`: }tghh%\Ǧn1nCY  |qsKD6F ׫\=+dG0۹crLo?ea+)1,*&HB#βΝOG܏F gq(}Ñx:oX3su{u*ɾy'TYA678ڝX:3(uj6 ܹ?eWygw$=NI6*>ZacQG9kLgOo+mcFwe?U1!Z)𼿁 uvSr$7'wHx$~Rۍwi)Vf위iNq(2HȀm +DgXb*wNoM\h4]$U|{ﮮSg(mmXYծFǔ6k@l~=[^ߥU-ڍt'۹E=5*6\NA2LUs,|a#,qه 6"mVa.48M4~qԴ5Y= Oq$fG$^1aq-V[qrKH :7~*%Ib"m0SFѝS"x|㡵\PlF)y LV0zmAkRW+o,=guGBMEu򸊂QKNO◚+-qv= 0 ;n@id4(˧4C^IbW_;Xq~M{ˆq\ i+.GmqYG.5t;d0Hudf 9& 0;Yzzh(Uq/>oA&fzaٸYh7j*̾^玹2冽X5ge /|n^ݷ_dm|xy 퓘j䛜6X1Ή`j3Kc$gp8ipȪUx~Ypv# cb#XD*]2Yn9ӨYGܠۯ@kGn;SGڌJlnigE"dF Nu P}ѷh%{N\zw~X8ʽևv}_Ҙ6dr_zt4HZP%EVbvH߲;/ſ Kqvt Ry`supObOakg+1,]Dnz:K|/OBX7IM闗qdXzU G{Ds]K{/N)% m%$W2.քqBOlecX2)_,S1@:QRnkqpKk7WM\cW9B/w5Km䁥:%?15iIQVRCl7g]PwvR1ǐ$$ڱW [n=隴 e?f ٱ"k8&A6\s&U~8۽PjF{v ] 7h%WqB5pKG^8P0R&[/xwgrHm[^XNzߧCtjC4C5`kˇWo Pq FuȽ(S =Ε2aXLJߧmDmy3_ykiı̌(÷hWb۸aVRۆ~\zUL."}`N0ǂ)v )m3Kr'1n8i;YmJ]L6ݠq fbтm ҄ ^68&f9<_+iU]9JFʤmtT]zq|9'y]˓Z6k𪴍F/tm;V 7u5 8Gq8xouY#Zτˏ>UVnlVGHNzj~KB9 㮗DKy/sih=*AK!5y fe\*ǣV~T<>EَD=Ϸ yfGi%xm'NEBI,/q}[M>O5 +61JUNWf,%O%y'$_d] FZ\M13 W{N;3ayR8 e?8CG],W#Tݎ8,ȵ$HBۆB*2{? 2)t_B QҾ>P3Jx;,T}  c=%D-w TbRua q\ixvF.rKq㻘zFr4H1ȤUsS`VB$5U+)Y퇆7A՞TK'=+RsXcV!CFTVB7'_mq#I]ZmNJؿt:HuaԀ4FZ+}J|5;%c^AXʺ˸e,9c/>Qt*|#Ug58v-~7q[^)dTzq,|uKKjB`Q\=I,Ӧ#K1Jt.>b,/&K$,mXGPFV@C!}q­%+Y8~Cmm"J^2$T4f#vNEvKi 4tZKA^u<BOkEOy7씕H nYQNNEQ/8䯁s^pհM!kj˴RI߸amNfuUV2OQZB+u=o)Px?<37ծP%&*^~=NS5Im4X }3FuwvbOFB_t ּKHzH!mxjq[@C$noOwi>WkTsCXr~3aTq@++6iWǀ ZU\kh\TFػ%Տh B9/]9IS6GreBW@Ѐi'؏}Q~KGSikcf4tFB6m:ZQ$ԡ qS.Ws i\kʠ[(9qƃi6Jƶ1uFRmcFFu6{!o]m8TXH PMHFԍNK( (1J^J)S9 ^2cnC(Hc]v(ioi!u/\o]CII$RT/q7v*,=9|mQvq9mu!K?o9qvZf\Cw/id(`s%aWIJ3F91R;vӵvm#]|eƾ|iC*K REٔ~ =tސE@lHP )OEP2dB~ 4ebLU[BYB}JHA^peLuAn<?1O{ U&,sVO`'l` _/wHihnim 4QJֿRX fUWY_3yFډWsnOCp5\Yֆ }wrkcU>*NKWydsVn{z2J?PsU<@QdBbwBzi#V<_nD0W'-IkB).GmpzƶT *]kB햂X$ؾVj/$RH6]vĩmЍU>c8Ļ-6OLn"7QDex>#VO!1[)}`ZܶfF 'hb2-lKj~ԧM0NXSKmGTiIˏ#B|~ʸPo=nX]! . zpVqzD[+$ugMKVmA-Y7c%Bo' ߋ 6u~ZDR+e*;?])Tmw0".+iZA!fJYw/] Ge`=̿v?@c$ωã\"ؚygf0"R,R5i)Md UyʘY#2 EJSmBץ=wFB5G qīCYV+OӐq?r9[A5[3cAēz\]2:epOE9BT^Iȳ\*z?K5]؏[Tj2*??"+Պ~/>;2#%t|~'L.Kx(FKաK*  ZEH&4䜘x_[r,E%a R::vdp1vY"Gx},g. Ƥw6w "pFݾ=;^0݉E-KțB@ C2љk<Dz v;zҘ)RxUW5x%rr90ԮX;4r?U ~i \MB[iVF۟z{#U%|uY>t{:2,$y}rvH$ Z2v$sc`餑]_K8ad$MőKqHK"aHYAMi7!*i+tTGxj5AqwQT"*w@Gm7#U`sd` {HW\™bNK+߲GwM&޼IW8o&d+qڮC-J* 'G(f1GǮL8&vK 5A8Гy_!p'8{a_0@ѻī}|7|^NhMB;K#r$ 3p)NrrF4!V֪oW0$8ÏYMP.$Hj)$:< z ״1j=# 6`sz}6QLg*'Fߔs:7HWWӌm8)l=rE=U^҈GQ\jVhdg'g+g/=421‚n?Y[Q$rQrkUrxF^Mƽe3RB)zjdpPb,,d0C VThk 9Ft1)vep/<|{Y=dԂF5ּS76kcT dmZ5x ٨mD?#V`5 o8iV)8W>*^H֥rq{PH b6"9:w붹#CZTbt֥CNO4 =ёDI:A$f55c`b*ֽRVՉ3FXÁcRzEߺ% BCSgt$\#HbO Ia%9t!~jI7]OBGYǵظ?9 XzO=  87)YoA1Y W^JV]I z 8T&9e#rɬbc5hwSƸj?%ɨZٺ/?bķw;y&VeTH7C:B!g=:IL ǶC-"A]i^y$Wq&M,IUdХPc0 F:~tQi.N%hu>2)JO_S:Br\OuʬQ+^ %د?ӦH::6{˪TE-ydoTn怜 cMe>7 `monk9_aH|y Ɯ!>(+׭-~,_V+>҇ '9%'3$ .L]ݩJ`{0zKTdr04If9*Y9HfF]r%+Ů4Sx|EnZ 'NJd &W6ۍSg vP-<>#Fd2x?|WxU;kIñR%&EX#q&Am)kp8F_ls$` a4"Eh_u?~!ysWKG2Nߎ%2AnY v*7.՛e\ BpNݠ;v܏No]2{F7-6߂YZO:p=qژf SRpgICv Tn,ʼnr31hPP4dV Gh e5!MΤ*vܺtשLmxOξQU؉YcnV;w-촌|vFѯ8Y)ĕokI Xan7V ԝ%]J v%OϠuJ&a!q{AFjrj`H u鶒J@ OQĨ:Lj%*=N|IM]Cn=uڨ[ &X H0۝f-<_(,w'a:b1)Kɴ<{);@y2uԈLj&^|%Wߵx@ ?]Z3%Quu=%J8 Y"#f,K$t c$94k-i)fN5vim#[V'#~J߾^'sI0&>c $!IziK?sHkƜ ̰P_ʷ1Z-$-y#mvXUz5̞B[㿽?%K <_=feUwr:R f,;nvܑdэi֪cs^"~rg˷=-rIA b^%wR~j,Y|׃U44,2]GmI- b}A`da>@z[IXy1جy!Jv0*dv=?FF(/TZ WKj1KIH:w:T;2Հif%]6)ۮ @.>m5E*LtZV_: Ռ?VJ߇kUQqNVr[_]4wLG<"lƨ\m#mǠ{7;涻%*dӔwoRh$^!{gqnCpMp2wevVRDJ=s tT7gҨ?JYn.MxrHnSbˌ6.4O(d]6,3vƫ#zn\ls rmh2ATFk;+sp{4vD;{_:DӥS,Y:d^6 j/_=riY<]9 ;ؼRlJ hOqnm=K#V{5tŽftQTYm>.)1qْ*,O'r:UDK#]{4g݄#!WpO쑾 k'jG4o;T')PjRJs@qrD~eSЖiC r|Vw=D s#Iǥwܣ<{׳2g %m֮e,5!=9mۍ@5v}omױ^b5;s1ӭ4x6rZ9,S~ث`3"ޞ5LS4 c=mm9MkLkЪ'=IGsbՑ Yvl|5kxuF+;e bwkljB5u{yU=y^.6'%ɤ&9`23ҡ1z׊b&J·fG;~΁^d DVɊ$8hl\SيQVh@+LK;%?O=!F/c ޫN;+wS]ڱĺ."'!^y7&x'$F2 l2:~\X[C5"xC?x3CDzU%Ă! kFn%;$N`NO|`L墲f4#t?لN:jLqQ+l+wwƣ4kcuH#㮮n?@\^x^X7U3)ÐPo1Lg< GYUr#+7y`# 4k C𽘉%uf*ۺ#LnjaRyJ[;֖#0h=o4lFtՃlUl}xTW)`,SnO^yH P/kkaQf\2[*br0yhԲ>&n1U8PT`RE.QOؖ3XzWA*N ,ǐ%v5kDlqp=z$%f>HbB6E$Xwر!仒FFyC%`+vsP"^6V۲EH`6Kc )v틿&W4rvG7ζ]ȸv7ٶkoҸ(fOڒI0 Uܝ6IƜ!i!pM^xwaw`x!Wb2᣽;j Ι*ٰ@,;Ru\wHn|[skG+C\kroK'K3+ *$bKoqM3ҜPf[ [Þ 5L#Ih\fQǣl~:yTYFqÊlq@ab0W\n˷ïuM2\>{ q2ҝI~W?Ѥ84FJ]cȯ#D~lٻjo&*rƚh, q~ah<Ŭ}CY;F `8D#7R˄&1nFɖUCy* OMr3P xѾԕx7`dMbĝbsNtEآػTi-c ܮ~TU ~)QIXC$PW(E_3બ L~wT+F܊,~# +D~?épPpa] S^Ёo3u]J] $K|ǬA;Bev۩FħwhPϾ?cӯ$O_+*VC*`G5. @qF XOsz x"pCqWPI *gPwLz-Sܵ\&b82S0& /8=7LۓZi`Z&xwKnB]uAJ=s1+ߝR3^Bǩfm\KHݐNߊ576B2v$F~1? oZ^@y~q>=?5!{3b1N ܻ =vjM<vؑVopwo'`~3Pa=tɠ3Z6'g"bY䶝ۂ6=L:_y{܃r:ݴocz)6$v&GN~@"(|y_,yA0#&r1; ݫQ$'L6V}n039,.^LC Jm;(ӒׂyKx~?q|hZ z+̎ ӧ J|kAVbʴ?tygubR"J4DEBjGf"KW*Cnv~] W*)󔱘M,dfbKąO$ANjCFźVhdhc]'m4օt2q8p)yqgIX3OlOBߟGg'68f:JvSo~ѩC%@KT;?=piG(1BY~C^TGV}+ӝE~ZȪ[ؙ4ء4N۩rVVZop18|xI.C+,x;[~m؀@f=l(: +Pc;Zh1X未 1JGTݵ 0?WRbgE5U,X(*ã( J5G V^a[|\L?5Te*U^zKVy) -_`}co:*G ,@]P~(k\W\.oo#W~?^!Bɬ«f'-{eּ뤻8bpeǡ58g5QZZ@6̢2aO̿m6SZ4orsv lrmcO%y)jnrե=,U#|FU(ܩ`܃:ڈ S5ʮi+xқ2U{ |ukC8PV:|z"^2/q {k(#e2O3R?6CCى!uJ&O2X[8++&B|R3t Qi $"і}EN3Ay$:ֽTn Dvxlw5 :~U[`hGHD5ˤw u:Ԫ[_NI0N]iIۿڥ?f$۔>e1ѩ@{]I4\mӂ^u-9~4~u۟q~"?"WL5pwoZ){Pߥi?\^&0^'GIrŐVOn9}Λ4r)~Μ??lmZЭ5 V_.2\ 2RښK[0e=ۍ_PUA '5)4=>kq%- m uaZ 7\ H(I"tn}4! o |y+$ԋ$ʤ3 ^E'b9'*oq [y.Yڵ`}^ĦyT내G]Hs«VB#*f>ͿN+:$:F) 7bzȱeZfY;<.v=-0CquC\Rگۜg[97bG0vIP)TN7 9$T:/r<\Kd!Cf\6a%X߲F$mL~SߩRԍfc=Aֱש\u=vu_}?~&V*zD2n4ƦCh&ŷp9r'Mr?5lr &;,J>"qX~ d!Ѻ J+ZF8d@硩ǚ0ySc@˧H _FNr1a,SDUsыd쵢^-'.X/G?XwwcF:vo;~Uc;!5+ ]V4Ǿӻp:YiTep8 }aa0]D.х1 $z|4k%4I/WsY'oy,jS_QZ\!: w$զo <_`0{Բ-f9fW e#w Ri Bڴ9ox3pY֭iy ;_#TPܨV m7ڏ۲dG#3^XA"FȄG;ziGq߂5~P|ˬc%[!DEqCܬPp>\ک3]Hc-ppJ%O3_"e~AvRkX';?tCxVٲd oʋT|;1rt%j)Y^׍:Nڰd Bs Q5=8 ?7|^SM!x_hNI5R|FKӓdwOs9FP`cY :\pJ5gU0 |&ȍ6>$-qS!a^{(e!P+׏1TUl7n4 }K9tjL{X%5TKTu|CJ`{:z~j50 uF^òj>_CUȴP%e|;,Rs;<.$Enx^T5F8^>i#!/-}}y#$o;iMhW;g~[\U0V :.aa*1KvPFkq_9ҚYۖ4pI }y׍w7D5 Z] ڂ~Ulmad:;oROB",,8^6$WS怫,pXlRNkXxǷ4cf8(D>;)w=ƔXGk\.Y)3pCͲd+H-F7"wmKErIWѕ_7Gm9IQ;v.05d b|iܜ6?F6#y8+pHX-a&_ $m"%R4~fFzpKՊcqkX^PAv;|F[4&xUR$rVrGbX`d+컝:V 'x/$q&*utꤑ,1Qm:*48ϧ*xB~[wJi71 8ULM)>#6OY8pUNcv_NaOjv#NGWS&sVMN/ FoOb7u'2bje~JEƾ΍Rzu'×%{{2lk4eMJYq4^RsJSUс>oBPpL?jc{EVb$Oj\,: +*p3[5^ڣgXX݃L쪟IBC z]q[o}:-?ڷw Hjq%qxh ڇ3til18]Xwx'#pk bBq_ٖ6Xu 5fbJ8(B>^u?%-ddP YPu$}'W.*$ U0PS3f[9N쫎Gw|Ofmϥ75e#x;~%x_^9]K ]O tx3kb]HpJD?֚!UeK0{9coSeY ZZ3ZObgNN0P J$o[qzȴ8/9eV^#rQ7ߊrG&\</ 7I@BU!gs]eTQS!A[q#nTo1^+A@tVi>aE'6'9Np6@]j~yn>Ϝ$J(/ezGN1zw;7iv uj?g~@-GLې!ݥ%#f~}40e N._41k9沶qNUr3#{I:x53 A<]jar\nRQ t:ۃC#c9£4OVfDXR[3WOmw/ϒQZԮvlIU`Q!NzCcԴ5{VT; 6z +f8g$o0| NBgĀn7ns)}X2e}x]<18*6rҘ`!O^A؍@I5-\lnn*ђcT<(p <)$4'5\F>ؙr]LZ eѹ…杊}C5%,%q!2Ewڑu?kI©rH΄mnrY\~.K3GNޛTn;h䷜Ƽ/K'ՑVR6Y s F~Ddu AM>'9,_%>_b YWir2we뷯OM4dk@kHR\%7B⍉ b/tne n59bjkxqBzD!k&]bۮ|NIH]$kɻI&vq7 <+̑b%?xe|)*{T7.bhD'$Dس,?V-Qn Z3]!Qtb\rw+dkWH([Lc{ugSQDi%#攟lsn^L̲wB$jem1Eq+I+Z06Bq8}Uzh4̍VI@V7GAhⲖ=W>>psCG+0r|ll8(T=DSmêU1Nٲ'qS<xcZ&6?į/VnvK5% #oè=,ųu 4yԓdD^ݻ#xȨ?iw)v:zOҡkrt[@uv^WU1[pVsegG% љld)-dznD ?{wؤ" zR>է-CapY4_sv!Oa-=l5 9~nGT[HܘDD\:v1??@O:i,= C $ඞVPcw!dZs,&r$(l֬nRٞ-w zd\mL'D+ x<{}Ż#TO3ଃm@x洗 nM12ɚ<C1vVia~4e}Dm,:icpv|EŽyb $Nr\3+75HĥX$QS,nIJ >i<!I_cOm۸mu.< VV|}8Zzqjq/=~m#u!p]`%&sB4S5>d" yi`w([fӷa^뎕N*t5d<M'9=Acd*,o}Ӯܦ1ͩ5j1#-f$gF(nG/)ˬ}؉m}EvY#woZmۧ&vd7SB)?1_s>5@v%_g22yEI4n ~wָeU 8' >A$!cn]f'CtP/3xxlJ]z~vIq,d{2e]'}Rcs O4 yզS 2XX^ V²v/҄wèetOvᎨ9ړ{%O==?FRBP|/q>w9dгI^P7[0=C:i #4-péq>0[)B|aKGdeٍyg`6Rb{#xTכpf,5o҂mm tܞPu |؎xΑ\tde_' y> 2>:Kt_􎄲_u+~$U-)*\2TIdޞӫA&bG(;|>@J4@jPazN$?.G َ[O/X@sd=O]/߸jo=EtJ3;Yf!h\yo) sc&׭FJѴƬ0ظ[ڞ 6/Olł+UurRCjёտzOh8QF`xԫLMRղnf۲#boЎ49>=0`{n(z&`>- O⺋8hfۦ?7)X!K=y=:ziWFD-aōYpe,OH̜UG^U!HNJYR$2$hN*%0$- GB Tqk1(O׻})J&\ƐqJm^%cȋc]>{:i*:?nHث=n_Mh5 Q/[_dNB yO->kݜ687-{kt/F-"j4JIJqȶ /4G^C$ޱl~_=uNڐpLZzW %Gq;znzzj0<rxӟe{46ed Gϧ 72,~;)f VvCcTb wApLD4qT-f_~ot(̪ %/:׽-YDPW,,S!oeY=p ~ji̢Vj(Dfpya/ӨcZ)?/?vJ}ϱzAVz?P@̱#t.5~A##Ƙp9 [=V삼l ю}Iҷ(#:Iw`buZjPBG*r+/yy\m)`Y~ݘ)n7D khAO.Ї8T7Iu ڐE-V0toXDӕW4A}UC+)ng}&A@`V|VI+njF=v_t(RsXq" H u PtB@~8ṟ._,X{"{BEb}ڋ폩~#Pn! naWvj5^D$dG]!Uevq˶ɜڋ9yk6+Qxm߆\y.7:;>ڹ r^Uڽbu%oHGǿbGRyq*SLq͏hj9Na B:u\ S>-ȮOfA,Փy%z(`)'k{bUS5 j J7x`;,r(uQs.ų 1m-X,#(" )#},=4n9G}wE{@qY,Bby#=c[E&,VcfUe?Ddpc_cn6a4 G5;k"ز@[hO-'/V &v@Šq[^;s%\&k]qenDB]gv" LW~{jٷX9@-.bHW9vP:ONC`&Oo]8+Yt趴~0S?<9 ܾW;m{N,wZovLКcՊK7)lKFlX#^8)q M Cc1%@ܧt\ppQxͥWQOS%q\@$0#|B֜\)T^]'U xoxǕйS%f[QcGpuaV\H
  • Zç&Gp+YC+5Y +dSЏFo!0ӧq 4RQi K">+koرwF;~;u|AJl8}6V;^[ɏ^m+7A(#/cۻg4jf?N Mmy ~Ѓ07T+Mr5"a[Ӯ  Ύ\x)nxnKd ,3F߻}:L'hL}7HexS'n,7\9R~AJz Ot8K7&ԯE$HpI4 Ǹ'Ԓ+y)|2=3;;騲֊%>^C]LHQNC%ނ,WV;ş -%.p^rr\t'),zmƸ, pJOWWt*[CKLoq <O|}XrrZ|x:qޯ,;.[}X^ڜx>ѳy ̛~j}O(?O~5B8)4y0gY 3 o~1]Mh2q).ccwD0$lw4BXci^*M&_!&Bw"C,zH`O_] `_(,㼳ɚK&+b֮!E271EQ(ê+ vL{O/ṲpJݩviB$vX|A+}{IiytHe8q4!L4RSs:J][(;.6+AG]EGNǹֶt|Ip R9 #-Vk}M9h`OMjb-MU[ܟ~lomn.r5؂F9x##'>~9\|{@v]_V {=. nsc [/<ISB@'Aݪ󷹸+o<"'ُdlO\9lk\ۆ+ce@:Q]u[V+S/8z+1<6Kɜ"->s\Q[eumj;bkp.WIǩsɼ[1u>OR˔OJ b8Xu汎PUW04J982uj쿾Fvzӡ? a.}AQyC)4+Mvֺ>,_>zØP!s0wN*~GzLUހR9GqvN*TRN`$&ae>S^%'<ל-cչJԴoЙ,P]r,G%E!FJH}4>>Su{̛0C#rEK;OGMݳq%۷v~Id:ZR%d+AX^fLjR(? [R<ۥrv*wWth,Hʥ[>4sGY9L\O+[㜳+3zV#uK2Gdwc۾-8$ Jx.#8hq_IyF$i$rX>3S Be!C2v-cUm-)A, DJ2 ӦjJX~%*Me&ea"`?SZPRi~eOZ>b"$9ÞuVnS&k>6! nVV4@8?8ak)7fAjnJ7~wK^c`i.6: uEH;!4Qŧy9r4f`@>1PBsנ1\]ڵ|ʥ0k]d̥1ebé;ZP`kب?&ory"Sn[FGnx0`B;Avb[U[ܤA%/$lLQ5pa54AF :fۻS\AM^_3Ӟ6**8GQZJj_Ib[|ײ,l6zG$eB8 rO'NX|C+8tvcY Lw'yG2{m5k;?F%|,zQ V'r)Bzqۂߠ3?{~KAa;bC5<^G&.\rqLWd22]m܂IvdC 5laq}gy}3Aju0 7AwqJ(VFsוU7v>mԏצ (xp1ՠ:+oo{quݕ܌#Yc|`k5?qQ\`^HbOuxn$mfNŷx|tȤBٿ(Ko3F=oA`ԫwLJz0yE)lfT<*:CO,"o̷AvJ?IUBvwk|eiC!o a(?!<:w<>* ya^>g'y OOHxQHaƫ\q,C# JmEi\q@~\a*4l'r6t֒Lb|MWcf"N*쯴dz]*v}Øx۶۬F;BsKV/m̞Wr-uD!?#WpCwEuL<4_W{_ˋ'zͺ #huI<cН?2Vѯ]hmpמțS{kxl"k8+5 tmc_t_F1;F}'PҴP?ngS;!ɸ Y_yլD0a!m"Y$%Xу*7oTWwM7㨇TхEA̞+k݊}11йu]G->9CBJQVaQ[vWvݠ>m_Nh4ƕ8q&O{kji. ] Nij*Cecg_nm~y\*ÓG_D{[߶;)&hFV#o鱎Z{($_,r!dGwjMa{wnqKC4]S7 @%,qmd뾣:IM8w=<.YǏ ȩdm#xfC+ۿ{A1>i g^Q<[ ټDB\NSf^ۡKfXj ?hRƂ1H+yBTȈ LV@aFX+`| ɸe9dY.Azte_țI4ըDL4YGqm 9F@cOa|1|e3U պvoUw8dxl]+sGɄ+[-k汑7:KwCݼH]wOR߽ȵ4Vp%sp+{r|/a9Vaydhlůofn_Z9fA!i>>|gss ⹞]j/C0 RF$ w:k4 4&Ȓ97[x 1"n>NUܡ<XW2F&f?VS?ѧC6X#A<SnYҹ[kMԌե_kzo|zca*n㑎==uH՝|'ʺ> f >Ks8 $f4g۬V w7Z0!hhy>r<\k?(ڙ7  ixTN*5yp[n]8yӷȧ _^Ph3*mƐ` q bo"lPIog3hmNi&VvrOfruQ*f!`}O[⩩ 3Sgs9~\E8!iIiI(J ջEQRv))YX5[qH$dnwZIcO5 ?cV3edRD bH BI=A$fOH΂rY"{0~VHv848䲭YrXp p*]b=y_+q\Pثk۩Q=ȑ6uEq{tzAC˚xߝC;գSqudyןOnd1E# uF7$Rd2Jl#0r֬D)Pmv迤jє<5אXX[1I.+v7$b̒r:~ >|+Llv{ 對'gq;)n9a0FI-9 TQ޿R3mF5IGnxf˓d8'<;)zk-rJfPQĨ6!ƚڷ{cn Ji^٣p :sO+CԤOP91iE9Ւ$r!~>~zsQʠXmNf5⭮6Ť]<>|O\t[3@ҳ0V;~Dxl0 -?X-}fܚ̐uu︟N<۹K ʰZ3GCۻD#v+M&ҝb׊Dzk\v#!M $ck3wݧM2'a4u2G>2W"Ж,6m|3zѧC# B>uLXI|?O(Ḛ3k`)z WڦlW$PC!w;|tf -l#F)A?A *x^#%>-z9W PT΢ ش^> ~=?`y-ñ,GF4%Ӝ5/<<Plz\2*@#㨦&BXMBr Ob2*BճMᾣ),wx,Ȉt˜}'_b)fਔMm:MnőSum>M xSrx|82T[hlۍ};qHZshPKx(25n^Lv)<{nSpwKc$|>o YV2y4IdG4Ly߯R5hdUf2{9)̈1_9z1mm鮊o|<7s=V͒3HDg7iez kU#99e96VrbzB"1[n6)LI ߆$3,}['qN\W4~|{}>hYA!WvJkt~mzeszx[X=ޖ[SӒxȹ(S3$fċu]zoRzi`XF\R_5srNW>GKq҂l TU-$)Bb/Y$yc e-̚C< +5#jtq]30*S3}_0<2!' f,=!E#gHvqB['gWW{f%/->=Js[O!{,Ol*,RuOljp_>:ǏJdP0..3GJM%: 074qE)QYL68˭48y"IrF ܡJdNw޽\nI ڴbH<'wn[8 \㥥y's+r]9cхo|014'u;`fVFv]?f-i'>s#g(&ާE.m_|^[ș keR~$POSVZ*Z? Wܻכs\E*XjfV=1SӸж.‰I*c1$zU[Ѓ $Ի{.LY;-?P`IdEl#tlGtaC}od8?;W^~ 1Ό`_fcx'+ůˁ[+nɮc$ۙkJv%IᨎN#%ܚ7(o.a^+J"HiAsSCN@ucA/MƼթD/^՚w2D0ӍaI&̃PN>9<8LdXœ$/r͗2.ႃKtFK& ?DjYiqDVy``#6R5#0bhy%yD?d[REjyϝ<9ĀKZ`6G{Fy:~)%t:<#97n{wMfAD?=O[|t) I\6C4`շ#O <Ǖ Oa4{E/ v޽]cw]NXRq䮭^]a?M|יe3TMAh;VVsv_#㶚$iehGZE1VU\n.c5#igb$PSU_Fx,kypk5qUMdOE>eg^kBj<>2J @$;6(ˢ: c?ܖe!$#ZY>ib+7.=vY┬8܃#HPڣR5AsϿ؛ElkP!Y>&Q,Xi%9E0HS뺒;@q׍>!.?ڭLC\=0cv[)-kȐ:GئDZ޺nOu]\񽭡ójakxs|@y0W/Bj|nCR%tA*T(#.֙B{Tlvumcy%@h55 >[]|u\j8̜~NO={+cO1K<~=@|ڸM9nwIt63F ?q;AhXUߪ`?nQ3vu٘v$u }6@M-ˤNm73vZ1NI,zc3!z?J|rp?F`ܰ!(v$ SyOݎ21{vTe . '!r)R>R,>2q[eYP~;zoZk ŏq἗3DZ9A3'})2Uɓp:m5 ]! _q4^y=}MHۧS +)g^;\[U/Ze"u@>[}2N H5ӂdyϒR~{ lDԏ=$X8DG/ro4&@U/j~YyԏHDaԨAޥdzYXf *[Jq,܂Vk#q{SԂZLREeGd  DITjml-iw K%` 0Sލl*nV*{C?uJke:pHjjM\1rpeRK=v WEj dlvUUW'~Hs|VicR#F:}zN#{U]^EA$gL?C͜jcoس!ivP:i`?94)JʼndG%*8: އ}mYwy,Ft3\>8d%y\NdVW ++o޾u tRZ0RJnIǬ*zmquՆ4Oe#Q+ʝ7'v=zEID˱YZEo\K?pi-'/v[kj"Ke}E־YGo#9Ssȏ*7Mi.DQb{\쭻WB[m]I 4_s+ewI\rbjz0䠍,K4[Lz}!]u5&FJAW2><+>W#[cx'{S֖ D_/]^|Yz2F&rU㴮X|W ޤhh/$s[bw;ro,q5E0"UY^$,G%en؞Cc+!=Qxrڂ/XGPcVf~S)Ӓg.s>Ixxn!ܻ wd8/mqՌnn *x88q!A?M ^jjzbOSiC7ztNzD5|"6WFtՏ})Z$r1ӡ?KTWcNO]#39\Ht =yj;vA(fd#B[eĩB7aT^MiEGmt1F\8'֜\@](q7eqfc[8Myd |4RI^u\ PJ yuҩֺ* Ja}24rH$q{NO˂v5:Sw<1˦Ĩ(߮~m1M J3MpҝZ-q-/;8,>ҸmX+Tmx}/-y|&R:<5!xUyRhBʅTwgEmE ySZ ղzk4νc /}{r;V<}TrAq? z1Q,v{vr6>M݂KE1Ե{nƸԗ8Be9~QJ{㲟rK7`#mYlFoxn5=@sW´f?i$sb9WSu#x,EZo݅kHV2)+'3伏qH79IUĎN}E)|Cw3=_æXgUH{eiBzi70WbFt=ÚD05;UG#g#r|<+U̳ؒ82@B):o֊'iƘ1r=fM /n_FܸV(bV]_u]fׇzw1Ke" 37|?#Ukb d($jw;RY#3T݀]9$-!8k>y*lwx,:yت)/ yⰼU0]Qe4~+0o2ay#~9'!F.fܒ/^{\}u-O92pP?<{b]\\V,b#1 d Vx[p/юJn C ;'A9Qzs/(jbx[5ɹ\݋j$J?vvS뭆ճ:d8709YMC;:(=iJx#2lsyP #Z6l@5'RR~jnsñ1L1@Ee'hBvbFۓLFI;d29Oɬ2x_^;(f1s=p%"O-p_[{K`zJv*Q.#5R (b-z&{iдŔB-C]*+U:RAiDeyg\d`mFm{uk QWhd7`nVF#0;oާ{mHtp[+nr TǁM}kx:ٷWFc9rb 1P#,^ܬ>.?O]H}@1 N'kGciݨK5> nT&^IMX9#PX7Xx7ݻBcuԭٖD[q97>еİ76s6 5;#w9ObdB+=U؄.TB5yx. =iPUK|k k7Z4<V t=4Ԟ|¼c?\~)K #`261q3x#ha܇韼@pϘVqL8\sx?l]!둅dʮCGMFiBQLܮx<'`jmq<7!{-6֜o*E0=Nt&G+=+78cGf7G'v8azO_5]ܯ|q܏ 9 GFxmOv2ڲ! IIA֋fIH-UE1wP 8L|C͘\bl_䂣UH䂿ґ#$v]7ZBCN\mFM>_{>&x`8xC% 31HʩXbbOВ n] GǖI,p!{#!ab[D#Jd$AN#_JlxLNpQ@yJIVrI3!xXVRU'}bޚYlaH .w@& Y;bFY.nji'W _q3EbvWmVs\yrsUog!sv'?-]ĸ~@ L1`rDOEg ;o}<@)sx伿JM%x!?}ZP}oV'嶳oJ޸uV>HقL¤s1m@ 4TRk Z+W7396=,Z eYH#'=< IYG<輸s/ַ6J|+ىfIQ;:c CtfoԦ#fpIy9 *K $]Hے>sPm9.qBgN9 U>EJ(L(:tZhMJ( H.kڒٰ#N{v$ ߠՊu2֓D)Ev7`A@8ĖnV'i꿜BFHqRI>N ;Uxw<4<- ˋ&HK(`n})<JP=O<Os8ܣWX-VHQ(÷j9>*K?o;KKLk^?x.4̪6V,g){ĆI2Ew R8rYq` X pĸI9G7):a̒,rRL\OAJx ݛ3=;cF(E8GRw? gͲ8\$aZe>@cPr xÀr mbKWbrTjf3{<-'Y;ˆ-k oaFӭiBJ9^C)尙cG1yz D2A nVe֥XI$3 3~W,=,oٻ|v_EJhDf;pvp@Xl@h|qZj?̯O2J"b6H >V%=sVG0I]cOy*IHbmMZޥM[Ւ$PI'ONXaqRH"Ia!Y w3) 1sN*Ɯל/ QSNnԶeR״Z@~ԠQq?V9_'ؙRœ&h cvged?1!$ = G-s eqŶB%1:1%SF}^fdkE5Ii *eUSee]8]@i_n^Bmo]WV5*(m&+cW'Qܲ*ݰ^To붖 U;i摚gvKnY^N)erd͸9cTa9Ɲn4VNPg؝o}q( !UX1l#Un\e{gŞKغ,Wj!3dRImu}nGA0 #-fUe6\\BHt7.q<#f:bn0dXuGBA7߷ᩧV z[ǃEyN˱>/!;>T,np[eA6ՏI+}+"kmKAr;>38(S|ođX?Lt2NL 7j'qx%)|' g>ѼN`i 4$yW>qWGf9%_&PYBf wd\ˣ@l1+`%0&7-d2} 4GeXIdoedlR rT%.屵x74?ݷ,2I-ⱫڞHduJF`{Q;3*tXdn&iSr[y?<|vI,, V0eeۄ=OZgLg2(NXk9֮#Pq㚰^[n (x+]@]GLڨrt2 4b )ywrv8Ť1С̳=}E/7|R22w @]ntǥI"tmZ疁;1U"-볈̰R˖w}7=74OE4`$Ny*\ 7ɱ*ce#'cNtwGiHsj&yTVOIP cA,j,mY\2f.˻ɸ|s^{;l`vpPKd"ʱ͔b|2A,b,QXnRǍijDj ՙ:(H9V3 {r9cjLJ5䭣غ{J?n:]Lk`*V4TAk4;0 irba2lGO]?zH-f3Y!a\Q򅼞kʾG^Q`kPF}‘D+fԨc9)G]5Xۂ#qq*#[ennnC3\UnLYXԒE0F ʠ7wkxщ8}3Uqq o%ry/"ЉUX.A qYBB쾃sMj)Zg^7] {*aaX^Aƹ/gjO.:V*pL#-nę#eAcYkmV>H:N}m,evX=}'C1VWcA|ѵRf]$c=uj3.v+lnJ0'E;Oo?xl$Xcc W/Z[۾sr+Ƌpj:9%rsasX{r4$*}e#r@کK&sF8S/1{KZycTx*8=oý"@ |@=„d9LF|;r^hX8p8Z4"RIj}T,>Om{cSS˧.lyc`mO'>Ь @!*կD^qh,r%@׻mԩ7ǼikХ 7j?̨\`\C)zrB۹:.6wzNW.<꫷; ]1xr˱IiUx+0)KR,Haa ؐ~)uCX8k\gHxx/ /^]؇01hֺ`,k v:K`<{VMp 18qԫ9&V/D^71FS7$#vԆCU߲nB5ÑQ,:0+igK3MXٌKp = PO˰LN QҼ֐KG ;<哀LEL])| hņG &UNYAWGor.q,v{*yg|ļؼ]n+ 4q )*X2<,`Īu)ai14,5<1dmL6B ̕HgY(֪ cؐ<'m=% .ժٮ.Xך5WC[yEj,. kn jAId>ຂ/nM!m?Xيr[.5:IW#%Y=ɹXߚbS:uLPKFvWL뢆9~y"jpAY^ڀi +ʸqZrlHo3 ]1Z2rY෰,LSs ᤔv9-ŽiЫ2YF%XcE!@bxlfI8jB{8|Ɏ8DRNͶ_oG@+kֽiL̖s#ONkC×5g|u^+E%t9]Zi2"WE Jϰ :W`aLWۭZ=d-jtp5)uٲc/[-@)!1W#c)ϼ 26ݠwmAZJ:F\ "Z¸ଷڶ`y\NɷkO(cwh!LUh*s n펭Fްxk!4uT/ }̶jSvI&a c "_l "9_rnPn<~:5,$k^<)z|x&\- a+;|S!ȸz)b{ {7Q"9%p\e`(_~`sՌ7>NlA hOTe1/S7;lE=!YlskR,Lo;rN>PEZxTGhQ`Y@!|CˏZXߟɌ*?9.irЋ6-EXP 8o#b!|DqO>ھ,јs]~?5=ۿ_/a3L)e)3,̅5a)'s|&%ql2/܏\Qx2iWZ%Bѷzea]V?p{m|=3ࠞE8Gr|ۛW +WiF6v$ m6M<<an$3\d~7~1?8Jjq{H%j.âfI׉q[edc#%7%bZ6 y Aet!7U?Wbz{Q[v['F]]lio55[} {}0Mż?Er0뗖f /_\YE3!/wN] ̎b6gީvjS}q{ejGȵp)*$rݻzjK0PS^j%#'~f3y,Ŕ,IIZFq5ob-.*.}7[JV3Y:z|:p6Q -r,k*3CT a۪|îh.;"S$G˳XӊzLѢa $%9Mk\ Pih8]<֗cpk*n8gxqYeSN0Z>Oq nչnv0=Ě;J{0Q2S"6cUxhHeB]CtOY^Y i@ڷFKk1y/x'⫑%)Fq7|Cw؀~Zfa s N ۀ\tGvx uטWW'+=iz6`t^ɃZ8F:a2fv|G),>VV I`#XXTg$v4yA^|i_S>jf=*xy-Nb 6٢H-{=AvjX['=Nyvc'f*c`y ێAG+,Es4jw7iq`0:_U^O>?Y803Hg匪ꊗ֜r%i<!fp|o).Q:qh|bY XE }v!s$).u1侂偡x\Fsk^xS8=帩ސ%4ZSc6{;nFNZj~VŠk |H[܎'{˘#e=u`Otp])PFjsSB9-/VkV$"#f+ =.IGt,w%.=q)'f5r8Il{h /t#LU?fY1*CћW`~:2 $yH fʪe~9lK0kNd\VRE` *\N=D@/_ysȸ̼x![RvGg6K`vxNS_Pӧb14/yo:Yw/ljY]%5#=F}{ nAss-Yl"Wröy'2qU^srOhf{ [ c*w`ׯQ[Vx+͵pd8k˰ŸzfQ7F jۍIoG2Fʮ๳HַDx: 01Z:+ej[`.w(¡5TTES+<̴5v\quN aFגsM > ?vt3 xTqv1.fښe!(]JoͶ@6JnC H0hO~5?S=^*cnA_6 '̝O`VK5ēUޖs>mR*40xNlj4``~JdV'7TMeܑzKN"uSӢ@=4_vv`2XYKu[i*V+2fv:m@SUȸk OPO|/t ++0^\>K|]hDWn.GpB`==t-!ڲ=I\GV?2WFRmfWHs/Ls$EH^;=14ֵ;+ddi :1#!L&>?.o9vT~=;|4ޣyDŎ[Z@.`vdP\7LvZ=Sod @l:+H8~mВHӨa]4L y;E͸F.$c)6.xd"$z*h-c@v*ܷwp\K@<)LZi֯o>8TprzqIc'Wy&y-(ݶo'L{k/j$PropY g/+fJ"Na. 8d#ͳ`6(F[k@-pFy+x'y-k>J+ [%-e뀁MRwiH^BP&Hg$o6J %n-hE[;[;V!^ZLƨI`U,Ht;]nW nPq5_{G^_#FH41ָ5kE7UK׿8bkA#ts$-q.pӡ{;6L$MoYpt\6;PkWpfԿ^Mb"T r\e?-KKs)^Ǹfw9W"2gyR>{$BĻtY;sf)TK`4=~~ۘr'4|O\^uy"[ԩXՎ1IV%K4l`mH5,Ձ<8sPU GQm=:]Cǥ$שSɼ҃xGy_?MW5E hքʅm4ѻE*$Of@h>l̾*e9/71nc&<( I$ Jރ}p-;_^~bpUQ^\7+=hk);/¹@ttf?[=9 PдIEd98\G4*o$#Dب-]ZB:2аVW~Ӧ&i "~M%r 9Su1,~n[q-[ k} (i1Npk\$"]AP>Ɖvj]seo_~!Wk{UH0o'As.4=ÆxVco'1t8Up*x.N i~vwjXP ݯjD?-"!Tr*]#[>W[ BdҤ9>ڹW⍤ ]wiT@ ۝Λ6sWzm=b.;7}px5ytDֲd-*M-Rߚ@SŶWwv>Y${Cq G Y%u-Ï>h4Tn{DE r}j=4֍:(b8Ti[./qFeFg ?I,d sve脰>5-#pvjZxr%qK\񐊄[gCrqA =ȡ cW=V;ZfkֻF$~.Y1~֒.ycԪ_ٻy z{~> 0vM?諹v"t֨Nu2* M,^7Pa5W|+WcoQ_c@,{-IUHih#!=#o]zIU;ofUeJ/&xwMq-gi 5%?{:>~:D{m⦒pq&Iuj/ׁ~z<)#os"X?pFoN_ Kmf9-4朇4EFԱLf߹y7}RvkMuf#ZPنHu PInS1%ܫ%\챋AIm#*@YM*H^uSa kZs~V#p(hKϐ TƜ{S1K;[V.kqX1H+9 MߩuXy3{(me48:t8(}rdVrHl@5e_k]P!]ag cTx?q񍟕͌GMU$ѻM8Y#21` N,#c<.qڨ26V3T$ác7Nr.Q\l{ҍ;`U[]Br7o]C>&F5u&=[g᮷aJbVW,hG̤E"57wF#צ]XΚXGԌҩKrk\cy!Vze8V"cxgmao+PR R0yfN*rc-<77!Z(2 ,IX1^oAJآt K\jCWK NjQrBҳnmȯTx^fOd{}ܬW#U{Zq|9Jkw+eY\:#宷ZuԽ.mר5S-d$N7l>c(p ɰZԩKnLs+Jؗp[5&pxM@!}- d`t.<9F蹗[ ٲUVe)ܙJ{]XfH/>6Pp$e{JdЁQU2=s[jXjyvJUU"}NͰTܱGYZ05s9|A{IJtௗܟ nnkMA^jKUhbIάvǾunSf|k8c9e?9aٌl}OA㊒#` VVBʻHYΚN=2ZsFi G[i$!A81'e<4 RU*~OvsymBijd*awNk}fzfĞ62£kuq&$,Dn$Ro؝fK|Н~=⹑ÃG1723b3AWu^lD{.Ya(kq<ק{_h؟>[ُCdpRįiqY5c2 $m$Ĵ$ ^2%} 䈊| YA ѫΛza#Ԧ)GbδXȳVJuS$;Vm}:=sHpWpX_,faHH\URZFx A &ͮ.h551rG{Sʳ79/ $-:[O]F6Pq܏$@Mc@5<:}l"Wĭ?![Zҙl3MJ-$]WzSN"lscڍ|v{޹B읁FQ1cWCE6.#׆Ux"__=#2˶n0_Nhy?{(xS#ZX ;٣2C^r@hMۂI[*\P|^z̕8ũiq4r{Z`Rokhe8%7+ȳpث/-kYP ;{H2N 7[uE\'~VVӘlA'K}7eL+H'`wӦ>1^,[GSV3PfG d ܛ グhlK+x#3Wb[ĥ"DB#^L(̫L+=bfךk q9Rq% fiaL =_U?Cs|ŖlNXV~kVǝ8P1qQL}#R>mգu}WXl߸6:,,Oݹ.$~ 694ԝv%GxW-:W*]vJ+ڄaԘ6k5իN\y?gRUnR<&e["}'RWh_}*ֶcXyӫuDž4Zˢme<à|ҭΣ*\ IE'('8NeyJkm[6ҲGfuC#' oo_SƘgtt4ȩƒTL8՜OJ!EVmo#Qm!:BD1Jv ;6ujٲ9v^]o9(0yi㐉yET/b64eoI+ ikp)U&z˝GI54>EV*?g}᤼&ꁂ^6D%4hL[:jh%Tw4uOK <8zY{}=u6G])J9ҜaS/>TlV`ȭƪCSe?k7nC^ajZ1<dzTo|jFZ,B ozl%^(j** ɢʬԮ$oj({ۭ4~ ͟Ŭr>٥Šֳy|`I;_GM}^?s,ٽq $W$qK}@MO8~U+伆</UKArVF (ՕJ(Jd}ͱ4\me]!<00VR{N&R!Qe{8]h %e_tXtt8u9SIM{wp6@E;y!༷7n~NC3yH,Sq Xmv3RFwR]}IщU;}--wh. cdsppL)$5!p^Gnk\<[3Cݑr𴀞ul"TsEnMܑO {{%5|{YèqM` '<9*Q4(!Y$u'R[IkJ|6ؗ'n]8w+ݷ ,/4[IܵPH:捘v.}[ g'hM~ ?b[ Yk^f07u>ͷѧ\p+?,wDSHʼ~R_gq"]H8!+/Mp;*먧d>5=o{nfK n q$|M*ʸ/^\(HԸo>'[6V wJOYEs?:zccEVx_ݸdW iM=)piq7/ x,f1\wbAQfd߷cݿi9VIMQնXLlp_<+Z丼>r5y*1f3$Af$Vn޿[OM~[hCz nn؞#_n54Ї0> y3[ŬdxūX2;ݩbNur ,q/\@g 5q*-GgB$NAf̀  ԯgu3m~ ?786Ǫ[9ܒ7xfHT;׵|4) dFϪr~[mi9$!y#bFr(VC}oOBn}RV9>^O/UCo1qo>%B9hT2, ni=V1m騭SݗmVۥih:Ǩ]4c̭{)9ΘbSA5{If<@K,EEX;+\v(JijsԗE;{Y{%JK4ҧlLzյ[-Oi8tc)%=y5~{5Y8ܑ#Pܧp>1h9O).*nŽI$YwuW}ogQyKA2]Հ JT z*V9؊{h̽H,q78!d>Uo5lF?bdg(s$=;o r>`t/=' `]\E5rYjoc['4ȋ.NT߷S=ԟۄT 6_oY\޺B84~+y.;K?,p#,d'mEE=i`Re{(:  m Ojd #ς].r.ULC-Ec]ۛ Hi@+6DZ5<wMnxㅽJ>2`䶐k{cp>m{ _{jJ+5ÝP۰1 8U06-۲M({;ѭkgO+Af닑M8T;'.KBn;C^AFydP6aN~ru|jҴTѽ#b  CפTfgAex 5.Ud0xCt-u#6 uj8gYաd׺i+z}t\qI$:f,.Rܖ2߃9y%ޓߑmju5 ԣ >߈qV(O1u\i.ݖRH& oa<洠Thϥ8Qf$2q#A#~6[@o^T*rݶm6(ր()gGz |F̝ jf{>s.Er/w{l..P>o%ԿmqÿY' dtnrz#Oyu4R#{抺os .+*ߘC>vs(1kT*b!BE@vY!@ïSԳūq%㪘(ߠxp&p)u.Ƿ*ɼY7|N1V+09uaz@; ROIoCKBsx~kEi!w`~Šծ!hTTgN $ggB g$6XHxHGp!ã?dDe]{Eٲ>[9O3 nul2"h"?be9I>QKoNgz77d͝d?@=6݉R?U7wzϿcۉ4^?mL ͔}̇}K뎞CzT[M [Sء|GZ2ZvIyfrqվ mՑɷٜ9iZJ/]?I0MEv>Fۄ{vQ(0|Ƈ1{U_lP|Z Ԗ+&͉f2PH4;#n^تOrw7x[4P ӮO!ķ^/q6B9Y `j9 e=$J.i/)qӻoFc#qy&ܕt,]r[}ɖC'׼t4 ݚmϩMN bL~%ya$+emAM7z߲iyq8|wWQ-<>jaxhŏ5[1Ondsp ַ}fk-74_k9]VֺŴ~z׭GbED2!;Ou:ZUYr-Uff (dYK{).d;6'A~ɧ1M+zm|0G1ZtPa y{jT^A;mS\ 3U+c*C۩}Qq:~hM KKBEEBBR2Nùv㦮{FbyHH\qf=;hd,C a,<ѷY{)zyw7|3!N{ =:S},%wcз[Onh?.gG ic8Zϻk57͋NKeFy֥9MYIPqeJDm5-E3CMû0_<?l,PE!S\ ]ozV =??wo4Ffܽx } ЅodZ"h[l/%i2q սcWEJ7gN-VIN|40թJZ$7=~6{61u*z+w{ut4յ-٘m[ewԩwxhPm+&J$}vUs*Jd;DpR9S)ךQe!2F#r$sWdt^x蟎>$ap,*r+IQnZw. iGzG1ܑ&HLq@ǵx&')rm? #jJx߂ ZiV2{@oӏlq slG!RaicQVUEƔSbpVM F,R8g_4j)R:nPj) ZaR78oDUl?_o*'/[ydnBav ]4³%Y!9 6C?c.v }tQv2kETKc=mv s޻DϤd6 t撦(WHl(dXV,v4z@% rQ?, 4Aޡn.; 7!MImKtRP5j'%aqޫ :`!ULs2yMh,Zys"ÊqDXOQ,]凬q M]hpJv:W*[kיdB;O_o? ILΊmU(3r~bY(㍘jrPHRv _Ѫv; *{}mtĵKA${Ē6_B;NtZGBd80s~w یCD?Lvh+KnY\yj54Vc˞IMo4p!=_~H~6zsrq C)7'؉B'  ]gnצ~7 Qm NZعb=ڷ͍YoyJnmM^snhylc6F`|"m,#>@{u;Crkf06k;s.jfB~o0NVg&ԑĜBcgdZ:R0:KXô0^= j SX2?=0A9uDFw5Z8Q/.q+)#8䁺zC:pM(j4:؆D;~餀/uHC۰;~t EK-KiR,ѧډFey *cB\wX$zq# FǼF_gQU^2#(G-ԄePA"nȯ=NWvЬs@_Ɩ+I,/3'OđנՌ~m<`W;/EoqX5ݓz!쐀O cz-MTR6}):)ڴ$ڭ@uzq[n_pbV#㾶{f?xmul%1x툠N|:lF 2|GJ1ZGH@B;}w)j[w+ge#ڙmTVv 1(W&PTm'hmC?LTl:>mt=noxVpZ< w"e$2pS6k% {ld#%eIq 9R0\;U{WK\{-3 m˰21J7o:~{o\*j:٧qa%YLVQ0rromT2MY>IZJTY}/ ?HnJ|N'VǶƋ#8ē4HTN5'W b4౑ܻx6 fQQO|z\Ad7X+-J\/Bʁ Q4US%8``",S!ח=vS  0N&`xr̯'"jcrKwioj,{Z@w &#,[Uue)čJSIV KN i&bBJ az:ei^9dVK:%ofkX_{1x`^8iX1M旮O2ؿ4}N } wQIi*34E ?TWtUc# qͪ[E>\\3F)`v*n=?#; ՚#r6^ԧ 4R3CZVRH?^be?e$"ȵ-,?ڛ,v>4x .7cܹ R$F]=ܓޣVq{=U MK}j0ǑZlT I,eh'i臡O}i'c'\v*Zos:nXrvfOrD8P2d傰m͛x+Ph2 %*ӧi,r|^۟Gv+x, gB>Cfd+'S߬df|7XH8ȣ>1o◂@OnڔHa2AJYS؞mډ-ܿT{)* v5Os[4qYhK]$v!F"?HX.PSa#|-DHKj䖎5->~Z}8)Sq,=i;v;~D.լ~縛uRmluZiU6ؿ{ ec!b }AMvܳE(ӟOB3H! ۰? ziR_M#\IPٷcڧ1G;W@MzR;fAy/*M:,d8zX,73$Rkn|]^:ˆ%7qʒf^AZ"*$@wmIoV 8qSb T`RW}mHQ_%EEM{d88b^:&U*WVmNޟq4WZL!*\,8҉QUu%;Ҭ-ƺIV,|u[w/eO .wK44cT?7EL6[(?r5,ƧtJk(,XJ<񲺒znz{Xz ?PG#7x'Ԑ7?=]%7hƥ*/5!RV 7nŨ5*;&QF1(Ͱ>4j X`m NOmI o'm{etGYq,AI %+֍ $ }ǩ~Q5r]R`#L;~QSJqGuA'wV ;?I"r$%`a:vC}:=6ҝx%zo8gԥ/Y2ָrzY$QѶm-`:8ruE]u.1BOp{X x- 8zjb ![Cn06jq u*nˏAU#vRČ: X=) C!M끉/!z 뾚OA_-wH˶~?zW8xު~wm`u%nb[oؖYJJ%ԫ:}J;KtzjobZTM04O墏cج{ovu NJ1Hy3Ұ%%dwE1Eqit슄!wĖN 7xS#g >*37mW.e!cf.%vrN3h%(B  ] oR~_E)޴5}vWĮv>3hsJ,`NHz~ɅIvGӯ:I{et28AfWMwcrma\k2ӊ.)]<UQ1=Av'ă0(VWk;uG4 ۫6w%ߑn54{u{t* ⟘mƜixIOj#,Chv* BX-r6.>Tj7X$ Qvoz|;!.&Wrm $s_(Z$AIQ8뾻ØHmB7ly $ 1s@zvIǸFƁi%rdӁB-xZ:4K7;oY'qV)m`İud_4TR֒8_ $ׯ%;5',^KMeFZS:~btj:ܣɒ@V|͈{:4iDҡl\4k|Ago1u1_TM٦DQܚnެ~_mU4.a˱4SsW3!+?24IH-qy Y.} #I(#zToVUnear2lw~FOJݤ>^|1y*,rrz`- ,*d$}J׍?Ryn7 I`z:[ȽcON6'u`7==7= = x<p 㲝5Wa<m i&d $tP\~$ܘ'hLlTžѤ\6̼;y>-N6 p>ZF܏N ,ڤ4zJ0g>"v RBjdW\Q8P`a#њRP_(@7RIY򕘼Fܷ|Kn٣;nks% 96:E12Szʯ{cj*G3 !K6"Sg=|@fA0 bz#0Ʀ ;IPIxSOѯ$}}+O^_(W@G\Hg,?w9w.O>C,O0YGVŻv)n۝ zn#:)?7bXࡔߎS!,?h0GOMNjMH18dm1bG=˂[-2N$cМե0[ڧsM*?!y-WqY$~exΤ' Fc>c'mKIwEmOP}=tPZp'*^fb1X##]#KUAÌkY4'ў6=C㮆!i)<⬏8DK En{Ѥ4#*pAĩ R]X9!$6=vj+\NH(88䤏) 25/ױQkYb,I wXڎ|RGUeQ|u1QC3޲??Ec#w*QV,w >4h1ɩBӀ}Q\ μl=A: + %.ZNKdҰrZI _r߯i~ zx|39ICݻ|~C[${WԼþl[HBb Nkq 7*+1x%S,C?+Ccxɤ>"Džܑ㠚,}r\xqwK KRqo˒Mtp)b|,sR6ORLywuq)f=?uIu[c#p"s_"C'}A>+ӽHi7l| Dw3v6VВ#q>!ӟ9%z+Luy4W'\KFLHLz##ΞJ.c9&h8OzȤBZtqnjKsx85(בxJ!3AKO kG?j*nϤGaHqq^\~q-ᦹ¡tHNdc?1x0K<ȡr|ko zSvHVY;\S^]gl>x۳r4C4q)r^4rb*˓jydN$]POs+dui^j;hV&k_o"㌮kMO1C"#~>7:5zᶏGrkoAk?^wĜ~KL(;mmus1>cަZFEMh0S:loPJ.,ũ!;, :QܰbPm3ȍ0{{яHlME(+w-EXoTm$1Ja#Fx 1YFd#?Һ㧕ށmɣ|௷'_q`ɎhYPJ~J; ogە*xXSLtao}$ R1m}xeļb6~Z4!pɡaX{hV/1&!M礉,ӘUxWIJq;/nC" #7N2i ̧E^hEn?U$M8c%^"6'p6L\(8[*|)E{Ac.@ن TP zVѸ? $p뵜jAW#C sor:M:۩1ĶpxP5hW<(WsXmt`NK !ِf:Lp.!Iaз$zƁ~ELzQJ2hGw'`]ٺ7]9Y1+Ln-]L8q}pp Mᔣ~v9I 0Kok+nX;~mF@Tsa?Pi.,S˼P.,ԭX-}Im;:oq'ׇo%WA{(HsN070Xڼ/.fݬj\up+4u〉+}coNAa\+_5Ucμ_ʔq4(ϒ r:kΐZc+,j+7VlsKkGRx;&m1֬͌-Xؒz$ksc_%b3B;8Ѕ_+4!~scG;8ЄscG;8ЄscG;8Ѕ_+4!~scG;8Єsc_%b3B;8Єsc_%b3B_+4!~sc_%b3B;8ЄscG;8ЄscG;8ЄscG;8Ѕ_{kز =Vg~BM? 53fbBv&~EI\X)%S\]H_9?[(8(?\15 D׬*}uʽ:z|sƸOɹe)Yqser5ZbX욊{"6OZчymq qo]-O9w]\J fjƖPr)܊-֭!6( (#PG vI,x| aHYțB: ;;uu"bc3,㱙RB̖JLZs!ݻN~=us^R۷)&̲04:A[re#2CC-kH!ɸm F)$dnapw+~@ܳ0t"l$\^Ⱦ>=kfdf '0<}Qmޣm(IA`Wl4"")}{]QD{4N+s^;AרcI]"D}b' V▏2iH;Co+N>AgYP20;T(4)[rtiPd*5ZLITFC tw,oJ'3x#BRIcW`߲ $z){G }Y[FxTY9%vO3<8g۟iKE\[-$ף&닍զﮡAܡ2jn z{hhsqϣ.%-NYk63ycI3Qу|6rH`8 B[] k] ʽ !yf+{Ʀ~Ȥ12HTRTzP&$eVD68$57 MU)\WwfEKtvjy$K"N.|umi.Y1$Wsm//q,n%b\Uqm:,LG>jQΡ+r"6"i,)>я^y$&0x~_i!=%_F|#r~95tp҄B6#תFm(ӟgԸ9|v@J+YҼ2wW N(ֺ|NSZաpf@6qyrZ-c +|)ȈR1v4i\m+?#e}v.ǩ?^Z,ZH[wJ {QN+ |{F %&0fü{0aB ͼm g OB7eR`qOxGAWHDҼP{#nX]8UnjE3Ց̱: {aȝal4%EpP^{O]Xp>qYO[CBc6C͍ՙ=h$ ) ImVWna̢t9TZ?s?gd> &k*qPpC龆ХjOoRv?ν:V!C 5jڢy,dO '7k]Zy,VvB;_Qo5ֻk4Ԁv4%,<*,!r6ݽtNi/CQLfzEh*"1t+A">g"׆<)H巅X wPNrO]&P*B:3NʪS\fWښDݨ;{~;z3V4W[YoGUf8S{p}q /',FR/?S&k02;pҤڥ}D^8-ۤvrƖ&&|*|=gŒ8lY'tgQ)VMN smWa0$frj)^9*;獑ct5Ya 4uXMJ:.rOR2qpIX}.18ix8O]G̲PϿ>?84ң1vSiV36ݡ~;je$l{\0DK$/[re&(?ߠ}jU߬)_(;8uu\9Íi˴:9Q3x\i_*p\_)0e1< w) h0c9 `IaiSaCv-^0Ж;?P54Rtx0m}dǵn#R ԿsȤm!<-@+,! > mo(!FiXkRHb= 1vX㒬j>c>A`M)Q$ivf=ݣupA'GH7 zzLzwKzA}K6/t)|~zZF_bNֺ]%}[b3op7T`H zuͫhЯZ@{%X[4)T?P#MǑKqT8מD>E%w; MC&NJ]b~eEHF#BЄhB4!F#BЄhB4!F#BЄhB4!F#B[8;żgjz}0&ڐeq׶742RLU2ʀGMW9bG3'RCnG#Wߨ2=mnEh7H~VOvOI5_HM"(8u&Úws.'θjn= x`Z(eGۮݍ龫{i,&U[o0p)\r j\.>oeG-K 8;`Eq99`fD?[/{+H}{$ 'ǷmG6ZP`{t?OSKxYǫ$>OӴVlՇjw$޻IS;6#QNujW5L]nVwd? ڡ_8?zr PG2ZB]2'5iƕ[[I4r惪5;>z s<+2F;S9;U4hX 'hXO3D[5eT7PoSW/Ʌ.Y?iTtԘ厴^gOڸqŕ9KZRj|j1j;lc6NNuHN*QS~CTdkGiH6-Oڎ*E:lG-F'DU:-[D$pՈWgA8j=q7粐V1>Un%]66Ws]rg9|XzjiqeԌhk*sZMQ]&V^e9_Zi}T1GcTL丞I$0cnbxwY`V7PE28%?S'7%⫞ԩ$0 1)IwpP)Aް@ēϧG#JykGSF/`2rZ)p?HtX{I 7?\adX:8u] ZK[{yRE~͘QЕU1˪׸`Fa@V f .`(wc~@>*(Ye#%{c,toW' tʋ'SznB4!F#BЄhB4!F#BЄhB4!F#BЄhB4!]s$va~ӗ+>%i7w//("jeeU[cDn@i[-xa荟ч7,mRgF@MnCi(c{=->?^s71Bs,by&ﲣWw۱R:5|d1VSRą#U`O,1e9AǧފԕrAm mZa!cO5񋘬IeYP?^5\x2Uk^RLelL8t/OC՝*[V R^~GY+|4d4 XX%2wwo*h 0 S:/ y F,KYb;5g T;EtOӆf|{y$%yaRF`G,=A ݻ%` ǩ%2,cQj) lGQipR0J؅A۴l4I"M;}-iWJXw/Gujm?!G M32v %OtJ~|uq,mRo?T_7t!F#BЄhB4!F#BЄhB4!F#BЄhB4!F.qIqd`a|Ӳ\jI+{6Ďf=tOv"<}efJ42vw!^Rʼn=FO';>vGpSLf!0+I'h:²9Ex8 8eٚXɡ)FTeQS&pih<j.Iw UD3I#v;=ٚ*~K@TaWfIڶzs7^ D , t\kUM`V+)sż14]#ӡfV9+wPP}fV?qZ4I068nԽNdÀޭN}BNT!-R_g'}?1:E+.6Ml%CȣJU_˵{@k ?۝JI|B B vXR p0I-'1q|8@kM]& a=04,J~:t/c.*oE4ƪ׉Sxy_[.a'́l8.V/%foi#iFHsZ+?p\il7g8]M/ x߇3ؿ%Aȳnq{5B0^E;ﺃׯM5T4ZE̪% *?uWmf .ߎ禧rP=ǧbioƏIЄhB4!F#BЄhB4!F#BЄhB4!F#BЄhB4!uwhTSn:AHJDϦ 2 8c:~n GkncP*hXLd#,WXnw騻X>?2B?lcꖒ$CYԍRff 9lA H٣S"8~6wNskUʎK_㡘XN՟JPtM=Jd|j &ZZޝ*_H'@ `[N[Nz_@G,%uHT@>~Η;%tمbhb?M9\W>6V7٫NV G VB4"NŢ߫lqfYRoozR^y.K[<-[}kE Bsn(~u [U,qK2aGSQ]$q೫"Raߌa\&)2N3bVܩmzz4E9p^J˲y rK&Gc-AR@2LKU]5?]XRmA?,s?8"#rvL^,/n6:âW{f2kxzX߿'M3몸pZ V,g>K9oV"V*oPSr;">O1L7gCS 8W*}M{875ZROu;hhF,p,>E ;lbw-q){k{$ܒF g,Te.޺vd)CP\ixkÚDk{ҕGQ xFx.!y%n~v,S]R4dO nϔ"ts2w}=ugQ=!Fd-J+9oזy=Wnz4֜oV,]Bѣ.zWaiS@o?T_:&#BЄhB4!F#BЄhB4!F#BЄhB4!F#BЅ\v^A$PЩ$+X5 UJ'4$sU3wB&+ƱAkށ#m?n'mL)Z[ڽ6ғyߵqK-|̥ EYF^+?`474RUd8%\j5v$)I$ЅHOQAVat$iuzFrlSI<>00&_jƠq[ 3*hY'e|epCU^4V6E M==KTQr`UAmj2ݹס Gl:jNaK,cOH^|W#KHhG?\A0ir"3VYVBHh¨'j;zt79/+%u ªJ%6Q)2tynux=5&r +ٮ L!*Fʼ׏h^)1҉%fbOW~zkZwӢ#fj>]#'ki&gB+ S/:DŽxlNd8=+7?yyyX?7^F-VT H5-9 ط-Ғ1v'KdiR_'@܇(`VpA=zj4c:VW 2Ңyy=*y&mIsn?SoswjazM&Pzw9X¶8dfj-mvez|q;iv_5&T] .POO,F 8pϰ!C}: Q ;}ŔOr:U :sO^c<="i? 뷦SH,9\&S~cot){&a+m Q%✓E_~7w~^M+D?Ǣ+$[Rȱ ;L~!'M+qU5k6| ˏ'RDЄhB4!F#BЄhB4!F#BЄhB4!F#BЄhB4!K;L2zrmQ%"o!,(m:L(\y/)*]ahïM(UpLg5Xٍ.jHҹiᑝn٣p!vr.b[zl6>1[K7DSwkw>:)1VžrrC;$ϼ&T`QvH>ϐsiVEkeC2v)?E:R,teҖ q`-.2:{j-88+ljBe{ѷW7h^:;NI9jGf5e&9$,AԋAF۞SLV/}jV<.JY9)-d(d8ʟ+|v _N-@$nOk u'fpB COxa?mG+T3ŊFP݀۱?NL%H1+cvRxLUīzv7m1,dm~Ly̻ iW7K-ģe5320nJ$lԝ?}sWgq97?#W,< sʏ'RDЄhB4!F#BЄhB4!F#BЄhB4!F#BЄhB4!:j3m] dS1Kr (ea (.7@m4R_ula(#< ̵1nc { -uL0UI'>Hky%Rb6BGٳvW<4+f"[5ZMoS,%D_X \y ܁Y2";m\͐'-o'1[mNUխנZH6d^F"1c.:@T햗ypT|J-˧FwKѷ"GpI@:!9n*3ٿ%AUaH#$j88sYY"tP<LN%Iڕ>7NL:EmY }l~hm-$("m0QSt}EFO|Ыo"~.㮗5˘Bۦ.4#φ~87)%36q 튱HF݇w{ -6Nb<x7-3 mre4L*j b8.`nW#iAސ?yqCkX HXoq3{($]/'51ѧ"KN)Mm9+ae#O+SZ1L,6فoBu%V5z<䶲9dJN@ 0"^=ip,qّh2ԕXwZ <}XoP^ HSm~Kܵ{b14`{uB8pH`}:(0zfIIm9V7E'ܬ ̧19iv Biq}I0k"Wk m-._7VEڹ9o?T_:&#BЄhB4!F#BЄhB4!F#BЄhB4!F#BЅ|DMڌ+4.wCmՇKmsd]D/_?t . 3e''q㵃z*T+?hSE1)cy6r|/eR m%dq#]bN~:P0BVz_xr h(1_kƳkG#aI)nI^p>yZ2<*Z+،+n q18WZ熐)яkHΕbz=1f]’kn {Bȿm'SЄhB4!F#BЄhB4!F#BЄhB4!F#BЄhB4!mN!7s!j ԊԴci1,Pj4cyB{>^確qKA%4~V#R %ER%F5ϓ;ɸ8"^/z٘$Љ2߯M9#$$()Jd$V|)Ld2T GSwRø/Qj+2kF9Ty{FG3{=ˍvzyFx _vjGaQ%yY e#~<~Ee-}ܸ; 8L\juiCE(?ST˷AO] TD~ooK+)yp|}z%@豼=fE.?.ؽGocEit!1bI oUY 5Yn? (ڷa[O|+/Qof;'-+=7qbܱHGުvS5 eJ+䫿寨JjwFȈ.7-po iP,+m I>oѩ?QU0̷j:B1"U7өQxJ5{c_b^VwO᮹$V,wG"nEГ-O]paԐJ?QƲ0\q9j4eaє,:u(WbF.};S" yGiqlSޢ 2~+EF,x-}n+xÀ.ek='^ߵY##)ڝQccC])5¢IKr_sl3Sݲ /heJcxRV:Mv䐃g1J,,`ѱ^oM7Pj[^68ь Vq1x6?QB~h{rPs+z}EYCbƦ=vރsEd㥱7Q'm=2u!8uӏ$5yjLNjthV~?yjJ7OUnɠ~*~ Z(ERvߺ,slN~|N;TF(^rh~Pm DtniF%d!R>5ɦ %t1-WEC;j4?Wb_Gj}pn+DlXL1e~ܰX)$Χ檴qznDtI½0UqeSqj";d N۟M x%!j^L*5ܪ,QNolH,;Z(!&2jA[4 ,VRG#?H}cxߖrY߹ִNNw;t GW6<tʋzUЄhB4!F#BЄhB4!F#BЄhB4!F#BЄhB4!] w㗰f;S^$:Ԛ$j >xb&:)Wy?Ҫ3\1a+_xcr6Kɪч' +MDq,E]h?!馋~uk@4u;_7"W(4r+##lǴ 4R9vr-tؑ>!P/.eq~L\%abҭEzkֳcRh_z֗ M3hJJtm4^#rUL({w(?۪ր j`.sQ|s1ӇZ߷Ee'\d2F?e>\M0jr8ӟ3!ǯTRPylTSFHw1<2z{B+BȜ+Z_~Gdo=eBtc--= 3#kJW"U9 ʠnuv~N;B靠:᧝X3)HYtU玬&j{NF[_4I$߶v)y#1:2L'|Vr^ [Ysj)To5KM41ܾ"4p+Yl ޽|NpƹqPhΒc0I;{d /a؏CoR}HfpPomXÓ@x 0<(u֘ՂnFM,Dw׍H$~.7măRIxpâ[_wݵq@,xӬ}և.t1x(RYY/ dzv$.YK8|/A# ~kٽ[7״i'A=J=.rSUa?'(k*+w3aD=}5 qZ,](ZvzWcgcsVpD ":oucpkwQ4%|CZ}@~9?x~]k"@rlƇdDeB?vc#C4\s4-ّE3,r0?sVO|il#O`zw?Ch nKZO%[ff),R!dԂ>h_wq|wlC _eC8Si7;3ڇ AO9e=׳hF#+Aߡa]~VO L%o[vowm9y`x+sK^9HЩ`7G X -s;Ss˱ziY#`ޛNL0޳y~kcFDmkWv)'}u!AQJ_2s#KmLCW}V 7;MѠRA쨿ǫELF#BЄhB4!F#BЄhB4!F#BЄhB4!F#B\o<ĹTw(L͊Pi!w^ɕB7btsTH>{Ϥh 7sv)SPE7}/c çNc).ᙤ.2<\'|fi߅*$3ob9Rߵ7RsF2Mk2{؊#P:ox&wsNWTq$bjn9p;A7Qulo?SAZP`:::GTQ֟UFg$"1s7$~#Pmۦ PH֦)seqIGbK#D"%un۪k44KG(-x}wMR =ei=훋 iktS<t]o/>8>׎r߷* y‰@}(݁uyeug ӧ/5>^.vl-9x#)2V2k+r~2ȍ)ST*>zo6:850*=nOpå´Ï5H깇<8ee69ٍ=Gjn~kK DoA[ ˒.A.^Y{DbKE6TvIO:yTءU&A:lvvEs]_=mB8CˇKZqY5{e]Vhw6{Op] X5ʡyhr;~6׹#nkb~eOӡ& r]d8wتG$?BHFߩ氙6洬dRzR)]w 1, qZS&2q>T=pSqxnZTί폏`F{sSm$ /uCǾY^F_!k 6xK;XlPֽ+zC`w2F޻jAi-g7! |//20I=E{V0ٛimsVCxL ]H2rHIe:u=5'H*v)/|< g?2ߗQrd7]8ޤ}J漾gRz5f݊svnv>ToD+vU ?A RЄhB4!F#BЄhB4!F#BЄhB4!F#BЄhB4!|㺀 -=sGCiQ6=iR;ޥ)1؎8"W3jr8_. " մ}7ה.a2h6W={<6F2jxЮygL_& [7Nl~Yu xf<7*iƮhM:9;w)'Ӈ orWvx} `G[P6UX ;NUo"N+CFCL+ܥ˼D5/%(Ϋf OWMIW\Fn 7DtFA`L_CY՛8X![;onoMTƒUScG[SJcǫL$I1vrӦ%I\U8RrN ?)㹩p<bnTG w)UջʀNrCi5Rv,Juܧ_m%nqW'"YL Hs3yU ,իA-%0x!7/$ۚ 2$ G<#hnI \jGg^K8[` Nb篴v;"ntW/ln3楶dռ}Ǝ[xz5 f&hbU~Zr޲Jsg QD.NjfV8@24|,p~;O1v/'UhkZ;#NG)"fzؓT\dhdCh~xd|)^;݉pfKдSk"R0˰^zs0Nh] @5[|sI7!F#BЄhB4!F#BЄhB4!F#BЄhB4!F)KÞz6fK̡#`WmI5wBȽU Hf) v:4jlfNAegg48tݝͱ[O])R?`>XUS^~|IW5~7w9B|g&;ڒDz+Hl߫Yg2W5+WP{~*ScN-o܅,Swg磇{ ֯aMk]nldy $-HRYob@#}-uG&H}`?e0+f88k..b#-N0 H,nn|-aG|qoca(u㌺]u{Tt y)x>5 KȲ$hn۳vpYTE;'T u3EH[~Z?l/Z Lh+JawRC߮]8sWOVr/o&cw6X.XmSPԝQk֐!5_}BbH,wu(q%]k˒rNCrC$8.HdXv^׻mG,`3A8.wpo:vc8,ˆՇ;Yͽ%l*oqٶtCE[|u⛿nywƼkb+K#eDm$^{aI'Ok‰C0Zw=yo E_uUT2쀗HJmt?sS'ۯm]! 5U7Pbx>` lVzzk 5vA.t:PW@ꭚRȓ~p}POզK8i9 GZ$X n:tFe0@^oo549cG7F  =Zde5 3"RWsnJP'UP+F}Cd=>}t=[ n'=p)S9/#qk }\Ine=E ;Fɹ\S̿A[ⳍeK˪:Յd܊x^<ڞF!RkA!p۾GYf :y"PeZ{%7>䜃qNO%0ղbigBA^T)@Ǝ'=_A@r{: _)pLF[f$ex-^ܬXn[p% aCH y7nw2\9X4eHێXDdIY{7]hui 0j-GlVߨl#vA©/伭ʙObx>*䦖u$m}^C GdW3ƿRM^=Zmygɳo|' K,Lrm,Lw{tDM=b*{Y#a*r㹼tL3qH'd֫}$] mCĵ@xv;>( Ɲ f*q^˱*xx\&':'La$h^HٵqK38Cp JTr(py'&HL!UĨt[<0@*ť7P<+^Q9(9/'Ow"#G 7ȃᬀ}8&O$3P͉/gJ6]9߹YO@?Uۜ2n/9Sl'aUǩ\{>Xsd6<.bJY*k B_Fb뾰6븿U |Ӑ/RC˅ qYO]8eNҦ2k2M^8%nNn7Һx:ۤ6vĹӡt}r&{Xp\l+H{{GV'l]*Ӓ3*sܔ׼c yY8Zb4bוf+HI EnIA|_K82 ww9 Mpyגf_Pi5,4hF"%*9Sn݉Y%TiY~=7#YZE^~O~^XU)RE6Ͼ?N-;{و?KPBЄhB4!F#BЄhB4!F#BЄhB4!F#BЄhB}֭W>4 {Sd뼮wI.%0q;zDMyK'8 2D e&BBwPRm-IP0RZmO~o%$8)r#+|)rD{* G w'j V{͆q[*uZ:ߍnf%-wǺ$_JIY@?$uz@vbퟷRo ]l9T,`ia-ёUwe^SӉϽFׁ4Z⼏ b,SvZo YhZJ/c)`{wÃIGЫ ݷ:  *S;\n# EMʲ\c!,"UݕHF9$ӶCcXOÇjFp3oZrr1/8QX50VG\p!K7>ZjX+tkCP+ZRH|u0br¾?Y|`qe-{S oe"ݱFgfş~iq`P:>S=IJsOK"ֳvЖHИ gA w]Fh7G0ZaUkn:sQES;E&[-NF^%{R]°PNǷSdе9:3  G.KKPghT8cYrK^S#\\"QF;w;m;i܄9@§'!uQp kؒxrIkI5C~5F;) ԩw{`IR\Xy9y56SAUOҲ HظSȃB>Tޮ} WVnѳv1#~:u֮ r`EUl`p8֡Y/ }p|f2WJ5wXO8nRvfTV#P[ Y -i/_݋!F[6X=pQ4.&Oڛ.89s^>V̏8ye^.VEbj8%``6i[W4S̬_$Ç+[G`rɊ_O.B{avju*)Q{NîvWQ[C[1sA@ D8]6V奒 5I(Hym}>-B}-mOwy!5yZw ]=HG 3@VG,⑴(fK2{;l ̫:7 /|Mo#T G`SO^[`fUϗ+g^3-<*IM%fh,Q@ߵz Hd*S^'2\ܛu @~p-؟MJ7!F#BЄhB4!F#BЄhB4!F#BЄhB4!F(oܶEnJod ڴkv ?I.'յ+sɑH.rG,  |8ht.K;: V,-@>zp6\#qCihFyv[xtQHaSזwܫgAPe^T4U";0 $D:P&qF\t 띅4W^q nS)2**/5`4Juw>|u2- y3^[ÈM/}?8r<Xg)LBwX{{B,jKIGa}1U/t2PS?LWj8ʸ>a6wʗ5#V1FFmnp7-o;8XYztֹWS21Sג@ 'zd =}9殜1ZK * |DxWŃO#'̳X<7%kc b܅ɐ.{Lk+mFm{D++bSx hV8#k"bom~ۮ iMi!WPrVK`>qUX[GvTwףH}SAԑQsYGY ".kvPn^݆ 14\Yxi($ y`\[on?Cnǿk, H`@6a-uZzRC\Nr3?n(3ˌ@pakOV95i=w+}!iS,LJm,c;~V?r!4eg%~ߣUro_:I?sn;t&ֲ ?>m|5v U _E4H`ڻPZᓼRwZ9A֡Ĝ:5:hM\uحW%ߎ96>lW8FeFK1nw;;k)tMsҘ^^i.gɱn+w#LwuE(chSq v(BF=pn%#P =Pvky{$!FNJp6-*q|u*tzKV.HY۷`Nie..֍kFy}gss[44q&+o'/`L~;M?%ibD:WS#s8WUp-h LB^7f n;-ެSaӋHR^]=ΡR"\ HWuR6N(uI+ ÇjjN-F#BЄhB4!F#BЄhB4!F#BЄhB4!F#B Ӕqy;78\R =i $r=6k_'H皒g!{ ']rƼ.K9V<, :Ifnw YÒߵH>q1]2׳sn-='yei$ jpY:i KYI8Ը8 bߘy?4e(s!ĘUa% u-іLTf5R%Ec}͐▜bXe1qrǸ=[}ZB[h;H#R9Ƞ-at+rPK iGr_uԮļ  9G?q arb{r0REgi`=5q'(( wSROb+Nw~*NxrE!e@>׵@.@ӊD4L>*YTKMngdbiH7Y+>};1;TOG0UAII?Jc76FI%+% {UV/SR}t;ƌSy$?!H䜟ql\V6ezB.JWR ,I!զ 4Waq,qGWi΂%76rX9:1pDn4O̩m %kPS3U/__(\ȥQZy{[ N㼞:|cЫn#!Ыi=7?Id_erJՌM)-k)&]"=hkQfxGf gՀüOLPSBЄhB4!F#BЄhB4!F#BЄhB4!F#BЄhB}yxy+Ay}U6? i}vˋAb{Zk{@g$\CуM䘬`vq~0 7c0a禨dKI+IPWD1Sq5l>XH$.*ߩl^@u+-nײF4 b2&ϳJ\(2H%f)GOOOM2w8#Xia7rbZ"ڊ1ͅU߻`tRO7ޟ?և]M@Ҙ3%l/q.-VMr׶Ԇ8",lmkxNk1/eXmOWKvL,x? x;˜3&4l<Le.chL:IgnulyG')ð½֬˙xY[3՘8S(,ӮsKLhp;Vޱ ͍I( Gq-ֹǗWI϶ur?)lS1 Q+S`n<|qm[ #sk{D'8ʩsIN,MiִrkdI+vF|~glZMŬ Œڗ#2sbDUI#=sӮvWO|y\s)1YHYwi@KaA^ 8 {jʳpw!~&rHÆ#VlgY\5 87ߊpKytѣw]; ڑDѴeb@Io:jؗ@(3UԓDy.<eT&dnI{4ܗ=uɗϤ0Y:']<;9.pGk ՜:im~[ڂ8{A@{ib 9)45{乛.mCU|"8zio|u(^{jН,NL>?Gkl{}4fD uwtӬٽCW= 4tMip*~WIJةO̲b/_ ׸݄uFԑ hV#vLӹ> r.r<-,EH$0 a&NcPr;nڶ=s<1ܒ1f=1q'VK?3#w<̿0 rnS4xK4Yj2+,X4Js\1%Y /OS&>0{]V[#u :騜 R~eopq?f1DMF#BЄhB4!F#BЄhB4!F#BЄhB4!F#B |ז?0y;go|r\Tؗ3ׂ U"Uz4'0~%|7  >y Jը5 +2vw=S]^z֟4՝Ĵ ncT y7-᧸P2E!BzdnԈu/jgu Z9!r#o?-vk岺 o'h-y+=o:mXGxEQ?k|qR_( J+nE#A,cwDII$j~>&pִ Tɮfdc`![Lx)+qyr>vIhU@we#ڻs'{᥾Ҥ3Hnl[XC1\:S>!|d\7D|bX47|cv! 7G(;ӈ {|2XFqL6ǵe}OI ՞ͺ\Mq,}Q\*jI+_'*xQCz8lrٖ6vʁ*kIqfLhvy6: 8/8]_:ҏsk u-aCCMGH iڞ5*I CZk15HT7=yFsR8Q0B`m"z~TE|">1? 5ʅgίE=:m֧n 9;_$2 Wc6:kkPU||7y?+<ЄhB4!F#BЄhB4!F#BЄhB4!F#BЄhB4!E+yn!cPK@eQ>ws U`2Ka+.X64i Qs)ŪvW}/y{z.nmz6F>Fǰ{Sm;BKE]I'IZ&A2P>WX m:(߸ Ү"'w}m4Ym\vjd,OyntǸ.`:l;\1bRVJ?ǵe7!; zn5XeIU.)#cGr2Vr8b]d:o -Ev(Tz L`Q/e;Ҽ"oF +^T`H݄_ڕ@:z|А\.$Havt.jh8՜V4aBw=+w}gy<F#BЄhB4!F#BЄhB4!F#BЄhB4!F#B12܏;\ H+ SO5\f{ ZSM+4!'T&/ 8{Ԍ+JO^lc14qhl w+)X%$b^P[}%4Ooɍ[X7.wmĨPzՌ~D{P]IJ\33pW bYer7ON㲪4D홱ɧ *_k"xv@*jUnKBAƁi]aZ ъ)[8;~o:ǽX噝j>V ҚqO/bX~EiY-=D},{WV k/Ԡ  q$=`Hu+6⣗:9X@nO$OoMo%gwKRP+[#'evNʦIm;|m.9ttka#v񬻕`>;Z rhF@,^i؞k vӕh1I#Lԧcyj,NG;(]l- h z^GBnBg䘙Va 67vi %X/SG羹G2-C`bBw~Q E.K"c`H:HiJ|fc@c= Q%!fu˄n{]ѩ6[$sNmR#^r9"r┦FnH>:X{TIv!HvQTW{1oG? [{nӒ\Wxh=j\){S#5ƒ)CQ ƷmῸsxR5{Sp"SN85qZm_7ӣGRB1['k_?қ~ {N|6=+TU[wmBv&:*bqV u)7!WMԣ!|5g-h>Ž5}S'rXaD_{ t;ȣ>gM]#M{(uӶsdPGn㿸F>ݷïWڥMGGE?e0GIQ#YT/} 뫊|iǮ4)aX=U7aݿ]pݿ=aՎ)i”R_9),}ā_ۍ>Krca(PI Hp6#ys¿Wڝm4W&>۸RԒcIO)=:wx妆c2jXGHIO~E~$cGU `/ )yg N+ 6㾜7Rג/Yϼ0HgxN6뾌Es[ B7vJo/c98!F#BЄhB4!F#BЄhB4!F#BЄhB4!F/ruby-prawn-2.1.0.orig/data/images/indexed_transparency_color.dat0000644000000000000000000000031612665203156023542 0ustar rootrootx @ q|#5Fj1RcH#5Fj1RcH#5Fj1RcH0RcH#5Fj1RcH#5Fj1RcH#5Fj3r/aH#5Fj1RcH#5Fj1RcH#5Fj1Rfaruby-prawn-2.1.0.orig/data/images/pigs.jpg0000644000000000000000000002274212725515642017117 0ustar rootrootJFIFHHC  !"$"$C\"F !1"2AQa#$Rq%37Bbcv&TUru$!"1Aq ? ]mOع7o ]=J6I#c\UEO~y?/^v1[??=gջ^ /_+x /Zq5_g٫MJg6XjUDkK ۱8̀fBsa`5 U%cC#ccW{/jYN6Lo1>#xӞ9 Oz.P[k/\_|"e^- /'kwR'^Ȳ2Tk]|4X"8O%[v9~8Ru `o^+Zf7iN^5ꊿ$_sq-xW٩*je#c5jDDF@v2jYV,wV XcX% Ƣ9.U>"7'#cMƧQ%KҚj 5i,,\][`¬΢VB6IխF9UUQZx~SzPO}d:3op[M_[}WNxݟR&Eف@fm9о8}#,.2xWwf񨳼_oNY)dEWNcc:<;nޓ{:CbƜ*Az%r)ڈyh\rܧJf\8(i"/YH~;+Z_ IM]KUɠ7鶹]*~ir,]5n; -ږl̞G)5r9E{uTC@Gj.P{sgSE}"FdEj*y,rOf,S7Tޖj~r~N61/HjE-[at%r?*koζIl0afX :{MctLDUkdX[t(0տr=4]x'G5WԣN29Dj19;Zy!r*HֹQ~Q IUMamr$0",jը_ڧSUdܣ\w㴖lYs2}8q5=sDco~I_z>oBf]ujnq]yLv}}+{+|$W#Xj~jI8<ʮ).%,/vTȞʱ1QM5"(j,jDȪinD-OZ}C ur$j'fG*i>OZ~2ܨ&fٽ}i}tE-;{,pOQUvr<^cSec]4ٌےP\>ϊGN3H9t]}sKt(p/N/6oJpI|UWHͯӼu%>[[Mk o5|cQX}%erG5ӗ]hxg$eqkzUBy!G:9QkѨEM;FeW Cw8nelS:&zq{ȌDn[]21X`m]ey򪪫yxW7eMnSR\i-I|5crLksə!gYOnr1 mѢ2dUodY>#ovWy]=nEvzޭ6.@bکjqZs TXڪuv˭lλ$ް<|UnƝ#1#X9UtM>D28Ξ]Ecd]hJfrRm6޶숨9o&,a\@}cmI KZEղ>&r#Q;i<~Dv^b,DvzV:|~ӫJ\\+6UpTkA$гӖJF۶k媈y9oUC6-El Qlm ΂S7Fsw<,a_pҦw\_ƾs@+tݪ"T}[qgYs*$H֚ !Qd=\iUttL . ^J "t+2sajUG?&ܽUWhEAp=׮eHІ嬨'1ԉ{rCWE4﨑5=R5ەω&.Likk2Jbm4+$dn_Ƣ-EV)-5-|,2N[r7~<:q~q+.4HINbkuZO^'8&1sY)Yu_zI\ՕQ|9Su_s7>~u hQz^"k]]Ro )p\jΠa2MKq}ls$cZdң_]z@&vQ])I~9F[5ڎoHG4GY/&e6Z<ũ+#d$IV1Wn"kіsnl֫2Du;1r kTהnoi|kcð:bxio2ds#܋Sji6;;dd4 [qy}D_76<T_X])hb ǿj8Fmq;%[it뜿 zUYj}c?߯9e}wtTSƩ:D&KYehG_r5(>VhM!f[MMEsVAhkhcdWvlW/m]ZFUZ n9r  z\Yɥ W]]fڤK:j)&dWUUBƸÒ1jZ~9ʶKt56,ٝ+s{BoJ!7欣27j*u+;#m%$jޏ]j_`T\79R3> өvK͛ҷ\(DF?+UU3k4I| 8r^/񩢢ͶW%eKlt፨UOIOU.oQoz1b{XU q7;O>LtuX=9UtM#r<+Phe ,QF"9ȋ9u&>q"_Klk+v^ݻ/o[IS1Y0\7$\1EVTS6*zUoe{SJ UٜtSTBujc^Tj5<||\y&əQw_vZX&=ɎcdH8IuKZ֢Z؜5T $+&A c騝]QdjC WJ竚:דECv kTgkw:F>YGG SʱvR Ŕܿtq69z&#%.U)Kj'gs%ÎWG\# -v˄ E_QU]"ziT q^QǷ*\iUI*5ȧ Vݱ D$TԴkMbTdcGD_)gsp},tW}-$ZFtD^D~_(.euՎRo-,|[Dĕݪyn6TٓRJ'W=|lҺG=_ϫ^u%?dh$*2ih4mm F¬5Sʭsީmwik+Q(}D+[U-| edU]5QwO]g'`مzUsa 1$k}F|}My0ߜkrIzݍZ꠶ӬM:v+9Ҷ>0ʪԶk;uϬy;9*諮Sck3n]$hnVg {u$dP_Bzsا{D&^bܡA;-xAV?3=eT|5,FF/EE޿2Cdv\nݾeOO%וT3 %r^U>hi el5Hx۵yͧq2]UQDRF44nDMGGJ&@Ƕ< OKM_ulV8v=r̲K}YxȑwbɷHNWTUEYf/ Y.9]*ٖ9к%F=cz։ekVHtTZ)#GvHᣦn=T>g*9bߐRSVDsMmQߟSNW9cUD$Dz nOApe#gm3饑Uj5j.ʭUK,aʯ4eC7SZ>W SPޜGUME/l,UW౶fFz"{c4*;x7ow[f~Ծ^]w_scN4˖ܨ]MEhmLתROSzNhr6A&)W|;۪am#%j9tӑU߅Nʛ5>5vH}U;UکϽzI?OKku S'UFڛTh6Hr"9ɿIɲԼpG-ڊ[5MV!ezښ9X+cG?^J;ql2`/ߎխWS˺yׯgof*,Wtj&tG|VTFEҮ˞i05;̡WLf7K*ȒXN =wJ6^nZ˽o"*-2ZinACD Systems Digital Imaging2004:08:10 10:14:040220627X]C       ]X *!"#12$a?+'.D䀐݉[NMHxb>ea&AѸq{`W9$;j; 8!pu 3:.:\cYOq]uyUY RBѯjgL FK.GjqT\H(D*hJ=1[ح+G'4! ԙD.4VˡuݪtVDhK}X` xxҞORFH98ȳ\ ~DFpT\,{r 7LlL}  B!r>|o cV]Fvgi"jW0| AsE&Q}LHl{`wm$FJFJ8?d7ZdKaY;캔MOZLmW'1%R82]Ӻr2Zr,XJ##M^0U#pv;P^#:oGكt趡 %'=>Ⱥy2ьc[ze1L&)!ĝau4Nb"\ ȪyE̒(nu y~49O[oDE⼕USǏ+[1c1c1c1c1c1c1c1c1gruby-prawn-2.1.0.orig/data/images/indexed_transparency.png0000644000000000000000000000075612665203156022370 0ustar rootrootPNG  IHDR^gAMA a cHRMz&u0`:pQ<PLTEqtRNS?*5bKGDhQ pHYs  IDATx@ð{F(h3|`H#5Fj1RcH#5Fj1RcH#5Fj1R3t0RcH#5Fj1RcH#5Fj1RcH#5FjG1RcH#5Fj1RcH#5Fj1RcH#5Fǰa,?#%tEXtdate:create2014-10-09T10:35:25+02:00U5%tEXtdate:modify2014-10-09T10:35:25+02:00IIENDB`ruby-prawn-2.1.0.orig/data/images/fractal.jpg0000644000000000000000000001476312725515642017575 0ustar rootrootJFIFHHAdobedC  !"$"$C = !"1AQ#2$34BCRaq7TUu3 !14AQT"6Sqr?];-YvY@{_mi/_h 'aWJj]?*>/tx]u?|Sz}w;rXIMH1DUGF;ȩo?:_-hhDc'gV"*]]rj^31ǚ"#ytMh 5&mcsUj*M֖v:+r92A(u+_Wg>4Wn{`>zq醁Yc)%>{&"*]~ߏ&^o5:jjbDD&Lۦ6ć#/g(S8 Α.䢞Zݪxs~7oLFil KnԮDz7OLDY&V>nԕ:6dNNDʧ]v\zMTxѫ|zߗ zizbw[> û ?_Req-].#Ql5tԒDٚ.NĻ?-jiL~*,LXBK]kܒkHG 蜶5:Y$֚Ny{+LGZwÒFdÛLV˚NZt#}&JY$fT]ZkWtj""lDW& p,Q9cƱ[eRDM7p0bYJu196ԟR\WwѿZ偯1GqM:{ C!ѸnŕQKRa1vG,uu{drz"qpz_ Lf[Q^ԙ1I\MlHŭ퇊駷um1I7??~oIo?n_?wљ nmrdz5loLTOZl9ɘn֩O鞊̔swK j< CWNdsH赔:ْHaj+{sD]vG)u1Xc3̬2^V2UbΓ܈ϔ@rԸd.V/2@[ [^Q*vls{9WG 0m7'c_^|$jDlxȻmWki4~^يq3Q}S+V*DmOݥU+ijE^ΣءXIҵP(]'ytձoZG5yk͚m-"]t/cQ2k#k LsBZoz];J5͍S-Ӵ'ӑ%nǔP9=#SE$bދ5ѹSyM9 Q)zN +Hlx_{P,gTt6G+ߡb55#6ksȻxdԽ__(y%ji!O4?/tQڊݕ :nTnqWˣXgxTTT)7T+-ٕb}i*ܮ#[#{nª(uc8l,Voa]dsQ#U|j@:kz7Qdaqٲȟ3wH4lr5D+U\r&f7-z83yJ̿ZUslgryɨ%03q3sgDK-Hm[Mw|Vk1KYHeCRv&v5RUbZ=ɶn鰐ȶw)5׿]cMOz[J_dpj4+QT䊨ۮ"ֱԭYݞFg!|2JF5W]+7o{m@ԍ.M3gEm:E'YeݜnnG:>=ReңX$kztdZ.ɸ2Wy 39QvfGzuX[m dDEUDsU@N͞41ObBץˑk1FmTUt<*Z=n~8䖮;[ډh[*6Mݿ* љ^KX6eZFBH;g#={w\2pK?*I4N}XYOtṼ8lm'Jz6zbD#c~HNi@1hˣzK㛌.$PW+mߢݗPWiX"֦)&Qj.l1yI\â.:n.n2^ #!e'Hߒm+EbqM@}qudiuh+LDEz9"Q#"^-j"ΆVYDȱ곢ۤb5"6HwMvKL&KISbKDD#&r$k^ݑT5Ґ ScUr*y=\Qۢ:t7K-˺\|diԬ'g|VHG5QeکZ 6Nao_Khl;:E٬r6sfcP^eA-\d35ў~5$j_pWtQ-1q2*աzFdGnTsQZ t2"[cbI,I=\g9mt g#Z&M͟,/ͻox%UTD^_+W:/U~vS EqٰȭUDUG=@ױ{Qrl*~جv?V(lQƛZDD~Md]Rݎ'@ w[s(VU>Zgruby-prawn-2.1.0.orig/data/shift_jis_text.txt0000644000000000000000000000001512665203156017757 0ustar rootrootCy[W ruby-prawn-2.1.0.orig/CONTRIBUTING.md0000644000000000000000000000157312665203156015522 0ustar rootroot1. Bug reports are welcome, but please make sure to include a minimal code sample that shows your problem. In most cases, we'll need you to give us an example that we can actually run, so include any necessary sample data. A screenshot or stack trace can also be helpful! 2. For all support requests and feature requests, please use the [Prawn mailing list](https://groups.google.com/forum/#!forum/prawn-ruby) instead of the Github tracker, or see if anyone is around in #prawn on Freenode to discuss your issue. If we find that you discovered a bug, or that your feature request is one that we want to continue to research and discuss on Github, we'll either ask you to file a ticket or file one on your behalf. 3. Pull requests for bug fixes or enhancements are welcome. Feel free to open them in the early stages of your work so that we can give feedback and discuss ideas together. ruby-prawn-2.1.0.orig/lib/0000755000000000000000000000000012665203156014031 5ustar rootrootruby-prawn-2.1.0.orig/lib/prawn/0000755000000000000000000000000012665203156015160 5ustar rootrootruby-prawn-2.1.0.orig/lib/prawn/repeater.rb0000644000000000000000000000635412665203156017324 0ustar rootroot# encoding: utf-8 # # repeater.rb : Implements repeated page elements. # Heavy inspired by repeating_element() in PDF::Wrapper # http://pdf-wrapper.rubyforge.org/ # # Copyright November 2009, Gregory Brown. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. module Prawn class Document # A list of all repeaters in the document. # See Document#repeat for details # # @private def repeaters @repeaters ||= [] end # @group Experimental API # Provides a way to execute a block of code repeatedly based on a # page_filter. Since Stamp is used under the hood, this method is very space # efficient. # # Available page filters are: # :all -- repeats on every page # :odd -- repeats on odd pages # :even -- repeats on even pages # some_array -- repeats on every page listed in the array # some_range -- repeats on every page included in the range # some_lambda -- yields page number and repeats for true return values # # Also accepts an optional second argument for dynamic content which executes the code # in the context of the filtered pages without using a Stamp. # # Example: # # Prawn::Document.generate("repeat.pdf", :skip_page_creation => true) do # # repeat :all do # draw_text "ALLLLLL", :at => bounds.top_left # end # # repeat :odd do # draw_text "ODD", :at => [0,0] # end # # repeat :even do # draw_text "EVEN", :at => [0,0] # end # # repeat [1,2] do # draw_text "[1,2]", :at => [100,0] # end # # repeat 2..4 do # draw_text "2..4", :at => [200,0] # end # # repeat(lambda { |pg| pg % 3 == 0 }) do # draw_text "Every third", :at => [250, 20] # end # # 10.times do # start_new_page # draw_text "A wonderful page", :at => [400,400] # end # # repeat(:all, :dynamic => true) do # text page_number, :at => [500, 0] # end # # end # def repeat(page_filter, options = {}, &block) repeaters << Prawn::Repeater.new(self, page_filter, !!options[:dynamic], &block) end end class Repeater #:nodoc: class << self attr_writer :count def count @count ||= 0 end end attr_reader :name def initialize(document, page_filter, dynamic = false, &block) @document = document @page_filter = page_filter @dynamic = dynamic @stamp_name = "prawn_repeater(#{Repeater.count})" @document.create_stamp(@stamp_name, &block) unless dynamic @block = block if dynamic @graphic_state = document.state.page.graphic_state.dup Repeater.count += 1 end def match?(page_number) @document.page_match?(@page_filter, page_number) end def run(page_number) if !@dynamic @document.stamp(@stamp_name) if match?(page_number) elsif @block && match?(page_number) @document.save_graphics_state(@graphic_state) do @document.send(:freeze_stamp_graphics) @block.call end end end end end ruby-prawn-2.1.0.orig/lib/prawn/text/0000755000000000000000000000000012665203156016144 5ustar rootrootruby-prawn-2.1.0.orig/lib/prawn/text/formatted.rb0000644000000000000000000000024112665203156020453 0ustar rootroot# encoding: utf-8 require_relative "formatted/wrap" require_relative "formatted/box" require_relative "formatted/parser" require_relative "formatted/fragment" ruby-prawn-2.1.0.orig/lib/prawn/text/box.rb0000644000000000000000000001313512665203156017264 0ustar rootroot# encoding: utf-8 # text/rectangle.rb : Implements text boxes # # Copyright November 2009, Daniel Nelson. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # require_relative "formatted/box" module Prawn module Text # @group Stable API # Draws the requested text into a box. When the text overflows # the rectangle, you shrink to fit, or truncate the text. Text # boxes are independent of the document y position. # # == Encoding # # Note that strings passed to this function should be encoded as UTF-8. # If you get unexpected characters appearing in your rendered document, # check this. # # If the current font is a built-in one, although the string must be # encoded as UTF-8, only characters that are available in WinAnsi # are allowed. # # If an empty box is rendered to your PDF instead of the character you # wanted it usually means the current font doesn't include that character. # # == Options (default values marked in []) # # :kerning:: boolean. Whether or not to use kerning (if it # is available with the current font) # [value of document.default_kerning?] # :size:: number. The font size to use. [current font # size] # :character_spacing:: number. The amount of space to add # to or remove from the default character # spacing. [0] # :disable_wrap_by_char:: boolean Whether # or not to prevent mid-word breaks when text does not fit in box. [false] # :mode:: symbol. The text rendering mode. See # documentation for Prawn::Document#text_rendering_mode # for a list of valid options. [:fill] # :style:: The style to use. The requested style must be part of # the current font familly. [current style] # # :at:: # [x, y]. The upper left corner of the box # [@document.bounds.left, @document.bounds.top] # :width:: # number. The width of the box [@document.bounds.right - @at[0]] # :height:: # number. The height of the box [default_height()] # :direction:: # :ltr, :rtl, Direction of the text (left-to-right # or right-to-left) [value of document.text_direction] # :fallback_fonts:: # An array of font names. Each name must be the name of an AFM font or # the name that was used to register a family of TTF fonts (see # Prawn::Document#font_families). If present, then each glyph will be # rendered using the first font that includes the glyph, starting with # the current font and then moving through :fallback_fonts from # left to right. # :align:: # :left, :center, :right, or # :justify Alignment within the bounding box # [:left if direction is :ltr, :right if direction is :rtl] # :valign:: # :top, :center, or :bottom. Vertical # alignment within the bounding box [:top] # :rotate:: # number. The angle to rotate the text # :rotate_around:: # :center, :upper_left, :upper_right, # :lower_right, or :lower_left. The point around which # to rotate the text [:upper_left] # :leading:: # number. Additional space between lines [value of # document.default_leading] # :single_line:: # boolean. If true, then only the first line will be drawn [false] # :overflow:: # :truncate, :shrink_to_fit, or :expand # This controls the behavior when the amount of text # exceeds the available space. [:truncate] # :min_font_size:: # number. The minimum font size to use when :overflow is set to # :shrink_to_fit (that is the font size will not be reduced to less than # this value, even if it means that some text will be cut off). [5] # # == Returns # # Returns any text that did not print under the current settings. # # == Exceptions # # Raises Prawn::Errors::CannotFit if not wide enough to print # any text # def text_box(string, options = {}) options = options.dup options[:document] = self box = if p = options.delete(:inline_format) p = [] unless p.is_a?(Array) array = self.text_formatter.format(string, *p) Text::Formatted::Box.new(array, options) else Text::Box.new(string, options) end box.render end # @group Experimental API # Generally, one would use the Prawn::Text#text_box convenience # method. However, using Text::Box.new in conjunction with # #render(:dry_run=> true) enables one to do look-ahead calculations prior # to placing text on the page, or to determine how much vertical space was # consumed by the printed text # class Box < Prawn::Text::Formatted::Box def initialize(string, options = {}) super([{ :text => string }], options) end def render(flags = {}) leftover = super(flags) leftover.collect { |hash| hash[:text] }.join end end end end ruby-prawn-2.1.0.orig/lib/prawn/text/formatted/0000755000000000000000000000000012665203156020131 5ustar rootrootruby-prawn-2.1.0.orig/lib/prawn/text/formatted/parser.rb0000644000000000000000000002025512665203156021756 0ustar rootroot# encoding: utf-8 # text/formatted/parser.rb : Implements a bi-directional parser between a subset # of html and formatted text arrays # # Copyright February 2010, Daniel Nelson. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn module Text module Formatted class Parser # @group Extension API PARSER_REGEX = begin regex_string = "\n|" \ "||" \ "||" \ "||" \ "||" \ "||" \ "||" \ "]*>||" \ "]*>||" \ "]*>||" \ "||" \ "||" \ "]*>||" \ "[^<\n]+" Regexp.new(regex_string, Regexp::MULTILINE) end def self.format(string, *args) tokens = string.gsub(//, "\n").scan(PARSER_REGEX) self.array_from_tokens(tokens) end def self.to_string(array) prefixes = { :bold => "", :italic => "", :underline => "", :strikethrough => "", :subscript => "", :superscript => "" } suffixes = { :bold => "", :italic => "", :underline => "", :strikethrough => "", :subscript => "", :superscript => "" } array.collect do |hash| prefix = "" suffix = "" if hash[:styles] hash[:styles].each do |style| prefix = prefix + prefixes[style] suffix = suffixes[style] + suffix end end font = hash[:font] ? " name='#{hash[:font]}'" : nil size = hash[:size] ? " size='#{hash[:size]}'" : nil if hash[:character_spacing] character_spacing = " character_spacing='#{hash[:character_spacing]}'" else character_spacing = nil end if font || size || character_spacing prefix = prefix + "" suffix = "" end link = hash[:link] ? " href='#{hash[:link]}'" : nil anchor = hash[:anchor] ? " anchor='#{hash[:anchor]}'" : nil if link || anchor prefix = prefix + "" suffix = "" end if hash[:color] if hash[:color].kind_of?(Array) prefix = prefix + "" else prefix = prefix + "" end suffix = "" end string = hash[:text].gsub("&", "&").gsub(">", ">").gsub("<", "<") prefix + string + suffix end.join end def self.array_paragraphs(array) #:nodoc: paragraphs = [] paragraph = [] previous_string = "\n" scan_pattern = /[^\n]+|\n/ array.each do |hash| hash[:text].scan(scan_pattern).each do |string| if string == "\n" paragraph << hash.dup.merge(:text => "\n") if previous_string == "\n" paragraphs << paragraph unless paragraph.empty? paragraph = [] else paragraph << hash.dup.merge(:text => string) end previous_string = string end end paragraphs << paragraph unless paragraph.empty? paragraphs end def self.array_from_tokens(tokens) array = [] styles = [] colors = [] link = nil anchor = nil local = nil fonts = [] sizes = [] character_spacings = [] while token = tokens.shift case token when "", "" styles << :bold when "", "" styles << :italic when "" styles << :underline when "" styles << :strikethrough when "" styles << :subscript when "" styles << :superscript when "", "" styles.delete(:bold) when "", "" styles.delete(:italic) when "" styles.delete(:underline) when "" styles.delete(:strikethrough) when "" styles.delete(:subscript) when "" styles.delete(:superscript) when "", "" link = nil anchor = nil local = nil when "" colors.pop when "" fonts.pop sizes.pop character_spacings.pop else if token =~ /^]*>$/ or token =~ /^]*>$/ matches = /href="([^"]*)"/.match(token) || /href='([^']*)'/.match(token) link = matches[1] unless matches.nil? matches = /anchor="([^"]*)"/.match(token) || /anchor='([^']*)'/.match(token) anchor = matches[1] unless matches.nil? matches = /local="([^"]*)"/.match(token) || /local='([^']*)'/.match(token) local = matches[1] unless matches.nil? elsif token =~ /^]*>$/ matches = /rgb="#?([^"]*)"/.match(token) || /rgb='#?([^']*)'/.match(token) colors << matches[1] if matches matches = /c="#?([^"]*)" +m="#?([^"]*)" +y="#?([^"]*)" +k="#?([^"]*)"/.match(token) || /c='#?([^']*)' +m='#?([^']*)' +y='#?([^']*)' +k='#?([^']*)'/.match(token) colors << [matches[1].to_i, matches[2].to_i, matches[3].to_i, matches[4].to_i] if matches # intend to support rgb="#ffffff" or rgb='#ffffff', # r="255" g="255" b="255" or r='255' g='255' b='255', # and c="100" m="100" y="100" k="100" or # c='100' m='100' y='100' k='100' # color = { :rgb => "#ffffff" } # color = { :r => 255, :g => 255, :b => 255 } # color = { :c => 100, :m => 100, :y => 100, :k => 100 } elsif token =~ /^]*>$/ matches = /name="([^"]*)"/.match(token) || /name='([^']*)'/.match(token) fonts << matches[1] unless matches.nil? matches = /size="([^"]*)"/.match(token) || /size='([^']*)'/.match(token) sizes << matches[1].to_f unless matches.nil? matches = /character_spacing="([^"]*)"/.match(token) || /character_spacing='([^']*)'/.match(token) character_spacings << matches[1].to_f unless matches.nil? else string = token.gsub("<", "<").gsub(">", ">").gsub("&", "&") array << { :text => string, :styles => styles.dup, :color => colors.last, :local => local, :link => link, :anchor => anchor, :font => fonts.last, :size => sizes.last, :character_spacing => character_spacings.last } end end end array end end end end end ruby-prawn-2.1.0.orig/lib/prawn/text/formatted/fragment.rb0000644000000000000000000001345712665203156022273 0ustar rootroot# encoding: utf-8 # text/formatted/fragment.rb : Implements information about a formatted fragment # # Copyright March 2010, Daniel Nelson. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. module Prawn module Text module Formatted # Prawn::Text::Formatted::Fragment is a state store for a formatted text # fragment. It does not render anything. # # @private class Fragment attr_reader :format_state, :text attr_writer :width attr_accessor :line_height, :descender, :ascender attr_accessor :word_spacing, :left, :baseline def initialize(text, format_state, document) @format_state = format_state @document = document @word_spacing = 0 # keep the original value of "text", so we can reinitialize @text if formatting parameters # like text direction are changed @original_text = text @text = process_text(@original_text) end def width if @word_spacing == 0 then @width else @width + @word_spacing * space_count end end def height top - bottom end def subscript? styles.include?(:subscript) end def superscript? styles.include?(:superscript) end def y_offset if subscript? then -descender elsif superscript? then 0.85 * ascender else 0 end end def bounding_box [left, bottom, right, top] end def absolute_bounding_box box = bounding_box box[0] += @document.bounds.absolute_left box[2] += @document.bounds.absolute_left box[1] += @document.bounds.absolute_bottom box[3] += @document.bounds.absolute_bottom box end def underline_points y = baseline - 1.25 [[left, y], [right, y]] end def strikethrough_points y = baseline + ascender * 0.3 [[left, y], [right, y]] end def styles @format_state[:styles] || [] end def link @format_state[:link] end def anchor @format_state[:anchor] end def local @format_state[:local] end def color @format_state[:color] end def font @format_state[:font] end def size @format_state[:size] end def character_spacing @format_state[:character_spacing] || @document.character_spacing end def direction @format_state[:direction] end def default_direction=(direction) unless @format_state[:direction] @format_state[:direction] = direction @text = process_text(@original_text) end end def include_trailing_white_space! @format_state.delete(:exclude_trailing_white_space) @text = process_text(@original_text) end def space_count @text.count(" ") end def callback_objects callback = @format_state[:callback] if callback.nil? [] elsif callback.is_a?(Array) callback else [callback] end end def right left + width end def top baseline + ascender end def bottom baseline - descender end def top_left [left, top] end def top_right [right, top] end def bottom_right [right, bottom] end def bottom_left [left, bottom] end def absolute_left absolute_bounding_box[0] end def absolute_right absolute_bounding_box[2] end def absolute_top absolute_bounding_box[3] end def absolute_bottom absolute_bounding_box[1] end def absolute_top_left [absolute_left, absolute_top] end def absolute_top_right [absolute_right, absolute_top] end def absolute_bottom_left [absolute_left, absolute_bottom] end def absolute_bottom_right [absolute_right, absolute_bottom] end private def process_text(text) string = strip_zero_width_spaces(text) if exclude_trailing_white_space? string = string.rstrip if soft_hyphens_need_processing?(string) string = process_soft_hyphens(string[0..-2]) + string[-1..-1] end else if soft_hyphens_need_processing?(string) string = process_soft_hyphens(string) end end case direction when :rtl string.reverse else string end end def exclude_trailing_white_space? @format_state[:exclude_trailing_white_space] end def soft_hyphens_need_processing?(string) string.length > 0 && normalized_soft_hyphen end def normalized_soft_hyphen @format_state[:normalized_soft_hyphen] end def process_soft_hyphens(string) if string.encoding != normalized_soft_hyphen.encoding string.force_encoding(normalized_soft_hyphen.encoding) end string.gsub(normalized_soft_hyphen, "") end def strip_zero_width_spaces(string) if string.encoding == ::Encoding::UTF_8 string.gsub(Prawn::Text::ZWSP, "") else string end end end end end end ruby-prawn-2.1.0.orig/lib/prawn/text/formatted/wrap.rb0000644000000000000000000001233012665203156021426 0ustar rootroot# encoding: utf-8 # wrap.rb: Handles text wrapping for for formatted text # # Contributed by Daniel Nelson # # This is free software. Please see the LICENSE and COPYING files for details. require_relative "line_wrap" require_relative "arranger" module Prawn module Text module Formatted #:nodoc: # @private module Wrap #:nodoc: def initialize(array, options) @line_wrap = Prawn::Text::Formatted::LineWrap.new @arranger = Prawn::Text::Formatted::Arranger.new(@document, :kerning => options[:kerning]) @disable_wrap_by_char = options[:disable_wrap_by_char] end # See the developer documentation for PDF::Core::Text#wrap # # Formatted#wrap should set the following variables: # @line_height:: # the height of the tallest fragment in the last printed line # @descender:: # the descender height of the tallest fragment in the last # printed line # @ascender:: # the ascender heigth of the tallest fragment in the last # printed line # @baseline_y:: # the baseline of the current line # @nothing_printed:: # set to true until something is printed, then false # @everything_printed:: # set to false until everything printed, then true # # Returns any formatted text that was not printed # def wrap(array) #:nodoc: initialize_wrap(array) stop = false while !stop # wrap before testing if enough height for this line because the # height of the highest fragment on this line will be used to # determine the line height @line_wrap.wrap_line(:document => @document, :kerning => @kerning, :width => available_width, :arranger => @arranger, :disable_wrap_by_char => @disable_wrap_by_char) if enough_height_for_this_line? move_baseline_down print_line else stop = true end stop ||= @single_line || @arranger.finished? end @text = @printed_lines.join("\n") @everything_printed = @arranger.finished? @arranger.unconsumed end private def print_line @nothing_printed = false printed_fragments = [] fragments_this_line = [] word_spacing = word_spacing_for_this_line while fragment = @arranger.retrieve_fragment fragment.word_spacing = word_spacing if fragment.text == "\n" printed_fragments << "\n" if @printed_lines.last == "" break end printed_fragments << fragment.text fragments_this_line << fragment end accumulated_width = 0 fragments_this_line.reverse! if @direction == :rtl fragments_this_line.each do |fragment_this_line| fragment_this_line.default_direction = @direction format_and_draw_fragment(fragment_this_line, accumulated_width, @line_wrap.width, word_spacing) accumulated_width += fragment_this_line.width end @printed_lines << printed_fragments.map { |s| s.force_encoding(::Encoding::UTF_8) }.join end def word_spacing_for_this_line if @align == :justify && @line_wrap.space_count > 0 && !@line_wrap.paragraph_finished? (available_width - @line_wrap.width) / @line_wrap.space_count else 0 end end def enough_height_for_this_line? @line_height = @arranger.max_line_height @descender = @arranger.max_descender @ascender = @arranger.max_ascender if @baseline_y == 0 diff = @ascender + @descender else diff = @descender + @line_height + @leading end require_relatived_total_height = @baseline_y.abs + diff if require_relatived_total_height > @height + 0.0001 # no room for the full height of this line @arranger.repack_unretrieved false else true end end def initialize_wrap(array) @text = nil @arranger.format_array = array # these values will depend on the maximum value within a given line @line_height = 0 @descender = 0 @ascender = 0 @baseline_y = 0 @printed_lines = [] @nothing_printed = true @everything_printed = false end def format_and_draw_fragment(fragment, accumulated_width, line_width, word_spacing) @arranger.apply_color_and_font_settings(fragment) do draw_fragment(fragment, accumulated_width, line_width, word_spacing) end end end end end end ruby-prawn-2.1.0.orig/lib/prawn/text/formatted/box.rb0000644000000000000000000005236712665203156021263 0ustar rootroot# encoding: utf-8 # text/formatted/rectangle.rb : Implements text boxes with formatted text # # Copyright February 2010, Daniel Nelson. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn module Text module Formatted # @group Stable API # Draws the requested formatted text into a box. When the text overflows # the rectangle shrink to fit or truncate the text. Text boxes are # independent of the document y position. # # == Formatted Text Array # # Formatted text is comprised of an array of hashes, where each hash # defines text and format information. As of the time of writing, the # following hash options are supported: # # :text:: # the text to format according to the other hash options # :styles:: # an array of styles to apply to this text. Available styles include # :bold, :italic, :underline, :strikethrough, :subscript, and # :superscript # :size:: # a number denoting the font size to apply to this text # :character_spacing:: # a number denoting how much to increase or decrease the default # spacing between characters # :font:: # the name of a font. The name must be an AFM font with the desired # faces or must be a font that is already registered using # Prawn::Document#font_families # :color:: # anything compatible with Prawn::Graphics::Color#fill_color and # Prawn::Graphics::Color#stroke_color # :link:: # a URL to which to create a link. A clickable link will be created # to that URL. Note that you must explicitly underline and color using # the appropriate tags if you which to draw attention to the link # :anchor:: # a destination that has already been or will be registered using # PDF::Core::Destinations#add_dest. A clickable link will be # created to that destination. Note that you must explicitly underline # and color using the appropriate tags if you which to draw attention # to the link # :local:: # a file or application to be opened locally. A clickable link will be # created to the provided local file or application. If the file is # another PDF, it will be opened in a new window. Note that you must # explicitly underline and color using the appropriate tags if you which # to draw attention to the link # :draw_text_callback: # if provided, this Proc will be called instead of #draw_text! once # per fragment for every low-level addition of text to the page. # :callback:: # an object (or array of such objects) with two methods: # #render_behind and #render_in_front, which are called immediately # prior to and immediately after rendring the text fragment and which # are passed the fragment as an argument # # == Example # # formatted_text_box([{ :text => "hello" }, # { :text => "world", # :size => 24, # :styles => [:bold, :italic] }]) # # == Options # # Accepts the same options as Text::Box with the below exceptions # # == Returns # # Returns a formatted text array representing any text that did not print # under the current settings. # # == Exceptions # # Raises "Bad font family" if no font family is defined for the current font # # Raises Prawn::Errors::CannotFit if not wide enough to print # any text # def formatted_text_box(array, options = {}) Text::Formatted::Box.new(array, options.merge(:document => self)).render end # Generally, one would use the Prawn::Text::Formatted#formatted_text_box # convenience method. However, using Text::Formatted::Box.new in # conjunction with #render(:dry_run => true) enables one to do look-ahead # calculations prior to placing text on the page, or to determine how much # vertical space was consumed by the printed text # class Box include Prawn::Text::Formatted::Wrap # @group Experimental API # The text that was successfully printed (or, if dry_run was # used, the text that would have been successfully printed) attr_reader :text # True if nothing printed (or, if dry_run was # used, nothing would have been successfully printed) def nothing_printed? @nothing_printed end # True if everything printed (or, if dry_run was # used, everything would have been successfully printed) def everything_printed? @everything_printed end # The upper left corner of the text box attr_reader :at # The line height of the last line printed attr_reader :line_height # The height of the ascender of the last line printed attr_reader :ascender # The height of the descender of the last line printed attr_reader :descender # The leading used during printing attr_reader :leading def line_gap line_height - (ascender + descender) end # See Prawn::Text#text_box for valid options # def initialize(formatted_text, options = {}) @inked = false Prawn.verify_options(valid_options, options) options = options.dup self.class.extensions.reverse_each { |e| extend e } @overflow = options[:overflow] || :truncate @disable_wrap_by_char = options[:disable_wrap_by_char] self.original_text = formatted_text @text = nil @document = options[:document] @direction = options[:direction] || @document.text_direction @fallback_fonts = options[:fallback_fonts] || @document.fallback_fonts @at = (options[:at] || [@document.bounds.left, @document.bounds.top]).dup @width = options[:width] || @document.bounds.right - @at[0] @height = options[:height] || default_height @align = options[:align] || (@direction == :rtl ? :right : :left) @vertical_align = options[:valign] || :top @leading = options[:leading] || @document.default_leading @character_spacing = options[:character_spacing] || @document.character_spacing @mode = options[:mode] || @document.text_rendering_mode @rotate = options[:rotate] || 0 @rotate_around = options[:rotate_around] || :upper_left @single_line = options[:single_line] @draw_text_callback = options[:draw_text_callback] # if the text rendering mode is :unknown, force it back to :fill if @mode == :unknown @mode = :fill end if @overflow == :expand # if set to expand, then we simply set the bottom # as the bottom of the document bounds, since that # is the maximum we should expand to @height = default_height @overflow = :truncate end @min_font_size = options[:min_font_size] || 5 if options[:kerning].nil? then options[:kerning] = @document.default_kerning? end @options = { :kerning => options[:kerning], :size => options[:size], :style => options[:style] } super(formatted_text, options) end # Render text to the document based on the settings defined in initialize. # # In order to facilitate look-ahead calculations, render accepts # a :dry_run => true option. If provided, then everything is # executed as if rendering, with the exception that nothing is drawn on # the page. Useful for look-ahead computations of height, unprinted text, # etc. # # Returns any text that did not print under the current settings # def render(flags = {}) unprinted_text = [] @document.save_font do @document.character_spacing(@character_spacing) do @document.text_rendering_mode(@mode) do process_options text = normalized_text(flags) @document.font_size(@font_size) do shrink_to_fit(text) if @overflow == :shrink_to_fit process_vertical_alignment(text) @inked = true unless flags[:dry_run] if @rotate != 0 && @inked unprinted_text = render_rotated(text) else unprinted_text = wrap(text) end @inked = false end end end end unprinted_text.map do |e| e.merge(:text => @document.font.to_utf8(e[:text])) end end # The width available at this point in the box # def available_width @width end # The height actually used during the previous render # def height return 0 if @baseline_y.nil? || @descender.nil? (@baseline_y - @descender).abs end # fragment is a Prawn::Text::Formatted::Fragment object # def draw_fragment(fragment, accumulated_width = 0, line_width = 0, word_spacing = 0) #:nodoc: case(@align) when :left x = @at[0] when :center x = @at[0] + @width * 0.5 - line_width * 0.5 when :right x = @at[0] + @width - line_width when :justify if @direction == :ltr x = @at[0] else x = @at[0] + @width - line_width end end x += accumulated_width y = @at[1] + @baseline_y y += fragment.y_offset fragment.left = x fragment.baseline = y if @inked draw_fragment_underlays(fragment) @document.word_spacing(word_spacing) { if @draw_text_callback @draw_text_callback.call(fragment.text, :at => [x, y], :kerning => @kerning) else @document.draw_text!(fragment.text, :at => [x, y], :kerning => @kerning) end } draw_fragment_overlays(fragment) end end # @group Extension API # Example (see Prawn::Text::Core::Formatted::Wrap for what is required # of the wrap method if you want to override the default wrapping # algorithm): # # # module MyWrap # # def wrap(array) # initialize_wrap([{ :text => 'all your base are belong to us' }]) # @line_wrap.wrap_line(:document => @document, # :kerning => @kerning, # :width => 10000, # :arranger => @arranger) # fragment = @arranger.retrieve_fragment # format_and_draw_fragment(fragment, 0, @line_wrap.width, 0) # [] # end # # end # # Prawn::Text::Formatted::Box.extensions << MyWrap # # box = Prawn::Text::Formatted::Box.new('hello world') # box.render('why can't I print anything other than' + # '"all your base are belong to us"?') # # def self.extensions @extensions ||= [] end # @private def self.inherited(base) extensions.each { |e| base.extensions << e } end def valid_options PDF::Core::Text::VALID_OPTIONS + [ :at, :height, :width, :align, :valign, :rotate, :rotate_around, :overflow, :min_font_size, :disable_wrap_by_char, :leading, :character_spacing, :mode, :single_line, :document, :direction, :fallback_fonts, :draw_text_callback ] end private def normalized_text(flags) text = normalize_encoding text.each { |t| t.delete(:color) } if flags[:dry_run] text end def original_text @original_array.collect(&:dup) end def original_text=(formatted_text) @original_array = formatted_text end def normalize_encoding formatted_text = original_text unless @fallback_fonts.empty? formatted_text = process_fallback_fonts(formatted_text) end formatted_text.each do |hash| if hash[:font] @document.font(hash[:font]) do hash[:text] = @document.font.normalize_encoding(hash[:text]) end else hash[:text] = @document.font.normalize_encoding(hash[:text]) end end formatted_text end def process_fallback_fonts(formatted_text) modified_formatted_text = [] formatted_text.each do |hash| fragments = analyze_glyphs_for_fallback_font_support(hash) modified_formatted_text.concat(fragments) end modified_formatted_text end def analyze_glyphs_for_fallback_font_support(hash) font_glyph_pairs = [] original_font = @document.font.family fragment_font = hash[:font] || original_font fallback_fonts = @fallback_fonts.dup # always default back to the current font if the glyph is missing from # all fonts fallback_fonts << fragment_font @document.save_font do hash[:text].each_char do |char| font_glyph_pairs << [find_font_for_this_glyph(char, fragment_font, fallback_fonts.dup), char] end end # Don't add a :font to fragments if it wasn't there originally if hash[:font].nil? font_glyph_pairs.each do |pair| pair[0] = nil if pair[0] == original_font end end form_fragments_from_like_font_glyph_pairs(font_glyph_pairs, hash) end def find_font_for_this_glyph(char, current_font, fallback_fonts) @document.font(current_font) if fallback_fonts.length == 0 || @document.font.glyph_present?(char) current_font else find_font_for_this_glyph(char, fallback_fonts.shift, fallback_fonts) end end def form_fragments_from_like_font_glyph_pairs(font_glyph_pairs, hash) fragments = [] fragment = nil current_font = nil font_glyph_pairs.each do |font, char| if font != current_font || fragments.count == 0 current_font = font fragment = hash.dup fragment[:text] = char fragment[:font] = font unless font.nil? fragments << fragment else fragment[:text] += char end end fragments end def move_baseline_down if @baseline_y == 0 @baseline_y = -@ascender else @baseline_y -= (@line_height + @leading) end end # Returns the default height to be used if none is provided or if the # overflow option is set to :expand. If we are in a stretchy bounding # box, assume we can stretch to the bottom of the innermost non-stretchy # box. # def default_height # Find the "frame", the innermost non-stretchy bbox. frame = @document.bounds frame = frame.parent while frame.stretchy? && frame.parent @at[1] + @document.bounds.absolute_bottom - frame.absolute_bottom end def process_vertical_alignment(text) # The vertical alignment must only be done once per text box, but # we need to wait until render() is called so that the fonts are set # up properly for wrapping. So guard with a boolean to ensure this is # only run once. return if defined?(@vertical_alignment_processed) && @vertical_alignment_processed @vertical_alignment_processed = true return if @vertical_align == :top wrap(text) case @vertical_align when :center @at[1] -= (@height - height + @descender) * 0.5 when :bottom @at[1] -= (@height - height) end @height = height end # Decrease the font size until the text fits or the min font # size is reached def shrink_to_fit(text) loop do if @disable_wrap_by_char && @font_size > @min_font_size begin wrap(text) rescue Errors::CannotFit # Ignore errors while we can still attempt smaller # font sizes. end else wrap(text) end break if @everything_printed || @font_size <= @min_font_size @font_size = [@font_size - 0.5, @min_font_size].max @document.font_size = @font_size end end def process_options # must be performed within a save_font block because # document.process_text_options sets the font @document.process_text_options(@options) @font_size = @options[:size] @kerning = @options[:kerning] end def render_rotated(text) unprinted_text = '' case @rotate_around when :center x = @at[0] + @width * 0.5 y = @at[1] - @height * 0.5 when :upper_right x = @at[0] + @width y = @at[1] when :lower_right x = @at[0] + @width y = @at[1] - @height when :lower_left x = @at[0] y = @at[1] - @height else x = @at[0] y = @at[1] end @document.rotate(@rotate, :origin => [x, y]) do unprinted_text = wrap(text) end unprinted_text end def draw_fragment_underlays(fragment) fragment.callback_objects.each do |obj| obj.render_behind(fragment) if obj.respond_to?(:render_behind) end end def draw_fragment_overlays(fragment) draw_fragment_overlay_styles(fragment) draw_fragment_overlay_link(fragment) draw_fragment_overlay_anchor(fragment) draw_fragment_overlay_local(fragment) fragment.callback_objects.each do |obj| obj.render_in_front(fragment) if obj.respond_to?(:render_in_front) end end def draw_fragment_overlay_link(fragment) return unless fragment.link box = fragment.absolute_bounding_box @document.link_annotation(box, :Border => [0, 0, 0], :A => { :Type => :Action, :S => :URI, :URI => PDF::Core::LiteralString.new(fragment.link) }) end def draw_fragment_overlay_anchor(fragment) return unless fragment.anchor box = fragment.absolute_bounding_box @document.link_annotation(box, :Border => [0, 0, 0], :Dest => fragment.anchor) end def draw_fragment_overlay_local(fragment) return unless fragment.local box = fragment.absolute_bounding_box @document.link_annotation(box, :Border => [0, 0, 0], :A => { :Type => :Action, :S => :Launch, :F => PDF::Core::LiteralString.new(fragment.local), :NewWindow => true }) end def draw_fragment_overlay_styles(fragment) underline = fragment.styles.include?(:underline) if underline @document.stroke_line(fragment.underline_points) end strikethrough = fragment.styles.include?(:strikethrough) if strikethrough @document.stroke_line(fragment.strikethrough_points) end end end end end end ruby-prawn-2.1.0.orig/lib/prawn/text/formatted/arranger.rb0000644000000000000000000002151612665203156022264 0ustar rootroot# encoding: utf-8 # core/text/formatted/arranger.rb : Implements a data structure for 2-stage # processing of lines of formatted text # # Copyright February 2010, Daniel Nelson. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. module Prawn module Text module Formatted #:nodoc: # @private class Arranger #:nodoc: attr_reader :max_line_height attr_reader :max_descender attr_reader :max_ascender attr_reader :finalized attr_accessor :consumed # The following present only for testing purposes attr_reader :unconsumed attr_reader :fragments attr_reader :current_format_state def initialize(document, options = {}) @document = document @fragments = [] @unconsumed = [] @kerning = options[:kerning] end def space_count unless finalized fail "Lines must be finalized before calling #space_count" end @fragments.inject(0) do |sum, fragment| sum + fragment.space_count end end def line_width unless finalized fail "Lines must be finalized before calling #line_width" end @fragments.inject(0) do |sum, fragment| sum + fragment.width end end def line unless finalized fail "Lines must be finalized before calling #line" end @fragments.collect do |fragment| fragment.text.dup.force_encoding(::Encoding::UTF_8) end.join end def finalize_line @finalized = true omit_trailing_whitespace_from_line_width @fragments = [] @consumed.each do |hash| text = hash[:text] format_state = hash.dup format_state.delete(:text) fragment = Prawn::Text::Formatted::Fragment.new(text, format_state, @document) @fragments << fragment set_fragment_measurements(fragment) set_line_measurement_maximums(fragment) end end def format_array=(array) initialize_line @unconsumed = [] array.each do |hash| hash[:text].scan(/[^\n]+|\n/) do |line| @unconsumed << hash.merge(:text => line) end end end def initialize_line @finalized = false @max_line_height = 0 @max_descender = 0 @max_ascender = 0 @consumed = [] @fragments = [] end def finished? @unconsumed.length == 0 end def next_string if finalized fail "Lines must not be finalized when calling #next_string" end next_unconsumed_hash = @unconsumed.shift if next_unconsumed_hash @consumed << next_unconsumed_hash.dup @current_format_state = next_unconsumed_hash.dup @current_format_state.delete(:text) next_unconsumed_hash[:text] end end def preview_next_string next_unconsumed_hash = @unconsumed.first if next_unconsumed_hash next_unconsumed_hash[:text] end end def apply_color_and_font_settings(fragment, &block) if fragment.color original_fill_color = @document.fill_color original_stroke_color = @document.stroke_color @document.fill_color(*fragment.color) @document.stroke_color(*fragment.color) apply_font_settings(fragment, &block) @document.stroke_color = original_stroke_color @document.fill_color = original_fill_color else apply_font_settings(fragment, &block) end end def apply_font_settings(fragment = nil, &block) if fragment.nil? font = current_format_state[:font] size = current_format_state[:size] character_spacing = current_format_state[:character_spacing] || @document.character_spacing styles = current_format_state[:styles] font_style = font_style(styles) else font = fragment.font size = fragment.size character_spacing = fragment.character_spacing styles = fragment.styles font_style = font_style(styles) end @document.character_spacing(character_spacing) do if font || font_style != :normal fail "Bad font family" unless @document.font.family @document.font(font || @document.font.family, :style => font_style) do apply_font_size(size, styles, &block) end else apply_font_size(size, styles, &block) end end end def update_last_string(printed, unprinted, normalized_soft_hyphen = nil) return if printed.nil? if printed.empty? @consumed.pop else @consumed.last[:text] = printed if normalized_soft_hyphen @consumed.last[:normalized_soft_hyphen] = normalized_soft_hyphen end end unless unprinted.empty? @unconsumed.unshift(@current_format_state.merge(:text => unprinted)) end load_previous_format_state if printed.empty? end def retrieve_fragment unless finalized fail "Lines must be finalized before fragments can be retrieved" end @fragments.shift end def repack_unretrieved new_unconsumed = [] while fragment = retrieve_fragment fragment.include_trailing_white_space! new_unconsumed << fragment.format_state.merge(:text => fragment.text) end @unconsumed = new_unconsumed.concat(@unconsumed) end def font_style(styles) if styles.nil? :normal elsif styles.include?(:bold) && styles.include?(:italic) :bold_italic elsif styles.include?(:bold) :bold elsif styles.include?(:italic) :italic else :normal end end private def load_previous_format_state if @consumed.empty? @current_format_state = {} else hash = @consumed.last @current_format_state = hash.dup @current_format_state.delete(:text) end end def apply_font_size(size, styles) if subscript?(styles) || superscript?(styles) relative_size = 0.583 if size.nil? size = @document.font_size * relative_size else size = size * relative_size end end if size.nil? yield else @document.font_size(size) { yield } end end def subscript?(styles) if styles.nil? then false else styles.include?(:subscript) end end def superscript?(styles) if styles.nil? then false else styles.include?(:superscript) end end def omit_trailing_whitespace_from_line_width @consumed.reverse_each do |hash| if hash[:text] == "\n" break elsif hash[:text].strip.empty? && @consumed.length > 1 # this entire fragment is trailing white space hash[:exclude_trailing_white_space] = true else # this fragment contains the first non-white space we have # encountered since the end of the line hash[:exclude_trailing_white_space] = true break end end end def set_fragment_measurements(fragment) apply_font_settings(fragment) do fragment.width = @document.width_of(fragment.text, :kerning => @kerning) fragment.line_height = @document.font.height fragment.descender = @document.font.descender fragment.ascender = @document.font.ascender end end def set_line_measurement_maximums(fragment) @max_line_height = [defined?(@max_line_height) && @max_line_height, fragment.line_height].compact.max @max_descender = [defined?(@max_descender) && @max_descender, fragment.descender].compact.max @max_ascender = [defined?(@max_ascender) && @max_ascender, fragment.ascender].compact.max end end end end end ruby-prawn-2.1.0.orig/lib/prawn/text/formatted/line_wrap.rb0000644000000000000000000002112212665203156022434 0ustar rootroot# encoding: utf-8 # core/text/formatted/line_wrap.rb : Implements individual line wrapping of # formatted text # # Copyright February 2010, Daniel Nelson. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn module Text module Formatted #:nodoc: # @private class LineWrap #:nodoc: # The width of the last wrapped line # def width @accumulated_width || 0 end # The number of spaces in the last wrapped line attr_reader :space_count attr_reader :soft_hyphen attr_reader :zero_width_space # Whether this line is the last line in the paragraph def paragraph_finished? @newline_encountered || is_next_string_newline? || @arranger.finished? end def tokenize(fragment) fragment.scan(scan_pattern) end # Work in conjunction with the PDF::Formatted::Arranger # defined in the :arranger option to determine what formatted text # will fit within the width defined by the :width option # def wrap_line(options) initialize_line(options) while fragment = @arranger.next_string @fragment_output = "" fragment.lstrip! if first_fragment_on_this_line?(fragment) next if empty_line?(fragment) unless apply_font_settings_and_add_fragment_to_line(fragment) break end end @arranger.finalize_line @accumulated_width = @arranger.line_width @space_count = @arranger.space_count @arranger.line end private def first_fragment_on_this_line?(fragment) line_empty? && fragment != "\n" end def empty_line?(fragment) empty = line_empty? && fragment.empty? && is_next_string_newline? @arranger.update_last_string("", "", soft_hyphen) if empty empty end def is_next_string_newline? @arranger.preview_next_string == "\n" end def apply_font_settings_and_add_fragment_to_line(fragment) result = nil @arranger.apply_font_settings do # if font has changed from Unicode to non-Unicode, or vice versa, the characters used for soft hyphens # and zero-width spaces will be different set_soft_hyphen_and_zero_width_space result = add_fragment_to_line(fragment) end result end # returns true if all text was printed without running into the end of # the line # def add_fragment_to_line(fragment) if fragment == "" true elsif fragment == "\n" @newline_encountered = true false else tokenize(fragment).each do |segment| if segment == zero_width_space segment_width = 0 else segment_width = @document.width_of(segment, :kerning => @kerning) end if @accumulated_width + segment_width <= @width @accumulated_width += segment_width if segment[-1] == soft_hyphen sh_width = @document.width_of("#{soft_hyphen}", :kerning => @kerning) @accumulated_width -= sh_width end @fragment_output += segment else end_of_the_line_reached(segment) fragment_finished(fragment) return false end end fragment_finished(fragment) true end end # The pattern used to determine chunks of text to place on a given line # def scan_pattern pattern = "[^#{break_chars}]+#{soft_hyphen}|" \ "[^#{break_chars}]+#{hyphen}+|" \ "[^#{break_chars}]+|" \ "[#{whitespace}]+|" \ "#{hyphen}+[^#{break_chars}]*|" \ "#{soft_hyphen}" Regexp.new(pattern) end # The pattern used to determine whether any word breaks exist on a # current line, which in turn determines whether character level # word breaking is needed # def word_division_scan_pattern Regexp.new("\\s|[#{zero_width_space}#{soft_hyphen}#{hyphen}]") end def break_chars "#{whitespace}#{soft_hyphen}#{hyphen}" end def whitespace " \\t#{zero_width_space}" end def hyphen "-" end def line_empty? @line_empty && @accumulated_width == 0 end def initialize_line(options) @document = options[:document] @kerning = options[:kerning] @width = options[:width] @disable_wrap_by_char = options[:disable_wrap_by_char] @accumulated_width = 0 @line_empty = true @line_contains_more_than_one_word = false @arranger = options[:arranger] @arranger.initialize_line @newline_encountered = false @line_full = false end def set_soft_hyphen_and_zero_width_space # this is done once per fragment, after the font settings for the fragment are applied -- # it could actually be skipped if the font hasn't changed font = @document.font @soft_hyphen = font.normalize_encoding(Prawn::Text::SHY) @zero_width_space = font.unicode? ? Prawn::Text::ZWSP : "" end def fragment_finished(fragment) if fragment == "\n" @newline_encountered = true @line_empty = false else update_output_based_on_last_fragment(fragment, soft_hyphen) update_line_status_based_on_last_output determine_whether_to_pull_preceding_fragment_to_join_this_one(fragment) end remember_this_fragment_for_backward_looking_ops end def update_output_based_on_last_fragment(fragment, normalized_soft_hyphen = nil) remaining_text = fragment.slice(@fragment_output.length..fragment.length) fail Prawn::Errors::CannotFit if line_finished? && line_empty? && @fragment_output.empty? && !fragment.strip.empty? @arranger.update_last_string(@fragment_output, remaining_text, normalized_soft_hyphen) end def determine_whether_to_pull_preceding_fragment_to_join_this_one(current_fragment) if @fragment_output.empty? && !current_fragment.empty? && @line_contains_more_than_one_word unless previous_fragment_ended_with_breakable? || fragment_begins_with_breakable?(current_fragment) @fragment_output = @previous_fragment_output_without_last_word update_output_based_on_last_fragment(@previous_fragment) end end end def remember_this_fragment_for_backward_looking_ops @previous_fragment = @fragment_output.dup pf = @previous_fragment @previous_fragment_ended_with_breakable = pf =~ /[#{break_chars}]$/ last_word = pf.slice(/[^#{break_chars}]*$/) last_word_length = last_word.nil? ? 0 : last_word.length @previous_fragment_output_without_last_word = pf.slice(0, pf.length - last_word_length) end def previous_fragment_ended_with_breakable? @previous_fragment_ended_with_breakable end def fragment_begins_with_breakable?(fragment) fragment =~ /^[#{break_chars}]/ end def line_finished? @line_full || paragraph_finished? end def update_line_status_based_on_last_output @line_contains_more_than_one_word = true if @fragment_output =~ word_division_scan_pattern end def end_of_the_line_reached(segment) update_line_status_based_on_last_output wrap_by_char(segment) unless @disable_wrap_by_char || @line_contains_more_than_one_word @line_full = true end def wrap_by_char(segment) font = @document.font segment.each_char do |char| break unless append_char(char, font) end end def append_char(char, font) # kerning doesn't make sense in the context of a single character char_width = font.compute_width_of(char) if @accumulated_width + char_width <= @width @accumulated_width += char_width @fragment_output << char true else false end end end end end end ruby-prawn-2.1.0.orig/lib/prawn/utilities.rb0000644000000000000000000000241112665203156017516 0ustar rootroot# encoding: utf-8 # utilities.rb : General-purpose utility classes which don't fit anywhere else # # Copyright August 2012, Alex Dowad. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require 'thread' module Prawn # Throughout the Prawn codebase, repeated calculations which can benefit from caching are made # In some cases, caching and reusing results can not only save CPU cycles but also greatly # reduce memory requirements # But at the same time, we don't want to throw away thread safety # We have two interchangeable thread-safe cache implementations: # @private class SynchronizedCache # As an optimization, this could access the hash directly on VMs with a global interpreter lock (like MRI) def initialize @cache = {} @mutex = Mutex.new end def [](key) @mutex.synchronize { @cache[key] } end def []=(key, value) @mutex.synchronize { @cache[key] = value } end end # @private class ThreadLocalCache def initialize @cache_id = "cache_#{self.object_id}".to_sym end def [](key) (Thread.current[@cache_id] ||= {})[key] end def []=(key, value) (Thread.current[@cache_id] ||= {})[key] = value end end end ruby-prawn-2.1.0.orig/lib/prawn/view.rb0000644000000000000000000000502212665203156016456 0ustar rootroot# encoding: UTF-8 # # prawn/view.rb : Implements a mixin for Prawn's DSL # # This is free software. Please see the LICENSE and COPYING files for details. module Prawn # This mixin allows you to create modular Prawn code without the # need to create subclasses of Prawn::Document. # # class Greeter # include Prawn::View # # def initialize(name) # @name = name # end # # def say_hello # text "Hello, #{@name}!" # end # # def say_goodbye # font("Courier") do # text "Goodbye, #{@name}!" # end # end # end # # greeter = Greeter.new("Gregory") # # greeter.say_hello # greeter.say_goodbye # # greeter.save_as("greetings.pdf") # # The short story about why you should use this mixin rather than # creating subclasses of +Prawn::Document+ is that it helps # prevent accidental conflicts between your code and Prawn's # code. # # Here's the slightly longer story... # # By using composition rather than inheritance under the hood, this # mixin allows you to keep your state separate from +Prawn::Document+'s # state, and also will prevent unexpected method name collisions due # to late binding effects. # # This mixin is mostly meant for extending Prawn's functionality # with your own additions, but you can also use it to replace or # wrap existing Prawn methods. Calling +super+ will still work # as expected, and alternatively you can explictly call # +document.some_method+ to delegate to Prawn where needed. module View # @group Experimental API # Lazily instantiates a +Prawn::Document+ object. # # You can also redefine this method in your own classes to use # a custom document class. def document @document ||= Prawn::Document.new end # Delegates all unhandled calls to object returned by +document+ method. # (which is an instance of Prawn::Document by default) def method_missing(m, *a, &b) return super unless document.respond_to?(m) document.send(m, *a, &b) end # Syntactic sugar that uses +instance_eval+ under the hood to provide # a block-based DSL. # # greeter.update do # say_hello # say_goodbye # end # def update(&b) instance_eval(&b) end # Syntatic sugar that calls +document.render_file+ under the hood. # # greeter.save_as("greetings.pdf") def save_as(filename) document.render_file(filename) end end end ruby-prawn-2.1.0.orig/lib/prawn/graphics/0000755000000000000000000000000012665203156016760 5ustar rootrootruby-prawn-2.1.0.orig/lib/prawn/graphics/color.rb0000644000000000000000000001333412665203156020427 0ustar rootroot# encoding: utf-8 # color.rb : Implements color handling # # Copyright June 2008, Gregory Brown. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. module Prawn module Graphics module Color # @group Stable API # Sets or returns the fill color. # # When called with no argument, it returns the current fill color. # # If a single argument is provided, it should be a 6 digit HTML color # code. # # pdf.fill_color "f0ffc1" # # If 4 arguments are provided, the color is assumed to be a CMYK value # Values range from 0 - 100. # # pdf.fill_color 0, 99, 95, 0 # def fill_color(*color) return current_fill_color if color.empty? self.current_fill_color = process_color(*color) set_fill_color end alias_method :fill_color=, :fill_color # Sets or returns the line stroking color. # # When called with no argument, it returns the current stroking color. # # If a single argument is provided, it should be a 6 digit HTML color # code. # # pdf.stroke_color "f0ffc1" # # If 4 arguments are provided, the color is assumed to be a CMYK value # Values range from 0 - 100. # # pdf.stroke_color 0, 99, 95, 0 # def stroke_color(*color) return current_stroke_color if color.empty? color = process_color(*color) self.current_stroke_color = color set_stroke_color(color) end alias_method :stroke_color=, :stroke_color module_function # Converts RGB value array to hex string suitable for use with fill_color # and stroke_color # # >> Prawn::Graphics::Color.rgb2hex([255,120,8]) # => "ff7808" # def rgb2hex(rgb) rgb.map { |e| "%02x" % e }.join end # Converts hex string into RGB value array: # # >> Prawn::Graphics::Color.hex2rgb("ff7808") # => [255, 120, 8] # def hex2rgb(hex) r, g, b = hex[0..1], hex[2..3], hex[4..5] [r, g, b].map { |e| e.to_i(16) } end private def process_color(*color) case(color.size) when 1 color[0] when 4 color else fail ArgumentError, 'wrong number of arguments supplied' end end def color_type(color) case color when String :RGB when Array case color.length when 3 :RGB when 4 :CMYK else fail ArgumentError, "Unknown type of color: #{color.inspect}" end end end def normalize_color(color) case color_type(color) when :RGB r, g, b = hex2rgb(color) [r / 255.0, g / 255.0, b / 255.0] when :CMYK c, m, y, k = *color [c / 100.0, m / 100.0, y / 100.0, k / 100.0] end end def color_to_s(color) normalize_color(color).map { |c| '%.3f' % c }.join(' ') end def color_space(color) case color_type(color) when :RGB :DeviceRGB when :CMYK :DeviceCMYK end end COLOR_SPACES = [:DeviceRGB, :DeviceCMYK, :Pattern] def set_color_space(type, color_space) # don't set the same color space again return if current_color_space(type) == color_space && !state.page.in_stamp_stream? set_current_color_space(color_space, type) unless COLOR_SPACES.include?(color_space) fail ArgumentError, "unknown color space: '#{color_space}'" end operator = case type when :fill 'cs' when :stroke 'CS' else fail ArgumentError, "unknown type '#{type}'" end renderer.add_content "/#{color_space} #{operator}" end def set_color(type, color, options = {}) operator = case type when :fill 'scn' when :stroke 'SCN' else fail ArgumentError, "unknown type '#{type}'" end if options[:pattern] set_color_space type, :Pattern renderer.add_content "/#{color} #{operator}" else set_color_space type, color_space(color) color = color_to_s(color) write_color(color, operator) end end def set_fill_color(color = nil) set_color :fill, color || current_fill_color end def set_stroke_color(color = nil) set_color :stroke, color || current_stroke_color end def update_colors set_fill_color set_stroke_color end private def current_color_space(type) graphic_state.color_space[type] end def set_current_color_space(color_space, type) save_graphics_state if graphic_state.nil? graphic_state.color_space[type] = color_space end def current_fill_color graphic_state.fill_color end def current_fill_color=(color) graphic_state.fill_color = color end def current_stroke_color graphic_state.stroke_color end def current_stroke_color=(color) graphic_state.stroke_color = color end def write_fill_color write_color(current_fill_color, 'scn') end def write_stroke_color write_color(current_fill_color, 'SCN') end def write_color(color, operator) renderer.add_content "#{color} #{operator}" end end end end ruby-prawn-2.1.0.orig/lib/prawn/graphics/patterns.rb0000644000000000000000000001307012665203156021146 0ustar rootroot# encoding: utf-8 # patterns.rb : Implements axial & radial gradients # # Originally implemented by Wojciech Piekutowski. November, 2009 # Copyright September 2012, Alexander Mankuta. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn module Graphics module Patterns # @group Stable API # Sets the fill gradient from color1 to color2. # old arguments: point, width, height, color1, color2, options = {} # new arguments: from, to, color1, color1, options = {} # or from, r1, to, r2, color1, color2, options = {} # # Option :apply_transformations, if set true, will transform the # gradient's co-ordinate space so it matches the current co-ordinate # space of the document. This option will be the default from Prawn v3. # The current default, false, will mean if you (for example) scale your # document by 2 and put a gradient inside, you will have to manually # multiply your co-ordinates by 2 so the gradient is correctly positioned. def fill_gradient(*args) set_gradient(:fill, *args) end # Sets the stroke gradient from color1 to color2. # old arguments: point, width, height, color1, color2, options = {} # new arguments: from, to, color1, color2, options = {} # or from, r1, to, r2, color1, color2, options = {} # # Option :apply_transformations, if set true, will transform the # gradient's co-ordinate space so it matches the current co-ordinate # space of the document. This option will be the default from Prawn v3. # The current default, false, will mean if you (for example) scale your # document by 2 and put a gradient inside, you will have to manually # multiply your co-ordinates by 2 so the gradient is correctly positioned. def stroke_gradient(*args) set_gradient(:stroke, *args) end private def set_gradient(type, *grad) opts = grad.last.is_a?(Hash) ? grad.pop : {} patterns = page.resources[:Pattern] ||= {} registry_key = gradient_registry_key grad, opts if patterns["SP#{registry_key}"] shading = patterns["SP#{registry_key}"] else unless shading = gradient_registry[registry_key] shading = gradient(grad, opts) gradient_registry[registry_key] = shading end patterns["SP#{registry_key}"] = shading end operator = case type when :fill 'scn' when :stroke 'SCN' else fail ArgumentError, "unknown type '#{type}'" end set_color_space type, :Pattern renderer.add_content "/SP#{registry_key} #{operator}" end def gradient_registry_key(gradient, opts) _x1, _y1, x2, y2, transformation = gradient_coordinates(gradient, opts) if gradient[1].is_a?(Array) # axial [ transformation, x2, y2, gradient[2], gradient[3] ] else # radial [ transformation, x2, y2, gradient[1], gradient[3], gradient[4], gradient[5] ] end.hash end def gradient_registry @gradient_registry ||= {} end def gradient(args, opts) if args.length != 4 && args.length != 6 fail ArgumentError, "Unknown type of gradient: #{args.inspect}" end if opts[:apply_transformations].nil? && current_transformation_matrix_with_translation(0, 0) != [1, 0, 0, 1, 0, 0] warn "Gradients in Prawn 2.x and lower are not correctly positioned when a transformation has been made to the document. Pass 'apply_transformations: true' to correctly transform the gradient, or see https://github.com/prawnpdf/prawn/wiki/Gradient-Transformations for more information." end color1 = normalize_color(args[-2]).dup.freeze color2 = normalize_color(args[-1]).dup.freeze if color_type(color1) != color_type(color2) fail ArgumentError, "Both colors must be of the same color space: #{color1.inspect} and #{color2.inspect}" end process_color color1 process_color color2 shader = ref!( :FunctionType => 2, :Domain => [0.0, 1.0], :C0 => color1, :C1 => color2, :N => 1.0 ) x1, y1, x2, y2, transformation = gradient_coordinates(args, opts) if args.length == 4 coords = [0, 0, x2 - x1, y2 - y1] else coords = [0, 0, args[1], x2 - x1, y2 - y1, args[3]] end shading = ref!( :ShadingType => args.length == 4 ? 2 : 3, # axial : radial shading :ColorSpace => color_space(color1), :Coords => coords, :Function => shader, :Extend => [true, true] ) ref!( :PatternType => 2, # shading pattern :Shading => shading, :Matrix => transformation ) end def gradient_coordinates(args, opts) x1, y1 = map_to_absolute(args[0]) x2, y2 = map_to_absolute(args[args.length == 4 ? 1 : 2]) transformation = if opts[:apply_transformations] current_transformation_matrix_with_translation(x1, y1) else [1, 0, 0, 1, x1, y1] end [x1, y1, x2, y2, transformation] end end end end ruby-prawn-2.1.0.orig/lib/prawn/graphics/transformation.rb0000644000000000000000000001240212665203156022352 0ustar rootroot# encoding: utf-8 # # transformation.rb: Implements rotate, translate, skew, scale and a generic # transformation_matrix # # Copyright January 2010, Michael Witrant. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. module Prawn module Graphics module Transformation # @group Stable API # Rotate the user space. If a block is not provided, then you must save # and restore the graphics state yourself. # # == Options # :origin:: [number, number]. The point around which to # rotate. A block must be provided if using the :origin # # raises Prawn::Errors::BlockRequired if an :origin option is # provided, but no block is given # # Example without a block: # # save_graphics_state # rotate 30 # text "rotated text" # restore_graphics_state # # Example with a block: rotating a rectangle around its upper-left corner # # x = 300 # y = 300 # width = 150 # height = 200 # angle = 30 # pdf.rotate(angle, :origin => [x, y]) do # pdf.stroke_rectangle([x, y], width, height) # end # def rotate(angle, options = {}, &block) Prawn.verify_options(:origin, options) rad = degree_to_rad(angle) cos = Math.cos(rad) sin = Math.sin(rad) if options[:origin].nil? transformation_matrix(cos, sin, -sin, cos, 0, 0, &block) else fail Prawn::Errors::BlockRequired unless block_given? x = options[:origin][0] + bounds.absolute_left y = options[:origin][1] + bounds.absolute_bottom x_prime = x * cos - y * sin y_prime = x * sin + y * cos translate(x - x_prime, y - y_prime) do transformation_matrix(cos, sin, -sin, cos, 0, 0, &block) end end end # Translate the user space. If a block is not provided, then you must save # and restore the graphics state yourself. # # Example without a block: move the text up and over 10 # # save_graphics_state # translate(10, 10) # text "scaled text" # restore_graphics_state # # Example with a block: draw a rectangle with its upper-left corner at # x + 10, y + 10 # # x = 300 # y = 300 # width = 150 # height = 200 # pdf.translate(10, 10) do # pdf.stroke_rectangle([x, y], width, height) # end # def translate(x, y, &block) transformation_matrix(1, 0, 0, 1, x, y, &block) end # Scale the user space. If a block is not provided, then you must save # and restore the graphics state yourself. # # == Options # :origin:: [number, number]. The point from which to # scale. A block must be provided if using the :origin # # raises Prawn::Errors::BlockRequired if an :origin option is # provided, but no block is given # # Example without a block: # # save_graphics_state # scale 1.5 # text "scaled text" # restore_graphics_state # # Example with a block: scale a rectangle from its upper-left corner # # x = 300 # y = 300 # width = 150 # height = 200 # factor = 1.5 # pdf.scale(angle, :origin => [x, y]) do # pdf.stroke_rectangle([x, y], width, height) # end # def scale(factor, options = {}, &block) Prawn.verify_options(:origin, options) if options[:origin].nil? transformation_matrix(factor, 0, 0, factor, 0, 0, &block) else fail Prawn::Errors::BlockRequired unless block_given? x = options[:origin][0] + bounds.absolute_left y = options[:origin][1] + bounds.absolute_bottom x_prime = factor * x y_prime = factor * y translate(x - x_prime, y - y_prime) do transformation_matrix(factor, 0, 0, factor, 0, 0, &block) end end end # The following definition of skew would only work in a clearly # predicatable manner when if the document had no margin. don't provide # this shortcut until it behaves in a clearly understood manner # # def skew(a, b, &block) # transformation_matrix(1, # Math.tan(degree_to_rad(a)), # Math.tan(degree_to_rad(b)), # 1, 0, 0, &block) # end # Transform the user space (see notes for rotate regarding graphics state) # Generally, one would use the rotate, scale, translate, and skew # convenience methods instead of calling transformation_matrix directly def transformation_matrix(a, b, c, d, e, f) values = [a, b, c, d, e, f].map { |x| "%.5f" % x }.join(" ") save_graphics_state if block_given? add_to_transformation_stack(a, b, c, d, e, f) renderer.add_content "#{values} cm" if block_given? yield restore_graphics_state end end end end end ruby-prawn-2.1.0.orig/lib/prawn/graphics/transparency.rb0000644000000000000000000000575512665203156022032 0ustar rootroot# encoding: utf-8 # # transparency.rb : Implements transparency # # Copyright October 2009, Daniel Nelson. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn module Graphics # The Prawn::Transparency module is used to place transparent # content on the page. It has the capacity for separate # transparency values for stroked content and all other content. # # Example: # # both the fill and stroke will be at 50% opacity # pdf.transparent(0.5) do # pdf.text("hello world") # pdf.fill_and_stroke_circle([x, y], 25) # end # # # the fill will be at 50% opacity, but the stroke will # # be at 75% opacity # pdf.transparent(0.5, 0.75) do # pdf.text("hello world") # pdf.fill_and_stroke_circle([x, y], 25) # end # module Transparency # @group Stable API # Sets the opacity and stroke_opacity for all # the content within the block # If stroke_opacity is not provided, then it takes on # the same value as opacity # # Valid ranges for both paramters are 0.0 to 1.0 # # Example: # # both the fill and stroke will be at 50% opacity # pdf.transparent(0.5) do # pdf.text("hello world") # pdf.fill_and_stroke_circle([x, y], 25) # end # # # the fill will be at 50% opacity, but the stroke will # # be at 75% opacity # pdf.transparent(0.5, 0.75) do # pdf.text("hello world") # pdf.fill_and_stroke_circle([x, y], 25) # end # def transparent(opacity, stroke_opacity = opacity, &block) renderer.min_version(1.4) opacity = [[opacity, 0.0].max, 1.0].min stroke_opacity = [[stroke_opacity, 0.0].max, 1.0].min save_graphics_state renderer.add_content "/#{opacity_dictionary_name(opacity, stroke_opacity)} gs" yield restore_graphics_state end private def opacity_dictionary_registry @opacity_dictionary_registry ||= {} end def next_opacity_dictionary_id opacity_dictionary_registry.length + 1 end def opacity_dictionary_name(opacity, stroke_opacity) key = "#{opacity}_#{stroke_opacity}" if opacity_dictionary_registry[key] dictionary = opacity_dictionary_registry[key][:obj] dictionary_name = opacity_dictionary_registry[key][:name] else dictionary = ref!( :Type => :ExtGState, :CA => stroke_opacity, :ca => opacity ) dictionary_name = "Tr#{next_opacity_dictionary_id}" opacity_dictionary_registry[key] = { :name => dictionary_name, :obj => dictionary } end page.ext_gstates.merge!(dictionary_name => dictionary) dictionary_name end end end end ruby-prawn-2.1.0.orig/lib/prawn/graphics/join_style.rb0000644000000000000000000000213312665203156021463 0ustar rootroot# encoding: utf-8 # join_style.rb : Implements stroke join styling # # Contributed by Daniel Nelson. October, 2009 # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn module Graphics module JoinStyle JOIN_STYLES = { :miter => 0, :round => 1, :bevel => 2 } # @group Stable API # Sets the join style for stroked lines and curves # # style is one of :miter, :round, or :bevel # # NOTE: if this method is never called, :miter will be used for join style # throughout the document # def join_style(style = nil) return current_join_style || :miter if style.nil? self.current_join_style = style write_stroke_join_style end alias_method :join_style=, :join_style private def current_join_style graphic_state.join_style end def current_join_style=(style) graphic_state.join_style = style end def write_stroke_join_style renderer.add_content "#{JOIN_STYLES[current_join_style]} j" end end end end ruby-prawn-2.1.0.orig/lib/prawn/graphics/dash.rb0000644000000000000000000000623212665203156020227 0ustar rootroot# encoding: utf-8 # dash.rb : Implements stroke dashing # # Contributed by Daniel Nelson. October, 2009 # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn module Graphics module Dash # @group Stable API # Sets the dash pattern for stroked lines and curves or return the # current dash pattern setting if +length+ is nil. # # There are two ways to set the dash pattern: # # * If the parameter +length+ is an Integer/Float, it specifies # the length of the dash and of the gap. The length of the gap # can be customized by setting the :space option. # # Examples: # # length = 3 # 3 on, 3 off, 3 on, 3 off, ... # length = 3, :space =2 # 3 on, 2 off, 3 on, 2 off, ... # # * If the parameter +length+ is an array, it specifies the # lengths of alternating dashes and gaps. The :space option is # ignored in this case. # # Examples: # # length = [2, 1] # 2 on, 1 off, 2 on, 1 off, ... # length = [3, 1, 2, 3] # 3 on, 1 off, 2 on, 3 off, 3 on, 1 off, ... # # Options may contain the keys :space and :phase # # :space:: The space between the dashes (only used when +length+ # is not an array) # # :phase:: The distance into the dash pattern at which to start # the dash. For example, a phase of 0 starts at the # beginning of the dash; whereas, if the phase is equal # to the length of the dash, then stroking will begin at # the beginning of the space. Default is 0. # # Integers or Floats may be used for length and the option values. # Dash units are in PDF points (1/72 inch). # def dash(length = nil, options = {}) return current_dash_state if length.nil? if length == 0 || length.kind_of?(Array) && length.any? { |e| e == 0 } fail ArgumentError, "Zero length dashes are invalid. Call #undash to disable dashes." end self.current_dash_state = { :dash => length, :space => length.kind_of?(Array) ? nil : options[:space] || length, :phase => options[:phase] || 0 } write_stroke_dash end alias_method :dash=, :dash # Stops dashing, restoring solid stroked lines and curves # def undash self.current_dash_state = undashed_setting write_stroke_dash end # Returns when stroke is dashed, false otherwise # def dashed? current_dash_state != undashed_setting end private def write_stroke_dash renderer.add_content dash_setting end def undashed_setting { :dash => nil, :space => nil, :phase => 0 } end def current_dash_state=(dash_options) graphic_state.dash = dash_options end def current_dash_state graphic_state.dash end def dash_setting graphic_state.dash_setting end end end end ruby-prawn-2.1.0.orig/lib/prawn/graphics/cap_style.rb0000644000000000000000000000207212665203156021271 0ustar rootroot# encoding: utf-8 # cap_style.rb : Implements stroke cap styling # # Contributed by Daniel Nelson. October, 2009 # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn module Graphics module CapStyle # @group Stable API CAP_STYLES = { :butt => 0, :round => 1, :projecting_square => 2 } # Sets the cap style for stroked lines and curves # # style is one of :butt, :round, or :projecting_square # # NOTE: If this method is never called, :butt will be used by default. # def cap_style(style = nil) return current_cap_style || :butt if style.nil? self.current_cap_style = style write_stroke_cap_style end alias_method :cap_style=, :cap_style private def current_cap_style graphic_state.cap_style end def current_cap_style=(style) graphic_state.cap_style = style end def write_stroke_cap_style renderer.add_content "#{CAP_STYLES[current_cap_style]} J" end end end end ruby-prawn-2.1.0.orig/lib/prawn/graphics/blend_mode.rb0000644000000000000000000000337012665203156021400 0ustar rootroot# encoding: utf-8 # # blend_mode.rb : Implements blend modes # # Contributed by John Ford. October, 2015 # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn module Graphics # The Prawn::BlendMode module is used to change the way # two layers are blended together. # # Passing an array of blend modes is allowed. PDF viewers should # blend layers based on the first recognized blend mode. # # Valid blend modes in v1.4 of the PDF spec include :Normal, :Multiply, :Screen, # :Overlay, :Darken, :Lighten, :ColorDodge, :ColorBurn, :HardLight, :SoftLight, # :Difference, :Exclusion, :Hue, :Saturation, :Color, and :Luminosity. # # Example: # pdf.fill_color('0000ff') # pdf.fill_rectangle([x, y+25], 50, 50) # pdf.blend_mode(:Multiply) do # pdf.fill_color('ff0000') # pdf.fill_circle([x, y], 25) # end # module BlendMode # @group Stable API def blend_mode(blend_mode = :Normal) renderer.min_version(1.4) save_graphics_state if block_given? renderer.add_content "/#{blend_mode_dictionary_name(blend_mode)} gs" if block_given? yield restore_graphics_state end end private def blend_mode_dictionary_registry @blend_mode_dictionary_registry ||= {} end def blend_mode_dictionary_name(blend_mode) key = Array(blend_mode).join('') dictionary_name = "BM#{key}" dictionary = blend_mode_dictionary_registry[dictionary_name] ||= ref!( :Type => :ExtGState, :BM => blend_mode ) page.ext_gstates.merge!(dictionary_name => dictionary) dictionary_name end end end end ruby-prawn-2.1.0.orig/lib/prawn/graphics.rb0000644000000000000000000004636212665203156017320 0ustar rootroot# encoding: utf-8 # graphics.rb : Implements PDF drawing primitives # # Copyright April 2008, Gregory Brown. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require_relative "graphics/blend_mode" require_relative "graphics/color" require_relative "graphics/dash" require_relative "graphics/cap_style" require_relative "graphics/join_style" require_relative "graphics/transparency" require_relative "graphics/transformation" require_relative "graphics/patterns" module Prawn # Implements the drawing facilities for Prawn::Document. # Use this to draw the most beautiful imaginable things. # # This file lifts and modifies several of PDF::Writer's graphics functions # ruby-pdf.rubyforge.org # module Graphics include BlendMode include Color include Dash include CapStyle include JoinStyle include Transparency include Transformation include Patterns # @group Stable API ####################################################################### # Low level drawing operations must map the point to absolute coords! # ####################################################################### # Moves the drawing position to a given point. The point can be # specified as a tuple or a flattened argument list # # pdf.move_to [100,50] # pdf.move_to(100,50) # def move_to(*point) xy = PDF::Core.real_params(map_to_absolute(point)) renderer.add_content("#{xy} m") end # Draws a line from the current drawing position to the specified point. # The destination may be described as a tuple or a flattened list: # # pdf.line_to [50,50] # pdf.line_to(50,50) # def line_to(*point) xy = PDF::Core.real_params(map_to_absolute(point)) renderer.add_content("#{xy} l") end # Draws a Bezier curve from the current drawing position to the # specified point, bounded by two additional points. # # pdf.curve_to [100,100], :bounds => [[90,90],[75,75]] # def curve_to(dest, options = {}) options[:bounds] or fail Prawn::Errors::InvalidGraphicsPath, "Bounding points for bezier curve must be specified " \ "as :bounds => [[x1,y1],[x2,y2]]" curve_points = PDF::Core.real_params( (options[:bounds] << dest).flat_map { |e| map_to_absolute(e) } ) renderer.add_content("#{curve_points} c") end # Draws a rectangle given point, width and # height. The rectangle is bounded by its upper-left corner. # # pdf.rectangle [300,300], 100, 200 # def rectangle(point, width, height) x, y = map_to_absolute(point) box = PDF::Core.real_params([x, y - height, width, height]) renderer.add_content("#{box} re") end # Draws a rounded rectangle given point, width and # height and radius for the rounded corner. The rectangle # is bounded by its upper-left corner. # # pdf.rounded_rectangle [300,300], 100, 200, 10 # def rounded_rectangle(point, width, height, radius) x, y = point rounded_polygon(radius, point, [x + width, y], [x + width, y - height], [x, y - height]) end ########################################################### # Higher level functions: May use relative coords # ########################################################### # Sets line thickness to the width specified. # def line_width=(width) self.current_line_width = width write_line_width end # When called without an argument, returns the current line thickness. # When called with an argument, sets the line thickness to the specified # value (in PDF points) # # pdf.line_width #=> 1 # pdf.line_width(5) # pdf.line_width #=> 5 # def line_width(width = nil) if width self.line_width = width else current_line_width end end # Draws a line from one point to another. Points may be specified as # tuples or flattened argument list: # # pdf.line [100,100], [200,250] # pdf.line(100,100,200,250) # def line(*points) x0, y0, x1, y1 = points.flatten move_to(x0, y0) line_to(x1, y1) end # Draws a horizontal line from x1 to x2 at the # current y position, or the position specified by the :at option. # # # draw a line from [25, 75] to [100, 75] # horizontal_line 25, 100, :at => 75 # def horizontal_line(x1, x2, options = {}) if options[:at] y1 = options[:at] else y1 = y - bounds.absolute_bottom end line(x1, y1, x2, y1) end # Draws a horizontal line from the left border to the right border of the # bounding box at the current y position. # def horizontal_rule horizontal_line(bounds.left, bounds.right) end # Draws a vertical line at the x cooordinate given by :at from y1 to y2. # # # draw a line from [25, 100] to [25, 300] # vertical_line 100, 300, :at => 25 # def vertical_line(y1, y2, params) line(params[:at], y1, params[:at], y2) end # Draws a Bezier curve between two points, bounded by two additional # points # # pdf.curve [50,100], [100,100], :bounds => [[90,90],[75,75]] # def curve(origin, dest, options = {}) move_to(*origin) curve_to(dest, options) end # This constant is used to approximate a symmetrical arc using a cubic # Bezier curve. # KAPPA = 4.0 * ((Math.sqrt(2) - 1.0) / 3.0) # Draws a circle of radius radius with the centre-point at point # as a complete subpath. The drawing point will be moved to the # centre-point upon completion of the drawing the circle. # # pdf.circle [100,100], 25 # def circle(center, radius) ellipse(center, radius, radius) end # Draws an ellipse of +x+ radius r1 and +y+ radius r2 # with the centre-point at point as a complete subpath. The # drawing point will be moved to the centre-point upon completion of the # drawing the ellipse. # # # draws an ellipse with x-radius 25 and y-radius 50 # pdf.ellipse [100,100], 25, 50 # def ellipse(point, r1, r2 = r1) x, y = point l1 = r1 * KAPPA l2 = r2 * KAPPA move_to(x + r1, y) # Upper right hand corner curve_to [x, y + r2], :bounds => [[x + r1, y + l2], [x + l1, y + r2]] # Upper left hand corner curve_to [x - r1, y], :bounds => [[x - l1, y + r2], [x - r1, y + l2]] # Lower left hand corner curve_to [x, y - r2], :bounds => [[x - r1, y - l2], [x - l1, y - r2]] # Lower right hand corner curve_to [x + r1, y], :bounds => [[x + l1, y - r2], [x + r1, y - l2]] move_to(x, y) end # Draws a polygon from the specified points. # # # draws a snazzy triangle # pdf.polygon [100,100], [100,200], [200,200] # def polygon(*points) move_to points[0] (points[1..-1] << points[0]).each do |point| line_to(*point) end # close the path renderer.add_content "h" end # Draws a rounded polygon from specified points using the radius to define bezier curves # # # draws a rounded filled in polygon # pdf.fill_and_stroke_rounded_polygon(10, [100, 250], [200, 300], [300, 250], # [300, 150], [200, 100], [100, 150]) def rounded_polygon(radius, *points) move_to point_on_line(radius, points[1], points[0]) sides = points.size points << points[0] << points[1] (sides).times do |i| rounded_vertex(radius, points[i], points[i + 1], points[i + 2]) end # close the path renderer.add_content "h" end # Creates a rounded vertex for a line segment used for building a rounded polygon # requires a radius to define bezier curve and three points. The first two points define # the line segment and the third point helps define the curve for the vertex. def rounded_vertex(radius, *points) radial_point_1 = point_on_line(radius, points[0], points[1]) bezier_point_1 = point_on_line((radius - radius * KAPPA), points[0], points[1]) radial_point_2 = point_on_line(radius, points[2], points[1]) bezier_point_2 = point_on_line((radius - radius * KAPPA), points[2], points[1]) line_to(radial_point_1) curve_to(radial_point_2, :bounds => [bezier_point_1, bezier_point_2]) end # Strokes the current path. If a block is provided, yields to the block # before closing the path. See Graphics::Color for color details. # def stroke yield if block_given? renderer.add_content "S" end # Closes and strokes the current path. If a block is provided, yields to # the block before closing the path. See Graphics::Color for color details. # def close_and_stroke yield if block_given? renderer.add_content "s" end # Draws and strokes a rectangle represented by the current bounding box # def stroke_bounds stroke_rectangle bounds.top_left, bounds.width, bounds.height end # Draws and strokes X and Y axes rulers beginning at the current bounding # box origin (or at a custom location). # # == Options # # +:at+:: # Origin of the X and Y axes (default: [0, 0] = origin of the bounding # box) # # +:width+:: # Length of the X axis (default: width of the bounding box) # # +:height+:: # Length of the Y axis (default: height of the bounding box) # # +:step_length+:: # Length of the step between markers (default: 100) # # +:negative_axes_length+:: # Length of the negative parts of the axes (default: 20) # # +:color+: # The color of the axes and the text. # def stroke_axis(options = {}) options = { :at => [0, 0], :height => bounds.height.to_i - (options[:at] || [0, 0])[1], :width => bounds.width.to_i - (options[:at] || [0, 0])[0], :step_length => 100, :negative_axes_length => 20, :color => "000000" }.merge(options) Prawn.verify_options([:at, :width, :height, :step_length, :negative_axes_length, :color], options) save_graphics_state do fill_color(options[:color]) stroke_color(options[:color]) dash(1, :space => 4) stroke_horizontal_line(options[:at][0] - options[:negative_axes_length], options[:at][0] + options[:width], :at => options[:at][1]) stroke_vertical_line(options[:at][1] - options[:negative_axes_length], options[:at][1] + options[:height], :at => options[:at][0]) undash fill_circle(options[:at], 1) (options[:step_length]..options[:width]).step(options[:step_length]) do |point| fill_circle([options[:at][0] + point, options[:at][1]], 1) draw_text(point, :at => [options[:at][0] + point - 5, options[:at][1] - 10], :size => 7) end (options[:step_length]..options[:height]).step(options[:step_length]) do |point| fill_circle([options[:at][0], options[:at][1] + point], 1) draw_text(point, :at => [options[:at][0] - 17, options[:at][1] + point - 2], :size => 7) end end end # Closes and fills the current path. See Graphics::Color for color details. # # If the option :fill_rule => :even_odd is specified, Prawn will use the # even-odd rule to fill the path. Otherwise, the nonzero winding number rule # will be used. See the PDF reference, "Graphics -> Path Construction and # Painting -> Clipping Path Operators" for details on the difference. # def fill(options = {}) yield if block_given? renderer.add_content(options[:fill_rule] == :even_odd ? "f*" : "f") end # Closes, fills, and strokes the current path. If a block is provided, # yields to the block before closing the path. See Graphics::Color for # color details. # # If the option :fill_rule => :even_odd is specified, Prawn will use the # even-odd rule to fill the path. Otherwise, the nonzero winding number rule # will be used. See the PDF reference, "Graphics -> Path Construction and # Painting -> Clipping Path Operators" for details on the difference. # def fill_and_stroke(options = {}) yield if block_given? renderer.add_content(options[:fill_rule] == :even_odd ? "b*" : "b") end # Closes the current path. # def close_path renderer.add_content "h" end ## # :method: stroke_rectangle # # Draws and strokes a rectangle given +point+, +width+ and +height+. The # rectangle is bounded by its upper-left corner. # # :call-seq: # stroke_rectangle(point,width,height) ## # :method: fill_rectangle # # Draws and fills ills a rectangle given +point+, +width+ and +height+. The # rectangle is bounded by its upper-left corner. # # :call-seq: # fill_rectangle(point,width,height) ## # :method: fill_and_stroke_rectangle # # Draws, fills, and strokes a rectangle given +point+, +width+ and +height+. # The rectangle is bounded by its upper-left corner. # # :call-seq: # fill_and_stroke_rectangle(point,width,height) ## # :method: stroke_rounded_rectangle # # Draws and strokes a rounded rectangle given +point+, +width+ and +height+ # and +radius+ for the rounded corner. The rectangle is bounded by its # upper-left corner. # # :call-seq: # stroke_rounded_rectangle(point,width,height,radius) ## # :method: fill_rounded_rectangle # # Draws and fills a rounded rectangle given +point+, +width+ and +height+ # and +radius+ for the rounded corner. The rectangle is bounded by its # upper-left corner. # # :call-seq: # fill_rounded_rectangle(point,width,height,radius) ## # :method: stroke_and_fill_rounded_rectangle # # Draws, fills, and strokes a rounded rectangle given +point+, +width+ and # +height+ and +radius+ for the rounded corner. The rectangle is bounded by # its upper-left corner. # # :call-seq: # stroke_and_fill_rounded_rectangle(point,width,height,radius) ## # :method: stroke_line # # Strokes a line from one point to another. Points may be specified as # tuples or flattened argument list. # # :call-seq: # stroke_line(*points) ## # :method: stroke_horizontal_line # # Strokes a horizontal line from +x1+ to +x2+ at the current y position, or # the position specified by the :at option. # # :call-seq: # stroke_horizontal_line(x1,x2,options={}) ## # :method: stroke_horizontal_rule # # Strokes a horizontal line from the left border to the right border of the # bounding box at the current y position. # # :call-seq: # stroke_horizontal_rule ## # :method: stroke_vertical_line # # Strokes a vertical line at the x coordinate given by :at from y1 to y2. # # :call-seq: # stroke_vertical_line(y1,y2,params) ## # :method: stroke_curve # # Strokes a Bezier curve between two points, bounded by two additional # points. # # :call-seq: # stroke_curve(origin,dest,options={}) ## # :method: stroke_circle # # Draws and strokes a circle of radius +radius+ with the centre-point at # +point+. # # :call-seq: # stroke_circle(center,radius) ## # :method: fill_circle # # Draws and fills a circle of radius +radius+ with the centre-point at # +point+. # # :call-seq: # fill_circle(center,radius) ## # :method: fill_and_stroke_circle # # Draws, strokes, and fills a circle of radius +radius+ with the # centre-point at +point+. # # :call-seq: # fill_and_stroke_circle(center,radius) ## # :method: stroke_ellipse # # Draws and strokes an ellipse of x radius +r1+ and y radius +r2+ with the # centre-point at +point+. # # :call-seq: # stroke_ellipse(point, r1, r2 = r1) ## # :method: fill_ellipse # # Draws and fills an ellipse of x radius +r1+ and y radius +r2+ with the # centre-point at +point+. # # :call-seq: # fill_ellipse(point, r1, r2 = r1) ## # :method: fill_and_stroke_ellipse # # Draws, strokes, and fills an ellipse of x radius +r1+ and y radius +r2+ # with the centre-point at +point+. # # :call-seq: # fill_and_stroke_ellipse(point, r1, r2 = r1) ## # :method: stroke_polygon # # Draws and strokes a polygon from the specified points. # # :call-seq: # stroke_polygon(*points) ## # :method: fill_polygon # # Draws and fills a polygon from the specified points. # # :call-seq: # fill_polygon(*points) ## # :method: fill_and_stroke_polygon # # Draws, strokes, and fills a polygon from the specified points. # # :call-seq: # fill_and_stroke_polygon(*points) ## # :method: stroke_rounded_polygon # # Draws and strokes a rounded polygon from specified points, using +radius+ # to define Bezier curves. # # :call-seq: # stroke_rounded_polygon(radius, *points) ## # :method: fill_rounded_polygon # # Draws and fills a rounded polygon from specified points, using +radius+ to # define Bezier curves. # # :call-seq: # fill_rounded_polygon(radius, *points) ## # :method: fill_and_stroke_rounded_polygon # # Draws, strokes, and fills a rounded polygon from specified points, using # +radius+ to define Bezier curves. # # :call-seq: # fill_and_stroke_rounded_polygon(radius, *points) ops = %w{fill stroke fill_and_stroke} shapes = %w{line_to curve_to rectangle rounded_rectangle line horizontal_line horizontal_rule vertical_line curve circle_at circle ellipse_at ellipse polygon rounded_polygon rounded_vertex} ops.product(shapes).each do |operation, shape| class_eval "def #{operation}_#{shape}(*args); #{shape}(*args); #{operation}; end" end private def current_line_width graphic_state.line_width end def current_line_width=(width) graphic_state.line_width = width end def write_line_width renderer.add_content("#{current_line_width} w") end def map_to_absolute(*point) x, y = point.flatten [@bounding_box.absolute_left + x, @bounding_box.absolute_bottom + y] end def map_to_absolute!(point) point.replace(map_to_absolute(point)) end def degree_to_rad(angle) angle * Math::PI / 180 end # Returns the coordinates for a point on a line that is a given distance away from the second # point defining the line segement def point_on_line(distance_from_end, *points) x0, y0, x1, y1 = points.flatten length = Math.sqrt((x1 - x0)**2 + (y1 - y0)**2) p = (length - distance_from_end) / length xr = x0 + p * (x1 - x0) yr = y0 + p * (y1 - y0) [xr, yr] end end end ruby-prawn-2.1.0.orig/lib/prawn/transformation_stack.rb0000644000000000000000000000215512665203156021743 0ustar rootroot# encoding: utf-8 # # transformation_stack.rb : Stores the transformations that have been applied to the document # # Copyright 2015, Roger Nesbitt. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # require 'matrix' module Prawn module TransformationStack def add_to_transformation_stack(a, b, c, d, e, f) @transformation_stack ||= [[]] @transformation_stack.last.push([a, b, c, d, e, f].map(&:to_f)) end def save_transformation_stack @transformation_stack ||= [[]] @transformation_stack.push(@transformation_stack.last.dup) end def restore_transformation_stack @transformation_stack.pop if @transformation_stack end def current_transformation_matrix_with_translation(x = 0, y = 0) transformations = (@transformation_stack || [[]]).last matrix = Matrix.identity(3) transformations.each do |a, b, c, d, e, f| matrix *= Matrix[[a, c, e], [b, d, f], [0, 0, 1]] end matrix *= Matrix[[1, 0, x], [0, 1, y], [0, 0, 1]] matrix.to_a[0..1].transpose.flatten end end end ruby-prawn-2.1.0.orig/lib/prawn/document/0000755000000000000000000000000012665203156016776 5ustar rootrootruby-prawn-2.1.0.orig/lib/prawn/document/bounding_box.rb0000644000000000000000000003721612665203156022011 0ustar rootroot# encoding: utf-8 # bounding_box.rb : Implements a mechanism for shifting the coordinate space # # Copyright May 2008, Gregory Brown. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. module Prawn class Document # @group Stable API # :call-seq: # bounding_box(point, options={}, &block) # # A bounding box serves two important purposes: # * Provide bounds for flowing text, starting at a given point # * Translate the origin (0,0) for graphics primitives # # A point and :width must be provided. :height is optional. # (See stretchyness below) # # ==Positioning # # Bounding boxes are positioned relative to their top left corner and # the width measurement is towards the right and height measurement is # downwards. # # Usage: # # * Bounding box 100pt x 100pt in the absolute bottom left of the # containing box: # # pdf.bounding_box([0,100], :width => 100, :height => 100) # stroke_bounds # end # # * Bounding box 200pt x 400pt high in the center of the page: # # x_pos = ((bounds.width / 2) - 150) # y_pos = ((bounds.height / 2) + 200) # pdf.bounding_box([x_pos, y_pos], :width => 300, :height => 400) do # stroke_bounds # end # # ==Flowing Text # # When flowing text, the usage of a bounding box is simple. Text will # begin at the point specified, flowing the width of the bounding box. # After the block exits, the cursor position will be moved to # the bottom of the bounding box (y - height). If flowing text exceeds # the height of the bounding box, the text will be continued on the next # page, starting again at the top-left corner of the bounding box. # # Usage: # # pdf.bounding_box([100,500], :width => 100, :height => 300) do # pdf.text "This text will flow in a very narrow box starting" + # "from [100,500]. The pointer will then be moved to [100,200]" + # "and return to the margin_box" # end # # Note, this is a low level tool and is designed primarily for building # other abstractions. If you just need to flow text on the page, you # will want to look at span() and text_box() instead # # ==Translating Coordinates # # When translating coordinates, the idea is to allow the user to draw # relative to the origin, and then translate their drawing to a specified # area of the document, rather than adjust all their drawing coordinates # to match this new region. # # Take for example two triangles which share one point, drawn from the # origin: # # pdf.polygon [0,250], [0,0], [150,100] # pdf.polygon [100,0], [150,100], [200,0] # # It would be easy enough to translate these triangles to another point, # e.g [200,200] # # pdf.polygon [200,450], [200,200], [350,300] # pdf.polygon [300,200], [350,300], [400,200] # # However, each time you want to move the drawing, you'd need to alter # every point in the drawing calls, which as you might imagine, can become # tedious. # # If instead, we think of the drawing as being bounded by a box, we can # see that the image is 200 points wide by 250 points tall. # # To translate it to a new origin, we simply select a point at (x,y+height) # # Using the [200,200] example: # # pdf.bounding_box([200,450], :width => 200, :height => 250) do # pdf.stroke do # pdf.polygon [0,250], [0,0], [150,100] # pdf.polygon [100,0], [150,100], [200,0] # end # end # # Notice that the drawing is still relative to the origin. If we want to # move this drawing around the document, we simply need to recalculate the # top-left corner of the rectangular bounding-box, and all of our graphics # calls remain unmodified. # # ==Nesting Bounding Boxes # # At the top level, bounding boxes are specified relative to the document's # margin_box (which is itself a bounding box). You can also nest bounding # boxes, allowing you to build components which are relative to each other # # Usage: # # pdf.bounding_box([200,450], :width => 200, :height => 250) do # pdf.stroke_bounds # Show the containing bounding box # pdf.bounding_box([50,200], :width => 50, :height => 50) do # # a 50x50 bounding box that starts 50 pixels left and 50 pixels down # # the parent bounding box. # pdf.stroke_bounds # end # end # # ==Stretchyness # # If you do not specify a height to a bounding box, it will become stretchy # and its height will be calculated automatically as you stretch the box # downwards. # # pdf.bounding_box([100,400], :width => 400) do # pdf.text("The height of this box is #{pdf.bounds.height}") # pdf.text('this is some text') # pdf.text('this is some more text') # pdf.text('and finally a bit more') # pdf.text("Now the height of this box is #{pdf.bounds.height}") # end # # ==Absolute Positioning # # If you wish to position the bounding boxes at absolute coordinates rather # than relative to the margins or other bounding boxes, you can use canvas() # # pdf.bounding_box([50,500], :width => 200, :height => 300) do # pdf.stroke_bounds # pdf.canvas do # Positioned outside the containing box at the 'real' (300,450) # pdf.bounding_box([300,450], :width => 200, :height => 200) do # pdf.stroke_bounds # end # end # end # # Of course, if you use canvas, you will be responsible for ensuring that # you remain within the printable area of your document. # def bounding_box(pt, *args, &block) init_bounding_box(block) do |parent_box| pt = map_to_absolute(pt) @bounding_box = BoundingBox.new(self, parent_box, pt, *args) end end # A shortcut to produce a bounding box which is mapped to the document's # absolute coordinates, regardless of how things are nested or margin sizes. # # pdf.canvas do # pdf.line pdf.bounds.bottom_left, pdf.bounds.top_right # end # def canvas(&block) init_bounding_box(block, :hold_position => true) do |_| # Canvas bbox acts like margin_box in that its parent bounds are unset. @bounding_box = BoundingBox.new( self, nil, [0, page.dimensions[3]], :width => page.dimensions[2], :height => page.dimensions[3] ) end end private def init_bounding_box(user_block, options = {}, &init_block) unless user_block fail ArgumentError, "bounding boxes require a block to be drawn within the box" end parent_box = @bounding_box original_ypos = y init_block.call(parent_box) self.y = @bounding_box.absolute_top user_block.call # If the user actions did not modify the y position # restore the original y position before the bounding # box was created. if y == @bounding_box.absolute_top self.y = original_ypos end unless options[:hold_position] || @bounding_box.stretchy? self.y = @bounding_box.absolute_bottom end created_box, @bounding_box = @bounding_box, parent_box return created_box end # Low level layout helper that simplifies coordinate math. # # See Prawn::Document#bounding_box for a description of what this class # is used for. # class BoundingBox def initialize(document, parent, point, options = {}) # @private unless options[:width] fail ArgumentError, "BoundingBox needs the :width option to be set" end @document = document @parent = parent @x, @y = point @width, @height = options[:width], options[:height] @total_left_padding = 0 @total_right_padding = 0 @stretched_height = nil end # @private attr_reader :document, :parent # @private # The current indentation of the left side of the bounding box. attr_reader :total_left_padding # @private # The current indentation of the right side of the bounding box. attr_reader :total_right_padding # The translated origin (x,y-height) which describes the location # of the bottom left corner of the bounding box # # @private def anchor [@x, @y - height] end # Relative left x-coordinate of the bounding box. (Always 0) # # Example, position some text 3 pts from the left of the containing box: # # draw_text('hello', :at => [(bounds.left + 3), 0]) # def left 0 end # Temporarily adjust the @x coordinate to allow for left_padding # # Example: # # indent 20 do # text "20 points in" # indent 30 do # text "50 points in" # end # end # # indent 20, 20 do # text "indented on both sides" # end # # @private def indent(left_padding, right_padding = 0, &block) add_left_padding(left_padding) add_right_padding(right_padding) yield ensure @document.bounds.subtract_left_padding(left_padding) @document.bounds.subtract_right_padding(right_padding) end # Increase the left padding of the bounding box. # @private def add_left_padding(left_padding) @total_left_padding += left_padding @x += left_padding @width -= left_padding end # Decrease the left padding of the bounding box. # @private def subtract_left_padding(left_padding) @total_left_padding -= left_padding @x -= left_padding @width += left_padding end # Increase the right padding of the bounding box. # @private def add_right_padding(right_padding) @total_right_padding += right_padding @width -= right_padding end # Decrease the right padding of the bounding box. # @private def subtract_right_padding(right_padding) @total_right_padding -= right_padding @width += right_padding end # Relative right x-coordinate of the bounding box. (Equal to the box width) # # Example, position some text 3 pts from the right of the containing box: # # draw_text('hello', :at => [(bounds.right - 3), 0]) # def right @width end # Relative top y-coordinate of the bounding box. (Equal to the box height) # # Example, position some text 3 pts from the top of the containing box: # # draw_text('hello', :at => [0, (bounds.top - 3)]) # def top height end # Relative bottom y-coordinate of the bounding box (Always 0) # # Example, position some text 3 pts from the bottom of the containing box: # # draw_text('hello', :at => [0, (bounds.bottom + 3)]) # def bottom 0 end # Relative top-left point of the bounding_box # # Example, draw a line from the top left of the box diagonally to the # bottom right: # # stroke do # line(bounds.top_left, bounds.bottom_right) # end # def top_left [left, top] end # Relative top-right point of the bounding box # # Example, draw a line from the top_right of the box diagonally to the # bottom left: # # stroke do # line(bounds.top_right, bounds.bottom_left) # end # def top_right [right, top] end # Relative bottom-right point of the bounding box # # Example, draw a line along the right hand side of the page: # # stroke do # line(bounds.bottom_right, bounds.top_right) # end # def bottom_right [right, bottom] end # Relative bottom-left point of the bounding box # # Example, draw a line along the left hand side of the page: # # stroke do # line(bounds.bottom_left, bounds.top_left) # end # def bottom_left [left, bottom] end # Absolute left x-coordinate of the bounding box # def absolute_left @x end # Absolute right x-coordinate of the bounding box # def absolute_right @x + width end # Absolute top y-coordinate of the bounding box # def absolute_top @y end # Absolute bottom y-coordinate of the bottom box # def absolute_bottom @y - height end # Absolute top-left point of the bounding box # def absolute_top_left [absolute_left, absolute_top] end # Absolute top-right point of the bounding box # def absolute_top_right [absolute_right, absolute_top] end # Absolute bottom-left point of the bounding box # def absolute_bottom_left [absolute_left, absolute_bottom] end # Absolute bottom-left point of the bounding box # def absolute_bottom_right [absolute_right, absolute_bottom] end # Width of the bounding box attr_reader :width # Height of the bounding box. If the box is 'stretchy' (unspecified # height attribute), height is calculated as the distance from the top of # the box to the current drawing position. # def height return @height if @height @stretched_height = [(absolute_top - @document.y), @stretched_height.to_f].max end # an alias for absolute_left # @private def left_side absolute_left end # an alias for absolute_right # @private def right_side absolute_right end # @group Extension API # Moves to the top of the next page of the document, starting a new page # if necessary. # def move_past_bottom if @document.page_number == @document.page_count @document.start_new_page else @document.go_to_page(@document.page_number + 1) end end # Returns +false+ when the box has a defined height, +true+ when the height # is being calculated on the fly based on the current vertical position. # def stretchy? !@height end # Returns the innermost non-stretchy bounding box. # def reference_bounds if stretchy? fail "Can't find reference bounds: my parent is unset" unless @parent @parent.reference_bounds else self end end alias_method :update_height, :height # Returns a deep copy of these bounds (including all parent bounds but # not copying the reference to the Document). # # @private def deep_copy copy = dup # Deep-copy the parent bounds copy.instance_variable_set("@parent", if BoundingBox === @parent @parent.deep_copy end) copy.instance_variable_set("@document", nil) copy end # Restores a copy of the bounds taken by BoundingBox.deep_copy in the # context of the given +document+. Does *not* set the bounds of the # document to the resulting BoundingBox, only returns it. # # @private def self.restore_deep_copy(bounds, document) bounds.instance_variable_set("@document", document) bounds end end end end ruby-prawn-2.1.0.orig/lib/prawn/document/span.rb0000644000000000000000000000345312665203156020271 0ustar rootroot# encoding: utf-8 # span.rb : Implements text columns # # Copyright September 2008, Gregory Brown. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. module Prawn class Document # @group Stable API # A span is a special purpose bounding box that allows a column of # elements to be positioned relative to the margin_box. # # Arguments: # +width+:: The width of the column in PDF points # # Options: # :position:: One of :left, :center, :right or an x offset # # This method is typically used for flowing a column of text from one # page to the next. # # span(350, :position => :center) do # text "Here's some centered text in a 350 point column. " * 100 # end # def span(width, options = {}) Prawn.verify_options [:position], options original_position = self.y # FIXME: Any way to move this upstream? left_boundary = case(options[:position] || :left) when :left margin_box.absolute_left when :center margin_box.absolute_left + margin_box.width / 2.0 - width / 2.0 when :right margin_box.absolute_right - width when Numeric margin_box.absolute_left + options[:position] else fail ArgumentError, "Invalid option for :position" end # we need to bust out of whatever nested bounding boxes we're in. canvas do bounding_box([left_boundary, margin_box.absolute_top], :width => width) do self.y = original_position yield end end end end end ruby-prawn-2.1.0.orig/lib/prawn/document/internals.rb0000644000000000000000000000442312665203156021325 0ustar rootroot# encoding: utf-8 # # internals.rb : Implements document internals for Prawn # # Copyright August 2008, Gregory Brown. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require "forwardable" module Prawn class Document # This module exposes a few low-level PDF features for those who want # to extend Prawn's core functionality. If you are not comfortable with # low level PDF functionality as defined by Adobe's specification, chances # are you won't need anything you find here. # # @private module Internals extend Forwardable # These methods are not officially part of Prawn's public API, # but they are used in documentation and possibly in extensions. # Perhaps they will become part of the extension API? # Anyway, for now it's not clear what we should do w. them. delegate [ :graphic_state, :on_page_create ] => :renderer def save_graphics_state(state = nil, &block) save_transformation_stack renderer.save_graphics_state(state, &block) end def restore_graphics_state restore_transformation_stack renderer.restore_graphics_state end # FIXME: This is a circular reference, because in theory Prawn should # be passing instances of renderer to PDF::Core::Page, but it's # passing Prawn::Document objects instead. # # A proper design would probably not require Prawn to directly instantiate # PDF::Core::Page objects at all! delegate [:compression_enabled?] => :renderer # FIXME: More circular references in PDF::Core::Page. delegate [ :ref, :ref!, :deref ] => :renderer # FIXME: Another circular reference, because we mix in a module from # PDF::Core to provide destinations, which in theory should not # rely on a Prawn::Document object but is currently wired up that way. delegate [:names] => :renderer # FIXME: Circular reference because we mix PDF::Core::Text into # Prawn::Document. PDF::Core::Text should either be split up or # moved in its entirety back up into Prawn. delegate [:add_content] => :renderer def renderer @renderer ||= PDF::Core::Renderer.new(state) end end end end ruby-prawn-2.1.0.orig/lib/prawn/document/column_box.rb0000644000000000000000000000777712665203156021512 0ustar rootroot# encoding: utf-8 # # column_box.rb: Extends BoundingBox to allow for columns of text # # Author Paul Ostazeski. # # This is free software. Please see the LICENSE and COPYING files for details. require_relative "bounding_box" module Prawn class Document # @group Experimental API # A column box is a bounding box with the additional property that when # text flows past the bottom, it will wrap first to another column on the # same page, and only flow to the next page when all the columns are # filled. # # column_box accepts the same parameters as bounding_box, as well as the # number of :columns and a :spacer (in points) between columns. If resetting # the top margin is desired on a new page (e.g. to allow for initial page # wide column titles) the option :reflow_margins => true can be set. # # Defaults are :columns = 3, :spacer = font_size, and # :reflow_margins => false # # Under PDF::Writer, "spacer" was known as "gutter" # def column_box(*args, &block) init_column_box(block) do |parent_box| map_to_absolute!(args[0]) @bounding_box = ColumnBox.new(self, parent_box, *args) end end private def init_column_box(user_block, options = {}, &init_block) parent_box = @bounding_box init_block.call(parent_box) self.y = @bounding_box.absolute_top user_block.call self.y = @bounding_box.absolute_bottom unless options[:hold_position] @bounding_box = parent_box end # Implements the necessary functionality to allow Document#column_box to # work. # class ColumnBox < BoundingBox def initialize(document, parent, point, options = {}) #:nodoc: super @columns = options[:columns] || 3 @spacer = options[:spacer] || @document.font_size @current_column = 0 @reflow_margins = options[:reflow_margins] end # The column width, not the width of the whole box, # before left and/or right padding def bare_column_width (@width - @spacer * (@columns - 1)) / @columns end # The column width after padding. # Used to calculate how long a line of text can be. # def width bare_column_width - (@total_left_padding + @total_right_padding) end # Column width including the spacer. # def width_of_column bare_column_width + @spacer end # x coordinate of the left edge of the current column # def left_side absolute_left + (width_of_column * @current_column) end # Relative position of the left edge of the current column # def left width_of_column * @current_column end # x co-orordinate of the right edge of the current column # def right_side columns_from_right = @columns - (1 + @current_column) absolute_right - (width_of_column * columns_from_right) end # Relative position of the right edge of the current column. # def right left + width end # Moves to the next column or starts a new page if currently positioned at # the rightmost column. def move_past_bottom @current_column = (@current_column + 1) % @columns @document.y = @y if 0 == @current_column if @reflow_margins @y = @parent.absolute_top end @document.start_new_page end end # Override the padding functions so as not to split the padding amount # between all columns on the page. def add_left_padding(left_padding) @total_left_padding += left_padding @x += left_padding end def subtract_left_padding(left_padding) @total_left_padding -= left_padding @x -= left_padding end def add_right_padding(right_padding) @total_right_padding += right_padding end def subtract_right_padding(right_padding) @total_right_padding -= right_padding end end end end ruby-prawn-2.1.0.orig/lib/prawn/security.rb0000644000000000000000000002445212665203156017363 0ustar rootroot# encoding: utf-8 # # encryption.rb : Implements encrypted PDF and access permissions. # # Copyright August 2008, Brad Ediger. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require 'digest/md5' require 'pdf/core/byte_string' require_relative 'security/arcfour' module Prawn class Document # Implements PDF encryption (password protection and permissions) as # specified in the PDF Reference, version 1.3, section 3.5 "Encryption". module Security # @group Experimental API # Encrypts the document, to protect confidential data or control # modifications to the document. The encryption algorithm used is # detailed in the PDF Reference 1.3, section 3.5 "Encryption", and it is # implemented by all major PDF readers. # # +options+ can contain the following: # # :user_password:: Password required to open the document. If # this is omitted or empty, no password will be # required. The document will still be # encrypted, but anyone can read it. # # :owner_password:: Password required to make modifications to # the document or change or override its # permissions. If this is set to # :random, a random password will be # used; this can be useful if you never want # users to be able to override the document # permissions. # # :permissions:: A hash mapping permission symbols (see below) to # true or false. True means # "permitted", and false means "not permitted". # All permissions default to true. # # The following permissions can be specified: # # :print_document:: Print document. # # :modify_contents:: Modify contents of document (other than text # annotations and interactive form fields). # # :copy_contents:: Copy text and graphics from document. # # :modify_annotations:: Add or modify text annotations and # interactive form fields. # # == Examples # # Deny printing to everyone, but allow anyone to open without a password: # # encrypt_document :permissions => { :print_document => false }, # :owner_password => :random # # Set a user and owner password on the document, with full permissions for # both the user and the owner: # # encrypt_document :user_password => 'foo', :owner_password => 'bar' # # Set no passwords, grant all permissions (This is useful because the # default in some readers, if no permissions are specified, is "deny"): # # encrypt_document # # == Caveats # # * The encryption used is weak; the key is password-derived and is # limited to 40 bits, due to US export controls in effect at the time # the PDF standard was written. # # * There is nothing technologically requiring PDF readers to respect the # permissions embedded in a document. Many PDF readers do not. # # * In short, you have no security at all against a moderately # motivated person. Don't use this for anything super-serious. This is # not a limitation of Prawn, but is rather a built-in limitation of the # PDF format. # def encrypt_document(options = {}) Prawn.verify_options [:user_password, :owner_password, :permissions], options @user_password = options.delete(:user_password) || "" @owner_password = options.delete(:owner_password) || @user_password if @owner_password == :random # Generate a completely ridiculous password @owner_password = (1..32).map{ rand(256) }.pack("c*") end self.permissions = options.delete(:permissions) || {} # Shove the necessary entries in the trailer and enable encryption. state.trailer[:Encrypt] = encryption_dictionary state.encrypt = true state.encryption_key = user_encryption_key end # Encrypts the given string under the given key, also requiring the # object ID and generation number of the reference. # See Algorithm 3.1. def self.encrypt_string(str, key, id, gen) # Convert ID and Gen number into little-endian truncated byte strings id = [id].pack('V')[0, 3] gen = [gen].pack('V')[0, 2] extended_key = "#{key}#{id}#{gen}" # Compute the RC4 key from the extended key and perform the encryption rc4_key = Digest::MD5.digest(extended_key)[0, 10] Arcfour.new(rc4_key).encrypt(str) end private # Provides the values for the trailer encryption dictionary. def encryption_dictionary { :Filter => :Standard, # default PDF security handler :V => 1, # "Algorithm 3.1", PDF reference 1.3 :R => 2, # Revision 2 of the algorithm :O => PDF::Core::ByteString.new(owner_password_hash), :U => PDF::Core::ByteString.new(user_password_hash), :P => permissions_value } end # Flags in the permissions word, numbered as LSB = 1 PermissionsBits = { :print_document => 3, :modify_contents => 4, :copy_contents => 5, :modify_annotations => 6 } FullPermissions = 0b1111_1111_1111_1111_1111_1111_1111_1111 def permissions=(perms = {}) @permissions ||= FullPermissions perms.each do |key, value| unless PermissionsBits[key] fail ArgumentError, "Unknown permission :#{key}. Valid options: " + PermissionsBits.keys.map(&:inspect).join(", ") end # 0-based bit number, from LSB bit_position = PermissionsBits[key] - 1 if value # set bit @permissions |= (1 << bit_position) else # clear bit @permissions &= ~(1 << bit_position) end end end def permissions_value @permissions || FullPermissions end PasswordPadding = "28BF4E5E4E758A4164004E56FFFA01082E2E00B6D0683E802F0CA9FE6453697A". scan(/../).map{ |x| x.to_i(16) }.pack("c*") # Pads or truncates a password to 32 bytes as per Alg 3.2. def pad_password(password) password = password[0, 32] password + PasswordPadding[0, 32 - password.length] end def user_encryption_key @user_encryption_key ||= begin md5 = Digest::MD5.new md5 << pad_password(@user_password) md5 << owner_password_hash md5 << [permissions_value].pack("V") md5.digest[0, 5] end end # The O (owner) value in the encryption dictionary. Algorithm 3.3. def owner_password_hash @owner_password_hash ||= begin key = Digest::MD5.digest(pad_password(@owner_password))[0, 5] Arcfour.new(key).encrypt(pad_password(@user_password)) end end # The U (user) value in the encryption dictionary. Algorithm 3.4. def user_password_hash Arcfour.new(user_encryption_key).encrypt(PasswordPadding) end end end end # @private module PDF module Core module_function # Like PdfObject, but returns an encrypted result if required. # For direct objects, requires the object identifier and generation number # from the indirect object referencing obj. # # @private def EncryptedPdfObject(obj, key, id, gen, in_content_stream = false) case obj when Array "[" << obj.map { |e| EncryptedPdfObject(e, key, id, gen, in_content_stream) }.join(' ') << "]" when LiteralString obj = ByteString.new(Prawn::Document::Security.encrypt_string(obj, key, id, gen)).gsub(/[\\\n\(\)]/) { |m| "\\#{m}" } "(#{obj})" when Time obj = obj.strftime("D:%Y%m%d%H%M%S%z").chop.chop + "'00'" obj = ByteString.new(Prawn::Document::Security.encrypt_string(obj, key, id, gen)).gsub(/[\\\n\(\)]/) { |m| "\\#{m}" } "(#{obj})" when String PdfObject( ByteString.new( Prawn::Document::Security.encrypt_string(obj, key, id, gen)), in_content_stream) when ::Hash output = "<< " obj.each do |k, v| unless String === k || Symbol === k fail PDF::Core::Errors::FailedObjectConversion, "A PDF Dictionary must be keyed by names" end output << PdfObject(k.to_sym, in_content_stream) << " " << EncryptedPdfObject(v, key, id, gen, in_content_stream) << "\n" end output << ">>" when NameTree::Value PdfObject(obj.name) + " " + EncryptedPdfObject(obj.value, key, id, gen, in_content_stream) when PDF::Core::OutlineRoot, PDF::Core::OutlineItem EncryptedPdfObject(obj.to_hash, key, id, gen, in_content_stream) else # delegate back to PdfObject PdfObject(obj, in_content_stream) end end # @private class Stream def encrypted_object(key, id, gen) if filtered_stream "stream\n#{Prawn::Document::Security.encrypt_string filtered_stream, key, id, gen}\nendstream\n" else '' end end end # @private class Reference # Returns the object definition for the object this references, keyed from # +key+. def encrypted_object(key) @on_encode.call(self) if @on_encode output = "#{@identifier} #{gen} obj\n" if @stream.empty? output << PDF::Core::EncryptedPdfObject(data, key, @identifier, gen) << "\n" else output << PDF::Core::EncryptedPdfObject(data.merge(@stream.data), key, @identifier, gen) << "\n" << @stream.encrypted_object(key, @identifier, gen) end output << "endobj\n" end end end end ruby-prawn-2.1.0.orig/lib/prawn/stamp.rb0000644000000000000000000001101112665203156016623 0ustar rootroot# encoding: utf-8 # # stamp.rb : Implements a repeatable stamp # # Copyright October 2009, Daniel Nelson. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn # The Prawn::Stamp module is used to create content that will be # included multiple times in a document. Using a stamp has three # advantages over creating content anew each time it is placed on # the page: # i. faster document creation # ii. smaller final document # iii. faster display on subsequent displays of the repeated # element because the viewer application can cache the rendered # results # # Example: # pdf.create_stamp("my_stamp") { # pdf.fill_circle([10, 15], 5) # pdf.draw_text("hello world", :at => [20, 10]) # } # pdf.stamp("my_stamp") # module Stamp # @group Stable API # Renders the stamp named name to the page # raises Prawn::Errors::InvalidName if name.empty? # raises Prawn::Errors::UndefinedObjectName if no stamp # has been created with this name # # Example: # pdf.create_stamp("my_stamp") { # pdf.fill_circle([10, 15], 5) # pdf.text("hello world", :at => [20, 10]) # } # pdf.stamp("my_stamp") # def stamp(name) dictionary_name, dictionary = stamp_dictionary(name) renderer.add_content "/#{dictionary_name} Do" update_annotation_references dictionary.data[:Annots] state.page.xobjects.merge!(dictionary_name => dictionary) end # Renders the stamp named name at a position offset from # the initial coords at which the elements of the stamp was # created # # Example: # pdf.create_stamp("circle") do # pdf.fill_circle([0, 0], 25) # end # # draws a circle at 100, 100 # pdf.stamp_at("circle", [100, 100]) # # See stamp() for exceptions that might be raised # def stamp_at(name, point) translate(point[0], point[1]) { stamp(name) } end # Creates a re-usable stamp named name # # raises Prawn::Errors::NameTaken if a stamp already # exists in this document with this name # raises Prawn::Errors::InvalidName if name.empty? # # Example: # pdf.create_stamp("my_stamp") { # pdf.fill_circle([10, 15], 5) # pdf.draw_text("hello world", :at => [20, 10]) # } # def create_stamp(name, &block) dictionary = create_stamp_dictionary(name) state.page.stamp_stream(dictionary, &block) end private def stamp_dictionary_registry @stamp_dictionary_registry ||= {} end def next_stamp_dictionary_id stamp_dictionary_registry.length + 1 end def stamp_dictionary(name) fail Prawn::Errors::InvalidName if name.empty? if stamp_dictionary_registry[name].nil? fail Prawn::Errors::UndefinedObjectName end dict = stamp_dictionary_registry[name] dictionary_name = dict[:stamp_dictionary_name] dictionary = dict[:stamp_dictionary] [dictionary_name, dictionary] end def create_stamp_dictionary(name) fail Prawn::Errors::InvalidName if name.empty? fail Prawn::Errors::NameTaken unless stamp_dictionary_registry[name].nil? # BBox origin is the lower left margin of the page, so we need # it to be the full dimension of the page, or else things that # should appear near the top or right margin are invisible dictionary = ref!(:Type => :XObject, :Subtype => :Form, :BBox => [0, 0, state.page.dimensions[2], state.page.dimensions[3]]) dictionary_name = "Stamp#{next_stamp_dictionary_id}" stamp_dictionary_registry[name] = { :stamp_dictionary_name => dictionary_name, :stamp_dictionary => dictionary } dictionary end # Referencing annotations from a stamp XObject doesn't result # in a working link. Instead, the references must be appended # to the /Annot dictionary of the object that contains the # call to the stamp object. def update_annotation_references(annots) if annots && annots.any? state.page.dictionary.data[:Annots] ||= [] state.page.dictionary.data[:Annots] |= annots end end def freeze_stamp_graphics update_colors write_line_width write_stroke_cap_style write_stroke_join_style write_stroke_dash end end end ruby-prawn-2.1.0.orig/lib/prawn/soft_mask.rb0000644000000000000000000000426712665203156017504 0ustar rootroot# encoding: utf-8 # # soft_mask.rb : Implements soft-masking # # Copyright September 2012, Alexander Mankuta. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn # The Prawn::SoftMask module is used to create arbitrary transparency in # document. Using a soft mask allows creating more visually rich documents. # # You must group soft mask and graphics it's applied to under # save_graphics_state because soft mask is a part of graphic state in PDF. # # Example: # pdf.save_graphics_state do # pdf.soft_mask do # pdf.fill_color "444444" # pdf.fill_polygon [0, 40], [60, 10], [120, 40], [60, 68] # end # pdf.fill_color '000000' # pdf.fill_rectangle [0, 50], 120, 68 # end # module SoftMask # @group Stable API def soft_mask(&block) renderer.min_version(1.4) group_attrs = ref!( :Type => :Group, :S => :Transparency, :CS => :DeviceRGB, :I => false, :K => false ) group = ref!( :Type => :XObject, :Subtype => :Form, :BBox => state.page.dimensions, :Group => group_attrs ) state.page.stamp_stream(group, &block) mask = ref!( :Type => :Mask, :S => :Luminosity, :G => group ) g_state = ref!( :Type => :ExtGState, :SMask => mask, :AIS => false, :BM => :Normal, :OP => false, :op => false, :OPM => 1, :SA => true ) registry_key = { :bbox => state.page.dimensions, :mask => [group.stream.filters.normalized, group.stream.filtered_stream], :page => state.page_count }.hash if soft_mask_registry[registry_key] renderer.add_content "/#{soft_mask_registry[registry_key]} gs" else masks = page.resources[:ExtGState] ||= {} id = masks.empty? ? 'GS1' : masks.keys.sort.last.succ masks[id] = g_state soft_mask_registry[registry_key] = id renderer.add_content "/#{id} gs" end end private def soft_mask_registry @soft_mask_registry ||= {} end end end ruby-prawn-2.1.0.orig/lib/prawn/font.rb0000644000000000000000000003272312665203156016462 0ustar rootroot# encoding: utf-8 # # font.rb : The Prawn font class # # Copyright May 2008, Gregory Brown / James Healy. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # require_relative "font/afm" require_relative "font/ttf" require_relative "font/dfont" require_relative "font_metric_cache" module Prawn class Document # @group Stable API # Without arguments, this returns the currently selected font. Otherwise, # it sets the current font. When a block is used, the font is applied # transactionally and is rolled back when the block exits. # # Prawn::Document.generate("font.pdf") do # text "Default font is Helvetica" # # font "Times-Roman" # text "Now using Times-Roman" # # font("DejaVuSans.ttf") do # text "Using TTF font from file DejaVuSans.ttf" # font "Courier", :style => :bold # text "You see this in bold Courier" # end # # text "Times-Roman, again" # end # # The :name parameter must be a string. It can be one of the 14 built-in # fonts supported by PDF, or the location of a TTF file. The Font::AFM::BUILT_INS # array specifies the valid built in font values. # # If a ttf font is specified, the glyphs necessary to render your document # will be embedded in the rendered PDF. This should be your preferred option # in most cases. It will increase the size of the resulting file, but also # make it more portable. # # The options parameter is an optional hash providing size and style. To use # the :style option you need to map those font styles to their respective font files. # See font_families for more information. # def font(name = nil, options = {}) return((defined?(@font) && @font) || font("Helvetica")) if name.nil? if state.pages.empty? && !state.page.in_stamp_stream? fail Prawn::Errors::NotOnPage end new_font = find_font(name.to_s, options) if block_given? save_font do set_font(new_font, options[:size]) yield end else set_font(new_font, options[:size]) end @font end # @method font_size(points=nil) # # When called with no argument, returns the current font size. # # When called with a single argument but no block, sets the current font # size. When a block is used, the font size is applied transactionally and # is rolled back when the block exits. You may still change the font size # within a transactional block for individual text segments, or nested calls # to font_size. # # Prawn::Document.generate("font_size.pdf") do # font_size 16 # text "At size 16" # # font_size(10) do # text "At size 10" # text "At size 6", :size => 6 # text "At size 10" # end # # text "At size 16" # end # # When called without an argument, this method returns the current font # size. # def font_size(points = nil) return @font_size unless points size_before_yield = @font_size @font_size = points block_given? ? yield : return @font_size = size_before_yield end # Sets the font size def font_size=(size) font_size(size) end # Returns the width of the given string using the given font. If :size is not # specified as one of the options, the string is measured using the current # font size. You can also pass :kerning as an option to indicate whether # kerning should be used when measuring the width (defaults to +false+). # # Note that the string _must_ be encoded properly for the font being used. # For AFM fonts, this is WinAnsi. For TTF, make sure the font is encoded as # UTF-8. You can use the Font#normalize_encoding method to make sure strings # are in an encoding appropriate for the current font. #-- # For the record, this method used to be a method of Font (and still delegates # to width computations on Font). However, having the primary interface for # calculating string widths exist on Font made it tricky to write extensions # for Prawn in which widths are computed differently (e.g., taking formatting # tags into account, or the like). # # By putting width_of here, on Document itself, extensions may easily override # it and redefine the width calculation behavior. #++ def width_of(string, options = {}) if p = options[:inline_format] p = [] unless p.is_a?(Array) # Build up an Arranger with the entire string on one line, finalize it, # and find its width. arranger = Prawn::Text::Formatted::Arranger.new(self, options) arranger.consumed = self.text_formatter.format(string, *p) arranger.finalize_line arranger.line_width else width_of_string(string, options) end end # Hash that maps font family names to their styled individual font names. # # To add support for another font family, append to this hash, e.g: # # pdf.font_families.update( # "MyTrueTypeFamily" => { :bold => "foo-bold.ttf", # :italic => "foo-italic.ttf", # :bold_italic => "foo-bold-italic.ttf", # :normal => "foo.ttf" }) # # This will then allow you to use the fonts like so: # # pdf.font("MyTrueTypeFamily", :style => :bold) # pdf.text "Some bold text" # pdf.font("MyTrueTypeFamily") # pdf.text "Some normal text" # # This assumes that you have appropriate TTF fonts for each style you # wish to support. # # By default the styles :bold, :italic, :bold_italic, and :normal are # defined for fonts "Courier", "Times-Roman" and "Helvetica". When # defining your own font families, you can map any or all of these # styles to whatever font files you'd like. # def font_families @font_families ||= {}.merge!( "Courier" => { :bold => "Courier-Bold", :italic => "Courier-Oblique", :bold_italic => "Courier-BoldOblique", :normal => "Courier" }, "Times-Roman" => { :bold => "Times-Bold", :italic => "Times-Italic", :bold_italic => "Times-BoldItalic", :normal => "Times-Roman" }, "Helvetica" => { :bold => "Helvetica-Bold", :italic => "Helvetica-Oblique", :bold_italic => "Helvetica-BoldOblique", :normal => "Helvetica" } ) end # @group Experimental API # Sets the font directly, given an actual Font object # and size. # def set_font(font, size = nil) # :nodoc: @font = font @font_size = size if size end # Saves the current font, and then yields. When the block # finishes, the original font is restored. # def save_font @font ||= find_font("Helvetica") original_font = @font original_size = @font_size yield ensure set_font(original_font, original_size) if original_font end # Looks up the given font using the given criteria. Once a font has been # found by that matches the criteria, it will be cached to subsequent lookups # for that font will return the same object. #-- # Challenges involved: the name alone is not sufficient to uniquely identify # a font (think dfont suitcases that can hold multiple different fonts in a # single file). Thus, the :name key is included in the cache key. # # It is further complicated, however, since fonts in some formats (like the # dfont suitcases) can be identified either by numeric index, OR by their # name within the suitcase, and both should hash to the same font object # (to avoid the font being embedded multiple times). This is not yet implemented, # which means if someone selects a font both by name, and by index, the # font will be embedded twice. Since we do font subsetting, this double # embedding won't be catastrophic, just annoying. # ++ # # @private def find_font(name, options = {}) #:nodoc: if font_families.key?(name) family, name = name, font_families[name][options[:style] || :normal] if name.is_a?(::Hash) options = options.merge(name) name = options[:file] end end key = "#{name}:#{options[:font] || 0}" if name.is_a? Prawn::Font font_registry[key] = name else font_registry[key] ||= Font.load(self, name, options.merge(family: family)) end end # Hash of Font objects keyed by names # def font_registry #:nodoc: @font_registry ||= {} end private def width_of_inline_formatted_string(string, options = {}) # Build up an Arranger with the entire string on one line, finalize it, # and find its width. arranger = Prawn::Text::Formatted::Arranger.new(self, options) arranger.consumed = Text::Formatted::Parser.format(string) arranger.finalize_line arranger.line_width end def width_of_string(string, options = {}) font_metric_cache.width_of(string, options) end end # Provides font information and helper functions. # class Font # The current font name attr_reader :name # The current font family attr_reader :family # The options hash used to initialize the font attr_reader :options # Shortcut interface for constructing a font object. Filenames of the form # *.ttf will call Font::TTF.new, *.dfont Font::DFont.new, and anything else # will be passed through to Font::AFM.new() def self.load(document, src, options = {}) case font_format(src, options) when 'ttf' then TTF.new(document, src, options) when 'dfont' then DFont.new(document, src, options) else AFM.new(document, src, options) end end def self.font_format(src, options) return options.fetch(:format, 'ttf') if src.respond_to? :read case src.to_s when /\.ttf$/i then return 'ttf' when /\.dfont$/i then return 'dfont' else return 'afm' end end def initialize(document, name, options = {}) #:nodoc: @document = document @name = name @options = options @family = options[:family] @identifier = generate_unique_id @references = {} end # The size of the font ascender in PDF points # def ascender @ascender / 1000.0 * size end # The size of the font descender in PDF points # def descender -@descender / 1000.0 * size end # The size of the recommended gap between lines of text in PDF points # def line_gap @line_gap / 1000.0 * size end # Normalizes the encoding of the string to an encoding supported by the # font. The string is expected to be UTF-8 going in. It will be re-encoded # and the new string will be returned. For an in-place (destructive) # version, see normalize_encoding!. def normalize_encoding(string) fail NotImplementedError, "subclasses of Prawn::Font must implement #normalize_encoding" end # Destructive version of normalize_encoding; normalizes the encoding of a # string in place. # def normalize_encoding!(str) str.replace(normalize_encoding(str)) end # Gets height of current font in PDF points at the given font size # def height_at(size) @normalized_height ||= (@ascender - @descender + @line_gap) / 1000.0 @normalized_height * size end # Gets height of current font in PDF points at current font size # def height height_at(size) end # Registers the given subset of the current font with the current PDF # page. This is safe to call multiple times for a given font and subset, # as it will only add the font the first time it is called. # def add_to_current_page(subset) @references[subset] ||= register(subset) @document.state.page.fonts.merge!(identifier_for(subset) => @references[subset]) end def identifier_for(subset) #:nodoc: "#{@identifier}.#{subset}" end def inspect #:nodoc: "#{self.class.name}< #{name}: #{size} >" end # Return a hash (as in Object#hash) for the font based on the output of # #inspect. This is required since font objects are used as keys in hashes # that cache certain values (See # Prawn::Table::Text#styled_with_of_single_character) # def hash #:nodoc: [ self.class, self.name, self.family, size ].hash end # Compliments the #hash implementation above # def eql?(other) #:nodoc: self.class == other.class && self.name == other.name && self.family == other.family && size == other.send(:size) end private # generate a font identifier that hasn't been used on the current page yet # def generate_unique_id key = nil font_count = @document.font_registry.size + 1 loop do key = :"F#{font_count}" break if key_is_unique?(key) font_count += 1 end key end def key_is_unique?(test_key) !@document.state.page.fonts.keys.any? do |key| key.to_s.start_with?("#{test_key}.") end end def size @document.font_size end end end ruby-prawn-2.1.0.orig/lib/prawn/image_handler.rb0000644000000000000000000000162312665203156020266 0ustar rootroot# encoding: utf-8 # ImageHandler provides a way to register image processors with Prawn # # Contributed by Evan Sharp in November 2013. # # This is free software. Please see the LICENSE and COPYING files for details. module Prawn # @group Extension API def self.image_handler @image_handler ||= ImageHandler.new end class ImageHandler def initialize @handlers = [] end def register(handler) @handlers.delete(handler) @handlers.push handler end def register!(handler) @handlers.delete(handler) @handlers.unshift handler end def unregister(handler) @handlers.reject!{ |h| h == handler } end def find(image_blob) handler = @handlers.find{ |h| h.can_render? image_blob } return handler if handler fail Prawn::Errors::UnsupportedImageType, "image file is an unrecognised format" end end end ruby-prawn-2.1.0.orig/lib/prawn/grid.rb0000644000000000000000000001505612665203156016441 0ustar rootroot# encoding: utf-8 # grid.rb: Provides a basic grid layout system for Prawn # # Contributed by Andrew O'Brien in March 2009 # # This is free software. Please see the LICENSE and COPYING files for details. module Prawn class Document # @group Experimental API # Defines the grid system for a particular document. Takes the number of # rows and columns and the width to use for the gutter as the # keys :rows, :columns, :gutter, :row_gutter, :column_gutter # # Note that a completely new grid object is built each time define_grid() # is called. This means that all subsequent calls to grid() will use # the newly defined Grid object -- grids are not nestable like # bounding boxes are. def define_grid(options = {}) @boxes = nil @grid = Grid.new(self, options) end # A method that can either be used to access a particular grid on the page # or work with the grid system directly. # # @pdf.grid # Get the Grid directly # @pdf.grid([0,1]) # Get the GridBox at [0,1] # @pdf.grid([0,1], [1,2]) # Get a multi-box spanning from [0,1] to [1,2] # def grid(*args) @boxes ||= {} return @boxes[args] if @boxes[args] if args.empty? @boxes[args] = @grid else g1, g2 = args if g1.class == Array && g2.class == Array && g1.length == 2 && g2.length == 2 @boxes[args] = multi_box(single_box(*g1), single_box(*g2)) else @boxes[args] = single_box(g1, g2) end end @boxes[args] end # A Grid represents the entire grid system of a Page and calculates # the column width and row height of the base box. # # @group Experimental API class Grid attr_reader :pdf, :columns, :rows, :gutter, :row_gutter, :column_gutter def initialize(pdf, options = {}) # :nodoc: valid_options = [:columns, :rows, :gutter, :row_gutter, :column_gutter] Prawn.verify_options valid_options, options @pdf = pdf @columns = options[:columns] @rows = options[:rows] set_gutter(options) end # Calculates the base width of boxes. def column_width @column_width ||= subdivide(pdf.bounds.width, columns, column_gutter) end # Calculates the base height of boxes. def row_height @row_height ||= subdivide(pdf.bounds.height, rows, row_gutter) end # Diagnostic tool to show all of the grids. Defaults to gray. def show_all(color = "CCCCCC") self.rows.times do |i| self.columns.times do |j| pdf.grid(i, j).show(color) end end end private def subdivide(total, num, gutter) (total.to_f - (gutter * (num - 1).to_f)) / num.to_f end def set_gutter(options) if options.key?(:gutter) @gutter = options[:gutter].to_f @row_gutter, @column_gutter = @gutter, @gutter else @row_gutter = options[:row_gutter].to_f @column_gutter = options[:column_gutter].to_f @gutter = 0 end end end # A Box is a class that represents a bounded area of a page. # A Grid object has methods that allow easy access to the coordinates of # its corners, which can be plugged into most existing prawnmethods. # # @group Experimental API class GridBox attr_reader :pdf def initialize(pdf, i, j) @pdf = pdf @i = i @j = j end # Mostly diagnostic method that outputs the name of a box as # col_num, row_num # def name "#{@i.to_s},#{@j.to_s}" end # :nodoc def total_height pdf.bounds.height.to_f end # Width of a box def width grid.column_width.to_f end # Height of a box def height grid.row_height.to_f end # Width of the gutter def gutter grid.gutter.to_f end # x-coordinate of left side def left @left ||= (width + grid.column_gutter) * @j.to_f end # x-coordinate of right side def right @right ||= left + width end # y-coordinate of the top def top @top ||= total_height - ((height + grid.row_gutter) * @i.to_f) end # y-coordinate of the bottom def bottom @bottom ||= top - height end # x,y coordinates of top left corner def top_left [left, top] end # x,y coordinates of top right corner def top_right [right, top] end # x,y coordinates of bottom left corner def bottom_left [left, bottom] end # x,y coordinates of bottom right corner def bottom_right [right, bottom] end # Creates a standard bounding box based on the grid box. def bounding_box(&blk) pdf.bounding_box(top_left, :width => width, :height => height, &blk) end # Diagnostic method def show(grid_color = "CCCCCC") self.bounding_box do original_stroke_color = pdf.stroke_color pdf.stroke_color = grid_color pdf.text self.name pdf.stroke_bounds pdf.stroke_color = original_stroke_color end end private def grid pdf.grid end end # A MultiBox is specified by 2 Boxes and spans the areas between. # # @group Experimental API class MultiBox < GridBox def initialize(pdf, b1, b2) @pdf = pdf @bs = [b1, b2] end def name @bs.map(&:name).join(":") end def total_height @bs[0].total_height end def width right_box.right - left_box.left end def height top_box.top - bottom_box.bottom end def gutter @bs[0].gutter end def left left_box.left end def right right_box.right end def top top_box.top end def bottom bottom_box.bottom end private def left_box @left_box ||= @bs.min { |a, b| a.left <=> b.left } end def right_box @right_box ||= @bs.max { |a, b| a.right <=> b.right } end def top_box @top_box ||= @bs.max { |a, b| a.top <=> b.top } end def bottom_box @bottom_box ||= @bs.min { |a, b| a.bottom <=> b.bottom } end end private def single_box(i, j) GridBox.new(self, i, j) end def multi_box(b1, b2) MultiBox.new(self, b1, b2) end end end ruby-prawn-2.1.0.orig/lib/prawn/measurement_extensions.rb0000644000000000000000000000135112665203156022311 0ustar rootroot# encoding: utf-8 # measurement_extensions.rb: Core extensions for Prawn::Measurements # # Copyright December 2008, Florian Witteler. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require_relative 'measurements' # @group Stable API class Numeric include Prawn::Measurements # prawns' basic unit is PostScript-Point # 72 points per inch # @group Experimental API def mm return mm2pt(self) end def cm return cm2pt(self) end def dm return dm2pt(self) end def m return m2pt(self) end def in return in2pt(self) end def yd return yd2pt(self) end def ft return ft2pt(self) end def pt return pt2pt(self) end end ruby-prawn-2.1.0.orig/lib/prawn/security/0000755000000000000000000000000012665203156017027 5ustar rootrootruby-prawn-2.1.0.orig/lib/prawn/security/arcfour.rb0000644000000000000000000000266212665203156021023 0ustar rootroot# encoding: utf-8 # Implementation of the "ARCFOUR" algorithm ("alleged RC4 (tm)"). Implemented # as described at: # http://www.mozilla.org/projects/security/pki/nss/draft-kaukonen-cipher-arcfour-03.txt # # "RC4" is a trademark of RSA Data Security, Inc. # # Copyright August 2009, Brad Ediger. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # @private class Arcfour def initialize(key) # Convert string key to Array of integers key = key.unpack('c*') if key.is_a?(String) # 1. Allocate an 256 element array of 8 bit bytes to be used as an S-box # 2. Initialize the S-box. Fill each entry first with it's index @sbox = (0..255).to_a # 3. Fill another array of the same size (256) with the key, repeating # bytes as necessary. s2 = [] while s2.length < 256 s2 += key end s2 = s2[0, 256] # 4. Set j to zero and initialize the S-box j = 0 (0..255).each do |i| j = (j + @sbox[i] + s2[i]) % 256 @sbox[i], @sbox[j] = @sbox[j], @sbox[i] end @i = @j = 0 end def encrypt(string) string.unpack('c*').map{ |byte| byte ^ key_byte }.pack('c*') end private # Produces the next byte of key material in the stream (3.2 Stream Generation) def key_byte @i = (@i + 1) % 256 @j = (@j + @sbox[@i]) % 256 @sbox[@i], @sbox[@j] = @sbox[@j], @sbox[@i] @sbox[(@sbox[@i] + @sbox[@j]) % 256] end end ruby-prawn-2.1.0.orig/lib/prawn/font/0000755000000000000000000000000012665203156016126 5ustar rootrootruby-prawn-2.1.0.orig/lib/prawn/font/dfont.rb0000644000000000000000000000221412665203156017564 0ustar rootroot# encoding: utf-8 # # font.rb : The Prawn font class # # Copyright November 2008, Jamis Buck. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # require_relative 'ttf' module Prawn class Font # @private class DFont < TTF # Returns a list of the names of all named fonts in the given dfont file. # Note that fonts are not required to be named in a dfont file, so the # list may be empty even if the file does contain fonts. Also, note that # the list is returned in no particular order, so the first font in the # list is not necessarily the font at index 0 in the file. # def self.named_fonts(file) TTFunk::ResourceFile.open(file) do |f| return f.resources_for("sfnt") end end # Returns the number of fonts contained in the dfont file. # def self.font_count(file) TTFunk::ResourceFile.open(file) do |f| return f.map["sfnt"][:list].length end end private def read_ttf_file TTFunk::File.from_dfont(@name, @options[:font] || 0) end end end end ruby-prawn-2.1.0.orig/lib/prawn/font/ttf.rb0000644000000000000000000002533112665203156017254 0ustar rootroot# encoding: utf-8 # prawn/font/ttf.rb : Implements AFM font support for Prawn # # Copyright May 2008, Gregory Brown / James Healy / Jamis Buck # All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require 'ttfunk' require 'ttfunk/subset_collection' module Prawn class Font # @private class TTF < Font attr_reader :ttf, :subsets def unicode? true end def initialize(document, name, options = {}) super @ttf = read_ttf_file @subsets = TTFunk::SubsetCollection.new(@ttf) @attributes = {} @bounding_boxes = {} @char_widths = {} @has_kerning_data = @ttf.kerning.exists? && @ttf.kerning.tables.any? @ascender = Integer(@ttf.ascent * scale_factor) @descender = Integer(@ttf.descent * scale_factor) @line_gap = Integer(@ttf.line_gap * scale_factor) end # NOTE: +string+ must be UTF8-encoded. def compute_width_of(string, options = {}) #:nodoc: scale = (options[:size] || size) / 1000.0 if options[:kerning] kern(string).inject(0) do |s, r| if r.is_a?(Numeric) s - r else r.inject(s) { |s2, u| s2 + character_width_by_code(u) } end end * scale else string.codepoints.inject(0) do |s, r| s + character_width_by_code(r) end * scale end end # The font bbox, as an array of integers # def bbox @bbox ||= @ttf.bbox.map { |i| Integer(i * scale_factor) } end # Returns true if the font has kerning data, false otherwise def has_kerning_data? @has_kerning_data end # Perform any changes to the string that need to happen # before it is rendered to the canvas. Returns an array of # subset "chunks", where the even-numbered indices are the # font subset number, and the following entry element is # either a string or an array (for kerned text). # # The +text+ parameter must be UTF8-encoded. # def encode_text(text, options = {}) text = text.chomp if options[:kerning] last_subset = nil kern(text).inject([]) do |result, element| if element.is_a?(Numeric) result.last[1] = [result.last[1]] unless result.last[1].is_a?(Array) result.last[1] << element result else encoded = @subsets.encode(element) if encoded.first[0] == last_subset result.last[1] << encoded.first[1] encoded.shift end if encoded.any? last_subset = encoded.last[0] result + encoded else result end end end else @subsets.encode(text.unpack("U*")) end end def basename @basename ||= @ttf.name.postscript_name end # not sure how to compute this for true-type fonts... def stemV 0 end def italic_angle return @italic_angle if @italic_angle if @ttf.postscript.exists? raw = @ttf.postscript.italic_angle hi, low = raw >> 16, raw & 0xFF hi = -((hi ^ 0xFFFF) + 1) if hi & 0x8000 != 0 @italic_angle = "#{hi}.#{low}".to_f else @italic_angle = 0 end @italic_angle end def cap_height @cap_height ||= begin height = @ttf.os2.exists? && @ttf.os2.cap_height || 0 height == 0 ? @ascender : height end end def x_height # FIXME: seems like if os2 table doesn't exist, we could # just find the height of the lower-case 'x' glyph? @ttf.os2.exists? && @ttf.os2.x_height || 0 end def family_class @family_class ||= (@ttf.os2.exists? && @ttf.os2.family_class || 0) >> 8 end def serif? @serif ||= [1, 2, 3, 4, 5, 7].include?(family_class) end def script? @script ||= family_class == 10 end def pdf_flags @flags ||= begin flags = 0 flags |= 0x0001 if @ttf.postscript.fixed_pitch? flags |= 0x0002 if serif? flags |= 0x0008 if script? flags |= 0x0040 if italic_angle != 0 flags |= 0x0004 # assume the font contains at least some non-latin characters end end def normalize_encoding(text) begin text.encode(::Encoding::UTF_8) rescue => e puts e raise Prawn::Errors::IncompatibleStringEncoding, "Encoding " \ "#{text.encoding} can not be transparently converted to UTF-8. " \ "Please ensure the encoding of the string you are attempting " \ "to use is set correctly" end end def to_utf8(text) text.encode("UTF-8") end def glyph_present?(char) code = char.codepoints.first cmap[code] > 0 end # Returns the number of characters in +str+ (a UTF-8-encoded string). # def character_count(str) str.length end private def cmap @cmap ||= @ttf.cmap.unicode.first or fail("no unicode cmap for font") end # +string+ must be UTF8-encoded. # # Returns an array. If an element is a numeric, it represents the # kern amount to inject at that position. Otherwise, the element # is an array of UTF-16 characters. def kern(string) a = [] string.each_codepoint do |r| if a.empty? a << [r] elsif (kern = kern_pairs_table[[cmap[a.last.last], cmap[r]]]) kern *= scale_factor a << -kern << [r] else a.last << r end end a end def kern_pairs_table @kerning_data ||= has_kerning_data? ? @ttf.kerning.tables.first.pairs : {} end def cid_to_gid_map max = cmap.code_map.keys.max (0..max).map { |cid| cmap[cid] }.pack("n*") end def hmtx @hmtx ||= @ttf.horizontal_metrics end def character_width_by_code(code) return 0 unless cmap[code] # Some TTF fonts have nonzero widths for \n (UTF-8 / ASCII code: 10). # Patch around this as we'll never be drawing a newline with a width. return 0.0 if code == 10 @char_widths[code] ||= Integer(hmtx.widths[cmap[code]] * scale_factor) end def scale_factor @scale ||= 1000.0 / @ttf.header.units_per_em end def register(subset) temp_name = @ttf.name.postscript_name.gsub("\0", "").to_sym ref = @document.ref!(:Type => :Font, :BaseFont => temp_name) # Embed the font metrics in the document after everything has been # drawn, just before the document is emitted. @document.renderer.before_render { |doc| embed(ref, subset) } ref end def embed(reference, subset) font_content = @subsets[subset].encode # FIXME: we need postscript_name and glyph widths from the font # subset. Perhaps this could be done by querying the subset, # rather than by parsing the font that the subset produces? font = TTFunk::File.new(font_content) # empirically, it looks like Adobe Reader will not display fonts # if their font name is more than 33 bytes long. Strange. But true. basename = font.name.postscript_name[0, 33].gsub("\0", "") fail "Can't detect a postscript name for #{file}" if basename.nil? fontfile = @document.ref!(:Length1 => font_content.size) fontfile.stream << font_content fontfile.stream.compress! descriptor = @document.ref!(:Type => :FontDescriptor, :FontName => basename.to_sym, :FontFile2 => fontfile, :FontBBox => bbox, :Flags => pdf_flags, :StemV => stemV, :ItalicAngle => italic_angle, :Ascent => @ascender, :Descent => @descender, :CapHeight => cap_height, :XHeight => x_height) hmtx = font.horizontal_metrics widths = font.cmap.tables.first.code_map.map { |gid| Integer(hmtx.widths[gid] * scale_factor) }[32..-1] # It would be nice to have Encoding set for the macroman subsets, # and only do a ToUnicode cmap for non-encoded unicode subsets. # However, apparently Adobe Reader won't render MacRoman encoded # subsets if original font contains unicode characters. (It has to # be some flag or something that ttfunk is simply copying over... # but I can't figure out which flag that is.) # # For now, it's simplest to just create a unicode cmap for every font. # It offends my inner purist, but it'll do. map = @subsets[subset].to_unicode_map ranges = [[]] map.keys.sort.inject("") do |s, code| ranges << [] if ranges.last.length >= 100 unicode = map[code] ranges.last << "<%02x><%04x>" % [code, unicode] end range_blocks = ranges.inject("") do |s, list| s << "%d beginbfchar\n%s\nendbfchar\n" % [list.length, list.join("\n")] end to_unicode_cmap = UNICODE_CMAP_TEMPLATE % range_blocks.strip cmap = @document.ref!({}) cmap << to_unicode_cmap cmap.stream.compress! reference.data.update(:Subtype => :TrueType, :BaseFont => basename.to_sym, :FontDescriptor => descriptor, :FirstChar => 32, :LastChar => 255, :Widths => @document.ref!(widths), :ToUnicode => cmap) end UNICODE_CMAP_TEMPLATE = <<-STR.strip.gsub(/^\s*/, "") /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <00> endcodespacerange %s endcmap CMapName currentdict /CMap defineresource pop end end STR def read_ttf_file TTFunk::File.open(@name) end end end end ruby-prawn-2.1.0.orig/lib/prawn/font/afm.rb0000644000000000000000000001772312665203156017230 0ustar rootroot# encoding: utf-8 # prawn/font/afm.rb : Implements AFM font support for Prawn # # Copyright May 2008, Gregory Brown / James Healy. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require_relative "../encoding" module Prawn class Font # @private class AFM < Font class << self attr_accessor :hide_m17n_warning end self.hide_m17n_warning = false BUILT_INS = %w[ Courier Helvetica Times-Roman Symbol ZapfDingbats Courier-Bold Courier-Oblique Courier-BoldOblique Times-Bold Times-Italic Times-BoldItalic Helvetica-Bold Helvetica-Oblique Helvetica-BoldOblique ] def unicode? false end def self.metrics_path if m = ENV['METRICS'] @metrics_path ||= m.split(':') else @metrics_path ||= [ ".", "/usr/lib/afm", "/usr/local/lib/afm", "/usr/openwin/lib/fonts/afm", Prawn::DATADIR + '/fonts' ] end end attr_reader :attributes #:nodoc: def initialize(document, name, options = {}) #:nodoc: unless BUILT_INS.include?(name) fail Prawn::Errors::UnknownFont, "#{name} is not a known font." end super @@font_data ||= SynchronizedCache.new # parse each ATM font file once only file_name = @name.dup file_name << ".afm" unless file_name =~ /\.afm$/ file_name = file_name[0] == '/' ? file_name : find_font(file_name) font_data = @@font_data[file_name] ||= parse_afm(file_name) @glyph_widths = font_data[:glyph_widths] @glyph_table = font_data[:glyph_table] @bounding_boxes = font_data[:bounding_boxes] @kern_pairs = font_data[:kern_pairs] @kern_pair_table = font_data[:kern_pair_table] @attributes = font_data[:attributes] @ascender = @attributes["ascender"].to_i @descender = @attributes["descender"].to_i @line_gap = Float(bbox[3] - bbox[1]) - (@ascender - @descender) end # The font bbox, as an array of integers # def bbox @bbox ||= @attributes['fontbbox'].split(/\s+/).map { |e| Integer(e) } end # NOTE: String *must* be encoded as WinAnsi def compute_width_of(string, options = {}) #:nodoc: scale = (options[:size] || size) / 1000.0 if options[:kerning] strings, numbers = kern(string).partition { |e| e.is_a?(String) } total_kerning_offset = numbers.inject(0.0) { |s, r| s + r } (unscaled_width_of(strings.join) - total_kerning_offset) * scale else unscaled_width_of(string) * scale end end # Returns true if the font has kerning data, false otherwise # def has_kerning_data? @kern_pairs.any? end # built-in fonts only work with winansi encoding, so translate the # string. Changes the encoding in-place, so the argument itself # is replaced with a string in WinAnsi encoding. # def normalize_encoding(text) text.encode("windows-1252") rescue ::Encoding::InvalidByteSequenceError, ::Encoding::UndefinedConversionError raise Prawn::Errors::IncompatibleStringEncoding, "Your document includes text that's not compatible with the Windows-1252 character set.\n" \ "If you need full UTF-8 support, use TTF fonts instead of PDF's built-in fonts\n." end def to_utf8(text) text.encode("UTF-8") end # Returns the number of characters in +str+ (a WinAnsi-encoded string). # def character_count(str) str.length end # Perform any changes to the string that need to happen # before it is rendered to the canvas. Returns an array of # subset "chunks", where each chunk is an array of two elements. # The first element is the font subset number, and the second # is either a string or an array (for kerned text). # # For Adobe fonts, there is only ever a single subset, so # the first element of the array is "0", and the second is # the string itself (or an array, if kerning is performed). # # The +text+ parameter must be in WinAnsi encoding (cp1252). # def encode_text(text, options = {}) [[0, options[:kerning] ? kern(text) : text]] end def glyph_present?(char) !!normalize_encoding(char) rescue Prawn::Errors::IncompatibleStringEncoding false end private def register(subset) font_dict = { :Type => :Font, :Subtype => :Type1, :BaseFont => name.to_sym } # Symbolic AFM fonts (Symbol, ZapfDingbats) have their own encodings font_dict.merge!(:Encoding => :WinAnsiEncoding) unless symbolic? @document.ref!(font_dict) end def symbolic? attributes["characterset"] == "Special" end def find_font(file) self.class.metrics_path.find { |f| File.exist? "#{f}/#{file}" } + "/#{file}" rescue NoMethodError raise Prawn::Errors::UnknownFont, "Couldn't find the font: #{file} in any of:\n" + self.class.metrics_path.join("\n") end def parse_afm(file_name) data = { :glyph_widths => {}, :bounding_boxes => {}, :kern_pairs => {}, :attributes => {} } section = [] File.foreach(file_name) do |line| case line when /^Start(\w+)/ section.push $1 next when /^End(\w+)/ section.pop next end case section when ["FontMetrics", "CharMetrics"] next unless line =~ /^CH?\s/ name = line[/\bN\s+(\.?\w+)\s*;/, 1] data[:glyph_widths][name] = line[/\bWX\s+(\d+)\s*;/, 1].to_i data[:bounding_boxes][name] = line[/\bB\s+([^;]+);/, 1].to_s.rstrip when ["FontMetrics", "KernData", "KernPairs"] next unless line =~ /^KPX\s+(\.?\w+)\s+(\.?\w+)\s+(-?\d+)/ data[:kern_pairs][[$1, $2]] = $3.to_i when ["FontMetrics", "KernData", "TrackKern"], ["FontMetrics", "Composites"] next else parse_generic_afm_attribute(line, data) end end # process data parsed from AFM file to build tables which # will be used when measuring and kerning text data[:glyph_table] = (0..255).map do |i| data[:glyph_widths][Encoding::WinAnsi::CHARACTERS[i]].to_i end character_hash = Hash[Encoding::WinAnsi::CHARACTERS.zip((0..Encoding::WinAnsi::CHARACTERS.size).to_a)] data[:kern_pair_table] = data[:kern_pairs].each_with_object({}) do |p, h| h[p[0].map { |n| character_hash[n] }] = p[1] end data.each_value(&:freeze) data.freeze end def parse_generic_afm_attribute(line, hash) line =~ /(^\w+)\s+(.*)/ key, value = $1.to_s.downcase, $2 hash[:attributes][key] = hash[:attributes][key] ? Array(hash[:attributes][key]) << value : value end # converts a string into an array with spacing offsets # bewteen characters that need to be kerned # # String *must* be encoded as WinAnsi # def kern(string) kerned = [[]] last_byte = nil string.each_byte do |byte| if k = last_byte && @kern_pair_table[[last_byte, byte]] kerned << -k << [byte] else kerned.last << byte end last_byte = byte end kerned.map { |e| e = (Array === e ? e.pack("C*") : e) e.respond_to?(:force_encoding) ? e.force_encoding(::Encoding::Windows_1252) : e } end private def unscaled_width_of(string) string.bytes.inject(0) do |s, r| s + @glyph_table[r] end end end end end ruby-prawn-2.1.0.orig/lib/prawn/document.rb0000644000000000000000000005642312665203156017335 0ustar rootroot# encoding: utf-8 # document.rb : Implements PDF document generation for Prawn # # Copyright April 2008, Gregory Brown. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require "stringio" require_relative "document/bounding_box" require_relative "document/column_box" require_relative "document/internals" require_relative "document/span" module Prawn # The Prawn::Document class is how you start creating a PDF document. # # There are three basic ways you can instantiate PDF Documents in Prawn, they # are through assignment, implicit block or explicit block. Below is an exmple # of each type, each example does exactly the same thing, makes a PDF document # with all the defaults and puts in the default font "Hello There" and then # saves it to the current directory as "example.pdf" # # For example, assignment can be like this: # # pdf = Prawn::Document.new # pdf.text "Hello There" # pdf.render_file "example.pdf" # # Or you can do an implied block form: # # Prawn::Document.generate "example.pdf" do # text "Hello There" # end # # Or if you need to access a variable outside the scope of the block, the # explicit block form: # # words = "Hello There" # Prawn::Document.generate "example.pdf" do |pdf| # pdf.text words # end # # Usually, the block forms are used when you are simply creating a PDF document # that you want to immediately save or render out. # # See the new and generate methods for further details on the above. # class Document include Prawn::Document::Internals include PDF::Core::Annotations include PDF::Core::Destinations include Prawn::Document::Security include Prawn::Text include Prawn::Graphics include Prawn::Images include Prawn::Stamp include Prawn::SoftMask include Prawn::TransformationStack # @group Extension API # NOTE: We probably need to rethink the options validation system, but this # constant temporarily allows for extensions to modify the list. VALID_OPTIONS = [:page_size, :page_layout, :margin, :left_margin, :right_margin, :top_margin, :bottom_margin, :skip_page_creation, :compress, :background, :info, :text_formatter, :print_scaling] # Any module added to this array will be included into instances of # Prawn::Document at the per-object level. These will also be inherited by # any subclasses. # # Example: # # module MyFancyModule # # def party! # text "It's a big party!" # end # # end # # Prawn::Document.extensions << MyFancyModule # # Prawn::Document.generate("foo.pdf") do # party! # end # # def self.extensions @extensions ||= [] end # @private def self.inherited(base) extensions.each { |e| base.extensions << e } end # @group Stable Attributes attr_accessor :margin_box attr_reader :margins, :y attr_accessor :page_number # @group Extension Attributes attr_accessor :text_formatter # @group Stable API # Creates and renders a PDF document. # # When using the implicit block form, Prawn will evaluate the block # within an instance of Prawn::Document, simplifying your syntax. # However, please note that you will not be able to reference variables # from the enclosing scope within this block. # # # Using implicit block form and rendering to a file # Prawn::Document.generate "example.pdf" do # # self here is set to the newly instantiated Prawn::Document # # and so any variables in the outside scope are unavailable # font "Times-Roman" # draw_text "Hello World", :at => [200,720], :size => 32 # end # # If you need to access your local and instance variables, use the explicit # block form shown below. In this case, Prawn yields an instance of # PDF::Document and the block is an ordinary closure: # # # Using explicit block form and rendering to a file # content = "Hello World" # Prawn::Document.generate "example.pdf" do |pdf| # # self here is left alone # pdf.font "Times-Roman" # pdf.draw_text content, :at => [200,720], :size => 32 # end # def self.generate(filename, options = {}, &block) pdf = new(options, &block) pdf.render_file(filename) end # Creates a new PDF Document. The following options are available (with # the default values marked in []) # # :page_size:: One of the PDF::Core::PageGeometry sizes [LETTER] # :page_layout:: Either :portrait or :landscape # :margin:: Sets the margin on all sides in points [0.5 inch] # :left_margin:: Sets the left margin in points [0.5 inch] # :right_margin:: Sets the right margin in points [0.5 inch] # :top_margin:: Sets the top margin in points [0.5 inch] # :bottom_margin:: Sets the bottom margin in points [0.5 inch] # :skip_page_creation:: Creates a document without starting the first page [false] # :compress:: Compresses content streams before rendering them [false] # :background:: An image path to be used as background on all pages [nil] # :background_scale:: Backgound image scale [1] [nil] # :info:: Generic hash allowing for custom metadata properties [nil] # :text_formatter: The text formatter to use for :inline_formatted text [Prawn::Text::Formatted::Parser] # # Setting e.g. the :margin to 100 points and the :left_margin to 50 will result in margins # of 100 points on every side except for the left, where it will be 50. # # The :margin can also be an array much like CSS shorthand: # # # Top and bottom are 20, left and right are 100. # :margin => [20, 100] # # Top is 50, left and right are 100, bottom is 20. # :margin => [50, 100, 20] # # Top is 10, right is 20, bottom is 30, left is 40. # :margin => [10, 20, 30, 40] # # Additionally, :page_size can be specified as a simple two value array giving # the width and height of the document you need in PDF Points. # # Usage: # # # New document, US Letter paper, portrait orientation # pdf = Prawn::Document.new # # # New document, A4 paper, landscaped # pdf = Prawn::Document.new(:page_size => "A4", :page_layout => :landscape) # # # New document, Custom size # pdf = Prawn::Document.new(:page_size => [200, 300]) # # # New document, with background # pdf = Prawn::Document.new(:background => "#{Prawn::DATADIR}/images/pigs.jpg") # def initialize(options = {}, &block) options = options.dup Prawn.verify_options VALID_OPTIONS, options # need to fix, as the refactoring breaks this # raise NotImplementedError if options[:skip_page_creation] self.class.extensions.reverse_each { |e| extend e } self.state = PDF::Core::DocumentState.new(options) self.state.populate_pages_from_store(self) renderer.min_version(state.store.min_version) if state.store.min_version renderer.min_version(1.6) if options[:print_scaling] == :none @background = options[:background] @background_scale = options[:background_scale] || 1 @font_size = 12 @bounding_box = nil @margin_box = nil @page_number = 0 @text_formatter = options.delete(:text_formatter) || Text::Formatted::Parser options[:size] = options.delete(:page_size) options[:layout] = options.delete(:page_layout) initialize_first_page(options) @bounding_box = @margin_box if block block.arity < 1 ? instance_eval(&block) : block[self] end end # @group Stable API # Creates and advances to a new page in the document. # # Page size, margins, and layout can also be set when generating a # new page. These values will become the new defaults for page creation # # pdf.start_new_page #=> Starts new page keeping current values # pdf.start_new_page(:size => "LEGAL", :layout => :landscape) # pdf.start_new_page(:left_margin => 50, :right_margin => 50) # pdf.start_new_page(:margin => 100) # def start_new_page(options = {}) if last_page = state.page last_page_size = last_page.size last_page_layout = last_page.layout last_page_margins = last_page.margins.dup end page_options = { :size => options[:size] || last_page_size, :layout => options[:layout] || last_page_layout, :margins => last_page_margins } if last_page new_graphic_state = last_page.graphic_state.dup if last_page.graphic_state # erase the color space so that it gets reset on new page for fussy pdf-readers new_graphic_state.color_space = {} if new_graphic_state page_options.merge!(:graphic_state => new_graphic_state) end state.page = PDF::Core::Page.new(self, page_options) apply_margin_options(options) generate_margin_box # Reset the bounding box if the new page has different size or layout if last_page && (last_page.size != state.page.size || last_page.layout != state.page.layout) @bounding_box = @margin_box end use_graphic_settings unless options[:orphan] state.insert_page(state.page, @page_number) @page_number += 1 canvas { image(@background, :scale => @background_scale, :at => bounds.top_left) } if @background @y = @bounding_box.absolute_top float do state.on_page_create_action(self) end end end # Returns the number of pages in the document # # pdf = Prawn::Document.new # pdf.page_count #=> 1 # 3.times { pdf.start_new_page } # pdf.page_count #=> 4 # def page_count state.page_count end # Re-opens the page with the given (1-based) page number so that you can # draw on it. # # See Prawn::Document#number_pages for a sample usage of this capability. # def go_to_page(k) @page_number = k state.page = state.pages[k - 1] generate_margin_box @y = @bounding_box.absolute_top end def y=(new_y) @y = new_y bounds.update_height end # The current y drawing position relative to the innermost bounding box, # or to the page margins at the top level. # def cursor y - bounds.absolute_bottom end # Moves to the specified y position in relative terms to the bottom margin. # def move_cursor_to(new_y) self.y = new_y + bounds.absolute_bottom end # Executes a block and then restores the original y position. If new pages # were created during this block, it will teleport back to the original # page when done. # # pdf.text "A" # # pdf.float do # pdf.move_down 100 # pdf.text "C" # end # # pdf.text "B" # def float original_page = page_number original_y = y yield go_to_page(original_page) unless page_number == original_page self.y = original_y end # Renders the PDF document to string. # Pass an open file descriptor to render to file. # def render(*a, &b) (1..page_count).each do |i| go_to_page i repeaters.each { |r| r.run(i) } end renderer.render(*a, &b) end # Renders the PDF document to file. # # pdf.render_file "foo.pdf" # def render_file(filename) File.open(filename, "wb") { |f| render(f) } end # The bounds method returns the current bounding box you are currently in, # which is by default the box represented by the margin box on the # document itself. When called from within a created bounding_box # block, the box defined by that call will be returned instead of the # document margin box. # # Another important point about bounding boxes is that all x and y measurements # within a bounding box code block are relative to the bottom left corner of the # bounding box. # # For example: # # Prawn::Document.new do # # In the default "margin box" of a Prawn document of 0.5in along each edge # # # Draw a border around the page (the manual way) # stroke do # line(bounds.bottom_left, bounds.bottom_right) # line(bounds.bottom_right, bounds.top_right) # line(bounds.top_right, bounds.top_left) # line(bounds.top_left, bounds.bottom_left) # end # # # Draw a border around the page (the easy way) # stroke_bounds # end # def bounds @bounding_box end # Returns the innermost non-stretchy bounding box. # # @private def reference_bounds @bounding_box.reference_bounds end # Sets Document#bounds to the BoundingBox provided. See above for a brief # description of what a bounding box is. This function is useful if you # really need to change the bounding box manually, but usually, just entering # and exiting bounding box code blocks is good enough. # def bounds=(bounding_box) @bounding_box = bounding_box end # Moves up the document by n points relative to the current position inside # the current bounding box. # def move_up(n) self.y += n end # Moves down the document by n points relative to the current position inside # the current bounding box. # def move_down(n) self.y -= n end # Moves down the document and then executes a block. # # pdf.text "some text" # pdf.pad_top(100) do # pdf.text "This is 100 points below the previous line of text" # end # pdf.text "This text appears right below the previous line of text" # def pad_top(y) move_down(y) yield end # Executes a block then moves down the document # # pdf.text "some text" # pdf.pad_bottom(100) do # pdf.text "This text appears right below the previous line of text" # end # pdf.text "This is 100 points below the previous line of text" # def pad_bottom(y) yield move_down(y) end # Moves down the document by y, executes a block, then moves down the # document by y again. # # pdf.text "some text" # pdf.pad(100) do # pdf.text "This is 100 points below the previous line of text" # end # pdf.text "This is 100 points below the previous line of text" # def pad(y) move_down(y) yield move_down(y) end # Indents the specified number of PDF points for the duration of the block # # pdf.text "some text" # pdf.indent(20) do # pdf.text "This is indented 20 points" # end # pdf.text "This starts 20 points left of the above line " + # "and is flush with the first line" # pdf.indent 20, 20 do # pdf.text "This line is indented on both sides." # end # def indent(left, right = 0, &block) bounds.indent(left, right, &block) end # Places a text box on specified pages for page numbering. This should be called # towards the end of document creation, after all your content is already in # place. In your template string, refers to the current page, and # refers to the total amount of pages in the document. Page numbering should # occur at the end of your Prawn::Document.generate block because the method iterates # through existing pages after they are created. # # Parameters are: # # string:: Template string for page number wording. # Should include '' and, optionally, ''. # options:: A hash for page numbering and text box options. # :page_filter:: A filter to specify which pages to place page numbers on. # Refer to the method 'page_match?' # :start_count_at:: The starting count to increment pages from. # :total_pages:: If provided, will replace with the value given. # Useful to override the total number of pages when using # the start_count_at option. # :color:: Text fill color. # # Please refer to Prawn::Text::text_box for additional options concerning text # formatting and placement. # # Example: Print page numbers on every page except for the first. Start counting from # five. # # Prawn::Document.generate("page_with_numbering.pdf") do # number_pages " in a total of ", # {:start_count_at => 5, # :page_filter => lambda{ |pg| pg != 1 }, # :at => [bounds.right - 50, 0], # :align => :right, # :size => 14} # end # def number_pages(string, options = {}) opts = options.dup start_count_at = opts.delete(:start_count_at).to_i if opts.key?(:page_filter) page_filter = opts.delete(:page_filter) else page_filter = :all end total_pages = opts.delete(:total_pages) txtcolor = opts.delete(:color) # An explicit height so that we can draw page numbers in the margins opts[:height] = 50 unless opts.key?(:height) start_count = false pseudopage = 0 (1..page_count).each do |p| unless start_count pseudopage = case start_count_at when 0 1 else start_count_at.to_i end end if page_match?(page_filter, p) go_to_page(p) # have to use fill_color here otherwise text reverts back to default fill color fill_color txtcolor unless txtcolor.nil? total_pages = total_pages.nil? ? page_count : total_pages str = string.gsub("", "#{pseudopage}").gsub("", "#{total_pages}") text_box str, opts start_count = true # increment page count as soon as first match found end pseudopage += 1 if start_count end end # @group Experimental API # Attempts to group the given block vertically within the current context. # First attempts to render it in the current position on the current page. # If that attempt overflows, it is tried anew after starting a new context # (page or column). Returns a logically true value if the content fits in # one page/column, false if a new page or column was needed. # # Raises CannotGroup if the provided content is too large to fit alone in # the current page or column. # # @private def group(*a, &b) fail NotImplementedError, "Document#group has been disabled because its implementation " \ "lead to corrupted documents whenever a page boundary was " \ "crossed. We will try to work on reimplementing it in a " \ "future release" end # @private def transaction fail NotImplementedError, "Document#transaction has been disabled because its implementation " \ "lead to corrupted documents whenever a page boundary was " \ "crossed. We will try to work on reimplementing it in a " \ "future release" end # Provides a way to execute a block of code repeatedly based on a # page_filter. # # Available page filters are: # :all repeats on every page # :odd repeats on odd pages # :even repeats on even pages # some_array repeats on every page listed in the array # some_range repeats on every page included in the range # some_lambda yields page number and repeats for true return values def page_match?(page_filter, page_number) case page_filter when :all true when :odd page_number.odd? when :even page_number.even? when Range, Array page_filter.include?(page_number) when Proc page_filter.call(page_number) end end # @private def mask(*fields) # Stores the current state of the named attributes, executes the block, and # then restores the original values after the block has executed. # -- I will remove the nodoc if/when this feature is a little less hacky stored = {} fields.each { |f| stored[f] = send(f) } yield fields.each { |f| send("#{f}=", stored[f]) } end # @group Extension API def initialize_first_page(options) if options[:skip_page_creation] start_new_page(options.merge(:orphan => true)) else start_new_page(options) end end ## Internals. Don't depend on them! # @private attr_accessor :state # @private def page state.page end private # setting override_settings to true ensures that a new graphic state does not end up using # previous settings. def use_graphic_settings(override_settings = false) set_fill_color if current_fill_color != "000000" || override_settings set_stroke_color if current_stroke_color != "000000" || override_settings write_line_width if line_width != 1 || override_settings write_stroke_cap_style if cap_style != :butt || override_settings write_stroke_join_style if join_style != :miter || override_settings write_stroke_dash if dashed? || override_settings end def generate_margin_box old_margin_box = @margin_box page = state.page @margin_box = BoundingBox.new( self, nil, # margin box has no parent [ page.margins[:left], page.dimensions[-1] - page.margins[:top] ] , :width => page.dimensions[-2] - (page.margins[:left] + page.margins[:right]), :height => page.dimensions[-1] - (page.margins[:top] + page.margins[:bottom]) ) # This check maintains indentation settings across page breaks if old_margin_box @margin_box.add_left_padding(old_margin_box.total_left_padding) @margin_box.add_right_padding(old_margin_box.total_right_padding) end # we must update bounding box if not flowing from the previous page # @bounding_box = @margin_box unless @bounding_box && @bounding_box.parent end def apply_margin_options(options) if options[:margin] # Treat :margin as CSS shorthand with 1-4 values. margin = Array(options[:margin]) positions = { 4 => [0, 1, 2, 3], 3 => [0, 1, 2, 1], 2 => [0, 1, 0, 1], 1 => [0, 0, 0, 0] }[margin.length] [:top, :right, :bottom, :left].zip(positions).each do |p, i| options[:"#{p}_margin"] ||= margin[i] end end [:left, :right, :top, :bottom].each do |side| if margin = options[:"#{side}_margin"] state.page.margins[side] = margin end end end def font_metric_cache #:nodoc: @font_metric_cache ||= FontMetricCache.new(self) end end end ruby-prawn-2.1.0.orig/lib/prawn/images/0000755000000000000000000000000012665203156016425 5ustar rootrootruby-prawn-2.1.0.orig/lib/prawn/images/png.rb0000644000000000000000000002324712665203156017546 0ustar rootroot# encoding: ASCII-8BIT # png.rb : Extracts the data from a PNG that is needed for embedding # # Based on some similar code in PDF::Writer by Austin Ziegler # # Copyright April 2008, James Healy. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require 'stringio' require 'enumerator' module Prawn module Images # A convenience class that wraps the logic for extracting the parts # of a PNG image that we need to embed them in a PDF # class PNG < Image # @group Extension API attr_reader :palette, :img_data, :transparency attr_reader :width, :height, :bits attr_reader :color_type, :compression_method, :filter_method attr_reader :interlace_method, :alpha_channel attr_accessor :scaled_width, :scaled_height def self.can_render?(image_blob) image_blob[0, 8].unpack("C*") == [137, 80, 78, 71, 13, 10, 26, 10] end # Process a new PNG image # # data:: A binary string of PNG data # def initialize(data) data = StringIO.new(data.dup) data.read(8) # Skip the default header @palette = "" @img_data = "" @transparency = {} loop do chunk_size = data.read(4).unpack("N")[0] section = data.read(4) case section when 'IHDR' # we can grab other interesting values from here (like width, # height, etc) values = data.read(chunk_size).unpack("NNCCCCC") @width = values[0] @height = values[1] @bits = values[2] @color_type = values[3] @compression_method = values[4] @filter_method = values[5] @interlace_method = values[6] when 'PLTE' @palette << data.read(chunk_size) when 'IDAT' @img_data << data.read(chunk_size) when 'tRNS' # This chunk can only occur once and it must occur after the # PLTE chunk and before the IDAT chunk @transparency = {} case @color_type when 3 @transparency[:palette] = data.read(chunk_size).unpack('C*') when 0 # Greyscale. Corresponding to entries in the PLTE chunk. # Grey is two bytes, range 0 .. (2 ^ bit-depth) - 1 grayval = data.read(chunk_size).unpack("n").first @transparency[:grayscale] = grayval when 2 # True colour with proper alpha channel. @transparency[:rgb] = data.read(chunk_size).unpack("nnn") end when 'IEND' # we've got everything we need, exit the loop break else # unknown (or un-important) section, skip over it data.seek(data.pos + chunk_size) end data.read(4) # Skip the CRC end @img_data = Zlib::Inflate.inflate(@img_data) end # number of color components to each pixel # def colors case self.color_type when 0, 3, 4 return 1 when 2, 6 return 3 end end # split the alpha channel data from the raw image data in images # where it's required. # def split_alpha_channel! if alpha_channel? if color_type == 3 generate_alpha_channel else split_image_data end end end def alpha_channel? return true if color_type == 4 || color_type == 6 return @transparency.any? if color_type == 3 false end # Build a PDF object representing this image in +document+, and return # a Reference to it. # def build_pdf_object(document) if compression_method != 0 fail Errors::UnsupportedImageType, 'PNG uses an unsupported compression method' end if filter_method != 0 fail Errors::UnsupportedImageType, 'PNG uses an unsupported filter method' end if interlace_method != 0 fail Errors::UnsupportedImageType, 'PNG uses unsupported interlace method' end # some PNG types store the colour and alpha channel data together, # which the PDF spec doesn't like, so split it out. split_alpha_channel! case colors when 1 color = :DeviceGray when 3 color = :DeviceRGB else fail Errors::UnsupportedImageType, "PNG uses an unsupported number of colors (#{png.colors})" end # build the image dict obj = document.ref!( :Type => :XObject, :Subtype => :Image, :Height => height, :Width => width, :BitsPerComponent => bits ) # append the actual image data to the object as a stream obj << img_data obj.stream.filters << { :FlateDecode => { :Predictor => 15, :Colors => colors, :BitsPerComponent => bits, :Columns => width } } # sort out the colours of the image if palette.empty? obj.data[:ColorSpace] = color else # embed the colour palette in the PDF as a object stream palette_obj = document.ref!({}) palette_obj << palette # build the color space array for the image obj.data[:ColorSpace] = [:Indexed, :DeviceRGB, (palette.size / 3) - 1, palette_obj] end # ************************************* # add transparency data if necessary # ************************************* # For PNG color types 0, 2 and 3, the transparency data is stored in # a dedicated PNG chunk, and is exposed via the transparency attribute # of the PNG class. if transparency[:grayscale] # Use Color Key Masking (spec section 4.8.5) # - An array with N elements, where N is two times the number of color # components. val = transparency[:grayscale] obj.data[:Mask] = [val, val] elsif transparency[:rgb] # Use Color Key Masking (spec section 4.8.5) # - An array with N elements, where N is two times the number of color # components. rgb = transparency[:rgb] obj.data[:Mask] = rgb.collect { |x| [x, x] }.flatten end # For PNG color types 4 and 6, the transparency data is stored as a alpha # channel mixed in with the main image data. The PNG class seperates # it out for us and makes it available via the alpha_channel attribute if alpha_channel? smask_obj = document.ref!( :Type => :XObject, :Subtype => :Image, :Height => height, :Width => width, :BitsPerComponent => bits, :ColorSpace => :DeviceGray, :Decode => [0, 1] ) smask_obj.stream << alpha_channel smask_obj.stream.filters << { :FlateDecode => { :Predictor => 15, :Colors => 1, :BitsPerComponent => bits, :Columns => width } } obj.data[:SMask] = smask_obj end obj end # Returns the minimum PDF version required to support this image. def min_pdf_version if bits > 8 # 16-bit color only supported in 1.5+ (ISO 32000-1:2008 8.9.5.1) 1.5 elsif alpha_channel? # Need transparency for SMask 1.4 else 1.0 end end private def split_image_data alpha_bytes = bits / 8 color_bytes = colors * bits / 8 scanline_length = (color_bytes + alpha_bytes) * self.width + 1 scanlines = @img_data.bytesize / scanline_length pixels = self.width * self.height data = StringIO.new(@img_data) data.binmode color_data = [0x00].pack('C') * (pixels * color_bytes + scanlines) color = StringIO.new(color_data) color.binmode @alpha_channel = [0x00].pack('C') * (pixels * alpha_bytes + scanlines) alpha = StringIO.new(@alpha_channel) alpha.binmode scanlines.times do |line| data.seek(line * scanline_length) filter = data.getbyte color.putc filter alpha.putc filter self.width.times do color.write data.read(color_bytes) alpha.write data.read(alpha_bytes) end end @img_data = color_data end def generate_alpha_channel alpha_palette = Hash.new(0xff) 0.upto(palette.bytesize / 3) do |n| alpha_palette[n] = @transparency[:palette][n] || 0xff end scanline_length = width + 1 scanlines = @img_data.bytesize / scanline_length pixels = width * height data = StringIO.new(@img_data) data.binmode @alpha_channel = [0x00].pack('C') * (pixels + scanlines) alpha = StringIO.new(@alpha_channel) alpha.binmode scanlines.times do |line| data.seek(line * scanline_length) filter = data.getbyte alpha.putc filter width.times do color = data.read(1).unpack('C').first alpha.putc alpha_palette[color] end end end end end end ruby-prawn-2.1.0.orig/lib/prawn/images/image.rb0000644000000000000000000000222512665203156020035 0ustar rootroot# encoding: utf-8 # image.rb : Base class for image info objects # # Copyright September 2011, Brad Ediger. All rights reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require 'digest/sha1' module Prawn module Images class Image # @group Extension API def calc_image_dimensions(options) w = options[:width] || width h = options[:height] || height if options[:width] && !options[:height] wp = w / width.to_f w = width * wp h = height * wp elsif options[:height] && !options[:width] hp = h / height.to_f w = width * hp h = height * hp elsif options[:scale] w = width * options[:scale] h = height * options[:scale] elsif options[:fit] bw, bh = options[:fit] bp = bw / bh.to_f ip = width / height.to_f if ip > bp w = bw h = bw / ip else h = bh w = bh * ip end end self.scaled_width = w self.scaled_height = h [w, h] end end end end ruby-prawn-2.1.0.orig/lib/prawn/images/jpg.rb0000644000000000000000000000514312665203156017535 0ustar rootroot# encoding: ASCII-8BIT # jpg.rb : Extracts the data from a JPG that is needed for embedding # # Copyright April 2008, James Healy. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require 'stringio' module Prawn module Images # A convenience class that wraps the logic for extracting the parts # of a JPG image that we need to embed them in a PDF # class JPG < Image # @group Extension API attr_reader :width, :height, :bits, :channels attr_accessor :scaled_width, :scaled_height JPEG_SOF_BLOCKS = [0xC0, 0xC1, 0xC2, 0xC3, 0xC5, 0xC6, 0xC7, 0xC9, 0xCA, 0xCB, 0xCD, 0xCE, 0xCF] def self.can_render?(image_blob) image_blob[0, 3].unpack("C*") == [255, 216, 255] end # Process a new JPG image # # :data:: A binary string of JPEG data # def initialize(data) @data = data d = StringIO.new(@data) d.binmode c_marker = 0xff # Section marker. d.seek(2) # Skip the first two bytes of JPEG identifier. loop do marker, code, length = d.read(4).unpack('CCn') fail "JPEG marker not found!" if marker != c_marker if JPEG_SOF_BLOCKS.include?(code) @bits, @height, @width, @channels = d.read(6).unpack("CnnC") break end d.seek(length - 2, IO::SEEK_CUR) end end # Build a PDF object representing this image in +document+, and return # a Reference to it. # def build_pdf_object(document) color_space = case channels when 1 :DeviceGray when 3 :DeviceRGB when 4 :DeviceCMYK else fail ArgumentError, 'JPG uses an unsupported number of channels' end obj = document.ref!( :Type => :XObject, :Subtype => :Image, :ColorSpace => color_space, :BitsPerComponent => bits, :Width => width, :Height => height ) # add extra decode params for CMYK images. By swapping the # min and max values from the default, we invert the colours. See # section 4.8.4 of the spec. if color_space == :DeviceCMYK obj.data[:Decode] = [ 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0 ] end obj.stream << @data obj.stream.filters << :DCTDecode obj end end end end ruby-prawn-2.1.0.orig/lib/prawn/outline.rb0000644000000000000000000002626112665203156017173 0ustar rootroot# encoding: utf-8 module Prawn class Document # @group Stable API # Lazily instantiates a Prawn::Outline object for document. This is used as point of entry # to methods to build the outline tree for a document's table of contents. def outline @outline ||= Outline.new(self) end end # The Outline class organizes the outline tree items for the document. # Note that the prev and parent instance variables are adjusted while navigating # through the nested blocks. These variables along with the presence or absense # of blocks are the primary means by which the relations for the various # OutlineItems and the OutlineRoot are set. Unfortunately, the best way to # understand how this works is to follow the method calls through a real example. # # Some ideas for the organization of this class were gleaned from name_tree. In # particular the way in which the OutlineItems are finally rendered into document # objects in PdfObject through a hash. # class Outline # @private attr_accessor :parent, :prev, :document, :items def initialize(document) @document = document @parent = root @prev = nil @items = {} end # @group Stable API # Returns the current page number of the document def page_number @document.page_number end # Defines/Updates an outline for the document. # The outline is an optional nested index that appears on the side of a PDF # document usually with direct links to pages. The outline DSL is defined by nested # blocks involving two methods: section and page; see the documentation on those methods # for their arguments and options. Note that one can also use outline#update # to add more sections to the end of the outline tree using the same syntax and scope. # # The syntax is best illustrated with an example: # # Prawn::Document.generate(outlined_document.pdf) do # text "Page 1. This is the first Chapter. " # start_new_page # text "Page 2. More in the first Chapter. " # start_new_page # outline.define do # section 'Chapter 1', :destination => 1, :closed => true do # page :destination => 1, :title => 'Page 1' # page :destination => 2, :title => 'Page 2' # end # end # start_new_page do # outline.update do # section 'Chapter 2', :destination => 2, do # page :destination => 3, :title => 'Page 3' # end # end # end # def define(&block) instance_eval(&block) if block end alias :update :define # Inserts an outline section to the outline tree (see outline#define). # Although you will probably choose to exclusively use outline#define so # that your outline tree is contained and easy to manage, this method # gives you the option to insert sections to the outline tree at any point # during document generation. This method allows you to add a child subsection # to any other item at any level in the outline tree. # Currently the only way to locate the place of entry is with the title for the # item. If your title names are not unique consider using define_outline. # The method takes the following arguments: # title: a string that must match an outline title to add the subsection to # position: either :first or :last(the default) where the subsection will be placed relative # to other child elements. If you need to position your subsection in between # other elements then consider using #insert_section_after # block: uses the same DSL syntax as outline#define, for example: # # Consider using this method inside of outline.update if you want to have the outline object # to be scoped as self (see #insert_section_after example). # # go_to_page 2 # start_new_page # text "Inserted Page" # outline.add_subsection_to :title => 'Page 2', :first do # outline.page :destination => page_number, :title => "Inserted Page" # end # def add_subsection_to(title, position = :last, &block) @parent = items[title] fail Prawn::Errors::UnknownOutlineTitle, "\n No outline item with title: '#{title}' exists in the outline tree" unless @parent @prev = position == :first ? nil : @parent.data.last nxt = position == :first ? @parent.data.first : nil insert_section(nxt, &block) end # Inserts an outline section to the outline tree (see outline#define). # Although you will probably choose to exclusively use outline#define so # that your outline tree is contained and easy to manage, this method # gives you the option to insert sections to the outline tree at any point # during document generation. Unlike outline.add_section, this method allows # you to enter a section after any other item at any level in the outline tree. # Currently the only way to locate the place of entry is with the title for the # item. If your title names are not unique consider using define_outline. # The method takes the following arguments: # title: the title of other section or page to insert new section after # block: uses the same DSL syntax as outline#define, for example: # # go_to_page 2 # start_new_page # text "Inserted Page" # update_outline do # insert_section_after :title => 'Page 2' do # page :destination => page_number, :title => "Inserted Page" # end # end # def insert_section_after(title, &block) @prev = items[title] fail Prawn::Errors::UnknownOutlineTitle, "\n No outline item with title: '#{title}' exists in the outline tree" unless @prev @parent = @prev.data.parent nxt = @prev.data.next insert_section(nxt, &block) end # See outline#define above for documentation on how this is used in that context # # Adds an outine section to the outline tree. # Although you will probably choose to exclusively use outline#define so # that your outline tree is contained and easy to manage, this method # gives you the option to add sections to the outline tree at any point # during document generation. When not being called from within another #section block # the section will be added at the top level after the other root elements of the outline. # For more flexible placement try using outline#insert_section_after and/or # outline#add_subsection_to # Takes the following arguments: # title: the outline text that appears for the section. # options: destination - optional integer defining the page number for a destination link # to the top of the page (using a :FIT destination). # - or an array with a custom destination (see the #dest_* methods of the # PDF::Destination module) # closed - whether the section should show its nested outline elements. # - defaults to false. # block: more nested subsections and/or page blocks # # example usage: # # outline.section 'Added Section', :destination => 3 do # outline.page :destionation => 3, :title => 'Page 3' # end def section(title, options = {}, &block) add_outline_item(title, options, &block) end # See Outline#define above for more documentation on how it is used in that context # # Adds a page to the outline. # Although you will probably choose to exclusively use outline#define so # that your outline tree is contained and easy to manage, this method also # gives you the option to add pages to the root of outline tree at any point # during document generation. Note that the page will be added at the # top level after the other root outline elements. For more flexible placement try # using outline#insert_section_after and/or outline#add_subsection_to. # # Takes the following arguments: # options: # title - REQUIRED. The outline text that appears for the page. # destination - optional integer defining the page number for a destination link # to the top of the page (using a :FIT destination). # - or an array with a custom destination (see the #dest_* methods of the # PDF::Destination module) # closed - whether the section should show its nested outline elements. # - defaults to false. # example usage: # # outline.page :title => "Very Last Page" # Note: this method is almost identical to section except that it does not accept a block # thereby defining the outline item as a leaf on the outline tree structure. def page(options = {}) if options[:title] title = options[:title] else fail Prawn::Errors::RequiredOption, "\nTitle is a required option for page" end add_outline_item(title, options) end private # The Outline dictionary (12.3.3) for this document. It is # lazily initialized, so that documents that do not have an outline # do not incur the additional overhead. def root document.state.store.root.data[:Outlines] ||= document.ref!(PDF::Core::OutlineRoot.new) end def add_outline_item(title, options, &block) outline_item = create_outline_item(title, options) set_relations(outline_item) increase_count set_variables_for_block(outline_item, block) block.call if block reset_parent(outline_item) end def create_outline_item(title, options) outline_item = PDF::Core::OutlineItem.new(title, parent, options) case options[:destination] when Integer page_index = options[:destination] - 1 outline_item.dest = [document.state.pages[page_index].dictionary, :Fit] when Array outline_item.dest = options[:destination] end outline_item.prev = prev if @prev items[title] = document.ref!(outline_item) end def set_relations(outline_item) prev.data.next = outline_item if prev parent.data.first = outline_item unless prev parent.data.last = outline_item end def increase_count counting_parent = parent while counting_parent counting_parent.data.count += 1 if counting_parent == root counting_parent = nil else counting_parent = counting_parent.data.parent end end end def set_variables_for_block(outline_item, block) self.prev = block ? nil : outline_item self.parent = outline_item if block end def reset_parent(outline_item) if parent == outline_item self.prev = outline_item self.parent = outline_item.data.parent end end def insert_section(nxt, &block) last = @parent.data.last if block block.call end adjust_relations(nxt, last) reset_root_positioning end def adjust_relations(nxt, last) if nxt nxt.data.prev = @prev @prev.data.next = nxt @parent.data.last = last end end def reset_root_positioning @parent = root @prev = root.data.last end end end ruby-prawn-2.1.0.orig/lib/prawn/images.rb0000644000000000000000000001466212665203156016763 0ustar rootroot# encoding: ASCII-8BIT # images.rb : Implements PDF image embedding # # Copyright April 2008, James Healy, Gregory Brown. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require 'digest/sha1' require 'pathname' module Prawn module Images # @group Stable API # Add the image at filename to the current page. Currently only # JPG and PNG files are supported. (Note that processing PNG # images with alpha channels can be processor and memory intensive.) # # Arguments: # file:: path to file or an object that responds to #read and #rewind # # Options: # :at:: an array [x,y] with the location of the top left corner of the image. # :position:: One of (:left, :center, :right) or an x-offset # :vposition:: One of (:top, :center, :center) or an y-offset # :height:: the height of the image [actual height of the image] # :width:: the width of the image [actual width of the image] # :scale:: scale the dimensions of the image proportionally # :fit:: scale the dimensions of the image proportionally to fit inside [width,height] # # Prawn::Document.generate("image2.pdf", :page_layout => :landscape) do # pigs = "#{Prawn::DATADIR}/images/pigs.jpg" # image pigs, :at => [50,450], :width => 450 # # dice = "#{Prawn::DATADIR}/images/dice.png" # image dice, :at => [50, 450], :scale => 0.75 # end # # If only one of :width / :height are provided, the image will be scaled # proportionally. When both are provided, the image will be stretched to # fit the dimensions without maintaining the aspect ratio. # # # If :at is provided, the image will be place in the current page but # the text position will not be changed. # # # If instead of an explicit filename, an object with a read method is # passed as +file+, you can embed images from IO objects and things # that act like them (including Tempfiles and open-uri objects). # # require "open-uri" # # Prawn::Document.generate("remote_images.pdf") do # image open("http://prawn.majesticseacreature.com/media/prawn_logo.png") # end # # This method returns an image info object which can be used to check the # dimensions of an image object if needed. # (See also: Prawn::Images::PNG , Prawn::Images::JPG) # def image(file, options = {}) Prawn.verify_options [:at, :position, :vposition, :height, :width, :scale, :fit], options pdf_obj, info = build_image_object(file) embed_image(pdf_obj, info, options) info end # Builds an info object (Prawn::Images::*) and a PDF reference representing # the given image. Return a pair: [pdf_obj, info]. # # @private def build_image_object(file) io = verify_and_open_image(file) image_content = io.read image_sha1 = Digest::SHA1.hexdigest(image_content) # if this image has already been embedded, just reuse it if image_registry[image_sha1] info = image_registry[image_sha1][:info] image_obj = image_registry[image_sha1][:obj] else # Build the image object info = Prawn.image_handler.find(image_content).new(image_content) # Bump PDF version if the image requires it renderer.min_version(info.min_pdf_version) if info.respond_to?(:min_pdf_version) # Add the image to the PDF and register it in case we see it again. image_obj = info.build_pdf_object(self) image_registry[image_sha1] = { :obj => image_obj, :info => info } end [image_obj, info] end # Given a PDF image resource pdf_obj that has been added to the # page's resources and an info object (the pair returned from # build_image_object), embed the image according to the options # given. # # @private def embed_image(pdf_obj, info, options) # find where the image will be placed and how big it will be w, h = info.calc_image_dimensions(options) if options[:at] x, y = map_to_absolute(options[:at]) else x, y = image_position(w, h, options) move_text_position h end # add a reference to the image object to the current page # resource list and give it a label label = "I#{next_image_id}" state.page.xobjects.merge!(label => pdf_obj) cm_params = PDF::Core.real_params([ w, 0, 0, h, x, y - h]) renderer.add_content("\nq\n#{cm_params} cm\n/#{label} Do\nQ") end private def verify_and_open_image(io_or_path) # File or IO if io_or_path.respond_to?(:rewind) io = io_or_path # Rewind if the object we're passed is an IO, so that multiple embeds of # the same IO object will work io.rewind # read the file as binary so the size is calculated correctly # guard binmode because some objects acting io-like don't implement it io.binmode if io.respond_to?(:binmode) return io end # String or Pathname io_or_path = Pathname.new(io_or_path) fail ArgumentError, "#{io_or_path} not found" unless io_or_path.file? io = io_or_path.open('rb') io end def image_position(w, h, options) options[:position] ||= :left y = case options[:vposition] when :top bounds.absolute_top when :center bounds.absolute_top - (bounds.height - h) / 2.0 when :bottom bounds.absolute_bottom + h when Numeric bounds.absolute_top - options[:vposition] else determine_y_with_page_flow(h) end x = case options[:position] when :left bounds.left_side when :center bounds.left_side + (bounds.width - w) / 2.0 when :right bounds.right_side - w when Numeric options[:position] + bounds.left_side end return [x, y] end def determine_y_with_page_flow(h) if overruns_page?(h) bounds.move_past_bottom end self.y end def overruns_page?(h) (self.y - h) < reference_bounds.absolute_bottom end def image_registry @image_registry ||= {} end def next_image_id @image_counter ||= 0 @image_counter += 1 end end end ruby-prawn-2.1.0.orig/lib/prawn/encoding.rb0000644000000000000000000001015412665203156017274 0ustar rootroot# encoding: utf-8 # # Copyright September 2008, Gregory Brown, James Healy All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn module Encoding # @private # Map between unicode and WinAnsiEnoding # class WinAnsi #:nodoc: CHARACTERS = %w[ .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef space exclam quotedbl numbersign dollar percent ampersand quotesingle parenleft parenright asterisk plus comma hyphen period slash zero one two three four five six seven eight nine colon semicolon less equal greater question at A B C D E F G H I J K L M N O P Q R S T U V W X Y Z bracketleft backslash bracketright asciicircum underscore grave a b c d e f g h i j k l m n o p q r s t u v w x y z braceleft bar braceright asciitilde .notdef Euro .notdef quotesinglbase florin quotedblbase ellipsis dagger daggerdbl circumflex perthousand Scaron guilsinglleft OE .notdef Zcaron .notdef .notdef quoteleft quoteright quotedblleft quotedblright bullet endash emdash tilde trademark scaron guilsinglright oe .notdef zcaron ydieresis space exclamdown cent sterling currency yen brokenbar section dieresis copyright ordfeminine guillemotleft logicalnot hyphen registered macron degree plusminus twosuperior threesuperior acute mu paragraph periodcentered cedilla onesuperior ordmasculine guillemotright onequarter onehalf threequarters questiondown Agrave Aacute Acircumflex Atilde Adieresis Aring AE Ccedilla Egrave Eacute Ecircumflex Edieresis Igrave Iacute Icircumflex Idieresis Eth Ntilde Ograve Oacute Ocircumflex Otilde Odieresis multiply Oslash Ugrave Uacute Ucircumflex Udieresis Yacute Thorn germandbls agrave aacute acircumflex atilde adieresis aring ae ccedilla egrave eacute ecircumflex edieresis igrave iacute icircumflex idieresis eth ntilde ograve oacute ocircumflex otilde odieresis divide oslash ugrave uacute ucircumflex udieresis yacute thorn ydieresis ] end end end ruby-prawn-2.1.0.orig/lib/prawn/version.rb0000644000000000000000000000007012665203156017167 0ustar rootroot# encoding: utf-8 module Prawn VERSION = "2.1.0" end ruby-prawn-2.1.0.orig/lib/prawn/errors.rb0000644000000000000000000000547512665203156017034 0ustar rootroot# encoding: utf-8 # # errors.rb : Implements custom error classes for Prawn # # Copyright April 2008, Gregory Brown. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn module Errors # Raised when a table is spanned in an impossible way. # InvalidTableSpan = Class.new(StandardError) # This error is raised when a method requiring a current page is called # without being on a page. # NotOnPage = Class.new(StandardError) # This error is raised when Prawn cannot find a specified font # UnknownFont = Class.new(StandardError) # Raised when Prawn is asked to draw something into a too-small box # CannotFit = Class.new(StandardError) # Raised if group() is called with a block that is too big to be # rendered in the current context. # CannotGroup = Class.new(StandardError) # This error is raised when Prawn is being used on a M17N aware VM, # and the user attempts to add text that isn't compatible with UTF-8 # to their document # IncompatibleStringEncoding = Class.new(StandardError) # This error is raised when Prawn encounters an unknown key in functions # that accept an options hash. This usually means there is a typo in your # code or that the option you are trying to use has a different name than # what you have specified. # UnknownOption = Class.new(StandardError) # this error is raised when a user attempts to embed an image of an unsupported # type. This can either a completely unsupported format, or a dialect of a # supported format (ie. some types of PNG) UnsupportedImageType = Class.new(StandardError) # This error is raised when a named element has alredy been # created. For example, in the stamp module, stamps must have # unique names within a document NameTaken = Class.new(StandardError) # This error is raised when a name is not a valid format InvalidName = Class.new(StandardError) # This error is raised when an object is attempted to be # referenced by name, but no such name is associated with an object UndefinedObjectName = Class.new(StandardError) # This error is raised when a required option has not been set RequiredOption = Class.new(StandardError) # This error is raised when a requested outline item with a given title does not exist UnknownOutlineTitle = Class.new(StandardError) # This error is raised when a block is required, but not provided BlockRequired = Class.new(StandardError) # This error is rased when a graphics method is called with improper arguments InvalidGraphicsPath = Class.new(StandardError) # Raised when unrecognized content is provided for a table cell. # UnrecognizedTableContent = Class.new(StandardError) end end ruby-prawn-2.1.0.orig/lib/prawn/measurements.rb0000644000000000000000000000212712665203156020217 0ustar rootroot# encoding: utf-8 # measurements.rb: Conversions from other measurements to PDF points # # Copyright December 2008, Florian Witteler. All Rights Reserved. # module Prawn # @group Stable API module Measurements # metric conversions def cm2mm(cm) return cm * 10 end def dm2mm(dm) return dm * 100 end def m2mm(m) return m * 1000 end # imperial conversions # from http://en.wikipedia.org/wiki/Imperial_units def ft2in(ft) return ft * 12 end def yd2in(yd) return yd * 36 end # PostscriptPoint-converisons def pt2pt(pt) return pt end def in2pt(inch) return inch * 72 end def ft2pt(ft) return in2pt(ft2in(ft)) end def yd2pt(yd) return in2pt(yd2in(yd)) end def mm2pt(mm) return mm * (72 / 25.4) end def cm2pt(cm) return mm2pt(cm2mm(cm)) end def dm2pt(dm) return mm2pt(dm2mm(dm)) end def m2pt(m) return mm2pt(m2mm(m)) end def pt2mm(pt) return pt * 1 / mm2pt(1) # (25.4 / 72) end end end ruby-prawn-2.1.0.orig/lib/prawn/font_metric_cache.rb0000644000000000000000000000203612665203156021142 0ustar rootroot# encoding: utf-8 # # font_metric_cache.rb : The Prawn font class # # Copyright Dec 2012, Kenneth Kalmer. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. # module Prawn # Cache used internally by Prawn::Document instances to calculate the width # of various strings for layout purposes. # # @private class FontMetricCache CacheEntry = Struct.new(:font, :options, :string) def initialize(document) @document = document @cache = {} end def width_of(string, options) f = if options[:style] # override style with :style => :bold @document.find_font(@document.font.family, :style => options[:style]) else @document.font end key = CacheEntry.new(f, options, string) unless length = @cache[ key ] length = @cache[ key ] = f.compute_width_of(string, options) end length + (@document.character_spacing * @document.font.character_count(string)) end end end ruby-prawn-2.1.0.orig/lib/prawn/text.rb0000644000000000000000000004130512665203156016474 0ustar rootroot# encoding: utf-8 # text.rb : Implements PDF text primitives # # Copyright May 2008, Gregory Brown. All Rights Reserved. # # This is free software. Please see the LICENSE and COPYING files for details. require "zlib" require "pdf/core/text" require_relative "text/formatted" require_relative "text/box" module Prawn module Text include PDF::Core::Text include Prawn::Text::Formatted # No-Break Space Prawn::Text::NBSP = " " # Zero Width Space (indicate word boundaries without a space) Prawn::Text::ZWSP = [8203].pack("U") # Soft Hyphen (invisible, except when causing a line break) Prawn::Text::SHY = "­" # @group Stable API # If you want text to flow onto a new page or between columns, this is the # method to use. If, instead, if you want to place bounded text outside of # the flow of a document (for captions, labels, charts, etc.), use Text::Box # or its convenience method text_box. # # Draws text on the page. Prawn attempts to wrap the text to fit within your # current bounding box (or margin_box if no bounding box is being used). # Text will flow onto the next page when it reaches the bottom of the # bounding box. Text wrap in Prawn does not re-flow linebreaks, so if you # want fully automated text wrapping, be sure to remove newlines before # attempting to draw your string. # # == Examples # # pdf.text "Will be wrapped when it hits the edge of your bounding box" # pdf.text "This will be centered", :align => :center # pdf.text "This will be right aligned", :align => :right # pdf.text "This includes inline " + # "formatting", :inline_format => true # # If your font contains kerning pair data that Prawn can parse, the # text will be kerned by default. You can disable kerning by including # a false :kerning option. If you want to disable kerning on an # entire document, set default_kerning = false for that document # # === Text Positioning Details # # The text is positioned at font.ascender below the baseline, # making it easy to use this method within bounding boxes and spans. # # == Encoding # # Note that strings passed to this function should be encoded as UTF-8. # If you get unexpected characters appearing in your rendered document, # check this. # # If the current font is a built-in one, although the string must be # encoded as UTF-8, only characters that are available in WinAnsi # are allowed. # # If an empty box is rendered to your PDF instead of the character you # wanted it usually means the current font doesn't include that character. # # == Options (default values marked in []) # # :inline_format:: # boolean. If true, then the string parameter is interpreted # as a HTML-esque string that recognizes the following tags # (assuming the default text formatter is used): # \:: bold # \:: italic # \:: underline # \:: strikethrough # \:: subscript # \:: superscript # \:: # with the following attributes (using double or single quotes) # size="24":: # attribute for setting size # character_spacing="2.5":: # attribute for setting character spacing # name="Helvetica":: # attribute for setting the font. The font name must be an # AFM font with the desired faces or must be a font that is # already registered using Prawn::Document#font_families # \:: # with the following attributes # rgb="ffffff" or rgb="#ffffff":: # c="100" m="100" y="100" k="100":: # \:: # with the following attributes # href="http://example.com":: an external link # Note that you must explicitly underline and color using the # appropriate tags if you which to draw attention to the link # # :kerning:: boolean. Whether or not to use kerning (if it # is available with the current font) # [value of document.default_kerning?] # :size:: number. The font size to use. [current font # size] # :color:: an RGB color ("ff0000") or CMYK array [10, 20, 30, 40]. # :character_spacing:: number. The amount of space to add # to or remove from the default character # spacing. [0] # :style:: The style to use. The requested style must be part of # the current font familly. [current style] # :indent_paragraphs:: number. The amount to indent the # first line of each paragraph. Omit this # option if you do not want indenting. # :direction:: # :ltr, :rtl, Direction of the text (left-to-right # or right-to-left) [value of document.text_direction] # :fallback_fonts:: # An array of font names. Each name must be the name of an AFM font or # the name that was used to register a family of TTF fonts (see # Prawn::Document#font_families). If present, then each glyph will be # rendered using the first font that includes the glyph, starting with # the current font and then moving through :fallback_fonts from # left to right. # :align:: # :left, :center, :right, or # :justify Alignment within the bounding box # [:left if direction is :ltr, :right if direction is :rtl] # :valign:: :top, :center, or :bottom. # Vertical alignment within the bounding box [:top] # :leading:: # number. Additional space between lines [value of # document.default_leading] # :final_gap:: boolean. If true, then the space between # each line is included below the last line; # otherwise, document.y is placed just below the # descender of the last line printed [true] # :mode:: The text rendering mode to use. Use this to specify if the # text should render with the fill color, stroke color or # both. See the comments to text_rendering_mode() to see # a list of valid options. [0] # # == Exceptions # # Raises ArgumentError if :at option included # # Raises Prawn::Errrors::CannotFit if not wide enough to print # any text # def text(string, options = {}) return false if string.nil? # we modify the options. don't change the user's hash options = options.dup if p = options[:inline_format] p = [] unless p.is_a?(Array) options.delete(:inline_format) array = self.text_formatter.format(string, *p) else array = [{ :text => string }] end formatted_text(array, options) end # Draws formatted text to the page. # Formatted text is comprised of an array of hashes, where each hash defines # text and format information. See Text::Formatted#formatted_text_box for # more information on the structure of this array # # == Example # # text([{ :text => "hello" }, # { :text => "world", # :size => 24, # :styles => [:bold, :italic] }]) # # == Options # # Accepts the same options as #text # # == Exceptions # # Same as for #text # def formatted_text(array, options = {}) options = inspect_options_for_text(options.dup) if color = options.delete(:color) array = array.map do |fragment| fragment[:color] ? fragment : fragment.merge(:color => color) end end if @indent_paragraphs self.text_formatter.array_paragraphs(array).each do |paragraph| remaining_text = draw_indented_formatted_line(paragraph, options) if @no_text_printed # unless this paragraph was an empty line unless @all_text_printed @bounding_box.move_past_bottom remaining_text = draw_indented_formatted_line(paragraph, options) end end remaining_text = fill_formatted_text_box(remaining_text, options) draw_remaining_formatted_text_on_new_pages(remaining_text, options) end else remaining_text = fill_formatted_text_box(array, options) draw_remaining_formatted_text_on_new_pages(remaining_text, options) end end # Draws text on the page, beginning at the point specified by the :at option # the string is assumed to be pre-formatted to properly fit the page. # # pdf.draw_text "Hello World", :at => [100,100] # pdf.draw_text "Goodbye World", :at => [50,50], :size => 16 # # If your font contains kerning pair data that Prawn can parse, the # text will be kerned by default. You can disable kerning by including # a false :kerning option. If you want to disable kerning on an # entire document, set default_kerning = false for that document # # === Text Positioning Details: # # Prawn will position your text by the left-most edge of its baseline, and # flow along a single line. (This means that :align will not work) # # == Rotation # # Text can be rotated before it is placed on the canvas by specifying the # :rotate option with a given angle. Rotation occurs counter-clockwise. # # == Encoding # # Note that strings passed to this function should be encoded as UTF-8. # If you get unexpected characters appearing in your rendered document, # check this. # # If the current font is a built-in one, although the string must be # encoded as UTF-8, only characters that are available in WinAnsi # are allowed. # # If an empty box is rendered to your PDF instead of the character you # wanted it usually means the current font doesn't include that character. # # == Options (default values marked in []) # # :at:: [x, y](required). The position at which to start the text # :kerning:: boolean. Whether or not to use kerning (if it # is available with the current font) # [value of default_kerning?] # :size:: number. The font size to use. [current font # size] # :style:: The style to use. The requested style must be part of # the current font familly. [current style] # # :rotate:: number. The angle to which to rotate text # # == Exceptions # # Raises ArgumentError if :at option omitted # # Raises ArgumentError if :align option included # def draw_text(text, options) options = inspect_options_for_draw_text(options.dup) # dup because normalize_encoding changes the string text = text.to_s.dup save_font do process_text_options(options) font.normalize_encoding!(text) font_size(options[:size]) { draw_text!(text, options) } end end # Low level text placement method. All font and size alterations # should already be set # def draw_text!(text, options) unless font.unicode? || font.class.hide_m17n_warning || text.ascii_only? warn "PDF's built-in fonts have very limited support for " \ "internationalized text.\nIf you need full UTF-8 support, " \ "consider using a TTF font instead.\n\nTo disable this " \ "warning, add the following line to your code:\n" \ "Prawn::Font::AFM.hide_m17n_warning = true\n" font.class.hide_m17n_warning = true end x, y = map_to_absolute(options[:at]) add_text_content(text, x, y, options) end # Gets height of text in PDF points. # Same options as #text, except as noted. # Not compatible with :indent_paragraphs option # # ==Example # # height_of("hello\nworld") # # == Exceptions # # Raises NotImplementedError if :indent_paragraphs # option included # # Raises Prawn::Errrors::CannotFit if not wide enough to print # any text # def height_of(string, options = {}) height_of_formatted([{ :text => string }], options) end # Gets height of formatted text in PDF points. # See documentation for #height_of. # # ==Example # # height_of_formatted([{ :text => "hello" }, # { :text => "world", # :size => 24, # :styles => [:bold, :italic] }]) # def height_of_formatted(array, options = {}) if options[:indent_paragraphs] fail NotImplementedError, ":indent_paragraphs option not available" \ "with height_of" end process_final_gap_option(options) box = Text::Formatted::Box.new( array, options.merge(:height => 100000000, :document => self) ) box.render(:dry_run => true) height = box.height height += box.line_gap + box.leading if @final_gap height end private def draw_remaining_formatted_text_on_new_pages(remaining_text, options) while remaining_text.length > 0 @bounding_box.move_past_bottom previous_remaining_text = remaining_text remaining_text = fill_formatted_text_box(remaining_text, options) break if remaining_text == previous_remaining_text end end def draw_indented_formatted_line(string, options) if options.fetch(:direction, text_direction) == :ltr gap = [@indent_paragraphs, 0] else gap = [0, @indent_paragraphs] end indent(*gap) do fill_formatted_text_box(string, options.dup.merge(:single_line => true)) end end def fill_formatted_text_box(text, options) merge_text_box_positioning_options(options) box = Text::Formatted::Box.new(text, options) remaining_text = box.render @no_text_printed = box.nothing_printed? @all_text_printed = box.everything_printed? self.y -= box.height self.y -= box.line_gap + box.leading if @final_gap remaining_text end def merge_text_box_positioning_options(options) bottom = @bounding_box.stretchy? ? @margin_box.absolute_bottom : @bounding_box.absolute_bottom options[:height] = y - bottom options[:width] = bounds.width options[:at] = [@bounding_box.left_side - @bounding_box.absolute_left, y - @bounding_box.absolute_bottom] end def inspect_options_for_draw_text(options) if options[:at].nil? fail ArgumentError, "The :at option is required for draw_text" elsif options[:align] fail ArgumentError, "The :align option does not work with draw_text" end if options[:kerning].nil? then options[:kerning] = default_kerning? end valid_options = PDF::Core::Text::VALID_OPTIONS + [:at, :rotate] Prawn.verify_options(valid_options, options) options end def inspect_options_for_text(options) if options[:at] fail ArgumentError, ":at is no longer a valid option with text." \ "use draw_text or text_box instead" end process_final_gap_option(options) process_indent_paragraphs_option(options) options[:document] = self options end def process_final_gap_option(options) @final_gap = options[:final_gap].nil? || options[:final_gap] options.delete(:final_gap) end def process_indent_paragraphs_option(options) @indent_paragraphs = options[:indent_paragraphs] options.delete(:indent_paragraphs) end def move_text_position(dy) bottom = @bounding_box.stretchy? ? @margin_box.absolute_bottom : @bounding_box.absolute_bottom @bounding_box.move_past_bottom if (y - dy) < bottom self.y -= dy end end end ruby-prawn-2.1.0.orig/lib/prawn.rb0000644000000000000000000000465312665203156015515 0ustar rootroot# encoding: utf-8 # Welcome to Prawn, the best PDF Generation library ever. # This documentation covers user level functionality. # require "set" require 'ttfunk' require "pdf/core" module Prawn extend self file = __FILE__ file = File.readlink(file) if File.symlink?(file) dir = File.dirname(file) # The base source directory for Prawn as installed on the system # # BASEDIR = File.expand_path(File.join(dir, '..')) DATADIR = File.expand_path(File.join(dir, '..', 'data')) FLOAT_PRECISION = 1.0e-9 # When set to true, Prawn will verify hash options to ensure only valid keys # are used. Off by default. # # Example: # >> Prawn::Document.new(:tomato => "Juicy") # Prawn::Errors::UnknownOption: # Detected unknown option(s): [:tomato] # Accepted options are: [:page_size, :page_layout, :left_margin, ...] # attr_accessor :debug # @private def verify_options(accepted, actual) # @private return unless debug || $DEBUG unless (act = Set[*actual.keys]).subset?(acc = Set[*accepted]) fail Prawn::Errors::UnknownOption, "\nDetected unknown option(s): #{(act - acc).to_a.inspect}\n" \ "Accepted options are: #{accepted.inspect}" end yield if block_given? end module Configurable # @private def configuration(*args) @config ||= Marshal.load(Marshal.dump(default_configuration)) if Hash === args[0] @config.update(args[0]) elsif args.length > 1 @config.values_at(*args) elsif args.length == 1 @config[args[0]] else @config end end alias_method :C, :configuration end end require_relative "prawn/version" require_relative "prawn/errors" require_relative "prawn/utilities" require_relative "prawn/text" require_relative "prawn/graphics" require_relative "prawn/images" require_relative "prawn/images/image" require_relative "prawn/images/jpg" require_relative "prawn/images/png" require_relative "prawn/stamp" require_relative "prawn/soft_mask" require_relative "prawn/security" require_relative "prawn/transformation_stack" require_relative "prawn/document" require_relative "prawn/font" require_relative "prawn/measurements" require_relative "prawn/repeater" require_relative "prawn/outline" require_relative "prawn/grid" require_relative "prawn/view" require_relative "prawn/image_handler" Prawn.image_handler.register(Prawn::Images::PNG) Prawn.image_handler.register(Prawn::Images::JPG) ruby-prawn-2.1.0.orig/COPYING0000644000000000000000000000021612665203156014315 0ustar rootrootPrawn may be used under Matz's original licensing terms for Ruby, or GPLv2 or GPLv3. See LICENSE for Matz's terms, or GPLv2 and GPLv3 files. ruby-prawn-2.1.0.orig/spec/0000755000000000000000000000000012665203156014215 5ustar rootrootruby-prawn-2.1.0.orig/spec/data/0000755000000000000000000000000012665203156015126 5ustar rootrootruby-prawn-2.1.0.orig/spec/data/curves.pdf0000644000000000000000000000167512665203156017141 0ustar rootroot%PDF-1.3 % 1 0 obj << /Creator (Prawn) /Producer (Prawn) >> endobj 2 0 obj << /Type /Pages /Count 1 /Kids [5 0 R] >> endobj 3 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 4 0 obj << /Length 380 >> stream /DeviceRGB cs 0.000 0.000 0.000 scn /DeviceRGB CS 0.000 0.000 0.000 SCN q 136.000 136.000 m 96.000 126.000 96.000 126.000 86.000 86.000 c S 246.000 236.000 m 246.000 241.523 241.523 246.000 236.000 246.000 c 230.477 246.000 226.000 241.523 226.000 236.000 c 226.000 230.477 230.477 226.000 236.000 226.000 c 241.523 226.000 246.000 230.477 246.000 236.000 c 236.000 236.000 m f Q endstream endobj 5 0 obj << /Type /Page /Parent 2 0 R /MediaBox [0 0 612.0 792.0] /Contents 4 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] >> >> endobj xref 0 6 0000000000 65535 f 0000000015 00000 n 0000000071 00000 n 0000000128 00000 n 0000000177 00000 n 0000000608 00000 n trailer << /Size 6 /Root 3 0 R /Info 1 0 R >> startxref 762 %%EOF ruby-prawn-2.1.0.orig/spec/font_metric_cache_spec.rb0000644000000000000000000000261212665203156021211 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") require 'pathname' describe "Font metrics caching" do let(:document) { Prawn::Document.new } subject { Prawn::FontMetricCache.new(document) } it "should start with an empty cache" do expect(subject.instance_variable_get(:@cache)).to be_empty end it "should cache the width of the provided string" do subject.width_of('M', {}) expect(subject.instance_variable_get(:@cache).size).to eq(1) end it "should only cache a single copy of the same string" do subject.width_of('M', {}) subject.width_of('M', {}) expect(subject.instance_variable_get(:@cache).size).to eq(1) end it "should cache different copies for different strings" do subject.width_of('M', {}) subject.width_of('W', {}) expect(subject.instance_variable_get(:@cache).entries.size).to eq(2) end it "should cache different copies of the same string with different font sizes" do subject.width_of('M', {}) document.font_size 24 subject.width_of('M', {}) expect(subject.instance_variable_get(:@cache).entries.size).to eq(2) end it "should cache different copies of the same string with different fonts" do subject.width_of('M', {}) document.font 'Courier' subject.width_of('M', {}) expect(subject.instance_variable_get(:@cache).entries.size).to eq(2) end end ruby-prawn-2.1.0.orig/spec/formatted_text_arranger_spec.rb0000644000000000000000000003417212665203156022475 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe Prawn::Text::Formatted::Arranger do let(:document) { create_pdf } subject { Prawn::Text::Formatted::Arranger.new document } describe '#format_array' do it 'populates the unconsumed array' do array = [ { text: 'hello ' }, { text: 'world how ', styles: [:bold] }, { text: 'are', styles: [:bold, :italic] }, { text: ' you?' } ] subject.format_array = array expect(subject.unconsumed[0]).to eq(text: 'hello ') expect(subject.unconsumed[1]).to eq(text: 'world how ', styles: [:bold]) expect(subject.unconsumed[2]).to eq(text: 'are', styles: [:bold, :italic]) expect(subject.unconsumed[3]).to eq(text: ' you?') end it 'splits newlins into their own elements' do array = [ { text: "\nhello\nworld" } ] subject.format_array = array expect(subject.unconsumed[0]).to eq(text: "\n") expect(subject.unconsumed[1]).to eq(text: "hello") expect(subject.unconsumed[2]).to eq(text: "\n") expect(subject.unconsumed[3]).to eq(text: "world") end end describe '#preview_next_string' do context 'with a formatted array' do let(:array) { [{ text: 'hello' }] } before do subject.format_array = array end it 'does not populate the consumed array' do subject.preview_next_string expect(subject.consumed).to eq([]) end it 'returns the text of the next unconsumed hash' do expect(subject.preview_next_string).to eq("hello") end it 'returns nil if there is no more unconsumed text' do subject.next_string expect(subject.preview_next_string).to be_nil end end end describe '#next_string' do let(:array) { [ { text: 'hello ' }, { text: 'world how ', styles: [:bold] }, { text: 'are', styles: [:bold, :italic] }, { text: ' you?' } ] } before do subject.format_array = array end it 'raises RuntimeError if called after a line was finalized' do subject.finalize_line expect { subject.next_string }.to raise_error(RuntimeError) end it 'populates the conumed array' do while string = subject.next_string end expect(subject.consumed[0]).to eq(text: 'hello ') expect(subject.consumed[1]).to eq(text: 'world how ', styles: [:bold]) expect(subject.consumed[2]).to eq(text: 'are', styles: [:bold, :italic]) expect(subject.consumed[3]).to eq(text: ' you?') end it 'populates the current_format_state array' do string = subject.next_string expect(subject.current_format_state).to eq({}) string = subject.next_string expect(subject.current_format_state).to eq(:styles => [:bold]) string = subject.next_string expect(subject.current_format_state).to eq(:styles => [:bold, :italic]) string = subject.next_string expect(subject.current_format_state).to eq({}) end it 'returns the text of the newly consumed hash' do expect(subject.next_string).to eq('hello ') end it 'returns nil when there are no more unconsumed hashes' do 4.times do subject.next_string end expect(subject.next_string).to be_nil end end describe '#retrieve_fragment' do context 'with a formatted array whos text is an empty string' do let(:array) { [ { text: "hello\nworld\n\n\nhow are you?" }, { text: "\n" }, { text: "\n" }, { text: "\n" }, { text: "" }, { text: "fine, thanks." }, { text: "" }, { text: "\n" }, { text: "" } ] } before do subject.format_array = array while string = subject.next_string end subject.finalize_line end it 'never returns a fragment whose text is an empty string' do while fragment = subject.retrieve_fragment expect(fragment.text).not_to be_empty end end end context 'with formatted array' do let(:array) { [ { text: 'hello ' }, { text: 'world how ', styles: [:bold] }, { text: 'are', styles: [:bold, :italic] }, { text: ' you?' } ] } before do subject.format_array = array end context 'after all strings have been consumed' do before do while string = subject.next_string end end it 'should raise RuntimeError an error if not finalized' do expect { subject.retrieve_fragment }.to raise_error(RuntimeError) end context 'and finalized' do before do subject.finalize_line end it 'returns the consumed fragments in order of consumption' do expect(subject.retrieve_fragment.text).to eq("hello ") expect(subject.retrieve_fragment.text).to eq("world how ") expect(subject.retrieve_fragment.text).to eq("are") expect(subject.retrieve_fragment.text).to eq(" you?") end it 'does not alter the current font style' do subject.retrieve_fragment expect(subject.current_format_state[:styles]).to be_nil end end end end end end describe "Core::Text::Formatted::Arranger#update_last_string" do it "should update the last retrieved string with what actually fit on" \ "the line and the list of unconsumed with what did not" do create_pdf arranger = Prawn::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world how ", :styles => [:bold] }, { :text => "are", :styles => [:bold, :italic] }, { :text => " you now?", :styles => [:bold, :italic] }] arranger.format_array = array while string = arranger.next_string end arranger.update_last_string(" you", " now?", nil) expect(arranger.consumed[3]).to eq(:text => " you", :styles => [:bold, :italic]) expect(arranger.unconsumed).to eq([{ :text => " now?", :styles => [:bold, :italic] }]) end it "should set the format state to the previously processed fragment" do create_pdf arranger = Prawn::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world how ", :styles => [:bold] }, { :text => "are", :styles => [:bold, :italic] }, { :text => " you now?" }] arranger.format_array = array 3.times { arranger.next_string } expect(arranger.current_format_state).to eq(:styles => [:bold, :italic]) arranger.update_last_string("", "are", "-") expect(arranger.current_format_state).to eq(:styles => [:bold]) end context "when the entire string was used" do it "should not push empty string onto unconsumed" do create_pdf arranger = Prawn::Text::Formatted::Arranger.new(@pdf) array = [ { :text => "hello " }, { :text => "world how ", :styles => [:bold] }, { :text => "are", :styles => [:bold, :italic] }, { :text => " you now?" } ] arranger.format_array = array while string = arranger.next_string end arranger.update_last_string(" you now?", "", nil) expect(arranger.unconsumed).to eq([]) end end end describe "Core::Text::Formatted::Arranger#space_count" do before(:each) do create_pdf @arranger = Prawn::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world how ", :styles => [:bold] }, { :text => "are", :styles => [:bold, :italic] }, { :text => " you?" }] @arranger.format_array = array while string = @arranger.next_string end end it "should raise_error an error if called before finalize_line was called" do expect do @arranger.space_count end.to raise_error(RuntimeError) end it "should return the total number of spaces in all fragments" do @arranger.finalize_line expect(@arranger.space_count).to eq(4) end end describe "Core::Text::Formatted::Arranger#finalize_line" do it "should make it so that all trailing white space fragments " \ "exclude trailing white space" do create_pdf arranger = Prawn::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world how ", :styles => [:bold] }, { :text => " ", :styles => [:bold, :italic] }] arranger.format_array = array while string = arranger.next_string end arranger.finalize_line expect(arranger.fragments.length).to eq(3) fragment = arranger.retrieve_fragment expect(fragment.text).to eq("hello ") fragment = arranger.retrieve_fragment expect(fragment.text).to eq("world how") fragment = arranger.retrieve_fragment expect(fragment.text).to eq("") end end describe "Core::Text::Formatted::Arranger#line_width" do before(:each) do create_pdf @arranger = Prawn::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world", :styles => [:bold] }] @arranger.format_array = array while string = @arranger.next_string end end it "should raise_error an error if called before finalize_line was called" do expect do @arranger.line_width end.to raise_error(RuntimeError) end it "should return the width of the complete line" do @arranger.finalize_line expect(@arranger.line_width).to be > 0 end end describe "Core::Text::Formatted::Arranger#line_width with character_spacing > 0" do it "should return a width greater than a line without a character_spacing" do create_pdf arranger = Prawn::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world", :styles => [:bold] }] arranger.format_array = array while string = arranger.next_string end arranger.finalize_line base_line_width = arranger.line_width array = [{ :text => "hello " }, { :text => "world", :styles => [:bold], :character_spacing => 7 }] arranger.format_array = array while string = arranger.next_string end arranger.finalize_line expect(arranger.line_width).to be > base_line_width end end describe "Core::Text::Formatted::Arranger#line" do before(:each) do create_pdf @arranger = Prawn::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world", :styles => [:bold] }] @arranger.format_array = array while string = @arranger.next_string end end it "should raise_error an error if called before finalize_line was called" do expect do @arranger.line end.to raise_error(RuntimeError) end it "should return the complete line" do @arranger.finalize_line expect(@arranger.line).to eq("hello world") end end describe "Core::Text::Formatted::Arranger#unconsumed" do it "should return the original array if nothing was consumed" do create_pdf arranger = Prawn::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world how ", :styles => [:bold] }, { :text => "are", :styles => [:bold, :italic] }, { :text => " you now?" }] arranger.format_array = array expect(arranger.unconsumed).to eq(array) end it "should return an empty array if everything was consumed" do create_pdf arranger = Prawn::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world how ", :styles => [:bold] }, { :text => "are", :styles => [:bold, :italic] }, { :text => " you now?" }] arranger.format_array = array while string = arranger.next_string end expect(arranger.unconsumed).to eq([]) end end describe "Core::Text::Formatted::Arranger#finished" do it "should be_false if anything was not printed" do create_pdf arranger = Prawn::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world how ", :styles => [:bold] }, { :text => "are", :styles => [:bold, :italic] }, { :text => " you now?" }] arranger.format_array = array while string = arranger.next_string end arranger.update_last_string(" you", "now?", nil) expect(arranger).not_to be_finished end it "should be_false if everything was printed" do create_pdf arranger = Prawn::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world how ", :styles => [:bold] }, { :text => "are", :styles => [:bold, :italic] }, { :text => " you now?" }] arranger.format_array = array while string = arranger.next_string end expect(arranger).to be_finished end end describe "Core::Text::Formatted::Arranger.max_line_height" do it "should be the height of the maximum consumed fragment" do create_pdf arranger = Prawn::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world how ", :styles => [:bold] }, { :text => "are", :styles => [:bold, :italic], :size => 28 }, { :text => " you now?" }] arranger.format_array = array while string = arranger.next_string end arranger.finalize_line expect(arranger.max_line_height).to be_within(0.0001).of(33.32) end end describe "Core::Text::Formatted::Arranger#repack_unretrieved" do it "should restore part of the original string" do create_pdf arranger = Prawn::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello " }, { :text => "world how ", :styles => [:bold] }, { :text => "are", :styles => [:bold, :italic] }, { :text => " you now?" }] arranger.format_array = array while string = arranger.next_string end arranger.finalize_line arranger.retrieve_fragment arranger.retrieve_fragment arranger.repack_unretrieved expect(arranger.unconsumed).to eq([ { :text => "are", :styles => [:bold, :italic] }, { :text => " you now?" } ]) end end ruby-prawn-2.1.0.orig/spec/extensions/0000755000000000000000000000000012665203156016414 5ustar rootrootruby-prawn-2.1.0.orig/spec/extensions/encoding_helpers.rb0000644000000000000000000000030712665203156022251 0ustar rootroot# encoding: utf-8 module EncodingHelpers def win1252_string(str) str.force_encoding(Encoding::Windows_1252) end def bin_string(str) str.force_encoding(Encoding::ASCII_8BIT) end end ruby-prawn-2.1.0.orig/spec/soft_mask_spec.rb0000644000000000000000000000400112665203156017535 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") module SoftMaskHelper def make_soft_mask @pdf.save_graphics_state do @pdf.soft_mask do if block_given? yield else @pdf.fill_color '808080' @pdf.fill_rectangle [100, 100], 200, 200 end end @pdf.fill_color '000000' @pdf.fill_rectangle [0, 0], 200, 200 end end end describe "Document with soft masks" do include SoftMaskHelper it "should have PDF version at least 1.4" do create_pdf make_soft_mask str = @pdf.render expect(str[0, 8]).to eq("%PDF-1.4") end it "should create a new extended graphics state for each unique soft mask" do create_pdf make_soft_mask do @pdf.fill_color '808080' @pdf.fill_rectangle [100, 100], 200, 200 end make_soft_mask do @pdf.fill_color '808080' @pdf.fill_rectangle [10, 10], 200, 200 end extgstates = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates expect(extgstates.length).to eq(2) end it "a new extended graphics state should contain soft mask with drawing instructions" do create_pdf make_soft_mask do @pdf.fill_color '808080' @pdf.fill_rectangle [100, 100], 200, 200 end extgstate = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates.first expect(extgstate[:soft_mask][:G].data).to eq("q\n/DeviceRGB cs\n0.000 0.000 0.000 scn\n/DeviceRGB CS\n0.000 0.000 0.000 SCN\n1 w\n0 J\n0 j\n[] 0 d\n/DeviceRGB cs\n0.502 0.502 0.502 scn\n100.0 -100.0 200.0 200.0 re\nf\nQ\n") end it "should not create duplicate extended graphics states" do create_pdf make_soft_mask do @pdf.fill_color '808080' @pdf.fill_rectangle [100, 100], 200, 200 end make_soft_mask do @pdf.fill_color '808080' @pdf.fill_rectangle [100, 100], 200, 200 end extgstates = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates expect(extgstates.length).to eq(1) end end ruby-prawn-2.1.0.orig/spec/png_spec.rb0000644000000000000000000002127312665203156016345 0ustar rootroot# encoding: ASCII-8BIT # Spec'ing the PNG class. Not complete yet - still needs to check the # contents of palette and transparency to ensure they're correct. # Need to find files that have these sections first. # # see http://www.w3.org/TR/PNG/ for a detailed description of the PNG spec, # particuarly Table 11.1 for the different color types require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "When reading a greyscale PNG file (color type 0)" do before(:each) do @filename = "#{Prawn::DATADIR}/images/web-links.png" @data_filename = "#{Prawn::DATADIR}/images/web-links.dat" @img_data = File.binread(@filename) end it "should read the attributes from the header chunk correctly" do png = Prawn::Images::PNG.new(@img_data) expect(png.width).to eq(21) expect(png.height).to eq(14) expect(png.bits).to eq(8) expect(png.color_type).to eq(0) expect(png.compression_method).to eq(0) expect(png.filter_method).to eq(0) expect(png.interlace_method).to eq(0) end it "should read the image data chunk correctly" do png = Prawn::Images::PNG.new(@img_data) data = Zlib::Inflate.inflate(File.binread(@data_filename)) expect(png.img_data).to eq(data) end end describe "When reading a greyscale PNG file with transparency (color type 0)" do before(:each) do @filename = "#{Prawn::DATADIR}/images/ruport_type0.png" @img_data = File.binread(@filename) end # In a greyscale type 0 PNG image, the tRNS chunk should contain a single value # that indicates the color that should be interpreted as transparent. # # http://www.w3.org/TR/PNG/#11tRNS it "should read the tRNS chunk correctly" do png = Prawn::Images::PNG.new(@img_data) expect(png.transparency[:grayscale]).to eq(255) end end describe "When reading an RGB PNG file (color type 2)" do before(:each) do @filename = "#{Prawn::DATADIR}/images/ruport.png" @data_filename = "#{Prawn::DATADIR}/images/ruport_data.dat" @img_data = File.binread(@filename) end it "should read the attributes from the header chunk correctly" do png = Prawn::Images::PNG.new(@img_data) expect(png.width).to eq(258) expect(png.height).to eq(105) expect(png.bits).to eq(8) expect(png.color_type).to eq(2) expect(png.compression_method).to eq(0) expect(png.filter_method).to eq(0) expect(png.interlace_method).to eq(0) end it "should read the image data chunk correctly" do png = Prawn::Images::PNG.new(@img_data) data = Zlib::Inflate.inflate(File.binread(@data_filename)) expect(png.img_data).to eq(data) end end describe "When reading an RGB PNG file with transparency (color type 2)" do before(:each) do @filename = "#{Prawn::DATADIR}/images/arrow2.png" @img_data = File.binread(@filename) end # In a RGB type 2 PNG image, the tRNS chunk should contain a single RGB value # that indicates the color that should be interpreted as transparent. In this # case it's green. # # http://www.w3.org/TR/PNG/#11tRNS it "should read the tRNS chunk correctly" do png = Prawn::Images::PNG.new(@img_data) expect(png.transparency[:rgb]).to eq([0, 255, 0]) end end describe "When reading an indexed color PNG file with transparency (color type 3)" do let(:filename) { "#{Prawn::DATADIR}/images/indexed_transparency.png" } let(:color_filename) { "#{Prawn::DATADIR}/images/indexed_transparency_color.dat" } let(:transparency_filename) { "#{Prawn::DATADIR}/images/indexed_transparency_alpha.dat" } let(:img_data) { File.binread(filename) } let(:png) { Prawn::Images::PNG.new(img_data) } it "reads the attributes from the header chunk correctly" do expect(png.width).to eq(200) expect(png.height).to eq(200) expect(png.bits).to eq(8) expect(png.color_type).to eq(3) expect(png.compression_method).to eq(0) expect(png.filter_method).to eq(0) expect(png.interlace_method).to eq(0) end it "reads the image data correctly" do data = Zlib::Inflate.inflate(File.binread(color_filename)) expect(png.img_data).to eq(data) end it "reads the image transparency correctly" do png.split_alpha_channel! data = Zlib::Inflate.inflate(File.binread(transparency_filename)) expect(png.alpha_channel).to eq(data) end end describe "When reading an indexed color PNG file (color type 3)" do before(:each) do @filename = "#{Prawn::DATADIR}/images/indexed_color.png" @data_filename = "#{Prawn::DATADIR}/images/indexed_color.dat" @img_data = File.binread(@filename) end it "should read the attributes from the header chunk correctly" do png = Prawn::Images::PNG.new(@img_data) expect(png.width).to eq(150) expect(png.height).to eq(200) expect(png.bits).to eq(8) expect(png.color_type).to eq(3) expect(png.compression_method).to eq(0) expect(png.filter_method).to eq(0) expect(png.interlace_method).to eq(0) end it "should read the image data chunk correctly" do png = Prawn::Images::PNG.new(@img_data) data = Zlib::Inflate.inflate(File.binread(@data_filename)) expect(png.img_data).to eq(data) end end describe "When reading a greyscale+alpha PNG file (color type 4)" do before(:each) do @filename = "#{Prawn::DATADIR}/images/page_white_text.png" @color_data_filename = "#{Prawn::DATADIR}/images/page_white_text.color" @alpha_data_filename = "#{Prawn::DATADIR}/images/page_white_text.alpha" @img_data = File.binread(@filename) end it "should read the attributes from the header chunk correctly" do png = Prawn::Images::PNG.new(@img_data) expect(png.width).to eq(16) expect(png.height).to eq(16) expect(png.bits).to eq(8) expect(png.color_type).to eq(4) expect(png.compression_method).to eq(0) expect(png.filter_method).to eq(0) expect(png.interlace_method).to eq(0) end it "should correctly return the raw image data (with no alpha channel) from the image data chunk" do png = Prawn::Images::PNG.new(@img_data) png.split_alpha_channel! data = File.binread(@color_data_filename) expect(png.img_data).to eq(data) end it "should correctly extract the alpha channel data from the image data chunk" do png = Prawn::Images::PNG.new(@img_data) png.split_alpha_channel! data = File.binread(@alpha_data_filename) expect(png.alpha_channel).to eq(data) end end describe "When reading an RGB+alpha PNG file (color type 6)" do before(:each) do @filename = "#{Prawn::DATADIR}/images/dice.png" @color_data_filename = "#{Prawn::DATADIR}/images/dice.color" @alpha_data_filename = "#{Prawn::DATADIR}/images/dice.alpha" @img_data = File.binread(@filename) end it "should read the attributes from the header chunk correctly" do png = Prawn::Images::PNG.new(@img_data) expect(png.width).to eq(320) expect(png.height).to eq(240) expect(png.bits).to eq(8) expect(png.color_type).to eq(6) expect(png.compression_method).to eq(0) expect(png.filter_method).to eq(0) expect(png.interlace_method).to eq(0) end it "should correctly return the raw image data (with no alpha channel) from the image data chunk" do png = Prawn::Images::PNG.new(@img_data) png.split_alpha_channel! data = File.binread(@color_data_filename) expect(png.img_data).to eq(data) end it "should correctly extract the alpha channel data from the image data chunk" do png = Prawn::Images::PNG.new(@img_data) png.split_alpha_channel! data = File.binread(@alpha_data_filename) expect(png.alpha_channel).to eq(data) end end describe "When reading a 16bit RGB+alpha PNG file (color type 6)" do before(:each) do @filename = "#{Prawn::DATADIR}/images/16bit.png" @color_data_filename = "#{Prawn::DATADIR}/images/16bit.color" # alpha channel truncated to 8-bit @alpha_data_filename = "#{Prawn::DATADIR}/images/16bit.alpha" @img_data = File.binread(@filename) end it "should read the attributes from the header chunk correctly" do png = Prawn::Images::PNG.new(@img_data) expect(png.width).to eq(32) expect(png.height).to eq(32) expect(png.bits).to eq(16) expect(png.color_type).to eq(6) expect(png.compression_method).to eq(0) expect(png.filter_method).to eq(0) expect(png.interlace_method).to eq(0) end it "should correctly return the raw image data (with no alpha channel) from the image data chunk" do png = Prawn::Images::PNG.new(@img_data) png.split_alpha_channel! data = File.binread(@color_data_filename) expect(png.img_data).to eq(data) end it "should correctly extract the alpha channel data from the image data chunk" do png = Prawn::Images::PNG.new(@img_data) png.split_alpha_channel! data = File.binread(@alpha_data_filename) expect(png.alpha_channel).to eq(data) end end ruby-prawn-2.1.0.orig/spec/repeater_spec.rb0000644000000000000000000001107112665203156017363 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "Repeaters" do it "creates a stamp and increments Prawn::Repeater.count on initialize" do orig_count = Prawn::Repeater.count doc = sample_document expect(doc).to receive(:create_stamp).with("prawn_repeater(#{orig_count})") r = repeater(doc, :all) { :do_nothing } expect(Prawn::Repeater.count).to eq(orig_count + 1) end it "must provide an :all filter" do doc = sample_document r = repeater(doc, :all) { :do_nothing } expect((1..doc.page_count).all? { |i| r.match?(i) }).to eq true end it "must provide an :odd filter" do doc = sample_document r = repeater(doc, :odd) { :do_nothing } odd, even = (1..doc.page_count).partition(&:odd?) expect(odd.all? { |i| r.match?(i) }).to eq true expect(even.any? { |i| r.match?(i) }).to eq false end it "must be able to filter by an array of page numbers" do doc = sample_document r = repeater(doc, [1, 2, 7]) { :do_nothing } expect((1..10).select { |i| r.match?(i) }).to eq([1, 2, 7]) end it "must be able to filter by a range of page numbers" do doc = sample_document r = repeater(doc, 2..4) { :do_nothing } expect((1..10).select { |i| r.match?(i) }).to eq([2, 3, 4]) end it "must be able to filter by an arbitrary proc" do doc = sample_document r = repeater(doc, lambda { |x| x == 1 or x % 3 == 0 }) expect((1..10).select { |i| r.match?(i) }).to eq([1, 3, 6, 9]) end it "must try to run a stamp if the page number matches" do doc = sample_document expect(doc).to receive(:stamp) repeater(doc, :odd).run(3) end it "must not try to run a stamp unless the page number matches" do doc = sample_document expect(doc).to_not receive(:stamp) repeater(doc, :odd).run(2) end it "must not try to run a stamp if dynamic is selected" do doc = sample_document expect(doc).to_not receive(:stamp) (1..10).each { |p| repeater(doc, :all, true){ :do_nothing }.run(p) } end it "must try to run a block if the page number matches" do doc = sample_document expect(doc).to receive(:draw_text).twice (1..10).each { |p| repeater(doc, [1, 2], true){ doc.draw_text "foo" }.run(p) } end it "must not try to run a block unless the page number matches" do doc = sample_document expect(doc).to_not receive(:draw_text) repeater(doc, :odd, true){ doc.draw_text "foo" }.run(2) end it "must treat any block as a closure" do doc = sample_document @page = "Page" # ensure access to ivars doc.repeat(:all, :dynamic => true) do doc.draw_text "#@page #{doc.page_number}", :at => [500, 0] end text = PDF::Inspector::Text.analyze(doc.render) expect(text.strings).to eq((1..10).to_a.map{ |p| "Page #{p}" }) end it "must treat any block as a closure (Document.new instance_eval form)" do doc = Prawn::Document.new(:skip_page_creation => true) do 10.times { start_new_page } @page = "Page" repeat(:all, :dynamic => true) do # ensure self is accessible here draw_text "#@page #{page_number}", :at => [500, 0] end end text = PDF::Inspector::Text.analyze(doc.render) expect(text.strings).to eq((1..10).to_a.map{ |p| "Page #{p}" }) end def sample_document doc = Prawn::Document.new(:skip_page_creation => true) 10.times { |e| doc.start_new_page } doc end def repeater(*args, &b) Prawn::Repeater.new(*args, &b) end context "graphic state" do it "should not alter the graphic state stack color space" do create_pdf starting_color_space = @pdf.state.page.graphic_state.color_space.dup @pdf.repeat :all do @pdf.text "Testing", :size => 24, :style => :bold end expect(@pdf.state.page.graphic_state.color_space).to eq(starting_color_space) end context "dynamic repeaters" do it "should preserve the graphic state at creation time" do create_pdf @pdf.repeat :all, :dynamic => true do @pdf.text "fill_color: #{@pdf.graphic_state.fill_color}" @pdf.text "cap_style: #{@pdf.graphic_state.cap_style}" end @pdf.fill_color "666666" @pdf.cap_style :round text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.strings.include?("fill_color: 666666")).to eq(false) expect(text.strings.include?("fill_color: 000000")).to eq(true) expect(text.strings.include?("cap_style: round")).to eq(false) expect(text.strings.include?("cap_style: butt")).to eq(true) end end end end ruby-prawn-2.1.0.orig/spec/jpg_spec.rb0000644000000000000000000000127312665203156016337 0ustar rootroot# encoding: utf-8 # Spec'ing the PNG class. Not complete yet - still needs to check the # contents of palette and transparency to ensure they're correct. # Need to find files that have these sections first. require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "When reading a JPEG file" do before(:each) do @filename = "#{Prawn::DATADIR}/images/pigs.jpg" @img_data = File.open(@filename, "rb") { |f| f.read } end it "should read the basic attributes correctly" do jpg = Prawn::Images::JPG.new(@img_data) expect(jpg.width).to eq(604) expect(jpg.height).to eq(453) expect(jpg.bits).to eq(8) expect(jpg.channels).to eq(3) end end ruby-prawn-2.1.0.orig/spec/document_spec.rb0000644000000000000000000005475612665203156017413 0ustar rootroot# encoding: utf-8 require "tempfile" require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "Prawn::Document.new" do it "should not modify its argument" do options = { :page_layout => :landscape } Prawn::Document.new(options) expect(options).to eq(:page_layout => :landscape) end end describe "The cursor" do it "should == pdf.y - bounds.absolute_bottom" do pdf = Prawn::Document.new expect(pdf.cursor).to eq(pdf.bounds.top) pdf.y = 300 expect(pdf.cursor).to eq(pdf.y - pdf.bounds.absolute_bottom) end it "should be able to move relative to the bottom margin" do pdf = Prawn::Document.new pdf.move_cursor_to(10) expect(pdf.cursor).to eq(10) expect(pdf.y).to eq(pdf.cursor + pdf.bounds.absolute_bottom) end end describe "when generating a document with a custom text formatter" do it "should use the provided text formatter" do class TestTextFormatter def self.format(string) [ { text: string.gsub("Dr. Who?", "Just 'The Doctor'."), styles: [], color: nil, link: nil, anchor: nil, local: nil, font: nil, size: nil, character_spacing: nil } ] end end pdf = Prawn::Document.new text_formatter: TestTextFormatter pdf.text "Dr. Who?", inline_format: true text = PDF::Inspector::Text.analyze(pdf.render) expect(text.strings.first).to eq("Just 'The Doctor'.") end end describe "when generating a document from a subclass" do it "should be an instance of the subclass" do custom_document = Class.new(Prawn::Document) custom_document.generate(Tempfile.new("generate_test").path) do |e| expect(e.class).to eq(custom_document) expect(e).to be_a_kind_of(Prawn::Document) end end it "should retain any extensions found on Prawn::Document" do mod1 = Module.new { attr_reader :test_extensions1 } mod2 = Module.new { attr_reader :test_extensions2 } Prawn::Document.extensions << mod1 << mod2 custom_document = Class.new(Prawn::Document) expect(custom_document.extensions).to eq([mod1, mod2]) # remove the extensions we added to prawn document Prawn::Document.extensions.delete(mod1) Prawn::Document.extensions.delete(mod2) expect(Prawn::Document.new.respond_to?(:test_extensions1)).to eq false expect(Prawn::Document.new.respond_to?(:test_extensions2)).to eq false # verify these still exist on custom class expect(custom_document.extensions).to eq([mod1, mod2]) expect(custom_document.new.respond_to?(:test_extensions1)).to eq true expect(custom_document.new.respond_to?(:test_extensions2)).to eq true end end describe "When creating multi-page documents" do before(:each) { create_pdf } it "should initialize with a single page" do page_counter = PDF::Inspector::Page.analyze(@pdf.render) expect(page_counter.pages.size).to eq(1) expect(@pdf.page_count).to eq(1) end it "should provide an accurate page_count" do 3.times { @pdf.start_new_page } page_counter = PDF::Inspector::Page.analyze(@pdf.render) expect(page_counter.pages.size).to eq(4) expect(@pdf.page_count).to eq(4) end end describe "When beginning each new page" do describe "Background image feature" do before(:each) do @filename = "#{Prawn::DATADIR}/images/pigs.jpg" @pdf = Prawn::Document.new(:background => @filename) end it "should place a background image if it is in options block" do output = @pdf.render images = PDF::Inspector::XObject.analyze(output) # there should be 2 images in the page resources expect(images.page_xobjects.first.size).to eq(1) end it "should place a background image if it is in options block" do expect(@pdf.instance_variable_defined?(:@background)).to eq(true) expect(@pdf.instance_variable_get(:@background)).to eq(@filename) end end end describe "Prawn::Document#float" do it "should restore the original y-position" do create_pdf orig_y = @pdf.y @pdf.float { @pdf.text "Foo" } expect(@pdf.y).to eq(orig_y) end it "should teleport across pages if necessary" do create_pdf @pdf.float do @pdf.text "Foo" @pdf.start_new_page @pdf.text "Bar" end @pdf.text "Baz" pages = PDF::Inspector::Page.analyze(@pdf.render).pages expect(pages.size).to eq(2) expect(pages[0][:strings]).to eq(["Foo", "Baz"]) expect(pages[1][:strings]).to eq(["Bar"]) end end describe "The page_number method" do it "should be 1 for a new document" do pdf = Prawn::Document.new expect(pdf.page_number).to eq(1) end it "should be 0 for documents with no pages" do pdf = Prawn::Document.new(:skip_page_creation => true) expect(pdf.page_number).to eq(0) end it "should be changed by go_to_page" do pdf = Prawn::Document.new 10.times { pdf.start_new_page } pdf.go_to_page 3 expect(pdf.page_number).to eq(3) end end describe "on_page_create callback" do before do create_pdf end it "should be delegated from Document to renderer" do expect(@pdf.respond_to?(:on_page_create)).to eq true end it "should be invoked with document" do called_with = nil @pdf.renderer.on_page_create { |*args| called_with = args } @pdf.start_new_page expect(called_with).to eq([@pdf]) end it "should be invoked for each new page" do trigger = double("trigger") expect(trigger).to receive(:fire).exactly(5).times @pdf.renderer.on_page_create { trigger.fire } 5.times { @pdf.start_new_page } end it "should be replaceable" do trigger1 = double("trigger 1") expect(trigger1).to receive(:fire).once trigger2 = double("trigger 2") expect(trigger2).to receive(:fire).once @pdf.renderer.on_page_create { trigger1.fire } @pdf.start_new_page @pdf.renderer.on_page_create { trigger2.fire } @pdf.start_new_page end it "should be clearable by calling on_page_create without a block" do trigger = double("trigger") expect(trigger).to receive(:fire).once @pdf.renderer.on_page_create { trigger.fire } @pdf.start_new_page @pdf.renderer.on_page_create @pdf.start_new_page end end describe "Document compression" do it "should not compress the page content stream if compression is disabled" do pdf = Prawn::Document.new(:compress => false) allow(pdf.page.content.stream).to receive(:compress!).and_return(true) expect(pdf.page.content.stream).to_not receive(:compress!) pdf.text "Hi There" * 20 pdf.render end it "should compress the page content stream if compression is enabled" do pdf = Prawn::Document.new(:compress => true) allow(pdf.page.content.stream).to receive(:compress!).and_return(true) expect(pdf.page.content.stream).to receive(:compress!).once pdf.text "Hi There" * 20 pdf.render end it "should result in a smaller file size when compressed" do doc_uncompressed = Prawn::Document.new doc_compressed = Prawn::Document.new(:compress => true) [doc_compressed, doc_uncompressed].each do |pdf| pdf.font "#{Prawn::DATADIR}/fonts/gkai00mp.ttf" pdf.text "更可怕的是,同质化竞争对手可以按照URL中后面这个ID来遍历" * 10 end expect(doc_compressed.render.length).to be < doc_uncompressed.render.length end end describe "Document metadata" do it "should output strings as UTF-16 with a byte order mark" do pdf = Prawn::Document.new(:info => { :Author => "Lóránt" }) expect(pdf.state.store.info.object).to match( # UTF-16: BOM L ó r á n t %r{/Author\s*}i ) end end describe "When reopening pages" do it "should modify the content stream size" do @pdf = Prawn::Document.new do |pdf| pdf.text "Page 1" pdf.start_new_page pdf.text "Page 2" pdf.go_to_page 1 pdf.text "More for page 1" end # Indirectly verify that the actual length does not match dictionary length. # If it isn't, a MalformedPDFError will be raised PDF::Inspector::Page.analyze(@pdf.render) end it "should insert pages after the current page when calling start_new_page" do pdf = Prawn::Document.new 3.times do |i| pdf.text "Old page #{i + 1}" pdf.start_new_page end pdf.go_to_page 1 pdf.start_new_page pdf.text "New page 2" expect(pdf.page_number).to eq(2) pages = PDF::Inspector::Page.analyze(pdf.render).pages expect(pages.size).to eq(5) expect(pages[1][:strings]).to eq(["New page 2"]) expect(pages[2][:strings]).to eq(["Old page 2"]) end it "should restore the layout of the page" do doc = Prawn::Document.new do start_new_page :layout => :landscape end lsize = [doc.bounds.width, doc.bounds.height] expect([doc.bounds.width, doc.bounds.height]).to eq lsize doc.go_to_page 1 expect([doc.bounds.width, doc.bounds.height]).to eq lsize.reverse end it "should restore the margin box of the page" do doc = Prawn::Document.new(:margin => [100, 100]) page1_bounds = doc.bounds doc.start_new_page(:margin => [200, 200]) expect([doc.bounds.width, doc.bounds.height]).to eq( [page1_bounds.width - 200, page1_bounds.height - 200] ) doc.go_to_page(1) expect(doc.bounds.width).to eq page1_bounds.width expect(doc.bounds.height).to eq page1_bounds.height end end describe "When setting page size" do it "should default to LETTER" do @pdf = Prawn::Document.new pages = PDF::Inspector::Page.analyze(@pdf.render).pages expect(pages.first[:size]).to eq(PDF::Core::PageGeometry::SIZES["LETTER"]) end (PDF::Core::PageGeometry::SIZES.keys - ["LETTER"]).each do |k| it "should provide #{k} geometry" do @pdf = Prawn::Document.new(:page_size => k) pages = PDF::Inspector::Page.analyze(@pdf.render).pages expect(pages.first[:size]).to eq(PDF::Core::PageGeometry::SIZES[k]) end end it "should allow custom page size" do @pdf = Prawn::Document.new(:page_size => [1920, 1080]) pages = PDF::Inspector::Page.analyze(@pdf.render).pages expect(pages.first[:size]).to eq([1920, 1080]) end it "should retain page size by default when starting a new page" do @pdf = Prawn::Document.new(:page_size => "LEGAL") @pdf.start_new_page pages = PDF::Inspector::Page.analyze(@pdf.render).pages pages.each do |page| expect(page[:size]).to eq(PDF::Core::PageGeometry::SIZES["LEGAL"]) end end end describe "When setting page layout" do it "should reverse coordinates for landscape" do @pdf = Prawn::Document.new(:page_size => "A4", :page_layout => :landscape) pages = PDF::Inspector::Page.analyze(@pdf.render).pages expect(pages.first[:size]).to eq(PDF::Core::PageGeometry::SIZES["A4"].reverse) end it "should retain page layout by default when starting a new page" do @pdf = Prawn::Document.new(:page_layout => :landscape) @pdf.start_new_page(:trace => true) pages = PDF::Inspector::Page.analyze(@pdf.render).pages pages.each do |page| expect(page[:size]).to eq(PDF::Core::PageGeometry::SIZES["LETTER"].reverse) end end it "should swap the bounds when starting a new page with different layout" do @pdf = Prawn::Document.new size = [@pdf.bounds.width, @pdf.bounds.height] @pdf.start_new_page(:layout => :landscape) expect([@pdf.bounds.width, @pdf.bounds.height]).to eq(size.reverse) end end describe "The mask() feature" do it "should allow transactional restoration of attributes" do @pdf = Prawn::Document.new y, line_width = @pdf.y, @pdf.line_width @pdf.mask(:y, :line_width) do @pdf.y = y + 1 @pdf.line_width = line_width + 1 expect(@pdf.y).not_to eq(y) expect(@pdf.line_width).not_to eq(line_width) end expect(@pdf.y).to eq(y) expect(@pdf.line_width).to eq(line_width) end end describe "The group() feature" do xit "should return a true value if the content fits on one page" do pdf = Prawn::Document.new do val = group { text "Hello" text "World" } expect(!!val).to eq(true) end end xit "should group a simple block on a single page" do pdf = Prawn::Document.new do self.y = 50 val = group do text "Hello" text "World" end # group should return a false value since a new page was started expect(!!val).to eq(false) end pages = PDF::Inspector::Page.analyze(pdf.render).pages expect(pages.size).to eq(2) expect(pages[0][:strings]).to eq([]) expect(pages[1][:strings]).to eq(["Hello", "World"]) end xit "should raise_error CannotGroup if the content is too tall" do expect { Prawn::Document.new do group do 100.times { text "Too long" } end end.render }.to raise_error(Prawn::Errors::CannotGroup) end xit "should group within individual column boxes" do pdf = Prawn::Document.new do # Set up columns with grouped blocks of 0..49. 0 to 49 is slightly short # of the height of one page / column, so each column should get its own # group (every column should start with zero). column_box([0, bounds.top], :width => bounds.width, :columns => 7) do 10.times do group { 50.times { |i| text(i.to_s) } } end end end # Second page should start with a 0 because it's a new group. pages = PDF::Inspector::Page.analyze(pdf.render).pages expect(pages.size).to eq(2) expect(pages[1][:strings].first).to eq('0') end end describe "The render() feature" do it "should return a 8 bit encoded string on a m17n aware VM" do @pdf = Prawn::Document.new(:page_size => "A4", :page_layout => :landscape) @pdf.line [100, 100], [200, 200] str = @pdf.render expect(str.encoding.to_s).to eq("ASCII-8BIT") end it "should trigger before_render callbacks just before rendering" do pdf = Prawn::Document.new # Verify the order: finalize -> fire callbacks -> render body expect(pdf.renderer).to receive(:finalize_all_page_contents).and_call_original.ordered trigger = double("trigger") expect(trigger).to receive(:fire).ordered pdf.renderer.before_render{ trigger.fire } expect(pdf.renderer).to receive(:render_body).and_call_original.ordered pdf.render(StringIO.new) end it "should be idempotent" do pdf = Prawn::Document.new contents = pdf.render contents2 = pdf.render expect(contents2).to eq(contents) end end describe "PDF file versions" do it "should default to 1.3" do @pdf = Prawn::Document.new str = @pdf.render expect(str[0, 8]).to eq("%PDF-1.3") end it "should allow the default to be changed" do @pdf = Prawn::Document.new @pdf.renderer.min_version(1.4) str = @pdf.render expect(str[0, 8]).to eq("%PDF-1.4") end end describe "Documents that use go_to_page" do it "should have 2 pages after calling start_new_page and go_to_page" do @pdf = Prawn::Document.new @pdf.text "James" @pdf.start_new_page @pdf.text "Anthony" @pdf.go_to_page(1) @pdf.text "Healy" page_counter = PDF::Inspector::Page.analyze(@pdf.render) expect(page_counter.pages.size).to eq(2) end it "should correctly add text to pages" do @pdf = Prawn::Document.new @pdf.text "James" @pdf.start_new_page @pdf.text "Anthony" @pdf.go_to_page(1) @pdf.text "Healy" text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.strings.size).to eq(3) expect(text.strings.include?("James")).to eq(true) expect(text.strings.include?("Anthony")).to eq(true) expect(text.strings.include?("Healy")).to eq(true) end end describe "content stream characteristics" do it "should have 1 single content stream for a single page PDF" do @pdf = Prawn::Document.new @pdf.text "James" output = StringIO.new(@pdf.render) hash = PDF::Reader::ObjectHash.new(output) streams = hash.values.select { |obj| obj.kind_of?(PDF::Reader::Stream) } expect(streams.size).to eq(1) end it "should have 1 single content stream for a single page PDF, even if go_to_page is used" do @pdf = Prawn::Document.new @pdf.text "James" @pdf.go_to_page(1) @pdf.text "Healy" output = StringIO.new(@pdf.render) hash = PDF::Reader::ObjectHash.new(output) streams = hash.values.select { |obj| obj.kind_of?(PDF::Reader::Stream) } expect(streams.size).to eq(1) end end describe "The number_pages method" do before do @pdf = Prawn::Document.new(:skip_page_creation => true) end it "replaces the '' string with the proper page number" do @pdf.start_new_page expect(@pdf).to receive(:text_box).with("1, test", :height => 50) @pdf.number_pages ", test", :page_filter => :all end it "replaces the '' string with the total page count" do @pdf.start_new_page expect(@pdf).to receive(:text_box).with("test, 1", :height => 50) @pdf.number_pages "test, ", :page_filter => :all end it "must print each page if given the :all page_filter" do 10.times { @pdf.start_new_page } expect(@pdf).to receive(:text_box).exactly(10).times @pdf.number_pages "test", :page_filter => :all end it "must print each page if no :page_filter is specified" do 10.times { @pdf.start_new_page } expect(@pdf).to receive(:text_box).exactly(10).times @pdf.number_pages "test" end it "must not print the page number if given a nil filter" do 10.times { @pdf.start_new_page } expect(@pdf).to_not receive(:text_box) @pdf.number_pages "test", :page_filter => nil end context "start_count_at option" do [1, 2].each do |startat| context "equal to #{startat}" do it "increments the pages" do 2.times { @pdf.start_new_page } options = { :page_filter => :all, :start_count_at => startat } expect(@pdf).to receive(:text_box).with("#{startat} 2", :height => 50) expect(@pdf).to receive(:text_box).with("#{startat + 1} 2", :height => 50) @pdf.number_pages " ", options end end end [0, nil].each do |val| context "equal to #{val}" do it "defaults to start at page 1" do 3.times { @pdf.start_new_page } options = { :page_filter => :all, :start_count_at => val } expect(@pdf).to receive(:text_box).with("1 3", :height => 50) expect(@pdf).to receive(:text_box).with("2 3", :height => 50) expect(@pdf).to receive(:text_box).with("3 3", :height => 50) @pdf.number_pages " ", options end end end end context "total_pages option" do it "allows the total pages count to be overridden" do 2.times { @pdf.start_new_page } expect(@pdf).to receive(:text_box).with("1 10", :height => 50) expect(@pdf).to receive(:text_box).with("2 10", :height => 50) @pdf.number_pages " ", :page_filter => :all, :total_pages => 10 end end context "special page filter" do context "such as :odd" do it "increments the pages" do 3.times { @pdf.start_new_page } expect(@pdf).to receive(:text_box).with("1 3", :height => 50) expect(@pdf).to receive(:text_box).with("3 3", :height => 50) expect(@pdf).to_not receive(:text_box).with("2 3", :height => 50) @pdf.number_pages " ", :page_filter => :odd end end context "missing" do it "does not print any page numbers" do 3.times { @pdf.start_new_page } expect(@pdf).to_not receive(:text_box) @pdf.number_pages " ", :page_filter => nil end end end context "given both a special page filter and a start_count_at parameter" do context "such as :odd and 7" do it "increments the pages" do 3.times { @pdf.start_new_page } expect(@pdf).to_not receive(:text_box).with("1 3", :height => 50) expect(@pdf).to receive(:text_box).with("5 3", :height => 50) # page 1 expect(@pdf).to_not receive(:text_box).with("6 3", :height => 50) # page 2 expect(@pdf).to receive(:text_box).with("7 3", :height => 50) # page 3 @pdf.number_pages " ", :page_filter => :odd, :start_count_at => 5 end end context "some crazy proc and 2" do it "increments the pages" do 6.times { @pdf.start_new_page } options = { :page_filter => lambda { |p| p != 2 && p != 5 }, :start_count_at => 4 } expect(@pdf).to receive(:text_box).with("4 6", :height => 50) # page 1 expect(@pdf).to_not receive(:text_box).with("5 6", :height => 50) # page 2 expect(@pdf).to receive(:text_box).with("6 6", :height => 50) # page 3 expect(@pdf).to receive(:text_box).with("7 6", :height => 50) # page 4 expect(@pdf).to_not receive(:text_box).with("8 6", :height => 50) # page 5 expect(@pdf).to receive(:text_box).with("9 6", :height => 50) # page 6 @pdf.number_pages " ", options end end end context "height option" do before do @pdf.start_new_page end it "with 10 height" do expect(@pdf).to receive(:text_box).with("1 1", :height => 10) @pdf.number_pages " ", :height => 10 end it "with nil height" do expect(@pdf).to receive(:text_box).with("1 1", :height => nil) @pdf.number_pages " ", :height => nil end it "with no height" do expect(@pdf).to receive(:text_box).with("1 1", height: 50) @pdf.number_pages " " end end end describe "The page_match? method" do before do @pdf = Prawn::Document.new(:skip_page_creation => true) 10.times { @pdf.start_new_page } end it "returns nil given no filter" do expect(@pdf.page_match?(:nil, 1)).to be_falsey end it "must provide an :all filter" do expect((1..@pdf.page_count).all? { |i| @pdf.page_match?(:all, i) }).to eq true end it "must provide an :odd filter" do odd, even = (1..@pdf.page_count).partition(&:odd?) expect(odd.all? { |i| @pdf.page_match?(:odd, i) }).to eq true expect(even.any? { |i| @pdf.page_match?(:odd, i) }).to be_falsey end it "must be able to filter by an array of page numbers" do fltr = [1, 2, 7] expect((1..10).select { |i| @pdf.page_match?(fltr, i) }).to eq([1, 2, 7]) end it "must be able to filter by a range of page numbers" do fltr = 2..4 expect((1..10).select { |i| @pdf.page_match?(fltr, i) }).to eq([2, 3, 4]) end it "must be able to filter by an arbitrary proc" do fltr = lambda { |x| x == 1 or x % 3 == 0 } expect((1..10).select { |i| @pdf.page_match?(fltr, i) }).to eq([1, 3, 6, 9]) end end ruby-prawn-2.1.0.orig/spec/transformation_stack_spec.rb0000644000000000000000000000347112665203156022014 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe Prawn::TransformationStack do before { create_pdf } before { pdf.add_to_transformation_stack(2, 0, 0, 2, 100, 100) } let(:pdf) { @pdf } let(:stack) { @pdf.instance_variable_get(:@transformation_stack) } describe "#add_to_transformation_stack" do it "creates and adds to the stack" do pdf.add_to_transformation_stack(1, 0, 0, 1, 20, 20) expect(stack).to eq [[[2, 0, 0, 2, 100, 100], [1, 0, 0, 1, 20, 20]]] end it "adds to the last stack" do pdf.save_transformation_stack pdf.add_to_transformation_stack(1, 0, 0, 1, 20, 20) expect(stack).to eq [ [[2, 0, 0, 2, 100, 100]], [[2, 0, 0, 2, 100, 100], [1, 0, 0, 1, 20, 20]] ] end end describe "#save_transformation_stack" do it "clones the last stack" do pdf.save_transformation_stack expect(stack.length).to eq 2 expect(stack.first).to eq stack.last expect(stack.first).to_not be stack.last end end describe "#restore_transformation_stack" do it "pops off the last stack" do pdf.save_transformation_stack pdf.add_to_transformation_stack(1, 0, 0, 1, 20, 20) pdf.restore_transformation_stack expect(stack).to eq [[[2, 0, 0, 2, 100, 100]]] end end describe "current_transformation_matrix_with_translation" do before do pdf.add_to_transformation_stack(1, 0, 0, 1, 20, 20) end it "calculates the last transformation" do expect(pdf.current_transformation_matrix_with_translation).to eq [2, 0, 0, 2, 140, 140] end it "adds the supplied x and y coordinates to the transformation stack" do expect(pdf.current_transformation_matrix_with_translation(15, 15)).to eq [2, 0, 0, 2, 170, 170] end end end ruby-prawn-2.1.0.orig/spec/stamp_spec.rb0000644000000000000000000001310512665203156016700 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "create_stamp before any page is added" do it "should work with the font class" do @pdf = Prawn::Document.new(:skip_page_creation => true) # If anything goes wrong, Prawn::Errors::NotOnPage will be raised @pdf.create_stamp("my_stamp") do @pdf.font.height end end it "should work with setting color" do @pdf = Prawn::Document.new(:skip_page_creation => true) # If anything goes wrong, Prawn::Errors::NotOnPage will be raised @pdf.create_stamp("my_stamp") do @pdf.fill_color = 'ff0000' end end end describe "#stamp_at" do it "should work" do create_pdf @pdf.create_stamp("MyStamp") @pdf.stamp_at("MyStamp", [100, 200]) # I had modified PDF::Inspector::XObject to receive the # invoke_xobject message and count the number of times it was # called, but it was only called once, so I reverted checking the # output with a regular expression expect(@pdf.render).to match(/\/Stamp1 Do.*?/m) end end describe "Document with a stamp" do it "should raise_error NameTaken error when attempt to create stamp " \ "with same name as an existing stamp" do create_pdf @pdf.create_stamp("MyStamp") expect { @pdf.create_stamp("MyStamp") }.to raise_error(Prawn::Errors::NameTaken) end it "should raise_error InvalidName error when attempt to create " \ "stamp with a blank name" do create_pdf expect { @pdf.create_stamp("") }.to raise_error(Prawn::Errors::InvalidName) end it "a new XObject should be defined for each stamp created" do create_pdf @pdf.create_stamp("MyStamp") @pdf.create_stamp("AnotherStamp") @pdf.stamp("MyStamp") @pdf.stamp("AnotherStamp") inspector = PDF::Inspector::XObject.analyze(@pdf.render) xobjects = inspector.page_xobjects.last expect(xobjects.length).to eq(2) end it "calling stamp with a name that does not match an existing stamp " \ "should raise_error UndefinedObjectName" do create_pdf @pdf.create_stamp("MyStamp") expect { @pdf.stamp("OtherStamp") }.to raise_error(Prawn::Errors::UndefinedObjectName) end it "stamp should be drawn into the document each time stamp is called" do create_pdf @pdf.create_stamp("MyStamp") @pdf.stamp("MyStamp") @pdf.stamp("MyStamp") @pdf.stamp("MyStamp") # I had modified PDF::Inspector::XObject to receive the # invoke_xobject message and count the number of times it was # called, but it was only called once, so I reverted checking the # output with a regular expression expect(@pdf.render).to match(/(\/Stamp1 Do.*?){3}/m) end it "stamp should render clickable links" do create_pdf @pdf.create_stamp 'bar' do @pdf.text 'Prawn GitHub', inline_format: true end @pdf.stamp 'bar' output = @pdf.render objects = output.split("endobj") objects.each do |obj| if obj =~ /\/Type \/Page$/ # The page object must contain the annotation reference # to render a clickable link expect(obj).to match(/^\/Annots \[\d \d .\]$/) end end end it "resources added during stamp creation should be added to the " \ "stamp XObject, not the page" do create_pdf @pdf.create_stamp("MyStamp") do @pdf.transparent(0.5) { @pdf.circle([100, 100], 10) } end @pdf.stamp("MyStamp") # Inspector::XObject does not give information about resources, so # resorting to string matching output = @pdf.render objects = output.split("endobj") objects.each do |object| if object =~ /\/Type \/Page$/ expect(object).not_to match(/\/ExtGState/) elsif object =~ /\/Type \/XObject$/ expect(object).to match(/\/ExtGState/) end end end it "stamp stream should be wrapped in a graphic state" do create_pdf @pdf.create_stamp("MyStamp") do @pdf.text "This should have a 'q' before it and a 'Q' after it" end @pdf.stamp("MyStamp") stamps = PDF::Inspector::XObject.analyze(@pdf.render) expect(stamps.xobject_streams[:Stamp1].data.chomp).to match(/q(.|\s)*Q\Z/) end it "should not add to the page graphic state stack " do create_pdf expect(@pdf.state.page.stack.stack.size).to eq(1) @pdf.create_stamp("MyStamp") do @pdf.save_graphics_state @pdf.save_graphics_state @pdf.save_graphics_state @pdf.text "This should have a 'q' before it and a 'Q' after it" @pdf.restore_graphics_state end expect(@pdf.state.page.stack.stack.size).to eq(1) end it "should be able to change fill and stroke colors within the stamp stream" do create_pdf @pdf.create_stamp("MyStamp") do @pdf.fill_color(100, 100, 20, 0) @pdf.stroke_color(100, 100, 20, 0) end @pdf.stamp("MyStamp") stamps = PDF::Inspector::XObject.analyze(@pdf.render) stamp_stream = stamps.xobject_streams[:Stamp1].data expect(stamp_stream).to include("/DeviceCMYK cs\n1.000 1.000 0.200 0.000 scn") expect(stamp_stream).to include("/DeviceCMYK CS\n1.000 1.000 0.200 0.000 SCN") end it "should save the color space even when same as current page color space" do create_pdf @pdf.stroke_color(100, 100, 20, 0) @pdf.create_stamp("MyStamp") do @pdf.stroke_color(100, 100, 20, 0) end @pdf.stamp("MyStamp") stamps = PDF::Inspector::XObject.analyze(@pdf.render) stamp_stream = stamps.xobject_streams[:Stamp1].data expect(stamp_stream).to include("/DeviceCMYK CS\n1.000 1.000 0.200 0.000 SCN") end end ruby-prawn-2.1.0.orig/spec/reference_spec.rb0000644000000000000000000000133512665203156017514 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "A Reference object" do describe "generated via Prawn::Document" do it "should return a proper reference on ref!" do pdf = Prawn::Document.new expect(pdf.ref!({}).is_a?(PDF::Core::Reference)).to eq(true) end it "should return an identifier on ref" do pdf = Prawn::Document.new r = pdf.ref({}) expect(r.is_a?(Integer)).to eq(true) end it "should have :Length of stream if it has one when compression disabled" do pdf = Prawn::Document.new :compress => false ref = pdf.ref!({}) ref << 'Hello' expect(ref.stream.data[:Length]).to eq(5) end end end ruby-prawn-2.1.0.orig/spec/text_rendering_mode_spec.rb0000644000000000000000000000306012665203156021600 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "#text_rendering_mode" do it "should draw the text rendering mode to the document" do create_pdf @pdf.text_rendering_mode(:stroke) do @pdf.text("hello world") end contents = PDF::Inspector::Text.analyze(@pdf.render) expect(contents.text_rendering_mode.first).to eq(1) end it "should not draw the text rendering mode to the document" \ " when the new mode matches the old" do create_pdf @pdf.text_rendering_mode(:fill) do @pdf.text("hello world") end contents = PDF::Inspector::Text.analyze(@pdf.render) expect(contents.text_rendering_mode).to be_empty end it "should restore character spacing to 0" do create_pdf @pdf.text_rendering_mode(:stroke) do @pdf.text("hello world") end contents = PDF::Inspector::Text.analyze(@pdf.render) expect(contents.text_rendering_mode).to eq([1, 0]) end it "should function as an accessor when no parameter given" do create_pdf @pdf.text_rendering_mode(:fill_stroke) do @pdf.text("hello world") expect(@pdf.text_rendering_mode).to eq(:fill_stroke) end expect(@pdf.text_rendering_mode).to eq(:fill) end it "should raise_error an exception when passed an invalid mode" do create_pdf expect { @pdf.text_rendering_mode(-1) }.to raise_error(ArgumentError) expect { @pdf.text_rendering_mode(8) }.to raise_error(ArgumentError) expect { @pdf.text_rendering_mode(:flil) }.to raise_error(ArgumentError) end end ruby-prawn-2.1.0.orig/spec/view_spec.rb0000644000000000000000000000202412665203156016524 0ustar rootroot# encoding: utf-8 require_relative "spec_helper" describe "Prawn::View" do let(:view_object) { Object.new.tap { |o| o.extend(Prawn::View) } } it "provides a Prawn::Document object by default" do expect(view_object.document).to be_kind_of(Prawn::Document) end it "delegates unhandled methods to object returned by document method" do doc = double("Document") allow(view_object).to receive(:document).and_return(doc) expect(doc).to receive(:some_delegated_method) view_object.some_delegated_method end it "allows a block-like DSL via the update method" do doc = double("Document") allow(view_object).to receive(:document).and_return(doc) expect(doc).to receive(:foo) expect(doc).to receive(:bar) view_object.update do foo bar end end it "aliases save_as() to document.render_file()" do doc = double("Document") expect(doc).to receive(:render_file) allow(view_object).to receive(:document).and_return(doc) view_object.save_as("foo.pdf") end end ruby-prawn-2.1.0.orig/spec/text_at_spec.rb0000644000000000000000000001105512665203156017226 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "#draw_text" do before(:each) { create_pdf } it "should raise_error ArgumentError if :at option omitted" do expect { @pdf.draw_text("hai", {}) }.to raise_error(ArgumentError) end it "should raise_error ArgumentError if :align option included" do expect { @pdf.draw_text("hai", :at => [0, 0], :align => :center) }.to raise_error(ArgumentError) end it "should allow drawing empty strings to the page" do @pdf.draw_text(" ", :at => [100, 100]) text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.strings.first).to eq(" ") end it "should default to 12 point helvetica" do @pdf.draw_text("Blah", :at => [100, 100]) text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.font_settings[0][:name]).to eq(:Helvetica) expect(text.font_settings[0][:size]).to eq(12) expect(text.strings.first).to eq("Blah") end it "should allow setting font size" do @pdf.draw_text("Blah", :at => [100, 100], :size => 16) text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.font_settings[0][:size]).to eq(16) end it "should allow setting a default font size" do @pdf.font_size = 16 @pdf.draw_text("Blah", :at => [0, 0]) text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.font_settings[0][:size]).to eq(16) end rotated_text_inspector = Class.new(PDF::Inspector) do attr_reader :tm_operator_used def initialize @tm_operator_used = false end def set_text_matrix_and_text_line_matrix(*a) @tm_operator_used = true end end it "should allow rotation" do @pdf.draw_text("Test", :at => [100, 100], :rotate => 90) text = rotated_text_inspector.analyze(@pdf.render) expect(text.tm_operator_used).to eq true end it "should not use rotation matrix by default" do @pdf.draw_text("Test", :at => [100, 100]) text = rotated_text_inspector.analyze(@pdf.render) expect(text.tm_operator_used).to eq false end it "should allow overriding default font for a single instance" do @pdf.font_size = 16 @pdf.draw_text("Blah", :size => 11, :at => [0, 0]) @pdf.draw_text("Blaz", :at => [0, 0]) text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.font_settings[0][:size]).to eq(11) expect(text.font_settings[1][:size]).to eq(16) end it "should allow setting a font size transaction with a block" do @pdf.font_size 16 do @pdf.draw_text('Blah', :at => [0, 0]) end @pdf.draw_text('blah', :at => [0, 0]) text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.font_settings[0][:size]).to eq(16) expect(text.font_settings[1][:size]).to eq(12) end it "should allow manual setting the font size when in a font size block" do @pdf.font_size(16) do @pdf.draw_text('Foo', :at => [0, 0]) @pdf.draw_text('Blah', :size => 11, :at => [0, 0]) @pdf.draw_text('Blaz', :at => [0, 0]) end text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.font_settings[0][:size]).to eq(16) expect(text.font_settings[1][:size]).to eq(11) expect(text.font_settings[2][:size]).to eq(16) end it "should allow registering of built-in font_settings on the fly" do @pdf.font "Times-Roman" @pdf.draw_text("Blah", :at => [100, 100]) @pdf.font "Courier" @pdf.draw_text("Blaz", :at => [150, 150]) text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.font_settings[0][:name]).to eq(:"Times-Roman") expect(text.font_settings[1][:name]).to eq(:Courier) end it "should raise_error an exception when an unknown font is used" do expect { @pdf.font "Pao bu" }.to raise_error(Prawn::Errors::UnknownFont) end it "should correctly render a utf-8 string when using a built-in font" do str = "©" # copyright symbol @pdf.draw_text(str, :at => [0, 0]) # grab the text from the rendered PDF and ensure it matches text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.strings.first).to eq(str) end it "should raise_error an exception when a utf-8 incompatible string is rendered" do str = "Blah \xDD" expect { @pdf.draw_text(str, :at => [0, 0]) }.to raise_error( Prawn::Errors::IncompatibleStringEncoding) end it "should not raise an exception when a shift-jis string is rendered" do datafile = "#{Prawn::DATADIR}/shift_jis_text.txt" sjis_str = File.open(datafile, "r:shift_jis") { |f| f.gets } @pdf.font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf") @pdf.draw_text(sjis_str, :at => [0, 0]) end end ruby-prawn-2.1.0.orig/spec/text_box_spec.rb0000644000000000000000000010750312665203156017416 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "Text::Box#nothing_printed?" do it "returns true when nothing printed" do create_pdf string = "Hello world, how are you?\nI'm fine, thank you." text_box = Prawn::Text::Box.new(string, :height => 2, :document => @pdf) text_box.render expect(text_box.nothing_printed?).to eq true end it "returns false when something printed" do create_pdf string = "Hello world, how are you?\nI'm fine, thank you." text_box = Prawn::Text::Box.new(string, :height => 14, :document => @pdf) text_box.render expect(text_box.nothing_printed?).to eq false end end describe "Text::Box#everything_printed?" do it "returns false when not everything printed" do create_pdf string = "Hello world, how are you?\nI'm fine, thank you." text_box = Prawn::Text::Box.new(string, :height => 14, :document => @pdf) text_box.render expect(text_box.everything_printed?).to eq false end it "returns true when everything printed" do create_pdf string = "Hello world, how are you?\nI'm fine, thank you." text_box = Prawn::Text::Box.new(string, :document => @pdf) text_box.render expect(text_box.everything_printed?).to eq true end end describe "Text::Box#line_gap" do it "should == the line gap of the font when using a single " \ "font and font size" do create_pdf string = "Hello world, how are you?\nI'm fine, thank you." text_box = Prawn::Text::Box.new(string, :document => @pdf) text_box.render expect(text_box.line_gap).to be_within(0.0001).of(@pdf.font.line_gap) end end describe "Text::Box" do it "should be able to set text direction document-wide" do create_pdf @pdf.text_direction(:rtl) @pdf.text_direction = :rtl string = "Hello world, how are you?\nI'm fine, thank you." text_box = Prawn::Text::Box.new(string, :document => @pdf) text_box.render text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.strings[0]).to eq("?uoy era woh ,dlrow olleH") expect(text.strings[1]).to eq(".uoy knaht ,enif m'I") end it "should be able to reverse multi-byte text" do create_pdf @pdf.text_direction(:rtl) @pdf.text_direction = :rtl @pdf.text_direction = :rtl @pdf.font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf", :size => 16) do @pdf.text "写个小" end text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.strings[0]).to eq("小个写") end it "option should be able to override document-wide text direction" do create_pdf @pdf.text_direction = :rtl string = "Hello world, how are you?\nI'm fine, thank you." text_box = Prawn::Text::Box.new(string, :document => @pdf, :direction => :ltr) text_box.render text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.strings[0]).to eq("Hello world, how are you?") expect(text.strings[1]).to eq("I'm fine, thank you.") end end describe "Text::Box" do it "should be able to set leading document-wide" do create_pdf @pdf.default_leading(7) @pdf.default_leading = 7 text_box = Prawn::Text::Box.new("hello world", :document => @pdf) expect(text_box.leading).to eq(7) end it "option should be able to override document-wide leading" do create_pdf @pdf.default_leading = 7 text_box = Prawn::Text::Box.new("hello world", :document => @pdf, :leading => 20) expect(text_box.leading).to eq(20) end it "should default to document-wide leading if no" \ "leading option is provided" do end end describe "Text::Box#render with :align => :justify" do it "should draw the word spacing to the document" do create_pdf string = "hello world " * 20 options = { :document => @pdf, :align => :justify } text_box = Prawn::Text::Box.new(string, options) text_box.render contents = PDF::Inspector::Text.analyze(@pdf.render) expect(contents.word_spacing[0]).to be > 0 end it "should not justify the last line of a paragraph" do create_pdf string = "hello world " options = { :document => @pdf, :align => :justify } text_box = Prawn::Text::Box.new(string, options) text_box.render contents = PDF::Inspector::Text.analyze(@pdf.render) expect(contents.word_spacing).to be_empty end end describe "Text::Box" do it "should only require enough space for the descender and the ascender " \ "when determining whether a line can fit" do create_pdf text = "Oh hai text rect" options = { :document => @pdf, :height => @pdf.font.ascender + @pdf.font.descender } text_box = Prawn::Text::Box.new(text, options) text_box.render expect(text_box.text).to eq("Oh hai text rect") text = "Oh hai text rect\nOh hai text rect" options = { :document => @pdf, :height => @pdf.font.height + @pdf.font.ascender + @pdf.font.descender } text_box = Prawn::Text::Box.new(text, options) text_box.render expect(text_box.text).to eq("Oh hai text rect\nOh hai text rect") end end describe "Text::Box#height without leading" do it "should == the sum of the height of each line, " \ "not including the space below the last line" do create_pdf text = "Oh hai text rect.\nOh hai text rect." options = { :document => @pdf } text_box = Prawn::Text::Box.new(text, options) text_box.render expect(text_box.height).to be_within(0.001).of(@pdf.font.height * 2 - @pdf.font.line_gap) end end describe "Text::Box#height with leading" do it "should == the sum of the height of each line plus leading, " \ "but not including the space below the last line" do create_pdf text = "Oh hai text rect.\nOh hai text rect." leading = 12 options = { :document => @pdf, :leading => leading } text_box = Prawn::Text::Box.new(text, options) text_box.render expect(text_box.height).to be_within(0.001).of((@pdf.font.height + leading) * 2 - @pdf.font.line_gap - leading) end end describe "Text::Box with :draw_text_callback" do before(:each) { create_pdf } it "hits the callback whenever text is drawn" do draw_block = spy("Draw block") @pdf.text_box "this text is long enough to span two lines", :width => 150, :draw_text_callback => lambda { |text, _| draw_block.kick(text) } expect(draw_block).to have_received(:kick).with("this text is long enough to") expect(draw_block).to have_received(:kick).with("span two lines") end it "hits the callback once per fragment for :inline_format" do draw_block = spy("Draw block") @pdf.text_box "this text has fancy formatting", :inline_format => true, :width => 500, :draw_text_callback => lambda { |text, _| draw_block.kick(text) } expect(draw_block).to have_received(:kick).with("this text has ") expect(draw_block).to have_received(:kick).with("fancy") expect(draw_block).to have_received(:kick).with(" formatting") end it "does not call #draw_text!" do expect(@pdf).to_not receive(:draw_text!) @pdf.text_box "some text", :width => 500, :draw_text_callback => lambda { |_, _| } end end describe "Text::Box#valid_options" do it "should return an array" do create_pdf text_box = Prawn::Text::Box.new("", :document => @pdf) expect(text_box.valid_options).to be_a_kind_of(Array) end end describe "Text::Box#render" do it "should not fail if height is smaller than 1 line" do create_pdf @text = "Oh hai text rect. " * 10 @options = { :height => @pdf.font.height * 0.5, :document => @pdf } text_box = Prawn::Text::Box.new(@text, @options) text_box.render expect(text_box.text).to eq("") end it "should draw content to the page" do create_pdf @text = "Oh hai text rect. " * 10 @options = { :document => @pdf } text_box = Prawn::Text::Box.new(@text, @options) text_box.render text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.strings).not_to be_empty end it "should not draw a transformation matrix" do create_pdf @text = "Oh hai text rect. " * 10 @options = { :document => @pdf } text_box = Prawn::Text::Box.new(@text, @options) text_box.render matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render) expect(matrices.matrices.length).to eq(0) end end describe "Text::Box#render(:single_line => true)" do it "should draw only one line to the page" do create_pdf @text = "Oh hai text rect. " * 10 @options = { :document => @pdf, :single_line => true } text_box = Prawn::Text::Box.new(@text, @options) text_box.render text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.strings.length).to eq(1) end end describe "Text::Box#render(:dry_run => true)" do it "should not draw any content to the page" do create_pdf @text = "Oh hai text rect. " * 10 @options = { :document => @pdf } text_box = Prawn::Text::Box.new(@text, @options) text_box.render(:dry_run => true) text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.strings).to be_empty end it "subsequent calls to render should_not raise_error an ArgumentError exception" do create_pdf @text = "™©" @options = { :document => @pdf } text_box = Prawn::Text::Box.new(@text, @options) text_box.render(:dry_run => true) text_box.render end end describe "Text::Box#render(:valign => :bottom)" do it "#at should be the same from one dry run to the next" do create_pdf text = "this is center text " * 12 options = { :width => 162, :valign => :bottom, :document => @pdf } text_box = Prawn::Text::Box.new(text, options) text_box.render(:dry_run => true) original_at = text_box.at.dup text_box.render(:dry_run => true) expect(text_box.at).to eq(original_at) end end describe "Text::Box#render(:valign => :center)" do it "#at should be the same from one dry run to the next" do create_pdf text = "this is center text " * 12 options = { :width => 162, :valign => :center, :document => @pdf } text_box = Prawn::Text::Box.new(text, options) text_box.render(:dry_run => true) original_at = text_box.at.dup text_box.render(:dry_run => true) expect(text_box.at).to eq(original_at) end end describe "Text::Box#render with :rotate option of 30)" do before(:each) do create_pdf rotate = 30 @x = 300 @y = 70 @width = 100 @height = 50 @cos = Math.cos(rotate * Math::PI / 180) @sin = Math.sin(rotate * Math::PI / 180) @text = "Oh hai text rect. " * 10 @options = { :document => @pdf, :rotate => rotate, :at => [@x, @y], :width => @width, :height => @height } end context ":rotate_around option of :center" do it "should draw content to the page rotated about the center of the text" do @options[:rotate_around] = :center text_box = Prawn::Text::Box.new(@text, @options) text_box.render matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render) x = @x + @width / 2 y = @y - @height / 2 x_prime = x * @cos - y * @sin y_prime = x * @sin + y * @cos expect(matrices.matrices[0]).to eq([1, 0, 0, 1, reduce_precision(x - x_prime), reduce_precision(y - y_prime)]) expect(matrices.matrices[1]).to eq([reduce_precision(@cos), reduce_precision(@sin), reduce_precision(-@sin), reduce_precision(@cos), 0, 0]) text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.strings).not_to be_empty end end context ":rotate_around option of :upper_left" do it "should draw content to the page rotated about the upper left corner of the text" do @options[:rotate_around] = :upper_left text_box = Prawn::Text::Box.new(@text, @options) text_box.render matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render) x = @x y = @y x_prime = x * @cos - y * @sin y_prime = x * @sin + y * @cos expect(matrices.matrices[0]).to eq([1, 0, 0, 1, reduce_precision(x - x_prime), reduce_precision(y - y_prime)]) expect(matrices.matrices[1]).to eq([reduce_precision(@cos), reduce_precision(@sin), reduce_precision(-@sin), reduce_precision(@cos), 0, 0]) text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.strings).not_to be_empty end end context "default :rotate_around" do it "should draw content to the page rotated about the upper left corner of the text" do text_box = Prawn::Text::Box.new(@text, @options) text_box.render matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render) x = @x y = @y x_prime = x * @cos - y * @sin y_prime = x * @sin + y * @cos expect(matrices.matrices[0]).to eq([1, 0, 0, 1, reduce_precision(x - x_prime), reduce_precision(y - y_prime)]) expect(matrices.matrices[1]).to eq([reduce_precision(@cos), reduce_precision(@sin), reduce_precision(-@sin), reduce_precision(@cos), 0, 0]) text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.strings).not_to be_empty end end context ":rotate_around option of :upper_right" do it "should draw content to the page rotated about the upper right corner of the text" do @options[:rotate_around] = :upper_right text_box = Prawn::Text::Box.new(@text, @options) text_box.render matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render) x = @x + @width y = @y x_prime = x * @cos - y * @sin y_prime = x * @sin + y * @cos expect(matrices.matrices[0]).to eq([1, 0, 0, 1, reduce_precision(x - x_prime), reduce_precision(y - y_prime)]) expect(matrices.matrices[1]).to eq([reduce_precision(@cos), reduce_precision(@sin), reduce_precision(-@sin), reduce_precision(@cos), 0, 0]) text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.strings).not_to be_empty end end context ":rotate_around option of :lower_right" do it "should draw content to the page rotated about the lower right corner of the text" do @options[:rotate_around] = :lower_right text_box = Prawn::Text::Box.new(@text, @options) text_box.render matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render) x = @x + @width y = @y - @height x_prime = x * @cos - y * @sin y_prime = x * @sin + y * @cos expect(matrices.matrices[0]).to eq([1, 0, 0, 1, reduce_precision(x - x_prime), reduce_precision(y - y_prime)]) expect(matrices.matrices[1]).to eq([reduce_precision(@cos), reduce_precision(@sin), reduce_precision(-@sin), reduce_precision(@cos), 0, 0]) text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.strings).not_to be_empty end end context ":rotate_around option of :lower_left" do it "should draw content to the page rotated about the lower left corner of the text" do @options[:rotate_around] = :lower_left text_box = Prawn::Text::Box.new(@text, @options) text_box.render matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render) x = @x y = @y - @height x_prime = x * @cos - y * @sin y_prime = x * @sin + y * @cos expect(matrices.matrices[0]).to eq([1, 0, 0, 1, reduce_precision(x - x_prime), reduce_precision(y - y_prime)]) expect(matrices.matrices[1]).to eq([reduce_precision(@cos), reduce_precision(@sin), reduce_precision(-@sin), reduce_precision(@cos), 0, 0]) text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.strings).not_to be_empty end end end describe "Text::Box default height" do before(:each) { create_pdf } it "should be the height from the bottom bound to document.y" do target_height = @pdf.y - @pdf.bounds.bottom @text = "Oh hai\n" * 60 text_box = Prawn::Text::Box.new(@text, :document => @pdf) text_box.render expect(text_box.height).to be_within(@pdf.font.height).of(target_height) end it "should use the margin-box bottom if only in a stretchy bbox" do @pdf.bounding_box([0, @pdf.cursor], :width => @pdf.bounds.width) do target_height = @pdf.y - @pdf.bounds.bottom @text = "Oh hai\n" * 60 text_box = Prawn::Text::Box.new(@text, :document => @pdf) text_box.render expect(text_box.height).to be_within(@pdf.font.height).of(target_height) end end it "should use the parent-box bottom if in a stretchy bbox and " \ "overflow is :expand, even with an explicit height"do @pdf.bounding_box([0, @pdf.cursor], :width => @pdf.bounds.width) do target_height = @pdf.y - @pdf.bounds.bottom @text = "Oh hai\n" * 60 text_box = Prawn::Text::Box.new(@text, :document => @pdf, :height => 100, :overflow => :expand) text_box.render expect(text_box.height).to be_within(@pdf.font.height).of(target_height) end end it "should use the innermost non-stretchy bbox, not the margin box" do @pdf.bounding_box([0, @pdf.cursor], :width => @pdf.bounds.width, :height => 200) do @pdf.bounding_box([0, @pdf.cursor], :width => @pdf.bounds.width) do @text = "Oh hai\n" * 60 text_box = Prawn::Text::Box.new(@text, :document => @pdf) text_box.render expect(text_box.height).to be_within(@pdf.font.height).of(200) end end end end describe "Text::Box default at" do it "should be the left corner of the bounds, and the current document.y" do create_pdf target_at = [@pdf.bounds.left, @pdf.y] @text = "Oh hai text rect. " * 100 @options = { :document => @pdf } text_box = Prawn::Text::Box.new(@text, @options) text_box.render expect(text_box.at).to eq(target_at) end end describe "Text::Box with text than can fit in the box" do before(:each) do create_pdf @text = "Oh hai text rect. " * 10 @options = { :width => 162.0, :height => 162.0, :document => @pdf } end it "printed text should match requested text, except that preceding and " \ "trailing white space will be stripped from each line, and newlines may " \ "be inserted" do text_box = Prawn::Text::Box.new(" " + @text, @options) text_box.render expect(text_box.text.gsub("\n", " ")).to eq(@text.strip) end it "render should return an empty string because no text remains unprinted" do text_box = Prawn::Text::Box.new(@text, @options) expect(text_box.render).to eq("") end it "should be truncated when the leading is set high enough to prevent all the lines from being printed" do @options[:leading] = 40 text_box = Prawn::Text::Box.new(@text, @options) text_box.render expect(text_box.text.gsub("\n", " ")).not_to eq(@text.strip) end end describe "Text::Box with text that fits exactly in the box" do before(:each) do create_pdf @lines = 3 @interlines = @lines - 1 @text = (1..@lines).to_a.join("\n") @options = { :width => 162.0, :height => @pdf.font.ascender + @pdf.font.height * @interlines + @pdf.font.descender, :document => @pdf } end it "should have the expected height" do expected_height = @options.delete(:height) text_box = Prawn::Text::Box.new(@text, @options) text_box.render expect(text_box.height).to be_within(0.0001).of(expected_height) end it "should print everything" do text_box = Prawn::Text::Box.new(@text, @options) text_box.render expect(text_box.text).to eq(@text) end describe "with leading" do before(:each) do @options[:leading] = 15 end it "should not overflow when enough height is added" do @options[:height] += @options[:leading] * @interlines text_box = Prawn::Text::Box.new(@text, @options) text_box.render expect(text_box.text).to eq(@text) end it "should overflow when insufficient height is added" do @options[:height] += @options[:leading] * @interlines - 1 text_box = Prawn::Text::Box.new(@text, @options) text_box.render expect(text_box.text).not_to eq(@text) end end describe "with negative leading" do before(:each) do @options[:leading] = -4 end it "should not overflow when enough height is removed" do @options[:height] += @options[:leading] * @interlines text_box = Prawn::Text::Box.new(@text, @options) text_box.render expect(text_box.text).to eq(@text) end it "should overflow when too much height is removed" do @options[:height] += @options[:leading] * @interlines - 1 text_box = Prawn::Text::Box.new(@text, @options) text_box.render expect(text_box.text).not_to eq(@text) end end end describe "Text::Box printing UTF-8 string with higher bit characters" do before(:each) do create_pdf @text = "©" # not enough height to print any text, so we can directly compare against # the input string bounding_height = 1.0 options = { :height => bounding_height, :document => @pdf } file = "#{Prawn::DATADIR}/fonts/Panic+Sans.dfont" @pdf.font_families["Panic Sans"] = { :normal => { :file => file, :font => "PanicSans" }, :italic => { :file => file, :font => "PanicSans-Italic" }, :bold => { :file => file, :font => "PanicSans-Bold" }, :bold_italic => { :file => file, :font => "PanicSans-BoldItalic" } } @text_box = Prawn::Text::Box.new(@text, options) end describe "when using a TTF font" do it "unprinted text should be in UTF-8 encoding" do @pdf.font("Panic Sans") remaining_text = @text_box.render expect(remaining_text).to eq(@text) end end describe "when using an AFM font" do it "unprinted text should be in UTF-8 encoding" do remaining_text = @text_box.render expect(remaining_text).to eq(@text) end end end describe "Text::Box with more text than can fit in the box" do before(:each) do create_pdf @text = "Oh hai text rect. " * 30 @bounding_height = 162.0 @options = { :width => 162.0, :height => @bounding_height, :document => @pdf } end context "truncated overflow" do before(:each) do @options[:overflow] = :truncate @text_box = Prawn::Text::Box.new(@text, @options) end it "should be truncated" do @text_box.render expect(@text_box.text.gsub("\n", " ")).not_to eq(@text.strip) end it "render should not return an empty string because some text remains unprinted" do expect(@text_box.render).not_to be_empty end it "#height should be no taller than the specified height" do @text_box.render expect(@text_box.height).to be <= @bounding_height end it "#height should be within one font height of the specified height" do @text_box.render expect(@bounding_height).to be_within(@pdf.font.height).of(@text_box.height) end context "with :rotate option" do it "unrendered text should be the same as when not rotated" do remaining_text = @text_box.render rotate = 30 x = 300 y = 70 width = @options[:width] height = @options[:height] @options[:document] = @pdf @options[:rotate] = rotate @options[:at] = [x, y] rotated_text_box = Prawn::Text::Box.new(@text, @options) expect(rotated_text_box.render).to eq(remaining_text) end end end context "truncated with text and size taken from the manual" do it "should return the right text" do @text = "This is the beginning of the text. It will be cut somewhere and " \ "the rest of the text will procede to be rendered this time by " \ "calling another method." + " . " * 50 @options[:width] = 300 @options[:height] = 50 @options[:size] = 18 @text_box = Prawn::Text::Box.new(@text, @options) remaining_text = @text_box.render expect(remaining_text).to eq("text will procede to be rendered this time by calling another method. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ") end end context "expand overflow" do before(:each) do @options[:overflow] = :expand @text_box = Prawn::Text::Box.new(@text, @options) end it "height should expand to encompass all the text (but not exceed the height of the page)" do @text_box.render expect(@text_box.height).to be > @bounding_height end it "should display the entire string (as long as there was space remaining on the page to print all the text)" do @text_box.render expect(@text_box.text.gsub("\n", " ")).to eq(@text.strip) end it "render should return an empty string because no text remains unprinted(as long as there was space remaining on the page to print all the text)" do expect(@text_box.render).to eq("") end end context "shrink_to_fit overflow" do before(:each) do @options[:overflow] = :shrink_to_fit @options[:min_font_size] = 2 @text_box = Prawn::Text::Box.new(@text, @options) end it "should display the entire text" do @text_box.render expect(@text_box.text.gsub("\n", " ")).to eq(@text.strip) end it "render should return an empty string because no text remains unprinted" do expect(@text_box.render).to eq("") end end context "shrink_to_fit overflow" do it "should not drop below the minimum font size" do @options[:overflow] = :shrink_to_fit @options[:min_font_size] = 10.1 @text_box = Prawn::Text::Box.new(@text, @options) @text_box.render text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.font_settings[0][:size]).to eq(10.1) end end end describe "Text::Box with enough space to fit the text but using the " \ "shrink_to_fit overflow" do it "should not shrink the text when there is no need to" do create_pdf @bounding_height = 162.0 @options = { :width => 162.0, :height => @bounding_height, :overflow => :shrink_to_fit, :min_font_size => 5, :document => @pdf } @text_box = Prawn::Text::Box.new("hello\nworld", @options) @text_box.render text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.font_settings[0][:size]).to eq(12) end end describe "Text::Box with a solid block of Chinese characters" do it "printed text should match requested text, except for newlines" do create_pdf @text = "写中国字" * 10 @options = { :width => 162.0, :height => 162.0, :document => @pdf } @pdf.font "#{Prawn::DATADIR}/fonts/gkai00mp.ttf" @options[:overflow] = :truncate text_box = Prawn::Text::Box.new(@text, @options) text_box.render expect(text_box.text.gsub("\n", "")).to eq(@text) end end describe "drawing bounding boxes" do before(:each) { create_pdf } it "should restore the margin box when bounding box exits" do margin_box = @pdf.bounds @pdf.text_box "Oh hai text box. " * 11, :height => @pdf.font.height * 10 expect(@pdf.bounds).to eq(margin_box) end end describe "Text::Box#render with :character_spacing option" do it "should draw the character spacing to the document" do create_pdf string = "hello world" options = { :document => @pdf, :character_spacing => 10 } text_box = Prawn::Text::Box.new(string, options) text_box.render contents = PDF::Inspector::Text.analyze(@pdf.render) expect(contents.character_spacing[0]).to eq(10) end it "should take character spacing into account when wrapping" do create_pdf @pdf.font "Courier" text_box = Prawn::Text::Box.new("hello world", :width => 100, :overflow => :expand, :character_spacing => 10, :document => @pdf) text_box.render expect(text_box.text).to eq("hello\nworld") end end describe "Text::Box wrapping" do before(:each) do create_pdf end it "should wrap text" do text = "Please wrap this text about HERE. More text that should be wrapped" expect = "Please wrap this text about\nHERE. More text that should be\nwrapped" @pdf.font "Courier" text_box = Prawn::Text::Box.new(text, :width => 220, :overflow => :expand, :document => @pdf) text_box.render expect(text_box.text).to eq(expect) end # white space was being stripped after the entire line was generated, meaning # that leading white space characters reduced the amount of space on the line # for other characters, so wrapping "hello hello" resulted in # "hello\n\nhello", rather than "hello\nhello" # it "white space at beginning of line should not be taken into account when" \ " computing line width" do text = "hello hello" expect = "hello\nhello" @pdf.font "Courier" text_box = Prawn::Text::Box.new(text, :width => 40, :overflow => :expand, :document => @pdf) text_box.render expect(text_box.text).to eq(expect) end it "should respect end of line when wrapping text" do text = "Please wrap only before\nTHIS word. Don't wrap this" expect = text @pdf.font "Courier" text_box = Prawn::Text::Box.new(text, :width => 220, :overflow => :expand, :document => @pdf) text_box.render expect(text_box.text).to eq(expect) end it "should respect multiple newlines when wrapping text" do text = "Please wrap only before THIS\n\nword. Don't wrap this" expect = "Please wrap only before\nTHIS\n\nword. Don't wrap this" @pdf.font "Courier" text_box = Prawn::Text::Box.new(text, :width => 200, :overflow => :expand, :document => @pdf) text_box.render expect(text_box.text).to eq(expect) end it "should respect multiple newlines when wrapping text when those newlines coincide with a line break" do text = "Please wrap only before\n\nTHIS word. Don't wrap this" expect = text @pdf.font "Courier" text_box = Prawn::Text::Box.new(text, :width => 220, :overflow => :expand, :document => @pdf) text_box.render expect(text_box.text).to eq(expect) end it "should respect initial newlines" do text = "\nThis should be on line 2" expect = text @pdf.font "Courier" text_box = Prawn::Text::Box.new(text, :width => 220, :overflow => :expand, :document => @pdf) text_box.render expect(text_box.text).to eq(expect) end it "should wrap lines comprised of a single word of the bounds when wrapping text" do text = "You_can_wrap_this_text_HERE" expect = "You_can_wrap_this_text_HE\nRE" @pdf.font "Courier" text_box = Prawn::Text::Box.new(text, :width => 180, :overflow => :expand, :document => @pdf) text_box.render expect(text_box.text).to eq(expect) end it "should wrap lines comprised of a single word of the bounds when wrapping text" do text = "©" * 30 @pdf.font "Courier" text_box = Prawn::Text::Box.new(text, :width => 180, :overflow => :expand, :document => @pdf) text_box.render expected = "©" * 25 + "\n" + "©" * 5 @pdf.font.normalize_encoding!(expected) expected = expected.force_encoding(Encoding::UTF_8) expect(text_box.text).to eq(expected) end it "should wrap non-unicode strings using single-byte word-wrapping" do text = "continúa esforzandote " * 5 text_box = Prawn::Text::Box.new(text, :width => 180, :document => @pdf) text_box.render results_with_accent = text_box.text text = "continua esforzandote " * 5 text_box = Prawn::Text::Box.new(text, :width => 180, :document => @pdf) text_box.render results_without_accent = text_box.text expect(first_line(results_with_accent).length).to eq(first_line(results_without_accent).length) end it "should allow you to disable wrapping by char" do text = "You_cannot_wrap_this_text_at_all_because_we_are_disabling_wrapping_by_char_and_there_are_no_word_breaks" @pdf.font "Courier" text_box = Prawn::Text::Box.new(text, :width => 180, :overflow => :shrink_to_fit, :disable_wrap_by_char => true, :document => @pdf) expect { text_box.render }.to raise_error(Prawn::Errors::CannotFit) end it "should retain full words with :shrink_to_fit if char wrapping is disabled" do text = "Wrapped_words" expect = "Wrapped_words" @pdf.font "Courier" text_box = Prawn::Text::Box.new(text, :width => 50, :height => 50, :size => 50, :overflow => :shrink_to_fit, :disable_wrap_by_char => true, :document => @pdf) text_box.render expect(text_box.text).to eq(expect) end end describe "Text::Box#render with :mode option" do it "should alter the text rendering mode of the document" do create_pdf string = "hello world" options = { :document => @pdf, :mode => :fill_stroke } text_box = Prawn::Text::Box.new(string, options) text_box.render contents = PDF::Inspector::Text.analyze(@pdf.render) expect(contents.text_rendering_mode).to eq([2, 0]) end end def reduce_precision(float) ("%.5f" % float).to_f end def first_line(str) str.each_line { |line| return line } end ruby-prawn-2.1.0.orig/spec/grid_spec.rb0000644000000000000000000000654012665203156016506 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "A document's grid" do before do @pdf = Prawn::Document.new end it "should allow definition of a grid" do @pdf.define_grid(:columns => 5, :rows => 8, :gutter => 0.1) expect(@pdf.grid.columns).to eq(5) expect(@pdf.grid.rows).to eq(8) expect(@pdf.grid.gutter).to eq(0.1) end it "should allow re-definition of a grid" do @pdf.define_grid(:columns => 5, :rows => 8, :gutter => 0.1) expect(@pdf.grid.columns).to eq(5) expect(@pdf.grid.rows).to eq(8) expect(@pdf.grid.gutter).to eq(0.1) @pdf.define_grid(:columns => 3, :rows => 6, :gutter => 0.1) expect(@pdf.grid.columns).to eq(3) expect(@pdf.grid.rows).to eq(6) expect(@pdf.grid.gutter).to eq(0.1) end describe "when a grid is defined" do before do @num_columns = 5 @num_rows = 8 @gutter = 10.0 @pdf.define_grid( :columns => @num_columns, :rows => @num_rows, :gutter => @gutter ) end it "should compute the column width" do expect(@pdf.grid.column_width * @num_columns.to_f + @gutter * (@num_columns - 1).to_f).to eq(@pdf.bounds.width) end it "should compute the row height" do expect(@pdf.grid.row_height * @num_rows.to_f + @gutter * (@num_rows - 1).to_f).to eq(@pdf.bounds.height) end it "should give the edges of a grid box" do grid_width = (@pdf.bounds.width.to_f - (@gutter * (@num_columns - 1).to_f)) / @num_columns.to_f grid_height = (@pdf.bounds.height.to_f - (@gutter * (@num_rows - 1).to_f)) / @num_rows.to_f exp_tl_x = (grid_width + @gutter.to_f) * 4.0 exp_tl_y = @pdf.bounds.height.to_f - (grid_height + @gutter.to_f) expect(@pdf.grid(1, 4).top_left).to eq([exp_tl_x, exp_tl_y]) expect(@pdf.grid(1, 4).top_right).to eq([exp_tl_x + grid_width, exp_tl_y]) expect(@pdf.grid(1, 4).bottom_left).to eq([exp_tl_x, exp_tl_y - grid_height]) expect(@pdf.grid(1, 4).bottom_right).to eq([exp_tl_x + grid_width, exp_tl_y - grid_height]) end it "should give the edges of a multiple grid boxes" do # Hand verified. Cheating a bit. Don't tell. expect(@pdf.grid([1, 3], [2, 5]).top_left).to eq([330.0, 628.75]) expect(@pdf.grid([1, 3], [2, 5]).top_right).to eq([650.0, 628.75]) expect(@pdf.grid([1, 3], [2, 5]).bottom_left).to eq([330.0, 456.25]) expect(@pdf.grid([1, 3], [2, 5]).bottom_right).to eq([650.0, 456.25]) end it "should draw outlines without changing global default colors to grid color" do @pdf.grid.show_all('cccccc') colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render) expect(colors.fill_color).not_to eq([0.8, 0.8, 0.8]) expect(colors.stroke_color).not_to eq([0.8, 0.8, 0.8]) # Hardcoded default color as I haven't been able to come up with a stable converter # between fill_color without lots code. expect(colors.stroke_color).to eq([0.0, 0.0, 0.0]) end it "should draw outlines without curent color settings" do @pdf.fill_color "ccff00" @pdf.stroke_color "ffcc00" @pdf.grid.show_all colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render) expect(colors.fill_color).to eq([0.8, 1.0, 0.0]) expect(colors.stroke_color).to eq([1.0, 0.8, 0.0]) end end end ruby-prawn-2.1.0.orig/spec/span_spec.rb0000644000000000000000000000211712665203156016516 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "drawing span" do before do Prawn.debug = false create_pdf end after do Prawn.debug = true end it "should only accept :position as option in debug mode" do Prawn.debug = true expect { @pdf.span(350, :x => 3) {} }.to raise_error(Prawn::Errors::UnknownOption) end it "should have raise an error if :position is invalid" do expect { @pdf.span(350, :position => :x) {} }.to raise_error(ArgumentError) end it "should restore the margin box when bounding box exits" do margin_box = @pdf.bounds @pdf.span(350, :position => :center) do @pdf.text "Here's some centered text in a 350 point column. " * 100 end expect(@pdf.bounds).to eq(margin_box) end it "should do create a margin box" do y = @pdf.y margin_box = @pdf.span(350, :position => :center) do @pdf.text "Here's some centered text in a 350 point column. " * 100 end expect(margin_box.top).to eq(792.0) expect(margin_box.bottom).to eq(0) end end ruby-prawn-2.1.0.orig/spec/measurement_units_spec.rb0000644000000000000000000000124512665203156021325 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") require "prawn/measurement_extensions" describe "Measurement units" do it "should convert units to PostScriptPoints" do expect(1.mm).to be_within(0.000000001).of(2.834645669) expect(1.mm).to eq(72 / 25.4) expect(2.mm).to eq(2 * 72 / 25.4) expect(3.mm).to eq(3 * 72 / 25.4) expect(-3.mm).to eq(-3 * 72 / 25.4) expect(1.cm).to eq(10 * 72 / 25.4) expect(1.dm).to eq(100 * 72 / 25.4) expect(1.m).to eq(1000 * 72 / 25.4) expect(1.in).to eq(72) expect(1.ft).to eq(72 * 12) expect(1.yd).to eq(72 * 12 * 3) expect(1.pt).to eq(1) end end ruby-prawn-2.1.0.orig/spec/outline_spec.rb0000644000000000000000000003260412665203156017240 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "Outline" do before(:each) do @pdf = Prawn::Document.new do text "Page 1. This is the first Chapter. " start_new_page text "Page 2. More in the first Chapter. " start_new_page outline.define do section 'Chapter 1', :destination => 1, :closed => true do page :destination => 1, :title => 'Page 1' page :destination => 2, :title => 'Page 2' end end end end describe "outline encoding" do it "should store all outline titles as UTF-16" do render_and_find_objects @hash.values.each do |obj| if obj.is_a?(Hash) && obj[:Title] title = obj[:Title].dup title.force_encoding(Encoding::UTF_16LE) expect(title.valid_encoding?).to eq(true) end end end end describe "#generate_outline" do before(:each) do render_and_find_objects end it "should create a root outline dictionary item" do expect(@outline_root).not_to be_nil end it "should set the first and last top items of the root outline dictionary item" do expect(referenced_object(@outline_root[:First])).to eq(@section_1) expect(referenced_object(@outline_root[:Last])).to eq(@section_1) end describe "#create_outline_item" do it "should create outline items for each section and page" do [@section_1, @page_1, @page_2].each { |item| expect(item).not_to be_nil } end end describe "#set_relations, #set_variables_for_block, and #reset_parent" do it "should link sibling items" do expect(referenced_object(@page_1[:Next])).to eq(@page_2) expect(referenced_object(@page_2[:Prev])).to eq(@page_1) end it "should link child items to parent item" do [@page_1, @page_2].each { |page| expect(referenced_object(page[:Parent])).to eq(@section_1) } end it "should set the first and last child items for parent item" do expect(referenced_object(@section_1[:First])).to eq(@page_1) expect(referenced_object(@section_1[:Last])).to eq(@page_2) end end describe "#increase_count" do it "should add the count of all descendant items" do expect(@outline_root[:Count]).to eq(3) expect(@section_1[:Count].abs).to eq(2) expect(@page_1[:Count]).to eq(0) expect(@page_2[:Count]).to eq(0) end end describe "closed option" do it "should set the item's integer count to negative" do expect(@section_1[:Count]).to eq(-2) end end end describe "adding a custom destination" do before(:each) do @pdf.start_new_page @pdf.text "Page 3 with a destination" @pdf.add_dest('customdest', @pdf.dest_xyz(200, 200)) pdf = @pdf @pdf.outline.update do page :destination => pdf.dest_xyz(200, 200), :title => 'Custom Destination' end render_and_find_objects end it "should create an outline item" do expect(@custom_dest).not_to be_nil end it "should reference the custom destination" do expect(referenced_object(@custom_dest[:Dest].first)).to eq(referenced_object(@pages.last)) end end describe "addding a section later with outline#section" do before(:each) do @pdf.start_new_page @pdf.text "Page 3. An added section " @pdf.outline.update do section 'Added Section', :destination => 3 do page :destination => 3, :title => 'Page 3' end end render_and_find_objects end it "should add new outline items to document" do [@section_2, @page_3].each { |item| expect(item).not_to be_nil } end it "should reset the last items for root outline dictionary" do expect(referenced_object(@outline_root[:First])).to eq(@section_1) expect(referenced_object(@outline_root[:Last])).to eq(@section_2) end it "should reset the next relation for the previous last top level item" do expect(referenced_object(@section_1[:Next])).to eq(@section_2) end it "should set the previous relation of the addded to section" do expect(referenced_object(@section_2[:Prev])).to eq(@section_1) end it "should increase the count of root outline dictionary" do expect(@outline_root[:Count]).to eq(5) end end describe "#outline.add_subsection_to" do context "positioned last" do before(:each) do @pdf.start_new_page @pdf.text "Page 3. An added subsection " @pdf.outline.update do add_subsection_to 'Chapter 1' do section 'Added SubSection', :destination => 3 do page :destination => 3, :title => 'Added Page 3' end end end render_and_find_objects end it "should add new outline items to document" do [@subsection, @added_page_3].each { |item| expect(item).not_to be_nil } end it "should reset the last item for parent item dictionary" do expect(referenced_object(@section_1[:First])).to eq(@page_1) expect(referenced_object(@section_1[:Last])).to eq(@subsection) end it "should set the prev relation for the new subsection to its parent's old last item" do expect(referenced_object(@subsection[:Prev])).to eq(@page_2) end it "the subsection should become the next relation for its parent's old last item" do expect(referenced_object(@page_2[:Next])).to eq(@subsection) end it "should set the first relation for the new subsection" do expect(referenced_object(@subsection[:First])).to eq(@added_page_3) end it "should set the correct last relation of the added to section" do expect(referenced_object(@subsection[:Last])).to eq(@added_page_3) end it "should increase the count of root outline dictionary" do expect(@outline_root[:Count]).to eq(5) end end context "positioned first" do before(:each) do @pdf.start_new_page @pdf.text "Page 3. An added subsection " @pdf.outline.update do add_subsection_to 'Chapter 1', :first do section 'Added SubSection', :destination => 3 do page :destination => 3, :title => 'Added Page 3' end end end render_and_find_objects end it "should add new outline items to document" do [@subsection, @added_page_3].each { |item| expect(item).not_to be_nil } end it "should reset the first item for parent item dictionary" do expect(referenced_object(@section_1[:First])).to eq(@subsection) expect(referenced_object(@section_1[:Last])).to eq(@page_2) end it "should set the next relation for the new subsection to its parent's old first item" do expect(referenced_object(@subsection[:Next])).to eq(@page_1) end it "the subsection should become the prev relation for its parent's old first item" do expect(referenced_object(@page_1[:Prev])).to eq(@subsection) end it "should set the first relation for the new subsection" do expect(referenced_object(@subsection[:First])).to eq(@added_page_3) end it "should set the correct last relation of the added to section" do expect(referenced_object(@subsection[:Last])).to eq(@added_page_3) end it "should increase the count of root outline dictionary" do expect(@outline_root[:Count]).to eq(5) end end it "should require an existing title" do expect do @pdf.go_to_page 1 @pdf.start_new_page @pdf.text "Inserted Page" @pdf.outline.update do add_subsection_to 'Wrong page' do page page_number, :title => "Inserted Page" end end render_and_find_objects end.to raise_error(Prawn::Errors::UnknownOutlineTitle) end end describe "#outline.insert_section_after" do describe "inserting in the middle of another section" do before(:each) do @pdf.go_to_page 1 @pdf.start_new_page @pdf.text "Inserted Page" @pdf.outline.update do insert_section_after 'Page 1' do page :destination => page_number, :title => "Inserted Page" end end end it "should insert new outline items to document" do render_and_find_objects expect(@inserted_page).not_to be_nil end it "should adjust the count of all ancestors" do render_and_find_objects expect(@outline_root[:Count]).to eq(4) expect(@section_1[:Count].abs).to eq(3) end describe "#adjust_relations" do it "should reset the sibling relations of adjoining items to inserted item" do render_and_find_objects expect(referenced_object(@page_1[:Next])).to eq(@inserted_page) expect(referenced_object(@page_2[:Prev])).to eq(@inserted_page) end it "should set the sibling relation of added item to adjoining items" do render_and_find_objects expect(referenced_object(@inserted_page[:Next])).to eq(@page_2) expect(referenced_object(@inserted_page[:Prev])).to eq(@page_1) end it "should not affect the first and last relations of parent item" do render_and_find_objects expect(referenced_object(@section_1[:First])).to eq(@page_1) expect(referenced_object(@section_1[:Last])).to eq(@page_2) end end context "when adding another section afterwards" do it "should have reset the root position so that a new section is added at the end of root sections" do @pdf.start_new_page @pdf.text "Another Inserted Page" @pdf.outline.update do section 'Added Section' do page :destination => page_number, :title => "Inserted Page" end end render_and_find_objects expect(referenced_object(@outline_root[:Last])).to eq(@section_2) expect(referenced_object(@section_1[:Next])).to eq(@section_2) end end end describe "inserting at the end of another section" do before(:each) do @pdf.go_to_page 2 @pdf.start_new_page @pdf.text "Inserted Page" @pdf.outline.update do insert_section_after 'Page 2' do page :destination => page_number, :title => "Inserted Page" end end render_and_find_objects end describe "#adjust_relations" do it "should reset the sibling relations of adjoining item to inserted item" do expect(referenced_object(@page_2[:Next])).to eq(@inserted_page) end it "should set the sibling relation of added item to adjoining items" do expect(referenced_object(@inserted_page[:Next])).to be_nil expect(referenced_object(@inserted_page[:Prev])).to eq(@page_2) end it "should adjust the last relation of parent item" do expect(referenced_object(@section_1[:Last])).to eq(@inserted_page) end end end it "should require an existing title" do expect do @pdf.go_to_page 1 @pdf.start_new_page @pdf.text "Inserted Page" @pdf.outline.update do insert_section_after 'Wrong page' do page :destination => page_number, :title => "Inserted Page" end end render_and_find_objects end.to raise_error(Prawn::Errors::UnknownOutlineTitle) end end describe "#page" do it "should require a title option to be set" do expect do @pdf = Prawn::Document.new do text "Page 1. This is the first Chapter. " outline.define do page :destination => 1, :title => nil end end end.to raise_error(Prawn::Errors::RequiredOption) end end end describe "foreign character encoding" do before(:each) do pdf = Prawn::Document.new do outline.define do section 'La pomme croquée', :destination => 1, :closed => true end end @hash = PDF::Reader::ObjectHash.new(StringIO.new(pdf.render, 'r+')) end it "should handle other encodings for the title" do object = find_by_title('La pomme croquée') expect(object).not_to be_nil end end def render_and_find_objects output = StringIO.new(@pdf.render, 'r+') @hash = PDF::Reader::ObjectHash.new(output) @outline_root = @hash.values.find { |obj| obj.is_a?(Hash) && obj[:Type] == :Outlines } @pages = @hash.values.find { |obj| obj.is_a?(Hash) && obj[:Type] == :Pages }[:Kids] @section_1 = find_by_title('Chapter 1') @page_1 = find_by_title('Page 1') @page_2 = find_by_title('Page 2') @section_2 = find_by_title('Added Section') @page_3 = find_by_title('Page 3') @inserted_page = find_by_title('Inserted Page') @subsection = find_by_title('Added SubSection') @added_page_3 = find_by_title('Added Page 3') @custom_dest = find_by_title('Custom Destination') end # Outline titles are stored as UTF-16. This method accepts a UTF-8 outline title # and returns the PDF Object that contains an outline with that name def find_by_title(title) @hash.values.find {|obj| if obj.is_a?(Hash) && obj[:Title] title_codepoints = obj[:Title].unpack("n*") title_codepoints.shift utf8_title = title_codepoints.pack("U*") utf8_title == title ? obj : nil end } end def referenced_object(reference) @hash[reference] end ruby-prawn-2.1.0.orig/spec/blend_mode_spec.rb0000644000000000000000000000416712665203156017654 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") module BlendModeHelper def make_blend_mode(blend_mode) @pdf.blend_mode(blend_mode) do yield if block_given? end end end describe "Document with with blend_mode" do include BlendModeHelper it "the PDF version should be at least 1.4" do create_pdf make_blend_mode(:Multiply) str = @pdf.render expect(str[0, 8]).to eq("%PDF-1.4") end it "a new extended graphics state should be created for " \ "each unique blend mode setting" do create_pdf make_blend_mode(:Multiply) do make_blend_mode(:Screen) end extgstates = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates expect(extgstates.length).to eq(2) end it "a new extended graphics state should not be created for " \ "each duplicate blend mode setting" do create_pdf make_blend_mode(:Multiply) do make_blend_mode(:Multiply) end extgstates = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates expect(extgstates.length).to eq(1) end it "setting the blend mode with only one parameter sets a single blend mode value" do create_pdf make_blend_mode(:Multiply) extgstate = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates.first expect(extgstate[:blend_mode]).to eq(:Multiply) end it "setting the blend mode with multiple parameters sets an array of blend modes" do create_pdf make_blend_mode([:Multiply, :Screen, :Overlay]) extgstate = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates.first expect(extgstate[:blend_mode]).to eq([:Multiply, :Screen, :Overlay]) end describe "with more than one page" do include BlendModeHelper it "the extended graphic state resource should be added to both pages" do create_pdf make_blend_mode(:Multiply) @pdf.start_new_page make_blend_mode(:Multiply) extgstates = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates extgstate = extgstates[0] expect(extgstates.length).to eq(2) expect(extgstate[:blend_mode]).to eq(:Multiply) end end end ruby-prawn-2.1.0.orig/spec/image_handler_spec.rb0000644000000000000000000000274512665203156020343 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "ImageHandler" do let(:image_handler) { Prawn::ImageHandler.new } let(:handler_a) { double("Handler A") } let(:handler_b) { double("Handler B") } it "finds the image handler for an image" do allow(handler_a).to receive(:can_render?).and_return(true) image_handler.register(handler_a) image_handler.register(handler_b) handler = image_handler.find("arbitrary blob") expect(handler).to eq(handler_a) end it "can prepend handlers" do allow(handler_b).to receive(:can_render?).and_return(true) image_handler.register(handler_a) image_handler.register!(handler_b) handler = image_handler.find("arbitrary blob") expect(handler).to eq(handler_b) end it "can unregister a handler" do allow(handler_b).to receive(:can_render?).and_return(true) image_handler.register(handler_a) image_handler.register(handler_b) image_handler.unregister(handler_a) handler = image_handler.find('arbitrary blob') expect(handler).to eq(handler_b) end it "raises an error when no matching handler is found" do allow(handler_a).to receive(:can_render?).and_return(false) allow(handler_b).to receive(:can_render?).and_return(false) image_handler.register(handler_a) image_handler.register(handler_b) expect { image_handler.find("arbitrary blob") }. to(raise_error(Prawn::Errors::UnsupportedImageType)) end end ruby-prawn-2.1.0.orig/spec/formatted_text_fragment_spec.rb0000644000000000000000000002356112665203156022477 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "Text::Formatted::Fragment#space_count" do it "should return the number of spaces in the fragment" do create_pdf format_state = {} fragment = Prawn::Text::Formatted::Fragment.new("hello world ", format_state, @pdf) expect(fragment.space_count).to eq(2) end it "should exclude trailing spaces from the count when " \ ":exclude_trailing_white_space => true" do create_pdf format_state = { :exclude_trailing_white_space => true } fragment = Prawn::Text::Formatted::Fragment.new("hello world ", format_state, @pdf) expect(fragment.space_count).to eq(1) end end describe "Text::Formatted::Fragment#include_trailing_white_space!" do it "should make the fragment include trailing white space" do create_pdf format_state = { :exclude_trailing_white_space => true } fragment = Prawn::Text::Formatted::Fragment.new("hello world ", format_state, @pdf) expect(fragment.space_count).to eq(1) fragment.include_trailing_white_space! expect(fragment.space_count).to eq(2) end end describe "Text::Formatted::Fragment#text" do it "should return the fragment text" do create_pdf format_state = {} fragment = Prawn::Text::Formatted::Fragment.new("hello world ", format_state, @pdf) expect(fragment.text).to eq("hello world ") end it "should return the fragment text without trailing spaces when " \ ":exclude_trailing_white_space => true" do create_pdf format_state = { :exclude_trailing_white_space => true } fragment = Prawn::Text::Formatted::Fragment.new("hello world ", format_state, @pdf) expect(fragment.text).to eq("hello world") end end describe "Text::Formatted::Fragment#word_spacing=" do before(:each) do create_pdf format_state = { :styles => [:bold, :italic], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil } @fragment = Prawn::Text::Formatted::Fragment.new("hello world", format_state, @pdf) @fragment.width = 100 @fragment.left = 50 @fragment.baseline = 200 @fragment.line_height = 27 @fragment.descender = 7 @fragment.ascender = 17 @fragment.word_spacing = 10 end it "should account for word_spacing in #width" do expect(@fragment.width).to eq(110) end it "should account for word_spacing in #bounding_box" do target_box = [50, 193, 160, 217] expect(@fragment.bounding_box).to eq(target_box) end it "should account for word_spacing in #absolute_bounding_box" do target_box = [50, 193, 160, 217] target_box[0] += @pdf.bounds.absolute_left target_box[1] += @pdf.bounds.absolute_bottom target_box[2] += @pdf.bounds.absolute_left target_box[3] += @pdf.bounds.absolute_bottom expect(@fragment.absolute_bounding_box).to eq(target_box) end it "should account for word_spacing in #underline_points" do y = 198.75 target_points = [[50, y], [160, y]] expect(@fragment.underline_points).to eq(target_points) end it "should account for word_spacing in #strikethrough_points" do y = 200 + @fragment.ascender * 0.3 target_points = [[50, y], [160, y]] expect(@fragment.strikethrough_points).to eq(target_points) end end describe "Text::Formatted::Fragment" do before(:each) do create_pdf format_state = { :styles => [:bold, :italic], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil } @fragment = Prawn::Text::Formatted::Fragment.new("hello world", format_state, @pdf) @fragment.width = 100 @fragment.left = 50 @fragment.baseline = 200 @fragment.line_height = 27 @fragment.descender = 7 @fragment.ascender = 17 end describe "#width" do it "should return the width" do expect(@fragment.width).to eq(100) end end describe "#styles" do it "should return the styles array" do expect(@fragment.styles).to eq([:bold, :italic]) end it "should never return nil" do format_state = { :styles => nil, :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil } fragment = Prawn::Text::Formatted::Fragment.new("hello world", format_state, @pdf) expect(fragment.styles).to eq([]) end end describe "#line_height" do it "should return the line_height" do expect(@fragment.line_height).to eq(27) end end describe "#ascender" do it "should return the ascender" do expect(@fragment.ascender).to eq(17) end end describe "#descender" do it "should return the descender" do expect(@fragment.descender).to eq(7) end end describe "#y_offset" do it "should be zero" do expect(@fragment.y_offset).to eq(0) end end describe "#bounding_box" do it "should return the bounding box surrounding the fragment" do target_box = [50, 193, 150, 217] expect(@fragment.bounding_box).to eq(target_box) end end describe "#absolute_bounding_box" do it "should return the bounding box surrounding the fragment" \ " in absolute coordinates" do target_box = [50, 193, 150, 217] target_box[0] += @pdf.bounds.absolute_left target_box[1] += @pdf.bounds.absolute_bottom target_box[2] += @pdf.bounds.absolute_left target_box[3] += @pdf.bounds.absolute_bottom expect(@fragment.absolute_bounding_box).to eq(target_box) end end describe "#underline_points" do it "should define a line under the fragment" do y = 198.75 target_points = [[50, y], [150, y]] expect(@fragment.underline_points).to eq(target_points) end end describe "#strikethrough_points" do it "should define a line through the fragment" do y = 200 + @fragment.ascender * 0.3 target_points = [[50, y], [150, y]] expect(@fragment.strikethrough_points).to eq(target_points) end end end describe "Text::Formatted::Fragment that is a subscript" do before(:each) do create_pdf format_state = { :styles => [:subscript], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil } @fragment = Prawn::Text::Formatted::Fragment.new("hello world", format_state, @pdf) @fragment.line_height = 27 @fragment.descender = 7 @fragment.ascender = 17 end describe "#subscript?" do it "should be_true" do expect(@fragment).to be_subscript end end describe "#y_offset" do it "should return a negative value" do expect(@fragment.y_offset).to be < 0 end end end describe "Text::Formatted::Fragment that is a superscript" do before(:each) do create_pdf format_state = { :styles => [:superscript], :color => nil, :link => nil, :anchor => nil, :font => nil, :size => nil } @fragment = Prawn::Text::Formatted::Fragment.new("hello world", format_state, @pdf) @fragment.line_height = 27 @fragment.descender = 7 @fragment.ascender = 17 end describe "#superscript?" do it "should be_true" do expect(@fragment).to be_superscript end end describe "#y_offset" do it "should return a positive value" do expect(@fragment.y_offset).to be > 0 end end end describe "Text::Formatted::Fragment with :direction => :rtl" do it "#text should be reversed" do create_pdf format_state = { :direction => :rtl } fragment = Prawn::Text::Formatted::Fragment.new("hello world", format_state, @pdf) expect(fragment.text).to eq("dlrow olleh") end end describe "Text::Formatted::Fragment default_direction=" do it "should set the direction if there is no fragment level direction " \ "specification" do create_pdf format_state = {} fragment = Prawn::Text::Formatted::Fragment.new("hello world", format_state, @pdf) fragment.default_direction = :rtl expect(fragment.direction).to eq(:rtl) end it "should not set the direction if there is a fragment level direction " \ "specification" do create_pdf format_state = { :direction => :rtl } fragment = Prawn::Text::Formatted::Fragment.new("hello world", format_state, @pdf) fragment.default_direction = :ltr expect(fragment.direction).to eq(:rtl) end end ruby-prawn-2.1.0.orig/spec/acceptance/0000755000000000000000000000000012665203156016303 5ustar rootrootruby-prawn-2.1.0.orig/spec/acceptance/png_spec.rb0000644000000000000000000000212312665203156020424 0ustar rootroot# encoding: utf-8 require_relative "../../spec/spec_helper" describe "When making a pdf file with png images" do image_dir = "#{Prawn::BASEDIR}/data/images" images = [ ["Type 0", "#{image_dir}/web-links.png"], ["Type 0 with transparency", "#{image_dir}/ruport_type0.png"], ["Type 2", "#{image_dir}/ruport.png"], ["Type 2 with transparency", "#{image_dir}/arrow2.png"], ["Type 3", "#{image_dir}/indexed_color.png"], ["Type 3 with transparency", "#{image_dir}/indexed_transparency.png"], ["Type 4", "#{image_dir}/page_white_text.png"], ["Type 6", "#{image_dir}/dice.png"], ["Type 6 in 16bit", "#{image_dir}/16bit.png"] ] images.each do |header, file| describe "and the image is #{header}" do it "does not error" do expect do Prawn::Document.generate("#{header}.pdf", :page_size => "A5") do fill_color "00FF00" fill_rectangle bounds.top_left, bounds.width, bounds.height text header image file, :at => [50, 450] end end.to_not raise_error end end end end ruby-prawn-2.1.0.orig/spec/text_spec.rb0000644000000000000000000004522512665203156016550 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "Prawn::Text::NBSP" do it "should be defined" do expect(Prawn::Text::NBSP).to eq(" ") end end describe "#height_of" do before(:each) { create_pdf } it "should return the height that would be required to print a" \ "particular string of text" do original_y = @pdf.y @pdf.text("Foo") new_y = @pdf.y expect(@pdf.height_of("Foo")).to be_within(0.0001).of(original_y - new_y) end it "should omit the gap below the last descender if :final_gap => false " \ "is given" do original_y = @pdf.y @pdf.text("Foo", :final_gap => false) new_y = @pdf.y expect(@pdf.height_of("Foo", :final_gap => false)).to be_within(0.0001).of(original_y - new_y) end it "should raise_error CannotFit if a too-small width is given" do expect do @pdf.height_of("text", :width => 1) end.to raise_error(Prawn::Errors::CannotFit) end it "should raise_error NotImplementedError if :indent_paragraphs option is provided" do expect { @pdf.height_of("hai", :width => 300, :indent_paragraphs => 60) }.to raise_error(NotImplementedError) end it "should_not raise_error Prawn::Errors::UnknownOption if :final_gap option is provided" do @pdf.height_of("hai", :width => 300, :final_gap => true) end end describe "#text" do before(:each) { create_pdf } it "should not fail when @output is nil when PDF::Core::Text::LineWrap#finalize_line is called" do # need a document with margins for these particulars to produce the # condition that was throwing the error pdf = Prawn::Document.new pdf.text "transparency " * 150, :size => 18 end it "should allow drawing empty strings to the page" do @pdf.text " " text = PDF::Inspector::Text.analyze(@pdf.render) # If anything is rendered to the page, it should be whitespace. text.strings.each { |str| expect(str).to match(/\A\s*\z/) } end it "should ignore call when string is nil" do expect(@pdf.text(nil)).to eq false end it "should correctly render empty paragraphs" do @pdf.text "text\n\ntext" text = PDF::Inspector::Text.analyze(@pdf.render) expect(@pdf.page_count).to eq(1) expect(text.strings.reject(&:empty?)).to eq(["text", "text"]) end it "should correctly render empty paragraphs with :indent_paragraphs" do @pdf.text "text\n\ntext", :indent_paragraphs => 5 text = PDF::Inspector::Text.analyze(@pdf.render) expect(@pdf.page_count).to eq(1) expect(text.strings.reject(&:empty?)).to eq(["text", "text"]) end it "should correctly render strings ending with empty paragraphs and " \ ":inline_format and :indent_paragraphs" do @pdf.text "text\n\n", :inline_format => true, :indent_paragraphs => 5 text = PDF::Inspector::Text.analyze(@pdf.render) expect(@pdf.page_count).to eq(1) expect(text.strings).to eq(["text"]) end it "should default to use kerning information" do @pdf.text "hello world" text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.kerned[0]).to eq true end it "should be able to disable kerning with an option" do @pdf.text "hello world", :kerning => false text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.kerned[0]).to eq false end it "should be able to disable kerning document-wide" do @pdf.default_kerning(false) @pdf.default_kerning = false @pdf.text "hello world" text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.kerned[0]).to eq false end it "option should be able to override document-wide kerning disabling" do @pdf.default_kerning = false @pdf.text "hello world", :kerning => true text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.kerned[0]).to eq true end it "should raise_error ArgumentError if :at option included" do expect { @pdf.text("hai", :at => [0, 0]) }.to raise_error(ArgumentError) end it "should advance down the document based on font_height" do position = @pdf.y @pdf.text "Foo" expect(@pdf.y).to be_within(0.0001).of(position - @pdf.font.height) position = @pdf.y @pdf.text "Foo\nBar\nBaz" expect(@pdf.y).to be_within(0.0001).of(position - 3 * @pdf.font.height) end it "should advance down the document based on font_height with size option" do position = @pdf.y @pdf.text "Foo", :size => 15 @pdf.font_size = 15 expect(@pdf.y).to be_within(0.0001).of(position - @pdf.font.height) position = @pdf.y @pdf.text "Foo\nBar\nBaz" expect(@pdf.y).to be_within(0.0001).of(position - 3 * @pdf.font.height) end it "should advance down the document based on font_height with leading option" do position = @pdf.y leading = 2 @pdf.text "Foo", :leading => leading expect(@pdf.y).to be_within(0.0001).of(position - @pdf.font.height - leading) position = @pdf.y @pdf.text "Foo\nBar\nBaz" expect(@pdf.y).to be_within(0.0001).of(position - 3 * @pdf.font.height) end it "should advance only to the bottom of the final descender if final_gap is false" do position = @pdf.y @pdf.text "Foo", :final_gap => false expect(@pdf.y).to be_within(0.0001).of(position - @pdf.font.ascender - @pdf.font.descender) position = @pdf.y @pdf.text "Foo\nBar\nBaz", :final_gap => false expect(@pdf.y).to be_within(0.0001).of(position - 2 * @pdf.font.height - @pdf.font.ascender - @pdf.font.descender) end it "should be able to print text starting at the last line of a page" do @pdf.move_cursor_to(@pdf.font.height) @pdf.text("hello world") pages = PDF::Inspector::Page.analyze(@pdf.render).pages expect(pages.size).to eq(1) end it "should default to 12 point helvetica" do @pdf.text "Blah" text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.font_settings[0][:name]).to eq(:Helvetica) expect(text.font_settings[0][:size]).to eq(12) expect(text.strings.first).to eq("Blah") end it "should allow setting font size" do @pdf.text "Blah", :size => 16 text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.font_settings[0][:size]).to eq(16) end it "should allow setting a default font size" do @pdf.font_size = 16 @pdf.text "Blah" text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.font_settings[0][:size]).to eq(16) end it "should allow overriding default font for a single instance" do @pdf.font_size = 16 @pdf.text "Blah", :size => 11 @pdf.text "Blaz" text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.font_settings[0][:size]).to eq(11) expect(text.font_settings[1][:size]).to eq(16) end it "should allow setting a font size transaction with a block" do @pdf.font_size 16 do @pdf.text 'Blah' end @pdf.text 'blah' text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.font_settings[0][:size]).to eq(16) expect(text.font_settings[1][:size]).to eq(12) end it "should allow manual setting the font size when in a font size block" do @pdf.font_size(16) do @pdf.text 'Foo' @pdf.text 'Blah', :size => 11 @pdf.text 'Blaz' end text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.font_settings[0][:size]).to eq(16) expect(text.font_settings[1][:size]).to eq(11) expect(text.font_settings[2][:size]).to eq(16) end it "should allow registering of built-in font_settings on the fly" do @pdf.font "Times-Roman" @pdf.text "Blah" @pdf.font "Courier" @pdf.text "Blaz" text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.font_settings[0][:name]).to eq(:"Times-Roman") expect(text.font_settings[1][:name]).to eq(:Courier) end it "should utilise the same default font across multiple pages" do @pdf.text "Blah" @pdf.start_new_page @pdf.text "Blaz" text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.font_settings.size).to eq(2) expect(text.font_settings[0][:name]).to eq(:Helvetica) expect(text.font_settings[1][:name]).to eq(:Helvetica) end it "should raise_error an exception when an unknown font is used" do expect { @pdf.font "Pao bu" }.to raise_error(Prawn::Errors::UnknownFont) end it "should_not raise_error an exception when providing Pathname instance as font" do @pdf.font Pathname.new("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf") end it "should correctly render a utf-8 string when using a built-in font" do str = "©" # copyright symbol @pdf.text str # grab the text from the rendered PDF and ensure it matches text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.strings.first).to eq(str) end it "should correctly render a utf-8 string when using a TTF font" do str = "©" # copyright symbol @pdf.font "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf" @pdf.text str # grab the text from the rendered PDF and ensure it matches text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.strings.first).to eq(str) end it "subsets mixed low-ASCII and non-ASCII characters when they can be subsetted together" do str = "It’s super effective!" @pdf.font "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf" @pdf.text str text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.strings.first).to eq(str) end it "should correctly render a string with higher bit characters across a page break when using a built-in font" do str = "©" @pdf.move_cursor_to(@pdf.font.height) @pdf.text(str + "\n" + str) pages = PDF::Inspector::Page.analyze(@pdf.render).pages expect(pages.size).to eq(2) expect(pages[0][:strings]).to eq([str]) expect(pages[1][:strings]).to eq([str]) end it "should correctly render a string with higher bit characters across" \ " a page break when using a built-in font and :indent_paragraphs option" do str = "©" @pdf.move_cursor_to(@pdf.font.height) @pdf.text(str + "\n" + str, :indent_paragraphs => 20) pages = PDF::Inspector::Page.analyze(@pdf.render).pages expect(pages.size).to eq(2) expect(pages[0][:strings]).to eq([str]) expect(pages[1][:strings]).to eq([str]) end it "should raise_error an exception when a utf-8 incompatible string is rendered" do str = "Blah \xDD" expect { @pdf.text str }.to raise_error( Prawn::Errors::IncompatibleStringEncoding) end it "should_not raise_error an exception when a shift-jis string is rendered" do datafile = "#{Prawn::DATADIR}/shift_jis_text.txt" sjis_str = File.open(datafile, "r:shift_jis") { |f| f.gets } @pdf.font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf") # Expect that the call to text will not raise an encoding error @pdf.text(sjis_str) end it "should call move_past_bottom when printing more text than can fit" \ " between the current document.y and bounds.bottom" do @pdf.y = @pdf.font.height @pdf.text "Hello" @pdf.text "World" pages = PDF::Inspector::Page.analyze(@pdf.render).pages expect(pages.size).to eq(2) expect(pages[0][:strings]).to eq(["Hello"]) expect(pages[1][:strings]).to eq(["World"]) end describe "with :indent_paragraphs option" do it "should indent the paragraphs" do hello = "hello " * 50 hello2 = "hello " * 50 @pdf.text(hello + "\n" + hello2, :indent_paragraphs => 60) text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.strings[0]).to eq(("hello " * 19).strip) expect(text.strings[1]).to eq(("hello " * 21).strip) expect(text.strings[3]).to eq(("hello " * 19).strip) expect(text.strings[4]).to eq(("hello " * 21).strip) end it "should indent from right side when using :rtl direction" do para1 = "The rain in spain falls mainly on the plains " * 3 para2 = "The rain in spain falls mainly on the plains " * 3 @pdf.text(para1 + "\n" + para2, :indent_paragraphs => 60, :direction => :rtl) text = PDF::Inspector::Text.analyze(@pdf.render) lines = text.strings x_positions = text.positions.map { |e| e[0] } # NOTE: The code below reflects Prawn's current kerning behavior for RTL # text, which isn't necessarily correct. If we change that behavior, # this test will need to be updated. expect(x_positions[0]).to( be_within(0.001).of(@pdf.bounds.absolute_right - 60 - @pdf.width_of(lines[0].reverse, :kerning => true))) expect(x_positions[1]).to( be_within(0.001).of(@pdf.bounds.absolute_right - @pdf.width_of(lines[1].reverse, :kerning => true))) expect(x_positions[2]).to( be_within(0.001).of(@pdf.bounds.absolute_right - 60 - @pdf.width_of(lines[2].reverse, :kerning => true))) expect(x_positions[3]).to( be_within(0.001).of(@pdf.bounds.absolute_right - @pdf.width_of(lines[3].reverse, :kerning => true))) end it "should indent from right side when document has :rtl direction" do para1 = "The rain in spain falls mainly on the plains " * 3 para2 = "The rain in spain falls mainly on the plains " * 3 @pdf.text_direction = :rtl @pdf.text(para1 + "\n" + para2, :indent_paragraphs => 60) text = PDF::Inspector::Text.analyze(@pdf.render) lines = text.strings x_positions = text.positions.map { |e| e[0] } # NOTE: The code below reflects Prawn's current kerning behavior for RTL # text, which isn't necessarily correct. If we change that behavior, # this test will need to be updated. expect(x_positions[0]).to( be_within(0.001).of(@pdf.bounds.absolute_right - 60 - @pdf.width_of(lines[0].reverse, :kerning => true))) expect(x_positions[1]).to( be_within(0.001).of(@pdf.bounds.absolute_right - @pdf.width_of(lines[1].reverse, :kerning => true))) expect(x_positions[2]).to( be_within(0.001).of(@pdf.bounds.absolute_right - 60 - @pdf.width_of(lines[2].reverse, :kerning => true))) expect(x_positions[3]).to( be_within(0.001).of(@pdf.bounds.absolute_right - @pdf.width_of(lines[3].reverse, :kerning => true))) end it "should indent from left side when using :ltr direction" do para1 = "The rain in spain falls mainly on the plains " * 3 para2 = "The rain in spain falls mainly on the plains " * 3 @pdf.text(para1 + "\n" + para2, :indent_paragraphs => 60, :direction => :ltr) text = PDF::Inspector::Text.analyze(@pdf.render) x_positions = text.positions.map { |e| e[0] } expect(x_positions[0]).to eq(60) expect(x_positions[1]).to eq(0) expect(x_positions[2]).to eq(60) expect(x_positions[3]).to eq(0) end it "should indent from left side when document has :ltr direction" do para1 = "The rain in spain falls mainly on the plains " * 3 para2 = "The rain in spain falls mainly on the plains " * 3 @pdf.text_direction = :ltr @pdf.text(para1 + "\n" + para2, :indent_paragraphs => 60) text = PDF::Inspector::Text.analyze(@pdf.render) x_positions = text.positions.map { |e| e[0] } expect(x_positions[0]).to eq(60) expect(x_positions[1]).to eq(0) expect(x_positions[2]).to eq(60) expect(x_positions[3]).to eq(0) end describe "when wrap to new page, and first line of new page" \ " is not the start of a new paragraph, that line should" \ " not be indented" do it "should indent the paragraphs" do hello = "hello " * 50 hello2 = "hello " * 50 @pdf.move_cursor_to(@pdf.font.height) @pdf.text(hello + "\n" + hello2, :indent_paragraphs => 60) text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.strings[0]).to eq(("hello " * 19).strip) expect(text.strings[1]).to eq(("hello " * 21).strip) expect(text.strings[3]).to eq(("hello " * 19).strip) expect(text.strings[4]).to eq(("hello " * 21).strip) end end describe "when wrap to new page, and first line of new page" \ " is the start of a new paragraph, that line should" \ " be indented" do it "should indent the paragraphs" do hello = "hello " * 50 hello2 = "hello " * 50 @pdf.move_cursor_to(@pdf.font.height * 3) @pdf.text(hello + "\n" + hello2, :indent_paragraphs => 60) text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.strings[0]).to eq(("hello " * 19).strip) expect(text.strings[1]).to eq(("hello " * 21).strip) expect(text.strings[3]).to eq(("hello " * 19).strip) expect(text.strings[4]).to eq(("hello " * 21).strip) end end end describe "kerning" do it "should respect text kerning setting (document default)" do create_pdf expect(@pdf.font).to receive(:compute_width_of).with("VAT", hash_including(kerning: true)).and_return(10) @pdf.text "VAT" end it "should respect text kerning setting (kerning=true)" do create_pdf expect(@pdf.font).to receive(:compute_width_of).with("VAT", hash_including(kerning: true)).at_least(:once).and_return(10) @pdf.text "VAT", :kerning => true end it "should respect text kerning setting (kerning=false)" do create_pdf expect(@pdf.font).to receive(:compute_width_of).with("VAT", hash_including(kerning: false)).at_least(:once).and_return(10) @pdf.text "VAT", :kerning => false end end describe "#shrink_to_fit with special utf-8 text" do it "Should not throw an exception", :unresolved, :issue => 603 do pages = 0 doc = Prawn::Document.new(page_size: 'A4', margin: [2, 2, 2, 2]) do |pdf| add_unicode_fonts(pdf) pdf.bounding_box([1, 1], :width => 90, :height => 50) do broken_text = " Sample Text\nSAMPLE SAMPLE SAMPLEoddělení ZMĚN\nSAMPLE" pdf.text broken_text, :overflow => :shrink_to_fit end end end end def add_unicode_fonts(pdf) dejavu = "#{::Prawn::BASEDIR}/data/fonts/DejaVuSans.ttf" pdf.font_families.update( "dejavu" => { :normal => dejavu, :italic => dejavu, :bold => dejavu, :bold_italic => dejavu } ) pdf.fallback_fonts = ["dejavu"] end describe "fallback_fonts" do it "should preserve font style" do create_pdf @pdf.fallback_fonts ["Helvetica"] @pdf.font "Times-Roman", :style => :italic do @pdf.text "hello" end text = PDF::Inspector::Text.analyze(@pdf.render) fonts_used = text.font_settings.map { |e| e[:name] } expect(fonts_used.length).to eq(1) expect(fonts_used[0]).to eq(:"Times-Italic") expect(text.strings[0]).to eq("hello") end end end ruby-prawn-2.1.0.orig/spec/font_spec.rb0000644000000000000000000003532712665203156016534 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") require 'pathname' describe "Font behavior" do it "should default to Helvetica if no font is specified" do @pdf = Prawn::Document.new expect(@pdf.font.name).to eq("Helvetica") end end describe "Font objects" do it "should be equal" do font1 = Prawn::Document.new.font font2 = Prawn::Document.new.font expect(font1).to eql(font2) end it "should always be the same key" do font1 = Prawn::Document.new.font font2 = Prawn::Document.new.font hash = {} hash[ font1 ] = "Original" hash[ font2 ] = "Overwritten" expect(hash.size).to eq(1) expect(hash[ font1 ]).to eq("Overwritten") expect(hash[ font2 ]).to eq("Overwritten") end end describe "#width_of" do it "should take character spacing into account" do create_pdf original_width = @pdf.width_of("hello world") @pdf.character_spacing(7) do expect(@pdf.width_of("hello world")).to eq(original_width + 11 * 7) end end it "should exclude newlines" do create_pdf # Use a TTF font that has a non-zero width for \n @pdf.font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf") expect(@pdf.width_of("\nhello world\n")).to eq( @pdf.width_of("hello world") ) end it "should take formatting into account" do create_pdf normal_hello = @pdf.width_of("hello") inline_bold_hello = @pdf.width_of("hello", :inline_format => true) @pdf.font("Helvetica", :style => :bold) { @bold_hello = @pdf.width_of("hello") } expect(inline_bold_hello).to be > normal_hello expect(inline_bold_hello).to eq(@bold_hello) end it "should accept :style as an argument" do create_pdf styled_bold_hello = @pdf.width_of("hello", :style => :bold) @pdf.font("Helvetica", :style => :bold) { @bold_hello = @pdf.width_of("hello") } expect(styled_bold_hello).to eq(@bold_hello) end it "should calculate styled widths correctly using TTFs" do create_pdf @pdf.font_families.update( 'DejaVu Sans' => { :normal => "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf", :bold => "#{Prawn::DATADIR}/fonts/DejaVuSans-Bold.ttf" } ) @pdf.font("DejaVu Sans") { @styled_bold_hello = @pdf.width_of("hello", :style => :bold) } @pdf.font("DejaVu Sans", :style => :bold) { @bold_hello = @pdf.width_of("hello") } @pdf.font("DejaVu Sans") { @plain_hello = @pdf.width_of("hello") } expect(@plain_hello).not_to eq(@bold_hello) expect(@styled_bold_hello).to eq(@bold_hello) end it "should not treat minus as if it were a hyphen", :issue => 578 do create_pdf expect(@pdf.width_of("-0.75")).to be < @pdf.width_of("25.00") end end describe "#font_size" do it "should allow setting font size in DSL style" do create_pdf @pdf.font_size 20 expect(@pdf.font_size).to eq(20) end end describe "font style support" do before(:each) { create_pdf } it "should complain if there is no @current_page" do pdf_without_page = Prawn::Document.new(:skip_page_creation => true) expect{ pdf_without_page.font "Helvetica" }. to raise_error(Prawn::Errors::NotOnPage) end it "should allow specifying font style by style name and font family" do @pdf.font "Courier", :style => :bold @pdf.text "In Courier bold" @pdf.font "Courier", :style => :bold_italic @pdf.text "In Courier bold-italic" @pdf.font "Courier", :style => :italic @pdf.text "In Courier italic" @pdf.font "Courier", :style => :normal @pdf.text "In Normal Courier" @pdf.font "Helvetica" @pdf.text "In Normal Helvetica" text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.font_settings.map { |e| e[:name] }).to eq( [ :"Courier-Bold", :"Courier-BoldOblique", :"Courier-Oblique", :Courier, :Helvetica ] ) end it "should allow font familes to be defined in a single dfont" do file = "#{Prawn::DATADIR}/fonts/Panic+Sans.dfont" @pdf.font_families["Panic Sans"] = { :normal => { :file => file, :font => "PanicSans" }, :italic => { :file => file, :font => "PanicSans-Italic" }, :bold => { :file => file, :font => "PanicSans-Bold" }, :bold_italic => { :file => file, :font => "PanicSans-BoldItalic" } } @pdf.font "Panic Sans", :style => :italic @pdf.text "In PanicSans-Italic" text = PDF::Inspector::Text.analyze(@pdf.render) name = text.font_settings.map { |e| e[:name] }.first.to_s name = name.sub(/\w+\+/, "subset+") expect(name).to eq("subset+PanicSans-Italic") end it "should accept Pathname objects for font files" do file = Pathname.new("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf") @pdf.font_families["DejaVu Sans"] = { :normal => file } @pdf.font "DejaVu Sans" @pdf.text "In DejaVu Sans" text = PDF::Inspector::Text.analyze(@pdf.render) name = text.font_settings.map { |e| e[:name] }.first.to_s name = name.sub(/\w+\+/, "subset+") expect(name).to eq("subset+DejaVuSans") end it "should accept IO objects for font files" do io = File.open "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf" @pdf.font_families["DejaVu Sans"] = { normal: Prawn::Font.load(@pdf, io) } @pdf.font "DejaVu Sans" @pdf.text "In DejaVu Sans" text = PDF::Inspector::Text.analyze(@pdf.render) name = text.font_settings.map { |e| e[:name] }.first.to_s name = name.sub(/\w+\+/, "subset+") expect(name).to eq("subset+DejaVuSans") end end describe "Transactional font handling" do before(:each) { create_pdf } it "should allow setting of size directly when font is created" do @pdf.font "Courier", :size => 16 expect(@pdf.font_size).to eq(16) end it "should allow temporary setting of a new font using a transaction" do @pdf.font "Helvetica", :size => 12 @pdf.font "Courier", :size => 16 do expect(@pdf.font.name).to eq("Courier") expect(@pdf.font_size).to eq(16) end expect(@pdf.font.name).to eq("Helvetica") expect(@pdf.font_size).to eq(12) end it "should mask font size when using a transacation" do @pdf.font "Courier", :size => 16 do expect(@pdf.font_size).to eq(16) end @pdf.font "Times-Roman" @pdf.font "Courier" expect(@pdf.font_size).to eq(12) end end describe "Document#page_fonts" do before(:each) { create_pdf } it "should register fonts properly by page" do @pdf.font "Courier" @pdf.text("hello") @pdf.font "Helvetica" @pdf.text("hello") @pdf.font "Times-Roman" @pdf.text("hello") ["Courier", "Helvetica", "Times-Roman"].each { |f| page_should_include_font(f) } @pdf.start_new_page @pdf.font "Helvetica" @pdf.text("hello") page_should_include_font("Helvetica") page_should_not_include_font("Courier") page_should_not_include_font("Times-Roman") end def page_includes_font?(font) @pdf.page.fonts.values.map { |e| e.data[:BaseFont] }.include?(font.to_sym) end def page_should_include_font(font) expect(page_includes_font?(font)).to eq true end def page_should_not_include_font(font) expect(page_includes_font?(font)).to eq false end end describe "AFM fonts" do before do create_pdf @times = @pdf.find_font "Times-Roman" end it "should calculate string width taking into account accented characters" do input = win1252_string("\xE9") # é in win-1252 expect(@times.compute_width_of(input, :size => 12)).to eq(@times.compute_width_of("e", :size => 12)) end it "should calculate string width taking into account kerning pairs" do expect(@times.compute_width_of(win1252_string("To"), :size => 12)).to eq(13.332) expect(@times.compute_width_of(win1252_string("To"), :size => 12, :kerning => true)).to eq(12.372) input = win1252_string("T\xF6") # Tö in win-1252 expect(@times.compute_width_of(input, :size => 12, :kerning => true)).to eq(12.372) end it "should encode text without kerning by default" do expect(@times.encode_text(win1252_string("To"))).to eq([[0, "To"]]) input = win1252_string("T\xE9l\xE9") # Télé in win-1252 expect(@times.encode_text(input)).to eq([[0, input]]) expect(@times.encode_text(win1252_string("Technology"))).to eq([[0, "Technology"]]) expect(@times.encode_text(win1252_string("Technology..."))).to eq([[0, "Technology..."]]) end it "should encode text with kerning if requested" do expect(@times.encode_text(win1252_string("To"), :kerning => true)).to eq([[0, ["T", 80, "o"]]]) input = win1252_string("T\xE9l\xE9") # Télé in win-1252 output = win1252_string("\xE9l\xE9") # élé in win-1252 expect(@times.encode_text(input, :kerning => true)).to eq([[0, ["T", 70, output]]]) expect(@times.encode_text(win1252_string("Technology"), :kerning => true)).to eq([[0, ["T", 70, "echnology"]]]) expect(@times.encode_text(win1252_string("Technology..."), :kerning => true)).to eq([[0, ["T", 70, "echnology", 65, "..."]]]) end describe "when normalizing encoding" do it "should not modify the original string when normalize_encoding() is used" do original = "Foo" normalized = @times.normalize_encoding(original) expect(original.equal?(normalized)).to eq false end it "should modify the original string when normalize_encoding!() is used" do original = "Foo" normalized = @times.normalize_encoding!(original) expect(original.equal?(normalized)).to eq true end end it "should omit /Encoding for symbolic fonts" do zapf = @pdf.find_font "ZapfDingbats" font_dict = zapf.send(:register, nil) expect(font_dict.data[:Encoding]).to be_nil end end describe "#glyph_present" do before(:each) { create_pdf } it "should return true when present in an AFM font" do font = @pdf.find_font("Helvetica") expect(font.glyph_present?("H")).to eq true end it "should return false when absent in an AFM font" do font = @pdf.find_font("Helvetica") expect(font.glyph_present?("再")).to eq false end it "should return true when present in a TTF font" do font = @pdf.find_font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf") expect(font.glyph_present?("H")).to eq true end it "should return false when absent in a TTF font" do font = @pdf.find_font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf") expect(font.glyph_present?("再")).to eq false font = @pdf.find_font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf") expect(font.glyph_present?("€")).to eq false end end describe "TTF fonts" do before do create_pdf @font = @pdf.find_font "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf" end it "should calculate string width taking into account accented characters" do expect(@font.compute_width_of("é", :size => 12)).to eq(@font.compute_width_of("e", :size => 12)) end it "should calculate string width taking into account kerning pairs" do expect(@font.compute_width_of("To", :size => 12)).to be_within(0.01).of(14.65) expect(@font.compute_width_of("To", :size => 12, :kerning => true)).to be_within(0.01).of(12.61) end it "should encode text without kerning by default" do expect(@font.encode_text("To")).to eq([[0, "To"]]) tele = "T\216l\216" result = @font.encode_text("Télé") expect(result.length).to eq(1) expect(result[0][0]).to eq(0) expect(result[0][1].bytes.to_a).to eq(tele.bytes.to_a) expect(@font.encode_text("Technology")).to eq([[0, "Technology"]]) expect(@font.encode_text("Technology...")).to eq([[0, "Technology..."]]) expect(@font.encode_text("Teχnology...")).to eq([[0, "Te"], [1, "!"], [0, "nology..."]]) end it "should encode text with kerning if requested" do expect(@font.encode_text("To", :kerning => true)).to eq([[0, ["T", 169.921875, "o"]]]) expect(@font.encode_text("Technology", :kerning => true)).to eq([[0, ["T", 169.921875, "echnology"]]]) expect(@font.encode_text("Technology...", :kerning => true)).to eq([[0, ["T", 169.921875, "echnology", 142.578125, "..."]]]) expect(@font.encode_text("Teχnology...", :kerning => true)).to eq([[0, ["T", 169.921875, "e"]], [1, "!"], [0, ["nology", 142.578125, "..."]]]) end it "should use the ascender, descender, and cap height from the TTF verbatim" do # These metrics are relative to the font's own bbox. They should not be # scaled with font size. ref = @pdf.ref!({}) @font.send :embed, ref, 0 # Pull out the embedded font descriptor descriptor = ref.data[:FontDescriptor].data expect(descriptor[:Ascent]).to eq(759) expect(descriptor[:Descent]).to eq(-240) expect(descriptor[:CapHeight]).to eq(759) end describe "when normalizing encoding" do it "should not modify the original string when normalize_encoding() is used" do original = "Foo" normalized = @font.normalize_encoding(original) expect(original.equal?(normalized)).to eq false end it "should modify the original string when normalize_encoding!() is used" do original = "Foo" normalized = @font.normalize_encoding!(original) expect(original.equal?(normalized)).to eq true end end end describe "DFont fonts" do before do create_pdf @file = "#{Prawn::DATADIR}/fonts/Panic+Sans.dfont" end it "should list all named fonts" do list = Prawn::Font::DFont.named_fonts(@file) expect(list.sort).to eq(%w(PanicSans PanicSans-Italic PanicSans-Bold PanicSans-BoldItalic).sort) end it "should count the number of fonts in the file" do expect(Prawn::Font::DFont.font_count(@file)).to eq(4) end it "should default selected font to the first one if not specified" do font = @pdf.find_font(@file) expect(font.basename).to eq("PanicSans") end it "should allow font to be selected by index" do font = @pdf.find_font(@file, :font => 2) expect(font.basename).to eq("PanicSans-Italic") end it "should allow font to be selected by name" do font = @pdf.find_font(@file, :font => "PanicSans-BoldItalic") expect(font.basename).to eq("PanicSans-BoldItalic") end it "should cache font object based on selected font" do f1 = @pdf.find_font(@file, :font => "PanicSans") f2 = @pdf.find_font(@file, :font => "PanicSans-Bold") expect(f2.object_id).not_to eq(f1.object_id) expect(@pdf.find_font(@file, :font => "PanicSans").object_id).to eq(f1.object_id) expect(@pdf.find_font(@file, :font => "PanicSans-Bold").object_id).to eq(f2.object_id) end end describe "#character_count(text)" do it "should work on TTF fonts" do create_pdf @pdf.font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf") expect(@pdf.font.character_count("こんにちは世界")).to eq(7) expect(@pdf.font.character_count("Hello, world!")).to eq(13) end it "should work on AFM fonts" do create_pdf expect(@pdf.font.character_count("Hello, world!")).to eq(13) end end ruby-prawn-2.1.0.orig/spec/graphics_spec.rb0000644000000000000000000005702612665203156017366 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "When drawing a line" do before(:each) { create_pdf } it "should draw a line from (100,600) to (100,500)" do @pdf.line([100, 600], [100, 500]) line_drawing = PDF::Inspector::Graphics::Line.analyze(@pdf.render) expect(line_drawing.points).to eq([[100, 600], [100, 500]]) end it "should draw two lines at (100,600) to (100,500) " \ "and (75,100) to (50,125)" do @pdf.line(100, 600, 100, 500) @pdf.line(75, 100, 50, 125) line_drawing = PDF::Inspector::Graphics::Line.analyze(@pdf.render) expect(line_drawing.points).to eq( [[100.0, 600.0], [100.0, 500.0], [75.0, 100.0], [50.0, 125.0]] ) end it "should properly set line width via line_width=" do @pdf.line_width = 10 line = PDF::Inspector::Graphics::Line.analyze(@pdf.render) expect(line.widths.first).to eq(10) end it "should properly set line width via line_width(width)" do @pdf.line_width(10) line = PDF::Inspector::Graphics::Line.analyze(@pdf.render) expect(line.widths.first).to eq(10) end it "should carry the current line width settings over to new pages" do @pdf.line_width(10) @pdf.start_new_page line = PDF::Inspector::Graphics::Line.analyze(@pdf.render) expect(line.widths.length).to eq(2) expect(line.widths[1]).to eq(10) end describe "(Horizontally)" do it "should draw from [x1,pdf.y],[x2,pdf.y]" do @pdf.horizontal_line(100, 150) @line = PDF::Inspector::Graphics::Line.analyze(@pdf.render) expect(@line.points).to eq([[100.0 + @pdf.bounds.absolute_left, @pdf.y], [150.0 + @pdf.bounds.absolute_left, @pdf.y]]) end it "should draw a line from (200, 250) to (300, 250)" do @pdf.horizontal_line(200, 300, :at => 250) line_drawing = PDF::Inspector::Graphics::Line.analyze(@pdf.render) expect(line_drawing.points).to eq([[200, 250], [300, 250]]) end end describe "(Vertically)" do it "should draw a line from (350, 300) to (350, 400)" do @pdf.vertical_line(300, 400, :at => 350) line_drawing = PDF::Inspector::Graphics::Line.analyze(@pdf.render) expect(line_drawing.points).to eq([[350, 300], [350, 400]]) end it "should require a y coordinate" do expect { @pdf.vertical_line(400, 500) }. to raise_error(ArgumentError) end end end describe "When drawing a polygon" do before(:each) { create_pdf } it "should draw each line passed to polygon()" do @pdf.polygon([100, 500], [100, 400], [200, 400]) line_drawing = PDF::Inspector::Graphics::Line.analyze(@pdf.render) expect(line_drawing.points).to eq([[100, 500], [100, 400], [200, 400], [100, 500]]) end end describe "When drawing a rectangle" do before(:each) { create_pdf } it "should use a point, width, and height for coords" do @pdf.rectangle [200, 200], 50, 100 rectangles = PDF::Inspector::Graphics::Rectangle.analyze(@pdf.render).rectangles # PDF uses bottom left corner expect(rectangles[0][:point]).to eq([200, 100]) expect(rectangles[0][:width]).to eq(50) expect(rectangles[0][:height]).to eq(100) end end describe "When drawing a curve" do before(:each) { create_pdf } it "should draw a bezier curve from 50,50 to 100,100" do @pdf.move_to [50, 50] @pdf.curve_to [100, 100], :bounds => [[20, 90], [90, 70]] curve = PDF::Inspector::Graphics::Curve.analyze(@pdf.render) expect(curve.coords).to eq([50.0, 50.0, 20.0, 90.0, 90.0, 70.0, 100.0, 100.0]) end it "should draw a bezier curve from 100,100 to 50,50" do @pdf.curve [100, 100], [50, 50], :bounds => [[20, 90], [90, 75]] curve = PDF::Inspector::Graphics::Curve.analyze(@pdf.render) expect(curve.coords).to eq([100.0, 100.0, 20.0, 90.0, 90.0, 75.0, 50.0, 50.0]) end end describe "When drawing a rounded rectangle" do before(:each) do create_pdf @pdf.rounded_rectangle([50, 550], 50, 100, 10) curve = PDF::Inspector::Graphics::Curve.analyze(@pdf.render) curve_points = [] curve.coords.each_slice(2) { |p| curve_points << p } @original_point = curve_points.shift curves = [] curve_points.each_slice(3) { |c| curves << c } line_points = PDF::Inspector::Graphics::Line.analyze(@pdf.render).points line_points.shift @all_coords = [] line_points.zip(curves).flatten.each_slice(2) { |p| @all_coords << p } @all_coords.unshift @original_point end it "should draw a rectangle by connecting lines with rounded bezier curves" do expect(@all_coords).to eq([[60.0, 550.0], [90.0, 550.0], [95.5228, 550.0], [100.0, 545.5228], [100.0, 540.0], [100.0, 460.0], [100.0, 454.4772], [95.5228, 450.0], [90.0, 450.0], [60.0, 450.0], [54.4772, 450.0], [50.0, 454.4772], [50.0, 460.0], [50.0, 540.0], [50.0, 545.5228], [54.4772, 550.0], [60.0, 550.0]]) end it "should start and end with the same point" do expect(@original_point).to eq(@all_coords.last) end end describe "When drawing an ellipse" do before(:each) do create_pdf @pdf.ellipse [100, 100], 25, 50 @curve = PDF::Inspector::Graphics::Curve.analyze(@pdf.render) end it "should use a Bézier approximation" do expect(@curve.coords).to eq( [125.0, 100.0, 125.0, 127.6142, 113.8071, 150, 100.0, 150.0, 86.1929, 150.0, 75.0, 127.6142, 75.0, 100.0, 75.0, 72.3858, 86.1929, 50.0, 100.0, 50.0, 113.8071, 50.0, 125.0, 72.3858, 125.0, 100.0, 100.0, 100.0] ) end it "should move the pointer to the center of the ellipse after drawing" do expect(@curve.coords[-2..-1]).to eq([100, 100]) end end describe "When drawing a circle" do before(:each) do create_pdf @pdf.circle [100, 100], 25 @pdf.ellipse [100, 100], 25, 25 @curve = PDF::Inspector::Graphics::Curve.analyze(@pdf.render) end it "should stroke the same path as the equivalent ellipse" do middle = @curve.coords.length / 2 expect(@curve.coords[0...middle]).to eq(@curve.coords[middle..-1]) end end describe "When filling" do before(:each) { create_pdf } it "should default to the f operator (nonzero winding number rule)" do expect(@pdf.renderer).to receive(:add_content).with("f") @pdf.fill end it "should use f* for :fill_rule => :even_odd" do expect(@pdf.renderer).to receive(:add_content).with("f*") @pdf.fill(:fill_rule => :even_odd) end it "should use b by default for fill_and_stroke (nonzero winding number)" do expect(@pdf.renderer).to receive(:add_content).with("b") @pdf.fill_and_stroke end it "should use b* for fill_and_stroke(:fill_rule => :even_odd)" do expect(@pdf.renderer).to receive(:add_content).with("b*") @pdf.fill_and_stroke(:fill_rule => :even_odd) end end describe "When setting colors" do before(:each) { create_pdf } it "should set stroke colors" do @pdf.stroke_color "ffcccc" colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render) # 100% red, 80% green, 80% blue expect(colors.stroke_color).to eq([1.0, 0.8, 0.8]) end it "should set fill colors" do @pdf.fill_color "ccff00" colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render) # 80% red, 100% green, 0% blue expect(colors.fill_color).to eq([0.8, 1.0, 0]) end it "should reset the colors on each new page if they have been defined" do @pdf.fill_color "ccff00" @pdf.start_new_page @pdf.stroke_color "ff00cc" @pdf.start_new_page colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render) expect(colors.fill_color_count).to eq(3) expect(colors.stroke_color_count).to eq(2) expect(colors.fill_color).to eq([0.8, 1.0, 0.0]) expect(colors.stroke_color).to eq([1.0, 0.0, 0.8]) end it "should set the color space when setting colors on new pages to please fussy readers" do @pdf.stroke_color "000000" @pdf.stroke { @pdf.rectangle([10, 10], 10, 10) } @pdf.start_new_page @pdf.stroke_color "000000" @pdf.stroke { @pdf.rectangle([10, 10], 10, 10) } colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render) expect(colors.stroke_color_space_count[:DeviceRGB]).to eq(2) end end describe "Patterns" do before(:each) { create_pdf } describe 'linear gradients' do it "should create a /Pattern resource" do @pdf.fill_gradient [0, @pdf.bounds.height], [@pdf.bounds.width, @pdf.bounds.height], 'FF0000', '0000FF' grad = PDF::Inspector::Graphics::Pattern.analyze(@pdf.render) pattern = grad.patterns.values.first expect(pattern).not_to be_nil expect(pattern[:Shading][:ShadingType]).to eq(2) expect(pattern[:Shading][:Coords]).to eq([0, 0, @pdf.bounds.width, 0]) expect(pattern[:Shading][:Function][:C0].zip([1, 0, 0]).all?{ |x1, x2| (x1 - x2).abs < 0.01 }).to eq true expect(pattern[:Shading][:Function][:C1].zip([0, 0, 1]).all?{ |x1, x2| (x1 - x2).abs < 0.01 }).to eq true end it "fill_gradient should set fill color to the pattern" do @pdf.fill_gradient [0, @pdf.bounds.height], [@pdf.bounds.width, @pdf.bounds.height], 'FF0000', '0000FF' str = @pdf.render expect(str).to match(%r{/Pattern\s+cs\s*/SP-?\d+\s+scn}) end it "stroke_gradient should set stroke color to the pattern" do @pdf.stroke_gradient [0, @pdf.bounds.height], [@pdf.bounds.width, @pdf.bounds.height], 'FF0000', '0000FF' str = @pdf.render expect(str).to match(%r{/Pattern\s+CS\s*/SP-?\d+\s+SCN}) end end describe 'radial gradients' do it "should create a /Pattern resource" do @pdf.fill_gradient [0, @pdf.bounds.height], 10, [@pdf.bounds.width, @pdf.bounds.height], 20, 'FF0000', '0000FF' grad = PDF::Inspector::Graphics::Pattern.analyze(@pdf.render) pattern = grad.patterns.values.first expect(pattern).not_to be_nil expect(pattern[:Shading][:ShadingType]).to eq(3) expect(pattern[:Shading][:Coords]).to eq([0, 0, 10, @pdf.bounds.width, 0, 20]) expect(pattern[:Shading][:Function][:C0].zip([1, 0, 0]).all?{ |x1, x2| (x1 - x2).abs < 0.01 }).to eq true expect(pattern[:Shading][:Function][:C1].zip([0, 0, 1]).all?{ |x1, x2| (x1 - x2).abs < 0.01 }).to eq true end it "fill_gradient should set fill color to the pattern" do @pdf.fill_gradient [0, @pdf.bounds.height], 10, [@pdf.bounds.width, @pdf.bounds.height], 20, 'FF0000', '0000FF' str = @pdf.render expect(str).to match(%r{/Pattern\s+cs\s*/SP-?\d+\s+scn}) end it "stroke_gradient should set stroke color to the pattern" do @pdf.stroke_gradient [0, @pdf.bounds.height], 10, [@pdf.bounds.width, @pdf.bounds.height], 20, 'FF0000', '0000FF' str = @pdf.render expect(str).to match(%r{/Pattern\s+CS\s*/SP-?\d+\s+SCN}) end end describe "gradient transformations" do subject do @pdf.scale 2 do @pdf.translate 40, 40 do @pdf.fill_gradient [0, 10], [15, 15], 'FF0000', '0000FF', opts @pdf.fill_gradient [0, 10], 15, [15, 15], 25, 'FF0000', '0000FF', opts end end grad = PDF::Inspector::Graphics::Pattern.analyze(@pdf.render) grad.patterns.values.map { |pattern| pattern[:Matrix] }.uniq end context "when :apply_transformations is true" do let(:opts) { { apply_transformations: true } } it "uses the transformation stack to translate user co-ordinates to document co-ordinates required by /Pattern" do expect(subject).to eq([[2, 0, 0, 2, 80, 100]]) end end context "when :apply_transformations is false" do let(:opts) { { apply_transformations: false } } it "doesn't transform the gradient" do expect(subject).to eq([[1, 0, 0, 1, 0, 10]]) end end context "when :apply_transformations is unset" do let(:opts) { {} } it "doesn't transform the gradient and displays a warning" do expect(@pdf).to receive(:warn).twice expect(subject).to eq([[1, 0, 0, 1, 0, 10]]) end end end end describe "When using painting shortcuts" do before(:each) { create_pdf } it "should convert stroke_some_method(args) into some_method(args); stroke" do expect(@pdf).to receive(:line_to).with([100, 100]) expect(@pdf).to receive(:stroke) @pdf.stroke_line_to [100, 100] end it "should convert fill_some_method(args) into some_method(args); fill" do expect(@pdf).to receive(:line_to).with([100, 100]) expect(@pdf).to receive(:fill) @pdf.fill_line_to [100, 100] end it "should not break method_missing" do expect { @pdf.i_have_a_pretty_girlfriend_named_jia }. to raise_error(NoMethodError) end end describe "When using graphics states" do before(:each) { create_pdf } it "should add the right content on save_graphics_state" do expect(@pdf.renderer).to receive(:add_content).with('q') @pdf.save_graphics_state end it "should add the right content on restore_graphics_state" do expect(@pdf.renderer).to receive(:add_content).with('Q') @pdf.restore_graphics_state end it "should save and restore when save_graphics_state is used with a block" do expect(@pdf.renderer).to receive(:add_content).with('q').ordered allow(@pdf).to receive(:foo).ordered expect(@pdf.renderer).to receive(:add_content).with('Q').ordered @pdf.save_graphics_state do @pdf.foo end end it "should add the previous color space when restoring to a graphic state with different color space" do @pdf.stroke_color '000000' @pdf.save_graphics_state @pdf.stroke_color 0, 0, 0, 0 @pdf.restore_graphics_state @pdf.stroke_color 0, 0, 100, 0 expect(@pdf.graphic_state.color_space).to eq(:stroke => :DeviceCMYK) colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render) expect(colors.color_space).to eq(:DeviceCMYK) expect(colors.stroke_color_space_count[:DeviceCMYK]).to eq(2) end it "should use the correct dash setting after restoring and starting new page" do @pdf.dash 5 @pdf.save_graphics_state @pdf.dash 10 expect(@pdf.graphic_state.dash[:dash]).to eq(10) @pdf.restore_graphics_state @pdf.start_new_page expect(@pdf.graphic_state.dash[:dash]).to eq(5) end it "should round dash values to four decimal places" do @pdf.dash 5.12345 expect(@pdf.graphic_state.dash_setting).to eq("[5.1235 5.1235] 0.0 d") end it "should raise an error when dash is called w. a zero length or space" do expect { @pdf.dash(0) }.to raise_error(ArgumentError) expect { @pdf.dash([0]) }.to raise_error(ArgumentError) expect { @pdf.dash([0, 0]) }.to raise_error(ArgumentError) expect { @pdf.dash([0, 0, 0, 1]) }.to raise_error(ArgumentError) end it "the current graphic state should keep track of previous unchanged settings" do @pdf.stroke_color '000000' @pdf.save_graphics_state @pdf.dash 5 @pdf.save_graphics_state @pdf.cap_style :round @pdf.save_graphics_state @pdf.fill_color 0, 0, 100, 0 @pdf.save_graphics_state expect(@pdf.graphic_state.stroke_color).to eq("000000") expect(@pdf.graphic_state.join_style).to eq(:miter) expect(@pdf.graphic_state.fill_color).to eq([0, 0, 100, 0]) expect(@pdf.graphic_state.cap_style).to eq(:round) expect(@pdf.graphic_state.color_space).to eq(:fill => :DeviceCMYK, :stroke => :DeviceRGB) expect(@pdf.graphic_state.dash).to eq(:space => 5, :phase => 0, :dash => 5) expect(@pdf.graphic_state.line_width).to eq(1) end it "should not add extra graphic space closings when rendering multiple times" do @pdf.render state = PDF::Inspector::Graphics::State.analyze(@pdf.render) expect(state.save_graphics_state_count).to eq(1) expect(state.restore_graphics_state_count).to eq(1) end it "should add extra graphic state enclosings when content is added on multiple renderings" do @pdf.render @pdf.text "Adding a bit more content" state = PDF::Inspector::Graphics::State.analyze(@pdf.render) expect(state.save_graphics_state_count).to eq(2) expect(state.restore_graphics_state_count).to eq(2) end it "adds extra graphic state enclosings when new settings are applied on multiple renderings" do @pdf.render @pdf.stroke_color 0, 0, 0, 0 state = PDF::Inspector::Graphics::State.analyze(@pdf.render) expect(state.save_graphics_state_count).to eq(2) expect(state.restore_graphics_state_count).to eq(2) end it "should raise_error error if closing an empty graphic stack" do expect { @pdf.render @pdf.restore_graphics_state }.to raise_error(PDF::Core::Errors::EmptyGraphicStateStack) end it "should copy mutable attributes when passing a previous_state to the initializer" do new_state = PDF::Core::GraphicState.new(@pdf.graphic_state) [:color_space, :dash, :fill_color, :stroke_color].each do |attr| expect(new_state.send(attr)).to eq(@pdf.graphic_state.send(attr)) expect(new_state.send(attr)).not_to equal(@pdf.graphic_state.send(attr)) end end it "should copy mutable attributes when duping" do new_state = @pdf.graphic_state.dup [:color_space, :dash, :fill_color, :stroke_color].each do |attr| expect(new_state.send(attr)).to eq(@pdf.graphic_state.send(attr)) expect(new_state.send(attr)).not_to equal(@pdf.graphic_state.send(attr)) end end end describe "When using transformation matrix" do before(:each) { create_pdf } # Note: The (approximate) number of significant decimal digits of precision in fractional # part is 5 (PDF Reference, Third Edition, p. 706) it "should send the right content on transformation_matrix" do expect(@pdf.renderer).to receive(:add_content).with('1.00000 0.00000 0.12346 -1.00000 5.50000 20.00000 cm') @pdf.transformation_matrix 1, 0, 0.123456789, -1.0, 5.5, 20 end it "should use fixed digits with very small number" do values = Array.new(6, 0.000000000001) string = Array.new(6, "0.00000").join " " expect(@pdf.renderer).to receive(:add_content).with("#{string} cm") @pdf.transformation_matrix(*values) end it "should be received by the inspector" do @pdf.transformation_matrix 1, 0, 0, -1, 5.5, 20 matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render) expect(matrices.matrices).to eq([[1, 0, 0, -1, 5.5, 20]]) end it "should save the graphics state inside the given block" do values = Array.new(6, 0.000000000001) string = Array.new(6, "0.00000").join " " expect(@pdf).to receive(:save_graphics_state).with(no_args).ordered allow(@pdf.renderer).to receive(:add_content).with(any_args).twice expect(@pdf.renderer).to receive(:add_content).with("#{string} cm").ordered allow(@pdf).to receive(:do_something).ordered expect(@pdf).to receive(:restore_graphics_state).with(no_args).ordered @pdf.transformation_matrix(*values) do @pdf.do_something end end end describe "When using transformations shortcuts" do before(:each) do create_pdf @x, @y = 12, 54.32 @angle = 12.32 @cos = Math.cos(@angle * Math::PI / 180) @sin = Math.sin(@angle * Math::PI / 180) @factor = 0.12 end describe "#rotate" do it "should rotate" do expect(@pdf).to receive(:transformation_matrix).with(@cos, @sin, -@sin, @cos, 0, 0) @pdf.rotate(@angle) end end describe "#rotate with :origin option" do it "should rotate around the origin" do x_prime = @x * @cos - @y * @sin y_prime = @x * @sin + @y * @cos @pdf.rotate(@angle, :origin => [@x, @y]) { @pdf.text('hello world') } matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render) expect(matrices.matrices[0]).to eq([1, 0, 0, 1, reduce_precision(@x - x_prime), reduce_precision(@y - y_prime)]) expect(matrices.matrices[1]).to eq([reduce_precision(@cos), reduce_precision(@sin), reduce_precision(-@sin), reduce_precision(@cos), 0, 0]) end it "should rotate around the origin in a document with a margin" do @pdf = Prawn::Document.new @pdf.rotate(@angle, :origin => [@x, @y]) { @pdf.text('hello world') } x = @x + @pdf.bounds.absolute_left y = @y + @pdf.bounds.absolute_bottom x_prime = x * @cos - y * @sin y_prime = x * @sin + y * @cos matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render) expect(matrices.matrices[0]).to eq([1, 0, 0, 1, reduce_precision(x - x_prime), reduce_precision(y - y_prime)]) expect(matrices.matrices[1]).to eq([reduce_precision(@cos), reduce_precision(@sin), reduce_precision(-@sin), reduce_precision(@cos), 0, 0]) end it "should raise_error BlockRequired if no block is given" do expect { @pdf.rotate(@angle, :origin => [@x, @y]) }.to raise_error(Prawn::Errors::BlockRequired) end def reduce_precision(float) ("%.5f" % float).to_f end end describe "#translate" do it "should translate" do x, y = 12, 54.32 expect(@pdf).to receive(:transformation_matrix).with(1, 0, 0, 1, x, y) @pdf.translate(x, y) end end describe "#scale" do it "should scale" do expect(@pdf).to receive(:transformation_matrix).with(@factor, 0, 0, @factor, 0, 0) @pdf.scale(@factor) end end describe "#scale with :origin option" do it "should scale from the origin" do x_prime = @factor * @x y_prime = @factor * @y @pdf.scale(@factor, :origin => [@x, @y]) { @pdf.text('hello world') } matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render) expect(matrices.matrices[0]).to eq([1, 0, 0, 1, reduce_precision(@x - x_prime), reduce_precision(@y - y_prime)]) expect(matrices.matrices[1]).to eq([@factor, 0, 0, @factor, 0, 0]) end it "should scale from the origin in a document with a margin" do @pdf = Prawn::Document.new x = @x + @pdf.bounds.absolute_left y = @y + @pdf.bounds.absolute_bottom x_prime = @factor * x y_prime = @factor * y @pdf.scale(@factor, :origin => [@x, @y]) { @pdf.text('hello world') } matrices = PDF::Inspector::Graphics::Matrix.analyze(@pdf.render) expect(matrices.matrices[0]).to eq([1, 0, 0, 1, reduce_precision(x - x_prime), reduce_precision(y - y_prime)]) expect(matrices.matrices[1]).to eq([@factor, 0, 0, @factor, 0, 0]) end it "should raise_error BlockRequired if no block is given" do expect { @pdf.scale(@factor, :origin => [@x, @y]) }.to raise_error(Prawn::Errors::BlockRequired) end def reduce_precision(float) ("%.5f" % float).to_f end end # describe "skew" do # it "should skew" do # a, b = 30, 50.2 # @pdf.expects(:transformation_matrix).with(1, Math.tan(a * Math::PI / 180), Math.tan(b * Math::PI / 180), 1, 0, 0) # @pdf.skew(a, b) # end # end end ruby-prawn-2.1.0.orig/spec/spec_helper.rb0000644000000000000000000000207412665203156017036 0ustar rootroot# encoding: utf-8 puts "Prawn specs: Running on Ruby Version: #{RUBY_VERSION}" require "bundler" Bundler.setup if ENV["COVERAGE"] require "simplecov" SimpleCov.start do add_filter "/spec/" end end require_relative "../lib/prawn" Prawn.debug = true Prawn::Font::AFM.hide_m17n_warning = true require "rspec" require "pdf/reader" require "pdf/inspector" # Requires supporting ruby files with custom matchers and macros, etc, # in spec/extensions/ and its subdirectories. Dir[File.dirname(__FILE__) + "/extensions/**/*.rb"].each { |f| require f } RSpec.configure do |config| config.include EncodingHelpers end def create_pdf(klass = Prawn::Document) @pdf = klass.new(:margin => 0) end RSpec::Matchers.define :have_parseable_xobjects do match do |actual| expect { PDF::Inspector::XObject.analyze(actual.render) }.not_to raise_error true end failure_message do |actual| "expected that #{actual}'s XObjects could be successfully parsed" end end # Make some methods public to assist in testing module Prawn::Graphics public :map_to_absolute end ruby-prawn-2.1.0.orig/spec/formatted_text_box_spec.rb0000644000000000000000000006465212665203156021472 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "Text::Formatted::Box wrapping" do before(:each) do create_pdf end it "should not wrap between two fragments" do texts = [ { :text => "Hello " }, { :text => "World" }, { :text => "2", :styles => [:superscript] } ] text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Hello World")) text_box.render expect(text_box.text).to eq("Hello\nWorld2") end it "should not raise an Encoding::CompatibilityError when keeping a TTF and an AFM font together" do file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf" @pdf.font_families["Kai"] = { :normal => { :file => file, :font => "Kai" } } texts = [ { :text => "Hello " }, { :text => "再见", :font => "Kai" }, { :text => "World" } ] text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Hello World")) text_box.render end it "should wrap between two fragments when the preceding fragment ends with white space" do texts = [ { :text => "Hello " }, { :text => "World " }, { :text => "2", :styles => [:superscript] } ] text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Hello World")) text_box.render expect(text_box.text).to eq("Hello World\n2") texts = [ { :text => "Hello " }, { :text => "World\n" }, { :text => "2", :styles => [:superscript] } ] text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Hello World")) text_box.render expect(text_box.text).to eq("Hello World\n2") end it "should wrap between two fragments when the final fragment begins with white space" do texts = [ { :text => "Hello " }, { :text => "World" }, { :text => " 2", :styles => [:superscript] } ] text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Hello World")) text_box.render expect(text_box.text).to eq("Hello World\n2") texts = [ { :text => "Hello " }, { :text => "World" }, { :text => "\n2", :styles => [:superscript] } ] text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Hello World")) text_box.render expect(text_box.text).to eq("Hello World\n2") end it "should properly handle empty slices using default encoding" do texts = [{ :text => "Noua Delineatio Geographica generalis | Apostolicarum peregrinationum | S FRANCISCI XAUERII | Indiarum & Iaponiæ Apostoli", :font => 'Courier', :size => 10 }] text_box = Prawn::Text::Formatted::Box.new(texts, :document => @pdf, :width => @pdf.width_of("Noua Delineatio Geographica gen")) expect { text_box.render }.not_to raise_error expect(text_box.text).to eq("Noua Delineatio Geographica\ngeneralis | Apostolicarum\nperegrinationum | S FRANCISCI\nXAUERII | Indiarum & Iaponi\346\nApostoli") end end describe "Text::Formatted::Box with :fallback_fonts option that includes" \ "a Chinese font and set of Chinese glyphs not in the current font" do it "should change the font to the Chinese font for the Chinese glyphs" do create_pdf file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf" @pdf.font_families["Kai"] = { :normal => { :file => file, :font => "Kai" } } formatted_text = [{ :text => "hello你好" }, { :text => "再见goodbye" }] @pdf.formatted_text_box(formatted_text, :fallback_fonts => ["Kai"]) text = PDF::Inspector::Text.analyze(@pdf.render) fonts_used = text.font_settings.map { |e| e[:name] } expect(fonts_used.length).to eq(4) expect(fonts_used[0]).to eq(:Helvetica) expect(fonts_used[1].to_s).to match(/GBZenKai-Medium/) expect(fonts_used[2].to_s).to match(/GBZenKai-Medium/) expect(fonts_used[3]).to eq(:Helvetica) expect(text.strings[0]).to eq("hello") expect(text.strings[1]).to eq("你好") expect(text.strings[2]).to eq("再见") expect(text.strings[3]).to eq("goodbye") end end describe "Text::Formatted::Box with :fallback_fonts option that includes" \ "an AFM font and Win-Ansi glyph not in the current Chinese font" do it "should change the font to the AFM font for the Win-Ansi glyph" do create_pdf file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf" @pdf.font_families["Kai"] = { :normal => { :file => file, :font => "Kai" } } @pdf.font("Kai") formatted_text = [{ :text => "hello你好" }, { :text => "再见€" }] @pdf.formatted_text_box(formatted_text, :fallback_fonts => ["Helvetica"]) text = PDF::Inspector::Text.analyze(@pdf.render) fonts_used = text.font_settings.map { |e| e[:name] } expect(fonts_used.length).to eq(4) expect(fonts_used[0].to_s).to match(/GBZenKai-Medium/) expect(fonts_used[1].to_s).to match(/GBZenKai-Medium/) expect(fonts_used[2].to_s).to match(/GBZenKai-Medium/) expect(fonts_used[3]).to eq(:Helvetica) expect(text.strings[0]).to eq("hello") expect(text.strings[1]).to eq("你好") expect(text.strings[2]).to eq("再见") expect(text.strings[3]).to eq("€") end end describe "Text::Formatted::Box with :fallback_fonts option and fragment " \ "level font" do it "should use the fragment level font except for glyphs not in that font" do create_pdf file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf" @pdf.font_families["Kai"] = { :normal => { :file => file, :font => "Kai" } } file = "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf" @pdf.font_families["DejaVu Sans"] = { :normal => { :file => file } } formatted_text = [{ :text => "hello你好" }, { :text => "再见goodbye", :font => "Times-Roman" }] @pdf.formatted_text_box(formatted_text, :fallback_fonts => ["Kai"]) text = PDF::Inspector::Text.analyze(@pdf.render) fonts_used = text.font_settings.map { |e| e[:name] } expect(fonts_used.length).to eq(4) expect(fonts_used[0]).to eq(:Helvetica) expect(fonts_used[1].to_s).to match(/GBZenKai-Medium/) expect(fonts_used[2].to_s).to match(/GBZenKai-Medium/) expect(fonts_used[3]).to eq(:"Times-Roman") expect(text.strings[0]).to eq("hello") expect(text.strings[1]).to eq("你好") expect(text.strings[2]).to eq("再见") expect(text.strings[3]).to eq("goodbye") end end describe "Text::Formatted::Box" do before(:each) do create_pdf file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf" @pdf.font_families["Kai"] = { :normal => { :file => file, :font => "Kai" } } file = "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf" @pdf.font_families["DejaVu Sans"] = { :normal => { :file => file } } @formatted_text = [{ :text => "hello你好" }] @pdf.fallback_fonts(["Kai"]) @pdf.fallback_fonts = ["Kai"] end it "#fallback_fonts should return the document-wide fallback fonts" do expect(@pdf.fallback_fonts).to eq(["Kai"]) end it "should be able to set text fallback_fonts document-wide" do @pdf.formatted_text_box(@formatted_text) text = PDF::Inspector::Text.analyze(@pdf.render) fonts_used = text.font_settings.map { |e| e[:name] } expect(fonts_used.length).to eq(2) expect(fonts_used[0]).to eq(:Helvetica) expect(fonts_used[1].to_s).to match(/GBZenKai-Medium/) end it "should be able to override document-wide fallback_fonts" do @pdf.fallback_fonts = ["DejaVu Sans"] @pdf.formatted_text_box(@formatted_text, :fallback_fonts => ["Kai"]) text = PDF::Inspector::Text.analyze(@pdf.render) fonts_used = text.font_settings.map { |e| e[:name] } expect(fonts_used.length).to eq(2) expect(fonts_used[0]).to eq(:Helvetica) expect(fonts_used[1]).to match(/Kai/) end it "should omit the fallback fonts overhead when passing an empty array " \ "as the :fallback_fonts" do @pdf.font("Kai") box = Prawn::Text::Formatted::Box.new(@formatted_text, :document => @pdf, :fallback_fonts => []) expect(box).to_not receive(:process_fallback_fonts) box.render end it "should be able to clear document-wide fallback_fonts" do @pdf.fallback_fonts([]) box = Prawn::Text::Formatted::Box.new(@formatted_text, :document => @pdf) @pdf.font("Kai") expect(box).to_not receive(:process_fallback_fonts) box.render end end describe "Text::Formatted::Box with :fallback_fonts option " \ "with glyphs not in the primary or the fallback fonts" do it "should raise an exception" do file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf" create_pdf formatted_text = [{ :text => "hello world. 世界你好。" }] expect { @pdf.formatted_text_box(formatted_text, :fallback_fonts => ["Courier"]) }.to raise_error(Prawn::Errors::IncompatibleStringEncoding) end end describe "Text::Formatted::Box#extensions" do it "should be able to override default line wrapping" do create_pdf Prawn::Text::Formatted::Box.extensions << TestFormattedWrapOverride @pdf.formatted_text_box([{ :text => "hello world" }], {}) Prawn::Text::Formatted::Box.extensions.delete(TestFormattedWrapOverride) text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.strings[0]).to eq("all your base are belong to us") end it "overriding Text::Formatted::Box line wrapping should not affect " \ "Text::Box wrapping" do create_pdf Prawn::Text::Formatted::Box.extensions << TestFormattedWrapOverride @pdf.text_box("hello world", {}) Prawn::Text::Formatted::Box.extensions.delete(TestFormattedWrapOverride) text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.strings[0]).to eq("hello world") end it "overriding Text::Box line wrapping should override Text::Box wrapping" do create_pdf Prawn::Text::Box.extensions << TestFormattedWrapOverride @pdf.text_box("hello world", {}) Prawn::Text::Box.extensions.delete(TestFormattedWrapOverride) text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.strings[0]).to eq("all your base are belong to us") end end describe "Text::Formatted::Box#render" do it "should handle newlines" do create_pdf array = [{ :text => "hello\nworld" }] options = { :document => @pdf } text_box = Prawn::Text::Formatted::Box.new(array, options) text_box.render expect(text_box.text).to eq("hello\nworld") end it "should omit spaces from the beginning of the line" do create_pdf array = [{ :text => " hello\n world" }] options = { :document => @pdf } text_box = Prawn::Text::Formatted::Box.new(array, options) text_box.render expect(text_box.text).to eq("hello\nworld") end it "should be okay printing a line of whitespace" do create_pdf array = [{ :text => "hello\n \nworld" }] options = { :document => @pdf } text_box = Prawn::Text::Formatted::Box.new(array, options) text_box.render expect(text_box.text).to eq("hello\n\nworld") array = [{ :text => "hello" + " " * 500 }, { :text => " " * 500 }, { :text => " " * 500 + "\n" }, { :text => "world" }] options = { :document => @pdf } text_box = Prawn::Text::Formatted::Box.new(array, options) text_box.render expect(text_box.text).to eq("hello\n\nworld") end it "should enable fragment level direction setting" do create_pdf number_of_hellos = 18 array = [ { :text => "hello " * number_of_hellos }, { :text => "world", :direction => :ltr }, { :text => ", how are you?" } ] options = { :document => @pdf, :direction => :rtl } text_box = Prawn::Text::Formatted::Box.new(array, options) text_box.render text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.strings[0]).to eq("era woh ,") expect(text.strings[1]).to eq("world") expect(text.strings[2]).to eq(" olleh" * number_of_hellos) expect(text.strings[3]).to eq("?uoy") end end describe "Text::Formatted::Box#render" do it "should be able to perform fragment callbacks" do create_pdf callback_object = TestFragmentCallback.new("something", 7, :document => @pdf) expect(callback_object).to receive(:render_behind).with( kind_of(Prawn::Text::Formatted::Fragment) ) expect(callback_object).to receive(:render_in_front).with( kind_of(Prawn::Text::Formatted::Fragment) ) array = [{ :text => "hello world " }, { :text => "callback now", :callback => callback_object }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render end it "should be able to perform fragment callbacks on multiple objects" do create_pdf callback_object = TestFragmentCallback.new("something", 7, :document => @pdf) expect(callback_object).to receive(:render_behind).with( kind_of(Prawn::Text::Formatted::Fragment) ) expect(callback_object).to receive(:render_in_front).with( kind_of(Prawn::Text::Formatted::Fragment) ) callback_object2 = TestFragmentCallback.new("something else", 14, :document => @pdf) expect(callback_object2).to receive(:render_behind).with( kind_of(Prawn::Text::Formatted::Fragment) ) expect(callback_object2).to receive(:render_in_front).with( kind_of(Prawn::Text::Formatted::Fragment) ) array = [{ :text => "hello world " }, { :text => "callback now", :callback => [callback_object, callback_object2] }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render end it "fragment callbacks should be able to define only the callback they need" do create_pdf behind = TestFragmentCallbackBehind.new("something", 7, :document => @pdf) in_front = TestFragmentCallbackInFront.new("something", 7, :document => @pdf) array = [{ :text => "hello world " }, { :text => "callback now", :callback => [behind, in_front] }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render # trigger callbacks end it "should be able to set the font" do create_pdf array = [{ :text => "this contains " }, { :text => "Times-Bold", :styles => [:bold], :font => "Times-Roman" }, { :text => " text" }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render contents = PDF::Inspector::Text.analyze(@pdf.render) fonts = contents.font_settings.map { |e| e[:name] } expect(fonts).to eq([:Helvetica, :"Times-Bold", :Helvetica]) expect(contents.strings[0]).to eq("this contains ") expect(contents.strings[1]).to eq("Times-Bold") expect(contents.strings[2]).to eq(" text") end it "should be able to set bold" do create_pdf array = [{ :text => "this contains " }, { :text => "bold", :styles => [:bold] }, { :text => " text" }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render contents = PDF::Inspector::Text.analyze(@pdf.render) fonts = contents.font_settings.map { |e| e[:name] } expect(fonts).to eq([:Helvetica, :"Helvetica-Bold", :Helvetica]) expect(contents.strings[0]).to eq("this contains ") expect(contents.strings[1]).to eq("bold") expect(contents.strings[2]).to eq(" text") end it "should be able to set italics" do create_pdf array = [{ :text => "this contains " }, { :text => "italic", :styles => [:italic] }, { :text => " text" }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render contents = PDF::Inspector::Text.analyze(@pdf.render) fonts = contents.font_settings.map { |e| e[:name] } expect(fonts).to eq([:Helvetica, :"Helvetica-Oblique", :Helvetica]) end it "should be able to set subscript" do create_pdf array = [{ :text => "this contains " }, { :text => "subscript", :size => 18, :styles => [:subscript] }, { :text => " text" }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render contents = PDF::Inspector::Text.analyze(@pdf.render) expect(contents.font_settings[0][:size]).to eq(12) expect(contents.font_settings[1][:size]).to be_within(0.0001).of(18 * 0.583) end it "should be able to set superscript" do create_pdf array = [{ :text => "this contains " }, { :text => "superscript", :size => 18, :styles => [:superscript] }, { :text => " text" }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render contents = PDF::Inspector::Text.analyze(@pdf.render) expect(contents.font_settings[0][:size]).to eq(12) expect(contents.font_settings[1][:size]).to be_within(0.0001).of(18 * 0.583) end it "should be able to set compound bold and italic text" do create_pdf array = [{ :text => "this contains " }, { :text => "bold italic", :styles => [:bold, :italic] }, { :text => " text" }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render contents = PDF::Inspector::Text.analyze(@pdf.render) fonts = contents.font_settings.map { |e| e[:name] } expect(fonts).to eq([:Helvetica, :"Helvetica-BoldOblique", :Helvetica]) end it "should be able to underline" do create_pdf array = [{ :text => "this contains " }, { :text => "underlined", :styles => [:underline] }, { :text => " text" }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render line_drawing = PDF::Inspector::Graphics::Line.analyze(@pdf.render) expect(line_drawing.points.length).to eq(2) end it "should be able to strikethrough" do create_pdf array = [{ :text => "this contains " }, { :text => "struckthrough", :styles => [:strikethrough] }, { :text => " text" }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render line_drawing = PDF::Inspector::Graphics::Line.analyze(@pdf.render) expect(line_drawing.points.length).to eq(2) end it "should be able to add URL links" do create_pdf expect(@pdf).to receive(:link_annotation).with(kind_of(Array), :Border => [0, 0, 0], :A => { :Type => :Action, :S => :URI, :URI => "http://example.com" }) array = [{ :text => "click " }, { :text => "here", :link => "http://example.com" }, { :text => " to visit" }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render end it "should be able to add destination links" do create_pdf expect(@pdf).to receive(:link_annotation).with(kind_of(Array), :Border => [0, 0, 0], :Dest => "ToC") array = [{ :text => "Go to the " }, { :text => "Table of Contents", :anchor => "ToC" }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render end it "should be able to add local actions" do create_pdf expect(@pdf).to receive(:link_annotation).with(kind_of(Array), :Border => [0, 0, 0], :A => { :Type => :Action, :S => :Launch, :F => "../example.pdf", :NewWindow => true }) array = [{ :text => "click " }, { :text => "here", :local => "../example.pdf" }, { :text => " to open a local file" }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render end it "should be able to set font size" do create_pdf array = [{ :text => "this contains " }, { :text => "sized", :size => 24 }, { :text => " text" }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render contents = PDF::Inspector::Text.analyze(@pdf.render) expect(contents.font_settings[0][:size]).to eq(12) expect(contents.font_settings[1][:size]).to eq(24) end it "should set the baseline based on the tallest fragment on a given line" do create_pdf array = [{ :text => "this contains " }, { :text => "sized", :size => 24 }, { :text => " text" }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render @pdf.font_size(24) do expect(text_box.height).to be_within(0.001).of(@pdf.font.ascender + @pdf.font.descender) end end it "should be able to set color via an rgb hex string" do create_pdf array = [{ :text => "rgb", :color => "ff0000" }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render) expect(colors.fill_color_count).to eq(2) expect(colors.stroke_color_count).to eq(2) end it "should be able to set color using a cmyk array" do create_pdf array = [{ :text => "cmyk", :color => [100, 0, 0, 0] }] text_box = Prawn::Text::Formatted::Box.new(array, :document => @pdf) text_box.render colors = PDF::Inspector::Graphics::Color.analyze(@pdf.render) expect(colors.fill_color_count).to eq(2) expect(colors.stroke_color_count).to eq(2) end end describe "Text::Formatted::Box#render(:dry_run => true)" do it "should not change the graphics state of the document" do create_pdf state_before = PDF::Inspector::Graphics::Color.analyze(@pdf.render) fill_color_count = state_before.fill_color_count stroke_color_count = state_before.stroke_color_count stroke_color_space_count = state_before.stroke_color_space_count array = [{ :text => 'Foo', :color => [0, 0, 0, 100] }] options = { :document => @pdf } text_box = Prawn::Text::Formatted::Box.new(array, options) text_box.render(:dry_run => true) state_after = PDF::Inspector::Graphics::Color.analyze(@pdf.render) expect(state_after.fill_color_count).to eq(fill_color_count) expect(state_after.stroke_color_count).to eq(stroke_color_count) expect(state_after.stroke_color_space_count).to eq(stroke_color_space_count) end end describe "Text::Formatted::Box#render with fragment level :character_spacing option" do it "should draw the character spacing to the document" do create_pdf array = [{ :text => "hello world", :character_spacing => 7 }] options = { :document => @pdf } text_box = Prawn::Text::Formatted::Box.new(array, options) text_box.render contents = PDF::Inspector::Text.analyze(@pdf.render) expect(contents.character_spacing[0]).to eq(7) end it "should draw the character spacing to the document" do create_pdf array = [{ :text => "hello world", :font => "Courier", :character_spacing => 10 }] options = { :document => @pdf, :width => 100, :overflow => :expand } text_box = Prawn::Text::Formatted::Box.new(array, options) text_box.render expect(text_box.text).to eq("hello\nworld") end end describe "Text::Formatted::Box#render with :align => :justify" do it "should not justify the last line of a paragraph" do create_pdf array = [{ :text => "hello world " }, { :text => "\n" }, { :text => "goodbye" }] options = { :document => @pdf, :align => :justify } text_box = Prawn::Text::Formatted::Box.new(array, options) text_box.render contents = PDF::Inspector::Text.analyze(@pdf.render) expect(contents.word_spacing).to be_empty end end describe "Text::Formatted::Box#render with :valign => :center" do it "should have a bottom gap equal to baseline and bottom of box" do create_pdf box_height = 100 y = 450 array = [{ :text => 'Vertical Align' }] options = { :document => @pdf, :valign => :center, :at => [0, y], :width => 100, :height => box_height, :size => 16 } text_box = Prawn::Text::Formatted::Box.new(array, options) text_box.render line_padding = (box_height - text_box.height + text_box.descender) * 0.5 baseline = y - line_padding expect(text_box.at[1]).to be_within(0.01).of(baseline) end end describe "Text::Formatted::Box#render with :valign => :bottom" do it "should not render a gap between the text and bottom of box" do create_pdf box_height = 100 y = 450 array = [{ :text => 'Vertical Align' }] options = { :document => @pdf, :valign => :bottom, :at => [0, y], :width => 100, :height => box_height, :size => 16 } text_box = Prawn::Text::Formatted::Box.new(array, options) text_box.render top_padding = y - (box_height - text_box.height) expect(text_box.at[1]).to be_within(0.01).of(top_padding) end end class TestFragmentCallback def initialize(string, number, options) @document = options[:document] end def render_behind(fragment) end def render_in_front(fragment) end end class TestFragmentCallbackBehind def initialize(string, number, options) @document = options[:document] end def render_behind(fragment) end end class TestFragmentCallbackInFront def initialize(string, number, options) @document = options[:document] end def render_in_front(fragment) end end module TestFormattedWrapOverride def wrap(array) initialize_wrap([{ :text => 'all your base are belong to us' }]) line_to_print = @line_wrap.wrap_line(:document => @document, :kerning => @kerning, :width => 10000, :arranger => @arranger) fragment = @arranger.retrieve_fragment format_and_draw_fragment(fragment, 0, @line_wrap.width, 0) [] end end ruby-prawn-2.1.0.orig/spec/bounding_box_spec.rb0000644000000000000000000003623712665203156020244 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "A bounding box" do before(:each) do @x = 100 @y = 125 @width = 50 @height = 75 @box = Prawn::Document::BoundingBox.new(nil, nil, [@x, @y], :width => @width, :height => @height) end it "should have an anchor at (x, y - height)" do expect(@box.anchor).to eq([@x, @y - @height]) end it "should have a left boundary of 0" do expect(@box.left).to eq(0) end it "should have a right boundary equal to the width" do expect(@box.right).to eq(@width) end it "should have a top boundary of height" do expect(@box.top).to eq(@height) end it "should have a bottom boundary of 0" do expect(@box.bottom).to eq(0) end it "should have a top-left of [0,height]" do expect(@box.top_left).to eq([0, @height]) end it "should have a top-right of [width,height]" do expect(@box.top_right).to eq([@width, @height]) end it "should have a bottom-left of [0,0]" do expect(@box.bottom_left).to eq([0, 0]) end it "should have a bottom-right of [width,0]" do expect(@box.bottom_right).to eq([@width, 0]) end it "should have an absolute left boundary of x" do expect(@box.absolute_left).to eq(@x) end it "should have an absolute right boundary of x + width" do expect(@box.absolute_right).to eq(@x + @width) end it "should have an absolute top boundary of y" do expect(@box.absolute_top).to eq(@y) end it "should have an absolute bottom boundary of y - height" do expect(@box.absolute_bottom).to eq(@y - @height) end it "should have an absolute bottom-left of [x,y-height]" do expect(@box.absolute_bottom_left).to eq([@x, @y - @height]) end it "should have an absolute bottom-right of [x+width,y-height]" do expect(@box.absolute_bottom_right).to eq([@x + @width , @y - @height]) end it "should have an absolute top-left of [x,y]" do expect(@box.absolute_top_left).to eq([@x, @y]) end it "should have an absolute top-right of [x+width,y]" do expect(@box.absolute_top_right).to eq([@x + @width, @y]) end it "should require width to be set" do expect do Prawn::Document::BoundingBox.new(nil, nil, [100, 100]) end.to raise_error(ArgumentError) end it "should raise_error an ArgumentError if a block is not passed" do pdf = Prawn::Document.new expect do pdf.bounding_box([0, 0], :width => 200) end.to raise_error(ArgumentError) end end describe "drawing bounding boxes" do before(:each) { create_pdf } it "should not stomp on the arguments to bounding_box" do pdf = Prawn::Document.new x = [100, 500] pdf.bounding_box x, :width => 100 do pdf.text "bork-bork-bork" end expect(x).to eq([100, 500]) end it "should restore Document#bounds to the correct margin box on exit" do pdf = Prawn::Document.new(:margin => 200) # add a multi-page bounding box pdf.bounding_box([100, pdf.bounds.top], :width => 400) do pdf.text "The rain in spain falls mainly in the plains.\n" * 30 end pdf.start_new_page(:margin => 0) x_min, y_min, x_max, y_max = pdf.page.dimensions expect(pdf.bounds.absolute_top_left).to eq([x_min, y_max]) expect(pdf.bounds.absolute_bottom_right).to eq([x_max, y_min]) end it "should restore the parent bounding box when calls are nested" do @pdf.bounding_box [100, 500], :width => 300, :height => 300 do expect(@pdf.bounds.absolute_top).to eq(500 + @pdf.margin_box.absolute_bottom) expect(@pdf.bounds.absolute_left).to eq(100 + @pdf.margin_box.absolute_left) parent_box = @pdf.bounds @pdf.bounding_box [50, 200], :width => 100, :height => 100 do expect(@pdf.bounds.absolute_top).to eq(200 + parent_box.absolute_bottom) expect(@pdf.bounds.absolute_left).to eq(50 + parent_box.absolute_left) end expect(@pdf.bounds.absolute_top).to eq(500 + @pdf.margin_box.absolute_bottom) expect(@pdf.bounds.absolute_left).to eq(100 + @pdf.margin_box.absolute_left) end end it "should calculate a height if none is specified" do @pdf.bounding_box([100, 500], :width => 100) do @pdf.text "The rain in Spain falls mainly on the plains." end expect(@pdf.y).to be_within(0.001).of(458.384) end it "should keep track of the max height the box was stretched to" do box = @pdf.bounding_box(@pdf.bounds.top_left, :width => 100) do @pdf.move_down 100 @pdf.move_up 15 end expect(box.height).to eq(100) end it "should advance the y-position by bbox.height by default" do orig_y = @pdf.y @pdf.bounding_box [0, @pdf.cursor], :width => @pdf.bounds.width, :height => 30 do @pdf.text "hello" end expect(@pdf.y).to be_within(0.001).of(orig_y - 30) end it "should not advance y-position if passed :hold_position => true" do orig_y = @pdf.y @pdf.bounding_box [0, @pdf.cursor], :width => @pdf.bounds.width, :hold_position => true do @pdf.text "hello" end # y only advances by height of one line ("hello") expect(@pdf.y).to be_within(0.001).of(orig_y - @pdf.height_of("hello")) end it "should not advance y-position of a stretchy bbox if it would stretch " \ "the bbox further" do bottom = @pdf.y = @pdf.margin_box.absolute_bottom @pdf.bounding_box [0, @pdf.margin_box.top], :width => @pdf.bounds.width do @pdf.y = bottom @pdf.text "hello" # starts a new page end expect(@pdf.page_count).to eq(2) # Restoring the position (to the absolute bottom) would stretch the bbox to # the bottom of the page, which we don't want. This should be equivalent to # a bbox with :hold_position => true, where we only advance by the amount # that was actually drawn. expect(@pdf.y).to be_within(0.001).of( @pdf.margin_box.absolute_top - @pdf.height_of("hello") ) end end describe "Indentation" do before(:each) { create_pdf } it "should temporarily shift the x coordinate and width" do @pdf.bounding_box([100, 100], :width => 200) do @pdf.indent(20) do expect(@pdf.bounds.absolute_left).to eq(120) expect(@pdf.bounds.width).to eq(180) end end end it "should restore the x coordinate and width after block exits" do @pdf.bounding_box([100, 100], :width => 200) do @pdf.indent(20) do # no-op end expect(@pdf.bounds.absolute_left).to eq(100) expect(@pdf.bounds.width).to eq(200) end end it "should restore the x coordinate and width on error" do @pdf.bounding_box([100, 100], :width => 200) do begin @pdf.indent(20) { fail } rescue expect(@pdf.bounds.absolute_left).to eq(100) expect(@pdf.bounds.width).to eq(200) end end end it "should maintain left indentation across a page break" do original_left = @pdf.bounds.absolute_left @pdf.indent(20) do expect(@pdf.bounds.absolute_left).to eq(original_left + 20) @pdf.start_new_page expect(@pdf.bounds.absolute_left).to eq(original_left + 20) end expect(@pdf.bounds.absolute_left).to eq(original_left) end it "should maintain right indentation across a page break" do original_width = @pdf.bounds.width @pdf.indent(0, 20) do expect(@pdf.bounds.width).to eq(original_width - 20) @pdf.start_new_page expect(@pdf.bounds.width).to eq(original_width - 20) end expect(@pdf.bounds.width).to eq(original_width) end it "optionally allows adjustment of the right bound as well" do @pdf.bounding_box([100, 100], :width => 200) do @pdf.indent(20, 30) do expect(@pdf.bounds.absolute_left).to eq(120) expect(@pdf.bounds.width).to eq(150) end expect(@pdf.bounds.absolute_left).to eq(100) expect(@pdf.bounds.width).to eq(200) end end describe "in a ColumnBox" do it "should subtract the given indentation from the available width" do @pdf.column_box([0, @pdf.cursor], :width => @pdf.bounds.width, :height => 200, :columns => 2, :spacer => 20) do width = @pdf.bounds.width @pdf.indent(20) do expect(@pdf.bounds.width).to be_within(0.01).of(width - 20) end end end it "should subtract right padding from the available width" do @pdf.column_box([0, @pdf.cursor], :width => @pdf.bounds.width, :height => 200, :columns => 2, :spacer => 20) do width = @pdf.bounds.width @pdf.indent(20, 30) do expect(@pdf.bounds.width).to be_within(0.01).of(width - 50) end end end it "should maintain the same left indentation across column breaks" do @pdf.column_box([0, @pdf.cursor], :width => @pdf.bounds.width, :columns => 3, :spacer => 15) do 3.times do |column| x = @pdf.bounds.left_side @pdf.indent(20) do expect(@pdf.bounds.left_side).to eq(x + 20) end @pdf.bounds.move_past_bottom end end end it "should not change the right margin if only left indentation is requested" do @pdf.column_box([0, @pdf.cursor], :width => @pdf.bounds.width, :columns => 3, :spacer => 15) do 3.times do |column| x = @pdf.bounds.right_side @pdf.indent(20) do expect(@pdf.bounds.right_side).to eq(x) end @pdf.bounds.move_past_bottom end end end it "should maintain the same right indentation across columns" do @pdf.column_box([0, @pdf.cursor], :width => @pdf.bounds.width, :columns => 3, :spacer => 15) do 3.times do |column| x = @pdf.bounds.right_side @pdf.indent(20, 10) do expect(@pdf.bounds.right_side).to eq(x - 10) end @pdf.bounds.move_past_bottom end end end it "should keep the right indentation after nesting indents" do @pdf.column_box([0, @pdf.cursor], :width => @pdf.bounds.width, :columns => 3, :spacer => 15) do 3.times do |column| # I am giving a right indent of 10... @pdf.indent(20, 10) do x = @pdf.bounds.right_side # ...and no right indent here... @pdf.indent(20) do # right indent is inherited from the parent! expect(@pdf.bounds.right_side).to eq(x) end end @pdf.bounds.move_past_bottom end end end it "should revert the right indentation if negative indent is given in nested indent" do @pdf.column_box([0, @pdf.cursor], :width => @pdf.bounds.width, :columns => 3, :spacer => 15) do 3.times do |column| x = @pdf.bounds.right_side @pdf.indent(20, 10) do # requesting a negative right-indent of equivalent size... @pdf.indent(20, -10) do # ...resets the right margin to that of the column! expect(@pdf.bounds.right_side).to eq(x) end end @pdf.bounds.move_past_bottom end end end it "should reduce the available column width by the sum of all nested indents" do @pdf.column_box([0, @pdf.cursor], :width => @pdf.bounds.width, :columns => 3, :spacer => 15) do 3.times do |column| w = @pdf.bounds.width @pdf.indent(20, 10) do @pdf.indent(20, 10) do expect(@pdf.bounds.width).to eq(w - 60) end end @pdf.bounds.move_past_bottom end end end end end describe "A canvas" do before(:each) { create_pdf } it "should use whatever the last set y position is" do @pdf.canvas do @pdf.bounding_box([100, 500], :width => 200) { @pdf.move_down 50 } end expect(@pdf.y).to eq(450) end it "should restore the original ypos after execution", :issue => 523 do doc = Prawn::Document.new(:skip_page_creation => true) doc.start_new_page original_ypos = doc.y doc.canvas {} expect(doc.y).to eq(original_ypos) end end describe "Deep-copying" do it "should create a new object that does not copy @document" do Prawn::Document.new do |pdf| orig = pdf.bounds copy = orig.deep_copy expect(copy).not_to eq(pdf.bounds) expect(copy.document).to be_nil end end it "should deep-copy parent bounds" do Prawn::Document.new do |pdf| outside = pdf.bounds pdf.bounding_box [100, 100], :width => 100 do copy = pdf.bounds.deep_copy # the parent bounds should have the same parameters expect(copy.parent.width).to eq(outside.width) expect(copy.parent.height).to eq(outside.height) # but should not be the same object expect(copy.parent).not_to eq(outside) end end end end describe "Prawn::Document#reference_bounds" do before(:each) { create_pdf } it "should return self for non-stretchy bounds" do @pdf.bounding_box([0, @pdf.cursor], :width => 100, :height => 100) do expect(@pdf.reference_bounds).to eq(@pdf.bounds) end end it "should return the parent bounds if in a stretchy box" do @pdf.bounding_box([0, @pdf.cursor], :width => 100, :height => 100) do correct_bounds = @pdf.bounds @pdf.bounding_box([0, @pdf.cursor], :width => 100) do expect(@pdf.reference_bounds).to eq(correct_bounds) end end end it "should find the non-stretchy box through 2 levels" do @pdf.bounding_box([0, @pdf.cursor], :width => 100, :height => 100) do correct_bounds = @pdf.bounds @pdf.bounding_box([0, @pdf.cursor], :width => 100) do @pdf.bounding_box([0, @pdf.cursor], :width => 100) do expect(@pdf.reference_bounds).to eq(correct_bounds) end end end end it "should return the margin box if there's no explicit bbox" do expect(@pdf.reference_bounds).to eq(@pdf.margin_box) @pdf.bounding_box([0, @pdf.cursor], :width => 100) do expect(@pdf.reference_bounds).to eq(@pdf.margin_box) end end it "should return the canvas box if we're in a canvas" do @pdf.canvas do canvas_box = @pdf.bounds expect(@pdf.reference_bounds).to eq(canvas_box) @pdf.bounding_box([0, @pdf.cursor], :width => 100) do expect(@pdf.reference_bounds).to eq(canvas_box) end end end end describe "BoundingBox#move_past_bottom" do before(:each) { create_pdf } it "should ordinarily start a new page" do @pdf.bounds.move_past_bottom @pdf.text "Foo" pages = PDF::Inspector::Page.analyze(@pdf.render).pages expect(pages.size).to eq(2) expect(pages[0][:strings]).to eq([]) expect(pages[1][:strings]).to eq(["Foo"]) end it "should move to the top of the next page if it exists already" do # save away the y-position at the top of a page top_y = @pdf.y # create a blank page but go to the page before it @pdf.start_new_page @pdf.go_to_page 1 @pdf.text "Foo" @pdf.bounds.move_past_bottom expect(@pdf.y).to be_within(0.001).of(top_y) @pdf.text "Bar" pages = PDF::Inspector::Page.analyze(@pdf.render).pages expect(pages.size).to eq(2) expect(pages[0][:strings]).to eq(["Foo"]) expect(pages[1][:strings]).to eq(["Bar"]) end end ruby-prawn-2.1.0.orig/spec/destinations_spec.rb0000644000000000000000000000054012665203156020257 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "When creating destinations" do before(:each) { create_pdf } it "should add entry to Dests name tree" do expect(@pdf.dests.data.empty?).to eq(true) @pdf.add_dest "candy", "chocolate" expect(@pdf.dests.data.size).to eq(1) end end ruby-prawn-2.1.0.orig/spec/transparency_spec.rb0000644000000000000000000000556312665203156020276 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") module TransparencyHelper def make_transparent(opacity, stroke_opacity = opacity) @pdf.transparent(opacity, stroke_opacity) do yield if block_given? end end end describe "Document with transparency" do include TransparencyHelper it "the PDF version should be at least 1.4" do create_pdf make_transparent(0.5) str = @pdf.render expect(str[0, 8]).to eq("%PDF-1.4") end it "a new extended graphics state should be created for " \ "each unique transparency setting" do create_pdf make_transparent(0.5, 0.2) do make_transparent(0.5, 0.75) end extgstates = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates expect(extgstates.length).to eq(2) end it "a new extended graphics state should not be created for " \ "each duplicate transparency setting" do create_pdf make_transparent(0.5, 0.75) do make_transparent(0.5, 0.75) end extgstates = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates expect(extgstates.length).to eq(1) end it "setting the transparency with only one parameter sets the transparency" \ " for both the fill and the stroke" do create_pdf make_transparent(0.5) extgstate = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates[0] expect(extgstate[:opacity]).to eq(0.5) expect(extgstate[:stroke_opacity]).to eq(0.5) end it "setting the transparency with a numerical parameter and " \ "a :stroke should set the fill transparency to the numerical parameter " \ "and the stroke transparency to the option" do create_pdf make_transparent(0.5, 0.2) extgstate = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates[0] expect(extgstate[:opacity]).to eq(0.5) expect(extgstate[:stroke_opacity]).to eq(0.2) end it "should enforce the valid range of 0.0 to 1.0" do create_pdf make_transparent(-0.5, -0.2) extgstate = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates[0] expect(extgstate[:opacity]).to eq(0.0) expect(extgstate[:stroke_opacity]).to eq(0.0) create_pdf make_transparent(2.0, 3.0) extgstate = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates[0] expect(extgstate[:opacity]).to eq(1.0) expect(extgstate[:stroke_opacity]).to eq(1.0) end describe "with more than one page" do include TransparencyHelper it "the extended graphic state resource should be added to both pages" do create_pdf make_transparent(0.5, 0.2) @pdf.start_new_page make_transparent(0.5, 0.2) extgstates = PDF::Inspector::ExtGState.analyze(@pdf.render).extgstates extgstate = extgstates[0] expect(extgstates.length).to eq(2) expect(extgstate[:opacity]).to eq(0.5) expect(extgstate[:stroke_opacity]).to eq(0.2) end end end ruby-prawn-2.1.0.orig/spec/security_spec.rb0000644000000000000000000001266312665203156017433 0ustar rootroot# encoding: utf-8 require "tempfile" require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "Document encryption" do describe "Password padding" do include Prawn::Document::Security it "should truncate long passwords" do pw = "Long long string" * 30 padded = pad_password(pw) expect(padded.length).to eq(32) expect(padded).to eq(pw[0, 32]) end it "should pad short passwords" do pw = "abcd" padded = pad_password(pw) expect(padded.length).to eq(32) expect(padded).to eq(pw + Prawn::Document::Security::PasswordPadding[0, 28]) end it "should fully pad null passwords" do pw = "" padded = pad_password(pw) expect(padded.length).to eq(32) expect(padded).to eq(Prawn::Document::Security::PasswordPadding) end end describe "Setting permissions" do def doc_with_permissions(permissions) pdf = Prawn::Document.new class << pdf # Make things easier to test public :permissions_value end pdf.encrypt_document(:permissions => permissions) pdf end it "should default to full permissions" do expect(doc_with_permissions({}).permissions_value).to eq(0xFFFFFFFF) expect(doc_with_permissions(:print_document => true, :modify_contents => true, :copy_contents => true, :modify_annotations => true).permissions_value). to eq(0xFFFFFFFF) end it "should clear the appropriate bits for each permission flag" do expect(doc_with_permissions(:print_document => false).permissions_value). to eq(0b1111_1111_1111_1111_1111_1111_1111_1011) expect(doc_with_permissions(:modify_contents => false).permissions_value). to eq(0b1111_1111_1111_1111_1111_1111_1111_0111) expect(doc_with_permissions(:copy_contents => false).permissions_value). to eq(0b1111_1111_1111_1111_1111_1111_1110_1111) expect(doc_with_permissions(:modify_annotations => false).permissions_value). to eq(0b1111_1111_1111_1111_1111_1111_1101_1111) end it "should raise_error ArgumentError if invalid option is provided" do expect { doc_with_permissions(:modify_document => false) }.to raise_error(ArgumentError) end end describe "Encryption keys" do # Since PDF::Reader doesn't read encrypted PDF files, we just take the # roundabout method of verifying each step of the encryption. This works # fine because the encryption method is deterministic. before(:each) do @pdf = Prawn::Document.new class << @pdf public :owner_password_hash, :user_password_hash, :user_encryption_key end @pdf.encrypt_document :user_password => 'foo', :owner_password => 'bar', :permissions => { :print_document => false } end it "should calculate the correct owner hash" do expect(@pdf.owner_password_hash.unpack("H*").first).to match(/^61CA855012/i) end it "should calculate the correct user hash" do expect(@pdf.user_password_hash.unpack("H*").first).to match(/^6BC8C51031/i) end it "should calculate the correct user_encryption_key" do expect(@pdf.user_encryption_key.unpack("H*").first.upcase).to eq("B100AB6429") end end describe "EncryptedPdfObject" do it "should delegate to PdfObject for simple types" do expect(PDF::Core::EncryptedPdfObject(true, nil, nil, nil)).to eq("true") expect(PDF::Core::EncryptedPdfObject(42, nil, nil, nil)).to eq("42") end it "should encrypt strings properly" do expect(PDF::Core::EncryptedPdfObject("foo", "12345", 123, 0)).to eq("<4ad6e3>") end it "should encrypt literal strings properly" do expect(PDF::Core::EncryptedPdfObject(PDF::Core::LiteralString.new("foo"), "12345", 123, 0)).to eq(bin_string("(J\xD6\xE3)")) expect(PDF::Core::EncryptedPdfObject(PDF::Core::LiteralString.new("lhfbqg3do5u0satu3fjf"), nil, 123, 0)).to eq(bin_string("(\xF1\x8B\\(\b\xBB\xE18S\x130~4*#\\(%\x87\xE7\x8E\\\n)")) end it "should encrypt time properly" do expect(PDF::Core::EncryptedPdfObject(Time.utc(2050, 04, 26, 10, 17, 10), "12345", 123, 0)).to eq(bin_string("(h\x83\xBE\xDC\xEC\x99\x0F\xD7\\)%\x13\xD4$\xB8\xF0\x16\xB8\x80\xC5\xE91+\xCF)")) end it "should properly handle compound types" do expect(PDF::Core::EncryptedPdfObject({ :Bar => "foo" }, "12345", 123, 0)).to eq( "<< /Bar <4ad6e3>\n>>" ) expect(PDF::Core::EncryptedPdfObject(["foo", "bar"], "12345", 123, 0)).to eq( "[<4ad6e3> <4ed8fe>]" ) end end describe "Reference#encrypted_object" do it "should encrypt references properly" do ref = PDF::Core::Reference(1, ["foo"]) expect(ref.encrypted_object(nil)).to eq("1 0 obj\n[<4fca3f>]\nendobj\n") end it "should encrypt references with streams properly" do ref = PDF::Core::Reference(1, {}) ref << 'foo' result = bin_string("1 0 obj\n<< /Length 3\n>>\nstream\nO\xCA?\nendstream\nendobj\n") expect(ref.encrypted_object(nil)).to eq(result) end end describe "String#encrypted_object" do it "should encrypt stream properly" do stream = PDF::Core::Stream.new stream << "foo" result = bin_string("stream\nO\xCA?\nendstream\n") expect(stream.encrypted_object(nil, 1, 0)).to eq(result) end end end ruby-prawn-2.1.0.orig/spec/stroke_styles_spec.rb0000644000000000000000000001435512665203156020476 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "When stroking with default settings" do before(:each) { create_pdf } it "cap_style should be :butt" do expect(@pdf.cap_style).to eq(:butt) end it "join_style should be :miter" do expect(@pdf.join_style).to eq(:miter) end it "dashed? should be_false" do expect(@pdf).not_to be_dashed end end describe "Cap styles" do before(:each) { create_pdf } it "should be able to use assignment operator" do @pdf.cap_style = :round expect(@pdf.cap_style).to eq(:round) end describe "#cap_style(:butt)" do it "rendered PDF should include butt style cap" do @pdf.cap_style(:butt) cap_style = PDF::Inspector::Graphics::CapStyle.analyze(@pdf.render).cap_style expect(cap_style).to eq(0) end end describe "#cap_style(:round)" do it "rendered PDF should include round style cap" do @pdf.cap_style(:round) cap_style = PDF::Inspector::Graphics::CapStyle.analyze(@pdf.render).cap_style expect(cap_style).to eq(1) end end describe "#cap_style(:projecting_square)" do it "rendered PDF should include projecting_square style cap" do @pdf.cap_style(:projecting_square) cap_style = PDF::Inspector::Graphics::CapStyle.analyze(@pdf.render).cap_style expect(cap_style).to eq(2) end end it "should carry the current cap style settings over to new pages" do @pdf.cap_style(:round) @pdf.start_new_page cap_styles = PDF::Inspector::Graphics::CapStyle.analyze(@pdf.render) expect(cap_styles.cap_style_count).to eq(2) expect(cap_styles.cap_style).to eq(1) end end describe "Join styles" do before(:each) { create_pdf } it "should be able to use assignment operator" do @pdf.join_style = :round expect(@pdf.join_style).to eq(:round) end describe "#join_style(:miter)" do it "rendered PDF should include miter style join" do @pdf.join_style(:miter) join_style = PDF::Inspector::Graphics::JoinStyle.analyze(@pdf.render).join_style expect(join_style).to eq(0) end end describe "#join_style(:round)" do it "rendered PDF should include round style join" do @pdf.join_style(:round) join_style = PDF::Inspector::Graphics::JoinStyle.analyze(@pdf.render).join_style expect(join_style).to eq(1) end end describe "#join_style(:bevel)" do it "rendered PDF should include bevel style join" do @pdf.join_style(:bevel) join_style = PDF::Inspector::Graphics::JoinStyle.analyze(@pdf.render).join_style expect(join_style).to eq(2) end end it "should carry the current join style settings over to new pages" do @pdf.join_style(:round) @pdf.start_new_page join_styles = PDF::Inspector::Graphics::JoinStyle.analyze(@pdf.render) expect(join_styles.join_style_count).to eq(2) expect(join_styles.join_style).to eq(1) end end describe "Dashes" do before(:each) { create_pdf } it "should be able to use assignment operator" do @pdf.dash = 2 expect(@pdf).to be_dashed end describe "setting a dash" do it "dashed? should be_true" do @pdf.dash(2) expect(@pdf).to be_dashed end it "rendered PDF should include a stroked dash" do @pdf.dash(2) dashes = PDF::Inspector::Graphics::Dash.analyze(@pdf.render) expect(dashes.stroke_dash).to eq([[2, 2], 0]) end end describe "setting a dash by passing a single argument" do it "space between dashes should be the same length as the dash in the rendered PDF" do @pdf.dash(2) dashes = PDF::Inspector::Graphics::Dash.analyze(@pdf.render) expect(dashes.stroke_dash).to eq([[2, 2], 0]) end end describe "with a space option that differs from the first argument" do it "space between dashes in the rendered PDF should be different length than the length of the dash" do @pdf.dash(2, :space => 3) dashes = PDF::Inspector::Graphics::Dash.analyze(@pdf.render) expect(dashes.stroke_dash).to eq([[2, 3], 0]) end end describe "with a non-zero phase option" do it "rendered PDF should include a non-zero phase" do @pdf.dash(2, :phase => 1) dashes = PDF::Inspector::Graphics::Dash.analyze(@pdf.render) expect(dashes.stroke_dash).to eq([[2, 2], 1]) end end describe "setting a dash by using an array" do it "dash and spaces should be set from the array" do @pdf.dash([1, 2, 3, 4]) dashes = PDF::Inspector::Graphics::Dash.analyze(@pdf.render) expect(dashes.stroke_dash).to eq([[1, 2, 3, 4], 0]) end it "space options has to be ignored" do @pdf.dash([1, 2, 3, 4], :space => 3) dashes = PDF::Inspector::Graphics::Dash.analyze(@pdf.render) expect(dashes.stroke_dash).to eq([[1, 2, 3, 4], 0]) end it "phase options should be correctly used" do @pdf.dash([1, 2, 3, 4], :phase => 3) dashes = PDF::Inspector::Graphics::Dash.analyze(@pdf.render) expect(dashes.stroke_dash).to eq([[1, 2, 3, 4], 3]) end end describe "clearing stroke dash" do it "should restore solid line" do @pdf.dash(2) @pdf.undash dashes = PDF::Inspector::Graphics::Dash.analyze(@pdf.render) expect(dashes.stroke_dash).to eq([[], 0]) end end it "should carry the current dash settings over to new pages" do @pdf.dash(2) @pdf.start_new_page dashes = PDF::Inspector::Graphics::Dash.analyze(@pdf.render) expect(dashes.stroke_dash_count).to eq(2) expect(dashes.stroke_dash).to eq([[2, 2], 0]) end describe "#dashed?" do it "an initial document should not be dashed" do expect(@pdf.dashed?).to eq(false) end it "should return true if any of the currently active settings are dashed" do @pdf.dash(2) @pdf.save_graphics_state expect(@pdf.dashed?).to eq(true) end it "should return false if the document was most recently undashed" do @pdf.dash(2) @pdf.save_graphics_state @pdf.undash @pdf.save_graphics_state expect(@pdf.dashed?).to eq(false) end it "should return true when restoring to a state that was dashed" do @pdf.dash(2) @pdf.save_graphics_state @pdf.undash @pdf.restore_graphics_state expect(@pdf.dashed?).to eq(true) end end end ruby-prawn-2.1.0.orig/spec/images_spec.rb0000644000000000000000000001252312665203156017024 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") require 'set' require 'pathname' describe "the image() function" do before(:each) do @filename = "#{Prawn::DATADIR}/images/pigs.jpg" create_pdf end it "should only embed an image once, even if it's added multiple times" do @pdf.image @filename, :at => [100, 100] @pdf.image @filename, :at => [300, 300] output = @pdf.render images = PDF::Inspector::XObject.analyze(output) # there should be 2 images in the page resources expect(images.page_xobjects.first.size).to eq(2) # but only 1 image xobject expect(output.scan(/\/Type \/XObject/).size).to eq(1) end it "should return the image info object" do info = @pdf.image(@filename) expect(info).to be_a_kind_of(Prawn::Images::JPG) expect(info.height).to eq(453) end it "should accept IO objects" do file = File.open(@filename, "rb") info = @pdf.image(file) expect(info.height).to eq(453) end it "rewinds IO objects to be able to embed them multiply" do file = File.open(@filename, "rb") @pdf.image(file) info = @pdf.image(file) expect(info.height).to eq(453) end it "should accept Pathname objects" do info = @pdf.image(Pathname.new(@filename)) expect(info.height).to eq(453) end context "setting the length of the bytestream" do it "should correctly work with images from Pathname objects" do info = @pdf.image(Pathname.new(@filename)) expect(@pdf).to have_parseable_xobjects end it "should correctly work with images from IO objects" do info = @pdf.image(File.open(@filename, 'rb')) expect(@pdf).to have_parseable_xobjects end it "should correctly work with images from IO objects not set to mode rb" do info = @pdf.image(File.open(@filename, 'r')) expect(@pdf).to have_parseable_xobjects end end it "should raise_error an UnsupportedImageType if passed a BMP" do filename = "#{Prawn::DATADIR}/images/tru256.bmp" expect { @pdf.image filename, :at => [100, 100] }.to raise_error(Prawn::Errors::UnsupportedImageType) end it "should raise_error an UnsupportedImageType if passed an interlaced PNG" do filename = "#{Prawn::DATADIR}/images/dice_interlaced.png" expect { @pdf.image filename, :at => [100, 100] }.to raise_error(Prawn::Errors::UnsupportedImageType) end it "should bump PDF version to 1.5 or greater on embedding 16-bit PNGs" do @pdf.image "#{Prawn::DATADIR}/images/16bit.png" expect(@pdf.state.version).to be >= 1.5 end it "should embed 16-bit alpha channels for 16-bit PNGs" do @pdf.image "#{Prawn::DATADIR}/images/16bit.png" output = @pdf.render expect(output).to match(/\/BitsPerComponent 16/) expect(output).not_to match(/\/BitsPerComponent 8/) end it "should flow an image to a new page if it will not fit on a page" do @pdf.image @filename, :fit => [600, 600] @pdf.image @filename, :fit => [600, 600] output = StringIO.new(@pdf.render, 'r+') hash = PDF::Reader::ObjectHash.new(output) pages = hash.values.find { |obj| obj.is_a?(Hash) && obj[:Type] == :Pages }[:Kids] expect(pages.size).to eq(2) expect(hash[pages[0]][:Resources][:XObject].keys).to eq([:I1]) expect(hash[pages[1]][:Resources][:XObject].keys).to eq([:I2]) end it "should not flow an image to a new page if it will fit on one page" do @pdf.image @filename, :fit => [400, 400] @pdf.image @filename, :fit => [400, 400] output = StringIO.new(@pdf.render, 'r+') hash = PDF::Reader::ObjectHash.new(output) pages = hash.values.find { |obj| obj.is_a?(Hash) && obj[:Type] == :Pages }[:Kids] expect(pages.size).to eq(1) expect(Set.new(hash[pages[0]][:Resources][:XObject].keys)).to eq( Set.new([:I1, :I2]) ) end it "should not start a new page just for a stretchy bounding box" do expect(@pdf).to_not receive(:start_new_page) @pdf.bounding_box([0, @pdf.cursor], :width => @pdf.bounds.width) do @pdf.image @filename end end describe ":fit option" do it "should fit inside the defined constraints" do info = @pdf.image @filename, :fit => [100, 400] expect(info.scaled_width).to be <= 100 expect(info.scaled_height).to be <= 400 info = @pdf.image @filename, :fit => [400, 100] expect(info.scaled_width).to be <= 400 expect(info.scaled_height).to be <= 100 info = @pdf.image @filename, :fit => [604, 453] expect(info.scaled_width).to eq(604) expect(info.scaled_height).to eq(453) end it "should move text position" do @y = @pdf.y info = @pdf.image @filename, :fit => [100, 400] expect(@pdf.y).to be < @y end end describe ":at option" do it "should not move text position" do @y = @pdf.y info = @pdf.image @filename, :at => [100, 400] expect(@pdf.y).to eq(@y) end end describe ":width option without :height option" do it "scales the width and height" do info = @pdf.image @filename, :width => 225 expect(info.scaled_height).to eq(168.75) expect(info.scaled_width).to eq(225.0) end end describe ":height option without :width option" do it "scales the width and height" do info = @pdf.image @filename, :height => 225 expect(info.scaled_height).to eq(225.0) expect(info.scaled_width).to eq(300.0) end end end ruby-prawn-2.1.0.orig/spec/text_with_inline_formatting_spec.rb0000644000000000000000000000221512665203156023363 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "#formatted_text" do it "should draw text" do create_pdf string = "hello world" format_array = [:text => string] @pdf.formatted_text(format_array) # grab the text from the rendered PDF and ensure it matches text = PDF::Inspector::Text.analyze(@pdf.render) expect(text.strings.first).to eq(string) end end describe "#text with inline styling" do before(:each) { create_pdf } it "should automatically move to a new page if the tallest fragment" \ " on the next line won't fit in the available space" do create_pdf @pdf.move_cursor_to(@pdf.font.height) formatted = "this contains sized text" @pdf.text(formatted, :inline_format => true) pages = PDF::Inspector::Page.analyze(@pdf.render).pages expect(pages.size).to eq(2) end it "should embed links as literal strings" do @pdf.text "wiki", :inline_format => true expect(@pdf.render).to match(%r{/URI\s+\(http://wiki\.github\.com}) end end ruby-prawn-2.1.0.orig/spec/inline_formatted_text_parser_spec.rb0000644000000000000000000005317312665203156023530 0ustar rootroot# -*- coding: utf-8 -*- require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "Text::Formatted::Parser#format" do it "should handle sup" do string = "superscript" array = Prawn::Text::Formatted::Parser.format(string) expect(array[0]).to eq(:text => "superscript", :styles => [:superscript], :color => nil, :link => nil, :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => nil) end it "should handle sub" do string = "subscript" array = Prawn::Text::Formatted::Parser.format(string) expect(array[0]).to eq(:text => "subscript", :styles => [:subscript], :color => nil, :link => nil, :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => nil) end it "should handle rgb" do string = "red text" array = Prawn::Text::Formatted::Parser.format(string) expect(array[0]).to eq(:text => "red text", :styles => [], :color => "ff0000", :link => nil, :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => nil) end it "# should be optional in rgb" do string = "red text" array = Prawn::Text::Formatted::Parser.format(string) expect(array[0]).to eq(:text => "red text", :styles => [], :color => "ff0000", :link => nil, :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => nil) end it "should handle cmyk" do string = "magenta text" array = Prawn::Text::Formatted::Parser.format(string) expect(array[0]).to eq(:text => "magenta text", :styles => [], :color => [0, 100, 0, 0], :link => nil, :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => nil) end it "should handle fonts" do string = "Courier text" array = Prawn::Text::Formatted::Parser.format(string) expect(array[0]).to eq(:text => "Courier text", :styles => [], :color => nil, :link => nil, :anchor => nil, :local => nil, :font => "Courier", :size => nil, :character_spacing => nil) end it "should handle size" do string = "14 point text" array = Prawn::Text::Formatted::Parser.format(string) expect(array[0]).to eq(:text => "14 point text", :styles => [], :color => nil, :link => nil, :anchor => nil, :local => nil, :font => nil, :size => 14, :character_spacing => nil) end it "should handle character_spacing" do string = "extra character spacing" array = Prawn::Text::Formatted::Parser.format(string) expect(array[0]).to eq(:text => "extra character spacing", :styles => [], :color => nil, :link => nil, :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => 2.5) end it "should handle links" do string = "external link" array = Prawn::Text::Formatted::Parser.format(string) expect(array[0]).to eq(:text => "external link", :styles => [], :color => nil, :link => "http://example.com", :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => nil) end it "should handle local links" do string = "local link" array = Prawn::Text::Formatted::Parser.format(string) expect(array[0]).to eq(:text => "local link", :styles => [], :color => nil, :link => nil, :anchor => nil, :local => "/home/example/foo.bar", :font => nil, :size => nil, :character_spacing => nil) end it "should handle anchors" do string = "internal link" array = Prawn::Text::Formatted::Parser.format(string) expect(array[0]).to eq(:text => "internal link", :styles => [], :color => nil, :link => nil, :anchor => "ToC", :local => nil, :font => nil, :size => nil, :character_spacing => nil) end it "should handle higher order characters properly" do string = "©\n©" array = Prawn::Text::Formatted::Parser.format(string) expect(array[0]).to eq(:text => "©", :styles => [:bold], :color => nil, :link => nil, :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => nil) expect(array[1]).to eq(:text => "\n", :styles => [:bold], :color => nil, :link => nil, :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => nil) expect(array[2]).to eq(:text => "©", :styles => [:bold], :color => nil, :link => nil, :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => nil) end it "should convert < >, and & to <, >, and &, respectively" do string = "hello <, >, and &" array = Prawn::Text::Formatted::Parser.format(string) expect(array[1]).to eq(:text => "<, >, and &", :styles => [:bold], :color => nil, :link => nil, :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => nil) end it "should handle double qoutes around tag attributes" do string = 'some sized text' array = Prawn::Text::Formatted::Parser.format(string) expect(array[1]).to eq(:text => "sized", :styles => [], :color => nil, :link => nil, :anchor => nil, :local => nil, :font => nil, :size => 14, :character_spacing => nil) end it "should handle single qoutes around tag attributes" do string = "some sized text" array = Prawn::Text::Formatted::Parser.format(string) expect(array[1]).to eq(:text => "sized", :styles => [], :color => nil, :link => nil, :anchor => nil, :local => nil, :font => nil, :size => 14, :character_spacing => nil) end it "should construct a formatted text array from a string" do string = "hello world\nhow are you?" array = Prawn::Text::Formatted::Parser.format(string) expect(array[0]).to eq(:text => "hello ", :styles => [], :color => nil, :link => nil, :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => nil) expect(array[1]).to eq(:text => "world", :styles => [:bold], :color => nil, :link => nil, :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => nil) expect(array[2]).to eq(:text => "\n", :styles => [:bold], :color => nil, :link => nil, :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => nil) expect(array[3]).to eq(:text => "how ", :styles => [:bold], :color => nil, :link => nil, :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => nil) expect(array[4]).to eq(:text => "are", :styles => [:bold, :italic], :color => nil, :link => nil, :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => nil) expect(array[5]).to eq(:text => " you?", :styles => [], :color => nil, :link => nil, :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => nil) end it "should accept as an alternative to " do string = "bold not bold" array = Prawn::Text::Formatted::Parser.format(string) expect(array[0]).to eq(:text => "bold", :styles => [:bold], :color => nil, :link => nil, :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => nil) expect(array[1]).to eq(:text => " not bold", :styles => [], :color => nil, :link => nil, :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => nil) end it "should accept as an alternative to " do string = "italic not italic" array = Prawn::Text::Formatted::Parser.format(string) expect(array[0]).to eq(:text => "italic", :styles => [:italic], :color => nil, :link => nil, :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => nil) expect(array[1]).to eq(:text => " not italic", :styles => [], :color => nil, :link => nil, :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => nil) end it "should accept as an alternative to " do string = "link not a link" array = Prawn::Text::Formatted::Parser.format(string) expect(array[0]).to eq(:text => "link", :styles => [], :color => nil, :link => "http://example.com", :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => nil) expect(array[1]).to eq(:text => " not a link", :styles => [], :color => nil, :link => nil, :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => nil) end it "should turn
    ,
    into newline" do array = Prawn::Text::Formatted::Parser.format("hello
    big
    world") expect(array.map { |frag| frag[:text] }.join).to eq("hello\nbig\nworld") end end describe "Text::Formatted::Parser#to_string" do it "should handle sup" do string = "superscript" array = [{ :text => "superscript", :styles => [:superscript], :color => nil, :link => nil, :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => nil }] expect(Prawn::Text::Formatted::Parser.to_string(array)).to eq(string) end it "should handle sub" do string = "subscript" array = [{ :text => "subscript", :styles => [:subscript], :color => nil, :link => nil, :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => nil }] expect(Prawn::Text::Formatted::Parser.to_string(array)).to eq(string) end it "should handle rgb" do string = "red text" array = [{ :text => "red text", :styles => [], :color => "ff0000", :link => nil, :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => nil }] expect(Prawn::Text::Formatted::Parser.to_string(array)).to eq(string) end it "should handle cmyk" do string = "magenta text" array = [{ :text => "magenta text", :styles => [], :color => [0, 100, 0, 0], :link => nil, :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => nil }] expect(Prawn::Text::Formatted::Parser.to_string(array)).to eq(string) end it "should handle fonts" do string = "Courier text" array = [{ :text => "Courier text", :styles => [], :color => nil, :link => nil, :anchor => nil, :local => nil, :font => "Courier", :size => nil, :character_spacing => nil }] expect(Prawn::Text::Formatted::Parser.to_string(array)).to eq(string) end it "should handle size" do string = "14 point text" array = [{ :text => "14 point text", :styles => [], :color => nil, :link => nil, :anchor => nil, :local => nil, :font => nil, :size => 14, :character_spacing => nil }] expect(Prawn::Text::Formatted::Parser.to_string(array)).to eq(string) end it "should handle character spacing" do string = "2.5 extra character spacing" array = [{ :text => "2.5 extra character spacing", :styles => [], :color => nil, :link => nil, :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => 2.5 }] expect(Prawn::Text::Formatted::Parser.to_string(array)).to eq(string) end it "should handle links" do array = [{ :text => "external link", :styles => [], :color => nil, :link => "http://example.com", :anchor => nil, :local => nil, :font => nil, :size => nil, :character_spacing => nil }] string = "external link" expect(Prawn::Text::Formatted::Parser.to_string(array)).to eq(string) end it "should handle anchors" do array = [{ :text => "internal link", :styles => [], :color => nil, :link => nil, :anchor => "ToC", :font => nil, :size => nil, :character_spacing => nil }] string = "internal link" expect(Prawn::Text::Formatted::Parser.to_string(array)).to eq(string) end it "should convert <, >, and & to < >, and &, respectively" do array = [ { :text => "hello ", :styles => [], :color => nil, :link => nil, :font => nil, :size => nil, :character_spacing => nil }, { :text => "<, >, and &", :styles => [:bold], :color => nil, :link => nil, :font => nil, :size => nil, :character_spacing => nil } ] string = "hello <, >, and &" expect(Prawn::Text::Formatted::Parser.to_string(array)).to eq(string) end it "should construct an HTML-esque string from a formatted text array" do array = [ { :text => "hello ", :styles => [], :color => nil, :link => nil, :font => nil, :size => 14, :character_spacing => nil }, { :text => "world", :styles => [:bold], :color => nil, :link => nil, :font => nil, :size => nil, :character_spacing => nil }, { :text => "\n", :styles => [:bold], :color => nil, :link => nil, :font => nil, :size => nil, :character_spacing => nil }, { :text => "how ", :styles => [:bold], :color => nil, :link => nil, :font => nil, :size => nil, :character_spacing => nil }, { :text => "are", :styles => [:bold, :italic], :color => nil, :link => nil, :font => nil, :size => nil, :character_spacing => nil }, { :text => " you?", :styles => [], :color => nil, :link => nil, :font => nil, :size => nil, :character_spacing => nil } ] string = "hello world\nhow are you?" expect(Prawn::Text::Formatted::Parser.to_string(array)).to eq(string) end end describe "Text::Formatted::Parser#array_paragraphs" do it "should group fragments separated by newlines" do array = [{ :text => "\nhello\nworld" }, { :text => "\n\n" }, { :text => "how" }, { :text => "are" }, { :text => "you" }] target = [[{ :text => "\n" }], [{ :text => "hello" }], [{ :text => "world" }], [{ :text => "\n" }], [{ :text => "how" }, { :text => "are" }, { :text => "you" }]] expect(Prawn::Text::Formatted::Parser.array_paragraphs(array)).to eq(target) end it "should work properly if ending in an empty paragraph" do array = [{ :text => "\nhello\nworld\n" }] target = [[{ :text => "\n" }], [{ :text => "hello" }], [{ :text => "world" }]] expect(Prawn::Text::Formatted::Parser.array_paragraphs(array)).to eq(target) end end ruby-prawn-2.1.0.orig/spec/annotations_spec.rb0000644000000000000000000000402312665203156020110 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "When creating annotations" do before(:each) { create_pdf } it "should append annotation to current page" do @pdf.start_new_page @pdf.annotate(:Rect => [0, 0, 10, 10], :Subtype => :Text, :Contents => "Hello world!") PDF::Reader.open(StringIO.new(@pdf.render)) do |pdf| expect(pdf.page(1).attributes[:Annots]).to be_nil expect(pdf.page(2).attributes[:Annots].size).to eq(1) end end it "should force :Type to be :Annot" do opts = @pdf.annotate(:Rect => [0, 0, 10, 10], :Subtype => :Text, :Contents => "Hello world!") expect(opts[:Type]).to eq(:Annot) opts = @pdf.annotate(:Type => :Bogus, :Rect => [0, 0, 10, 10], :Subtype => :Text, :Contents => "Hello world!") expect(opts[:Type]).to eq(:Annot) end end describe "When creating text annotations" do before(:each) do @rect = [0, 0, 10, 10] @content = "Hello, world!" create_pdf end it "should build appropriate annotation" do opts = @pdf.text_annotation(@rect, @content) expect(opts[:Type]).to eq(:Annot) expect(opts[:Subtype]).to eq(:Text) expect(opts[:Rect]).to eq(@rect) expect(opts[:Contents]).to eq(@content) end it "should merge extra options" do opts = @pdf.text_annotation(@rect, @content, :Open => true, :Subtype => :Bogus) expect(opts[:Subtype]).to eq(:Text) expect(opts[:Open]).to eq(true) end end describe "When creating link annotations" do before(:each) do @rect = [0, 0, 10, 10] @dest = "home" create_pdf end it "should build appropriate annotation" do opts = @pdf.link_annotation(@rect, :Dest => @dest) expect(opts[:Type]).to eq(:Annot) expect(opts[:Subtype]).to eq(:Link) expect(opts[:Rect]).to eq(@rect) expect(opts[:Dest]).to eq(@dest) end it "should merge extra options" do opts = @pdf.link_annotation(@rect, :Dest => @dest, :Subtype => :Bogus) expect(opts[:Subtype]).to eq(:Link) expect(opts[:Dest]).to eq(@dest) end end ruby-prawn-2.1.0.orig/spec/line_wrap_spec.rb0000644000000000000000000003427612665203156017550 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "Core::Text::Formatted::LineWrap#wrap_line" do before(:each) do create_pdf @arranger = Prawn::Text::Formatted::Arranger.new(@pdf) @line_wrap = Prawn::Text::Formatted::LineWrap.new @one_word_width = 50 end it "should strip leading and trailing spaces" do array = [{ :text => " hello world, " }, { :text => "goodbye ", :style => [:bold] }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => 300, :document => @pdf) expect(string).to eq("hello world, goodbye") end it "should strip trailing spaces when a white-space-only fragment was" \ " successfully pushed onto the end of a line but no other non-white" \ " space fragment fits after it" do array = [{ :text => "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa " }, { :text => " ", :style => [:bold] }, { :text => " bbbbbbbbbbbbbbbbbbbbbbbbbbbb" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => 300, :document => @pdf) expect(string).to eq("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") end it "should raise_error CannotFit if a too-small width is given" do array = [{ :text => " hello world, " }, { :text => "goodbye ", :style => [:bold] }] @arranger.format_array = array expect do @line_wrap.wrap_line(:arranger => @arranger, :width => 1, :document => @pdf) end.to raise_error(Prawn::Errors::CannotFit) end it "should break on space" do array = [{ :text => "hello world" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) expect(string).to eq("hello") end it "should break on zero-width space" do @pdf.font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf") array = [{ :text => "hello#{Prawn::Text::ZWSP}world" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) expect(string).to eq("hello") end it "should not display zero-width space" do @pdf.font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf") array = [{ :text => "hello#{Prawn::Text::ZWSP}world" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => 300, :document => @pdf) expect(string).to eq("helloworld") end it "should break on tab" do array = [{ :text => "hello\tworld" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) expect(string).to eq("hello") end it "should break on hyphens" do array = [{ :text => "hello-world" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) expect(string).to eq("hello-") end it "should not break after a hyphen that follows white space and" \ "precedes a word" do array = [{ :text => "hello -" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) expect(string).to eq("hello -") array = [{ :text => "hello -world" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) expect(string).to eq("hello") end it "should break on a soft hyphen" do string = @pdf.font.normalize_encoding("hello#{Prawn::Text::SHY}world") array = [{ :text => string }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) expected = @pdf.font.normalize_encoding("hello#{Prawn::Text::SHY}") expected.force_encoding(Encoding::UTF_8) expect(string).to eq(expected) @pdf.font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf") @line_wrap = Prawn::Text::Formatted::LineWrap.new string = "hello#{Prawn::Text::SHY}world" array = [{ :text => string }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) expect(string).to eq("hello#{Prawn::Text::SHY}") end it "should ignore width of a soft-hyphen during adding fragments to line", :issue => 775 do hyphen_string = "Hy#{Prawn::Text::SHY}phe#{Prawn::Text::SHY}nat#{Prawn::Text::SHY}ions " string1 = @pdf.font.normalize_encoding(hyphen_string * 5) string2 = @pdf.font.normalize_encoding("Hyphenations " * 3 + hyphen_string) array1 = [{ text: string1 }] array2 = [{ text: string2 }] @arranger.format_array = array1 res1 = @line_wrap.wrap_line(:arranger => @arranger, :width => 300, :document => @pdf) @line_wrap = Prawn::Text::Formatted::LineWrap.new @arranger.format_array = array2 res2 = @line_wrap.wrap_line(:arranger => @arranger, :width => 300, :document => @pdf) expect(res1).to eq(res2) end it "should not display soft hyphens except at the end of a line " \ "for more than one element in format_array", :issue => 347 do @pdf.font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf") @line_wrap = Prawn::Text::Formatted::LineWrap.new string1 = @pdf.font.normalize_encoding("hello#{Prawn::Text::SHY}world ") string2 = @pdf.font.normalize_encoding("hi#{Prawn::Text::SHY}earth") array = [{ :text => string1 }, { :text => string2 }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => 300, :document => @pdf) expect(string).to eq("helloworld hiearth") end it "should not break before a hard hyphen that follows a word" do enough_width_for_hello_world = 60 array = [{ :text => "hello world" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => enough_width_for_hello_world, :document => @pdf) expect(string).to eq("hello world") array = [{ :text => "hello world-" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => enough_width_for_hello_world, :document => @pdf) expect(string).to eq("hello") @pdf.font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf") @line_wrap = Prawn::Text::Formatted::LineWrap.new enough_width_for_hello_world = 68 array = [{ :text => "hello world" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => enough_width_for_hello_world, :document => @pdf) expect(string).to eq("hello world") array = [{ :text => "hello world-" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => enough_width_for_hello_world, :document => @pdf) expect(string).to eq("hello") end it "should not break after a hard hyphen that follows a soft hyphen and" \ "precedes a word" do string = @pdf.font.normalize_encoding("hello#{Prawn::Text::SHY}-") array = [{ :text => string }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) expect(string).to eq("hello-") string = @pdf.font.normalize_encoding("hello#{Prawn::Text::SHY}-world") array = [{ :text => string }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) expected = @pdf.font.normalize_encoding("hello#{Prawn::Text::SHY}") expected.force_encoding(Encoding::UTF_8) expect(string).to eq(expected) @pdf.font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf") @line_wrap = Prawn::Text::Formatted::LineWrap.new string = "hello#{Prawn::Text::SHY}-" array = [{ :text => string }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) expect(string).to eq("hello-") string = "hello#{Prawn::Text::SHY}-world" array = [{ :text => string }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) expect(string).to eq("hello#{Prawn::Text::SHY}") end it "should process UTF-8 chars", :unresolved, :issue => 693 do array = [{ :text => "Test" }] @arranger.format_array = array # Should not raise an encoding error string = @line_wrap.wrap_line(:arranger => @arranger, :width => 300, :document => @pdf) expect(string).to eq("Test") end end describe "Core::Text::Formatted::LineWrap#space_count" do before(:each) do create_pdf @arranger = Prawn::Text::Formatted::Arranger.new(@pdf) @line_wrap = Prawn::Text::Formatted::LineWrap.new end it "should return the number of spaces in the last wrapped line" do array = [{ :text => "hello world, " }, { :text => "goodbye", :style => [:bold] }] @arranger.format_array = array @line_wrap.wrap_line(:arranger => @arranger, :width => 300, :document => @pdf) expect(@line_wrap.space_count).to eq(2) end it "should exclude preceding and trailing spaces from the count" do array = [{ :text => " hello world, " }, { :text => "goodbye ", :style => [:bold] }] @arranger.format_array = array @line_wrap.wrap_line(:arranger => @arranger, :width => 300, :document => @pdf) expect(@line_wrap.space_count).to eq(2) end end describe "Core::Text::Formatted::LineWrap" do before(:each) do create_pdf @arranger = Prawn::Text::Formatted::Arranger.new(@pdf) array = [{ :text => "hello\nworld\n\n\nhow are you?" }, { :text => "\n" }, { :text => "\n" }, { :text => "" }, { :text => "fine, thanks. " * 4 }, { :text => "" }, { :text => "\n" }, { :text => "" }] @arranger.format_array = array @line_wrap = Prawn::Text::Formatted::LineWrap.new end it "should only return an empty string if nothing fit or there" \ "was nothing to wrap" do 8.times do line = @line_wrap.wrap_line(:arranger => @arranger, :width => 200, :document => @pdf) expect(line).not_to be_empty end line = @line_wrap.wrap_line(:arranger => @arranger, :width => 200, :document => @pdf) expect(line).to be_empty end it "should tokenize a string using the scan_pattern" do tokens = @line_wrap.tokenize("one two three") expect(tokens.length).to eq(6) end end describe "Core::Text::Formatted::LineWrap#paragraph_finished?" do before(:each) do create_pdf @arranger = Prawn::Text::Formatted::Arranger.new(@pdf) @line_wrap = Prawn::Text::Formatted::LineWrap.new @one_word_width = 50 end it "should be_false when the last printed line is not the end of the paragraph" do array = [{ :text => "hello world" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) expect(@line_wrap.paragraph_finished?).to eq(false) end it "should be_true when the last printed line is the last fragment to print" do array = [{ :text => "hello world" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) expect(@line_wrap.paragraph_finished?).to eq(true) end it "should be_true when a newline exists on the current line" do array = [{ :text => "hello\n world" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) expect(@line_wrap.paragraph_finished?).to eq(true) end it "should be_true when a newline exists in the next fragment" do array = [{ :text => "hello " }, { :text => " \n" }, { :text => "world" }] @arranger.format_array = array string = @line_wrap.wrap_line(:arranger => @arranger, :width => @one_word_width, :document => @pdf) expect(@line_wrap.paragraph_finished?).to eq(true) end end ruby-prawn-2.1.0.orig/spec/column_box_spec.rb0000644000000000000000000000353312665203156017725 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "A column box" do it "has sensible left and right values" do create_pdf @pdf.column_box [0, @pdf.cursor], :width => @pdf.bounds.width, :height => 200, :columns => 3, :spacer => 25 do left = @pdf.bounds.left right = @pdf.bounds.right @pdf.bounds.move_past_bottom # next column expect(@pdf.bounds.left).to be > left expect(@pdf.bounds.left).to be > right expect(@pdf.bounds.right).to be > @pdf.bounds.left end end it "includes spacers between columns but not at the end" do create_pdf @pdf.column_box [0, @pdf.cursor], :width => 500, :height => 200, :columns => 3, :spacer => 25 do expect(@pdf.bounds.width).to eq(150) # (500 - (25 * 2)) / 3 @pdf.bounds.move_past_bottom @pdf.bounds.move_past_bottom expect(@pdf.bounds.right).to eq(500) end end it "does not reset the top margin on a new page by default" do create_pdf page_top = @pdf.cursor @pdf.move_down 50 init_column_top = @pdf.cursor @pdf.column_box [0, @pdf.cursor], :width => 500, :height => 200, :columns => 2 do @pdf.bounds.move_past_bottom @pdf.bounds.move_past_bottom expect(@pdf.bounds.absolute_top).to eq(init_column_top) expect(@pdf.bounds.absolute_top).not_to eq(page_top) end end it "does reset the top margin when reflow_margins is set" do create_pdf page_top = @pdf.cursor @pdf.move_down 50 init_column_top = @pdf.cursor @pdf.column_box [0, @pdf.cursor], :width => 500, :reflow_margins => true, :height => 200, :columns => 2 do @pdf.bounds.move_past_bottom @pdf.bounds.move_past_bottom expect(@pdf.bounds.absolute_top).to eq(page_top) expect(@pdf.bounds.absolute_top).not_to eq(init_column_top) end end end ruby-prawn-2.1.0.orig/spec/text_spacing_spec.rb0000644000000000000000000000560412665203156020251 0ustar rootroot# encoding: utf-8 require File.join(File.expand_path(File.dirname(__FILE__)), "spec_helper") describe "#character_spacing" do it "should draw the character spacing to the document" do create_pdf @pdf.character_spacing(10.555555) do @pdf.text("hello world") end contents = PDF::Inspector::Text.analyze(@pdf.render) expect(contents.character_spacing.first).to eq(10.5556) end it "should not draw the character spacing to the document" \ " when the new character spacing matches the old" do create_pdf @pdf.character_spacing(0) do @pdf.text("hello world") end contents = PDF::Inspector::Text.analyze(@pdf.render) expect(contents.character_spacing).to be_empty end it "should restore character spacing to 0" do create_pdf @pdf.character_spacing(10.555555) do @pdf.text("hello world") end contents = PDF::Inspector::Text.analyze(@pdf.render) expect(contents.character_spacing.last).to eq(0) end it "should function as an accessor when no parameter given" do create_pdf @pdf.character_spacing(10.555555) do @pdf.text("hello world") expect(@pdf.character_spacing).to eq(10.555555) end expect(@pdf.character_spacing).to eq(0) end # ensure that we properly internationalize by using the number of characters # in a string, not the number of bytes, to insert character spaces # it "should calculate character spacing widths by characters, not bytes" do create_pdf @pdf.font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf") str = "こんにちは世界" @pdf.character_spacing(0) do @raw_width = @pdf.width_of(str) end @pdf.character_spacing(10) do # the new width should include seven 10-pt character spaces. expect(@pdf.width_of(str)).to be_within(0.001).of(@raw_width + (10 * 7)) end end end describe "#word_spacing" do it "should draw the word spacing to the document" do create_pdf @pdf.word_spacing(10.555555) do @pdf.text("hello world") end contents = PDF::Inspector::Text.analyze(@pdf.render) expect(contents.word_spacing.first).to eq(10.5556) end it "should draw the word spacing to the document" \ " when the new word spacing matches the old" do create_pdf @pdf.word_spacing(0) do @pdf.text("hello world") end contents = PDF::Inspector::Text.analyze(@pdf.render) expect(contents.word_spacing).to be_empty end it "should restore word spacing to 0" do create_pdf @pdf.word_spacing(10.555555) do @pdf.text("hello world") end contents = PDF::Inspector::Text.analyze(@pdf.render) expect(contents.word_spacing.last).to eq(0) end it "should function as an accessor when no parameter given" do create_pdf @pdf.word_spacing(10.555555) do @pdf.text("hello world") expect(@pdf.word_spacing).to eq(10.555555) end expect(@pdf.word_spacing).to eq(0) end end ruby-prawn-2.1.0.orig/GPLv30000644000000000000000000010451312665203156014105 0ustar rootroot GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ruby-prawn-2.1.0.orig/Rakefile0000644000000000000000000000225612665203156014735 0ustar rootrootrequire "bundler" Bundler.setup require 'rake' require 'rspec/core/rake_task' require 'yard' require 'rubygems/package_task' require 'rubocop/rake_task' task :default => [:spec, :rubocop] desc "Run all rspec files" RSpec::Core::RakeTask.new("spec") do |c| c.rspec_opts = "-t ~unresolved" end desc "Show library's code statistics" task :stats do require 'code_statistics/code_statistics' puts CodeStatistics::CodeStatistics.new( [ ["Prawn", "lib"], ["Specs", "spec"] ] ).to_s end YARD::Rake::YardocTask.new do |t| t.options = ['--output-dir', 'doc/html'] end task :docs => :yard desc "Generate the 'Prawn by Example' manual" task :manual do puts "Building manual..." require File.expand_path(File.join(File.dirname(__FILE__), %w[manual contents])) puts "The Prawn manual is available at manual.pdf. Happy Prawning!" end spec = Gem::Specification.load "prawn.gemspec" Gem::PackageTask.new(spec) do |pkg| pkg.need_zip = true pkg.need_tar = true end desc "Run a console with Prawn loaded" task :console do require 'irb' require 'irb/completion' require_relative 'lib/prawn' Prawn.debug = true ARGV.clear IRB.start end RuboCop::RakeTask.new ruby-prawn-2.1.0.orig/.travis.yml0000644000000000000000000000045312665203156015376 0ustar rootrootlanguage: ruby before_install: - gem install bundler - bundle --version rvm: - 2.0.0-p0 - 2.0.0-p648 - 2.1.0-p0 - 2.1.8 - 2.2.0-p0 - 2.2.4 - 2.3.0 - rbx-2 - jruby-9.0.4.0 matrix: include: - rvm: jruby-1.7.22 env: JRUBY_OPTS=--2.0 allow_failures: - rvm: rbx-2 ruby-prawn-2.1.0.orig/.yardopts0000644000000000000000000000020512665203156015126 0ustar rootroot--charset UTF-8 --main README.md --title 'Prawn Documentation' --no-private - CONTRIBUTING.md COPYING LICENSE README.md CHANGELOG.md ruby-prawn-2.1.0.orig/LICENSE0000644000000000000000000000456412665203156014301 0ustar rootrootPrawn is copyrighted free software produced by Gregory Brown along with community contributions. See git log for authorship information. Licensing terms follow: You can redistribute Prawn and/or modify it under either the terms of the GPLv2 or GPLv3 (see GPLv2 and GPLv3 files), or the conditions below: 1. You may make and give away verbatim copies of the source form of the software without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. 2. You may modify your copy of the software in any way, provided that you do at least ONE of the following: a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or by allowing the author to include your modifications in the software. b) use the modified software only within your corporation or organization. c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided. d) make other distribution arrangements with the author. 3. You may distribute the software in object code or executable form, provided that you do at least ONE of the following: a) distribute the executables and library files of the software, together with instructions (in the manual page or equivalent) on where to get the original distribution. b) accompany the distribution with the machine-readable source of the software. c) give non-standard executables non-standard names, with instructions on where to get the original software distribution. d) make other distribution arrangements with the author. 4. You may modify and include the part of the software into any other software (possibly commercial). 5. The scripts and library files supplied as input to or produced as output from the software do not automatically fall under the copyright of the software, but belong to whomever generated them, and may be sold commercially, and may be aggregated with this software. 6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ruby-prawn-2.1.0.orig/README.md0000644000000000000000000002111612665203156014543 0ustar rootroot# Prawn: Fast, Nimble PDF Generation For Ruby [![Gem Version](https://badge.fury.io/rb/prawn.png)](http://badge.fury.io/rb/prawn) [![Build Status](https://api.travis-ci.org/prawnpdf/prawn.svg?branch=master)](http://travis-ci.org/prawnpdf/prawn) [![Code Climate](https://codeclimate.com/github/prawnpdf/prawn/badges/gpa.svg)](https://codeclimate.com/github/prawnpdf/prawn) Prawn is a pure Ruby PDF generation library that provides a lot of great functionality while trying to remain simple and reasonably performant. Here are some of the important features we provide: * Vector drawing support, including lines, polygons, curves, ellipses, etc. * Extensive text rendering support, including flowing text and limited inline formatting options. * Support for both PDF builtin fonts as well as embedded TrueType fonts * A variety of low level tools for basic layout needs, including a simple grid system * PNG and JPG image embedding, with flexible scaling options * Security features including encryption and password protection * Tools for rendering repeatable content (i.e headers, footers, and page numbers) * Comprehensive internationalization features, including full support for UTF-8 based fonts, right-to-left text rendering, fallback font support, and extension points for customizable text wrapping. * Support for PDF outlines for document navigation * Low level PDF features, allowing users to create custom extensions by dropping down all the way to the PDF object tree layer. (Mostly useful to those with knowledge of the PDF specification) * Lots of other stuff! ## Should You Use Prawn? If you are looking for a highly flexible PDF document generation system, Prawn might be the tool for you. It is not a reporting tool or a publishing toolchain, though it could be fairly easily used to build those things. One thing Prawn is not, and will never be, is an HTML to PDF generator. For those needs, consider looking into FlyingSaucer via JRuby, or one of the webkit based tools, like Wicked or PDFKit. We do have basic support for inline styling but it is limited to a very small subset of functionality and is not suitable for rendering rich HTML documents. ## Supported Ruby Versions and Implementations Because Prawn is pure Ruby and all of its runtime dependencies are maintained by us, it should work pretty much anywhere. We officially support MRI {2.0.0, 2.1.x, 2.2.x} and jruby 1.7.x (>= 1.7.18) in 2.0 mode, however we will accept patches to fix problems on other Ruby platforms if they aren't too invasive. ## Installing Prawn Prawn is distributed via RubyGems, and can be installed the usual way that you install gems: by simply typing `gem install prawn` on the command line. You can also install from git if you'd like, the _master_ branch contains the latest developments, and _stable_ represents the latest bug fixes to the currently released version of Prawn. If you go this route, using Bundler is encouraged. ## Hello World! If the following code runs and produces a working PDF file, you've successfully installed Prawn. ```ruby require "prawn" Prawn::Document.generate("hello.pdf") do text "Hello World!" end ``` Of course, you'll probably want to do more interesting things than that... ## Manual Felipe Doria provided us with a beautiful system for generating a user manual from our examples. This can be generated from the prawn source or you can download a pre-generated snapshot of it at http://prawnpdf.org/manual.pdf Note that while we will try to keep the downloadable manual up to date, that it's provided as a convenience only and you should generate the manual yourself if you want to be sure the code in it actually runs and works as expected. To build the manual, here's what you need to do: 1. clone the repository 2. switch to the stable branch (optional, stay on master for development version) 3. install bundler if necessay 4. run `bundle install` 5. run `bundle exec rake manual`, which will generate _manual.pdf_ in the project root ## Release Policies Before upgrading Prawn on one of your projects, you should read our [API compatibility](https://github.com/prawnpdf/prawn/wiki/API-Compatibility-Notes) guidelines. Generally speaking, you can expect tiny and minor version updates to always be safe upgrades, but major updates can introduce incompatibilities. Be sure to read the release notes in [CHANGELOG.md](https://github.com/prawnpdf/prawn/blob/master/CHANGELOG.md) each time we cut a new release, and lock your gems accordingly. The prawn team will release a new version of prawn every 6 weeks containing any new features and bug fixes that have been completed during the previous release cycle. We may release additional versions off cycle to fix major breakages. ## Support The easiest way to get help with Prawn is to post a message to our mailing list: Feel free to post any Prawn related question there, our community is very responsive and will be happy to help you figure out how to use Prawn, or help you determine whether it's the right tool for the task you are working on. Please make your posts to the list as specific as possible, including code samples and output where relevant. Do not post any information that should not be shared publicly, and be sure to reduce your example code as much as possible so that those who are responding to your question can more easily see what the issue might be. ## Contributing If you've found a bug or want to submit a patch, please enter a ticket into our github tracker: We strongly encourage bug reports to come with failing tests or at least a reduced example that demonstrates the problem. Similarly, patches should include tests, API documentation, and an update to the manual where relevant. Feel free to send a pull request early though, if you just want some feedback or a code review before preparing your code to be merged. If you are unsure about whether or not you've found a bug, or want to check to see whether we'd be interested in the feature you want to add before you start working on it, feel free to post to our mailing list. You can run our test suite in a few different ways: 1. Running `rake` will run the entire test suite excluding any unresolved issues 2. Running `rspec` will run the entire test suite including unresolved issues 3. Running `rspec -t unresolved` will run *only* unresolved issues 4. Running `rspec -t issue:NUMBER` will run the tests for a specific issue These filters make it possible for us to add failing test cases for bugs that are currently being researched or worked on, without breaking the typical full suite run. ## Maintenance team Prawn has always been heavily dependent on community contributions, with dozens of people contributing code over the year. In that sense, the lines have blurred to the point where we no longer have a strong distinction between core developers and contributors. That said, there are a few folks who have been responsible for cutting releases, merging important pull requests, and making major decisions about the overall direction of the project. ### Current maintainers These are the folks to contact if you have a maintenance-related issue with Prawn: * Evan Sharp (PacketMonkey) * Alexander Mankuta (cheba) ### Inactive maintainers These folks have helped out in a maintenance role in the past, but are no longer actively involved in the project: * Gregory Brown (practicingruby) * Brad Ediger (bradediger) * James Healy (yob) * Daniel Nelson (Bluejade) * Jonathan Greenberg (jonsgreen) * Jamis Buck (jamis) ## License Prawn is released under a slightly modified form of the License of Ruby, allowing you to choose between Matz's terms, the GPLv2, or GPLv3. For details, please see the LICENSE, GPLv2, and GPLv3 files. If you contribute to Prawn, you will retain your own copyright but must agree to license your code under the same terms as the project itself. ## History Prawn was originally developed by [Gregory Brown](http://twitter.com/practicingruby), under the auspices of the Ruby Mendicant Project, a grassroots initiative in which the Ruby community collectively provided funding so that Gregory could take several months off from work to focus on this project. Over the last several years, we've received code contributions from dozens of people, which is amazing considering the low-level nature of this project. You can find the full list of folks who have at least one patch accepted to Prawn on github at https://github.com/prawnpdf/prawn/contributors After a long period of inactivity, Prawn reached its 1.0 milestone in 2014 thanks to some modest funding provided to Gregory by Madriska, Inc. (Brad Ediger's company). ruby-prawn-2.1.0.orig/CHANGELOG.md0000644000000000000000000005514512665203156015106 0ustar rootroot## PrawnPDF master branch ## PrawnPDF 2.1.0 -- 2016-02-29 ### Added support for PNG images with indexed transparency Prawn now properly hadles transparency in PNG images with indexed color. (Maciej Mucha, [#783](https://github.com/prawnpdf/prawn/issues/783); Alexander Mankuta, [#920](https://github.com/prawnpdf/prawn/pull/920)) ### Prawn no longer generates IRB warnings Fix a few issues with code style that were triggering warnings in IRB when run in verbose mode (`irb -w`). (Jesse Doyle, [#914](https://github.com/prawnpdf/prawn/pull/914)) ### Gradients applied inside transformations are now correctly positioned PDF gradients/patterns take coordinates in the coordinate space of the document, not the "user space", so if you performed a scale/rotate/translate and then painted a gradient inside, it wasn't correctly positioned. This change tracks transformations applied to the document, and multiplies the gradient matrix with this tracked transformation matrix so that the gradient appears in the correct place in the document. Because this changes how the x and y coordinates are interpreted, you must manually add `apply_transformations: true` to your `stroke_gradient` and `fill_gradient` calls to use the fixed behaviour in Prawn 2. It is expected that this will be the default in Prawn 3. Please [refer to the wiki page on this change](https://github.com/prawnpdf/prawn/wiki/Gradient-Transformations) for more information. (Roger Nesbitt, [#891](https://github.com/prawnpdf/prawn/issues/891), [#894](https://github.com/prawnpdf/prawn/pull/894)) ### Prawn::Graphics::BlendMode#blend_mode added Blend modes can be used to change the way two layers are blended together. The BM key is added to the External Graphics State based on the v1.4 PDF spec. `blend_mode` accepts a single blend mode or array of blend modes. If an array is passed, the PDF viewer blends layers based on the first valid blend mode. ## PrawnPDF 2.0.2 -- 2015-07-15 ### Links in repeaters/stamps are now clickable Previously, url links were not clickable when rendered within a stamp. The proper annotation references are now added to the page object that the stamp is called, thereby generating a clickable link in the pdf. Because repeaters are built upon stamps, this fix should also solve issues with links inside of repeaters. (Jesse Doyle, [#801](https://github.com/prawnpdf/prawn/issues/801), [#498](https://github.com/prawnpdf/prawn/issues/498)) ## PrawnPDF 2.0.1 -- 2015-03-23 ### Fix regression in draw_text() with rotation Due to missing tests, a typo snuck into the `draw_text()` method in PDF::Core, preventing it from working properly when called with the `:rotate` option. This issue has been resolved, and a test has been added to Prawn's test suite. Speaking more generally, we need to improve the condition of the tests for `PDF::Core`, and make a clear separation between Prawn's test suite and PDF::Core's tests. Currently there are lots of little gaps that can lead to this sort of problem. [Robert S. Gerus, [pdf-core#15](https://github.com/prawnpdf/pdf-core/pull/15)] ## PrawnPDF 2.0.0 -- 2015-02-26 ### Changes to supported Ruby versions Now that Ruby 1.9.3 is no longer supported by the Ruby core team, Prawn will no longer attempt to maintain 1.9.x compatibility. We will continue to support Ruby 2.0.0 and 2.1.x, and have added support for Ruby 2.2.x as well. If you're using JRuby, we recommend using JRuby 1.7.x (>= 1.7.18) in 2.0 mode for now. Please file bug reports if you run into any problems! ### Changes to PrawnPDF's versioning policies Starting with this release, we will set version numbers based on the following policy: * Whenever a documented feature is modified in a backwards-incompatible way, we'll bump our major version number. * Whenever we add new functionality without breaking backwards compatibility, we'll bump our minor version number. * Whenever we cut maintenance releases (which cover only bug fixes, documentation, and internal improvements), we'll bump our tiny version number. This policy is similar in spirit to [Semantic Versioning](http://semver.org/), and we may end up formally adopting SemVer in the future. The main caveat is that if a feature is not documented (either in our API documentation or in Prawn's manual), you cannot assume anything about its intended behavior. Prawn has a lot of cruft left in it due to piecewise development over nearly a decade, so the APIs have not been designed as much as they have been organically grown. To make sure that the amount of undefined behavior in Prawn shrinks over time, we'll make sure to review and revise documentation whenever new functionality is added, and also whenever we change existing features. ### All decimals in PDF output are now rounded to a fixed precision of 4 decimal places This should improve compatibility across viewers that do not support arbitrarily long decimal numbers, without effecting practical use at all. (A PDF point is 1/72 inch, so 0.0001 PDF point is a very, very small number). This patch was added in response to certain PDFs on certain versions of Adobe Reader raising errors when viewed. (Gregory Brown, [#782](https://github.com/prawnpdf/prawn/pull/782)) ### Fixed text width calculation to prevent unnecessary soft hyphen Previously, the `width_of` method would include the width of all soft hyphens in a string, regardless of whether they would be rendered or not. This caused lines of text to appear longer than they actually were, causing unnecessary wrapping and hyphenation at times. We've changed this calculation to only include the width of a soft hyphen when it will actually be rendered (i.e. when a line needs to be wrapped), which should prevent unnecessary hyphenation and text wrapping in strings containing soft hyphens. (Mario Albert, [#775](https://github.com/prawnpdf/prawn/issues/775), [#786](https://github.com/prawnpdf/prawn/pull/786)) ### Fixed styled text width calculations when using TTF files Previously, `width_of` calculations on styled text were relying on the document font's name attribute in order to look up the appropriate font style. This doesn't work for TTF fonts, since the name is a full path to a single style of font, and the Prawn must know about the font family in order to find another style. The `width_of` method has been updated to use the font family instead, allowing calculations to work properly with TTFs. (Ernie Miller, [#827](https://github.com/prawnpdf/prawn/pull/827)) ### Fixed broken vertical alignment for center and bottom In earlier versions of Prawn, center alignment and bottom alignment in text boxes worked in a way that is inconsistent with common typographical conventions: * Vertically centered text was padded so that the distance between the top of the box and the ascender of the first line of text was made equal to the distance between the descender of the bottom line to the descender of the last line of text. * Bottom aligned text included the line gap specified by a font, leaving a bit of extra in the box space below the descender of the last line of text. Other commonly used software typically uses the baseline rather than the descender when centering text, and does not include the line gap when bottom aligning text. We've changed Prawn's behavior to be consistent with those conventions, which should result in less surprising output. That said, this problem has existed in Prawn for a very, very long time. Check your code to see if you've been working around this issue, because if so it may cause breakage. For a very detailed discussion (with pictures), see issue [#169](https://github.com/prawnpdf/prawn/issues/169). (Jesse Doyle, [#788](https://github.com/prawnpdf/prawn/pull/788)) ### Calling dash(0) now raises an error instead of generating a corrupt PDF In earlier versions of Prawn, accidentally calling `dash(0)` instead of `undash` in an attempt to clear dash settings would generate a corrupted document instead of raising an error, making debugging difficult. Because `dash(0)` is not a valid API call, we now raise an error that says "Zero length dashes are invalid. Call #undash to disable dashes.", making the source of the problem much clearer. ### Vastly improved handling of encodings for PDF built in (AFM) fonts Prawn has always had comprehensive UTF-8 support for TTF font files, but many users still rely on the "built in" AFM fonts that are provided by PDF viewers. These fonts only support the very limited set of internationalized characters specified by the Windows-1252 character encoding, and that has been a long standing source of confusion and awkward behaviors. Earlier versions of Prawn attempted to transcode UTF-8 to Windows-1252 automatically, but some of our low level features either assumed that text was already encoded properly, or returned text in a different encoding than what was provided because of the internal transcoding operations. We also handled Windows-1252 encoding manually, so strings would come back tagged as ASCII-8BIT instead of Windows-1252, making things even more confusing. In this release, we've made some major behavior changes to the way AFM fonts work so that users need to think less about Prawn's internals: * Text handling for all public Prawn methods is now UTF-8-in, UTF-8-out, making Windows-1252 transcoding purely an implementation detail of Prawn that isn't visible from the outside. * When using AFM fonts + non-ASCII characters that are NOT supported in Windows-1252, an exception will be raised rather than replacing w. `_`. * When using AFM fonts + non-ASCII characters that are supported in Windows-1252, users will see a warning about the limited internationalization support, along with a recommendation to use a TTF font instead. * The warning includes instructions on how to disable it (just set `Prawn::Font::AFM.hide_m17_warning = true`) * When using AFM fonts + ASCII only text, no warning will be seen. * Internally, we're now using Ruby's M17n system to handle the encoding into Windows-1252, so text.encoding will come back as Windows-1252 when `AFM#normalize_encoding` is called, rather than `ASCII-8Bit` None of the above issues apply when using TTF fonts with Prawn, because those have always been UTF-8 in, UTF-8 out, and no transcoding was done internally. It is still our recommendation for those using internationalized text to use TTF fonts because they do not have the same limitations as AFM fonts, but those who need to use AFM for whatever reason should benefit greatly from these changes. (Gregory Brown, [#793](https://github.com/prawnpdf/prawn/pull/793)) ### Temporarily restored the Document#on_page_create method This method was moved into PDF::Core in the Prawn 1.3.0 release, removing it from the `Prawn::Document` API. Although it is a low-level method not meant for general use, it is necessary for certain tasks that we do not have proper support for elsewhere. This method should still be considered part of Prawn's internals and is subject to change at any time, but we have restored it temporarily until we have a suitable replacement for it. See the discussion on [#797](https://github.com/prawnpdf/prawn/issues/797) for more details. (Jesse Doyle, [#797](https://github.com/prawnpdf/prawn/issues/797), [#825](https://github.com/prawnpdf/prawn/pull/825)) ## PrawnPDF 1.3.0 -- 2014-09-28 ### Added the Prawn::View mixin for using Prawn's DSL in your own classes. In complex Prawn-based documents, it is a common pattern to create subclasses of `Prawn::Document` to isolate different components from one another, or to provide some customized rendering methods. However, the sprawling nature of the `Prawn::Document` object makes this an unsafe practice: it implements hundreds of methods and contains dozens of instance variables, all of which can conflict with any subclass functionality. `Prawn::View` provides a safer alternative by using object composition instead of inheritance. This will keep your state and methods separate from Prawn's internals, while still allowing you to directly call any methods provided by the `Prawn::Document` object. Here's an example of `Prawn::View` in use: ```ruby class Greeter include Prawn::View def initialize(name) @name = name end def say_hello text "Hello, #{@name}!" end def say_goodbye font("Courier") do text "Goodbye, #{@name}!" end end end greeter = Greeter.new("Gregory") greeter.say_hello greeter.say_goodbye greeter.save_as("greetings.pdf") ``` Wherever possible, please convert your `Prawn::Document` subclasses to use `Prawn::View` instead. It is much less invasive, and is nearly a drop-in replacement for the existing common practice. ### Soft hyphenation no longer renders unnecessary hyphens in the last word of paragraphs. A defect in our text rendering system was to blame for this bad behavior. For more details, see [#347](https://github.com/prawnpdf/prawn/issues/347). ([#773](https://github.com/prawnpdf/prawn/pull/773), [#774](https://github.com/prawnpdf/prawn/pull/774) -- Mario Albert) ### Fonts with unsupported character mappings will now only fail if you use unsupported glyphs. A bug in TTFunk prevented certain fonts from being used because they contained unsupported character map information. In most cases, this information would only be needed to render a handful of obscure glyphs, and so most users would never run into issues by using them. This issue has been resolved, and should help improve compatibility for CJK-based fonts in particular. ([TTFunk #20](https://github.com/prawnpdf/ttfunk/pull/20) -- Dan Allen) ### Prawn no longer triggers Ruby warnings when loaded Some minor issues in our TTFunk dependency was causing many warnings to be generated upon loading Prawn. As of this release, you should now be able to run Ruby with warnings on and see no warnings generated from Prawn or its dependencies. ([TTFunk #21](https://github.com/prawnpdf/ttfunk/pull/21) -- Jesse Doyle) ## PrawnPDF 1.2.1 -- 2014-07-27 This release includes all changes from 1.2.0, which was yanked due to a packaging error. ### Prawn::Table has been moved into an optional gem extension. In addition to adding `require "prawn/table"` to your code, you will need to install the `prawn-table` gem to make use of table and cell rendering functionality in Prawn 1.2+. The `prawn-table` gem will be maintained by Hartwig Brandl, and is semi-officially supported by the Prawn maintenance team. That means that we'll continue to watch its CI builds against each Prawn release, and help to resolve any compatibility issues as soon as possible. Please see the [prawn-table repository](https://github.com/prawnpdf/prawn-table) for more information. ### Text box now has an option to disable wrapping by character. This feature is useful for preventing mid-word breaks when used in combination with the `:shrink_to_fit` overflow option. See the following example practical use case: ```ruby # An example shared by Simon Mansfield Prawn::Document.generate("x.pdf") do stroke_rectangle [0, bounds.top], 100, 50 font('Helvetica', size: 50) do formatted_text_box( [{text: 'VEGETARIAN'}], at: [0, bounds.top], width: 100, height: 50, overflow: :shrink_to_fit, disable_wrap_by_char: true # <---- newly added in 1.2 ) end end ``` Without setting `:disable_wrap_by_char`, the code above will break the word "VEGETARIAN" into two lines rather than shrinking it all the way down to fit on a single unbroken line. To maintain backwards compatibility, `:disable_wrap_by_char` is implemented as an optional behavior that is off by default. ([#752](https://github.com/prawnpdf/prawn/pull/752), James Coleman) ### Fallback fonts no longer break global font styling. In earlier versions of Prawn, using the fallback font system caused styling information (i.e. bold, italic) for all fonts to be lost, and the only workaround to this problem was to specify style explicitly for each individual text fragment. Now that this issue has been resolved, it is safe to use the `font` method to set styles globally, even if fallback fonts are in use. ([#743](https://github.com/prawnpdf/prawn/pull/743), Pete Sharum) ### Formatted text box dry runs no longer modify graphics state Dry runs are supposed to be a side-effect-free way of simulating text rendering, but a bug in earlier versions of Prawn caused the graphics state to be modified if colors were set on text fragments. This patch resolves that issue. ([#736](https://github.com/prawnpdf/prawn/pull/736), Christian Hieke) ### Fixed manual build failure on Ruby 1.9.3 When we extracted Prawn::ManualBuilder, we accidentally broke its support for Ruby 1.9.3. That issue has been resolved, and a new version of the `prawn-manual_builder` gem has been released. ## PrawnPDF 1.1.0 -- 2014-06-27 In addition to the notes below, please see the [Prawn 1.1 blog post](http://elmcitycraftworks.org/post/90062338793/prawn-1-1-0-released"). ### Table support now disabled by default, moving to its own gem soon. We're planning to extract table generation into its own semi-officially supported gem in a future release. Until then, you can use the following line to enable table support in your projects: ```ruby require "prawn/table" ``` As of right now tables are still supported as an experimental public feature -- we only disabled it by default to make sure people are aware that it will be extracted into its own gem soon. ### I/O objects are now supported in the font system. You can now pass a fully formed Prawn::Font object in addition to a file path when adding a font family to your document. `Prawn::Font.load` now also accepts IO object as an alternative to explicitly specifying a path on the filesystem. For example: ```ruby io = File.open "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf" @pdf.font_families["DejaVu Sans"] = { normal: Prawn::Font.load(@pdf, io) } @pdf.font "DejaVu Sans" @pdf.text "In DejaVu Sans" ``` ([#730](https://github.com/prawnpdf/prawn/pull/730), Evan Sharp) ### We now use the Prawn::ManualBuilder gem to generate our documentation. In previous releases, the system that generated Prawn's manual was bundled directly with Prawn and not usable by third party extensions. We've now extracted that system into [its own project](https://github.com/prawnpdf/prawn-manual_builder) so that it can be used by anyone who wants to ship PDF-based documentation for their Prawn code. `Prawn::ManualBuilder` is still a bit rough around the edges because it wasn't originally meant for general purpose use, but extracting out the code is an important first step in making it more useful for everyone. Bug fixes and improvements are welcome! ([#728](https://github.com/prawnpdf/prawn/pull/728), Gregory Brown) ### Table headers are now rendered only if there is also room for non-header rows. Orphaned header rows look bad and could be considered a rendering bug, and so this change fixes that problem by making sure there is enough room for at least one row of non-header data before attempting to render headers. ([#717](https://github.com/prawnpdf/prawn/pull/717), Uwe Kubosch) ### Row-spans in multi-row headers are no longer lost after pagebreak In previous versions of Prawn, multi-row headers with rowspan would render incorrectly in multi-page tables. This bug has now been fixed. ([#721](https://github.com/prawnpdf/prawn/issues/721, "#723":https://github.com/prawnpdf/prawn/pull/723), Deron Meranda + Hartwig Brandl) ### Fixed a table bug when using an array of column widths This is a fix for yet another edge case in cell width calculations. See tickets for details. ([#710](https://github.com/prawnpdf/prawn/issues/710), [#712](https://github.com/prawnpdf/prawn/pull/712) Hartwig Brandl) ## PrawnPDF 1.0.0 -- 2014-03-16 In addition to the notes below, please see the [Prawn 1.0 blog post.][1-0-blog-post] [1-0-blog-post]: http://elmcitycraftworks.org/post/79929183748/prawn-1-0-is-finally-here ### Margins are now properly restored after a multi-page bounding box is rendered. In a Prawn document, it's possible to reset the page margins on each newly created page: i.e. `@doc.start_new_page(:margin => 64)`. But due to a very old bug, this feature did not work correctly any time that a bounding box spanned more than one page. Because many of Prawn's features rely on bounding boxes internally, this problem typically would reveal itself indirectly. This example from Malte Schmitz helped us finally track down the problem: ```ruby pdf = Prawn::Document.new(:margin => 200) pdf.table [["Foo"]] * 20, position: :center # spans multiple pages pdf.start_new_page(:margin => 0) # should have updated margins but didn't pdf.text "Foo " * 100 ``` The root cause of this problem has been found and fixed, and there should no longer be unexpected issues when using the `:margin` parameter to `start_new_page`. ### Transaction support has been removed from Prawn, and the Document#group feature has been temporarily disabled. We've discovered some very serious flaws in Prawn's transaction support which can easily cause documents to become corrupted. The only thing transactions were used internally for in Prawn was to support the `Document#group` feature, but the underlying defects were severe enough to make `Document#group` unsafe for use whenever a page boundary is crossed. We'd like to bring back both transactions and grouping functionality, but it's going to involve some major work to do so cleanly. Until that happens, we've decided its better not to provide the feature at all than it is to have folks try to use something that will likely result in hard to hunt down bugs. An experiment to restore grouping functionality without relying on transactions has already been released by Daniel Dengler in the [prawn-grouping](https://github.com/ddengler/prawn-grouping) extension, so you may want to give that a try if you need grouping functionality. ### Fixed broken git clone of Prawn repository for Windows A useless file named `..` was accidentally checked into the repository, which was causing failures with cloning Prawn on Windows. That file has been removed, resolving the problem. ( [#692](https://github.com/prawnpdf/prawn/pull/692), Johnny Shields) ### Deprecated gradient method signatures have been removed. The `fill_gradient(point, width, height,...)` and `stroke_gradient(point, width, height,...)` calls are no longer supported. Use `fill_gradient(from, to, ...)` and `stroke_gradient(from, to, ...)` instead. ( [#674](https://github.com/prawnpdf/prawn/pull/674), Alexander Mankuta ) ### PDF::Core::Outline has been moved back to Prawn::Outline When we first broke out the PDF::Core namespace from Prawn's internals, our outline support ended going along with it. That was accidental, and so we've now restored Prawn::Outline and marked it as part of our stable API. ## Pre-1.0 Release Notes For changes before our 1.0 release, see the following wiki page: https://github.com/prawnpdf/prawn/wiki/CHANGELOG ruby-prawn-2.1.0.orig/Gemfile0000644000000000000000000000030012665203156014547 0ustar rootrootsource "https://rubygems.org" gemspec if ENV["CI"] platforms :rbx do gem "rubysl-singleton", "~> 2.0" gem "rubysl-digest", "~> 2.0" gem "rubysl-enumerator", "~> 2.0" end end ruby-prawn-2.1.0.orig/.mailmap0000644000000000000000000000012212665203156014677 0ustar rootrootJeremy Friesen Jeremy Friesen ruby-prawn-2.1.0.orig/.rubocop.yml0000644000000000000000000000723412665203156015543 0ustar rootrootEncoding: # To be safe we are leaving these files encoded ASCII-8BIT as # discussed at https://github.com/prawnpdf/prawn/pull/705 Exclude: - lib/prawn/images/jpg.rb - lib/prawn/images/png.rb - lib/prawn/images.rb - spec/png_spec.rb # These cops need to remain disabled for valid reasons on this code base # We need to reference non-ascii characters when testing and explaining # behavior related to win-1252, UTF-8 and UTF-16 encodings for example. AsciiComments: Enabled: false # We don't always prefer modified if statements even if they do fit on # a line. IfUnlessModifier: Enabled: false # In this case we supress Prawn::Errors::CannotFit while trying to scale # text down to fit. HandleExceptions: Exclude: - lib/prawn/text/formatted/box.rb # %w() style arrays don't always look better. WordArray: Enabled: false # Due to some layout constraints in our examples we want to allow these rule to # be ignored in the manual. Style/ClosingParenthesisIndentation: Exclude: - manual/**/* LineEndConcatenation: Exclude: - manual/**/* MultilineOperationIndentation: Exclude: - manual/**/* - prawn.gemspec Style/SpaceInsideParens: Exclude: - manual/**/* SingleSpaceBeforeFirstArg: Exclude: - manual/**/* # This file shows examples on how to instantiate a document in multiple ways, # it does not actually do the instantiation and isn't actually shadowing any # variables. ShadowingOuterLocalVariable: Exclude: - manual/basic_concepts/creation.rb # We currently ignore usage of semicolons on this page of the manual so we # don't have to worry about changing the content of the manual for now. Semicolon: Exclude: - manual/bounding_box/nesting.rb # This cops are candidates for enabling and doing the related cleanup and/or # refactoring Style/BlockDelimiters: Enabled: false EnforcedStyle: semantic Void: Enabled: false StringLiterals: Enabled: false HashSyntax: Enabled: false UselessAssignment: Enabled: false Lambda: Enabled: false LineLength: Enabled: false SpaceBeforeBlockBraces: Enabled: false SpaceInsideBrackets: Enabled: false FormatString: Enabled: false CollectionMethods: Enabled: false DotPosition: Enabled: false SingleLineBlockParams: Enabled: false PercentLiteralDelimiters: Enabled: false Documentation: Enabled: false RegexpLiteral: Enabled: false MethodLength: Enabled: false VariableInterpolation: Enabled: false AndOr: Enabled: false AssignmentInCondition: Enabled: false ClassAndModuleChildren: Enabled: false NumericLiterals: Enabled: false DoubleNegation: Enabled: false SelfAssignment: Enabled: false ClassLength: Enabled: false CaseEquality: Enabled: false RedundantSelf: Enabled: false BlockNesting: Enabled: false NegatedWhile: Enabled: false MultilineIfThen: Enabled: false ModuleFunction: Enabled: false CyclomaticComplexity: Enabled: false UnreachableCode: Enabled: false AccessorMethodName: Enabled: false SpaceAfterControlKeyword: Enabled: false PredicateName: Enabled: false ConstantName: Enabled: false MethodName: Enabled: false Alias: Enabled: false RedundantReturn: Enabled: false WhileUntilModifier: Enabled: false StringConversionInInterpolation: Enabled: false RedundantBegin: Enabled: false PerlBackrefs: Enabled: false ClassVars: Enabled: false ParameterLists: Enabled: false AbcSize: Enabled: false PerceivedComplexity: Enabled: false UnusedBlockArgument: Enabled: false UnusedMethodArgument: Enabled: false Next: Enabled: false ClassCheck: Enabled: false SpaceBeforeComma: Enabled: false StringLiteralsInInterpolation: Enabled: false GuardClause: Enabled: false BlockEndNewline: Enabled: false ruby-prawn-2.1.0.orig/bench/0000755000000000000000000000000012665203156014342 5ustar rootrootruby-prawn-2.1.0.orig/bench/afm_text_bench.rb0000644000000000000000000000057012665203156017637 0ustar rootroot# encoding: utf-8 $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) require "prawn" require "benchmark" N = 2000 Benchmark.bmbm do |x| x.report("AFM text") do Prawn::Document.new { N.times do (1..5).each do |i| draw_text "Hello Prawn", :at => [200, i * 100] end start_new_page end }.render end end ruby-prawn-2.1.0.orig/bench/ttf_text_bench.rb0000644000000000000000000000065412665203156017674 0ustar rootroot# encoding: utf-8 $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) require "prawn" require "benchmark" N = 2000 Benchmark.bmbm do |x| x.report("TTF text") do Prawn::Document.new { font "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf" N.times do (1..5).each do |i| draw_text "Hello Prawn", :at => [200, i * 100] end start_new_page end }.render end end ruby-prawn-2.1.0.orig/bench/png_type_6.rb0000644000000000000000000000051012665203156016735 0ustar rootroot# encoding: utf-8 $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) require "prawn" require "benchmark" N = 100 Benchmark.bmbm do |x| x.report("PNG Type 6") do N.times do Prawn::Document.new do image "#{Prawn::DATADIR}/images/dice.png" end.render_file("dice.pdf") end end end ruby-prawn-2.1.0.orig/bench/png_type_6_objects.rb0000644000000000000000000000052112665203156020450 0ustar rootroot# encoding: utf-8 $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) require "prawn" GC.disable before = GC.stat Prawn::Document.new do image "#{Prawn::DATADIR}/images/dice.png" end.render after = GC.stat total = after[:total_allocated_object] - before[:total_allocated_object] puts "allocated objects: #{total}" ruby-prawn-2.1.0.orig/bench/table_bench.rb0000644000000000000000000000270712665203156017123 0ustar rootroot# encoding: utf-8 $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib')) require "prawn" require "benchmark" # Helpers for benchmark class String CHARS = ("a".."z").to_a def self.random(length) length.times.collect { CHARS.sample }.join end end def data_for_table(columns, rows, string_size) rows.times.collect { columns.times.collect { String.random(string_size) } } end def benchmark_table_generation(columns, rows, string_size, options = {}) data = data_for_table(columns, rows, string_size) Benchmark.bm do |x| x.report("#{columns}x#{rows} table (#{columns * rows} cells, with #{string_size} char string contents#{", options = #{options.inspect}" unless options.empty?})") do Prawn::Document.new { table(data, options) }.render end end end # Slowest case: styled table, which is very squeezed horizontally, # so text has to be wrapped benchmark_table_generation(26, 50, 10, :row_colors => ['FFFFFF', 'F0F0FF'], :header => true, :cell_style => { :inline_format => true }) # Try building and rendering tables of different sizes benchmark_table_generation(10, 400, 5) benchmark_table_generation(10, 200, 5) benchmark_table_generation(10, 100, 5) # Try different optional arguments to Prawn::Document#table benchmark_table_generation(10, 450, 5, :cell_style => { :inline_format => true }) benchmark_table_generation(10, 450, 5, :row_colors => ['FFFFFF', 'F0F0FF'], :header => true, :cell_style => { :inline_format => true }) ruby-prawn-2.1.0.orig/manual/0000755000000000000000000000000012665203156014540 5ustar rootrootruby-prawn-2.1.0.orig/manual/repeatable_content/0000755000000000000000000000000012665203156020376 5ustar rootrootruby-prawn-2.1.0.orig/manual/repeatable_content/repeater.rb0000644000000000000000000000312712665203156022535 0ustar rootroot# encoding: utf-8 # # The repeat method is quite versatile when it comes to define # the intervals at which the content block should repeat. # # The interval may be a symbol (:all, :odd, # :even), an array listing the pages, a range or a # Proc that receives the page number as an argument and should # return true if the content is to be repeated on the given page. # # You may also pass an option :dynamic to reevaluate the code block # on every call which is useful when the content changes based on the page # number. # # It is also important to say that no matter where you define the repeater it # will be applied to all matching pages. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do repeat(:all) do draw_text "All pages", :at => bounds.top_left end repeat(:odd) do draw_text "Only odd pages", :at => [0, 0] end repeat(:even) do draw_text "Only even pages", :at => [0, 0] end repeat([1, 3, 7]) do draw_text "Only on pages 1, 3 and 7", :at => [100, 0] end repeat(2..4) do draw_text "From the 2nd to the 4th page", :at => [300, 0] end repeat(lambda { |pg| pg % 3 == 0 }) do draw_text "Every third page", :at => [250, 20] end repeat(:all, :dynamic => true) do draw_text page_number, :at => [500, 0] end 10.times do start_new_page draw_text "A wonderful page", :at => [400, 400] end end ruby-prawn-2.1.0.orig/manual/repeatable_content/repeatable_content.rb0000644000000000000000000000214012665203156024556 0ustar rootroot# encoding: utf-8 # # Examples for stamps and repeaters. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) Prawn::ManualBuilder::Example.generate("repeatable_content.pdf", :page_size => "FOLIO") do package "repeatable_content" do |p| p.example "repeater", :eval_source => false p.example "stamp" p.example "page_numbering", :eval_source => false p.example "alternate_page_numbering", :eval_source => false p.intro do prose("Prawn offers two ways to handle repeatable content blocks. Repeater is useful for content that gets repeated at well defined intervals while Stamp is more appropriate if you need better control of when to repeat it. There is also one very specific helper for numbering pages. The examples show:") list( "How to repeat content on several pages with a single invocation", "How to create a new Stamp", 'How to "stamp" the content block on the page', "How to number the document pages with one simple call" ) end end end ruby-prawn-2.1.0.orig/manual/repeatable_content/alternate_page_numbering.rb0000644000000000000000000000217212665203156025746 0ustar rootroot# encoding: utf-8 # # Below is the code to generate page numbers that alternate being rendered # on the right and left side of the page. The first page will have a "1" in # the bottom right corner. The second page will have a "2" in the bottom # left corner of the page. The third a "3" in the bottom right, etc. require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do text "This is the first page!" 10.times do start_new_page text "Here comes yet another page." end string = "" odd_options = { :at => [bounds.right - 150, 0], :width => 150, :align => :right, :page_filter => :odd, :start_count_at => 1 } even_options = { :at => [0, bounds.left], :width => 150, :align => :left, :page_filter => :even, :start_count_at => 2 } number_pages string, odd_options number_pages string, even_options end ruby-prawn-2.1.0.orig/manual/repeatable_content/stamp.rb0000644000000000000000000000252112665203156022047 0ustar rootroot# encoding: utf-8 # # Stamps should be used when you have content that will be included multiple # times in a document. Its advantages over creating the content anew each time # are: # 1. Faster document creation # 2. Smaller final document # 3. Faster display on subsequent displays of the repeated # element because the viewer application can cache the rendered # results # # The create_stamp method does just what it says. Pass it a block # with the content that should be generated and the stamp will be created. # # There are two methods to render the stamp on a page stamp and # stamp_at. The first will render the stamp as is while the # second accepts a point to serve as an offset to the stamp content. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do create_stamp("approved") do rotate(30, :origin => [-5, -5]) do stroke_color "FF3333" stroke_ellipse [0, 0], 29, 15 stroke_color "000000" fill_color "993333" font("Times-Roman") do draw_text "Approved", :at => [-23, -3] end fill_color "000000" end end stamp "approved" stamp_at "approved", [200, 200] end ruby-prawn-2.1.0.orig/manual/repeatable_content/page_numbering.rb0000644000000000000000000000352512665203156023712 0ustar rootroot# encoding: utf-8 # # The number_pages method is a simple way to number the pages of # your document. It should be called towards the end of the document since # pages created after the call won't be numbered. # # It accepts a string and a hash of options: # # start_count_at is the value from which to start numbering pages # # total_pages If provided, will replace total with # the value given. Useful for overriding the total number of pages when using # the start_count_at option. # # page_filter, which is one of: :all, # :odd, :even, an array, a range, or a Proc that # receives the page number as an argument and should return true if the page # number should be printed on that page. # # color which accepts the same values as fill_color # # As well as any option accepted by text_box # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do text "This is the first page!" 10.times do start_new_page text "Here comes yet another page." end string = "page of " # Green page numbers 1 to 7 options = { :at => [bounds.right - 150, 0], :width => 150, :align => :right, :page_filter => (1..7), :start_count_at => 1, :color => "007700" } number_pages string, options # Gray page numbers from 8 on up options[:page_filter] = lambda{ |pg| pg > 7 } options[:start_count_at] = 8 options[:color] = "333333" number_pages string, options start_new_page text "See. This page isn't numbered and doesn't count towards the total." end ruby-prawn-2.1.0.orig/manual/bounding_box/0000755000000000000000000000000012665203156017215 5ustar rootrootruby-prawn-2.1.0.orig/manual/bounding_box/bounding_box.rb0000644000000000000000000000203312665203156022215 0ustar rootroot# encoding: utf-8 # # Examples for bounding boxes. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) Prawn::ManualBuilder::Example.generate("bounding_box.pdf", :page_size => "FOLIO") do package "bounding_box" do |p| p.section "Basics" do |s| s.example "creation" s.example "bounds" end p.section "Advanced" do |s| s.example "stretchy" s.example "nesting" s.example "indentation" s.example "canvas" s.example "russian_boxes" end p.intro do prose("Bounding boxes are the basic containers for structuring the content flow. Even being low level building blocks sometimes their simplicity is very welcome. The examples show:") list( "How to create bounding boxes with specific dimensions", "How to inspect the current bounding box for its coordinates", "Stretchy bounding boxes", "Nested bounding boxes", "Indent blocks" ) end end end ruby-prawn-2.1.0.orig/manual/bounding_box/creation.rb0000644000000000000000000000152512665203156021351 0ustar rootroot# encoding: utf-8 # # If you've read the basic concepts examples you probably know that the origin # of a page is on the bottom left corner and that the content flows from top to # bottom. # # You also know that a Bounding Box is a structure for helping the content flow. # # A bounding box can be created with the bounding_box method. Just # provide the top left corner, a required :width option and an # optional :height. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do bounding_box([200, cursor - 100], :width => 200, :height => 100) do text "Just your regular bounding box" transparent(0.5) { stroke_bounds } end end ruby-prawn-2.1.0.orig/manual/bounding_box/canvas.rb0000644000000000000000000000167312665203156021024 0ustar rootroot# encoding: utf-8 # # The origin example already mentions that a new document already comes with # a margin box whose bottom left corner is used as the origin for calculating # coordinates. # # What has not been told is that there is one helper for "bypassing" the margin # box: canvas. This method is a shortcut for creating a bounding # box mapped to the absolute coordinates and evaluating the code inside it. # # The following snippet draws a circle on each of the four absolute corners. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do canvas do fill_circle [bounds.left, bounds.top], 30 fill_circle [bounds.right, bounds.top], 30 fill_circle [bounds.right, bounds.bottom], 30 fill_circle [0, 0], 30 end end ruby-prawn-2.1.0.orig/manual/bounding_box/nesting.rb0000644000000000000000000000267312665203156021221 0ustar rootroot# encoding: utf-8 # # Normally when we provide the top left corner of a bounding box we # express the coordinates relative to the margin box. This is not the # case when we have nested bounding boxes. Once nested the inner bounding box # coordinates are relative to the outter bounding box. # # This example shows some nested bounding boxes with fixed and stretchy heights. # Note how the cursor method returns coordinates relative to # the current bounding box. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do def box_content(string) text string transparent(0.5) { stroke_bounds } end gap = 20 bounding_box([50, cursor], :width => 400, :height => 200) do box_content("Fixed height") bounding_box([gap, cursor - gap], :width => 300) do text "Stretchy height" bounding_box([gap, bounds.top - gap], :width => 100) do text "Stretchy height" transparent(0.5) { dash(1); stroke_bounds; undash } end bounding_box([gap * 7, bounds.top - gap], :width => 100, :height => 50) do box_content("Fixed height") end transparent(0.5) { dash(1); stroke_bounds; undash } end bounding_box([gap, cursor - gap], :width => 300, :height => 50) do box_content("Fixed height") end end end ruby-prawn-2.1.0.orig/manual/bounding_box/stretchy.rb0000644000000000000000000000172512665203156021414 0ustar rootroot# encoding: utf-8 # # Bounding Boxes accept an optional :height parameter. Unless it # is provided the bounding box will be stretchy. It will expand the height to # fit all content generated inside it. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do y_position = cursor bounding_box([0, y_position], :width => 200, :height => 100) do text "This bounding box has a height of 100. If this text gets too large " + "it will flow to the next page." transparent(0.5) { stroke_bounds } end bounding_box([300, y_position], :width => 200) do text "This bounding box has variable height. No matter how much text is " + "written here, the height will expand to fit." text " _" * 100 text " *" * 100 transparent(0.5) { stroke_bounds } end end ruby-prawn-2.1.0.orig/manual/bounding_box/russian_boxes.rb0000644000000000000000000000226412665203156022432 0ustar rootroot# encoding: utf-8 # # This example is mostly just for fun, and shows how nested bounding boxes # can simplify calculations. See the "Bounding Box" section of the manual # for more basic uses. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do def combine(a1, a2) output = [] a1.each do |i1| a2.each do |i2| output += [[i1, i2]] end end output end def recurse_bounding_box(max_depth = 4, depth = 1) width = (bounds.width - 15) / 2 height = (bounds.height - 15) / 2 left_top_corners = combine([5, bounds.right - width - 5], [bounds.top - 5, height + 5]) left_top_corners.each do |lt| bounding_box(lt, :width => width, :height => height) do stroke_bounds recurse_bounding_box(max_depth, depth + 1) if depth < max_depth end end end # Set up a bbox from the dashed line to the bottom of the page bounding_box([0, cursor], :width => bounds.width, :height => cursor) do recurse_bounding_box end end ruby-prawn-2.1.0.orig/manual/bounding_box/bounds.rb0000644000000000000000000000331712665203156021040 0ustar rootroot# encoding: utf-8 # # The bounds method returns the current bounding box. This is # useful because the Prawn::BoundingBox exposes some nice boundary # helpers. # # top, bottom, left and # right methods return the bounding box boundaries relative to its # translated origin. top_left, top_right, # bottom_left and bottom_right return those boundaries # pairs inside arrays. # # All these methods have an "absolute" version like absolute_right. # The absolute version returns the same boundary relative to the page absolute # coordinates. # # The following snippet shows the boundaries for the margin box side by side # with the boundaries for a custom bounding box. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do def print_coordinates text "top: #{bounds.top}" text "bottom: #{bounds.bottom}" text "left: #{bounds.left}" text "right: #{bounds.right}" move_down 10 text "absolute top: #{sprintf "%.2f", bounds.absolute_top}" text "absolute bottom: #{sprintf "%.2f", bounds.absolute_bottom}" text "absolute left: #{sprintf "%.2f", bounds.absolute_left}" text "absolute right: #{sprintf "%.2f", bounds.absolute_right}" end text "Margin box bounds:" move_down 5 print_coordinates bounding_box([250, cursor + 140], :width => 200, :height => 150) do text "This bounding box bounds:" move_down 5 print_coordinates transparent(0.5) { stroke_bounds } end end ruby-prawn-2.1.0.orig/manual/bounding_box/indentation.rb0000644000000000000000000000242312665203156022057 0ustar rootroot# encoding: utf-8 # # Sometimes you just need to indent a portion of the contents of a bounding box, # and using a nested bounding box is pure overkill. The indent # method is what you might need. # # Just provide a number for it to indent all content generated inside the # block. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do text "No indentation on the margin box." indent(20) do text "Some indentation inside an indent block." end move_down 20 bounding_box([50, cursor], :width => 400, :height => cursor) do transparent(0.5) { stroke_bounds } move_down 10 text "No indentation inside this bounding box." indent(40) do text "Inside an indent block. And so is this horizontal line:" stroke_horizontal_rule end move_down 10 text "No indentation" move_down 20 indent(60) do text "Another indent block." bounding_box([0, cursor], :width => 200) do text "Note that this bounding box coordinates are relative to the " + "indent block" transparent(0.5) { stroke_bounds } end end end end ruby-prawn-2.1.0.orig/manual/basic_concepts/0000755000000000000000000000000012665203156017517 5ustar rootrootruby-prawn-2.1.0.orig/manual/basic_concepts/basic_concepts.rb0000644000000000000000000000246712665203156023034 0ustar rootroot# encoding: utf-8 # # Examples for Prawn basic concepts. # require_relative "../example_helper" Prawn::ManualBuilder::Example.generate("basic_concepts.pdf", :page_size => "FOLIO") do package "basic_concepts" do |p| p.example "creation", :eval_source => false, :full_source => true p.example "origin" p.example "cursor" p.example "other_cursor_helpers" p.example "adding_pages" p.example "measurement" p.example "view", :eval_source => false, :full_source => true p.intro do prose("This chapter covers the minimum amount of functionality you'll need to start using Prawn. If you are new to Prawn this is the first chapter to read. Once you are comfortable with the concepts shown here you might want to check the Basics section of the Graphics, Bounding Box and Text sections. The examples show:") list( "How to create new pdf documents in every possible way", "Where the origin for the document coordinates is. What are Bounding Boxes and how they interact with the origin", "How the cursor behaves", "How to start new pages", "What the base unit for measurement and coordinates is and how to use other convenient measures", "How to build custom view objects that use Prawn's DSL" ) end end end ruby-prawn-2.1.0.orig/manual/basic_concepts/origin.rb0000644000000000000000000000263612665203156021342 0ustar rootroot# encoding: utf-8 # # This is the most important concept you need to learn about Prawn: # # PDF documents have the origin [0,0] at the bottom-left corner of # the page. # # A bounding box is a structure which provides boundaries for inserting content. # A bounding box also has the property of relocating the origin to its relative # bottom-left corner. However, be aware that the location specified when # creating a bounding box is its top-left corner, not bottom-left (hence the # [100, 300] coordinates below). # # Even if you never create a bounding box explictly, each document already comes # with one called the margin box. This initial bounding box is the one # responsible for the document margins. # # So practically speaking the origin of a page on a default generated document # isn't the absolute bottom left corner but the bottom left corner of the margin # box. # # The following snippet strokes a circle on the margin box origin. Then strokes # the boundaries of a bounding box and a circle on its origin. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do stroke_axis stroke_circle [0, 0], 10 bounding_box([100, 300], :width => 300, :height => 200) do stroke_bounds stroke_circle [0, 0], 10 end end ruby-prawn-2.1.0.orig/manual/basic_concepts/view.rb0000644000000000000000000000212712665203156021020 0ustar rootroot# encoding: UTF-8 # # To create a custom class that extends Prawn's functionality, # use the Prawn::View mixin. This approach is safer than creating # subclasses of Prawn::Document while being just as convenient. # # By using this mixin, your state will be kept completely separate # from Prawn::Document's state, and you will avoid accidental method # collisions within Prawn::Document. # # To build custom classes that make use of other custom classes, # you can define a method named document() that returns # any object that acts similar to a Prawn::Document # object. Prawn::View will then direct all delegated # calls to that object instead. require_relative "../example_helper" class Greeter include Prawn::View def initialize(name) @name = name end def say_hello text "Hello, #{@name}!" end def say_goodbye font("Courier") do text "Goodbye, #{@name}!" end end end greeter = Greeter.new("Gregory") greeter.say_hello greeter.say_goodbye greeter.save_as("greetings.pdf") ruby-prawn-2.1.0.orig/manual/basic_concepts/cursor.rb0000644000000000000000000000231012665203156021355 0ustar rootroot# encoding: utf-8 # # We normally write our documents from top to bottom and it is no different with # Prawn. Even if the origin is on the bottom left corner we still fill the page # from the top to the bottom. In other words the cursor for inserting content # starts on the top of the page. # # Most of the functions that insert content on the page will start at the # current cursor position and proceed to the bottom of the page. # # The following snippet shows how the cursor behaves when we add some text to # the page and demonstrates some of the helpers to manage the cursor position. # The cursor method returns the current cursor position. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do stroke_axis text "the cursor is here: #{cursor}" text "now it is here: #{cursor}" move_down 200 text "on the first move the cursor went down to: #{cursor}" move_up 100 text "on the second move the cursor went up to: #{cursor}" move_cursor_to 50 text "on the last move the cursor went directly to: #{cursor}" end ruby-prawn-2.1.0.orig/manual/basic_concepts/measurement.rb0000644000000000000000000000152312665203156022372 0ustar rootroot# encoding: utf-8 # # The base unit in Prawn is the PDF Point. One PDF Point is equal to 1/72 of # an inch. # # There is no need to waste time converting this measure. Prawn provides # helpers for converting from other measurements # to PDF Points. # # Just require "prawn/measurement_extensions" and it will mix some # helpers onto Numeric for converting common measurement units to # PDF Points. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do require "prawn/measurement_extensions" [:mm, :cm, :dm, :m, :in, :yd, :ft].each do |measurement| text "1 #{measurement} in PDF Points: #{1.send(measurement)} pt" move_down 5.mm end end ruby-prawn-2.1.0.orig/manual/basic_concepts/creation.rb0000644000000000000000000000257012665203156021654 0ustar rootroot# encoding: utf-8 # # There are three ways to create a PDF Document in Prawn: creating a new # Prawn::Document instance, or using the # Prawn::Document.generate method with and without block arguments. # # The following snippet showcase each way by creating a simple document with # some text drawn. # # When we instantiate the Prawn::Document object the actual pdf # document will only be created after we call render_file. # # The generate method will render the actual pdf object after exiting the block. # When we use it without a block argument the provided block is evaluated in the # context of a newly created Prawn::Document instance. When we use # it with a block argument a Prawn::Document instance is created # and passed to the block. # # The generate method without block arguments requires # less typing and defines and renders the pdf document in one shot. # Almost all of the examples are coded this way. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) # Assignment pdf = Prawn::Document.new pdf.text "Hello World" pdf.render_file "assignment.pdf" # Implicit Block Prawn::Document.generate("implicit.pdf") do text "Hello World" end # Explicit Block Prawn::Document.generate("explicit.pdf") do |pdf| pdf.text "Hello World" end ruby-prawn-2.1.0.orig/manual/basic_concepts/adding_pages.rb0000644000000000000000000000203012665203156022444 0ustar rootroot# encoding: utf-8 # # A PDF document is a collection of pages. When we create a new document be it # with Document.new or on a Document.generate block # one initial page is created for us. # # Some methods might create new pages automatically like text which # will create a new page whenever the text string cannot fit on the current # page. # # But what if you want to go to the next page by yourself? That is easy. # # Just use the start_new_page method and a shiny new page will be # created for you just like in the following snippet. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do text "We are still on the initial page for this example. Now I'll ask " + "Prawn to gently start a new page. Please follow me to the next page." start_new_page text "See. We've left the previous page behind." end ruby-prawn-2.1.0.orig/manual/basic_concepts/other_cursor_helpers.rb0000644000000000000000000000241212665203156024303 0ustar rootroot# encoding: utf-8 # # Another group of helpers for changing the cursor position are the pad methods. # They accept a numeric value and a block. pad will use the numeric # value to move the cursor down both before and after the block content. # pad_top will only move the cursor before the block while # pad_bottom will only move after. # # float is a method for not changing the cursor. Pass it a block # and the cursor will remain on the same place when the block returns. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do stroke_horizontal_rule pad(20) { text "Text padded both before and after." } stroke_horizontal_rule pad_top(20) { text "Text padded on the top." } stroke_horizontal_rule pad_bottom(20) { text "Text padded on the bottom." } stroke_horizontal_rule move_down 30 text "Text written before the float block." float do move_down 30 bounding_box([0, cursor], :width => 200) do text "Text written inside the float block." stroke_bounds end end text "Text written after the float block." end ruby-prawn-2.1.0.orig/manual/text/0000755000000000000000000000000012665203156015524 5ustar rootrootruby-prawn-2.1.0.orig/manual/text/alignment.rb0000644000000000000000000000322412665203156020030 0ustar rootroot# encoding: utf-8 # # Horizontal text alignment can be achieved by supplying the :align # option to the text methods. Available options are :left # (default), :right, :center, and # :justify. # # Vertical text alignment can be achieved using the :valign option # with the text methods. Available options are :top (default), # :center, and :bottom. # # Both forms of alignment will be evaluated in the context of the current # bounding_box. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do text "This text should be left aligned" text "This text should be centered", :align => :center text "This text should be right aligned", :align => :right bounding_box([0, 220], :width => 250, :height => 220) do text "This text is flowing from the left. " * 4 move_down 15 text "This text is flowing from the center. " * 3, :align => :center move_down 15 text "This text is flowing from the right. " * 4, :align => :right move_down 15 text "This text is justified. " * 6, :align => :justify transparent(0.5) { stroke_bounds } end bounding_box([300, 220], :width => 250, :height => 220) do text "This text should be vertically top aligned" text "This text should be vertically centered", :valign => :center text "This text should be vertically bottom aligned", :valign => :bottom transparent(0.5) { stroke_bounds } end end ruby-prawn-2.1.0.orig/manual/text/color.rb0000644000000000000000000000123412665203156017167 0ustar rootroot# encoding: utf-8 # # The :color attribute can give a block of text a default color, # in RGB hex format or 4-value CMYK. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do text "Default color is black" move_down 25 text "Changed to red", :color => "FF0000" move_down 25 text "CMYK color", :color => [22, 55, 79, 30] move_down 25 text "Also works with inline formatting", :color => "0000FF", :inline_format => true end ruby-prawn-2.1.0.orig/manual/text/right_to_left_text.rb0000644000000000000000000000471012665203156021750 0ustar rootroot# encoding: utf-8 # # Prawn can be used with right-to-left text. The direction can be set # document-wide, on particular text, or on a text-box. Setting the direction to # :rtl automatically changes the default alignment to # :right # # You can even override direction on an individual fragment. The one caveat is # that two fragments going against the main direction cannot be placed next to # each other without appearing in the wrong order. # # Writing bidirectional text that combines both left-to-right and right-to-left # languages is easy using the bidi Ruby Gem and its # render_visual function. See https://github.com/elad/ruby-bidi for # instructions and an example using Prawn. require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do # set the direction document-wide self.text_direction = :rtl font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf", :size => 16) do long_text = "写个小爬虫把你的页面上的关键信息顺次爬下来也不是什么难事写个小爬虫把你的页面上的关键信息顺次爬下来也不是什么难事写个小爬虫把你的页面上的关键信息顺次爬下来也不是什么难事写个小" text long_text move_down 20 text "You can override the document direction.", :direction => :ltr move_down 20 formatted_text [{ :text => "更可怕的是,同质化竞争对手可以按照" }, { :text => "URL", :direction => :ltr }, { :text => "中后面这个" }, { :text => "ID", :direction => :ltr }, { :text => "来遍历您的" }, { :text => "DB", :direction => :ltr }, { :text => "中的内容,写个小爬虫把你的页面上的关键信息顺次爬下来也不是什么难事,这样的话,你就非常被动了。" }] move_down 20 formatted_text [{ :text => "更可怕的是,同质化竞争对手可以按照" }, { :text => "this", :direction => :ltr }, { :text => "won't", :direction => :ltr, :size => 24 }, { :text => "work", :direction => :ltr }, { :text => "中的内容,写个小爬虫把你的页面上的关键信息顺次爬下来也不是什么难事" }] end end ruby-prawn-2.1.0.orig/manual/text/kerning_and_character_spacing.rb0000644000000000000000000000301612665203156024050 0ustar rootroot# encoding: utf-8 # # Kerning is the process of adjusting the spacing between characters in a # proportional font. It is usually done with specific letter pairs. We can # switch it on and off if it is available with the current font. Just pass a # boolean value to the :kerning option of the text methods. # # Character Spacing is the space between characters. It can be increased or # decreased and will have effect on the whole text. Just pass a number to the # :character_spacing option from the text methods. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do font_size(30) do text_box "With kerning:", :kerning => true, :at => [0, y - 40] text_box "Without kerning:", :kerning => false, :at => [0, y - 80] text_box "Tomato", :kerning => true, :at => [250, y - 40] text_box "Tomato", :kerning => false, :at => [250, y - 80] text_box "WAR", :kerning => true, :at => [400, y - 40] text_box "WAR", :kerning => false, :at => [400, y - 80] text_box "F.", :kerning => true, :at => [500, y - 40] text_box "F.", :kerning => false, :at => [500, y - 80] end move_down 80 string = "What have you done to the space between the characters?" [-2, -1, 0, 0.5, 1, 2].each do |spacing| move_down 20 text "#{string} (character_spacing: #{spacing})", :character_spacing => spacing end end ruby-prawn-2.1.0.orig/manual/text/fallback_fonts.rb0000644000000000000000000000261012665203156021020 0ustar rootroot# encoding: utf-8 # # Prawn enables the declaration of fallback fonts for those glyphs that may not # be present in the desired font. Use the :fallback_fonts option # with any of the text or text box methods, or set fallback_fonts document-wide. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do file = "#{Prawn::DATADIR}/fonts/gkai00mp.ttf" font_families["Kai"] = { :normal => { :file => file, :font => "Kai" } } file = "#{Prawn::DATADIR}/fonts/Panic+Sans.dfont" font_families["Panic Sans"] = { :normal => { :file => file, :font => "PanicSans" } } font("Panic Sans") do text("When fallback fonts are included, each glyph will be rendered " + "using the first font that includes the glyph, starting with the " + "current font and then moving through the fallback fonts from left " + "to right." + "\n\n" + "hello ƒ 你好\n再见 ƒ goodbye", :fallback_fonts => ["Times-Roman", "Kai"]) end move_down 20 formatted_text([ { :text => "Fallback fonts can even override" }, { :text => "fragment fonts (你好)", :font => "Times-Roman" } ], :fallback_fonts => ["Times-Roman", "Kai"]) end ruby-prawn-2.1.0.orig/manual/text/paragraph_indentation.rb0000644000000000000000000000221712665203156022414 0ustar rootroot# encoding: utf-8 # # Prawn strips all whitespace from the beginning and the end of strings so there # are two ways to indent paragraphs: # # One is to use non-breaking spaces which Prawn won't strip. One shortcut to # using them is the Prawn::Text::NBSP. # # The other is to use the :indent_paragraphs option with the text # methods. Just pass a number with the space to indent the first line in each # paragraph. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do # Using non-breaking spaces text " " * 10 + "This paragraph won't be indented. " * 10 + "\n#{Prawn::Text::NBSP * 10}" + "This one will with NBSP. " * 10 move_down 20 text "This paragraph will be indented. " * 10 + "\n" + "This one will too. " * 10, :indent_paragraphs => 60 move_down 20 text "FROM RIGHT TO LEFT:" text "This paragraph will be indented. " * 10 + "\n" + "This one will too. " * 10, :indent_paragraphs => 60, :direction => :rtl end ruby-prawn-2.1.0.orig/manual/text/registering_families.rb0000644000000000000000000000326112665203156022246 0ustar rootroot# encoding: utf-8 # # Registering font families will help you when you want to use a font over and # over or if you would like to take advantage of the :style option # of the text methods and the b and i tags when using # inline formatting. # # To register a font family update the font_families # hash with the font path for each style you want to use. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do # Registering a single TTF font font_families.update( "DejaVu Sans" => { :normal => "#{Prawn::DATADIR}/fonts/DejaVuSans.ttf" } ) font("DejaVu Sans") do text "Using the DejaVu Sans font providing only its name to the font method" end move_down 20 # Registering a DFONT package font_path = "#{Prawn::DATADIR}/fonts/Panic+Sans.dfont" font_families.update( "Panic Sans" => { :normal => { :file => font_path, :font => "PanicSans" }, :italic => { :file => font_path, :font => "PanicSans-Italic" }, :bold => { :file => font_path, :font => "PanicSans-Bold" }, :bold_italic => { :file => font_path, :font => "PanicSans-BoldItalic" } } ) font "Panic Sans" text "Also using Panic Sans by providing only its name" move_down 20 text "Taking advantage of the inline formatting", :inline_format => true move_down 20 [:bold, :bold_italic, :italic, :normal].each do |style| text "Using the #{style} style option.", :style => style move_down 10 end end ruby-prawn-2.1.0.orig/manual/text/inline.rb0000644000000000000000000000315212665203156017330 0ustar rootroot# encoding: utf-8 # # Inline formatting gives you the option to format specific portions of a text. # It uses HTML-esque syntax inside the text string. Supported tags are: # b (bold), i (italic), u (underline), # strikethrough, sub (subscript), sup # (superscript) # # The following tags accept specific attributes: font accepts # size, name, and character_spacing; # color accepts rgb and cmyk; # link accepts href for external links. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do %w[b i u strikethrough sub sup].each do |tag| text "Just your regular text <#{tag}>except this portion " + "is using the #{tag} tag", :inline_format => true move_down 10 end text "This line uses " + "all the font tag attributes in " + "a single line. ", :inline_format => true move_down 10 text "Coloring in both RGB " + "and CMYK", :inline_format => true move_down 10 text "This an external link to the " + "Prawn wiki" + "", :inline_format => true end ruby-prawn-2.1.0.orig/manual/text/text_box_overflow.rb0000644000000000000000000000365612665203156021642 0ustar rootroot# encoding: utf-8 # # The text_box method accepts both :width and # :height options. So what happens if the text doesn't fit the box? # # The default behavior is to truncate the text but this can be changed with # the :overflow option. Available modes are :expand # (the box will increase to fit the text) and :shrink_to_fit # (the text font size will be shrunk to fit). # # If :shrink_to_fit mode is used with the # :min_font_size option set, the font size will not be reduced to # less than the value provided even if it means truncating some text. # # If the :disable_wrap_by_char is set to true # then any text wrapping done while using the :shrink_to_fit # mode will not break up the middle of words. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do string = "This is the sample text used for the text boxes. See how it " + "behave with the various overflow options used." text string y_position = cursor - 20 [:truncate, :expand, :shrink_to_fit].each_with_index do |mode, i| text_box string, :at => [i * 150, y_position], :width => 100, :height => 50, :overflow => mode end string = "If the box is too small for the text, :shrink_to_fit " + "can render the text in a really small font size." move_down 120 text string y_position = cursor - 20 [nil, 8, 10, 12].each_with_index do |value, index| text_box string, :at => [index * 150, y_position], :width => 50, :height => 50, :overflow => :shrink_to_fit, :min_font_size => value end end ruby-prawn-2.1.0.orig/manual/text/rendering_and_color.rb0000644000000000000000000000240112665203156022043 0ustar rootroot# encoding: utf-8 # # You have already seen how to set the text color using both inline formatting # and the format text methods. There is another way by using the graphics # methods fill_color and stroke_color. # # When reading the graphics reference you learned about fill and stroke. If you # haven't read it before, read it now before continuing. # # Text can be rendered by # being filled (the default mode) or just stroked or both filled and stroked. # This can be set using the text_rendering_mode method or the # :mode option on the text methods. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do fill_color "00ff00" stroke_color "0000ff" font_size(40) do # normal rendering mode: fill text "This text is filled with green." move_down 20 # inline rendering mode: stroke text "This text is stroked with blue", :mode => :stroke move_down 20 # block rendering mode: fill and stroke text_rendering_mode(:fill_stroke) do text "This text is filled with green and stroked with blue" end end end ruby-prawn-2.1.0.orig/manual/text/positioned_text.rb0000644000000000000000000000314412665203156021274 0ustar rootroot# encoding: utf-8 # # Sometimes we want the text on a specific position on the page. The # text method just won't help us. # # There are two other methods for this task: draw_text and # text_box. # # draw_text is very simple. It will render text starting at the # position provided to the :at option. It won't flow to a new line # even if it hits the document boundaries so it is best suited for short text. # # text_box gives us much more control over the output. Just provide # :width and :height options and the text will flow # accordingly. Even if you don't provide a :width option the text # will flow to a new line if it reaches the right border. # # Given that, text_box is the better option available. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do draw_text "This draw_text line is absolute positioned. However don't " + "expect it to flow even if it hits the document border", :at => [200, 300] text_box "This is a text box, you can control where it will flow by " + "specifying the :height and :width options", :at => [100, 250], :height => 100, :width => 100 text_box "Another text box with no :width option passed, so it will " + "flow to a new line whenever it reaches the right margin. ", :at => [200, 100] end ruby-prawn-2.1.0.orig/manual/text/formatted_callbacks.rb0000644000000000000000000000426312665203156022042 0ustar rootroot# encoding: utf-8 # # The :callback option is also available for the formatted text # methods. # # This option accepts an object (or array of objects) on which two methods # will be called if defined: render_behind and # render_in_front. They are called before and after rendering the # text fragment and are passed the fragment as an argument. # # This example defines two new callback classes and provide callback objects # for the formatted_text # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do class HighlightCallback def initialize(options) @color = options[:color] @document = options[:document] end def render_behind(fragment) original_color = @document.fill_color @document.fill_color = @color @document.fill_rectangle(fragment.top_left, fragment.width, fragment.height) @document.fill_color = original_color end end class ConnectedBorderCallback def initialize(options) @radius = options[:radius] @document = options[:document] end def render_in_front(fragment) @document.stroke_polygon(fragment.top_left, fragment.top_right, fragment.bottom_right, fragment.bottom_left) @document.fill_circle(fragment.top_left, @radius) @document.fill_circle(fragment.top_right, @radius) @document.fill_circle(fragment.bottom_right, @radius) @document.fill_circle(fragment.bottom_left, @radius) end end highlight = HighlightCallback.new(:color => 'ffff00', :document => self) border = ConnectedBorderCallback.new(:radius => 2.5, :document => self) formatted_text [ { :text => "hello", :callback => highlight }, { :text => " " }, { :text => "world", :callback => border }, { :text => " " }, { :text => "hello world", :callback => [highlight, border] } ], :size => 20 end ruby-prawn-2.1.0.orig/manual/text/font.rb0000644000000000000000000000221212665203156017014 0ustar rootroot# encoding: utf-8 # # The font method can be used in three different ways. # # If we don't pass it any arguments it will return the current font being used # to render text. # # If we just pass it a font name it will use that font for rendering text # through the rest of the document. # # It can also be used by passing a font name and a block. In this case the # specified font will only be used to render text inside the block. # # The default font is Helvetica. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do text "Let's see which font we are using: #{font.inspect}" move_down 20 font "Times-Roman" text "Written in Times." move_down 20 font("Courier") do text "Written in Courier because we are inside the block." end move_down 20 text "Written in Times again as we left the previous block." move_down 20 text "Let's see which font we are using again: #{font.inspect}" move_down 20 font "Helvetica" text "Back to normal." end ruby-prawn-2.1.0.orig/manual/text/single_usage.rb0000644000000000000000000000242012665203156020514 0ustar rootroot# encoding: utf-8 # # The PDF format has some built-in font support. If you want to use other fonts # in Prawn you need to embed the font file. # # Doing this for a single font is extremely simple. Remember the Styling font # example? Another use of the font method is to provide a font file # path and the font will be embedded in the document and set as the current # font. # # This is reasonable if a font is used only once, but, if a font used several # times, providing the path each time it is used becomes cumbersome. The example # on the next page shows a better way to deal with fonts which are used several # times in a document. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do # Using a TTF font file font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf") do text "Written with the DejaVu Sans TTF font." end move_down 20 text "Written with the default font." move_down 20 # Using an DFONT font file font("#{Prawn::DATADIR}/fonts/Panic+Sans.dfont") do text "Written with the Panic Sans DFONT font" end move_down 20 text "Written with the default font once more." end ruby-prawn-2.1.0.orig/manual/text/rotation.rb0000644000000000000000000000302312665203156017706 0ustar rootroot# encoding: utf-8 # # Rotating text is best avoided on free flowing text, so this example # will only use the text_box method as we can have much more # control over its output. # # To rotate text all we need to do is use the :rotate option # passing an angle in degrees and an optional :rotate_around to # indicate the origin of the rotation (the default is :upper_left). # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do width = 100 height = 60 angle = 30 x = 200 y = cursor - 30 stroke_rectangle [0, y], width, height text_box("This text was not rotated", :at => [0, y], :width => width, :height => height) stroke_rectangle [0, y - 100], width, height text_box("This text was rotated around the center", :at => [0, y - 100], :width => width, :height => height, :rotate => angle, :rotate_around => :center) [:lower_left, :upper_left, :lower_right, :upper_right].each_with_index do |corner, index| y = y - 100 if index == 2 stroke_rectangle [x + (index % 2) * 200, y], width, height text_box("This text was rotated around the #{corner} corner.", :at => [x + (index % 2) * 200, y], :width => width, :height => height, :rotate => angle, :rotate_around => corner) end end ruby-prawn-2.1.0.orig/manual/text/win_ansi_charset.rb0000644000000000000000000000313512665203156021373 0ustar rootroot# encoding: utf-8 # # Prints a list of all of the glyphs that can be rendered by Adobe's built # in fonts, along with their character widths and WinAnsi codes. Be sure # to pass these glyphs as UTF-8, and Prawn will transcode them for you. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do FONT_SIZE = 9.5 x = 0 y = bounds.top fields = [[20, :right], [8, :left], [12, :center], [30, :right], [8, :left], [0, :left]] font "Helvetica", :size => FONT_SIZE move_down 30 text "(See next page for WinAnsi table)", :align => :center start_new_page Prawn::Encoding::WinAnsi::CHARACTERS.each_with_index do |name, index| next if name == ".notdef" y -= FONT_SIZE if y < FONT_SIZE y = bounds.top - FONT_SIZE x += 170 end code = "%d." % index char = index.chr width = 1000 * width_of(char, :size => FONT_SIZE) / FONT_SIZE size = "%d" % width data = [code, nil, char, size, nil, name] dx = x fields.zip(data).each do |(total_width, align), field| if field width = width_of(field, :size => FONT_SIZE) case align when :left then offset = 0 when :right then offset = total_width - width when :center then offset = (total_width - width) / 2 end text_box(field.force_encoding("windows-1252").encode("UTF-8"), :at => [dx + offset, y]) end dx += total_width end end end ruby-prawn-2.1.0.orig/manual/text/line_wrapping.rb0000644000000000000000000000565012665203156020715 0ustar rootroot# encoding: utf-8 # # Line wrapping happens on white space or hyphens. Soft hyphens can be used to # indicate where words can be hyphenated. Non-breaking spaces can be used to # display space without allowing for a break. # # For writing styles that do not make use of spaces, the zero width space serves # to mark word boundaries. Zero width spaces are available only with TTF fonts. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do text "Hard hyphens:\n" + "Slip-sliding away, slip sliding awaaaay. You know the " + "nearer your destination the more you're slip-sliding away." move_down 20 shy = Prawn::Text::SHY text "Soft hyphens:\n" + "Slip slid#{shy}ing away, slip slid#{shy}ing away. You know the " + "nearer your destinat#{shy}ion the more you're slip slid#{shy}ing away." move_down 20 nbsp = Prawn::Text::NBSP text "Non-breaking spaces:\n" + "Slip#{nbsp}sliding away, slip#{nbsp}sliding awaaaay. You know the " + "nearer your destination the more you're slip#{nbsp}sliding away." move_down 20 font("#{Prawn::DATADIR}/fonts/gkai00mp.ttf", :size => 16) do long_text = "No word boundaries:\n更可怕的是,同质化竞争对手可以按照URL中后面这个ID来遍历您的DB中的内容,写个小爬虫把你的页面上的关键信息顺次爬下来也不是什么难事,这样的话,你就非常被动了。更可怕的是,同质化竞争对手可以按照URL中后面这个ID来遍历您的DB中的内容,写个小爬虫把你的页面上的关键信息顺次爬下来也不是什么难事,这样的话,你就非常被动了。" text long_text move_down 20 zwsp = Prawn::Text::ZWSP long_text = "Invisible word boundaries:\n更#{zwsp}可怕的#{zwsp}是,#{zwsp}同质化#{zwsp}竞争#{zwsp}对#{zwsp}手#{zwsp}可以#{zwsp}按照#{zwsp}URL#{zwsp}中#{zwsp}后面#{zwsp}这个#{zwsp}ID#{zwsp}来#{zwsp}遍历#{zwsp}您的#{zwsp}DB#{zwsp}中的#{zwsp}内容,#{zwsp}写个#{zwsp}小爬虫#{zwsp}把#{zwsp}你的#{zwsp}页面#{zwsp}上的#{zwsp}关#{zwsp}键#{zwsp}信#{zwsp}息顺#{zwsp}次#{zwsp}爬#{zwsp}下来#{zwsp}也#{zwsp}不是#{zwsp}什么#{zwsp}难事,#{zwsp}这样的话,#{zwsp}你#{zwsp}就#{zwsp}非常#{zwsp}被动了。#{zwsp}更#{zwsp}可怕的#{zwsp}是,#{zwsp}同质化#{zwsp}竞争#{zwsp}对#{zwsp}手#{zwsp}可以#{zwsp}按照#{zwsp}URL#{zwsp}中#{zwsp}后面#{zwsp}这个#{zwsp}ID#{zwsp}来#{zwsp}遍历#{zwsp}您的#{zwsp}DB#{zwsp}中的#{zwsp}内容,#{zwsp}写个#{zwsp}小爬虫#{zwsp}把#{zwsp}你的#{zwsp}页面#{zwsp}上的#{zwsp}关#{zwsp}键#{zwsp}信#{zwsp}息顺#{zwsp}次#{zwsp}爬#{zwsp}下来#{zwsp}也#{zwsp}不是#{zwsp}什么#{zwsp}难事,#{zwsp}这样的话,#{zwsp}你#{zwsp}就#{zwsp}非常#{zwsp}被动了。" text long_text end end ruby-prawn-2.1.0.orig/manual/text/column_box.rb0000644000000000000000000000275612665203156020230 0ustar rootroot# encoding: utf-8 # # The column_box method allows you to define columns that flow # their contents from one section to the next. You can have a number of columns # on the page, and only when the last column overflows will a new page be # created. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do text "The Prince", :align => :center, :size => 18 text "Niccolò Machiavelli", :align => :center, :size => 14 move_down 12 column_box([0, cursor], :columns => 2, :width => bounds.width) do text((<<-END.gsub(/\s+/, ' ') + "\n\n") * 3) All the States and Governments by which men are or ever have been ruled, have been and are either Republics or Princedoms. Princedoms are either hereditary, in which the sovereignty is derived through an ancient line of ancestors, or they are new. New Princedoms are either wholly new, as that of Milan to Francesco Sforza; or they are like limbs joined on to the hereditary possessions of the Prince who acquires them, as the Kingdom of Naples to the dominions of the King of Spain. The States thus acquired have either been used to live under a Prince or have been free; and he who acquires them does so either by his own arms or by the arms of others, and either by good fortune or by merit. END end end ruby-prawn-2.1.0.orig/manual/text/text_box_extensions.rb0000644000000000000000000000277612665203156022200 0ustar rootroot# encoding: utf-8 # # We've already seen one way of using text boxes with the text_box # method. Turns out this method is just a convenience for using the # Prawn::Text::Box class as it creates a new object and call # render on it. # # Knowing that any extensions we add to Prawn::Text::Box will take # effect when we use the text_box method. To add an extension all # we need to do is append the Prawn::Text::Box.extensions array # with a module. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do module TriangleBox def available_width height + 25 end end y_position = cursor - 10 width = 100 height = 100 Prawn::Text::Box.extensions << TriangleBox stroke_rectangle([0, y_position], width, height) text_box("A" * 100, :at => [0, y_position], :width => width, :height => height) Prawn::Text::Formatted::Box.extensions << TriangleBox stroke_rectangle([200, y_position], width, height) formatted_text_box([:text => "A" * 100, :color => "009900"], :at => [200, y_position], :width => width, :height => height) # Here we clear the extensions array Prawn::Text::Box.extensions.clear Prawn::Text::Formatted::Box.extensions.clear end ruby-prawn-2.1.0.orig/manual/text/font_style.rb0000644000000000000000000000153312665203156020241 0ustar rootroot# encoding: utf-8 # # Most font families come with some styles other than normal. Most common are # bold, italic and bold_italic. # # The style can be set the using the :style option, with either the # font method which will set the font and style for rest of the # document, or with the inline text methods. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do ["Courier", "Helvetica", "Times-Roman"].each do |example_font| move_down 20 [:bold, :bold_italic, :italic, :normal].each do |style| font example_font, :style => style text "I'm writing in #{example_font} (#{style})" end end end ruby-prawn-2.1.0.orig/manual/text/font_size.rb0000644000000000000000000000220712665203156020052 0ustar rootroot# encoding: utf-8 # # The font_size method works just like the font # method. # # In fact we can even use font with the :size option # to declare which size we want. # # Another way to change the font size is by supplying the :size # option to the text methods. # # The default font size is 12. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do text "Let's see which is the current font_size: #{font_size.inspect}" move_down 10 font_size 16 text "Yeah, something bigger!" move_down 10 font_size(25) { text "Even bigger!" } move_down 10 text "Back to 16 again." move_down 10 text "Single line on 20 using the :size option.", :size => 20 move_down 10 text "Back to 16 once more." move_down 10 font("Courier", :size => 10) do text "Yeah, using Courier 10 courtesy of the font method." end move_down 10 font("Helvetica", :size => 12) text "Back to normal" end ruby-prawn-2.1.0.orig/manual/text/free_flowing_text.rb0000644000000000000000000000421612665203156021566 0ustar rootroot# encoding: utf-8 # # Text rendering can be as simple or as complex as you want. # # This example covers the most basic method: text. It is meant for # free flowing text. The provided string will flow according to the current # bounding box width and height. It will also flow onto the next page if the # bottom of the bounding box is reached. # # The text will start being rendered on the current cursor position. When it # finishes rendering, the cursor is left directly below the text. # # This example also shows text flowing across pages following the margin box and # other bounding boxes. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do move_cursor_to 50 text "This text will flow to the next page. " * 20 y_position = cursor - 50 bounding_box([0, y_position], :width => 200, :height => 150) do transparent(0.5) { stroke_bounds } text "This text will flow along this bounding box we created for it. " * 5 end bounding_box([300, y_position], :width => 200, :height => 150) do transparent(0.5) { stroke_bounds } # This will stroke on one page text "Now look what happens when the free flowing text reaches the end " + "of a bounding box that is narrower than the margin box." + " . " * 200 + "It continues on the next page as if the previous bounding box " + "was cloned. If we want it to have the same border as the one on " + "the previous page we will need to stroke the boundaries again." transparent(0.5) { stroke_bounds } # And this will stroke on the next end move_cursor_to 200 span(350, :position => :center) do text "Span is a different kind of bounding box as it lets the text " + "flow gracefully onto the next page. It doesn't matter if the text " + "started on the middle of the previous page, when it flows to the " + "next page it will start at the beginning." + " _ " * 500 + "I told you it would start on the beginning of this page." end end ruby-prawn-2.1.0.orig/manual/text/utf8.rb0000644000000000000000000000163712665203156016746 0ustar rootroot# encoding: utf-8 # # Multilingualization isn't much of a problem on Prawn as its default encoding # is UTF-8. The only thing you need to worry about is if the font support the # glyphs of your language. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do text "Take this example, a simple Euro sign:" text "€", :size => 32 move_down 20 text "This works, because € is one of the few " + "non-ASCII glyphs supported in PDF built-in fonts." move_down 20 text "For full internationalized text support, we need to use TTF fonts:" move_down 20 font("#{Prawn::DATADIR}/fonts/DejaVuSans.ttf") do text "ὕαλον ϕαγεῖν δύναμαι· τοῦτο οὔ με βλάπτει." text "There you go." end end ruby-prawn-2.1.0.orig/manual/text/text_box_excess.rb0000644000000000000000000000233412665203156021261 0ustar rootroot# encoding: utf-8 # # Whenever the text_box method truncates text, this truncated bit # is not lost, it is the method return value and we can take advantage of that. # # We just need to take some precautions. # # This example renders as much of the text as will fit in a larger font inside # one text_box and then proceeds to render the remaining text in the default # size in a second text_box. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do string = "This is the beginning of the text. It will be cut somewhere and " + "the rest of the text will procede to be rendered this time by " + "calling another method." + " . " * 50 y_position = cursor - 20 excess_text = text_box string, :width => 300, :height => 50, :overflow => :truncate, :at => [100, y_position], :size => 18 text_box excess_text, :width => 300, :at => [100, y_position - 100] end ruby-prawn-2.1.0.orig/manual/text/text.rb0000644000000000000000000000467612665203156017052 0ustar rootroot# encoding: utf-8 # # Examples for text rendering. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) Prawn::ManualBuilder::Example.generate("text.pdf", :page_size => "FOLIO") do package "text" do |p| p.section "Basics" do |s| s.example "free_flowing_text" s.example "positioned_text" s.example "text_box_overflow" s.example "text_box_excess" s.example "column_box" end p.section "Styling" do |s| s.example "font" s.example "font_size" s.example "font_style" s.example "color" s.example "alignment" s.example "leading" s.example "kerning_and_character_spacing" s.example "paragraph_indentation" s.example "rotation" end p.section "Advanced Styling" do |s| s.example "inline" s.example "formatted_text" s.example "formatted_callbacks" s.example "rendering_and_color" s.example "text_box_extensions" end p.section "External Fonts" do |s| s.example "single_usage" s.example "registering_families" end p.section "Multilingualization" do |s| s.example "utf8" s.example "line_wrapping" s.example "right_to_left_text" s.example "fallback_fonts" s.example "win_ansi_charset" end p.intro do prose("This is probably the feature people will use the most. There is no shortage of options when it comes to text. You'll be hard pressed to find a use case that is not covered by one of the text methods and configurable options. The examples show:") list( "Text that flows from page to page automatically starting new pages when necessary", "How to use text boxes and place them on specific positions", "What to do when a text box is too small to fit its content", "Flowing text in columns", "How to change the text style configuring font, size, alignment and many other settings", "How to style specific portions of a text with inline styling and formatted text", "How to define formatted callbacks to reuse common styling definitions", "How to use the different rendering modes available for the text methods", "How to create your custom text box extensions", "How to use external fonts on your pdfs", "What happens when rendering text in different languages" ) end end end ruby-prawn-2.1.0.orig/manual/text/formatted_text.rb0000644000000000000000000000526612665203156021113 0ustar rootroot# encoding: utf-8 # # There are two other text methods available: formatted_text and # formatted_text_box. # # These are useful when the provided text has numerous portions that need to be # formatted differently. As you might imply from their names the first should # be used for free flowing text just like the text method and the # last should be used for positioned text just like text_box. # # The main difference between these methods and the text and # text_box methods is how the text is provided. The # formatted_text and formatted_text_box methods accept # an array of hashes. Each hash must provide a :text option which # is the text string and may provide the following options: :styles # (an array of symbols), :size (the font size), # :character_spacing (additional space between the characters), # :font (the name of a registered font), :color (the # same input accepted by fill_color and stroke_color), # :link (an URL to create a link), and :local # (a link to a local file). require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do formatted_text [ { :text => "Some bold. ", :styles => [:bold] }, { :text => "Some italic. ", :styles => [:italic] }, { :text => "Bold italic. ", :styles => [:bold, :italic] }, { :text => "Bigger Text. ", :size => 20 }, { :text => "More spacing. ", :character_spacing => 3 }, { :text => "Different Font. ", :font => "Courier" }, { :text => "Some coloring. ", :color => "FF00FF" }, { :text => "Link to the wiki. ", :color => "0000FF", :link => "https://github.com/prawnpdf/prawn/wiki" }, { :text => "Link to a local file. ", :color => "0000FF", :local => "./local_file.txt" } ] formatted_text_box [ { :text => "Just your regular" }, { :text => " text_box ", :font => "Courier" }, { :text => "with some additional formatting options " + "added to the mix.", :color => [50, 100, 0, 0], :styles => [:italic] } ], :at => [100, 100], :width => 200, :height => 100 end ruby-prawn-2.1.0.orig/manual/text/leading.rb0000644000000000000000000000137212665203156017457 0ustar rootroot# encoding: utf-8 # # Leading is the additional space between lines of text. # # The leading can be set using the default_leading method which # applies to the rest of the document or until it is changed, or inline in the # text methods with the :leading option. # # The default leading is 0. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do string = "Hey, what did you do with the space between my lines? " * 10 text string, :leading => 0 move_down 20 default_leading 5 text string move_down 20 text string, :leading => 10 end ruby-prawn-2.1.0.orig/manual/document_and_page_options/0000755000000000000000000000000012665203156021747 5ustar rootrootruby-prawn-2.1.0.orig/manual/document_and_page_options/background.rb0000644000000000000000000000145312665203156024416 0ustar rootroot# encoding: utf-8 # # Pass an image path to the :background option and it will be used # as the background for all pages. # This option can only be used on document creation. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) img = "#{Prawn::DATADIR}/images/letterhead.jpg" Prawn::Document.generate("background.pdf", :background => img, :margin => 100 ) do text "My report caption", :size => 18, :align => :right move_down font.height * 2 text "Here is my text explaning this report. " * 20, :size => 12, :align => :left, :leading => 2 move_down font.height text "I'm using a soft background. " * 40, :size => 12, :align => :left, :leading => 2 end ruby-prawn-2.1.0.orig/manual/document_and_page_options/metadata.rb0000644000000000000000000000144612665203156024061 0ustar rootroot# encoding: utf-8 # # To set the document metadata just pass a hash to the :info # option when creating new documents. # The keys in the example below are arbitrary, so you may add whatever keys you want # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) info = { :Title => "My title", :Author => "John Doe", :Subject => "My Subject", :Keywords => "test metadata ruby pdf dry", :Creator => "ACME Soft App", :Producer => "Prawn", :CreationDate => Time.now } Prawn::Document.generate("metadata.pdf", :info => info) do text "This is a test of setting metadata properties via the info option." text "While the keys are arbitrary, the above example sets common attributes." end ruby-prawn-2.1.0.orig/manual/document_and_page_options/document_and_page_options.rb0000644000000000000000000000231712665203156027506 0ustar rootroot# encoding: utf-8 # # Examples for stamps and repeaters. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) Prawn::ManualBuilder::Example.generate("document_and_page_options.pdf", :page_size => "FOLIO") do package "document_and_page_options" do |p| p.example "page_size", :eval_source => false, :full_source => true p.example "page_margins", :eval_source => false, :full_source => true p.example "background", :eval_source => false, :full_source => true p.example "metadata", :eval_source => false, :full_source => true p.example "print_scaling", :eval_source => false, :full_source => true p.intro do prose("So far we've already seen how to create new documents and start new pages. This chapter expands on the previous examples by showing other options avialable. Some of the options are only available when creating new documents. The examples show:") list( "How to configure page size", "How to configure page margins", "How to use a background image", "How to add metadata to the generated PDF" ) end end end ruby-prawn-2.1.0.orig/manual/document_and_page_options/print_scaling.rb0000644000000000000000000000176612665203156025142 0ustar rootroot# encoding: utf-8 # # (Optional; PDF 1.6) The page scaling option to be selected when a print dialog is displayed for this document. # Valid values are None, which indicates that the print dialog should reflect no page scaling, # and AppDefault, which indicates that applications should use the current print scaling. # If this entry has an unrecognized value, applications should use the current print scaling. # Default value: AppDefault. # # Note: If the print dialog is suppressed and its parameters are provided directly by the application, the value of this entry should still be used. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) Prawn::Document.generate("print_scaling.pdf", :page_layout => :landscape, :print_scaling => :none ) do text "When you print this document, the scale to fit in print preview should be disabled by default." end ruby-prawn-2.1.0.orig/manual/document_and_page_options/page_size.rb0000644000000000000000000000234212665203156024243 0ustar rootroot# encoding: utf-8 # # Prawn comes with support for most of the common page sizes so you'll only need # to provide specific values if your intended format is not supported. To see a # list with all supported sizes take a look at PDF::Core::PageGeometry # # # To define the size use :page_size when creating new documents # and :size when starting new pages. The default page size for new # documents is LETTER (612.00 x 792.00). # # You may also define the orientation of the page to be either portrait # (default) or landscape. Use :page_layout when creating new # documents and :layout when starting new pages. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) Prawn::Document.generate("page_size.pdf", :page_size => "EXECUTIVE", :page_layout => :landscape ) do text "EXECUTIVE landscape page." custom_size = [275, 326] ["A4", "TABLOID", "B7", custom_size ].each do |size| start_new_page(:size => size, :layout => :portrait) text "#{size} portrait page." start_new_page(:size => size, :layout => :landscape) text "#{size} landscape page." end end ruby-prawn-2.1.0.orig/manual/document_and_page_options/page_margins.rb0000644000000000000000000000242612665203156024734 0ustar rootroot# encoding: utf-8 # # The default margin for pages is 0.5 inch but you can change that with the # :margin option or if you'd like to have different margins you # can use the :left_margin, :right_margin, # :top_margin, :bottom_margin options. # # These options are available both for starting new pages and creating new # documents. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) Prawn::Document.generate("page_margins.pdf", :margin => 100 ) do text "100 pts margins." stroke_bounds start_new_page(:left_margin => 300) text "300 pts margin on the left." stroke_bounds start_new_page(:top_margin => 300) text "300 pts margin both on the top and on the left. Notice that whenever " + "you set an option for a new page it will remain the default for the " + "following pages." stroke_bounds start_new_page(:margin => 50) text "50 pts margins. Using the margin option will reset previous specific " + "calls to left, right, top and bottom margins." stroke_bounds start_new_page(:margin => [50, 100, 150, 200]) text "There is also the shorthand CSS like syntax used here." stroke_bounds end ruby-prawn-2.1.0.orig/manual/graphics/0000755000000000000000000000000012665203156016340 5ustar rootrootruby-prawn-2.1.0.orig/manual/graphics/color.rb0000644000000000000000000000130012665203156017775 0ustar rootroot# encoding: utf-8 # # We can change the stroke and fill colors providing an HTML rgb 6 digit color # code string ("AB1234") or 4 values for CMYK. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do stroke_axis # Fill with Yellow using RGB fill_color "FFFFCC" fill_polygon [50, 150], [150, 200], [250, 150], [250, 50], [150, 0], [50, 50] # Stroke with Purple using CMYK stroke_color 50, 100, 0, 0 stroke_rectangle [300, 300], 200, 100 # Both together fill_and_stroke_circle [400, 100], 50 end ruby-prawn-2.1.0.orig/manual/graphics/scale.rb0000644000000000000000000000240112665203156017751 0ustar rootroot# encoding: utf-8 # # This transformation is used to scale the user space. Give it an scale factor # and an :origin point and everything inside the block will be # scaled using the origin point as reference. # # If you omit the :origin option the page origin will be used. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do stroke_axis width = 100 height = 50 x = 50 y = 200 stroke_rectangle [x, y], width, height text_box "reference rectangle", :at => [x + 10, y - 10], :width => width - 20 scale(2, :origin => [x, y]) do stroke_rectangle [x, y], width, height text_box "rectangle scaled from upper-left corner", :at => [x, y - height - 5], :width => width end x = 350 stroke_rectangle [x, y], width, height text_box "reference rectangle", :at => [x + 10, y - 10], :width => width - 20 scale(2, :origin => [x + width / 2, y - height / 2]) do stroke_rectangle [x, y], width, height text_box "rectangle scaled from center", :at => [x, y - height - 5], :width => width end end ruby-prawn-2.1.0.orig/manual/graphics/polygon.rb0000644000000000000000000000163112665203156020355 0ustar rootroot# encoding: utf-8 # # Drawing polygons in Prawn is easy, just pass a sequence of points to one of # the polygon family of methods. # # Just like rounded_rectangle we also have # rounded_polygon. The only difference is the radius param comes # before the polygon points. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do stroke_axis # Triangle stroke_polygon [50, 200], [50, 300], [150, 300] # Hexagon fill_polygon [50, 150], [150, 200], [250, 150], [250, 50], [150, 0], [50, 50] # Pentagram pentagon_points = [500, 100], [430, 5], [319, 41], [319, 159], [430, 195] pentagram_points = [0, 2, 4, 1, 3].map{ |i| pentagon_points[i] } stroke_rounded_polygon(20, *pentagram_points) end ruby-prawn-2.1.0.orig/manual/graphics/helper.rb0000644000000000000000000000175012665203156020147 0ustar rootroot# encoding: utf-8 # # To produce this manual we use the stroke_axis helper method # within the examples. # # stroke_axis prints the x and y axis for the current bounding box # with markers in 100 increments. The defaults can be changed with various # options. # # Note that the examples define a custom :height option so that # only the example canvas is used (as seen with the output of the first line of # the example code). # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do stroke_axis stroke_axis(:at => [70, 70], :height => 200, :step_length => 50, :negative_axes_length => 5, :color => '0000FF') stroke_axis(:at => [140, 140], :width => 200, :height => cursor.to_i - 140, :step_length => 20, :negative_axes_length => 40, :color => 'FF00') end ruby-prawn-2.1.0.orig/manual/graphics/soft_masks.rb0000644000000000000000000000262012665203156021036 0ustar rootroot# encoding: utf-8 # # Soft masks are used for more complex alpha channel manipulations. You can use # arbitrary drawing functions for creation of soft masks. The resulting alpha # channel is made of greyscale version of the drawing (luminosity channel to be # precise). So while you can use any combination of colors for soft masks it's # easier to use greyscales. Black will result in full transparency and white # will make region fully opaque. # # Soft mask is a part of page graphic state. So if you want to apply soft mask # only to a part of page you need to enclose drawing instructions in # save_graphics_state block. require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do save_graphics_state do soft_mask do 0.upto 15 do |i| fill_color 0, 0, 0, 100.0 / 16.0 * (15 - i) fill_circle [75 + i * 25, 100], 60 end end fill_color '009ddc' fill_rectangle [0, 60], 600, 20 fill_color '963d97' fill_rectangle [0, 80], 600, 20 fill_color 'e03a3e' fill_rectangle [0, 100], 600, 20 fill_color 'f5821f' fill_rectangle [0, 120], 600, 20 fill_color 'fdb827' fill_rectangle [0, 140], 600, 20 fill_color '61bb46' fill_rectangle [0, 160], 600, 20 end end ruby-prawn-2.1.0.orig/manual/graphics/stroke_cap.rb0000644000000000000000000000204312665203156021016 0ustar rootroot# encoding: utf-8 # # The cap style defines how the edge of a line or curve will be drawn. There are # three types: :butt (the default), :round and # :projecting_square # # The difference is better seen with thicker lines. With :butt # lines are drawn starting and ending at the exact points provided. With both # :round and :projecting_square the line is projected # beyond the start and end points. # # Just like line_width= the cap_style= method needs an # explicit receiver to work. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do stroke_axis self.line_width = 25 [:butt, :round, :projecting_square].each_with_index do |cap, i| self.cap_style = cap y = 250 - i * 100 stroke_horizontal_line 100, 300, :at => y stroke_circle [400, y], 15 end end ruby-prawn-2.1.0.orig/manual/graphics/translate.rb0000644000000000000000000000146712665203156020672 0ustar rootroot# encoding: utf-8 # # This transformation is used to translate the user space. Just provide the # x and y coordinates for the new origin. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do stroke_axis 1.upto(3) do |i| x = i * 50 y = i * 100 translate(x, y) do # Draw a point on the new origin fill_circle [0, 0], 2 draw_text "New origin after translation to [#{x}, #{y}]", :at => [5, -2], :size => 8 stroke_rectangle [100, 75], 100, 50 text_box "Top left corner at [100,75]", :at => [110, 65], :width => 80, :size => 8 end end end ruby-prawn-2.1.0.orig/manual/graphics/graphics.rb0000644000000000000000000000346312665203156020473 0ustar rootroot# encoding: utf-8 # # Examples for the Graphics package. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) Prawn::ManualBuilder::Example.generate("graphics.pdf", :page_size => "FOLIO") do package "graphics" do |p| p.section "Basics" do |s| s.example "helper" s.example "fill_and_stroke" end p.section "Shapes" do |s| s.example "lines_and_curves" s.example "common_lines" s.example "rectangle" s.example "polygon" s.example "circle_and_ellipse" end p.section "Fill and Stroke settings" do |s| s.example "line_width" s.example "stroke_cap" s.example "stroke_join" s.example "stroke_dash" s.example "color" s.example "gradients" s.example "transparency" s.example "soft_masks" s.example "blend_mode" s.example "fill_rules" end p.section "Transformations" do |s| s.example "rotate" s.example "translate" s.example "scale" end p.intro do prose("Here we show all the drawing methods provided by Prawn. Use them to draw the most beautiful imaginable things. Most of the content that you'll add to your pdf document will use the graphics package. Even text is rendered on a page just like a rectangle so even if you never use any of the shapes described here you should at least read the basic examples. The examples show:") list( "All the possible ways that you can fill or stroke shapes on a page", "How to draw all the shapes that Prawn has to offer from a measly line to a mighty polygon or ellipse", "The configuration options for stroking lines and filling shapes", "How to apply transformations to your drawing space" ) end end end ruby-prawn-2.1.0.orig/manual/graphics/line_width.rb0000644000000000000000000000174012665203156021015 0ustar rootroot# encoding: utf-8 # # The line_width= method sets the stroke width for subsequent # stroke calls. # # Since Ruby assumes that an unknown variable on the left hand side of an # assignment is a local temporary, rather than a setter method, if you are using # the block call to Prawn::Document.generate without passing params # you will need to call line_width on self. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do stroke_axis y = 250 3.times do |i| case i when 0 then line_width = 10 # This call will have no effect when 1 then self.line_width = 10 when 2 then self.line_width = 25 end stroke do horizontal_line 50, 150, :at => y rectangle [275, y + 25], 50, 50 circle [500, y], 25 end y -= 100 end end ruby-prawn-2.1.0.orig/manual/graphics/rectangle.rb0000644000000000000000000000113012665203156020624 0ustar rootroot# encoding: utf-8 # # To draw a rectangle, just provide the upper-left corner, width and height to # the rectangle method. # # There's also rounded_rectangle. Just provide an additional radius # value for the rounded corners. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do stroke_axis stroke do rectangle [100, 300], 100, 200 rounded_rectangle [300, 300], 100, 200, 20 end end ruby-prawn-2.1.0.orig/manual/graphics/lines_and_curves.rb0000644000000000000000000000244512665203156022215 0ustar rootroot# encoding: utf-8 # # Prawn supports drawing both lines and curves starting either at the current # position, or from a specified starting position. # # line_to and curve_to set the drawing path from the # current drawing position to the specified point. The initial drawing position # can be set with move_to. They are useful when you want to chain # successive calls because the drawing position will be set to the specified # point afterwards. # # line and curve set the drawing path between the two # specified points. # # Both curve methods define a Bezier curve bounded by two aditional points # provided as the :bounds param. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do stroke_axis # line_to and curve_to stroke do move_to 0, 0 line_to 100, 100 line_to 0, 100 curve_to [150, 250], :bounds => [[20, 200], [120, 200]] curve_to [200, 0], :bounds => [[150, 200], [450, 10]] end # line and curve stroke do line [300, 200], [400, 50] curve [500, 0], [400, 200], :bounds => [[600, 300], [300, 390]] end end ruby-prawn-2.1.0.orig/manual/graphics/common_lines.rb0000644000000000000000000000151712665203156021353 0ustar rootroot# encoding: utf-8 # # Prawn provides helpers for drawing some commonly used lines: # # vertical_line and horizontal_line do just what their # names imply. Specify the start and end point at a fixed coordinate to define # the line. # # horizontal_rule draws a horizontal line on the current bounding # box from border to border, using the current y position. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do stroke_axis stroke_color "ff0000" stroke do # just lower the current y position move_down 50 horizontal_rule vertical_line 100, 300, :at => 50 horizontal_line 200, 500, :at => 150 end end ruby-prawn-2.1.0.orig/manual/graphics/rotate.rb0000644000000000000000000000145312665203156020166 0ustar rootroot# encoding: utf-8 # # This transformation is used to rotate the user space. Give it an angle # and an :origin point about which to rotate and a block. # Everything inside the block will be drawn with the rotated coordinates. # # The angle is in degrees. # # If you omit the :origin option the page origin will be used. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do stroke_axis fill_circle [250, 200], 2 12.times do |i| rotate(i * 30, :origin => [250, 200]) do stroke_rectangle [350, 225], 100, 50 draw_text "Rotated #{i * 30}°", :size => 10, :at => [360, 205] end end end ruby-prawn-2.1.0.orig/manual/graphics/transparency.rb0000644000000000000000000000200312665203156021371 0ustar rootroot# encoding: utf-8 # # Although the name of the method is transparency, what we are # actually setting is the opacity for fill and stroke. So 0 means # completely transparent and 1.0 means completely opaque # # You may call it providing one or two values. The first value sets fill opacity # and the second value sets stroke opacity. If the second value is omitted fill # and stroke will have the same opacity. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do stroke_axis self.line_width = 5 fill_color "ff0000" fill_rectangle [0, 100], 500, 100 fill_color "000000" stroke_color "ffffff" base_x = 100 [[0.5, 1], 0.5, [1, 0.5]].each do |args| transparent(*args) do fill_circle [base_x, 100], 50 stroke_rectangle [base_x - 20, 100], 40, 80 end base_x += 150 end end ruby-prawn-2.1.0.orig/manual/graphics/stroke_join.rb0000644000000000000000000000147312665203156021220 0ustar rootroot# encoding: utf-8 # # The join style defines how the intersection between two lines is drawn. There # are three types: :miter (the default), :round and # :bevel # # Just like cap_style, the difference between styles is better # seen with thicker lines. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do stroke_axis self.line_width = 25 [:miter, :round, :bevel].each_with_index do |style, i| self.join_style = style y = 200 - i * 100 stroke do move_to(100, y) line_to(200, y + 100) line_to(300, y) end stroke_rectangle [400, y + 75], 50, 50 end end ruby-prawn-2.1.0.orig/manual/graphics/fill_and_stroke.rb0000644000000000000000000000240212665203156022022 0ustar rootroot# encoding: utf-8 # # There are two drawing primitives in Prawn: fill and # stroke. # # These are the methods that actually draw stuff on the document. All the other # drawing shapes like rectangle, circle or # line_to define drawing paths. These paths need to be either # stroked or filled to gain form on the document. # # Calling these methods without a block will act on the drawing path that # has been defined prior to the call. # # Calling with a block will act on the drawing path set within the # block. # # Most of the methods which define drawing paths have methods of the same name # starting with stroke_ and fill_ which create the drawing path and then stroke # or fill it. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do stroke_axis # No block line [0, 200], [100, 150] stroke rectangle [0, 100], 100, 100 fill # With block stroke { line [200, 200], [300, 150] } fill { rectangle [200, 100], 100, 100 } # Method hook stroke_line [400, 200], [500, 150] fill_rectangle [400, 100], 100, 100 end ruby-prawn-2.1.0.orig/manual/graphics/stroke_dash.rb0000644000000000000000000000306412665203156021176 0ustar rootroot# encoding: utf-8 # # This sets the dashed pattern for lines and curves. The (dash) length defines # how long each dash will be. # # The :space option defines the length of the space between the # dashes. # # The :phase option defines the start point of the sequence of # dashes and spaces. # # Complex dash patterns can be specified by using an array with alternating # dash/gap lengths for the first parameter (note that the :space # option is ignored in this case). # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do stroke_axis dash([1, 2, 3, 2, 1, 5], :phase => 6) stroke_horizontal_line 50, 500, :at => 230 dash([1, 2, 3, 4, 5, 6, 7, 8]) stroke_horizontal_line 50, 500, :at => 220 base_y = 210 24.times do |i| length = (i / 4) + 1 space = length # space between dashes same length as dash phase = 0 # start with dash case i % 4 when 0 then base_y -= 5 when 1 then phase = length # start with space between dashes when 2 then space = length * 0.5 # space between dashes half as long as dash when 3 space = length * 0.5 # space between dashes half as long as dash phase = length # start with space between dashes end base_y -= 5 dash(length, :space => space, :phase => phase) stroke_horizontal_line 50, 500, :at => base_y - (2 * i) end end ruby-prawn-2.1.0.orig/manual/graphics/circle_and_ellipse.rb0000644000000000000000000000122112665203156022461 0ustar rootroot# encoding: utf-8 # # To define a circle all you need is the center point and the # radius. # # To define an ellipse you provide the center point and two radii # (or axes) values. If the second radius value is ommitted, both radii will be # equal and you will end up drawing a circle. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do stroke_axis stroke_circle [100, 300], 100 fill_ellipse [200, 100], 100, 50 fill_ellipse [400, 100], 50 end ruby-prawn-2.1.0.orig/manual/graphics/fill_rules.rb0000644000000000000000000000305512665203156021030 0ustar rootroot# encoding: utf-8 # # Prawn's fill operators (fill and fill_and_stroke # both accept a :fill_rule option. These rules determine which # parts of the page are counted as "inside" vs. "outside" the path. There are # two fill rules: # # * :nonzero_winding_number (default): a point is inside the path # if a ray from that point to infinity crosses a nonzero "net number" of path # segments, where path segments intersecting in one direction are counted as # positive and those in the other direction negative. # # * :even_odd: A point is inside the path if a ray from that point # to infinity crosses an odd number of path segments, regardless of direction. # # The differences between the fill rules only come into play with complex # paths; they are identical for simple shapes. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do pentagram = [[181, 95], [0, 36], [111, 190], [111, 0], [0, 154]] stroke_color 'ff0000' line_width 2 text_box "Nonzero Winding Number", :at => [50, 215], :width => 170, :align => :center polygon(*pentagram.map { |x, y| [x + 50, y] }) fill_and_stroke text_box "Even-Odd", :at => [330, 215], :width => 170, :align => :center polygon(*pentagram.map { |x, y| [x + 330, y] }) fill_and_stroke(:fill_rule => :even_odd) end ruby-prawn-2.1.0.orig/manual/graphics/blend_mode.rb0000644000000000000000000000353412665203156020762 0ustar rootroot# encoding: utf-8 # # Blend modes can be used to change the way two layers (images, graphics, # text, etc.) are blended together. The blend_mode method # accepts a single blend mode or an array of blend modes. PDF viewers should # blend the layers based on the first recognized blend mode. # # Valid blend modes in v1.4 of the PDF spec include :Normal, :Multiply, :Screen, # :Overlay, :Darken, :Lighten, :ColorDodge, :ColorBurn, :HardLight, :SoftLight, # :Difference, :Exclusion, :Hue, :Saturation, :Color, and :Luminosity. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do start_new_page # https://commons.wikimedia.org/wiki/File:Blend_modes_2.-bottom-layer.jpg#/media/File:Blend_modes_2.-bottom-layer.jpg bottom_layer = "#{Prawn::DATADIR}/images/blend_modes_bottom_layer.jpg" # https://commons.wikimedia.org/wiki/File:Blend_modes_1.-top-layer.jpg#/media/File:Blend_modes_1.-top-layer.jpg top_layer = "#{Prawn::DATADIR}/images/blend_modes_top_layer.jpg" blend_modes = [:Normal, :Multiply, :Screen, :Overlay, :Darken, :Lighten, :ColorDodge, :ColorBurn, :HardLight, :SoftLight, :Difference, :Exclusion, :Hue, :Saturation, :Color, :Luminosity] blend_modes.each_with_index do |blend_mode, index| x = index % 4 * 135 y = cursor - (index / 4 * 200) image bottom_layer, :at => [x, y], :fit => [125, 125] blend_mode(blend_mode) do image top_layer, :at => [x, y], :fit => [125, 125] end y -= 130 fill_color '009ddc' fill_rectangle [x, y], 75, 25 blend_mode(blend_mode) do fill_color 'fdb827' fill_rectangle [x + 50, y], 75, 25 end y -= 30 fill_color '000000' text_box blend_mode.to_s, :at => [x, y] end end ruby-prawn-2.1.0.orig/manual/graphics/gradients.rb0000644000000000000000000000256112665203156020651 0ustar rootroot# encoding: utf-8 # # Note that because of the way PDF renders radial gradients in order to get # solid fill your start circle must be fully inside your end circle. # Otherwise you will get triangle fill like illustrated in the example below. require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do stroke_axis self.line_width = 10 fill_gradient [50, 300], [150, 200], 'ff0000', '0000ff' fill_rectangle [50, 300], 100, 100 stroke_gradient [200, 200], [300, 300], '00ffff', 'ffff00' stroke_rectangle [200, 300], 100, 100 fill_gradient [350, 300], [450, 200], 'ff0000', '0000ff' stroke_gradient [350, 200], [450, 300], '00ffff', 'ffff00' fill_and_stroke_rectangle [350, 300], 100, 100 fill_gradient [100, 100], 0, [100, 100], 70.71, 'ff0000', '0000ff' fill_rectangle [50, 150], 100, 100 stroke_gradient [250, 100], 45, [250, 100], 70.71, '00ffff', 'ffff00' stroke_rectangle [200, 150], 100, 100 stroke_gradient [400, 100], 45, [400, 100], 70.71, '00ffff', 'ffff00' fill_gradient [400, 100], 0, [400, 100], 70.71, 'ff0000', '0000ff' fill_and_stroke_rectangle [350, 150], 100, 100 fill_gradient [500, 300], 15, [500, 50], 0, 'ff0000', '0000ff' fill_rectangle [485, 300], 30, 250 end ruby-prawn-2.1.0.orig/manual/layout/0000755000000000000000000000000012665203156016055 5ustar rootrootruby-prawn-2.1.0.orig/manual/layout/simple_grid.rb0000644000000000000000000000170712665203156020705 0ustar rootroot# encoding: utf-8 # # The document grid on Prawn is just a table-like structure with a defined # number of rows and columns. There are some helpers to create boxes of content # based on the grid coordinates. # # define_grid accepts the following options which are pretty much # self-explanatory: :rows, :columns, # :gutter, :row_gutter, :column_gutter # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do # The grid only need to be defined once, but since all the examples should be # able to run alone we are repeating it on every example define_grid(:columns => 5, :rows => 8, :gutter => 10) text "We defined the grid, roll over to the next page to see its outline" start_new_page grid.show_all end ruby-prawn-2.1.0.orig/manual/layout/layout.rb0000644000000000000000000000125512665203156017722 0ustar rootroot# encoding: utf-8 # # Examples for using grid layouts. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) Prawn::ManualBuilder::Example.generate("layout.pdf", :page_size => "FOLIO") do package "layout" do |p| p.example "simple_grid" p.example "boxes" p.example "content" p.intro do prose("Prawn has support for two-dimensional grid based layouts out of the box. The examples show:") list( "How to define the document grid", "How to configure the grid rows and columns gutters", "How to create boxes according to the grid" ) end end end ruby-prawn-2.1.0.orig/manual/layout/boxes.rb0000644000000000000000000000174212665203156017526 0ustar rootroot# encoding: utf-8 # # After defined the grid is there but nothing happens. To start taking effect # we need to use the grid boxes. # # grid has three different return values based on the arguments # received. With no arguments it will return the grid itself. With integers it # will return the grid box at those indices. With two arrays it will return a # multi-box spanning the region of the two grid boxes at the arrays indices. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do # The grid only need to be defined once, but since all the examples should be # able to run alone we are repeating it on every example define_grid(:columns => 5, :rows => 8, :gutter => 10) grid(4, 0).show grid(5, 1).show grid([6, 2], [7, 3]).show grid([4, 4], [7, 4]).show grid([7, 0], [7, 1]).show end ruby-prawn-2.1.0.orig/manual/layout/content.rb0000644000000000000000000000154512665203156020061 0ustar rootroot# encoding: utf-8 # # Now that we know how to access the boxes we might as well add some content # to them. # # This can be done by taping into the bounding box for a given grid box or # multi-box with the bounding_box method. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do # The grid only need to be defined once, but since all the examples should be # able to run alone we are repeating it on every example define_grid(:columns => 5, :rows => 8, :gutter => 10) grid([5, 0], [7, 1]).bounding_box do text "Adding some content to this multi_box.\n" + " _ " * 200 end grid(6, 3).bounding_box do text "Just a little snippet here.\n" + " _ " * 10 end end ruby-prawn-2.1.0.orig/manual/how_to_read_this_manual.rb0000644000000000000000000000407112665203156021745 0ustar rootroot# encoding: utf-8 # # Prawn manual how to read this manual page. require_relative "example_helper" filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do header("How to read this manual") prose <<-END_TEXT This manual is a collection of examples categorized by theme and organized from the least to the most complex. While it covers most of the common use cases it is not a comprehensive guide. The best way to read it depends on your previous knowledge of Prawn and what you need to accomplish. If you are beginning with Prawn the first chapter will teach you the most basic concepts and how to create pdf documents. For an overview of the other features each chapter beyond the first either has a Basics section (which offer enough insight on the feature without showing all the advanced stuff you might never use) or is simple enough with only a few examples. Once you understand the basics you might want to come back to this manual looking for examples that accomplish tasks you need. Advanced users are encouraged to go beyond this manual and read the source code directly if any doubt is not directly covered on this manual. END_TEXT move_down(Prawn::ManualBuilder::Example::BOX_MARGIN) header("Reading the examples") prose <<-END_TEXT The title of each example is the relative path from the Prawn source manual/ folder. The first body of text is the introductory text for the example. Generaly it is a short description of the features illustrated by the example. Next comes the example source code block in fixed width font. Most of the example snippets illustrate features that alter the page in place. The effect of these snippets is shown right below a dashed line. If it doesn't make sense to evaluate the snippet inline, a box with the link for the example file is shown instead. Note that the stroke_axis method used throughout the manual is part of standard Prawn. It is defined in this file: https://github.com/prawnpdf/prawn/blob/master/lib/prawn/graphics.rb END_TEXT end ruby-prawn-2.1.0.orig/manual/outline/0000755000000000000000000000000012665203156016217 5ustar rootrootruby-prawn-2.1.0.orig/manual/outline/sections_and_pages.rb0000644000000000000000000000471612665203156022404 0ustar rootroot# encoding: utf-8 # # The document outline tree is the set of links used to navigate through the # various document sections and pages. # # To define the document outline we first use the outline # method to lazily instantiate an outline object. Then we use the # define method with a block to start the outline tree. # # The basic methods for creating outline nodes are section and # page. The only difference between the two is that # page doesn't accept a block and will only create leaf nodes # while section accepts a block to create nested nodes. # # section accepts the title of the section and two options: # :destination - a page number to link and :closed - # a boolean value that defines if the nested outline nodes are shown when the # document is open (defaults to true). # # page is very similar to section. It requires a # :title option to be set and accepts a :destination. # # section and page may also be used without the # define method but they will need to instantiate the # outline object every time. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do # First we create 10 pages just to have something to link to (1..10).each do |index| text "Page #{index}" start_new_page end outline.define do section("Section 1", :destination => 1) do page :title => "Page 2", :destination => 2 page :title => "Page 3", :destination => 3 end section("Section 2", :destination => 4) do page :title => "Page 5", :destination => 5 section("Subsection 2.1", :destination => 6, :closed => true) do page :title => "Page 7", :destination => 7 end end end # Outside of the define block outline.section("Section 3", :destination => 8) do outline.page :title => "Page 9", :destination => 9 end outline.page :title => "Page 10", :destination => 10 # Section and Pages without links. While a section without a link may be # useful to group some pages, a page without a link is useless outline.update do # update is an alias to define section("Section without link") do page :title => "Page without link" end end end ruby-prawn-2.1.0.orig/manual/outline/add_subsection_to.rb0000644000000000000000000000411312665203156022233 0ustar rootroot# encoding: utf-8 # # We have already seen how to define an outline tree sequentially. # # If you'd like to add nodes to the middle of an outline tree the # add_subsection_to may help you. # # It allows you to insert sections to the outline tree at any point. Just # provide the title of the parent section, the # position you want the new subsection to be inserted # :first or :last (defaults to :last) # and a block to declare the subsection. # # The add_subsection_to block doesn't necessarily create new # sections, it may also create new pages. # # If the parent title provided is the title of a page. The page will be # converted into a section to receive the subsection created. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do # First we create 10 pages and some default outline (1..10).each do |index| text "Page #{index}" start_new_page end outline.define do section("Section 1", :destination => 1) do page :title => "Page 2", :destination => 2 page :title => "Page 3", :destination => 3 end end # Now we will start adding nodes to the previous outline outline.add_subsection_to("Section 1", :first) do outline.section("Added later - first position") do outline.page :title => "Page 4", :destination => 4 outline.page :title => "Page 5", :destination => 5 end end outline.add_subsection_to("Section 1") do outline.page :title => "Added later - last position", :destination => 6 end outline.add_subsection_to("Added later - first position") do outline.page :title => "Another page added later", :destination => 7 end # The title provided is for a page which will be converted into a section outline.add_subsection_to("Page 3") do outline.page :title => "Last page added", :destination => 8 end end ruby-prawn-2.1.0.orig/manual/outline/insert_section_after.rb0000644000000000000000000000264012665203156022757 0ustar rootroot# encoding: utf-8 # # Another way to insert nodes into an existing outline is the # insert_section_after method. # # It accepts the title of the node that the new section will go after and a # block declaring the new section. # # As is the case with add_subsection_to the section added # doesn't need to be a section, it may be just a page. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do # First we create 10 pages and some default outline (1..10).each do |index| text "Page #{index}" start_new_page end outline.define do section("Section 1", :destination => 1) do page :title => "Page 2", :destination => 2 page :title => "Page 3", :destination => 3 end end # Now we will start adding nodes to the previous outline outline.insert_section_after("Page 2") do outline.section("Section after Page 2") do outline.page :title => "Page 4", :destination => 4 end end outline.insert_section_after("Section 1") do outline.section("Section after Section 1") do outline.page :title => "Page 5", :destination => 5 end end # Adding just a page outline.insert_section_after("Page 3") do outline.page :title => "Page after Page 3", :destination => 6 end end ruby-prawn-2.1.0.orig/manual/outline/outline.rb0000644000000000000000000000161212665203156020223 0ustar rootroot# encoding: utf-8 # # Examples for defining the document outline. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) Prawn::ManualBuilder::Example.generate("outline.pdf", :page_size => "FOLIO") do package "outline" do |p| p.section "Basics" do |s| s.example "sections_and_pages", :eval_source => false end p.section "Adding nodes later" do |s| s.example "add_subsection_to", :eval_source => false s.example "insert_section_after", :eval_source => false end p.intro do prose("The outline of a PDF document is the table of contents tab you see to the right or left of your PDF viewer. The examples include:") list( "How to define sections and pages", "How to insert sections and/or pages to a previously defined outline structure" ) end end end ruby-prawn-2.1.0.orig/manual/contents.rb0000644000000000000000000000136112665203156016723 0ustar rootroot# encoding: utf-8 # # Generates the Prawn by example manual. require_relative "example_helper" Encoding.default_external = Encoding::UTF_8 Prawn::ManualBuilder::Example.generate("manual.pdf", :skip_page_creation => true, :page_size => "FOLIO") do load_page "", "cover" load_page "", "how_to_read_this_manual" # Core chapters load_package "basic_concepts" load_package "graphics" load_package "text" load_package "bounding_box" # Remaining chapters load_package "layout" load_page "", "table" load_package "images" load_package "document_and_page_options" load_package "outline" load_package "repeatable_content" load_package "security" end ruby-prawn-2.1.0.orig/manual/security/0000755000000000000000000000000012665203156016407 5ustar rootrootruby-prawn-2.1.0.orig/manual/security/permissions.rb0000644000000000000000000000336012665203156021311 0ustar rootroot# encoding: utf-8 # # Some permissions may be set for the regular user with the following options: # :print_document, :modify_contents, # :copy_contents, :modify_annotations. All this # options default to true, so if you'd like to revoke just set them to false. # # A user may bypass all permissions if he provides the owner password which # may be set with the :owner_password option. This option may be # set to :random so that users will never be able to bypass # permissions. # # There are some caveats when encrypting your PDFs. Be sure to read the source # documentation (you can find it here: # https://github.com/prawnpdf/prawn/blob/master/lib/prawn/security.rb ) before # using this for anything super serious. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) # User cannot print the document. Prawn::ManualBuilder::Example.generate("cannot_print.pdf") do text "If you used the user password you won't be able to print the doc." encrypt_document(:user_password => 'foo', :owner_password => 'bar', :permissions => { :print_document => false }) end # All permissions revoked and owner password set to random Prawn::ManualBuilder::Example.generate("no_permissions.pdf") do text "You may only view this and won't be able to use the owner password." encrypt_document(:user_password => 'foo', :owner_password => :random, :permissions => { :print_document => false, :modify_contents => false, :copy_contents => false, :modify_annotations => false }) end ruby-prawn-2.1.0.orig/manual/security/security.rb0000644000000000000000000000155412665203156020610 0ustar rootroot# encoding: utf-8 # # Examples for document encryption. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) Prawn::ManualBuilder::Example.generate("security.pdf", :page_size => "FOLIO") do package "security" do |p| p.example "encryption", :eval_source => false, :full_source => true p.example "permissions", :eval_source => false, :full_source => true p.intro do prose("Security lets you control who can read the document by defining a password. The examples include:") list( "How to encrypt the document without the need for a password", "How to configure the regular user permissions", "How to require a password for the regular user", "How to set a owner password that bypass the document permissions" ) end end end ruby-prawn-2.1.0.orig/manual/security/encryption.rb0000644000000000000000000000226312665203156021131 0ustar rootroot# encoding: utf-8 # # The encrypt_document method, as you might have already guessed, # is used to encrypt the PDF document. # # Once encrypted whoever is using the document will need the user password to # read the document. This password can be set with the # :user_password option. If this is not set the document will be # encrypted but a password will not be needed to read the document. # # There are some caveats when encrypting your PDFs. Be sure to read the source # documentation (you can find it here: # https://github.com/prawnpdf/prawn/blob/master/lib/prawn/security.rb ) before # using this for anything super serious. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) # Bare encryption. No password needed. Prawn::ManualBuilder::Example.generate("bare_encryption.pdf") do text "See, no password was asked but the document is still encrypted." encrypt_document end # Simple password. All permissions granted. Prawn::ManualBuilder::Example.generate("simple_password.pdf") do text "You was asked for a password." encrypt_document(:user_password => 'foo', :owner_password => 'bar') end ruby-prawn-2.1.0.orig/manual/images/0000755000000000000000000000000012665203156016005 5ustar rootrootruby-prawn-2.1.0.orig/manual/images/plain_image.rb0000644000000000000000000000132412665203156020577 0ustar rootroot# encoding: utf-8 # # To embed images onto your PDF file use the image method. # It accepts the file path of the image to be loaded and some optional # arguments. # # If only the image path is provided the image will be rendered starting on # the cursor position. No manipulation is done with the image even if it doesn't # fit entirely on the page like the following snippet. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do text "The image will go right below this line of text." image "#{Prawn::DATADIR}/images/pigs.jpg" end ruby-prawn-2.1.0.orig/manual/images/scale.rb0000644000000000000000000000117412665203156017424 0ustar rootroot# encoding: utf-8 # # To scale an image use the :scale option. # # It scales the image proportionally given the provided value. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do text "Normal size" image "#{Prawn::DATADIR}/images/stef.jpg" move_down 20 text "Scaled to 50%" image "#{Prawn::DATADIR}/images/stef.jpg", :scale => 0.5 move_down 20 text "Scaled to 200%" image "#{Prawn::DATADIR}/images/stef.jpg", :scale => 2 end ruby-prawn-2.1.0.orig/manual/images/vertical.rb0000644000000000000000000000214612665203156020146 0ustar rootroot# encoding: utf-8 # # To set the vertical position of an image use the :vposition # option. # # It may be :top, :center, :bottom or a # number representing the y-offset from the top boundary. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do bounding_box([0, cursor], :width => 500, :height => 450) do stroke_bounds [:top, :center, :bottom].each do |vposition| text "Image vertically aligned to the #{vposition}.", :valign => vposition image "#{Prawn::DATADIR}/images/stef.jpg", :position => 250, :vposition => vposition end text_box "The next image has a 100 point offset from the top boundary", :at => [bounds.width - 110, bounds.top - 10], :width => 100 image "#{Prawn::DATADIR}/images/stef.jpg", :position => :right, :vposition => 100 end end ruby-prawn-2.1.0.orig/manual/images/absolute_position.rb0000644000000000000000000000162512665203156022100 0ustar rootroot# encoding: utf-8 # # One of the options that the image method accepts is # :at. If you've read some of the graphics examples you are # probably already familiar with it. Just provide it the upper-left corner where # you want the image placed. # # While sometimes useful this option won't be practical. Notice that the cursor # won't be moved after the image is rendered and there is nothing forbidding the # text to overlap with the image. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do y_position = cursor text "The image won't go below this line of text." image "#{Prawn::DATADIR}/images/fractal.jpg", :at => [200, y_position] text "And this line of text will go just below the previous one." end ruby-prawn-2.1.0.orig/manual/images/width_and_height.rb0000644000000000000000000000161212665203156021623 0ustar rootroot# encoding: utf-8 # # The image size can be set with the :width and # :height options. # # If only one of those is provided, the image will be scaled proportionally. # When both are provided, the image will be stretched to fit the dimensions # without maintaining the aspect ratio. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do text "Scale by setting only the width" image "#{Prawn::DATADIR}/images/pigs.jpg", :width => 150 move_down 20 text "Scale by setting only the height" image "#{Prawn::DATADIR}/images/pigs.jpg", :height => 100 move_down 20 text "Stretch to fit the width and height provided" image "#{Prawn::DATADIR}/images/pigs.jpg", :width => 500, :height => 100 end ruby-prawn-2.1.0.orig/manual/images/horizontal.rb0000644000000000000000000000165112665203156020526 0ustar rootroot# encoding: utf-8 # # The image may be positioned relatively to the current bounding box. The # horizontal position may be set with the :position option. # # It may be :left, :center, :right or a # number representing an x-offset from the left boundary. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do bounding_box([50, cursor], :width => 400, :height => 450) do stroke_bounds [:left, :center, :right].each do |position| text "Image aligned to the #{position}." image "#{Prawn::DATADIR}/images/stef.jpg", :position => position end text "The next image has a 50 point offset from the left boundary" image "#{Prawn::DATADIR}/images/stef.jpg", :position => 50 end end ruby-prawn-2.1.0.orig/manual/images/images.rb0000644000000000000000000000174012665203156017601 0ustar rootroot# encoding: utf-8 # # Examples for embedding images. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) Prawn::ManualBuilder::Example.generate("images.pdf", :page_size => "FOLIO") do package "images" do |p| p.section "Basics" do |s| s.example "plain_image" s.example "absolute_position" end p.section "Relative Positioning" do |s| s.example "horizontal" s.example "vertical" end p.section "Size" do |s| s.example "width_and_height" s.example "scale" s.example "fit" end p.intro do prose("Embedding images on PDF documents is fairly easy. Prawn supports both JPG and PNG images. The examples show:") list( "How to add an image to a page", "How place the image on a specific position", "How to configure the image dimensions by setting the width and height or by scaling it" ) end end end ruby-prawn-2.1.0.orig/manual/images/fit.rb0000644000000000000000000000123012665203156017110 0ustar rootroot# encoding: utf-8 # # :fit option is useful when you want the image to have the # maximum size within a container preserving the aspect ratio without # overlapping. # # Just provide the container width and height pair. # require File.expand_path(File.join(File.dirname(__FILE__), %w[.. example_helper])) filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do size = 300 text "Using the fit option" bounding_box([0, cursor], :width => size, :height => size) do image "#{Prawn::DATADIR}/images/pigs.jpg", :fit => [size, size] stroke_bounds end end ruby-prawn-2.1.0.orig/manual/example_helper.rb0000644000000000000000000000026612665203156020063 0ustar rootroot# encoding: UTF-8 require_relative "../lib/prawn" require "prawn/manual_builder" Prawn::ManualBuilder.manual_dir = File.dirname(__FILE__) Prawn::Font::AFM.hide_m17n_warning = true ruby-prawn-2.1.0.orig/manual/table.rb0000644000000000000000000000062012665203156016152 0ustar rootroot# encoding: UTF-8 require_relative "example_helper" filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do header("Prawn::Table") prose <<-END_TEXT As of Prawn 1.2.0, Prawn::Table has been extracted into its own semi-officially supported gem. Please see https://github.com/prawnpdf/prawn-table for more details. END_TEXT end ruby-prawn-2.1.0.orig/manual/cover.rb0000644000000000000000000000221112665203156016177 0ustar rootroot# encoding: utf-8 # # Prawn manual how to read this manual page. # require_relative "example_helper" filename = File.basename(__FILE__).gsub('.rb', '.pdf') Prawn::ManualBuilder::Example.generate(filename) do move_down 200 image "#{Prawn::DATADIR}/images/prawn.png", :scale => 0.9, :at => [10, cursor] formatted_text_box([ { :text => "Prawn\n", :styles => [:bold], :size => 100 } ], :at => [170, cursor - 50]) formatted_text_box([ { :text => "by example", :font => 'Courier', :size => 60 } ], :at => [170, cursor - 160]) if Dir.exist?("#{Prawn::BASEDIR}/.git") commit = `git show --pretty=%h` git_commit = "git commit: #{commit.lines.first}" else git_commit = "" end formatted_text_box([ { :text => "Last Update: #{Time.now.strftime("%Y-%m-%d")}\n" + "Prawn Version: #{Prawn::VERSION}\n" + git_commit, :size => 12 } ], :at => [390, cursor - 620]) end ruby-prawn-2.1.0.orig/manual/absolute_position.pdf0000644000000000000000000011325612665203156021005 0ustar rootroot%PDF-1.3 % 1 0 obj << /Creator /Producer >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 3 0 obj << /Type /Pages /Count 1 /Kids [5 0 R] >> endobj 4 0 obj << /Length 383 >> stream q BT 36 747.384 Td /F1.0 12 Tf [<54686520696d6167652077> 10 <6f6e277420676f2062656c6f> 15 <772074686973206c696e65206f66207465> 30 <78742e>] TJ ET q 240.000 0 0 240.000 236.000 516.000 cm /I1 Do Q BT 36 733.512 Td /F1.0 12 Tf [<416e642074686973206c696e65206f66207465> 30 <78742077696c6c20676f206a7573742062656c6f> 15 <772074686520707265> 30 <76696f7573206f6e65> 15 <2e>] TJ ET Q endstream endobj 5 0 obj << /Type /Page /Parent 3 0 R /MediaBox [0 0 612.0 792.0] /Contents 4 0 R /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] /Font << /F1.0 6 0 R >> /XObject << /I1 7 0 R >> >> >> endobj 6 0 obj << /Type /Font /Subtype /Type1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj 7 0 obj << /Type /XObject /Subtype /Image /ColorSpace /DeviceCMYK /BitsPerComponent 8 /Width 240 /Height 240 /Decode [1.0 0.0 1.0 0.0 1.0 0.0 1.0 0.0] /Length 37174 /Filter [/DCTDecode] >> stream JFIFHHAdobedC  !"$"$CMYK;!1A"Qaq2#BR$3br4SCMYK?Y]qe#sX`20{ї̓&e~q V$qom2a|~Ԗtiu1`A#knc*±գ\RZ"pInjhN 9gDD llǃW>n$y4eJ1>xPNc*g[XJ!QO+Vb+Rxe 0qUΙr%t1J?БoGˎ !mih5kDV,߽Sz{T!j;rM=,9lT7 QL 2P4j r=k(LO[9$501qELj]D5 93l"%vտzVݺ#OEIQrq;c|oc,$rǷ74*x厜V3j *Dnt@Fq+ߨعl%;j/PKyDF ;~9⸸]LIiH͗B0E8spw>GޠEL9dS v= JRB q=R6X0đ4S aŝ$d {% (pAY[GsA&P6!O]HGc|X&‘ *iĨi:G8?,O}d$n=?gtX2Ī*vQOl)'`k 2۰3<yXcڼ@U=E5i0|\~QII"RXFFб]jE<"2/|\$.pv.싹8γ%Ty3Ӹ?hDK*n^␅T<|{{Df:xi$JsHu `ֲDGXZZ:+(OK_Þ[ҹ+"#A xjאNmZ+/*o⑞s ( W#p.؃nRf/z|(c>\;xL AJ޶2A4W6:jxXsRҦrs@ߊ:l5D8I? tbvu NyKH#{g#\ّ`x؊+Mo(Ysۑgo"0yJdck)@p򷝈!^aFƁ ٮ!$\ qx]Hc`ީtp&K X+Q:w> *({VJ>KSSX`0>moE9q`X#%\ƧN]pqi{vA: y9 +!3۲Ȭtĝ^1te֨[u*GH;2&r"mY#ڣuQ,Rr+F9HEdJ@ICqI% #?{QOtORI;ރ׵/e83݆W+=%*aU!ݳҊRA$|*ETEL؝׎A9RAx%J3),qe+jFqf9HI_?i1%eV'g^1#Ef|xUh I EO<@Z35 LO_#?+XV@睆w护dfիnq-`2*64e s_eF89朲ɭ ƣq,CLΥu=Gk12q||+O#6Ϯ~-qu/-lT~nBbm#Eu=ԃs42pH;α5<9$;.dh6 kEBCvuEiex#'pB.iu/1B2 A#+gF8_CwNYqp${{ӗ$𦤷"j+W(:8({T9 ,WI;0^m ;O;^AmCINd$c4u=,$a#15դhD4 sAY~tvӴ qY!:C>^EX+D [ė6IEF^VR=BmX+5I8ڕ^X QQ8U `VpGxnq\,r$SQY^[fAA ۨ-Pvr kt Pe #'o(GdMp~Te\NݛlcqEay +#c)mHs5XEĆ#IsEI <}i{^,n-taQJBʤ}}뛝|1UF;ypXo8 J&WeӜzlՉ( 5öQ[\[!dwkY;. jns-&cb֊Ei$RT(c9#}8zwRr  at|UX-H0IQ_A֡ <;8,X;wǧKIbyt>pUADq0{WOb4lF3qF %yno^h:YW Lǭ5Q>##RRqq+g#zR; ڊb '$>z WvHv5\DZBEOWiYT`(ʎ1;& xz$6S5'$_غ-A4$6F r͡u*O_ߺnjX}rt^fΡӳm\0qRlV(EAR|:+ҌsS/&1AAX#b_chu#110]"N;w}) ۝J{~[xYF鎦FYCGdF9QZɬ@H nN ߍZ#,8 [aM.A+I`3d'Ak,dF+0I f r5n\-+08q{|WFSnA*u,ǭ:hW9y8vT;mTTUHe9{|o ˎ?{& 'j"0T_ozs 3!;~#>Y^9(;`doE%v1lm\QvT`䓑X]1Gi#wQS)у1;M(ؓp=ڊVb$djVn8SOApw@E'spcURH*a,gNo\e͠;EcotvիV"t-Rj MsEkrWQAfcWWԤ`'-H +9y3 8ukx`dg&n\A\e1c? 뗿4N6ڲ,$u&P`vHl&:vm*w( RLxӂoQeHdGʜpSj؆ՍA:ͬzRsd|(S[ ϕԬpoXbB$q0C{zo*rwa}[u[Fzz^ Z$eAEu)g\i🧦7-lIA"@%cqEvWK Ƃ~BQeƐUrNUUPX~tS$B0|n*qF0Np@㚍[j'E#$!'`Gjm-."~GڽHdӐ n?cJ+,.Nr8?]Y,kʧ' SvGI?@Л+۬ 2w^ukS/>\I [Fs#L)ܢLsQKܼjtV0r<Ծ O+c#dQn&QTcMu(cjo@0 #p 9S?rJF;~DT d⓽hcU}hEYdب *97&Dls+嵵ȹI$v-vLY e2$*(`EYb6FIj cmL2S:6e`I1\V /1a)q08,Άe[ zW%$$`@SҘԖuy;1YКdBǽ`NM'KpnLʫrp{sEz;X5N>!ϰK$  |(Gs$>m cyT.yI體HFVaIb>:^D HӤB2'/Q-l xYKy, hr`֟HB6ǚX8sEZ] Prvw C>F'cX8\gފodkFWXnU*Bw' p\G)u■, {U^v+yf? +Z*+|)IHXO{7OoxEv=o ̤#'89ױ\emZGΚtfYC,~خue>' *ښx`F nTi5"=.נā''r}1Z,_2e`y_N$JQ,WWSc~@$VSv~tQh]Q R3 ֊R >`ET>L!m_ݢ!T1h^۹TT\^YF݈ޓdYeӓ>TR{*ĦfEx@E0m''_EDThNQQZD#%Vt'<5F6RWW1\o}R&RJT?u)'Xaw<(8LFpS'MiIE@?忯ʷlF=qEJ W2gdvP&V;>S=ux$ƳaEgQO1|3XupV` f4D%cרn?*14YE`@ٵqRl<ņvڊ"hًceOΠ_$`NFEKJY8(^,0qPz1!!5Á뵹B!@e*=h.XݨM!F{}\ЍYHtA^_֎^0Fl޸Rr"]N^;72hC$d rҰEn:JsEP͢L4T p{SOsm Ѓ>iJ h c\Љk}B@`>F5n#Qlz*Dq.8jF[ó׿jsaFc8هj*mnG$xTd3nξL wA&NHphB"?ER?AqڙXaմav4WԼZ[GoO^+L7 ುˆiޛ*5FAE#udUlcҦʲ躟xg&ĺ73oʊݥ^0 sSnp4H#^*4,*#}XKr4\ }=^CrM@Kh`2YdR壞%ԥx$ݹRs[_ͤVVH]G2%^1>YahU8N }i3ڹ #|*\󪨍#}?;g=(!aF!#\Id68د1x IhR8rT{`I>ˆa*i!ڊ"H 6! _:s hQHz{QNxG]'+F7K H2#!=L*|[^"h[PZ'\A֖-fvI0cEH!qk(cTfV#zN'HՌ'*?}v B =q[-J*F%qoE/c dLp?*e2OuB3H1>]Q\8E&m^'1Fǒ~ѝ=69m $7ңxs*+ڼ@I#FN&C~`3L\" 9|6̥ d\9>Ě,1 ^-gXÐ'S#(ɩ#r#HϡpC.9ߚ sms)K6ﱬA[IsQeG>="fYqF~?j-n`EVݗ]N0 }N3o)S5;d ͜mVbmEt2֊j9nU268Bډ"BqQs,Wv+p=6EUb&TFF*VGct*ATbH]WM,tҀ6U+wBs[Y%$iQE3-/I$0f|U]CR.}?ziȢrxX:oz-j @[&=>)drl⊽ӮH8&) h VwѴl"BH8;-x@2,$yY" D pE]jfaہڧF̯y;m!x%9=H[^+ b=~[cD,Pa[_H%W}3X/o3⓹lg J$ɓ?phVI*F~i#! T#lL_, WHԡ9\ՍFP9H>Oh%C qnʻG [prrGqQ^1tƣ?yN#ɗ*ph#Z Q8Ez*1w,-` ҈IcK"5 @۵Qײ] &( y_R!D|U {j{55*9sEMB"XJJkH\icWHۼ2.tCr}f'Y]YV%]泹"XM{d`XK!bFU~T{@l$;No~s|hmh_X(9_g-'j8r1 <+$Tl sTb9:XWգ5E/@IR? 2FjjciF6Ǩ4UNod@|wGc Q_ē4gmLNWnxь;jucʊsp :]a>{U.s!N?hu"N%F x_cm'-HKj]:; ;fOImlcǵ5eCf' }ۋf`1+Uy\͂rF?OZ`s,Y7Ց0vFTފش*pWesUadDhcoj̺Q8O,aTQc`< >3*1]hvʦ$u'|*ϩC,2@FrpqEP3&RΈѩ.+頒YT#c#˂FUI") cW6쳉f#p~]/"_p *REL0NKղʮKp;n;ǵֱIV}&hkcJ Ć;[&Ռ[(mCQE =U;buF%K$ԠA4)MEt])5¬D|}km2Wt*sj`2L6?:+&x RB=[i|&g RFwZ+ၑb#pq|=Ӄ&M^lp1Wrw;֊oi"M1l6FOOwS>ۍS<*}jNS⨢(}I}ȆYJdi2C:ZHd`%ퟥe8Ɵ犙i̤Fsxo$jx^1ePwe8ַpU0v88z亼3#3ĺ_J)I2FYwS1 .ˬ3kNhfҭnp>xѤVIR{-b8g>Ee:UVNE3@RGih3Qmor=qϽuKтl>_ּl6aߟ]^OnقE!{%R[ڣlpň =~8Ik@E'H?)RSoQIԒ ڲ\UX=覺\ۻo݅sVDlw +Be"L*H2G>4Vw\WԼH'psbH:/)fl֓7}vǖ|MZ6s;`Ht[VYe>vK 2:Ò=hUXf'ɌdV &bĨ2SQzA]de*3ۊ+mjۍޮګ2!-؁$ w\4TO P3 CHr<\|Ͼk[{?PCXdzL XI 뷦*OP3 7%v*7Y(InxQ\N̒rGo⹾fR#>J52"Jc򢓖7MigIǿ?S@ZcSSڬޙ K2yqEx+ྡྷwһP:Fp?JZrw9L0jB2BL} ^qf!O8VJ:\lOoJa&F)`-)#xt19VRdHޑxH uV>W[gV#}%s{8mZ3RʻGٯ]:X#Ր3Ȣ.#͍8ơfF][pxy'ԭݣ1+|`Uy{zmEݱȌIڒ1qO?|VPIz40Ҹا~1$Ԯm;QI]hu#֨Im!1^t ET+p5h19ǔ}f$Xm:}GߥWQ@6qK8R( >J Uo}9X\é,:N8ۊ__,%dî ={C<*Ub2WT-eHVmd}vQOĕC܎ Ս~Vu9f!\!|*L s cuQWK@$eyi#☙DjK6~x~Rnb4rX}+. 2`(þ4^/! 74W6@-nU X+B3'ci#j+``ҷ4B(*=(TrTn8 ,u);ZIu ۓ _9Vfhpt#c"M9O>RVU;_Zbx1%~5(YIm"uHXASP#!|`m\nx~MAzCqm*wۿbdv;G"JBۗF;8 Ņ8|~5YdP)# 9߽zӫ lXcT;ʂNY0sJ6*RwGwry|M>B '+0߿ʣ4ag9ڬ#@;' ڊ%d,w9:r@VCNӪ.2ͫ⊚/GQb7={7߽}VA}(V~KSu; #]4N?Z) effG{hE+.WE4 TlmR)$Gqg׾,Y je~Q[!<E u\hŌ_[:"r" 5#ݕ3nx{SZh,.!￰m+,NSڳONy#/zkpe?$;QXHf5Fξ9G`=o֛Yc1#he"b>vȮz嶽bX+l'a99oŠFO .9#Tޤc+԰I,Z#pafֻ,>99 h V6䃬ِ퍶#ڊ(8;pϘ @e}]FF#ފnp8$6GoR0mwk4lI;+2]q ӨUg.aj4e<Y<)Pxnw E=06paOpS0epmEtoEP1>t d7?d Ev6FET2n|/|X@BqT(QU=m4ڎ4;FS84frOGh](b1!cP@ŁΒk@ļ(H>觓)3隓5#ǂ>Uo;B!p؃hIu 9` Y߯dvJ%8@}uI]m>ԍ<4Spy1exL`(Vd`UT`j#'+ү2L9:kqG$-jWnjҊR˶r|T9 q>?p_$jZs^mw~OI<"p0 8H\rRXpwɢYƒ$quL'}ż3{g:2J0Rk&E|+uKxT:ǚm-b;g9--H v5W$ʏ?>+ l\FRq.} çH\.L[u^@ qEOGW:n2ަu(LG`Qq3(s& 'yV3[O S1^^+5*TG9ӟtWCBWO䜎+Pr.}mSY# #V1՝QY6! a"kئ֛xS&w՜6fo0%I;ԁ2LOq1^Th\Ȣ%vm O;*xG;Z/Y_?{9誖d4d(;眏Z4cp㷥;m~u,03\;$ 8c{]8'8϶利{gQSГr ab V'!r1LrUdǮqE}B`4SIS&614o!|/ )9DY@8?@H ME6K}>*L6 |^ݠ\!\JG?,! 0IrLc#'zEV_  WP *hi ٕE^66rxT6XUI/ҝ<p)OEP̄ŵ ܏Rpa`9Q 6#Yԯo_ʊiL#>l)`A՜QU}4Bp|v=/g8xεϘN(mF8_Z*A#UtKG;3ௗS9"A,`6|<+m>^FIԲ `F?jr58rphnt`){&I0pqmc$s t*F9S7aKŢշƵV#)@єѨ6=諑^€doT˨WF纄 @bQLZ]̬+.2zbچYwϯ¢lm).H=[Ʊ.sU%ۺ8r+3'u=Jq֫ڷ_>NqPmmi)c ~TTn`4흶"BB1D<*.q9KjxyӀkKbTrCo[˕ E1~YĪe;v74.˸>/Zߤ̮2;(i c$Ub Ϯ*< xpN7 :©F6xWjn5)WQVH)3ELwKUmEJѻNc#}cP:|n#u;⊦cղA\++e֑(ۚ:"6  | ݬubrIXK$WLmҧj`=stW6ȫ2}!P D7܌XJNImvvms : 1\,.CC}3_U@mv;QKIBGR9'SG(.^,26JVvsI" poY4T)fmhA8}Q^&Da(b%$ϹSW Xm9+ Qr6T$X4죜택Io 8V NJ2#,`܁_ʊx6q.|-@ ?*ijh IcELms$(Flf9ie8؃^" U#ǗVИϘd0o(<~4SO7ҊǦ,f)|sW-n#*p{MZ$п3f,ޞh \fX!өrq\< VhE\= gF[u.0nAݷVpF3Sy`7yҷ&2d;xwwzerH |o1]Yq܃|).MƂH~]Kv"EX|}Q]UKlX\\Y:lјf.>TSc 'o?-`[!wXAwL)%~V1HIa[H) Hb19U¨ 0N # /Fv7 :<vWm#2ȢB+_j*m20##ڢu+A X}zj\F|1dܩE9mypY{ R1DcVwF0q0,HIՍ~gEY),a|{mtVWI9<湞g%nj!m8]1uaǵP%bj:奝t1]qEak75 ⩟K Xlۏ庼5ʊűs׵POĩ:w'ޑB!rWIzB+iRE!?bv(K8': .2I#9+9:|E.p@ߐ{u3PK>2S1<r;gz)ޟne" Ɍ0J-. UUn wӭPj8ꔡa$*EyT)ӠbM\s>NZyV\b]܎AZ0B?vz~DVDm`0A(QܮXdgވ.B8$oq3|{^/JKr#W-mfXV-. 4Tˆ%ωJY1YHOqTR TvE)q(PUضe?Tu$m+4 5J\c ld퓙Uqެ)isju2eXoE#w#g*9|*P0HZxHjLlۃE!w$C;db,U|JcӥdBø7osJ\OFcj6@wO;Q_FRWm`'M@|,İTٷ9ۜ{vXa`u);w A@U #-mov+;PzgxB!;m()3~mSmؽdbtVq*d{knEuvMdaT!Mq *5ڡ)8 ɪ[)P ܕ n{*Uu'K7r1\xNB3}+x$`s*w{? pGqEX}jMi>[vA}}{ypKn?J)6UHH mD񿿽zkiEr~~_٥$nE+w^6 0AϘVCCBZKh.VӪ1 A`jf[1o6I?^xnԤ yHooQETVd'_5DD2 duuTʫ,sQ]GE2P۶{N"H]Og8? d!–- 6QUC]$`ߎvHg !?. C/~Wɧg- \ l).X`g۟\M#n8_QY,Nې98W gs@!P }E8SoS)K٣DseL&fh8KmER鷁"ki _ 9cQNƮpJcwS U]L#*elJ*mhnpĊ')Gm*klAaBf0tYGw>" #6v/m'r7 X°}ֺU_Do1xv ̮;yZ+TEx1Dx VԻC+Ӝ2ϵSr'Z+_PRD21_ T.덷һvRp/z)Y&/ I$m+aᴍXcjP ;mQg(_Hz71[+!7c]ąX,\[J7$I1ZȮ]XmczURv~9mL$wEVԦiԣoSo a`#?--Nu*H`Fsڊf La|`=Ho*bE  sF>;Q#*Zm.葊)jj~`c#ފYtg Z6'9reW6ؐ8#C0vۏA.bd o2;&hÉTFn:-Xꐲ#sEQע?FLٗʦMGR0W[ߖ*G_ cr<:+Nj9ӌڑ77P;S<;EPuY]հ9I6W󋻄8c?_ ̋ u+cкCDTb21i95ˑ IR'>+Wذz))]@ܒN7k0~P4eTӷUI8Qq޹.["@ϛmU{@KH ޴Uk;O+s9;GI%NEmo,ɥ+G^LpOr2FAV3[< 0ۜsR/FWi8oz Hըd|(ʭe4?z:$[8?_-l㲺W~C`q+ #2R+ H4xm]'R22I<*g謕ጲ.rxM1ǕO֑闲M:tsR$+qW* >5noPF>_oZ++9ctx'l/*twѳF 13(;Ȣ[ȣ8's3JL͍9+9 \swSp̄{zS!GFUUdB \n>E_̱K[^a1ޡmq+0抡ew$1"MXr JM*/0OlB 9}h6r$awھBA4-$A&)N2ٔg#ڊ"g"c8o5v'u'޺qŤe,I+.$2*CnzɦSb>#T37̾QOm w#RT\~>&Bh#|qX]LHvoshdrIo£_Ʊ0N{sފyuRy+qo -ǗgjI.{xDQRwQMZ\K(KiJtTr E-/&2?$Yʍ:[I$J?/W(c3߽IbV:F g}J K)*lpOһ[IDP_Ie3x`c+*E~1{pܭ¡` HSc%#)|ЏOR BF$~h#78{h<9Ҝ~Uvx% 0Ձ s}(|ʣIk㸑gx0,#RHӂyJJp3|MA.am1)&lUʅ(t.U{[ *THx68g;m^|<0\E6.z6uwp0Ԡp7}Es!È(u7Dl4 V7Ld y~k W,FGpvh>\9'5lɇEϭ6W КXv S0X3= M{,c$yw85K@ >[pƱهoΰq+ lroozFQ2?z+\)#pGƧͩ5h`N@mVp?;mEA2H̯Sޘ_ ć'#ǮQ!.N>>Rh &m dd0|4ݙԈe*N OdF؁B8YV=jFV:m̞GL)'`~4WLIH5çs#; 7IG#J$1LhPTRM6/|Ooo!}3lQ[tp_sfXrN8 v>mzKIg9tS3b%b&2?ƬA,I6f 6eE2Ux!dܟC^SYm Yd$I#d;IyLC cڸmMǧ~(C: I?b0 g9\/ʶ@uUVuyU _);;ʷ2pW~Tˠ1"FqQSΒ93\\۶xLw|Hũ V#r*7#oD77r4[V)>4UnYJHUg`B6+uˉ VwK$,;[Ā.cb;K@&]cpH;+Oy!x;n=X@6cژ *˱E#;T2+%3$҇R69wQt@ǯ#ybUeRaV:KfS"11EFIw@]D(?VVHG<ԗRYN @Ǚ@;ըbVYlmD% % z֣s5N<([#~dߥHCrXN={ft5b0CnخdDΦP;qDVeH?_jv9r7Lf +y;}VŞTOEgҹ$˩ռ1XW YFlQ_kfhp5gz=?1fr>_8 R }m$GҨYd)KKq@"T ފN̆ 1Jz+oXJ7?Vhn;{h JF<R4(Blwl >y'em,aszNbx$b]*Y#fsE}c2a3J<ѸRXn41lފNfRm?zrHYc+4%q:Nj);s7oR5¾08uǮ>F rFͧ9P0q\QWmX˫ j.ce q|+9be׌y*sz[HLoC)1gD+,z# VlO.Ǜ'm==K°.9ERMHjCVaWmah NۃP:N]ԸO`~Whd-2(ܢʪoc\'Jm=hm\Qsf0FWԶ"P)(ȡH#ps7FW YH=VͦrAEu+k_Pa!SȤ `]HSS\(iT`z+!H St+@UKp7ފ8]gYXJaw]=&1sEf*{.F=kt F{?Z-0RIӚ*ĈX}vW)}O A9k!F"t/ʊmX"O$Q.$7QĒI??ZsLxdj)oP5\PHX%OK/M:p;bbgeW,9ׂC3N)Lcv4887}>F,(K~]+*ee7lU[ zmɢ OSzo(Ig*SƗp" Gil$ˍ[ U6հdT R(gr6?e'Oܗ-OI"NRJFxu$׺ҫ[Ԇ$q󢗑di" w4FYIRB3lH/`KPи=Ey)0[l9H_-QCdᴜ}5U o@j)Ho1Qqԓ6❱Hf;[b)lʒUYmC1߈1}MU4[*N2W%itE,VҬ O54|#׺2WoM$I)qn[(ԅHNo(:3)ǕlGIEVm>ȢgH߽]|9P9z+YPuzUqm,PDHR3>4CRHu304=6L[٥C`ʊ dho\T Rȣ-v"tg&MCNlGcE 1n)8J3X8qA#Kv ]pFTgWHc’ПZd*Ȅc?:+[ϋȂwcjf-Q FE6TgY# V@w4F۝$m+򔰓pcCр䏅nHm8wqE]EE@+Yd%]0Gx^'ՂdP7T~ ozJt4qEV1_0X$4W15 *trYir@!ðǛ5"kRRH=2r0q{I2E3"޵{Ei# PG߭*lǂu;sE) c'kֱNjiA"QFvoj>#( sފYU &[2ĸG|z`x' jsE;Ӣ[wd!ݽs[ *xVo1vGN;nEom#qV>-Aj3~ Il8hT:- &H{TĆAx#ROjuHFwy켨:NA?Ğck?|Voc`xԥQ<)r9=V,VR[2?֊Ю^" ,;}^{'K-#v.-y#,Q]3h%%$4Ɋ7+Ҫ Z@q'֊/<i]=j+>&V TeĀ l:FqWl[V*n;PBEm<7_ԅN㚳f32qm@emEkgsLF216;S˜HƕV wjp4~TU rqT+9;6I{Q274S֝= 9(v#SZcZ`%0<~Uu:X[\UId,r{J5!mz)Ώ+ie rE;~+\bECES1cb|{W=խFz:sAF.uqEL=55KQd-p [|!-G5ARNۊ)7QjaupqY G8Ww1o#዆=WMʤ'oJȆF 2P79;Ur7Q_.dGPtvW븰.m3WtxIdQJ-67}(F,o'׊d\Lp9S;QNOxX"c$j؅^W`uDEuW*}q>U@ >RhY^C6󰬣={sRoL ,9$(W nW׶~4g v<}LP-ʊg~N;8|Hl[m*0.ؐH)@?}GqHMlDA:F ,b*1rn,JK2 6ߟҥ_!bK}R94i.#XEX,tC(?~̊4~QVlfWI߇VzLBEl l Qd`Ii0)T+IFF3=*DH`1䓵Gs!#ܚ6Xk_BH"(Ɗie' epG; + 2W9Ond V}ܩ$ru]{w- Nr(e$gd 9\S;Wc፽6w=.XC#p=6[IlrtaR滎2NT(?cm`6I#uŠvǫDi`Pa鷽}HU ;1^L%ʰ )Źe‚C;¥LR ަG(W_ A(:w8YBW3zҹ3u S&H <Z {v޹۳B:nI9`h]\2#|*-C鱦:Z4.71rqF3Ldl}_x GQ]IxlڟNw޽\M6n18^VF9}֊iv01Ռq)~  ʓ)0}oz)N2j?tVLד_j iz(c,A`0yS>,28;kvjoU|}tco(Crm&:'QG$BqQU,FoξO|[SsBYUd *ճIYK&7KSa5%AnQ,p}4U3UR c mߥEuXƷ ˶))h\GCX`Lr(dxJ.Co\Tpŝ޼ eb ]\hţ1m,Arlj̱QTa ) 2KOP"'$ ׋q7#ފԡsPo,P\6qֹG?pe; C?j!H]IuZ[X^"Ⱥmi:Inwɩk#'aX dc? #ڊTCÀ#:Gƹ`21:_'WB6 z*u+x`rO q۔ ]-HCѤ8L*)KnW;mYMzE4Oja(9ڊS,4x?W/ bHe$k\+4zV QZEt7p)Gl(q#GU !  ك@ pFoZlDvl)][~JθIlG֊s4B~edp_jvԕ:u=(P_,! `\j |+".?J*TW 2N @&dW3svL#-3ǵݯ>MUk v+>2\$: #q)K5 Q6='{Q7beˑ%"es#TNW sʏWżJ a_)Kxl 7[]Il+6v&iahgi󁁶W"-,IYO/"A Gyy02AOo}?qv㏅yC۲?_\Shx%h. `;k2%2v$omvhR Q]5L.rFs^%TH$AMmk~EUy#έvڽZ#ġ i+@++MHG J+]~\I 7k{ a<"(V ^%P 4xGΫ o 돝Iě+ƫ9EUȅY,o|R_4xa_gI"?֊̾0hH(NGJ]\ ۷),Tu8vWy[Ԟm;RZ.ŤywlX8=4Ufir \B\G88#wUU(%{mzQLYBlSdpW@Qpqq)$ҙ)'`SwYVXq]ޘ̉c_=ئN[+;9iʾhޟ/"r%;.qV3]iH7\ TQXf{RrZ]G:yާZQ# زI^M .)$+ G|d??Z*RɦP'Vڔuc{{Ӗ2)#g c]:u<i$SI)یyvn, xc~&pͩ͑޹-#ȑXʓfҰ;󢱆9R?"T*d #ޱZbQ_)Yd ($6W7*I`xՄ0Mn!FtaE'-P I# K?Sz DdP0ARAKm~uK'kFIYr X5ݘ$2v"X'WTeuҊm0FaƶӉJS}E^$J˪7՜dT[EV(# !hR$ ֊t`ֶ1^W?kɌQUUgdé `GXxЏ޽8ۖXqi %C8R.2p?saQRy(F 5պR$,y/:J&WRNE9BΧ}򧏅*"#Y">lᔝ:\# dv}D0\D1U'Fkizp0>:fI qaqRt3PNΡp j)o=0GjK.;i d1co+_C֊:lÏʖxljk.߈Q]ߣ)V'CI5̛F0Rs,✌78j*~-,\p6JBIVc7yj.feފURba#; 2t.Fiq8"ym˝;/ҝvUeAӶ X qSy*#BI3( LcoqU-!4CWpwi°9W8N{c(CguϯҶ11eF(y3Q'@>ͷ`ES,Շ;oF4ڣrWzŨpW<' sUH":!}Gk> startxref 38337 %%EOF ruby-prawn-2.1.0.orig/prawn.gemspec0000644000000000000000000000353312665203156015763 0ustar rootrootbasedir = File.expand_path(File.dirname(__FILE__)) require "#{basedir}/lib/prawn/version" Gem::Specification.new do |spec| spec.name = "prawn" spec.version = Prawn::VERSION spec.platform = Gem::Platform::RUBY spec.summary = "A fast and nimble PDF generator for Ruby" spec.files = Dir.glob("{examples,lib,spec,manual}/**/**/*") + Dir.glob("data/{encodings,images,pdfs}/*") + Dir.glob("data/fonts/{MustRead.html,*.afm}") + ["data/shift_jis_text.txt"] + ["Rakefile", "prawn.gemspec", "Gemfile", "COPYING", "LICENSE", "GPLv2", "GPLv3", ".yardopts"] spec.require_path = "lib" spec.required_ruby_version = '>= 2.0.0' spec.required_rubygems_version = ">= 1.3.6" spec.test_files = Dir[ "spec/*_spec.rb" ] spec.authors = ["Gregory Brown", "Brad Ediger", "Daniel Nelson", "Jonathan Greenberg", "James Healy"] spec.email = ["gregory.t.brown@gmail.com", "brad@bradediger.com", "dnelson@bluejade.com", "greenberg@entryway.net", "jimmy@deefa.com"] spec.rubyforge_project = "prawn" spec.licenses = %w(PRAWN GPL-2.0 GPL-3.0) spec.add_dependency('ttfunk', '~> 1.4.0') spec.add_dependency('pdf-core', "~> 0.6.1") spec.add_development_dependency('pdf-inspector', '~> 1.2.1') spec.add_development_dependency('yard') spec.add_development_dependency('rspec', '~> 3.0') spec.add_development_dependency('rake') spec.add_development_dependency('simplecov') spec.add_development_dependency('prawn-manual_builder', ">= 0.2.0") spec.add_development_dependency('pdf-reader', '~>1.2') spec.add_development_dependency('rubocop', '0.30.1') spec.add_development_dependency('code_statistics', '0.2.13') spec.homepage = "http://prawn.majesticseacreature.com" spec.description = < Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. ruby-prawn-2.1.0.orig/.rspec0000644000000000000000000000001012665203156014367 0ustar rootroot--color